{"cells":[{"metadata":{"_uuid":"1877cacb82b3acd4f4614e4e21ff288a1f6f6033"},"cell_type":"markdown","source":"# NFL Punt Analytics Competition"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# useful imports\nimport numpy as np\nimport pandas as pd","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"# importing the data\nvideo_review = pd.read_csv(\"../input/video_review.csv\")\nplayer_role  = pd.read_csv(\"../input/play_player_role_data.csv\")\nplayer_punt  = pd.read_csv(\"../input/player_punt_data.csv\")\nplay_info = pd.read_csv(\"../input/play_information.csv\")\nngs_2016_1 = pd.read_csv(\"../input/NGS-2016-post.csv\")\nngs_2016_2 = pd.read_csv(\"../input/NGS-2016-pre.csv\")\nngs_2016_3 = pd.read_csv(\"../input/NGS-2016-reg-wk1-6.csv\")\nngs_2016_4 = pd.read_csv(\"../input/NGS-2016-reg-wk13-17.csv\")\nngs_2016_5 = pd.read_csv(\"../input/NGS-2016-reg-wk7-12.csv\")\nngs_2017_1 = pd.read_csv(\"../input/NGS-2017-post.csv\")\nngs_2017_2 = pd.read_csv(\"../input/NGS-2017-pre.csv\")\nngs_2017_3 = pd.read_csv(\"../input/NGS-2017-reg-wk1-6.csv\")\nngs_2017_4 = pd.read_csv(\"../input/NGS-2017-reg-wk13-17.csv\")\nngs_2017_5 = pd.read_csv(\"../input/NGS-2017-reg-wk7-12.csv\")","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"358297eb4c962144c7d38cd939331e89559dd624"},"cell_type":"markdown","source":"### Player informations"},{"metadata":{"trusted":true,"_uuid":"8750af901376aa3de6797583046ef83b640c7eec"},"cell_type":"code","source":"full_players = pd.merge(player_punt, player_role, on=['GSISID'], how = 'left')\nfull_set = pd.merge(full_players, play_info, on=['GameKey','PlayID'], how = 'left')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"37c11ce9a7161a375146bad91200c887a57dd038"},"cell_type":"markdown","source":"### Extracting some features"},{"metadata":{"trusted":true,"_uuid":"2fd0064c49568ee12257444c2b544f1097153159"},"cell_type":"code","source":"set_df=full_set.dropna()\n\nset_df['Home_Team_Visit_Team'] = set_df['Home_Team_Visit_Team'].astype(str)\nset_df['Score_Home_Visiting'] = set_df['Score_Home_Visiting'].astype(str)\nset_df=set_df.join(set_df['Home_Team_Visit_Team'].str.split('-', 1, expand=True).rename(columns={0:'Home',1:'Away'}))\nset_df=set_df.join(set_df['Score_Home_Visiting'].str.split(' - ', 1, expand=True).rename(columns={0:'Home_score',1:'Away_score'}))\n\n# Date\nset_df[\"Game_Date\"] = pd.to_datetime(set_df[\"Game_Date\"], format = '%m/%d/%Y')\n\n# drop columns that were split\nset_df = set_df.drop(['Home_Team_Visit_Team'], axis = 1)\nset_df = set_df.drop(['Score_Home_Visiting'], axis = 1)\nset_df['PlayDescription'] = set_df['PlayDescription'].astype(str)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"5e7cd41d3806692c5aebb1d526af362f975f2158"},"cell_type":"markdown","source":" ## Analysing by event"},{"metadata":{"trusted":true,"_uuid":"435ee3ab014257dc1a1f040981c429372d68fef5"},"cell_type":"code","source":"# fair catch\nfair_catch = []\nfor row in set_df['PlayDescription'].str.contains('fair catch'):\n    if row == True:\n        fair_catch.append(1)\n    else:\n        fair_catch.append(0)\n\n# injury\ninjury = []\nfor row in set_df['PlayDescription'].str.contains('injured'):\n    if row == True:\n        injury.append(1)\n    else:\n        injury.append(0)\n\n# downed\ndowned = []\nfor row in set_df['PlayDescription'].str.contains('downed'):\n    if row == True:\n        downed.append(1)\n    else:\n        downed.append(0)\n# fumbles\nfumbles = []\nfor row in set_df['PlayDescription'].str.contains('FUMBLES'):\n    if row == True:\n        fumbles.append(1)\n    else:\n        fumbles.append(0)\n# muffs\nmuffs = []\nfor row in set_df['PlayDescription'].str.contains('MUFFS'):\n    if row == True:\n        muffs.append(1)\n    else:\n        muffs.append(0)\n\n# Touchback\ntouchback = []\nfor row in set_df['PlayDescription'].str.contains('Touchback'):\n    if row == True:\n        touchback.append(1)\n    else:\n        touchback.append(0)\n        \n# Touchdown\ntouchdown = []\nfor row in set_df['PlayDescription'].str.contains('TOUCHDOWN'):\n    if row == True:\n        touchdown.append(1)\n    else:\n        touchdown.append(0)\n\n# Out of bounds\noob = []\nfor row in set_df['PlayDescription'].str.contains('bounds'):\n    if row == True:\n        oob.append(1)\n    else:\n        oob.append(0)\n\n# add new columns to the df \nset_df[\"fair_catch\"] = fair_catch\nset_df[\"injury\"] = injury\nset_df[\"downed\"] = downed\nset_df[\"fumble\"] = fumbles\nset_df[\"muff\"] = muffs\nset_df[\"touchback\"] = touchback\nset_df[\"touchdown\"] = touchdown\nset_df['out_bounds'] = oob","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"e01358d9e172948e46d839726464fa287496c9ca"},"cell_type":"markdown","source":"### Constructing the correlation matrix"},{"metadata":{"trusted":true,"_uuid":"140605e1e87f56214264a7e469acd880419d01a0"},"cell_type":"code","source":"corr_columns = ['fair_catch', 'injury', 'downed', 'fumble', 'muff', 'touchback', \n                'touchdown', 'out_bounds']\ndf_corr = set_df[corr_columns]\ncorr = df_corr.corr()\ncorr.style.background_gradient().set_precision(2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b4699734792341033ff9ed06c20996ee37da2e87"},"cell_type":"code","source":"# sorting the values to improve visibility\ncorr['injury'].sort_values()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"a960b34145dbad5bc0730a7279407e3dca84c2bf"},"cell_type":"markdown","source":"As we can see, the matrix is not very explicit, but we can see that there is some correlation between injuries and when occurs muffle or fumbles, as well as no correlation when there is a fair catch, the punt is downed or is out of bounds.\nThis is expected since the number of collisions tends to be smaller, in light of the sorter duration of the play"},{"metadata":{"_uuid":"da082f181f588cefb2918a411ca59da4ac38066d"},"cell_type":"markdown","source":" ## Analysing by position\n \n Using the video review, we can gain insight into the colisions"},{"metadata":{"trusted":true,"_uuid":"d7992caf198caddfa638c36a7ed98bfa75ed73bb"},"cell_type":"code","source":"pos_role = pd.merge(video_review, full_players, on=['Season_Year', 'GameKey', 'PlayID', 'GSISID'], how='left')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"15d8f231b329ff2164afe821991f7bdb39ce8ad9"},"cell_type":"code","source":"pos_role.Primary_Partner_GSISID = pos_role.Primary_Partner_GSISID.astype(str)\nfull_players.GSISID = full_players.GSISID.astype(str)\npos_role_partner = pd.merge(pos_role, full_players, how='left', left_on=['Season_Year', 'GameKey', 'PlayID', 'Primary_Partner_GSISID'], \n                            right_on=['Season_Year', 'GameKey', 'PlayID', 'GSISID'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"51af7e5a727cae02e9d82abe4d5a27c24a570146"},"cell_type":"code","source":"pos_role_partner = pos_role_partner.dropna().drop_duplicates(subset=['Season_Year', 'GameKey', 'PlayID', 'GSISID_x', 'Player_Activity_Derived', 'Turnover_Related', 'Primary_Impact_Type','Primary_Partner_GSISID']).reset_index(drop=True)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"502621565048968478b1e2e0c50c831ab740ec82"},"cell_type":"markdown","source":"### What are the collisions, based on the positions"},{"metadata":{"trusted":true,"_uuid":"a1c4108b1ec627aaa13f69a3d61ee76540038cc7"},"cell_type":"code","source":"author = []\nfor row in (pos_role_partner['Player_Activity_Derived'].\n            str.contains('|'.join(['Blocking', 'Tackling']))):\n    if row == True:\n        author.append(1)\n    else:\n        author.append(0)\n\nreceiving = []\nfor row in (pos_role_partner['Player_Activity_Derived'].\n            str.contains('|'.join(['Blocked', 'Tackled']))):\n    if row == True:\n        receiving.append(1)\n    else:\n        receiving.append(0)\n\npos_role_partner['Author'] = author\npos_role_partner['Receiver'] = receiving","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8d14fa686c6149fa7ff37ef2ea0885f09019db24"},"cell_type":"code","source":"RB_act = []\nWR_act = []\nLB_act = []\nDB_act = []\nTE_act = []\nST_act = []\n\nRB_rec = []\nWR_rec = []\nLB_rec = []\nDB_rec = []\nTE_rec = []\nST_rec = []","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"79163d09659ed651aeb2eba8c384ea85cc03463f"},"cell_type":"code","source":"for row in range(len(pos_role_partner)):\n    if pos_role_partner.iat[row, -2] == 1:\n        if pos_role_partner.iat[row, -8] not in ('RB', 'FB'):\n            RB_act.append(0)\n        else:\n            RB_act.append(1)\n\n        if pos_role_partner.iat[row, -8] != 'WR':\n            WR_act.append(0)\n        else:\n            WR_act.append(1)\n\n        if pos_role_partner.iat[row, -8] not in ('ILB', 'OLB', 'MLB'):\n            LB_act.append(0)\n        else:\n            LB_act.append(1)\n\n        if pos_role_partner.iat[row, -8] not in ('CB', 'SS', 'FS', 'S'):\n            DB_act.append(0)\n        else:\n            DB_act.append(1)\n\n        if pos_role_partner.iat[row, -8] != 'TE':\n            TE_act.append(0)\n        else:\n            TE_act.append(1)\n\n        if pos_role_partner.iat[row, -8] not in ('DE', 'LS', 'P'):\n            ST_act.append(0)\n        else:\n            ST_act.append(1)\n        if pos_role_partner.iat[row, -4] not in ('RB', 'FB'):\n            RB_rec.append(0)\n        else:\n            RB_rec.append(1)\n\n        if pos_role_partner.iat[row, -4] != 'WR':\n            WR_rec.append(0)\n        else:\n            WR_rec.append(1)\n\n        if pos_role_partner.iat[row, -4] not in ('ILB', 'OLB', 'MLB'):\n            LB_rec.append(0)\n        else:\n            LB_rec.append(1)\n\n        if pos_role_partner.iat[row, -4] not in ('CB', 'SS', 'FS', 'S'):\n            DB_rec.append(0)\n        else:\n            DB_rec.append(1)\n\n        if pos_role_partner.iat[row, -4] != 'TE':\n            TE_rec.append(0)\n        else:\n            TE_rec.append(1)\n\n        if pos_role_partner.iat[row, -4] not in ('DE', 'LS', 'P'):\n            ST_rec.append(0)\n        else:\n            ST_rec.append(1)\n\n    if pos_role_partner.iat[row, -2] == 0:\n        if pos_role_partner.iat[row, -8] not in ('RB', 'FB'):\n            RB_rec.append(0)\n        else:\n            RB_rec.append(1)\n\n        if pos_role_partner.iat[row, -8] != 'WR':\n            WR_rec.append(0)\n        else:\n            WR_rec.append(1)\n\n        if pos_role_partner.iat[row, -8] not in ('ILB', 'OLB', 'MLB'):\n            LB_rec.append(0)\n        else:\n            LB_rec.append(1)\n\n        if pos_role_partner.iat[row, -8] not in ('CB', 'SS', 'FS', 'S'):\n            DB_rec.append(0)\n        else:\n            DB_rec.append(1)\n\n        if pos_role_partner.iat[row, -8] != 'TE':\n            TE_rec.append(0)\n        else:\n            TE_rec.append(1)\n\n        if pos_role_partner.iat[row, -8] not in ('DE', 'LS', 'P'):\n            ST_rec.append(0)\n        else:\n            ST_rec.append(1)\n        if pos_role_partner.iat[row, -4] not in ('RB', 'FB'):\n            RB_act.append(0)\n        else:\n            RB_act.append(1)\n\n        if pos_role_partner.iat[row, -4] != 'WR':\n            WR_act.append(0)\n        else:\n            WR_act.append(1)\n\n        if pos_role_partner.iat[row, -4] not in ('ILB', 'OLB', 'MLB'):\n            LB_act.append(0)\n        else:\n            LB_act.append(1)\n\n        if pos_role_partner.iat[row, -4] not in ('CB', 'SS', 'FS', 'S'):\n            DB_act.append(0)\n        else:\n            DB_act.append(1)\n\n        if pos_role_partner.iat[row, -4] != 'TE':\n            TE_act.append(0)\n        else:\n            TE_act.append(1)\n\n        if pos_role_partner.iat[row, -4] not in ('DE', 'LS', 'P'):\n            ST_act.append(0)\n        else:\n            ST_act.append(1)\npos_role_partner['RB_act'] = RB_act\npos_role_partner['WR_act'] = WR_act\npos_role_partner['LB_act'] = LB_act\npos_role_partner['DB_act'] = DB_act\npos_role_partner['TE_act'] = TE_act\npos_role_partner['ST_act'] = ST_act\n\npos_role_partner['RB_rec'] = RB_rec\npos_role_partner['WR_rec'] = WR_rec\npos_role_partner['LB_rec'] = LB_rec\npos_role_partner['DB_rec'] = DB_rec\npos_role_partner['TE_rec'] = TE_rec\npos_role_partner['ST_rec'] = ST_rec","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"60207b0e66d141804c7e9d12278c7ca6d39078e6"},"cell_type":"code","source":"corr_columns_pos_2 = ['RB_act', 'WR_act', 'LB_act', 'DB_act', 'TE_act', 'ST_act', 'RB_rec', 'WR_rec',\n       'LB_rec', 'DB_rec', 'TE_rec', 'ST_rec']\ndf_corr_pos_2 = pos_role_partner[corr_columns_pos_2]\ncorr_pos_2 = df_corr_pos_2.corr()\ncorr_pos_2.style.background_gradient().set_precision(2)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"a2150cf39b43245bfd39722ec4752398bc5490ab"},"cell_type":"markdown","source":"The next steps would include checking it with their positions at the punt and using the NGS data to calculate their momentum at the collision. This can help the analysis in the sense that, similar to what happened to the kickoff, can lead to positional changes that could help reducing the speed of the collisions."}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}