{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import pandas as pd, numpy as np, matplotlib.pyplot as plt, math, statsmodels.api as sm\n", "\n", "%matplotlib inline\n", "plt.style.use('ggplot')\n", "\n", "from ffball_getData import ffball_data\n", "\n", "QB_data = ffball_data('QB')\n", "#for weeks in range(2,11):\n", "# QB_data.update(weeks)\n", "\n", "#QB_data.save_df()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Change coding of bye week; one hot encoding for home-away; interaction effects; remove no opponent; code teams for prediction by looping through team names; try a gamma link; yahoo?" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#axs = pd.tools.plotting.scatter_matrix(QB_data.ix[:,-8:], figsize=(6,6), diagonal='kde');\n", "#[ax.set_yticks([]) for ax in axs[:,0]] #turn off the ticks that take up way too much space in such a crammed figure\n", "#[ax.set_xticks([]) for ax in axs[-1,:]];" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So I want past performance to influence current predictions and both of them to influence the predicted variable. Is this possible? I am not sure about the time thing. It seems like it should be part of the model, but I am uncertain about how to include it. I should also probably have the matchup in the model. There is nothing about matchup in this model and that would be helpful. How to get that data and how exactly to give it to the model is a mystery...\n", "\n", "Ok, then there is the thing of making player specific predictions, but hopefully every prediction is more or less as good for each different player, So while the predictions are player specific, the error is shared across the players. \n", "\n", "I am having trouble seeing the big picture here, so I will just start with a stupid linear model and go from there.\n", "\n", "$$Actual = a_{[i]j}*x + eta$$\n", " \n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Generalized Linear Model Regression Results \n", "==============================================================================\n", "Dep. Variable: cbs_actual2 No. Observations: 747\n", "Model: GLM Df Residuals: 699\n", "Model Family: Gaussian Df Model: 47\n", "Link Function: identity Scale: 19.723653825\n", "Method: IRLS Log-Likelihood: -2148.9\n", "Date: Sun, 20 Nov 2016 Deviance: 13787.\n", "Time: 16:49:39 Pearson chi2: 1.38e+04\n", "No. Iterations: 4 \n", "==============================================================================\n", " coef std err z P>|z| [95.0% Conf. Int.]\n", "------------------------------------------------------------------------------\n", "x1 -0.0586 0.092 -0.640 0.522 -0.238 0.121\n", "x2 0.1899 0.149 1.272 0.203 -0.103 0.483\n", "x3 0.0197 0.024 0.824 0.410 -0.027 0.067\n", "x4 5.0189 3.375 1.487 0.137 -1.596 11.634\n", "x5 -3.0335 1.259 -2.409 0.016 -5.501 -0.566\n", "x6 0.0388 0.021 1.879 0.060 -0.002 0.079\n", "x7 0.4611 0.266 1.735 0.083 -0.060 0.982\n", "x8 0.0613 0.076 0.810 0.418 -0.087 0.210\n", "x9 0.1607 0.150 1.069 0.285 -0.134 0.455\n", "x10 8.9759 3.378 2.657 0.008 2.354 15.597\n", "x11 1.9341 1.303 1.484 0.138 -0.620 4.488\n", "x12 1.9341 1.303 1.484 0.138 -0.620 4.488\n", "x13 0.0508 0.148 0.344 0.731 -0.238 0.340\n", "x14 0.0508 0.148 0.344 0.731 -0.238 0.340\n", "const -2.214e-12 7.83e-13 -2.827 0.005 -3.75e-12 -6.79e-13\n", "x15 -2.2730 1.405 -1.618 0.106 -5.026 0.480\n", "x16 -0.9640 0.550 -1.754 0.079 -2.041 0.113\n", "x17 0.1746 0.095 1.836 0.066 -0.012 0.361\n", "x18 -0.9428 0.664 -1.420 0.156 -2.244 0.359\n", "x19 0.1768 0.041 4.288 0.000 0.096 0.258\n", "x20 -0.1590 0.114 -1.399 0.162 -0.382 0.064\n", "x21 0.2992 0.223 1.339 0.181 -0.139 0.737\n", "x22 1.4151 0.656 2.159 0.031 0.130 2.700\n", "x23 -1.6888 1.844 -0.916 0.360 -5.302 1.925\n", "x24 -6.4333 2.038 -3.156 0.002 -10.428 -2.438\n", "x25 0.7689 1.234 0.623 0.533 -1.650 3.187\n", "x26 1.1333 1.269 0.893 0.372 -1.353 3.620\n", "x27 -3.7517 1.650 -2.273 0.023 -6.986 -0.517\n", "x28 -2.8892 1.857 -1.556 0.120 -6.529 0.751\n", "x29 -0.5590 1.278 -0.437 0.662 -3.063 1.945\n", "x30 5.0072 1.713 2.923 0.003 1.650 8.365\n", "x31 4.0166 1.837 2.187 0.029 0.417 7.616\n", "x32 -0.2773 1.178 -0.235 0.814 -2.585 2.031\n", "x33 1.9189 1.922 0.999 0.318 -1.847 5.685\n", "x34 -0.1508 1.197 -0.126 0.900 -2.496 2.195\n", "x35 0.0854 1.749 0.049 0.961 -3.342 3.513\n", "x36 4.4033 1.782 2.471 0.013 0.911 7.896\n", "x37 5.5240 1.616 3.419 0.001 2.357 8.691\n", "x38 -0.3842 2.097 -0.183 0.855 -4.494 3.725\n", "x39 -1.9738 1.662 -1.188 0.235 -5.230 1.283\n", "x40 -3.1657 2.247 -1.409 0.159 -7.569 1.237\n", "x41 -3.9229 1.867 -2.101 0.036 -7.583 -0.263\n", "x42 -0.6978 1.817 -0.384 0.701 -4.260 2.864\n", "x43 0.6138 1.894 0.324 0.746 -3.098 4.326\n", "x44 0.0339 1.672 0.020 0.984 -3.243 3.311\n", "x45 0.3932 1.821 0.216 0.829 -3.176 3.962\n", "x46 1.7853 1.822 0.980 0.327 -1.785 5.356\n", "x47 1.1296 1.812 0.623 0.533 -2.422 4.681\n", "x48 -2.9710 1.604 -1.852 0.064 -6.115 0.173\n", "x49 0.8453 1.519 0.557 0.578 -2.132 3.822\n", "x50 -1.2069 2.017 -0.598 0.550 -5.161 2.747\n", "x51 -1.0667 1.038 -1.028 0.304 -3.101 0.968\n", "x52 -0.1402 1.087 -0.129 0.897 -2.271 1.991\n", "==============================================================================\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import statsmodels.api as sm\n", "import math\n", "\n", "QB_df = QB_data.load_df()\n", "all_teams = QB_df.pop('opp')\n", "team_enc = pd.get_dummies(all_teams)\n", "team_enc.pop(0)\n", "home_away = pd.get_dummies(QB_df.pop('home_away'))\n", "home_away.columns = ['bye_inj','away','home']\n", "QB_df = pd.concat([QB_df,team_enc,home_away],axis=1)\n", "QB_df['bye_inj'] = np.double(QB_df['bye_inj'] == 0)\n", "#QB_df = QB_df[QB_df['player_num']<35]\n", "data_endo = QB_df.pop('cbs_actual2')\n", "data_exo = QB_df.ix[:,5:].values\n", "data_exo[:,:17] = data_exo[:,:17]*np.tile(data_exo[:,-3],(17,1)).T\n", "data_exo = sm.add_constant(data_exo, prepend=False)\n", "\n", "\n", "glm_gamma = sm.GLM(data_endo, data_exo, family=sm.families.Gaussian())\n", "glm_results = glm_gamma.fit()\n", "print(glm_results.summary())\n", "\n", "MSE,STE = [],[]\n", "predicting_sites = ['FPTS','fsharks','fftoday','nfl','espn','yahoo','cbs_predict']\n", "for num,predictors in enumerate(predicting_sites):\n", " SE = [(x-data_endo.values[i])**2 for i,x in enumerate(QB_df[predictors].values)]\n", " MSE.append(sum(SE)/len(SE))\n", " STE.append(np.std(SE)/math.sqrt(len(SE)))\n", " #plt.plot(num,MSE)\n", "SE = [(glm_results.predict(x)-data_endo.values[i])**2 for i,x in enumerate(data_exo)]\n", "MSE.append(sum(SE)/len(SE))\n", "STE.append(np.std(SE)/math.sqrt(len(SE)))\n", "\n", "plt.errorbar(np.arange(0,8),MSE,yerr=STE);\n", "plt.xlim(-1,8);\n", "plt.ylabel('MSE')\n", "plt.xticks(np.arange(-1,9),['']+predicting_sites+['model']+['']);" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
FirstNameLastNameTeampredicted_points
0CamNewtonCAR30.834317
6BenRoethlisbergerPIT22.895674
7KirkCousinsWAS21.951479
4DrewBreesNO21.737187
1TomBradyNE20.867042
9BlakeBortlesJAC20.211135
17ColinKaepernickSF20.176852
2AndrewLuckIND20.030794
19JameisWinstonTB18.151417
10AndyDaltonCIN18.026586
15AlexSmithKC17.283195
21CodyKesslerCLE17.229598
12RussellWilsonSEA17.084727
5MarcusMariotaTEN16.994499
24RyanTannehillMIA16.751200
3AaronRodgersGB16.371748
16EliManningNYG16.006075
13DakPrescottDAL15.300529
23CarsonWentzPHI15.070783
8MatthewStaffordDET14.440080
27JaredGoffLA14.014053
20CarsonPalmerARI13.239192
14TyrodTaylorBUF12.869826
11DerekCarrOAK12.355795
26SamBradfordMIN10.730014
18JoeFlaccoBAL10.723287
22BrockOsweilerHOU9.014153
25JayCutlerCHI7.253098
45MattMcGloinOAK0.136155
68JoeWebbCAR0.083788
...............
76GarrettGraysonNO0.000000
77ChristianPonderSF0.000000
78StephenMorrisIND0.000000
79JameillShowersDAL0.000000
80MarkSanchezDAL0.000000
81KellenMooreDAL0.000000
62KevinHoganCLE0.000000
82DavidFalesBAL0.000000
60AlexTanneyTEN0.000000
57NateSudfeldWAS0.000000
56JoelStaveKC0.000000
59CardaleJonesBUF0.000000
30LandryJonesPIT-0.099687
51RyanMallettBAL-0.117142
54MattCasselTEN-0.117142
46MattBarkleyCHI-0.124125
34ShaunHillMIN-0.124125
52DrewStantonARI-0.124125
49E.J.ManuelBUF-0.159036
48DerekAndersonCAR-0.206356
47JimmyGaroppoloNE-0.255232
37ScottTolzienIND-0.255232
53TrevoneBoykinSEA-0.262214
36TomSavageHOU-0.269196
50MikeGlennonTB-0.276179
32ColtMcCoyWAS-0.428233
38CaseKeenumLA-0.573305
29BlaineGabbertSF-0.739323
42NickFolesKC-0.966626
39JoshMcCownCLE-1.057396
\n", "

83 rows × 4 columns

\n", "
" ], "text/plain": [ " FirstName LastName Team predicted_points\n", "0 Cam Newton CAR 30.834317\n", "6 Ben Roethlisberger PIT 22.895674\n", "7 Kirk Cousins WAS 21.951479\n", "4 Drew Brees NO 21.737187\n", "1 Tom Brady NE 20.867042\n", "9 Blake Bortles JAC 20.211135\n", "17 Colin Kaepernick SF 20.176852\n", "2 Andrew Luck IND 20.030794\n", "19 Jameis Winston TB 18.151417\n", "10 Andy Dalton CIN 18.026586\n", "15 Alex Smith KC 17.283195\n", "21 Cody Kessler CLE 17.229598\n", "12 Russell Wilson SEA 17.084727\n", "5 Marcus Mariota TEN 16.994499\n", "24 Ryan Tannehill MIA 16.751200\n", "3 Aaron Rodgers GB 16.371748\n", "16 Eli Manning NYG 16.006075\n", "13 Dak Prescott DAL 15.300529\n", "23 Carson Wentz PHI 15.070783\n", "8 Matthew Stafford DET 14.440080\n", "27 Jared Goff LA 14.014053\n", "20 Carson Palmer ARI 13.239192\n", "14 Tyrod Taylor BUF 12.869826\n", "11 Derek Carr OAK 12.355795\n", "26 Sam Bradford MIN 10.730014\n", "18 Joe Flacco BAL 10.723287\n", "22 Brock Osweiler HOU 9.014153\n", "25 Jay Cutler CHI 7.253098\n", "45 Matt McGloin OAK 0.136155\n", "68 Joe Webb CAR 0.083788\n", ".. ... ... ... ...\n", "76 Garrett Grayson NO 0.000000\n", "77 Christian Ponder SF 0.000000\n", "78 Stephen Morris IND 0.000000\n", "79 Jameill Showers DAL 0.000000\n", "80 Mark Sanchez DAL 0.000000\n", "81 Kellen Moore DAL 0.000000\n", "62 Kevin Hogan CLE 0.000000\n", "82 David Fales BAL 0.000000\n", "60 Alex Tanney TEN 0.000000\n", "57 Nate Sudfeld WAS 0.000000\n", "56 Joel Stave KC 0.000000\n", "59 Cardale Jones BUF 0.000000\n", "30 Landry Jones PIT -0.099687\n", "51 Ryan Mallett BAL -0.117142\n", "54 Matt Cassel TEN -0.117142\n", "46 Matt Barkley CHI -0.124125\n", "34 Shaun Hill MIN -0.124125\n", "52 Drew Stanton ARI -0.124125\n", "49 E.J. Manuel BUF -0.159036\n", "48 Derek Anderson CAR -0.206356\n", "47 Jimmy Garoppolo NE -0.255232\n", "37 Scott Tolzien IND -0.255232\n", "53 Trevone Boykin SEA -0.262214\n", "36 Tom Savage HOU -0.269196\n", "50 Mike Glennon TB -0.276179\n", "32 Colt McCoy WAS -0.428233\n", "38 Case Keenum LA -0.573305\n", "29 Blaine Gabbert SF -0.739323\n", "42 Nick Foles KC -0.966626\n", "39 Josh McCown CLE -1.057396\n", "\n", "[83 rows x 4 columns]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "QB_pred_df = QB_data.update(11,pred=True);\n", "team_enc = QB_pred_df.pop('opp')\n", "\n", "team_list = np.unique(all_teams[all_teams!=0])\n", "team_mat = pd.DataFrame(np.zeros((np.shape(QB_pred_df)[0],len(team_list))),columns=team_list)\n", "for teams in team_list:\n", " match_index = np.where(team_enc==teams)\n", " if len(match_index)>0: team_mat[teams].ix[match_index] = 1\n", " \n", "home_away = pd.get_dummies(QB_pred_df.pop('home_away'))\n", "home_away.columns = ['bye_inj','away','home']\n", "QB_pred_df = pd.concat([QB_pred_df,team_mat,home_away],axis=1)\n", "QB_pred_df['bye_inj'] = np.double(QB_pred_df['bye_inj'] == 0)\n", "\n", "pred_df = QB_pred_df[QB_pred_df['week']==11].ix[:,:3]\n", "\n", "data_exo = QB_pred_df[QB_pred_df['week']==11].ix[:,5:].values\n", "data_exo[:,:17] = data_exo[:,:17]*np.tile(data_exo[:,-3],(17,1)).T\n", "data_exo = sm.add_constant(data_exo, prepend=False)\n", "\n", "predicted_perf = [glm_results.predict(x)[0] for x in data_exo]\n", "pred_df['predicted_points'] = predicted_perf\n", "pred_df.sort_values('predicted_points',ascending=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So I have individual players across all the weeks. One thing that I want to do is to use past performance to predict future performance, but how to do this is confusing... also I feel like I should have a heirarchy somewhere, but where is unclear. \n", "\n", "Ok. So maybe this is the best way to think about it. Every player has a true mean and sd for scoring and these truths exert influence on the predictions and past performance, and then observed behavior is drawn from this. Then there are things that modulate his true mean like who the opponent is. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import pystan\n", "\n", "pooled_model = \"\"\"\n", "data {\n", " int N; \n", " vector[N] x;\n", " vector[N] y;\n", "}\n", "parameters {\n", " vector[2] beta;\n", " real sigma;\n", "} \n", "model {\n", " y ~ normal(beta[1] + beta[2] * x, sigma);\n", "}\n", "\"\"\"\n", "\n", "\n", "pooled_data_dict = {'N': len(data_endo),\n", " 'x': QB_data.yahoo.values,\n", " 'y': data_endo.values}\n", "\n", "pooled_fit = pystan.stan(model_code=pooled_model, data=pooled_data_dict, iter=1000, chains=2)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "pooled_sample = pooled_fit.extract(permuted=True)\n", "b0, m0 = pooled_sample['beta'].T.mean(1)\n", "\n", "\n", "plt.scatter(srrs_mn.floor, np.log(srrs_mn.activity+0.1))\n", "xvals = np.linspace(-0.2, 1.2)\n", "plt.plot(xvals, m0*xvals+b0, 'r--')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import pystan\n", "schools_code = \"\"\"\n", "data {\n", " int J; // number of schools\n", " real y[J]; // estimated treatment effects\n", " real sigma[J]; // s.e. of effect estimates\n", "}\n", "parameters {\n", " real mu;\n", " real tau;\n", " real eta[J];\n", "}\n", "transformed parameters {\n", " real theta[J];\n", " for (j in 1:J)\n", " theta[j] <- mu + tau * eta[j];\n", "}\n", "model {\n", " eta ~ normal(0, 1);\n", " y ~ normal(theta, sigma);\n", "}\n", "\"\"\"\n", "\n", "schools_dat = {'J': 8,\n", " 'y': [28, 8, -3, 7, -1, 1, 18, 12],\n", " 'sigma': [15, 10, 16, 11, 9, 11, 10, 18]}\n", "\n", "fit = pystan.stan(model_code=schools_code, data=schools_dat,\n", " iter=1000, chains=4)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [], "source": [ "season=2016\n", "pos_dict = {'QB':10, 'RB':20, 'WR':30, 'TE':40, 'K':80}\n", "league_dict = {'fftoday':1,'fft_ppr':107644,'yahoo':17,'FFPC':107437,'NFFC':5}\n", "week=2\n", "position='QB'\n", "\n", "urls = dict()\n", "urls['fftoday'] = \"http://www.fftoday.com/rankings/playerwkproj.php?Season=%d&GameWeek=%d&PosID=%d&LeagueID=%d\"\\\n", " % (season,week,pos_dict[position],league_dict['fft_ppr'])\n", "\n", "keys = 'fftoday'\n", "df = pd.read_html(urls[keys],match='FFPts',header=16)[0]" ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [default]", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 1 }