{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import datetime as dt\nimport os\nimport re\n\nimport numpy as np\nimport pandas as pd\nfrom tqdm import tqdm\n\nNFL_DATA_DIR = '../input'\nNGS_DIR = '.'\n\nYARD = 0.9144\nMPH = 1.609344\nSPEED_LIMIT = 13\nMAX_SPEED = 11\nSMOOTHING_FACTOR = 3","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"start = dt.datetime.now()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"f1472159c15badde73f6214139884365ed67317c"},"cell_type":"code","source":"NGS_BY_PLAY = {}\nngs_filenames = [f for f in os.listdir(NFL_DATA_DIR) if f.startswith('NGS')]\nfor f in ngs_filenames[:]:\n    ngs = pd.read_csv(os.path.join(NFL_DATA_DIR, f), parse_dates=['Time'], low_memory=False)\n    ngs['PlayKey'] = ngs['GameKey'].apply(str) + '_' + ngs['PlayID'].apply(str)\n    for playkey, df in tqdm(ngs.groupby('PlayKey')):\n        play_filename = os.path.join(NGS_DIR, f'{playkey}.csv')\n        NGS_BY_PLAY[playkey] = df[['GSISID', 'Time', 'x', 'y', 'dis', 'o', 'dir', 'Event']]\n\ndef get_plays():\n    data = pd.read_csv(os.path.join(NFL_DATA_DIR, 'play_information.csv'), parse_dates=['Game_Date'])\n    data.columns = [col.replace('_', '') for col in data.columns]\n    data['PlayKey'] = data['GameKey'].apply(str) + '_' + data['PlayID'].apply(str)\n    data = data.drop(['PlayID', 'PlayType'], axis=1)\n    data = data.sort_values(['GameKey', 'Quarter', 'GameClock'])\n    data['PlayType'] = 'Punt'\n    return data\n\ndef get_ngs(playkey):\n    ngs = NGS_BY_PLAY[playkey].copy()\n    ngs['t'] = (ngs.Time - ngs.Time.min()) / np.timedelta64(1, 's')\n    ngs = ngs.sort_values(by='t')\n    return ngs\n\ndef calculate_speed_and_acceleration(ngs, smoothing_factor=5):\n    speed = ngs.pivot('t', 'GSISID', 'dis') * YARD\n    speed = speed.fillna(0)\n    speed = speed.rolling(smoothing_factor).mean() * 10\n    acc = speed.clip(0, MAX_SPEED).diff(smoothing_factor) * 10. / smoothing_factor\n    return speed, acc\n\ndef collect_ngs_player_stats():\n    plays = get_plays()\n    result = []\n    for playkey in tqdm(plays.PlayKey.values):\n        try:\n            ngs = get_ngs(playkey)\n\n            speed, acc = calculate_speed_and_acceleration(ngs, SMOOTHING_FACTOR)\n            max_speed = speed.max(axis=0).reset_index().rename(columns={0: 'MaxSpeed'})\n            min_acceleration = acc.min(axis=0).reset_index().rename(columns={0: 'MinAcceleration'})\n            \n            collision_coords = pd.DataFrame([[c, acc[c].argmin()] for c in acc.columns],\n                                            columns=['GSISID', 't'])\n            collision_coords = collision_coords.merge(ngs[['GSISID', 't', 'x', 'y']],\n                                                      how='left', on=['GSISID', 't'])\n            collision_coords['x'] = collision_coords['x'] - 10\n            collision_coords.columns = ['GSISID', 'CollisionTime', 'CollisionX', 'CollisionY']\n\n            stats = pd.merge(max_speed, min_acceleration, on='GSISID')\n            stats = stats.merge(collision_coords, on='GSISID', how='left')\n            stats['PlayKey'] = playkey\n            result.append(stats)\n        except Exception as e:\n            print(e)\n    return pd.concat(result)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"4060b2176bda6fabc53cd807a55b066c77fa0b26"},"cell_type":"code","source":"player_ngs = collect_ngs_player_stats()\nprint(player_ngs.shape)\nprint(player_ngs.count())\nprint(player_ngs.nunique())\nplayer_ngs.to_csv('player_ngs.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"897104b952502cae83a3e41325fb099bb3e972ea"},"cell_type":"markdown","source":"# Injury related NGS"},{"metadata":{"trusted":true,"_uuid":"55118cef1955be47a6a092ccc0527df9e0503aed"},"cell_type":"code","source":"def get_video_review():\n    data = pd.read_csv(os.path.join(NFL_DATA_DIR, 'video_review.csv'))\n    data.columns = [col.replace('_', '') for col in data.columns]\n    data['PlayKey'] = data['GameKey'].apply(str) + '_' + data['PlayID'].apply(str)\n\n    footage = pd.read_csv(os.path.join(NFL_DATA_DIR, 'video_footage-injury.csv'))\n    footage['PlayKey'] = footage['gamekey'].apply(str) + '_' + footage['playid'].apply(str)\n\n    footage = footage.rename(columns={'PREVIEW LINK (5000K)': 'VideoLink'})\n    data = data.merge(footage[['PlayKey', 'VideoLink', 'PlayDescription']], how='left', on=['PlayKey'])\n    return data","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"7e12ae5cfb7b8f4dcc631eb44e12b1999005e8ae"},"cell_type":"code","source":"videos = get_video_review()\nfor playkey in videos.PlayKey.values:\n    try:\n        NGS_BY_PLAY[playkey].to_csv(f'ngs_{playkey}.csv', index=False)\n    except Exception as e:\n        print(e)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"65de01ddbd5ead4012eb2b64d88b4c80e20fe4b4"},"cell_type":"code","source":"end = dt.datetime.now()\nprint('Latest run {}.\\nTotal time {}s'.format(end, (end - start).seconds))","execution_count":null,"outputs":[]}],"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}