{"cells":[{"metadata":{},"cell_type":"markdown","source":"## NFL Analytics\n\n* If you are not aware of 'HOW' the game is played and role of each players in the play, I request you to get familiar first. I didn't know 'HOW', therefore I made myself familiar by looking into the following links and watching as many games as possible while commuting to office and back everyday :P. Initially that was the intention, now slowly I have started loving the game. It is an awesome sport. Hope you will fall in love too :)\n\n    https://www.youtube.com/watch?v=3t6hM5tRlfA\n\n    https://www.youtube.com/watch?v=xcG6bIChHQk\n\n    https://www.youtube.com/watch?v=zanr8sETHdQ\n\n    https://webpages.uidaho.edu/~renaes/251/HON/Student%20PPTs/Avg%20NFL%20ht%20wt.pdf [For height and weight understanding]\n    \n\n* Motivation and approach of analysis\n\nWe understand objective of any game played is to score to defeat the opponent as a team. And when we say 'as a team', this essentially means contribution of every player to the play events and synergy between the players. Particularly in this game of football each player contributes to the play by means of passing the ball, receiving the ball, rushing with the ball, intercepting the ball, dodging, tackling, defending, punting etc. and etc. At a very high level, each of these small contributions are nothing but player's movements on the field's surface (on the turf). And these movements (angular and linear) are effectively controlled using lower limbs of the body (Thigh, knee, leg, ankle, foot, toe) by exerting force on the playing surface. Therefore, turf-cleat interaction (friction and adhesion) definitely plays an important role in a player’s contribution to the game. It is also very interesting to think friction as a function of player’s body weight. A heavy player can gain higher friction on the turf therefore acts as a defensive tackle/offensive lineman in the game. On the other hand, RunningBacks are generally agile and comparatively lighter in weight with short height to make their way in between the players easily. In this game, every player just don't do everything. Each player owns a specific task (e.g. offensive linemen protect the quarterback from defensive linemen, quarterback passes the ball to running back or wide receiver etc.). This motivates me to group players by their roaster positions and do a comparative study of their play as a group.\n\nIn my analysis, I haven't tried to prove the claim \"Players playing on synthetic surface have higher risk of getting injured\". Rather, I believed in the hypothesis as true and tried to investigate further. First I have split 250 players into injured and not_injured groups. And for each group I have split them further into offensive or defensive player categories according to their roaster positions. Then, I have done a comparative analysis of injuries across injured vs. not_injured groups (for both offense and defense).\n\nComparision was done based on the following derived metrics -\n\na. Estimated acceleration/deceleration = (v2 - v1)/(t2 - t1) where v(i) is the instanteneous speed\n@ time t(i)\n\nb. Estimated acceleration/deceleration X component = Estimated acceleration/deceleration * Sin Θ\n\nc. Estimated acceleration/deceleration Y component = Estimated acceleration/deceleration * Cos Θ\n[ Θ = Direction of player movement as measured from Y axis clockwise ]\n\nd. Rate of change in twist = (twst2 - twst1)/(t2 - t1) where twst(i) is twist at time t(i)\n[ Twist = Difference between direction of player movement and player orientation at any point in time]\n \ne. Rate of change in directional motion = (Dir2 - Dir1)/(t2 - t1) where Dir(i) is direction at\ntime t(i)\n\nf. Rate of change in orientation = (o2 - o1)/(t2 - t1) where o(i) is orientation at time t(i)\n\nCo-efficient of variation (cv) also calculated to check the consistency in acceleration/deceleration, twist, directional motion and orientation.\n\n                \n\n* Appreciate other's kernels focused on 'PlayList' dataset however my initial work is in exploring player tracking data because -\n\n    a. Other's have already analysed 'Playlist' and explored relation between injury and weather, temperature, stadium type etc. Therefore, there is no point re-working on the same.\n    \n    b. I believe all players are seasoned enough playing in different conditions, environments and all non-contact injuries should happen because of 'how they play' or the force exerted by them on the turf and rate of change in the force, their body weight (not given) and height (not given). This heavily motivates my initial work.\n    \n    c. Later I'll revalidate my assumptions made in point (b) above given the time left :D.\n\n\n* Describe understanding/finding from the sample datasets\n\n        ### Tracking Data\n        1. Total 250 players tracking data available.\n        2. 105 injury tracking data available(for 100 players where 5 of the players had more than one \n        injuries). For 28 players PlayKey(specific play of the game) \n        is not available.\n\n        ### PlayList Data\n        1. Each player has fixed roaster position where they played in last two seasons. Most of the cases \n        'RosterPosition' and 'PositionGroup' are same for the players however their 'Position' in the game \n        changed in few of the plays. \n        Example : Player 36757 has 'RoasterPosition' of 'Offensive Lineman' and 'PositionGroup' of \n        'Offensive Lineman' where he played both as 'Position' Centre (C) and Guard (G).\n        Also, in the given sample they either played as offensive player or as defensive player.\n\n        ### Injured Data\n        1. Sample has injury records of 100 players (Offense : Defense = 43 : 57) and total 105 injuries.\n        Playerkey 44449, 43540, 45950, 33337, 47307 has 2 injuries.\n        2. 150 players are in the not-injured group (Offense : Defense = 71 : 79).\n\n        3. Findings - \n        A. BodyPart involved in injuries :: injured_offense vs. injured_defence - Ankle and Knee \n        injuries are higher in group injured_defense. Data sample has also got heel injuries \n        in this group. However, foot injuries are relatively high in injured_offense group.\n\n            i) Ankle injuries are significantly higher in synthetic surface for injured defense group.\n            ii) Ankle injuries are mainly happened for roaster position - defense cornerback.\n            iii) Twist (Difference between direction of player movement and player orientation at any point in time) \n                 might be useful in discriminating injured/not injured group for many roaster positions.\n\n        B. Is body part injuries(distribution) significantly different between injured_offense vs. \n        injured_defense groups ?\n        --> They are statistically similar or representing same injured population.\n\n        C. Injury distribution in various injured offense roaster positions -\n                injured_offense_Quarterback :  0\n                injured_offense_WideReceiver :  22\n                injured_offense_RunningBack :  9\n                injured_offense_TightEnd :  5\n                injured_offense_OffensiveLineman :  7\n                injured_offense_Kicker :  0\n        D. Injury distribution in various not injured offense roaster positions -\n                not_injured_offense_Quarterback :  5\n                not_injured_offense_WideReceiver :  19\n                not_injured_offense_RunningBack :  14\n                not_injured_offense_TightEnd :  4\n                not_injured_offense_OffensiveLineman :  26\n                not_injured_offense_Kicker :  3\n        E. Injury distribution in various injured defense roaster positions -\n                injured_defense_Linebacker :  22 ***\n                injured_defense_DefensiveLineman :  9\n                injured_defense_Safety :  14\n                injured_defense_Cornerback :  12\n        F. Injury distribution in various not injured defense roaster positions -\n                not_injured_defense_Linebacker :  25\n                not_injured_defense_DefensiveLineman :  21\n                not_injured_defense_Safety :  18\n                not_injured_defense_Cornerback :  15\n     \n\n(*** Only Ankle & Knee injuries and significantly higher in counts w.r.t. other positions)\n* Data Engineering \n                \n                PlayerTrackData has ~76M data points which is difficult to handle given the kernel resource. \n                I thought it is easier to move the entire set to Google Big Query and write getter functions \n                to fetch records in parts as and when required.\n                \n                PROJECT_ID : debanjan-bg\n                Dataset    : debanjan_bq_nfl_datasets\n                Table      : PlayerTrackData\n                \n \n References : \n             Cole R. Blender(University of Idaho) \n             https://webpages.uidaho.edu/~renaes/251/HON/Student%20PPTs/Avg%20NFL%20ht%20wt.pdf\n             "},{"metadata":{"trusted":true},"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nfrom matplotlib import pyplot as plt\nfrom scipy.stats import chi2_contingency\nfrom scipy.stats import chi2\n#from sklearn.preprocessing import scale\n\n%matplotlib inline\nsns.set_style(\"darkgrid\")\n#pd.set_option('display.max_rows', 1000)\n\n# Set your own project id here\nPROJECT_ID = 'debanjan-bg'\nfrom google.cloud import bigquery\nbigquery_client = bigquery.Client(project=PROJECT_ID)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"### Upload a csv\n\"\"\"filename = r'/kaggle/input/nfl-playing-surface-analytics/PlayerTrackData.csv'\ndataset_ref = bigquery_client.dataset('debanjan_bq_nfl_datasets')\ntable_ref = dataset_ref.table('PlayerTrackData')\njob_config = bigquery.LoadJobConfig()\njob_config.source_format = bigquery.SourceFormat.CSV\njob_config.autodetect = True\n\nwith open(filename, 'rb') as src_file:\n    job = bigquery_client.load_table_from_file(src_file, table_ref, job_config=job_config)\n    \njob.result()\n\"\"\"\n\n### Upload a dataframe\n\"\"\"\ndataset_ref = bigquery_client.dataset('debanjan_bq_nfl_datasets')\ntable_ref = dataset_ref.table('NotInjuredOffenseWideReceiver')\njob_config = bigquery.LoadJobConfig()\njob_config.autodetect = True\njob = bigquery_client.load_table_from_dataframe(not_injured_offense_WideReceiver_df, table_ref, job_config=job_config)\njob.result()\n\"\"\"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Function Definitions"},{"metadata":{"trusted":true},"cell_type":"code","source":"def CalculateVariousFeatures(df):\n    df.sort_values(by='time', inplace = True)\n    \n    ### Calculate Change in Instanteneous velocity\n    df['estimated_change_in_instanteneous_velocity'] = df['s'].diff(+1)\n    df['time_delta'] = df['time'].diff(+1)\n    df['estimated_acceleration'] = df['estimated_change_in_instanteneous_velocity'] / df['time_delta']\n    df['estimated_acceleration_x_component'] = df['estimated_acceleration']*np.sin(np.radians(df['dir']))\n    df['estimated_acceleration_y_component'] = df['estimated_acceleration']*np.cos(np.radians(df['dir']))\n    \n    ### Calculate deviation in dir and o\n    df['twist_dir_minus_o'] = df['dir'] - df['o']\n    df['rate_of_change_in_twist'] = df['twist_dir_minus_o'] / df['time_delta']\n    \n    ### Calculate rate of change in direction (player motion)\n    df['change_in_directional_motion'] = df['dir'].diff(+1)\n    df['rate_of_change_in_directional_motion'] = df['change_in_directional_motion'] / df['time_delta']\n    \n    ### Calculate rate of change in orientation (player facing)\n    df['change_in_orientation'] = df['o'].diff(+1)\n    df['rate_of_change_in_orientation'] = df['change_in_orientation'] / df['time_delta']\n    \n    return df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def DeriveFeatures(PlayerTrackData):\n    players = PlayerTrackData['PlayerKey'].unique()\n    tracking_data_subset=pd.DataFrame()\n    for p in players:\n        temp_df = PlayerTrackData[PlayerTrackData['PlayerKey'] == p].groupby(['PlayKey']).apply(CalculateVariousFeatures)\n        tracking_data_subset = tracking_data_subset.append(temp_df, ignore_index = True)\n    return tracking_data_subset","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def GetPlayerTrackData(fields, table_name, playerlist=None):\n\n    \n    if playerlist:\n        PLAYERLIST = tuple(playerlist)\n        query = f\"\"\" SELECT {fields}  \n             FROM `{PROJECT_ID}.debanjan_bq_nfl_datasets.{table_name}`\n             WHERE PlayerKey IN {PLAYERLIST}\n         \"\"\"\n    else:\n        query  = f\"\"\"SELECT {fields}\n             FROM `{PROJECT_ID}.debanjan_bq_nfl_datasets.{table_name}`\n          \"\"\"\n\n\n    query_job = bigquery_client.query(query)\n    return query_job.to_dataframe()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def TestChiSquare(dist1, dist2):\n\n    # contingency table\n    table = [dist1, dist2]\n    #print(table)\n    stat, p, dof, expected = chi2_contingency(table)\n    #print('dof=%d' % dof)\n    #print(expected)\n\n    alpha = 0.05\n    test_result = {'significance' : alpha,'p' : p, 'dof' : dof}\n\n    if p <= alpha:\n        test_result['outcome'] = 'Reject H0'\n        return test_result\n    else:\n        test_result['outcome'] = 'Fail to reject H0'\n        return test_result","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def CalculateCOV(PlayerTrackData):\n    #players = PlayerTrackData['PlayerKey'].unique()\n    #output = pd.DataFrame()\n    output = PlayerTrackData.groupby(['PlayerKey','PlayKey']).apply(lambda x: np.std(x) / np.mean(x))\n    #output.reset_index(drop = False, inplace = True)\n    return output        ","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"injury_data = pd.read_csv(r'/kaggle/input/nfl-playing-surface-analytics/InjuryRecord.csv')\nplaylist_data = pd.read_csv(r'/kaggle/input/nfl-playing-surface-analytics/PlayList.csv')\n#tracking_data = pd.read_csv(r'/kaggle/input/nfl-playing-surface-analytics/PlayerTrackData.csv')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Inury data understanding"},{"metadata":{"trusted":true},"cell_type":"code","source":"print('Sample has got : ' + str(len(injury_data['PlayerKey'].unique())) + ' players injury records')\nprint('Sample has got : ' +  str(injury_data.shape[0]) + ' injury records')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"##### Players with more than 1 injury"},{"metadata":{"trusted":true},"cell_type":"code","source":"temp_series = injury_data['PlayerKey'].value_counts() > 1\nplyers_with_2injuries = temp_series.index[temp_series == True]\ninjury_data[injury_data['PlayerKey'].isin(plyers_with_2injuries)].sort_values(by='PlayerKey')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Roaster Positions"},{"metadata":{"trusted":true},"cell_type":"code","source":"print('Roaster Positions : ', playlist_data['RosterPosition'].unique())","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Categorize roaster positions"},{"metadata":{"trusted":true},"cell_type":"code","source":"offensive_position = ['Quarterback', 'Wide Receiver', 'Running Back', 'Tight End', 'Offensive Lineman', 'Kicker']\ndefensive_position = ['Linebacker','Defensive Lineman', 'Safety', 'Cornerback']\nplaylist_data.loc[playlist_data['RosterPosition'].isin(offensive_position), 'RosterPositionCategory'] = 'offense'\nplaylist_data.loc[playlist_data['RosterPosition'].isin(defensive_position), 'RosterPositionCategory'] = 'defense'","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Players by RosterPositionCategory"},{"metadata":{"trusted":true},"cell_type":"code","source":"players_by_roasterpositioncategory = playlist_data[['PlayerKey', 'RosterPositionCategory']].drop_duplicates()\nplayers_by_roasterpositioncategory.reset_index(drop=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print('Breakup of offensive/defensive players in injured group :')\npd.DataFrame(players_by_roasterpositioncategory[players_by_roasterpositioncategory['PlayerKey'].isin(injury_data['PlayerKey'].unique())]\\\n             ['RosterPositionCategory'].value_counts(dropna=False))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"players_by_roasterpositioncategory = playlist_data[['PlayerKey', 'RosterPosition', 'RosterPositionCategory']].drop_duplicates()\nprint('Breakup of offensive/defensive players within not-injured group :')\npd.DataFrame(players_by_roasterpositioncategory[~players_by_roasterpositioncategory['PlayerKey'].isin(injury_data['PlayerKey'].unique())]\\\n             ['RosterPositionCategory'].value_counts(dropna=False))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Comparative study of of injuries between 4 groups"},{"metadata":{"trusted":true},"cell_type":"code","source":"injured_offense = list(players_by_roasterpositioncategory[(players_by_roasterpositioncategory['PlayerKey'].isin(injury_data['PlayerKey'].unique()))\n                                  & (players_by_roasterpositioncategory['RosterPositionCategory'] == 'offense')]['PlayerKey'])\n\ninjured_defense = list(players_by_roasterpositioncategory[(players_by_roasterpositioncategory['PlayerKey'].isin(injury_data['PlayerKey'].unique()))\n                                  & (players_by_roasterpositioncategory['RosterPositionCategory'] == 'defense')]['PlayerKey'])\n\nnot_injured_offense = list(players_by_roasterpositioncategory[(~players_by_roasterpositioncategory['PlayerKey'].isin(injury_data['PlayerKey'].unique()))\n                                  & (players_by_roasterpositioncategory['RosterPositionCategory'] == 'offense')]['PlayerKey'])\n\nnot_injured_defense = list(players_by_roasterpositioncategory[(~players_by_roasterpositioncategory['PlayerKey'].isin(injury_data['PlayerKey'].unique()))\n                                  & (players_by_roasterpositioncategory['RosterPositionCategory'] == 'defense')]['PlayerKey'])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"##### BodyPart involved in injuries :: injured_offense vs. injured_defense"},{"metadata":{"trusted":true},"cell_type":"code","source":"f,axes=plt.subplots(1,2,figsize=(18,5),sharey=True)\n\nsns.catplot(x=\"BodyPart\", kind=\"count\", palette=\"ch:.25\", hue = 'Surface',\n            data=injury_data[injury_data['PlayerKey'].isin(injured_offense)].sort_values(by='BodyPart'), ax = axes[0])\naxes[0].set_title('Number of BodyPart Injuries : Injured Offense')\n\nsns.catplot(x=\"BodyPart\", kind=\"count\", palette=\"ch:.25\", hue = 'Surface',\n            data=injury_data[injury_data['PlayerKey'].isin(injured_defense)].sort_values(by='BodyPart'), ax = axes[1])\naxes[1].set_title('Number of BodyPart Injuries : Injured Defense')\nplt.close(2)\nplt.close(3)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Is body part injuries(distribution) significantly different between injured_offense vs. injured_defense groups ?\n\nH0 : Bodypart injuries are similar between injured_offense vs. injured_defense\n\nHa : Bodypart injuries are different between injured_offense vs. injured_defense\n\nAnswer : They are statistically similar."},{"metadata":{"trusted":true},"cell_type":"code","source":"injury_data[injury_data['PlayerKey'].isin(injured_offense)]['BodyPart'].value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"injury_data[injury_data['PlayerKey'].isin(injured_defense)]['BodyPart'].value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(TestChiSquare(np.array([27, 26, 4, 2, 1]), np.array([21, 16, 5, 3, 0])))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Injury distribution for each injured offense roaster positions"},{"metadata":{"trusted":true},"cell_type":"code","source":"#offensive_position = ['Quarterback', 'Wide Receiver', 'Running Back', 'Tight End', 'Offensive Lineman', 'Kicker']\n\ninjured_offense_Quarterback = list(players_by_roasterpositioncategory[(players_by_roasterpositioncategory['PlayerKey'].isin(injury_data['PlayerKey'].unique()))\n                                  & (players_by_roasterpositioncategory['RosterPositionCategory'] == 'offense')\n                                                         & (players_by_roasterpositioncategory['RosterPosition'] == 'Quarterback')]['PlayerKey'])\n\ninjured_offense_WideReceiver = list(players_by_roasterpositioncategory[(players_by_roasterpositioncategory['PlayerKey'].isin(injury_data['PlayerKey'].unique()))\n                                  & (players_by_roasterpositioncategory['RosterPositionCategory'] == 'offense')\n                                                         & (players_by_roasterpositioncategory['RosterPosition'] == 'Wide Receiver')]['PlayerKey'])\n\ninjured_offense_RunningBack = list(players_by_roasterpositioncategory[(players_by_roasterpositioncategory['PlayerKey'].isin(injury_data['PlayerKey'].unique()))\n                                  & (players_by_roasterpositioncategory['RosterPositionCategory'] == 'offense')\n                                                         & (players_by_roasterpositioncategory['RosterPosition'] == 'Running Back')]['PlayerKey'])\n\ninjured_offense_TightEnd = list(players_by_roasterpositioncategory[(players_by_roasterpositioncategory['PlayerKey'].isin(injury_data['PlayerKey'].unique()))\n                                  & (players_by_roasterpositioncategory['RosterPositionCategory'] == 'offense')\n                                                         & (players_by_roasterpositioncategory['RosterPosition'] == 'Tight End')]['PlayerKey'])\n\ninjured_offense_OffensiveLineman = list(players_by_roasterpositioncategory[(players_by_roasterpositioncategory['PlayerKey'].isin(injury_data['PlayerKey'].unique()))\n                                  & (players_by_roasterpositioncategory['RosterPositionCategory'] == 'offense')\n                                                         & (players_by_roasterpositioncategory['RosterPosition'] == 'Offensive Lineman')]['PlayerKey'])\n\ninjured_offense_Kicker = list(players_by_roasterpositioncategory[(players_by_roasterpositioncategory['PlayerKey'].isin(injury_data['PlayerKey'].unique()))\n                                  & (players_by_roasterpositioncategory['RosterPositionCategory'] == 'offense')\n                                                         & (players_by_roasterpositioncategory['RosterPosition'] == 'Kicker')]['PlayerKey'])\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print('injured_offense_Quarterback : ', len(injured_offense_Quarterback))\nprint('injured_offense_WideReceiver : ', len(injured_offense_WideReceiver))\nprint('injured_offense_RunningBack : ', len(injured_offense_RunningBack))\nprint('injured_offense_TightEnd : ', len(injured_offense_TightEnd))\nprint('injured_offense_OffensiveLineman : ',  len(injured_offense_OffensiveLineman))\nprint('injured_offense_Kicker : ', len(injured_offense_Kicker))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"f,axes=plt.subplots(2,2,figsize=(20,10),sharey=True)\n\nsns.catplot(x=\"BodyPart\", kind=\"count\", palette=\"ch:.25\", hue = 'Surface',\n            data=injury_data[injury_data['PlayerKey'].isin(injured_offense_WideReceiver)].sort_values(by='BodyPart'), ax = axes[0,0])\naxes[0,0].set_title('Number of BodyPart Injuries : Injured Offense - Wide Receiver')\n\nsns.catplot(x=\"BodyPart\", kind=\"count\", palette=\"ch:.25\", hue = 'Surface',\n            data=injury_data[injury_data['PlayerKey'].isin(injured_offense_RunningBack)].sort_values(by='BodyPart'), ax = axes[0,1])\naxes[0,1].set_title('Number of BodyPart Injuries : Injured Offense - Running Back')\n\nsns.catplot(x=\"BodyPart\", kind=\"count\", palette=\"ch:.25\", hue = 'Surface',\n            data=injury_data[injury_data['PlayerKey'].isin(injured_offense_TightEnd)].sort_values(by='BodyPart'), ax = axes[1,0])\naxes[1,0].set_title('Number of BodyPart Injuries : Injured Offense - Tight End')\n\nsns.catplot(x=\"BodyPart\", kind=\"count\", palette=\"ch:.25\", hue = 'Surface',\n            data=injury_data[injury_data['PlayerKey'].isin(injured_offense_OffensiveLineman)].sort_values(by='BodyPart'), ax = axes[1,1])\naxes[1,1].set_title('Number of BodyPart Injuries : Injured Offense - Offensive Lineman')\n\nplt.close(2)\nplt.close(3)\nplt.close(4)\nplt.close(5)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Injury distribution for each injured defense roaster positions"},{"metadata":{"trusted":true},"cell_type":"code","source":"#defensive_position = ['Linebacker','Defensive Lineman', 'Safety', 'Cornerback']\n\ninjured_defense_Linebacker = list(players_by_roasterpositioncategory[(players_by_roasterpositioncategory['PlayerKey'].isin(injury_data['PlayerKey'].unique()))\n                                  & (players_by_roasterpositioncategory['RosterPositionCategory'] == 'defense')\n                                  & (players_by_roasterpositioncategory['RosterPosition'] == 'Linebacker')]['PlayerKey'])\n\ninjured_defense_DefensiveLineman = list(players_by_roasterpositioncategory[(players_by_roasterpositioncategory['PlayerKey'].isin(injury_data['PlayerKey'].unique()))\n                                  & (players_by_roasterpositioncategory['RosterPositionCategory'] == 'defense')\n                                  & (players_by_roasterpositioncategory['RosterPosition'] == 'Defensive Lineman')]['PlayerKey'])\n\ninjured_defense_Safety = list(players_by_roasterpositioncategory[(players_by_roasterpositioncategory['PlayerKey'].isin(injury_data['PlayerKey'].unique()))\n                                  & (players_by_roasterpositioncategory['RosterPositionCategory'] == 'defense')\n                                  & (players_by_roasterpositioncategory['RosterPosition'] == 'Safety')]['PlayerKey'])\n\ninjured_defense_Cornerback = list(players_by_roasterpositioncategory[(players_by_roasterpositioncategory['PlayerKey'].isin(injury_data['PlayerKey'].unique()))\n                                  & (players_by_roasterpositioncategory['RosterPositionCategory'] == 'defense')\n                                  & (players_by_roasterpositioncategory['RosterPosition'] == 'Cornerback')]['PlayerKey'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print('injured_defense_Linebacker : ',  len(injured_defense_Linebacker))\nprint('injured_defense_DefensiveLineman : ', len(injured_defense_DefensiveLineman))\nprint('injured_defense_Safety : ',  len(injured_defense_Safety))\nprint('injured_defense_Cornerback : ',     len(injured_defense_Cornerback))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"f,axes=plt.subplots(2,2,figsize=(20,10),sharey=True)\n\nsns.catplot(x=\"BodyPart\", kind=\"count\", palette=\"ch:.25\", hue = 'Surface',\n            data=injury_data[injury_data['PlayerKey'].isin(injured_defense_Linebacker)].sort_values(by='BodyPart'), ax = axes[0,0])\naxes[0,0].set_title('Number of BodyPart Injuries : Injured Defense - Linebacker')\n\nsns.catplot(x=\"BodyPart\", kind=\"count\", palette=\"ch:.25\", hue = 'Surface',\n            data=injury_data[injury_data['PlayerKey'].isin(injured_defense_DefensiveLineman)].sort_values(by='BodyPart'), ax = axes[0,1])\naxes[0,1].set_title('Number of BodyPart Injuries : Injured Defense - DefensiveLineman')\n\nsns.catplot(x=\"BodyPart\", kind=\"count\", palette=\"ch:.25\", hue = 'Surface',\n            data=injury_data[injury_data['PlayerKey'].isin(injured_defense_Safety )].sort_values(by='BodyPart'), ax = axes[1,0])\naxes[1,0].set_title('Number of BodyPart Injuries : Injured Defense - Safety')\n\nsns.catplot(x=\"BodyPart\", kind=\"count\", palette=\"ch:.25\", hue = 'Surface',\n            data=injury_data[injury_data['PlayerKey'].isin(injured_defense_Cornerback)].sort_values(by='BodyPart'), ax = axes[1,1])\naxes[1,1].set_title('Number of BodyPart Injuries : Injured Defense - Cornerback')\n\nplt.close(2)\nplt.close(3)\nplt.close(4)\nplt.close(5)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### number of samples : Not injured offense/defense player positions"},{"metadata":{"trusted":true},"cell_type":"code","source":"# offensive_position = ['Quarterback', 'Wide Receiver', 'Running Back', 'Tight End', 'Offensive Lineman', 'Kicker']\n\n\nnot_injured_offense_Quarterback = list(players_by_roasterpositioncategory[(~players_by_roasterpositioncategory['PlayerKey'].isin(injury_data['PlayerKey'].unique()))\n                                  & (players_by_roasterpositioncategory['RosterPositionCategory'] == 'offense')\n                                                         & (players_by_roasterpositioncategory['RosterPosition'] == 'Quarterback')]['PlayerKey'])\n\nnot_injured_offense_WideReceiver = list(players_by_roasterpositioncategory[(~players_by_roasterpositioncategory['PlayerKey'].isin(injury_data['PlayerKey'].unique()))\n                                  & (players_by_roasterpositioncategory['RosterPositionCategory'] == 'offense')\n                                                         & (players_by_roasterpositioncategory['RosterPosition'] == 'Wide Receiver')]['PlayerKey'])\n\nnot_injured_offense_RunningBack = list(players_by_roasterpositioncategory[(~players_by_roasterpositioncategory['PlayerKey'].isin(injury_data['PlayerKey'].unique()))\n                                  & (players_by_roasterpositioncategory['RosterPositionCategory'] == 'offense')\n                                                         & (players_by_roasterpositioncategory['RosterPosition'] == 'Running Back')]['PlayerKey'])\n\nnot_injured_offense_TightEnd = list(players_by_roasterpositioncategory[(~players_by_roasterpositioncategory['PlayerKey'].isin(injury_data['PlayerKey'].unique()))\n                                  & (players_by_roasterpositioncategory['RosterPositionCategory'] == 'offense')\n                                                         & (players_by_roasterpositioncategory['RosterPosition'] == 'Tight End')]['PlayerKey'])\n\nnot_injured_offense_OffensiveLineman = list(players_by_roasterpositioncategory[(~players_by_roasterpositioncategory['PlayerKey'].isin(injury_data['PlayerKey'].unique()))\n                                  & (players_by_roasterpositioncategory['RosterPositionCategory'] == 'offense')\n                                                         & (players_by_roasterpositioncategory['RosterPosition'] == 'Offensive Lineman')]['PlayerKey'])\n\nnot_injured_offense_Kicker = list(players_by_roasterpositioncategory[(~players_by_roasterpositioncategory['PlayerKey'].isin(injury_data['PlayerKey'].unique()))\n                                  & (players_by_roasterpositioncategory['RosterPositionCategory'] == 'offense')\n                                                         & (players_by_roasterpositioncategory['RosterPosition'] == 'Kicker')]['PlayerKey'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print('not_injured_offense_Quarterback : ', len(not_injured_offense_Quarterback))\nprint('not_injured_offense_WideReceiver : ', len(not_injured_offense_WideReceiver))\nprint('not_injured_offense_RunningBack : ', len(not_injured_offense_RunningBack))\nprint('not_injured_offense_TightEnd : ', len(not_injured_offense_TightEnd))\nprint('not_injured_offense_OffensiveLineman : ',  len(not_injured_offense_OffensiveLineman))\nprint('not_injured_offense_Kicker : ', len(not_injured_offense_Kicker))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#defensive_position = ['Linebacker','Defensive Lineman', 'Safety', 'Cornerback']\n\nnot_injured_defense_Linebacker = list(players_by_roasterpositioncategory[(~players_by_roasterpositioncategory['PlayerKey'].isin(injury_data['PlayerKey'].unique()))\n                                  & (players_by_roasterpositioncategory['RosterPositionCategory'] == 'defense')\n                                  & (players_by_roasterpositioncategory['RosterPosition'] == 'Linebacker')]['PlayerKey'])\n\nnot_injured_defense_DefensiveLineman = list(players_by_roasterpositioncategory[(~players_by_roasterpositioncategory['PlayerKey'].isin(injury_data['PlayerKey'].unique()))\n                                  & (players_by_roasterpositioncategory['RosterPositionCategory'] == 'defense')\n                                  & (players_by_roasterpositioncategory['RosterPosition'] == 'Defensive Lineman')]['PlayerKey'])\n\nnot_injured_defense_Safety = list(players_by_roasterpositioncategory[(~players_by_roasterpositioncategory['PlayerKey'].isin(injury_data['PlayerKey'].unique()))\n                                  & (players_by_roasterpositioncategory['RosterPositionCategory'] == 'defense')\n                                  & (players_by_roasterpositioncategory['RosterPosition'] == 'Safety')]['PlayerKey'])\n\nnot_injured_defense_Cornerback = list(players_by_roasterpositioncategory[(~players_by_roasterpositioncategory['PlayerKey'].isin(injury_data['PlayerKey'].unique()))\n                                  & (players_by_roasterpositioncategory['RosterPositionCategory'] == 'defense')\n                                  & (players_by_roasterpositioncategory['RosterPosition'] == 'Cornerback')]['PlayerKey'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print('not_injured_defense_Linebacker : ', len(not_injured_defense_Linebacker))\nprint('not_injured_defense_DefensiveLineman : ', len(not_injured_defense_DefensiveLineman))\nprint('not_injured_defense_Safety : ', len(not_injured_defense_Safety))\nprint('not_injured_defense_Cornerback : ', len(not_injured_defense_Cornerback))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"groups = {\n                'player_group' : {\n                                    'injured_offense_Quarterback' : injured_offense_Quarterback,\n                                    'injured_offense_WideReceiver' : injured_offense_WideReceiver,\n                                    'injured_offense_RunningBack' : injured_offense_RunningBack,\n                                    'injured_offense_TightEnd' : injured_offense_TightEnd,\n                                    'injured_offense_OffensiveLineman' : injured_offense_OffensiveLineman,\n                                    'injured_offense_Kicker' : injured_offense_Kicker,\n                    \n                                    'injured_defense_Linebacker' : injured_defense_Linebacker,\n                                    'injured_defense_DefensiveLineman' : injured_defense_DefensiveLineman,\n                                    'injured_defense_Safety' : injured_defense_Safety,\n                                    'injured_defense_Cornerback' : injured_defense_Cornerback,\n                    \n                                    'not_injured_offense_Quarterback' : not_injured_offense_Quarterback,\n                                    'not_injured_offense_WideReceiver' : not_injured_offense_WideReceiver,\n                                    'not_injured_offense_RunningBack' : not_injured_offense_RunningBack,\n                                    'not_injured_offense_TightEnd' :  not_injured_offense_TightEnd,\n                                    'not_injured_offense_OffensiveLineman' : not_injured_offense_OffensiveLineman,\n                                    'not_injured_offense_Kicker' : not_injured_offense_Kicker,\n                    \n                                    'not_injured_defense_Linebacker' : not_injured_defense_Linebacker,\n                                    'not_injured_defense_DefensiveLineman' : not_injured_defense_DefensiveLineman,\n                                    'not_injured_defense_Safety' : not_injured_defense_Safety,\n                                    'not_injured_defense_Cornerback' : not_injured_defense_Cornerback\n                                    \n                },\n                'player_group_df' : {\n                                    'injured_offense_Quarterback_df' : pd.DataFrame(),\n                                    'injured_offense_WideReceiver_df' : pd.DataFrame(),\n                                    'injured_offense_RunningBack_df' : pd.DataFrame(),\n                                    'injured_offense_TightEnd_df' : pd.DataFrame(),\n                                    'injured_offense_OffensiveLineman_df' : pd.DataFrame(),\n                                    'injured_offense_Kicker_df' : pd.DataFrame(),\n                    \n                                    'injured_defense_Linebacker_df' : pd.DataFrame(),\n                                    'injured_defense_DefensiveLineman_df' : pd.DataFrame(),\n                                    'injured_defense_Safety_df' : pd.DataFrame(),\n                                    'injured_defense_Cornerback_df' : pd.DataFrame(),\n                    \n                                    'not_injured_offense_Quarterback_df' : pd.DataFrame(),\n                                    'not_injured_offense_WideReceiver_df' : pd.DataFrame(),\n                                    'not_injured_offense_RunningBack_df' : pd.DataFrame(),\n                                    'not_injured_offense_TightEnd_df' :  pd.DataFrame(),\n                                    'not_injured_offense_OffensiveLineman_df' : pd.DataFrame(),\n                                    'not_injured_offense_Kicker_df' : pd.DataFrame(),\n                    \n                                    'not_injured_defense_Linebacker_df' : pd.DataFrame(),\n                                    'not_injured_defense_DefensiveLineman_df' : pd.DataFrame(),\n                                    'not_injured_defense_Safety_df' : pd.DataFrame(),\n                                    'not_injured_defense_Cornerback_df' : pd.DataFrame()\n                },\n                'player_group_cv' : {\n                                    'injured_offense_Quarterback_cv' : pd.DataFrame(),\n                                    'injured_offense_WideReceiver_cv' : pd.DataFrame(),\n                                    'injured_offense_RunningBack_cv' : pd.DataFrame(),\n                                    'injured_offense_TightEnd_cv' : pd.DataFrame(),\n                                    'injured_offense_OffensiveLineman_cv' : pd.DataFrame(),\n                                    'injured_offense_Kicker_cv' : pd.DataFrame(),\n                    \n                                    'injured_defense_Linebacker_cv' : pd.DataFrame(),\n                                    'injured_defense_DefensiveLineman_cv' : pd.DataFrame(),\n                                    'injured_defense_Safety_cv' : pd.DataFrame(),\n                                    'injured_defense_Cornerback_cv' : pd.DataFrame(),\n                    \n                                    'not_injured_offense_Quarterback_cv' : pd.DataFrame(),\n                                    'not_injured_offense_WideReceiver_cv' : pd.DataFrame(),\n                                    'not_injured_offense_RunningBack_cv' : pd.DataFrame(),\n                                    'not_injured_offense_TightEnd_cv' :  pd.DataFrame(),\n                                    'not_injured_offense_OffensiveLineman_cv' : pd.DataFrame(),\n                                    'not_injured_offense_Kicker_cv' : pd.DataFrame(),\n                    \n                                    'not_injured_defense_Linebacker_cv' : pd.DataFrame(),\n                                    'not_injured_defense_DefensiveLineman_cv' : pd.DataFrame(),\n                                    'not_injured_defense_Safety_cv' : pd.DataFrame(),\n                                    'not_injured_defense_Cornerback_cv' : pd.DataFrame()\n                }\n}","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.catplot(x=\"BodyPart\", kind=\"count\", palette=\"ch:.25\", hue = 'Surface',\n            data=injury_data[injury_data['BodyPart'].isin(['Toes', 'Foot'])])\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"### Get data from PlayerTrackData table\n\nbgq = True\n\ninjured_player_group_name = 'injured_offense_WideReceiver'\nnot_injured_player_group_name = 'not_injured_offense_WideReceiver'\nnumber_of_players = 2 ### Higher number will lead to longer processing time.\n\nif bgq:\n    groups['player_group_df'][injured_player_group_name + '_df'] = DeriveFeatures(GetPlayerTrackData('PlayKey, PlayerKey, time, event, dir, s, o, dis', \n                                                                      'PlayerTrackData', groups['player_group'][injured_player_group_name][0:number_of_players]))\n    groups['player_group_df'][not_injured_player_group_name + '_df'] = DeriveFeatures(GetPlayerTrackData('PlayKey, PlayerKey, time, event, dir, s, o, dis', \n                                                                          'PlayerTrackData', groups['player_group'][not_injured_player_group_name][0:number_of_players]))\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Comparision of derived features"},{"metadata":{"trusted":true},"cell_type":"code","source":"groups['player_group_df'][not_injured_player_group_name + '_df'][['estimated_acceleration_x_component',\n                                                                  'estimated_acceleration_y_component', \n                                                                  'rate_of_change_in_twist', \n                                                                  'rate_of_change_in_directional_motion',\n                                                                  'rate_of_change_in_orientation']].replace(0, np.NaN).mean()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"groups['player_group_df'][injured_player_group_name + '_df'][['estimated_acceleration_x_component',\n                                                                  'estimated_acceleration_y_component', \n                                                                  'rate_of_change_in_twist', \n                                                                  'rate_of_change_in_directional_motion',\n                                                                  'rate_of_change_in_orientation']].replace(0, np.NaN).mean()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from scipy.stats import ttest_ind\n\n\nttest_ind(groups['player_group_df'][injured_player_group_name + '_df']['rate_of_change_in_twist'].dropna(),\n          groups['player_group_df'][not_injured_player_group_name + '_df']['rate_of_change_in_twist'].dropna(), equal_var=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"f,axes=plt.subplots(2,5,figsize=(24,10),sharey=False)\nbins = 100\nkde = True\n\n############## Not Injured Group ##############\nsns.distplot(groups['player_group_df'][not_injured_player_group_name + '_df'][groups['player_group_df'][not_injured_player_group_name + '_df']['estimated_acceleration_x_component']\n                                                 .between(-100,100)]['estimated_acceleration_x_component'],\n                                                 bins = bins,\n                                                 kde = kde,\n                                                 ax = axes[0,0])\naxes[0,0].set_title(not_injured_player_group_name)\n\nsns.distplot(groups['player_group_df'][not_injured_player_group_name + '_df'][groups['player_group_df'][not_injured_player_group_name + '_df']['estimated_acceleration_y_component']\n                                                 .between(-100,100)]['estimated_acceleration_y_component'],\n                                                 bins = bins,\n                                                 kde = kde,\n                                                 ax = axes[0,1])\naxes[0,1].set_title(not_injured_player_group_name)\n\nsns.distplot(groups['player_group_df'][not_injured_player_group_name + '_df'][groups['player_group_df'][not_injured_player_group_name + '_df']['rate_of_change_in_twist']\n                                                 .between(-50,50)]['rate_of_change_in_twist'],\n                                                 bins = bins,\n                                                 kde = kde,\n                                                 ax = axes[0,2])\naxes[0,2].set_title(not_injured_player_group_name)\n\nsns.distplot(groups['player_group_df'][not_injured_player_group_name + '_df'][groups['player_group_df'][not_injured_player_group_name + '_df']['rate_of_change_in_directional_motion']\n                                                 .between(-300,300)]['rate_of_change_in_directional_motion'],\n                                                 bins = bins,\n                                                 kde = kde,\n                                                 ax = axes[0,3])\naxes[0,3].set_title(not_injured_player_group_name)\n\nsns.distplot(groups['player_group_df'][not_injured_player_group_name + '_df'][groups['player_group_df'][not_injured_player_group_name + '_df']['rate_of_change_in_orientation']\n                                                 .between(-300,300)]['rate_of_change_in_orientation'],\n                                                 bins = bins,\n                                                 kde = kde,\n                                                 ax = axes[0,4])\naxes[0,4].set_title(not_injured_player_group_name)\n\n\n\n############## Injured Group ##############\nsns.distplot(groups['player_group_df'][injured_player_group_name + '_df'][groups['player_group_df'][injured_player_group_name + '_df']['estimated_acceleration_x_component']\n                                                 .between(-100,100)]['estimated_acceleration_x_component'],\n                                                 bins = bins,\n                                                 kde = kde,\n                                                 ax = axes[1,0])\naxes[1,0].set_title(injured_player_group_name)\n\nsns.distplot(groups['player_group_df'][injured_player_group_name + '_df'][groups['player_group_df'][injured_player_group_name + '_df']['estimated_acceleration_y_component']\n                                                 .between(-100,100)]['estimated_acceleration_y_component'],\n                                                 bins = bins,\n                                                 kde = kde,\n                                                 ax = axes[1,1])\naxes[1,1].set_title(injured_player_group_name)\n\nsns.distplot(groups['player_group_df'][injured_player_group_name + '_df'][groups['player_group_df'][injured_player_group_name + '_df']['rate_of_change_in_twist']\n                                                 .between(-50,50)]['rate_of_change_in_twist'],\n                                                 bins = bins,\n                                                 kde = kde,\n                                                 ax = axes[1,2])\naxes[1,2].set_title(injured_player_group_name)\n\nsns.distplot(groups['player_group_df'][injured_player_group_name + '_df'][groups['player_group_df'][injured_player_group_name + '_df']['rate_of_change_in_directional_motion']\n                                                 .between(-300,300)]['rate_of_change_in_directional_motion'],\n                                                 bins = bins,\n                                                 kde = kde,\n                                                 ax = axes[1,3])\naxes[1,3].set_title(injured_player_group_name)\n\nsns.distplot(groups['player_group_df'][injured_player_group_name + '_df'][groups['player_group_df'][injured_player_group_name + '_df']['rate_of_change_in_orientation']\n                                                 .between(-300,300)]['rate_of_change_in_orientation'],\n                                                 bins = bins,\n                                                 kde = kde,\n                                                 ax = axes[1,4])\naxes[1,4].set_title(injured_player_group_name)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Comparision of co-efficient of variance"},{"metadata":{"trusted":true},"cell_type":"code","source":"groups['player_group_cv'][injured_player_group_name + '_cv'] = CalculateCOV(groups['player_group_df'][injured_player_group_name + '_df'][[  'PlayKey', \n                                                                          'PlayerKey', \n                                                                          'estimated_acceleration_x_component',\n                                                                          'estimated_acceleration_y_component', \n                                                                          'rate_of_change_in_twist', \n                                                                          'rate_of_change_in_directional_motion',\n                                                                          'rate_of_change_in_orientation']])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"groups['player_group_cv'][not_injured_player_group_name + '_cv'] = CalculateCOV(groups['player_group_df'][not_injured_player_group_name + '_df'][['PlayKey', \n                                                                              'PlayerKey', \n                                                                              'estimated_acceleration_x_component',\n                                                                              'estimated_acceleration_y_component', \n                                                                              'rate_of_change_in_twist', \n                                                                              'rate_of_change_in_directional_motion',\n                                                                              'rate_of_change_in_orientation']])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"f,axes=plt.subplots(2,5,figsize=(24,10),sharey=False)\nbins = 100\nkde = True\n\n############## Not Injured Group ##############\nsns.distplot(groups['player_group_cv'][not_injured_player_group_name + '_cv'][groups['player_group_cv'][not_injured_player_group_name + '_cv']['estimated_acceleration_x_component']\n                                                 .between(-100,100)]['estimated_acceleration_x_component'],\n                                                 bins = bins,\n                                                 kde = kde,\n                                                 ax = axes[0,0])\naxes[0,0].set_title(not_injured_player_group_name)\n\nsns.distplot(groups['player_group_cv'][not_injured_player_group_name + '_cv'][groups['player_group_cv'][not_injured_player_group_name + '_cv']['estimated_acceleration_y_component']\n                                                 .between(-100,100)]['estimated_acceleration_y_component'],\n                                                 bins = bins,\n                                                 kde = kde,\n                                                 ax = axes[0,1])\naxes[0,1].set_title(not_injured_player_group_name)\n\nsns.distplot(groups['player_group_cv'][not_injured_player_group_name + '_cv'][groups['player_group_cv'][not_injured_player_group_name + '_cv']['rate_of_change_in_twist']\n                                                 .between(-50,50)]['rate_of_change_in_twist'],\n                                                 bins = bins,\n                                                 kde = kde,\n                                                 ax = axes[0,2])\naxes[0,2].set_title(not_injured_player_group_name)\n\nsns.distplot(groups['player_group_cv'][not_injured_player_group_name + '_cv'][groups['player_group_cv'][not_injured_player_group_name + '_cv']['rate_of_change_in_directional_motion']\n                                                 .between(-300,300)]['rate_of_change_in_directional_motion'],\n                                                 bins = bins,\n                                                 kde = kde,\n                                                 ax = axes[0,3])\naxes[0,3].set_title(not_injured_player_group_name)\n\nsns.distplot(groups['player_group_cv'][not_injured_player_group_name + '_cv'][groups['player_group_cv'][not_injured_player_group_name + '_cv']['rate_of_change_in_orientation']\n                                                 .between(-300,300)]['rate_of_change_in_orientation'],\n                                                 bins = bins,\n                                                 kde = kde,\n                                                 ax = axes[0,4])\naxes[0,4].set_title(not_injured_player_group_name)\n\n\n\n############## Injured Group ##############\nsns.distplot(groups['player_group_cv'][injured_player_group_name + '_cv'][groups['player_group_cv'][injured_player_group_name + '_cv']['estimated_acceleration_x_component']\n                                                 .between(-100,100)]['estimated_acceleration_x_component'],\n                                                 bins = bins,\n                                                 kde = kde,\n                                                 ax = axes[1,0])\naxes[1,0].set_title(injured_player_group_name)\n\nsns.distplot(groups['player_group_cv'][injured_player_group_name + '_cv'][groups['player_group_cv'][injured_player_group_name + '_cv']['estimated_acceleration_y_component']\n                                                 .between(-100,100)]['estimated_acceleration_y_component'],\n                                                 bins = bins,\n                                                 kde = kde,\n                                                 ax = axes[1,1])\naxes[1,1].set_title(injured_player_group_name)\n\nsns.distplot(groups['player_group_cv'][injured_player_group_name + '_cv'][groups['player_group_cv'][injured_player_group_name + '_cv']['rate_of_change_in_twist']\n                                                 .between(-50,50)]['rate_of_change_in_twist'],\n                                                 bins = bins,\n                                                 kde = kde,\n                                                 ax = axes[1,2])\naxes[1,2].set_title(injured_player_group_name)\n\nsns.distplot(groups['player_group_cv'][injured_player_group_name + '_cv'][groups['player_group_cv'][injured_player_group_name + '_cv']['rate_of_change_in_directional_motion']\n                                                 .between(-300,300)]['rate_of_change_in_directional_motion'],\n                                                 bins = bins,\n                                                 kde = kde,\n                                                 ax = axes[1,3])\naxes[1,3].set_title(injured_player_group_name)\n\nsns.distplot(groups['player_group_cv'][injured_player_group_name + '_cv'][groups['player_group_cv'][injured_player_group_name + '_cv']['rate_of_change_in_orientation']\n                                                 .between(-300,300)]['rate_of_change_in_orientation'],\n                                                 bins = bins,\n                                                 kde = kde,\n                                                 ax = axes[1,4])\naxes[1,4].set_title(injured_player_group_name)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Visualize a play"},{"metadata":{"trusted":true},"cell_type":"code","source":"injured_player_group_name = 'injured_defense_Cornerback'\ntemp_df = groups['player_group_df'][injured_player_group_name + '_df'][groups['player_group_df'][injured_player_group_name + '_df']['PlayKey'] == '36559-1-1']\n#temp_df = not_injured_defense_Linebacker_df[not_injured_defense_Linebacker_df['PlayKey'] == '30953-1-1']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"f,axes=plt.subplots(3,1,figsize=(24,14),sharex=True)\n\naxes[0].plot(temp_df['time'], temp_df['estimated_acceleration_x_component'].fillna(0))\nfor evnt in temp_df['event']:\n    try:\n        axes[0].axvline(x=temp_df[temp_df['event'] == evnt]['time'].values[0], color = 'r')\n        axes[0].text(temp_df[temp_df['event'] == evnt]['time'].values[0]+0.11,0,evnt, rotation=90)\n        axes[0].set_ylabel('estimated_acceleration_x_component')\n        axes[0].set_xlabel('Time')\n    except:\n        pass\n    \naxes[1].plot(temp_df['time'], temp_df['estimated_acceleration_y_component'].fillna(0))\nfor evnt in temp_df['event']:\n    try:\n        axes[1].axvline(x=temp_df[temp_df['event'] == evnt]['time'].values[0], color = 'r')\n        axes[1].text(temp_df[temp_df['event'] == evnt]['time'].values[0]+0.11,0,evnt, rotation=90)\n        axes[1].set_ylabel('estimated_acceleration_y_component')\n        axes[1].set_xlabel('Time')\n    except:\n        pass\n\naxes[2].plot(temp_df['time'], temp_df['twist_dir_minus_o'].fillna(0))\nfor evnt in temp_df['event']:\n    try:\n        axes[2].axvline(x=temp_df[temp_df['event'] == evnt]['time'].values[0], color = 'r')\n        axes[2].text(temp_df[temp_df['event'] == evnt]['time'].values[0]+0.11,0,evnt, rotation=90)\n        axes[2].set_ylabel('Difference between direction of motion and player orientation')\n        axes[2].set_xlabel('Time')\n    except:\n        pass\n","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}