{ "info": { "author": "James M. Irving, Michael V. Moravetz", "author_email": "james.irving.phd@outlook.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "# JMI_MVM\n\n- A collection of tools created for botcmap. \n- More information to be added later.\n\n\n

Table of Contents

\n
\n\n\n```python\nname = \"JMI_MVM\"\nhelp_ = \" Recommended Functions to try: \\n calc_roc_auc & tune_params\\n plot_hist_scat_sns & multiplot\\n list2df & df_drop_regex\\n plot_wide_kde_thin_bar & make_violinplot\\n\"\n#functions.py\n\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport matplotlib as mpl\nimport seaborn as sns\n\n\ndef calc_roc_auc(X_test,y_test,dtc,verbose=False):\n \"\"\"Tests the results of an already-fit classifer. \n Takes X_test, y_test, classifer, verbose (True\" print result)\n Returns the AUC for the roc_curve as a %\"\"\"\n y_pred = dtc.predict(X_test)\n\n FP_rate, TP_rate, thresh = roc_curve(y_test,y_pred)\n roc_auc = auc(FP_rate,TP_rate)\n roc_auc_perc = round(roc_auc*100,3)\n # Your code here \n if verbose:\n print(f\"roc_curve's auc = {roc_auc_perc}%\")\n return roc_auc_perc\n\ndef tune_params(param_name, param_values):\n \"\"\"Takes in param_name to tune with param_values, plots train vs test AUC's. \n Returns df_results and df_style with color coded results\"\"\"\n res_list = [[param_name,'train_roc_auc','test_roc_auc']]\n\n # Loop through all values in param_values\n for value in param_values:\n # Create Model, set params\n dtc_temp = DecisionTreeClassifier(criterion='entropy')\n params={param_name:value}\n dtc_temp.set_params(**params)\n\n # Fit model\n dtc_temp.fit(X_train, y_train)\n\n # Get roc_auc for training data\n train_roc_auc = calc_roc_auc(X_train,y_train,dtc_temp)\n # Get roc_auc for test data\n test_res_roc_auc = calc_roc_auc(X_test,y_test,dtc_temp)\n # Append value and results to res_list\n res_list.append([value,train_roc_auc,test_res_roc_auc])\n\n # Turn results into df_results (basically same as using list2df)\n df_results = pd.DataFrame(res_list[1:],columns=res_list[0])\n df_results.set_index(param_name,inplace=True)\n\n # Plot df_results\n df_results.plot()\n\n # Color-coded dataframe s\n import seaborn as sns\n cm = sns.light_palette(\"green\", as_cmap=True)\n df_syle = df_results.style.background_gradient(cmap=cm)#,low=results.min(),high=results.max())\n\n return df_results, df_syle\n\n\n# MULTIPLOT\nfrom string import ascii_letters\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n\n\ndef multiplot(df):\n \"\"\"Plots results from df.corr() in a correlation heat map for multicollinearity.\n Returns fig, ax objects\"\"\"\n sns.set(style=\"white\")\n\n # Compute the correlation matrix\n corr = df.corr()\n\n # Generate a mask for the upper triangle\n mask = np.zeros_like(corr, dtype=np.bool)\n mask[np.triu_indices_from(mask)] = True\n\n # Set up the matplotlib figure\n f, ax = plt.subplots(figsize=(16, 16))\n\n # Generate a custom diverging colormap\n cmap = sns.diverging_palette(220, 10, as_cmap=True)\n\n # Draw the heatmap with the mask and correct aspect ratio\n sns.heatmap(corr, mask=mask, annot=True, cmap=cmap, center=0,\n\n square=True, linewidths=.5, cbar_kws={\"shrink\": .5})\n return f, ax\n\n\n\n# Plots histogram and scatter (vs price) side by side\n# Plots histogram and scatter (vs price) side by side\ndef plot_hist_scat_sns(df, target='index'):\n \"\"\"Plots seaborne distplots and regplots for columns im datamframe vs target.\n\n Parameters:\n df (DataFrame): DataFrame.describe() columns will be used. \n target = name of column containing target variable.assume first coluumn. \n\n Returns:\n Figures for each column vs target with 2 subplots.\n \"\"\"\n import matplotlib.ticker as mtick\n import matplotlib.pyplot as plt\n import seaborn as sns\n\n with plt.style.context(('dark_background')):\n ### DEFINE AESTHETIC CUSTOMIZATIONS -------------------------------##\n\n\n# plt.style.use('dark_background')\n figsize=(9,7)\n\n # Axis Label fonts\n fontTitle = {'fontsize': 14,\n 'fontweight': 'bold',\n 'fontfamily':'serif'}\n\n fontAxis = {'fontsize': 12,\n 'fontweight': 'medium',\n 'fontfamily':'serif'}\n\n fontTicks = {'fontsize': 8,\n 'fontweight':'medium',\n 'fontfamily':'serif'}\n\n # Formatting dollar sign labels\n fmtPrice = '${x:,.0f}'\n tickPrice = mtick.StrMethodFormatter(fmtPrice)\n\n\n ### PLOTTING ----------------------------- ------------------------ ##\n\n # Loop through dataframe to plot\n for column in df.describe():\n# print(f'\\nCurrent column: {column}')\n\n # Create figure with subplots for current column\n fig, ax = plt.subplots(figsize=figsize, ncols=2, nrows=2)\n\n ## SUBPLOT 1 --------------------------------------------------##\n i,j = 0,0\n ax[i,j].set_title(column.capitalize(),fontdict=fontTitle)\n\n # Define graphing keyword dictionaries for distplot (Subplot 1)\n hist_kws = {\"linewidth\": 1, \"alpha\": 1, \"color\": 'blue','edgecolor':'w'}\n kde_kws = {\"color\": \"white\", \"linewidth\": 1, \"label\": \"KDE\"}\n\n # Plot distplot on ax[i,j] using hist_kws and kde_kws\n sns.distplot(df[column], norm_hist=True, kde=True,\n hist_kws = hist_kws, kde_kws = kde_kws,\n label=column+' histogram', ax=ax[i,j])\n\n\n # Set x axis label\n ax[i,j].set_xlabel(column.title(),fontdict=fontAxis)\n\n # Get x-ticks, rotate labels, and return\n xticklab1 = ax[i,j].get_xticklabels(which = 'both')\n ax[i,j].set_xticklabels(labels=xticklab1, fontdict=fontTicks, rotation=0)\n ax[i,j].xaxis.set_major_formatter(mtick.ScalarFormatter())\n\n\n # Set y-label \n ax[i,j].set_ylabel('Density',fontdict=fontAxis)\n yticklab1=ax[i,j].get_yticklabels(which='both')\n ax[i,j].set_yticklabels(labels=yticklab1,fontdict=fontTicks)\n ax[i,j].yaxis.set_major_formatter(mtick.ScalarFormatter())\n\n\n # Set y-grid\n ax[i, j].set_axisbelow(True)\n ax[i, j].grid(axis='y',ls='--')\n\n\n\n\n ## SUBPLOT 2-------------------------------------------------- ##\n i,j = 0,1\n ax[i,j].set_title(column.capitalize(),fontdict=fontTitle)\n\n # Define the kwd dictionaries for scatter and regression line (subplot 2)\n line_kws={\"color\":\"white\",\"alpha\":0.5,\"lw\":4,\"ls\":\":\"}\n scatter_kws={'s': 2, 'alpha': 0.5,'marker':'.','color':'blue'}\n\n # Plot regplot on ax[i,j] using line_kws and scatter_kws\n sns.regplot(df[column], df[target], \n line_kws = line_kws,\n scatter_kws = scatter_kws,\n ax=ax[i,j])\n\n # Set x-axis label\n ax[i,j].set_xlabel(column.title(),fontdict=fontAxis)\n\n # Get x ticks, rotate labels, and return\n xticklab2=ax[i,j].get_xticklabels(which='both')\n ax[i,j].set_xticklabels(labels=xticklab2,fontdict=fontTicks, rotation=0)\n ax[i,j].xaxis.set_major_formatter(mtick.ScalarFormatter())\n\n # Set y-axis label\n ax[i,j].set_ylabel(target,fontdict=fontAxis)\n\n # Get, set, and format y-axis Price labels\n yticklab = ax[i,j].get_yticklabels()\n ax[i,j].set_yticklabels(yticklab,fontdict=fontTicks)\n ax[i,j].yaxis.set_major_formatter(mtick.ScalarFormatter())\n\n # ax[i,j].get_yaxis().set_major_formatter(tickPrice) \n\n # Set y-grid\n ax[i, j].set_axisbelow(True)\n ax[i, j].grid(axis='y',ls='--') \n\n ## ---------- Final layout adjustments ----------- ##\n # Deleted unused subplots \n fig.delaxes(ax[1,1])\n fig.delaxes(ax[1,0])\n\n # Optimizing spatial layout\n fig.tight_layout()\n figtitle=column+'_dist_regr_plots.png'\n# plt.savefig(figtitle)\n return \n\n# Tukey's method using IQR to eliminate \ndef detect_outliers(df, n, features):\n \"\"\"Uses Tukey's method to return outer of interquartile ranges to return indices if outliers in a dataframe.\n Parameters:\n df (DataFrame): DataFrane containing columns of features\n n: default is 0, multiple outlier cutoff \n\n Returns:\n Index of outliers for .loc\n\n Examples:\n Outliers_to_drop = detect_outliers(data,2,[\"col1\",\"col2\"]) Returning value\n df.loc[Outliers_to_drop] # Show the outliers rows\n data= data.drop(Outliers_to_drop, axis = 0).reset_index(drop=True)\n\"\"\"\n\n# Drop outliers \n\n outlier_indices = []\n # iterate over features(columns)\n for col in features:\n\n # 1st quartile (25%)\n Q1 = np.percentile(df[col], 25)\n # 3rd quartile (75%)\n Q3 = np.percentile(df[col],75)\n\n # Interquartile range (IQR)\n IQR = Q3 - Q1\n # outlier step\n outlier_step = 1.5 * IQR\n\n # Determine a list of indices of outliers for feature col\n outlier_list_col = df[(df[col] < Q1 - outlier_step) | (df[col] > Q3 + outlier_step )].index\n\n # append the found outlier indices for col to the list of outlier indices \n outlier_indices.extend(outlier_list_col)\n\n # select observations containing more than 2 outliers\n outlier_indices = Counter(outlier_indices) \n multiple_outliers = list( k for k, v in outlier_indices.items() if v > n )\n return multiple_outliers \n\n\n# describe_outliers -- calls detect_outliers\ndef describe_outliers(df):\n \"\"\" Returns a new_df of outliers, and % outliers each col using detect_outliers.\n \"\"\"\n out_count = 0\n new_df = pd.DataFrame(columns=['total_outliers', 'percent_total'])\n for col in df.columns:\n outies = detect_outliers(df[col])\n out_count += len(outies) \n new_df.loc[col] = [len(outies), round((len(outies)/len(df.index))*100, 2)]\n new_df.loc['grand_total'] = [sum(new_df['total_outliers']), sum(new_df['percent_total'])]\n return new_df\n\n\n#### Cohen's d\ndef Cohen_d(group1, group2):\n '''Compute Cohen's d.\n # group1: Series or NumPy array\n # group2: Series or NumPy array\n # returns a floating point number \n '''\n diff = group1.mean() - group2.mean()\n\n n1, n2 = len(group1), len(group2)\n var1 = group1.var()\n var2 = group2.var()\n\n # Calculate the pooled threshold as shown earlier\n pooled_var = (n1 * var1 + n2 * var2) / (n1 + n2)\n\n # Calculate Cohen's d statistic\n d = diff / np.sqrt(pooled_var)\n\n return d\n\n\ndef plot_pdfs(cohen_d=2):\n \"\"\"Plot PDFs for distributions that differ by some number of stds.\n\n cohen_d: number of standard deviations between the means\n \"\"\"\n group1 = scipy.stats.norm(0, 1)\n group2 = scipy.stats.norm(cohen_d, 1)\n xs, ys = evaluate_PDF(group1)\n pyplot.fill_between(xs, ys, label='Group1', color='#ff2289', alpha=0.7)\n\n xs, ys = evaluate_PDF(group2)\n pyplot.fill_between(xs, ys, label='Group2', color='#376cb0', alpha=0.7)\n\n o, s = overlap_superiority(group1, group2)\n print('overlap', o)\n print('superiority', s)\n\ndef list2df(list):#, sort_values='index'):\n \"\"\" Take in a list where row[0] = column_names and outputs a dataframe.\n\n Keyword arguments:\n set_index -- df.set_index(set_index)\n sortby -- df.sorted()\n \"\"\" \n\n df_list = pd.DataFrame(list[1:],columns=list[0])\n# df_list = df_list[1:]\n\n return df_list\n\ndef df_drop_regex(DF, regex_list):\n '''Use a list of regex to remove columns names. Returns new df.\n\n Parameters:\n DF -- input dataframe to remove columns from.\n regex_list -- list of string patterns or regexp to remove.\n\n Returns:\n df_cut -- input df without the dropped columns. \n '''\n df_cut = DF.copy()\n\n for r in regex_list:\n\n df_cut = df_cut[df_cut.columns.drop(list(df_cut.filter(regex=r)))]\n print(f'Removed {r}\\n')\n\n return df_cut\n\n\n\n####### MIKE's PLOTTING\n# plotting order totals per month in violin plots\n\ndef make_violinplot(x,y, title=None, hue=None, ticklabels=None):\n\n '''Plots a violin plot with horizontal mean line, inner stick lines'''\n\n plt.style.use('dark_background')\n fig,ax =plt.subplots(figsize=(12,10))\n\n\n sns.violinplot(x, y,cut=2,split=True, scale='count', scale_hue=True,\n saturation=.5, alpha=.9,bw=.25, palette='Dark2',inner='stick', hue=hue).set_title(title)\n\n ax.axhline(y.mean(),label='total mean', ls=':', alpha=.5, color='xkcd:yellow')\n ax.set_xticklabels(ticklabels)\n\n plt.legend()\n plt.show()\n x= df_year_orders['month']\n y= df_year_orders['order_total']\n title = 'Order totals per month with or without discounts'\n hue=df_year_orders['Discount']>0\n\n\n### Example usage\n# #First, declare variables to be plotted\n# x = df_year_orders['month']\n# y = df_year_orders['order_total']\n# ticks = [v for v in month_dict.values()] \n# title = 'Order totals per month with or without discounts'\n# hue = df_year_orders['Discount']>0\n\n### Then call function\n# make_violinplot(x,y,title,hue, ticks), \n\n\n###########\ndef plot_wide_kde_thin_bar(series1,sname1, series2, sname2):\n '''Plot series1 and series 2 on wide kde plot with small mean+sem bar plot.'''\n\n ## ADDING add_gridspec usage\n import pandas as pd\n import numpy as np\n from scipy.stats import sem\n\n import matplotlib.pyplot as plt\n import matplotlib as mpl\n import matplotlib.ticker as ticker\n\n import seaborn as sns\n\n from matplotlib import rcParams\n from matplotlib import rc\n rcParams['font.family'] = 'serif'\n\n\n\n\n # Plot distributions of discounted vs full price groups\n plt.style.use('default')\n # with plt.style.context(('tableau-colorblind10')):\n with plt.style.context(('seaborn-notebook')):\n\n\n\n ## ----------- DEFINE AESTHETIC CUSTOMIZATIONS ----------- ##\n # Axis Label fonts\n fontSuptitle ={'fontsize': 22,\n 'fontweight': 'bold',\n 'fontfamily':'serif'}\n\n fontTitle = {'fontsize': 10,\n 'fontweight': 'medium',\n 'fontfamily':'serif'}\n\n fontAxis = {'fontsize': 10,\n 'fontweight': 'medium',\n 'fontfamily':'serif'}\n\n fontTicks = {'fontsize': 8,\n 'fontweight':'medium', \n 'fontfamily':'serif'}\n\n\n ## --------- CREATE FIG BASED ON GRIDSPEC --------- ##\n\n plt.suptitle('Quantity of Units Sold', fontdict = fontSuptitle)\n\n # Create fig object and declare figsize\n fig = plt.figure(constrained_layout=True, figsize=(8,3))\n\n\n # Define gridspec to create grid coordinates \n gs = fig.add_gridspec(nrows=1,ncols=10)\n\n # Assign grid space to ax with add_subplot\n ax0 = fig.add_subplot(gs[0,0:7])\n ax1 = fig.add_subplot(gs[0,7:10])\n\n #Combine into 1 list\n ax = [ax0,ax1]\n\n ### ------------------ SUBPLOT 1 ------------------ ###\n\n ## --------- Defining series1 and 2 for subplot 1------- ##\n ax[0].set_title('Histogram + KDE',fontdict=fontTitle)\n\n # Group 1: data, label, hist_kws and kde_kws\n plotS1 = {'data': series1, 'label': sname1.title(),\n\n 'hist_kws' :\n {'edgecolor': 'black', 'color':'darkgray','alpha': 0.8, 'lw':0.5},\n\n 'kde_kws':\n {'color':'gray', 'linestyle': '--', 'linewidth':2,\n 'label':'kde'}}\n\n # Group 2: data, label, hist_kws and kde_kws\n plotS2 = {'data': series2,\n 'label': sname2.title(), \n\n 'hist_kws' :\n {'edgecolor': 'black','color':'green','alpha':0.8 ,'lw':0.5},\n\n\n 'kde_kws':\n {'color':'darkgreen','linestyle':':','linewidth':3,'label':'kde'}}\n\n # plot group 1\n sns.distplot(plotS1['data'], label=plotS1['label'],\n\n hist_kws = plotS1['hist_kws'], kde_kws = plotS1['kde_kws'],\n\n ax=ax[0]) \n\n\n # plot group 2\n sns.distplot(plotS2['data'], label=plotS2['label'],\n\n hist_kws=plotS2['hist_kws'], kde_kws = plotS2['kde_kws'],\n\n ax=ax[0])\n\n\n ax[0].set_xlabel(series1.name, fontdict=fontAxis)\n ax[0].set_ylabel('Kernel Density Estimation',fontdict=fontAxis)\n\n ax[0].tick_params(axis='both',labelsize=fontTicks['fontsize']) \n ax[0].legend()\n\n\n ### ------------------ SUBPLOT 2 ------------------ ###\n\n # Import scipy for error bars\n from scipy.stats import sem\n\n # Declare x y group labels(x) and bar heights(y)\n x = [plotS1['label'], plotS2['label']]\n y = [np.mean(plotS1['data']), np.mean(plotS2['data'])]\n\n yerr = [sem(plotS1['data']), sem(plotS2['data'])]\n err_kws = {'ecolor':'black','capsize':5,'capthick':1,'elinewidth':1}\n\n # Create the bar plot\n ax[1].bar(x,y,align='center', edgecolor='black', yerr=yerr,error_kw=err_kws,width=0.6)\n\n\n # Customize subplot 2\n ax[1].set_title('Average Quantities Sold',fontdict=fontTitle)\n ax[1].set_ylabel('Mean +/- SEM ',fontdict=fontAxis)\n ax[1].set_xlabel('')\n\n ax[1].tick_params(axis=y,labelsize=fontTicks['fontsize'])\n ax[1].tick_params(axis=x,labelsize=fontTicks['fontsize']) \n\n ax1=ax[1]\n test = ax1.get_xticklabels()\n labels = [x.get_text() for x in test]\n ax1.set_xticklabels([plotS1['label'],plotS2['label']], rotation=45,ha='center')\n\n# xlab = [x.get_text() for x in xlablist]\n# ax[1].set_xticklabels(xlab,rotation=45)\n\n# fig.savefig('H1_EDA_using_gridspec.png')\n# plt.tight_layout()\n # print(f')\n plt.show()\n\n return fig,ax\n\n```\n\n\n```python\n\n```\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/jirvingphd/JMI_MVM", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "JMI-MVM", "package_url": "https://pypi.org/project/JMI-MVM/", "platform": "", "project_url": "https://pypi.org/project/JMI-MVM/", "project_urls": { "Homepage": "https://github.com/jirvingphd/JMI_MVM" }, "release_url": "https://pypi.org/project/JMI-MVM/0.3.4/", "requires_dist": [ "numpy", "pandas", "seaborn", "matplotlib", "sklearn", "pydotplus", "scipy", "xgboost" ], "requires_python": "", "summary": "A collection of our functions and classes from bootcamp.", "version": "0.3.4" }, "last_serial": 5215081, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "0f8349a2663625ee53c4db7cb8233c92", "sha256": "6e4f223179d348bcc97fecfa4905557fd041269cb057f635d2d58086d062cbf0" }, "downloads": -1, "filename": "JMI_MVM-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "0f8349a2663625ee53c4db7cb8233c92", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8269, "upload_time": "2019-04-21T02:32:11", "url": "https://files.pythonhosted.org/packages/cc/02/d776c984c722d5bba9b76c586f4d65b88114c1c2863903f48a0f2b441731/JMI_MVM-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "328722b80b7d5775c9d8bbea9bfbef60", "sha256": "10c0caa43cdcd198ef0df945127944fcad69d11314ac23350ca6a50421312faa" }, "downloads": -1, "filename": "JMI_MVM-0.0.1.tar.gz", "has_sig": false, "md5_digest": "328722b80b7d5775c9d8bbea9bfbef60", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6966, "upload_time": "2019-04-21T02:32:13", "url": "https://files.pythonhosted.org/packages/ee/b6/880aab301e4ce15503bc3e99f83fa23a3d83fbf7ed9e7fbbd992a3f91744/JMI_MVM-0.0.1.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "2685aa291279e20ce60d3eeb55469f34", "sha256": "f446bbc74fd8f2f5e060a5bf04d19060a112bb4cdb19f803a98454483cfab799" }, "downloads": -1, "filename": "JMI_MVM-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "2685aa291279e20ce60d3eeb55469f34", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8262, "upload_time": "2019-04-21T02:59:32", "url": "https://files.pythonhosted.org/packages/2c/8c/1959c0c26322dc8813e2196e2c901ab6e34616e6c80f22c776882066a137/JMI_MVM-0.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "287c05d96dc6f547ac555ae29aa6f44a", "sha256": "1b214fb1a4474ca8a0922ddd29fe8a971078f8d8a88dd61b135efb831e27f134" }, "downloads": -1, "filename": "JMI_MVM-0.0.3.tar.gz", "has_sig": false, "md5_digest": "287c05d96dc6f547ac555ae29aa6f44a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6966, "upload_time": "2019-04-21T02:59:33", "url": "https://files.pythonhosted.org/packages/67/f3/214848bbb9e457ac2d467d77155c246bad5e5fd1a42a1141496cdb218e66/JMI_MVM-0.0.3.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "e2c13032ec9c374f62b4d9782ae7dad4", "sha256": "59e9e72cff506e4c8d170f6b1784b5004dd3357e514a5c05f036764a7e3dce68" }, "downloads": -1, "filename": "JMI_MVM-0.1.0.tar.gz", "has_sig": false, "md5_digest": "e2c13032ec9c374f62b4d9782ae7dad4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7262, "upload_time": "2019-04-21T03:37:03", "url": "https://files.pythonhosted.org/packages/42/00/10390eb55d6cfff81a8f589d593332ab2bda8e2dd61c9431f378ef65a7a6/JMI_MVM-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "6bfd4ba33b00534d5fc58506c9f3b50e", "sha256": "04c9965050bd02affef1865446ae96249ef103da1b3fb9e2a4990478d98c04c7" }, "downloads": -1, "filename": "JMI_MVM-0.1.1.tar.gz", "has_sig": false, "md5_digest": "6bfd4ba33b00534d5fc58506c9f3b50e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12248, "upload_time": "2019-04-21T18:54:31", "url": "https://files.pythonhosted.org/packages/d6/fd/94bbf01c90f92e524ac1a6675babe30b2ada6863884022d70acf4576e507/JMI_MVM-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "82fb34c18508d63162cdeab35313c66d", "sha256": "907c639ee82b5f41d75508f576411dbd1b3904aa9606b205b33acce0d5a7848e" }, "downloads": -1, "filename": "JMI_MVM-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "82fb34c18508d63162cdeab35313c66d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 34480, "upload_time": "2019-04-25T16:24:48", "url": "https://files.pythonhosted.org/packages/24/7b/be8d37c9142ee89440afdab70e77dc35a438c0a7559214d292a7191524c0/JMI_MVM-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fa2763fafe654a2da76faaa9c881db36", "sha256": "b1b3e4d3cd59654405a7a98508b12a82583ccd59dcdf38eb05b756842270ceaf" }, "downloads": -1, "filename": "JMI_MVM-0.1.2.tar.gz", "has_sig": false, "md5_digest": "fa2763fafe654a2da76faaa9c881db36", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13611, "upload_time": "2019-04-25T16:24:54", "url": "https://files.pythonhosted.org/packages/cb/c4/ea0c34eab4da24b47a862616a04faee50e2c9635123b2282e83a01cf554d/JMI_MVM-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "5f30e1807d161ffda258dfd926fe7cae", "sha256": "7072e76a1d5fecd25204e6edf4e9fe697470d389b6917f79b75ad0861c99938b" }, "downloads": -1, "filename": "JMI_MVM-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "5f30e1807d161ffda258dfd926fe7cae", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 34947, "upload_time": "2019-04-26T18:30:21", "url": "https://files.pythonhosted.org/packages/90/b1/7de1e476de6f0fe1775c2c705b1b94f8712fb01064091dba5bcba3aa645d/JMI_MVM-0.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5d5db78beda48b6b735661b742c701a8", "sha256": "e4336ed40f36f2bb31b0eb087acb9250c9a039e825c001d0b7811e207c23efb5" }, "downloads": -1, "filename": "JMI_MVM-0.1.3.tar.gz", "has_sig": false, "md5_digest": "5d5db78beda48b6b735661b742c701a8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14223, "upload_time": "2019-04-26T18:30:29", "url": "https://files.pythonhosted.org/packages/f4/37/9fe2dfa6393c5101b4e940b8795ce90c96620b5385e08c624ba790cefb6a/JMI_MVM-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "76d65abaa0173260f82c9e04266976f2", "sha256": "974956c15e8b80816ee8b05666c0263330b940c55abd7f210dc8596cafef5df2" }, "downloads": -1, "filename": "JMI_MVM-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "76d65abaa0173260f82c9e04266976f2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 35268, "upload_time": "2019-04-26T22:05:32", "url": "https://files.pythonhosted.org/packages/8f/49/0af291f209245b92c52925657e03eb2612193fb703908f58e084e62fc6b0/JMI_MVM-0.1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "db26a71426e19948e74f122bc3dddf55", "sha256": "1816fc4126ff3d97fa40eb055aa243d44a61528dcb2d2abb78f2d1d9b63cbcb5" }, "downloads": -1, "filename": "JMI_MVM-0.1.4.tar.gz", "has_sig": false, "md5_digest": "db26a71426e19948e74f122bc3dddf55", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14553, "upload_time": "2019-04-26T22:05:39", "url": "https://files.pythonhosted.org/packages/b9/09/acaa0e11c5e309fa2382c4d0752a5542232d9c07efdbf5fe29392d7b6ef2/JMI_MVM-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "ed625761262a9f8a32989a34b9d48e80", "sha256": "82c4d9248ec8ee9f3a7446ccbbfbb2f9a0b7bf0a7f8b9a7df0bbd48dae62743f" }, "downloads": -1, "filename": "JMI_MVM-0.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "ed625761262a9f8a32989a34b9d48e80", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28765, "upload_time": "2019-04-27T00:15:01", "url": "https://files.pythonhosted.org/packages/b5/91/7c275782a8a034383703786ff56719e8976225ef32d15a344dd6e9e223c6/JMI_MVM-0.1.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "487765b7a3a005db4bb2fd123e46bd39", "sha256": "98c72e44df0d07c945ff8b9af6bef5f27f9f8246c32b336a6d933da28910b065" }, "downloads": -1, "filename": "JMI_MVM-0.1.5.tar.gz", "has_sig": false, "md5_digest": "487765b7a3a005db4bb2fd123e46bd39", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14424, "upload_time": "2019-04-27T00:15:17", "url": "https://files.pythonhosted.org/packages/c2/5e/58301ae11ee7f452d9d9f12d477d8ffd96ea6bafa21e83db4a5a7a70b666/JMI_MVM-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "cbde8eec13bdf7c24fca3dd51890d217", "sha256": "c531fd0f195116ee02c13e3024ed12da3efe183b4e011255725ed51578b7fb54" }, "downloads": -1, "filename": "JMI_MVM-0.1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "cbde8eec13bdf7c24fca3dd51890d217", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28766, "upload_time": "2019-04-27T00:25:55", "url": "https://files.pythonhosted.org/packages/07/19/cdcb5291f445b4557703af277c738f4dbde8ab5c48944c99db4a6232980c/JMI_MVM-0.1.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a86bbd59ac4bf5aa1ddb00609973db69", "sha256": "48fb7570e37eb64b2a45c2e98926616c82a1948c8295130a94f8c4480dc20e3e" }, "downloads": -1, "filename": "JMI_MVM-0.1.6.tar.gz", "has_sig": false, "md5_digest": "a86bbd59ac4bf5aa1ddb00609973db69", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14436, "upload_time": "2019-04-27T00:26:03", "url": "https://files.pythonhosted.org/packages/6d/f9/a728b63afe3ffdaa5b3bdbf9e5dbf9abe7b72e04eb8e268a5a0d1f2d665e/JMI_MVM-0.1.6.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "1a476d8fa702c69a8d3400efa941127a", "sha256": "a90865e52efe223647ee6abb122827d0cb881fc4238188b8080f55dc3b395b98" }, "downloads": -1, "filename": "JMI_MVM-0.1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "1a476d8fa702c69a8d3400efa941127a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 36664, "upload_time": "2019-04-27T00:36:00", "url": "https://files.pythonhosted.org/packages/14/23/13c77f9bd3355c6180e5392dfe170d240f20a80b0baad1fdaecc4d60e0f3/JMI_MVM-0.1.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5739d237d7cca675263bb4fe5e6a11ec", "sha256": "31d736bc2dc3cdc75c21205743392dab5cdb70ed658f3056dcb99d4a72f03db4" }, "downloads": -1, "filename": "JMI_MVM-0.1.7.tar.gz", "has_sig": false, "md5_digest": "5739d237d7cca675263bb4fe5e6a11ec", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17390, "upload_time": "2019-04-27T00:36:08", "url": "https://files.pythonhosted.org/packages/07/22/65965a581e05f7e51900cfa42c3f6dbdcbf3527ad14a4e3cfd404e5e7747/JMI_MVM-0.1.7.tar.gz" } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "74edd3b3a0a1ecfc033f47175f979e5c", "sha256": "63ed76dcbea9bc58fa682bf05a731263859e195659ea1714d967ff472fbef630" }, "downloads": -1, "filename": "JMI_MVM-0.1.8-py3-none-any.whl", "has_sig": false, "md5_digest": "74edd3b3a0a1ecfc033f47175f979e5c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 37000, "upload_time": "2019-04-27T00:45:16", "url": "https://files.pythonhosted.org/packages/0a/de/ceabc14d2281fae205a2de351c3d9075378f1e94dfb7f5af218184c3f103/JMI_MVM-0.1.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3a15cde6cb07ae9912414e0d69cb4180", "sha256": "8abd88c99711e9c9aba6a7755cdc970b647abe562305cff1b35cc2f0360120e9" }, "downloads": -1, "filename": "JMI_MVM-0.1.8.tar.gz", "has_sig": false, "md5_digest": "3a15cde6cb07ae9912414e0d69cb4180", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17722, "upload_time": "2019-04-27T00:45:26", "url": "https://files.pythonhosted.org/packages/97/c2/3b6d0176ac2aa73eb4d5d955f1901c73f4c6c53ec227fe96fc5ab41f0d5e/JMI_MVM-0.1.8.tar.gz" } ], "0.1.9": [ { "comment_text": "", "digests": { "md5": "731094ea80cab17a7223964fa0994714", "sha256": "d093417f66a1135d364917564c590bc57f8f570f585810bba7642c0004fa4ea2" }, "downloads": -1, "filename": "JMI_MVM-0.1.9-py3-none-any.whl", "has_sig": false, "md5_digest": "731094ea80cab17a7223964fa0994714", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 37007, "upload_time": "2019-04-27T00:54:29", "url": "https://files.pythonhosted.org/packages/fe/8c/f97114de7d72002bc2afcd76ada37a7f7b2605fa8df0bae3cf23436b4361/JMI_MVM-0.1.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "546de531e8849e72c24d9d4db1747f53", "sha256": "b6ff681a75b57e642e5160b40e00518bc8a2192e0db37cf7e8756b5a99d4ca84" }, "downloads": -1, "filename": "JMI_MVM-0.1.9.tar.gz", "has_sig": false, "md5_digest": "546de531e8849e72c24d9d4db1747f53", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17733, "upload_time": "2019-04-27T00:54:38", "url": "https://files.pythonhosted.org/packages/2b/6d/f59859f9471ffa942dd778605833f7ef87df72d40f92a33d3d4540281c99/JMI_MVM-0.1.9.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "3f5bbd3e647a3d65ecb7353fe9c46aa4", "sha256": "fbfdf1c6b249ff1b63677b0ad96c07a8d36c4ab1e72549831cf3181ecab37541" }, "downloads": -1, "filename": "JMI_MVM-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "3f5bbd3e647a3d65ecb7353fe9c46aa4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 37604, "upload_time": "2019-04-28T06:15:57", "url": "https://files.pythonhosted.org/packages/a7/0f/696c5b74deda8defdcfd57e61d4f121c61eaca0a9a31e2442484d16ef357/JMI_MVM-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f0f37b1231e65286491d4a77dea00759", "sha256": "9303884be43493992193a49bcfe39309bf51bb315d3aa9936b60de95ef56ea68" }, "downloads": -1, "filename": "JMI_MVM-0.2.0.tar.gz", "has_sig": false, "md5_digest": "f0f37b1231e65286491d4a77dea00759", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15143, "upload_time": "2019-04-28T06:16:10", "url": "https://files.pythonhosted.org/packages/8c/48/1c528857b9fae31d2605dfb66b90a3a5302b187712dd34cf78cb7176240b/JMI_MVM-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "9eecbd7dc70f26cf19b6532dcce3bd61", "sha256": "488fa81ed1b07c62e08a7eb23057edd3f63755b3a992e7cec53df2aa83f8bec9" }, "downloads": -1, "filename": "JMI_MVM-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "9eecbd7dc70f26cf19b6532dcce3bd61", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 46463, "upload_time": "2019-04-28T17:41:06", "url": "https://files.pythonhosted.org/packages/3c/fb/7f57460514a7d95d960fcf10e5342f36b2f67be029c629860f084679d218/JMI_MVM-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "463bbc7a4619dacad5935584e27f0dbc", "sha256": "9ad8ef0731eb61364285d0c4f0f71e5e846fc1cabfa5aff2b91b1adaf3e01ef9" }, "downloads": -1, "filename": "JMI_MVM-0.2.1.tar.gz", "has_sig": false, "md5_digest": "463bbc7a4619dacad5935584e27f0dbc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17441, "upload_time": "2019-04-28T17:41:22", "url": "https://files.pythonhosted.org/packages/6c/a4/320b4b2e4897ff66c60c73e8b72a9e7c7acb524c1521243dd9e66d289930/JMI_MVM-0.2.1.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "9a6c4493f9db3acacdae36bb8b58df12", "sha256": "b722081d6c1f3ee60f6809fba55ec067d8c0b0d0c42d7f438c6588e8daa4c326" }, "downloads": -1, "filename": "JMI_MVM-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "9a6c4493f9db3acacdae36bb8b58df12", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 59403, "upload_time": "2019-04-30T23:30:31", "url": "https://files.pythonhosted.org/packages/b2/f8/5ce42d936020cc4e65bfae92a27be8c6d48e36a73e51fdac454e3981a8fa/JMI_MVM-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3b6d4cdc999ee90cae7e1b1563176d79", "sha256": "fe9d1f077a7a002dfefd9eae0105c389373b65d98a77538dcd0c49f4431d237b" }, "downloads": -1, "filename": "JMI_MVM-0.3.0.tar.gz", "has_sig": false, "md5_digest": "3b6d4cdc999ee90cae7e1b1563176d79", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29829, "upload_time": "2019-04-30T23:30:43", "url": "https://files.pythonhosted.org/packages/ef/f9/010a584b0ec56319f46143b13301ea2501cc5f9a9a9a0861b25a90ce8e9a/JMI_MVM-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "d95d1e1c8f39036d2cfdeb0d5c9031f7", "sha256": "2f94e63880f0787f04a11c6133405db23ad14bd60a68aa7778bcef5eacb2b5d7" }, "downloads": -1, "filename": "JMI_MVM-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "d95d1e1c8f39036d2cfdeb0d5c9031f7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 59861, "upload_time": "2019-05-01T00:11:58", "url": "https://files.pythonhosted.org/packages/a6/f3/d5cd7a5ba0369e953ae21220a7bbbfe15f25502aced144932976dc6c7585/JMI_MVM-0.3.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "aad139c5eefad37735e22c99742cc395", "sha256": "000644a7b73b0a2edfd905933a3bc1cfd497f7c483d6ef81c4698effb7dd4280" }, "downloads": -1, "filename": "JMI_MVM-0.3.1.tar.gz", "has_sig": false, "md5_digest": "aad139c5eefad37735e22c99742cc395", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30260, "upload_time": "2019-05-01T23:34:25", "url": "https://files.pythonhosted.org/packages/b2/0d/0231814cf82836fcef2569e5cc2110b0d3bc21157f47eaa32230ee47c98f/JMI_MVM-0.3.1.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "33b0665533e9569cac9e0e50477f69fc", "sha256": "76613336d04a140780f24afeb4717fe0accc3685250a327a859cc6af8f0bf039" }, "downloads": -1, "filename": "JMI_MVM-0.3.3-py3-none-any.whl", "has_sig": false, "md5_digest": "33b0665533e9569cac9e0e50477f69fc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 64851, "upload_time": "2019-05-01T23:34:17", "url": "https://files.pythonhosted.org/packages/ee/71/8ca521bf061c578d0443548badd76017d31abf7e19be8fe34ae0a46d7848/JMI_MVM-0.3.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9d9274dd11878a8653e27daa44d96d1b", "sha256": "d4729a948f22e3f80c9addd7db844beae5b301c9ea934ab3b11f2c78ed6d0043" }, "downloads": -1, "filename": "JMI_MVM-0.3.3.tar.gz", "has_sig": false, "md5_digest": "9d9274dd11878a8653e27daa44d96d1b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40865, "upload_time": "2019-05-01T23:34:26", "url": "https://files.pythonhosted.org/packages/94/87/90a3b5a0da448237ac95bf141bd9375da3d4793e7a0220f8b3333fc1a786/JMI_MVM-0.3.3.tar.gz" } ], "0.3.4": [ { "comment_text": "", "digests": { "md5": "e7b9e1a78b3f1e744867e66f8646e072", "sha256": "9393deadb243a2bb736f6b76e5ccc9d4ee0f666b4881e5434a4c5dd9e80eea6e" }, "downloads": -1, "filename": "JMI_MVM-0.3.4-py3-none-any.whl", "has_sig": false, "md5_digest": "e7b9e1a78b3f1e744867e66f8646e072", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 65644, "upload_time": "2019-05-02T02:02:44", "url": "https://files.pythonhosted.org/packages/df/e6/e365eb6d6862394911cd8f7b7234a2e80ebf64bb0ce54bf37d5a71bee7d6/JMI_MVM-0.3.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "add6261816be7d1396c08729e51554ca", "sha256": "5e819eb0e64a7294e90f27b8c9d21e142ca11b3202402a1016155cec37c3f4dc" }, "downloads": -1, "filename": "JMI_MVM-0.3.4.tar.gz", "has_sig": false, "md5_digest": "add6261816be7d1396c08729e51554ca", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41526, "upload_time": "2019-05-02T02:02:53", "url": "https://files.pythonhosted.org/packages/2c/81/93d0dcde8641c7785f13d50de7ad1117ebf74856ad41f2790e6b31e80883/JMI_MVM-0.3.4.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e7b9e1a78b3f1e744867e66f8646e072", "sha256": "9393deadb243a2bb736f6b76e5ccc9d4ee0f666b4881e5434a4c5dd9e80eea6e" }, "downloads": -1, "filename": "JMI_MVM-0.3.4-py3-none-any.whl", "has_sig": false, "md5_digest": "e7b9e1a78b3f1e744867e66f8646e072", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 65644, "upload_time": "2019-05-02T02:02:44", "url": "https://files.pythonhosted.org/packages/df/e6/e365eb6d6862394911cd8f7b7234a2e80ebf64bb0ce54bf37d5a71bee7d6/JMI_MVM-0.3.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "add6261816be7d1396c08729e51554ca", "sha256": "5e819eb0e64a7294e90f27b8c9d21e142ca11b3202402a1016155cec37c3f4dc" }, "downloads": -1, "filename": "JMI_MVM-0.3.4.tar.gz", "has_sig": false, "md5_digest": "add6261816be7d1396c08729e51554ca", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41526, "upload_time": "2019-05-02T02:02:53", "url": "https://files.pythonhosted.org/packages/2c/81/93d0dcde8641c7785f13d50de7ad1117ebf74856ad41f2790e6b31e80883/JMI_MVM-0.3.4.tar.gz" } ] }