Skip to content

Instantly share code, notes, and snippets.

@903124
Last active September 13, 2020 17:19
Show Gist options
  • Save 903124/4a677b445f32fb6e4458fe1090164d44 to your computer and use it in GitHub Desktop.
Save 903124/4a677b445f32fb6e4458fe1090164d44 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"from sklearn.preprocessing import MultiLabelBinarizer\n",
"from sklearn.linear_model import RidgeCV\n",
"from scipy.sparse import hstack\n",
"from scipy import stats\n",
"import optuna\n",
"\n",
"stint_16 = pd.read_csv('luck_adjusted_one_way_possessions/luck_adjusted_one_way_possessions_2016-17.csv')\n",
"stint_17 = pd.read_csv('luck_adjusted_one_way_possessions/luck_adjusted_one_way_possessions_2017-18.csv')\n",
"\n",
"stint_all = pd.concat([stint_16,stint_17]).reset_index()\n",
"stint_all = stint_all[stint_all.possessions > 0]\n",
"\n",
"stint_all = stint_all.groupby(['offensePlayer1Id','offensePlayer2Id','offensePlayer3Id','offensePlayer4Id','offensePlayer5Id','defensePlayer1Id','defensePlayer2Id','defensePlayer3Id','defensePlayer4Id','defensePlayer5Id']).agg(expectedPoints=('expectedPoints','sum'),possessions=('possessions','sum'),gameDate=('gameDate','first'),season=('season','first')).reset_index()\n",
"stint_all['datetime'] = pd.to_datetime(stint_all['gameDate'],unit='ms')\n",
"stint_all['combined_off_player'] = stint_all[['offensePlayer1Id','offensePlayer2Id','offensePlayer3Id','offensePlayer4Id','offensePlayer5Id']].values.tolist()\n",
"stint_all['combined_def_player'] = stint_all[['defensePlayer1Id','defensePlayer2Id','defensePlayer3Id','defensePlayer4Id','defensePlayer5Id']].values.tolist()\n",
"\n",
"stint_post = stint_all[stint_all.datetime >= stint_all.datetime.mean()]\n",
"\n",
"off_mlb = MultiLabelBinarizer(sparse_output=True)\n",
"off_array = off_mlb.fit_transform(stint_post['combined_off_player'] )\n",
"def_mlb = MultiLabelBinarizer(sparse_output=True)\n",
"def_array = def_mlb.fit_transform(stint_post['combined_def_player']) \n",
"\n",
"stint_array = hstack([off_array,-def_array])\n",
"\n",
"clf = RidgeCV(alphas=[3000])\n",
"clf.fit(stint_array,100*stint_post['expectedPoints']/stint_post['possessions'],sample_weight=stint_post['possessions'])\n",
"\n",
"class_list = ['{}_{}'.format(a, 'offense')for a in off_mlb.classes_] + ['{}_{}'.format(a, 'defense')for a in def_mlb.classes_]\n",
"\n",
"out_post_df = pd.DataFrame({'playerId':class_list,'coef':clf.coef_})\n",
"out_post_df.loc[out_post_df.playerId.str.contains('defense'),'coef'] *= -1\n",
"\n",
"stint_pre = stint_all[stint_all.datetime <= stint_all.datetime.mean()]\n",
"\n",
"stint_pre['day'] = (stint_pre['datetime'].max()-stint_pre['datetime'])/ np.timedelta64(1, 'D')\n",
"\n",
"off_mlb = MultiLabelBinarizer(sparse_output=True)\n",
"off_array = off_mlb.fit_transform(stint_pre['combined_off_player'] )\n",
"def_mlb = MultiLabelBinarizer(sparse_output=True)\n",
"def_array = def_mlb.fit_transform(stint_pre['combined_def_player']) \n",
"\n",
"stint_array = hstack([off_array,-def_array])\n",
"\n",
"def objective(trial):\n",
" decay = trial.suggest_loguniform('decay', 10, 1000)\n",
" clf.fit(stint_array,100*stint_pre['expectedPoints']/stint_pre['possessions'],sample_weight=stint_pre['possessions']*2.71828**(-stint_pre['day']/decay))\n",
"\n",
" class_list = ['{}_{}'.format(a, 'offense')for a in off_mlb.classes_] + ['{}_{}'.format(a, 'defense')for a in def_mlb.classes_]\n",
"\n",
" out_pre_df = pd.DataFrame({'playerId':class_list,'coef':clf.coef_})\n",
" out_pre_df.loc[out_pre_df.playerId.str.contains('defense'),'coef'] *= -1\n",
"\n",
" merged_df = pd.merge(out_pre_df, out_post_df,on='playerId')\n",
" slope, intercept, r_value, p_value, std_err = stats.linregress(merged_df['coef_x'], merged_df['coef_y'])\n",
" \n",
" return r_value**2\n",
"\n",
"study = optuna.create_study(direction='maximize')\n",
"study.optimize(objective, n_trials=100)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment