{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install pytorch-tabnet","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\npd.options.display.max_columns = 999\n\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import accuracy_score\n\nfrom sklearn.neural_network import MLPClassifier,MLPRegressor\n\nfrom sklearn.metrics import accuracy_score, mean_squared_error\n\nfrom pytorch_tabnet.tab_model import TabNetClassifier\n\nimport matplotlib.pyplot as plt\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"play_data = pd.read_csv('../input/nfl-big-data-bowl-2022/plays.csv')\nplayer_data = pd.read_csv('../input/nfl-big-data-bowl-2022/players.csv')\npff_data = pd.read_csv('../input/nfl-big-data-bowl-2022/PFFScoutingData.csv')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"kickoff_play = play_data[(play_data.specialTeamsPlayType == 'Kickoff')]\nkickoff_play = pd.merge(kickoff_play,pff_data)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tracking_data = []\n\nfor year in range(2018,2021):\n    data = pd.read_csv('../input/nfl-big-data-bowl-2022/tracking'+str(year) + '.csv')\n    data = pd.merge(data,kickoff_play[['gameId','playId']])\n#     data = data[data.team == 'football']\n    tracking_data.append(data)\ntracking_data = pd.concat(tracking_data).reset_index(drop=True)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tracking_data.loc[tracking_data.playDirection == 'left','x'] = 120-tracking_data['x']\ntracking_data.loc[tracking_data.playDirection == 'left','y'] = 53.33-tracking_data['y']\n\ntracking_data['x_dir'] = -np.sin((np.pi / 180) * tracking_data.dir)\ntracking_data['y_dir'] = -np.cos((np.pi / 180) * tracking_data.dir)\ntracking_data['x_s'] = tracking_data.x_dir * tracking_data.s\ntracking_data['y_s'] = tracking_data.y_dir * tracking_data.s","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"kickoff_frame = tracking_data[(tracking_data.event == 'kickoff')&(tracking_data.displayName == 'football')].groupby(['gameId','playId'])[['frameId','x','y']].first().reset_index()\nkickoff_frame = pd.merge(kickoff_frame, kickoff_play[['gameId','playId','hangTime','kickContactType','kickType','kickReturnYardage','playDescription','specialTeamsResult','kickerId','returnerId','penaltyYards']])\nkickoff_frame = kickoff_frame.dropna(subset=['hangTime'])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tracking_data = pd.merge(tracking_data,kickoff_frame[['playId','gameId','frameId','hangTime','x','y','kickContactType','kickType','kickReturnYardage','playDescription','specialTeamsResult','kickerId','returnerId','penaltyYards']],on=['playId','gameId'],suffixes=['','_kickoff'])\ntracking_data['ground_frame'] = tracking_data['frameId_kickoff']+(tracking_data['hangTime']*10).astype(int)\ntracking_data_ground = tracking_data[(tracking_data.ground_frame == tracking_data.frameId) & (tracking_data.displayName == 'football')]\ntracking_data = pd.merge(tracking_data,tracking_data_ground[['playId','gameId','x','y']] , on=['gameId','playId'],suffixes=['','_ground'])\ntracking_data['frame_diff'] = tracking_data['frameId'] - tracking_data['ground_frame']","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tracking_data['first_returner_id'] =  tracking_data.returnerId.str.split(';',n=0).str[0].astype(float)\ndesinated_returner_list = tracking_data[tracking_data.event == 'kickoff'].groupby(['gameId','playId'])[['x']].idxmax().reset_index()\ntracking_data_returner = tracking_data[(tracking_data.event == 'kickoff') & (tracking_data.index.isin(desinated_returner_list['x']))]\ntracking_data = pd.merge(tracking_data,tracking_data_returner[['gameId','playId','x','y','nflId']],on=['gameId','playId'],suffixes=['','_returner'])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tracking_data_kickoff = tracking_data[(tracking_data.event == 'kickoff')&(tracking_data.displayName == 'football')]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"temp_df = tracking_data_kickoff.groupby(['gameId','playId']).first().reset_index()\ntemp_df = temp_df[~pd.isna(temp_df['kickReturnYardage'])]\nX_return_yard  = temp_df[['x_ground','y_ground','x_returner','y_returner']]\ny_return_yard = temp_df['kickReturnYardage'].values - temp_df['penaltyYards'].fillna(0).values\nX_train, X_test, y_train, y_test = train_test_split(X_return_yard, y_return_yard, test_size=0.2, random_state=42)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mlp_return_yard = MLPRegressor(random_state=11)\nmlp_return_yard.fit(np.array(X_train),np.array(y_train).reshape(-1, 1))\ny_pred = mlp_return_yard.predict(np.array(X_test))\nprint(mean_squared_error(y_test,y_pred))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"temp_df = tracking_data_kickoff.groupby(['gameId','playId']).first().reset_index()\n\nX_oob  = temp_df[['x_ground','y_ground','x_returner','y_returner']]\ny_oob = temp_df['specialTeamsResult'] == 'Out of Bounds'\nX_train, X_test, y_train, y_test = train_test_split(X_oob, y_oob, test_size=0.1, random_state=42)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mlp_oob = MLPClassifier(random_state=11)\nmlp_oob.fit(np.array(X_train),np.array(y_train).flatten())\ny_pred = mlp_oob.predict(np.array(X_test))\nprint(accuracy_score(y_test,y_pred))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tnc_oob = TabNetClassifier()\ntnc_oob.fit(np.array(X_train),np.array(y_train).flatten(),eval_set=[(np.array(X_test), np.array(y_test))])\ny_pred = tnc_oob.predict(np.array(X_test))\nprint(accuracy_score(y_test,y_pred))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"temp_df = tracking_data_kickoff.groupby(['gameId','playId']).first().reset_index()\n\nX_touchback  = temp_df[['x_ground','y_ground','x_returner','y_returner']]\ny_touchback = temp_df['specialTeamsResult'] == 'Touchback'\nX_train, X_test, y_train, y_test = train_test_split(X_touchback, y_touchback, test_size=0.2, random_state=42)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mlp_touchback = MLPClassifier(hidden_layer_sizes=(30,))\nmlp_touchback.fit(np.array(X_train),np.array(y_train).flatten())\ny_pred = mlp_touchback.predict(np.array(X_test))\nprint(accuracy_score(y_test,y_pred))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"np.array(y_train).flatten()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tnc_touchback =  TabNetClassifier()\ntnc_touchback.fit(np.array(X_train),np.array(y_train).flatten())\ny_pred = tnc_touchback.predict(np.array(X_test))\nprint(accuracy_score(y_test,y_pred))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mlp_touchback.predict_proba([[100,25,90,25]])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tracking_data_kickoff[['x_returner','y_returner']].mean()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"nx, ny = (41, 54)\nx = np.linspace(80, 120, nx)\ny = np.linspace(0, 53, ny)\nxv, yv = np.meshgrid(x, y, sparse = True)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"inference_array = []\ncoordinate_array = []\nfor i in xv[0]:\n    for j in yv.T[0]:\n\n        inference_array.append([i,j,95,25])\n        coordinate_array.append([i,j])\ninference_array = np.array(inference_array)\ncoordinate_array  = np.array(coordinate_array)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(12,7),facecolor='white')\nc = plt.pcolormesh(xv, yv,mlp_return_yard.predict(np.array(inference_array)).reshape(nx,ny).T)\ncbar = plt.colorbar(c)\ncbar.set_label('Predicted Return Yardage')\nplt.title('Predicted Return Yardage')\nplt.vlines(x=110,ymin=0,ymax=53,color='black',linestyle='--')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"return_value = mlp_return_yard.predict(np.array(inference_array)).reshape(nx,ny).T\n\nnet_yard_value = np.zeros((54,41))\nfor i in range(54):\n    for j in range(41):\n\n        net_yard_value[i,j] = return_value[i,j] + (41-j)-10","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(12,7),facecolor='white')\nc = plt.pcolormesh(xv, yv,net_yard_value)\ncbar = plt.colorbar(c)\ncbar.set_label('Predicted Return Yardage')\nplt.title('Predicted Return Yardage')\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(12,7),facecolor='white')\nc = plt.pcolormesh(xv, yv,(1-tnc_touchback.predict_proba(np.array(inference_array))[:,1].reshape(nx,ny).T)*net_yard_value+tnc_touchback.predict_proba(np.array(inference_array))[:,1].reshape(nx,ny).T*25)\ncbar = plt.colorbar(c)\ncbar.set_label('Predicted Starting Yard by kickoff location')\nplt.title('Predicted Starting Yard')\nplt.vlines(x=110,ymin=0,ymax=53,color='black',linestyle='--')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from matplotlib import colors\ndivnorm=colors.TwoSlopeNorm(vmin=-5., vcenter=0., vmax=10)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(12,7),facecolor='white')\nc = plt.pcolormesh(xv, yv,np.max((net_yard_value,tnc_touchback.predict_proba(np.array(inference_array))[:,1].reshape(nx,ny).T*25),axis=0))\ncbar = plt.colorbar(c)\ncbar.set_label('Predicted Starting Yard')\nplt.title('Predicted Starting Yard')\nplt.vlines(x=110,ymin=0,ymax=53,color='black',linestyle='--')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(12,7),facecolor='white')\nc = plt.pcolormesh(xv, yv,net_yard_value-mlp_touchback.predict_proba(np.array(inference_array))[:,1].reshape(nx,ny).T*25,cmap=plt.get_cmap('RdBu'),norm=divnorm)\nplt.xlim([90,120])\ncbar = plt.colorbar(c)\ncbar.set_label('Yard difference between Touchback and Return')\nplt.title('Yard difference between Touchback and Return')\nplt.vlines(x=110,ymin=0,ymax=53,color='black',linestyle='--')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# plt.figure(figsize=(12,7),facecolor='white')\n# c = plt.pcolormesh(xv, yv,mlp_touchback.predict_proba(np.array(inference_array))[:,1].reshape(nx,ny).T)\n# cbar = plt.colorbar(c)\n# cbar.set_label('Touchback Probability')\n# plt.title('Touchback Probability')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(12,7),facecolor='white')\nc = plt.pcolormesh(xv, yv,tnc_touchback.predict_proba(np.array(inference_array))[:,1].reshape(nx,ny).T)\ncbar = plt.colorbar(c)\ncbar.set_label('Touchback Probability')\nplt.title('Predicted Touchback Probability')\nplt.vlines(x=110,ymin=0,ymax=53,color='black',linestyle='--')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(12,7),facecolor='white')\nc = plt.pcolormesh(xv, yv,mlp_oob.predict_proba(np.array(inference_array))[:,1].reshape(nx,ny).T)\ncbar = plt.colorbar(c)\ncbar.set_label('Out of Bounds Probability')\nplt.title('Out of Bounds Probability')\nplt.vlines(x=110,ymin=0,ymax=53,color='black',linestyle='--')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"onside_play = kickoff_play[kickoff_play.kickType.isin(['O','S'])]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"onside_play","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tracking_data_onside = []\n\nfor year in range(2018,2021):\n    data = pd.read_csv('../input/nfl-big-data-bowl-2022/tracking'+str(year) + '.csv')\n    data = pd.merge(data,kickoff_play[['gameId','playId']])\n#     data = data[data.team == 'football']\n    tracking_data_onside.append(data)\ntracking_data_onside = pd.concat(tracking_data_onside).reset_index(drop=True)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tracking_data_onside.loc[tracking_data_onside.playDirection == 'left','x'] = 120-tracking_data_onside['x']\ntracking_data_onside.loc[tracking_data_onside.playDirection == 'left','y'] = 53.33-tracking_data_onside['y']\n\ntracking_data_onside['x_dir'] = -np.sin((np.pi / 180) * tracking_data_onside.dir)\ntracking_data_onside['y_dir'] = -np.cos((np.pi / 180) * tracking_data_onside.dir)\ntracking_data_onside['x_s'] = tracking_data_onside.x_dir * tracking_data_onside.s\ntracking_data_onside['y_s'] = tracking_data_onside.y_dir * tracking_data_onside.s","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"onside_frame = tracking_data_onside[(tracking_data_onside.event.isin(['onside_kick','autoevent_kickoff','kickoff','kickoff_play','drop_kick','free_kick']))&(tracking_data_onside.displayName == 'football')].groupby(['gameId','playId'])[['frameId','x','y']].first().reset_index()\nonside_frame = pd.merge(onside_frame, onside_play[['gameId','playId','hangTime','kickContactType','kickType','kickReturnYardage','playDescription','specialTeamsResult','kickerId','returnerId','penaltyYards']])\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tracking_data_onside= pd.merge(tracking_data_onside,onside_frame[['playId','gameId','frameId','hangTime','x','y','kickContactType','kickType','kickReturnYardage','playDescription','specialTeamsResult','kickerId','returnerId','penaltyYards']],on=['playId','gameId'],suffixes=['','_kickoff'])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tracking_data_onside['frame_diff'] = tracking_data_onside.frameId - tracking_data_onside.frameId_kickoff","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tracking_data_onside_five = tracking_data_onside[(tracking_data_onside.frame_diff == 5) & (tracking_data_onside.displayName == 'football') & (tracking_data_onside.kickType.isin(['O','S']))]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tracking_data_onside_five['x_diff'] = tracking_data_onside_five.x - tracking_data_onside_five.x_kickoff\ntracking_data_onside_five['y_diff'] = tracking_data_onside_five.y - tracking_data_onside_five.y_kickoff","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tracking_data_onside_five.loc[tracking_data_onside_five['y_diff'] < 0,'y_diff'] = -tracking_data_onside_five['y_diff']","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"temp_df = tracking_data_onside_five.groupby(['gameId','playId']).first().reset_index()\nX_recover = temp_df[['x_diff','y_diff']]\ny_recover = temp_df.specialTeamsResult == 'Kickoff Team Recovery'","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mlp_recover = MLPClassifier()\nmlp_recover.fit(X_recover,y_recover)\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"nx, ny = (11, 11)\nx = np.linspace(0, 10, nx)\ny = np.linspace(0, 10, ny)\nxv, yv = np.meshgrid(x, y, sparse = True)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"inference_array = []\ncoordinate_array = []\nfor i in xv[0]:\n    for j in yv.T[0]:\n\n        inference_array.append([i,j])\n        coordinate_array.append([i,j])\ninference_array = np.array(inference_array)\ncoordinate_array  = np.array(coordinate_array)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(6,6),facecolor='white')\nc = plt.pcolormesh(xv, yv,mlp_recover.predict_proba(np.array(inference_array))[:,1].reshape(nx,ny).T)\ncbar = plt.colorbar(c)\ncbar.set_label('Recover Probability')\nplt.title('Recover Probability')\nplt.xlabel('x (to endzone ->)')\nplt.ylabel('y (to sideline ->)')","metadata":{},"execution_count":null,"outputs":[]}]}