{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"_kg_hide-input":true,"_kg_hide-output":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport lightgbm as lgb\nfrom tqdm import tqdm_notebook\nimport matplotlib.pyplot as plt\nfrom sklearn.metrics import mean_squared_error\nfrom sklearn.metrics import roc_auc_score, roc_curve\nfrom sklearn.model_selection import StratifiedKFold,GroupKFold,KFold\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.feature_selection import SelectFromModel\nimport shap\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"from IPython.display import Image\nImage(\"/kaggle/input/nflanalyticsimages/breakawaybanner.JPG\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":""},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom IPython.display import HTML, Image\nimport warnings\nimport plotly\nimport plotly.express as px\n\npd.set_option(\"display.max_columns\", 100)\nth_props = [('font-size', '13px'), ('background-color', 'white'), \n            ('color', '#666666')]\ntd_props = [('font-size', '15px'), ('background-color', 'white')]\nstyles = [dict(selector=\"td\", props=td_props), dict(selector=\"th\", \n            props=th_props)]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"play = pd.read_csv('../input/nfl-playing-surface-analytics/PlayList.csv')\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"oneplayer = pd.read_parquet('/kaggle/input/breakaway-cleats-loading-track-data/oneplayer.parq')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Replace Weather conditions with 2 factors - wet & dry.  Group players into blockers (OL/DL) and ball handlers (RB, WR, TE, LB, CB, S)"},{"metadata":{"trusted":true},"cell_type":"code","source":"Weatherdict = {\"10% Chance of Rain\": \"Dry\",\n               \"30% Chance of Rain\": \"Dry\",\n              \"Clear\":\"Dry\",\n\"Clear Skies\":\"Dry\",\n\"Clear and Cool\":\"Dry\",\n\"Clear and Sunny\":\"Dry\",\n\"Clear and cold\":\"Dry\",\n\"Clear and sunny\":\"Dry\",\n\"Clear and warm\":\"Dry\",\n\"Clear skies\":\"Dry\",\n\"Clear to Partly Cloudy\":\"Dry\",\n\"Cloudy\":\"Dry\",\n\"Cloudy and Cool\":\"Dry\",\n\"Cloudy and cold\":\"Dry\",\n\"Cloudy with periods of rain, thunder possible. Winds shifting to WNW, 10-20 mph.\":\"Dry\",\n\"Cloudy, 50% change of rain\":\"Dry\",\n\"Cloudy, Rain\":\"Wet\",\n\"Cloudy, chance of rain\":\"Dry\",\n\"Cloudy, fog started developing in 2nd quarter\":\"Dry\",\n\"Cloudy, light snow accumulating 1-3\":\"Dry\",\n\"Cold\":\"Dry\",\n\"Controlled Climate\":\"Dry\",\n\"Coudy\":\"Dry\",\n\"Fair\":\"Dry\",\n\"Hazy\":\"Dry\",\n\"Heat Index 95\":\"Dry\",\n\"Heavy lake effect snow\":\"Wet\",\n\"Indoor\":\"Dry\",\n\"Indoors\":\"Dry\",\n\"Light Rain\":\"Wet\",\n\"Mostly Cloudy\":\"Dry\",\n\"Mostly Coudy\":\"Dry\",\n\"Mostly Sunny\":\"Dry\",\n\"Mostly Sunny Skies\":\"Dry\",\n\"Mostly cloudy\":\"Dry\",\n\"Mostly sunny\":\"Dry\",\n\"N/A (Indoors)\":\"Dry\",\n\"N/A Indoor\":\"Dry\",\n\"Overcast\":\"Dry\",\n\"Partly Cloudy\":\"Dry\",\n\"Partly Clouidy\":\"Dry\",\n\"Partly Sunny\":\"Dry\",\n\"Partly clear\":\"Dry\",\n\"Partly cloudy\":\"Dry\",\n\"Partly sunny\":\"Dry\",\n\"Party Cloudy\":\"Dry\",\n\"Rain\":\"Wet\",\n\"Rain Chance 40%\":\"Dry\",\n\"Rain likely, temps in low 40s.\":\"Wet\",\n\"Rain shower\":\"Wet\",\n\"Rainy\":\"Wet\",\n\"Scattered Showers\":\"Wet\",\n\"Showers\":\"Wet\",\n\"Snow\":\"Wet\",\n\"Sun & clouds\":\"Dry\",\n\"Sunny\":\"Dry\",\n\"Sunny Skies\":\"Dry\",\n\"Sunny and clear\":\"Dry\",\n\"Sunny and cold\":\"Dry\",\n\"Sunny and warm\":\"Dry\",\n\"Sunny, Windy\":\"Dry\",\n\"Sunny, highs to upper 80s\":\"Dry\",\n\"cloudy\":\"Dry\",\n}\nRosterdict1 = {\"Cornerback\":\"Fast\",\n\"Defensive Lineman\":\"Slow\",\n\"Linebacker\":\"Medium\",\n\"Offensive Lineman\":\"Slow\",\n\"Running Back\":\"Fast\",\n\"Safety\":\"Medium\",\n\"Tight End\":\"Medium\",\n\"Wide Receiver\":\"Fast\"}\nRosterdict2 = {\n\"Cornerback\":\"Defense\",\n\"Defensive Lineman\":\"Defense\",\n\"Linebacker\":\"Defense\",\n\"Offensive Lineman\":\"Offense\",\n\"Running Back\":\"Offense\",\n\"Safety\":\"Defense\",\n\"Tight End\":\"Offense\",\n\"Wide Receiver\":\"Offense\"}\nRosterdict3={\n\"Cornerback\":\"Defender\",\n\"Defensive Lineman\":\"Blocker\",\n\"Linebacker\":\"Defender\",\n\"Offensive Lineman\":\"Blocker\",\n\"Running Back\":\"Catcher\",\n\"Safety\":\"Defender\",\n\"Tight End\":\"Catcher\",\n\"Wide Receiver\":\"Catcher\"}\nRosterdict4={\n\"Cornerback\":\"Ball\",\n\"Defensive Lineman\":\"Blocker\",\n\"Linebacker\":\"Ball\",\n\"Offensive Lineman\":\"Blocker\",\n\"Running Back\":\"Ball\",\n\"Safety\":\"Ball\",\n\"Tight End\":\"Ball\",\n\"Wide Receiver\":\"Ball\"}\nBodydict={\n\"Ankle\":\"Joint\",\n\"Foot\":\"Feet\",\n\"Heel\":\"Feet\",\n\"Knee\":\"Joint\",\n\"Toes\":\"Feet\"}\n\nRosterEncode1 = {\"Fast\":2,\n\"Medium\":1,\n\"Slow\": 0}\n\nRosterEncode = {\"Ball\":0,\n\"Blocker\":1}\n\nTurfEncode = {'Synthetic':1,'Natural':0}\nWeatherEncode = {\"Dry\":0,\"Wet\":1}\n\n\nplay['Dry']=play['Weather']\nplay = play.replace({\"Dry\": Weatherdict})\n\nplay['Dry'] = np.where(play['Dry'].isin([\"Dry\",'Wet']),play['Dry'],'Wet')\nplay['Roster']=play['RosterPosition']\nplay = play.replace({\"Roster\": Rosterdict4})\nplay['Roster1']=play['RosterPosition']\nplay = play.replace({\"Roster2\": Rosterdict1})\n\n\n\n\nplay['IsDry'] = play['Dry']\nplay['Turf'] = play['FieldType']\n\n\nplay = play.replace({'Roster':RosterEncode})\nplay = play.replace({'Roster1':RosterEncode1})\nplay = play.replace({'IsDry':WeatherEncode})\nplay = play.replace({'Turf':TurfEncode})\n\nplay = play[play.Roster.isin([0,1])].copy()\n\nplay['IsPass'] = np.where(play['PlayType'].isin(['Rush','Pass']),play['PlayType'],2)\nplay['IsPass'] = np.where(play['PlayType']=='Pass',0,play.IsPass)\nplay['IsPass'] = np.where(play['PlayType']=='Rush',1,play.IsPass)\n\nplay['Dry']=play['Weather']\nplay = play.replace({\"Dry\": Weatherdict})\n\nplay['Dry'] = np.where(play['Dry'].isin([\"Dry\",'Wet']),play['Dry'],'Wet')\nplay['Roster']=play['RosterPosition']\nplay = play.replace({\"Roster\": Rosterdict4})\nplay['Roster1']=play['RosterPosition']\nplay = play.replace({\"Roster2\": Rosterdict1})\n\nplay['IsDry'] = play['Dry']\nplay['Turf'] = play['FieldType']\n\nplay['RosterType'] = play.Roster\nplay = play.replace({'Roster':RosterEncode})\nplay = play.replace({'Roster1':RosterEncode1})\nplay = play.replace({'IsDry':WeatherEncode})\nplay = play.replace({'Turf':TurfEncode})\n\nplay = play[play.Roster.isin([0,1])].copy()\n\nplay['IsPass'] = np.where(play['PlayType'].isin(['Rush','Pass']),play['PlayType'],2)\nplay['IsPass'] = np.where(play['PlayType']=='Pass',0,play.IsPass)\nplay['IsPass'] = np.where(play['PlayType']=='Rush',1,play.IsPass)\n\nplay['PlayKey'] = play.PlayKey.fillna('0-0-0')\nid_array = play.PlayKey.str.split('-', expand=True).to_numpy()\nplay['PlayerKey'] = id_array[:,0].astype(int)\nplay['GameID'] = id_array[:,1].astype(int)\nplay['PlayKey'] = id_array[:,2].astype(int)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Play_trk=play.merge(oneplayer,on=['PlayerKey','GameID','PlayKey'])\nPlay_trk['PlayerKeyGroup'] =np.round(Play_trk['PlayerKey'].astype(int)/100).fillna(0)\nPlay_trk=Play_trk.drop(columns=['index'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X = Play_trk.replace([np.inf,-np.inf],np.nan).fillna(0).copy()    \nX.drop([\n     'IsDry','StadiumType' ,'Temperature'  ,'GameID','PlayKey','PlayerGame','PlayerDay','PlayerKeyGroup'\n       ], axis=1, inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"cat_features=['PlayerKey']\nfor col in cat_features:\n    X[col]= X[col].astype('category')\n\nfeatures = list(X.select_dtypes(include=[np.number]).columns.values)\nX[features] = X[features].fillna(0)\nscaler = StandardScaler()\n#train_val[features] = scaler.fit_transform(train_val[features])\nX[features] = scaler.fit_transform(X[features])\ntrain_df = X.copy()\nfeatures = features+cat_features","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"features = ['Turf', 'IsPass',  'Delta_Dis_2', 'Delta_Dir_2', 'Delta_Angle_2', 'Delta_O_2', 'Delta_Total_Acc_2', 'abs_Delta_Dis_2', 'abs_Delta_Dir_2', 'abs_Delta_Angle_2', 'abs_Delta_O_2', 'abs_Delta_Total_Acc_2', 'Delta_Dis_3', 'Delta_Dir_3', 'Delta_Angle_3', 'Delta_O_3', 'Delta_Total_Acc_3', 'abs_Delta_Dis_3', 'abs_Delta_Dir_3', 'abs_Delta_Angle_3', 'abs_Delta_O_3', 'abs_Delta_Total_Acc_3', 'Delta_Dis_4', 'Delta_Dir_4', 'Delta_Angle_4', 'Delta_O_4', 'Delta_Total_Acc_4', 'abs_Delta_Dis_4', 'abs_Delta_Dir_4', 'abs_Delta_Angle_4', 'abs_Delta_O_4', 'abs_Delta_Total_Acc_4', 'Delta_Dis_5', 'Delta_Dir_5', 'Delta_Angle_5', 'Delta_O_5', 'Delta_Total_Acc_5', 'abs_Delta_Dis_5', 'abs_Delta_Dir_5', 'abs_Delta_Angle_5', 'abs_Delta_O_5', 'abs_Delta_Total_Acc_5', 'Delta_Dis_6', 'Delta_Dir_6', 'Delta_Angle_6', 'Delta_O_6', 'Delta_Total_Acc_6', 'abs_Delta_Dis_6', 'abs_Delta_Dir_6', 'abs_Delta_Angle_6', 'abs_Delta_O_6', 'abs_Delta_Total_Acc_6', 'Delta_Dis_7', 'Delta_Dir_7', 'Delta_Angle_7', 'Delta_O_7', 'Delta_Total_Acc_7', 'abs_Delta_Dis_7', 'abs_Delta_Dir_7', 'abs_Delta_Angle_7', 'abs_Delta_O_7', 'abs_Delta_Total_Acc_7', 'Delta_Dis_8', 'Delta_Dir_8', 'Delta_Angle_8', 'Delta_O_8', 'Delta_Total_Acc_8', 'abs_Delta_Dis_8', 'abs_Delta_Dir_8', 'abs_Delta_Angle_8', 'abs_Delta_O_8', 'abs_Delta_Total_Acc_8', 'Delta_Dis_9', 'Delta_Dir_9', 'Delta_Angle_9', 'Delta_O_9', 'Delta_Total_Acc_9', 'abs_Delta_Dis_9', 'abs_Delta_Dir_9', 'abs_Delta_Angle_9', 'abs_Delta_O_9', 'abs_Delta_Total_Acc_9', 'Rolling_5_Dis_std', 'Rolling_5_Dir_std', 'Rolling_5_Angle_std', 'Rolling_5_O_std', 'Rolling_5_Total_Acc_std', 'Rolling_abs_5_Dis_mean', 'Rolling_abs_5_Dir_mean', 'Rolling_abs_5_Angle_mean', 'Rolling_abs_5_O_mean', 'Rolling_abs_5_Total_Acc_mean', 'Rolling_10_Dis_std', 'Rolling_10_Dir_std', 'Rolling_10_Angle_std', 'Rolling_10_O_std', 'Rolling_10_Total_Acc_std', 'Rolling_abs_10_Dis_mean', 'Rolling_abs_10_Dir_mean', 'Rolling_abs_10_Angle_mean', 'Rolling_abs_10_O_mean', 'Rolling_abs_10_Total_Acc_mean', 'PlayerKey']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\ntarget = Play_trk['IsDry']\n\n\nparams = {'objective': 'binary',\n 'metric': 'binary_error',\n 'boosting_type': 'gbdt',\n 'learning_rate': 0.1,\n 'lambda_l1': 9.934222857123041,\n 'lambda_l2': 0.9573358221807761,\n 'num_leaves': 42,\n 'feature_fraction': 0.705808436693177,\n 'bagging_fraction': 0.76018681204692047,\n 'bagging_freq': 2,\n 'min_child_samples': 74,\n 'random_state': 42,\n 'verbose': -1}\n\n\n\n\n\nfolds = GroupKFold(n_splits=5)\n\noof = np.zeros(len(train_df))\npredictions = np.zeros(len(train_df))\nfeature_importance_df = pd.DataFrame()\npredict_df = pd.DataFrame()\nmodels = []\nfor fold_, (trn_idx, val_idx) in enumerate(folds.split(train_df.values, target.values,Play_trk['PlayerGamePlay'])):\n    print(\"Fold {}\".format(fold_))\n    trn_data = lgb.Dataset(train_df.iloc[trn_idx][features], label=target.iloc[trn_idx])\n    val_data = lgb.Dataset(train_df.iloc[val_idx][features], label=target.iloc[val_idx])\n\n    num_round = 300\n    clf = lgb.train(params, trn_data, num_round, valid_sets = [trn_data, val_data], verbose_eval=10, early_stopping_rounds = 50)\n    oof[val_idx] = clf.predict(train_df.iloc[val_idx][features], num_iteration=clf.best_iteration)\n    \n    fold_importance_df = pd.DataFrame()\n    fold_importance_df[\"Feature\"] = features\n    fold_importance_df[\"importance\"] = clf.feature_importance()\n   \n    fold_importance_df[\"fold\"] = fold_ + 1\n    feature_importance_df = pd.concat([feature_importance_df, fold_importance_df], axis=0)\n    models.append(clf)\n\n    \n    \n    #predictions += clf.predict(train_df[features], num_iteration=clf.best_iteration) / folds.n_splits\n    #predict_fold = pd.DataFrame(clf.predict(train_df[features], num_iteration=clf.best_iteration))\n    #predict_fold['Fold']= fold_ + 1\n    #predict_fold['PlayId'] = Play_trk.PlayKey #combine with time\n    #predict_df = pd.concat([predict_df,predict_fold])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\nfeature_importance_df[[\"Feature\", \"importance\"]].groupby(\"Feature\").mean().sort_values(by=\"importance\", ascending=False).reset_index().to_csv('FeatureImportance.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"## With all Features\nfrom sklearn.metrics import roc_auc_score\nfrom sklearn.metrics import roc_curve, auc\ndf1 = pd.DataFrame(oof)\ndf1['target'] = target\n\nfpr, tpr, _ = roc_curve(df1.target, df1[0])\nroc_auc = auc(fpr, tpr)\n\n\nplt.figure()\nlw = 2\nplt.plot(fpr, tpr, color='darkorange',\n         lw=lw, label='ROC curve (area = %0.2f)' % roc_auc)\nplt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')\nplt.xlim([0.0, 1.0])\nplt.ylim([0.0, 1.05])\nplt.xlabel('False Positive Rate')\nplt.ylabel('True Positive Rate')\nplt.title('Receiver operating characteristic example')\nplt.legend(loc=\"lower right\")\nplt.savefig('roc.png')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"explainer = shap.TreeExplainer(clf)\nshap_values = explainer.shap_values(train_df[features])\nshap.summary_plot(shap_values, train_df[features])\nplt.savefig('shap.png')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":1}