Notebook first written: 10/11/2020
Notebook last updated: 18/02/2021
Click here to jump straight to the Exploratory Data Analysis section and skip the Task Brief, Data Sources, and Data Engineering sections. Or click here to jump straight to the Conclusion.
This notebook parses pubicly available StatsBomb Event data, using pandas for data manipulation through DataFrames.
For more information about this notebook and the author, I'm available through all the following channels:
The accompanying GitHub repository for this notebook can be found here and a static version of this notebook can be found here.
This notebook was written using Python 3 and requires the following libraries:
Jupyter notebooks
for this notebook environment with which this project is presented;NumPy
for multidimensional array computing;pandas
for data analysis and manipulation; andtqdm
for a clean progress bar;All packages used for this notebook except for BeautifulSoup can be obtained by downloading and installing the Conda distribution, available on all platforms (Windows, Linux and Mac OSX). Step-by-step guides on how to install Anaconda can be found for Windows here and Mac here, as well as in the Anaconda documentation itself here.
%load_ext autoreload
%autoreload 2
# Python ≥3.5 (ideally)
import platform
import sys, getopt
assert sys.version_info >= (3, 5)
import csv
# Import Dependencies
%matplotlib inline
# Math Operations
import numpy as np
from math import pi
# Datetime
import datetime
from datetime import date
import time
# Data Preprocessing
import pandas as pd # version 1.0.3
import os # used to read the csv filenames
import re
import random
from io import BytesIO
from pathlib import Path
# Reading directories
import glob
import os
# Working with JSON
import json
import codecs
from pandas.io.json import json_normalize
# Football Libraries
from FCPython import createPitch
# Data Visualisation
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
plt.style.use('seaborn-whitegrid')
import missingno as msno # visually display missing data
# Progress Bar
from tqdm import tqdm # a clean progress bar library
# Display in Jupyter
from IPython.display import Image, Video, YouTubeVideo
from IPython.core.display import HTML
# Ignore Warnings
import warnings
warnings.filterwarnings(action="ignore", message="^internal gelsd")
print('Setup Complete')
Setup Complete
# Python / module versions used here for reference
print('Python: {}'.format(platform.python_version()))
print('NumPy: {}'.format(np.__version__))
print('pandas: {}'.format(pd.__version__))
print('matplotlib: {}'.format(mpl.__version__))
print('Seaborn: {}'.format(sns.__version__))
Python: 3.7.6 NumPy: 1.18.0 pandas: 1.2.0 matplotlib: 3.3.2 Seaborn: 0.11.1
# Define today's date
today = datetime.datetime.now().strftime('%d/%m/%Y').replace('/', '')
# Set up initial paths to subfolders
base_dir = os.path.join('..', '..')
data_dir = os.path.join(base_dir, 'data')
data_dir_sb = os.path.join(base_dir, 'data', 'sb')
scripts_dir = os.path.join(base_dir, 'scripts')
scripts_dir_sb = os.path.join(base_dir, 'scripts', 'sb')
data_dir_understat = os.path.join(base_dir, 'data', 'understat')
img_dir = os.path.join(base_dir, 'img')
fig_dir = os.path.join(base_dir, 'img', 'fig')
video_dir = os.path.join(base_dir, 'video')
# Define custom function to read JSON files that also handles the encoding of special characters e.g. accents in names of players and teams
def read_json_file(filename):
with open(filename, 'rb') as json_file:
return BytesIO(json_file.read()).getvalue().decode('unicode_escape')
# Define custom function to flatten pandas DataFrames with nested JSON columns. Source: https://stackoverflow.com/questions/39899005/how-to-flatten-a-pandas-dataframe-with-some-columns-as-json
def flatten_nested_json_df(df):
df = df.reset_index()
print(f"original shape: {df.shape}")
print(f"original columns: {df.columns}")
# search for columns to explode/flatten
s = (df.applymap(type) == list).all()
list_columns = s[s].index.tolist()
s = (df.applymap(type) == dict).all()
dict_columns = s[s].index.tolist()
print(f"lists: {list_columns}, dicts: {dict_columns}")
while len(list_columns) > 0 or len(dict_columns) > 0:
new_columns = []
for col in dict_columns:
print(f"flattening: {col}")
# explode dictionaries horizontally, adding new columns
horiz_exploded = pd.json_normalize(df[col]).add_prefix(f'{col}.')
horiz_exploded.index = df.index
df = pd.concat([df, horiz_exploded], axis=1).drop(columns=[col])
new_columns.extend(horiz_exploded.columns) # inplace
for col in list_columns:
print(f"exploding: {col}")
# explode lists vertically, adding new columns
df = df.drop(columns=[col]).join(df[col].explode().to_frame())
new_columns.append(col)
# check if there are still dict o list fields to flatten
s = (df[new_columns].applymap(type) == list).all()
list_columns = s[s].index.tolist()
s = (df[new_columns].applymap(type) == dict).all()
dict_columns = s[s].index.tolist()
print(f"lists: {list_columns}, dicts: {dict_columns}")
print(f"final shape: {df.shape}")
print(f"final columns: {df.columns}")
return df
pd.set_option('display.max_columns', None)
This Jupyter notebook explores how to parse publicly available Event data from StatsBomb using pandas for data manipulation through DataFrames.
The combined event data roduced in this notebook is exported to CSV. This data can be further analysed in Python, joined to other datasets, or explored using Tableau, PowerBI, Microsoft Excel.
Notebook Conventions:
DataFrame
object are prefixed with df_
.DataFrame
objects (e.g., a list, a set or a dict) are prefixed with dfs_
.StatsBomb are a football analytics and data company.
Before conducting our EDA, the data needs to be imported as a DataFrame in the Data Sources section Section 3 and Cleaned in the Data Engineering section Section 4.
We'll be using the pandas library to import our data to this workbook as a DataFrame.
The complete data set contains:
The datasets we will be using are:
The data needs to be imported as a DataFrame in the Data Sources section Section 3 and cleaned in the Data Engineering section Section 4.
# Show files in directory
print(glob.glob(os.path.join(data_dir_sb, 'combined', 'raw', 'csv')))
['../../data/sb/combined/raw/csv']
# Read CSV file as a pandas DataFrame
df_sb = pd.read_csv(os.path.join(data_dir_sb, 'combined', 'raw', 'csv', 'combined.csv'))
/opt/anaconda3/lib/python3.7/site-packages/IPython/core/interactiveshell.py:3147: DtypeWarning: Columns (18,40,42,50,51,53,54,77,78,79,80,81,84,85,86,87,89,91,93,96,97,98,99,100,101,102,103,104,106,107,108,109,110,111,112,113,114,116,118,120,121,122,123,125,127,128,129,130,131,132,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,159,160,165,169,170,176,177,190) have mixed types.Specify dtype option on import or set low_memory=False. interactivity=interactivity, compiler=compiler, result=result)
# Display the first 5 rows of the raw DataFrame, df_sb
df_sb.head()
level_0 | id | index_x | period | timestamp | minute | second | possession | duration | type_id | type_name | possession_team_id | possession_team_name | play_pattern_id | play_pattern_name | team_id | team_name | tactics_formation | tactics_lineup | related_events | location | player_id | player_name | position_id | position_name | pass_recipient_id | pass_recipient_name | pass_length | pass_angle | pass_height_id | pass_height_name | pass_end_location | pass_type_id | pass_type_name | pass_body_part_id | pass_body_part_name | carry_end_location | pass_outcome_id | pass_outcome_name | under_pressure | clearance_head | clearance_body_part_id | clearance_body_part_name | counterpress | duel_outcome_id | duel_outcome_name | duel_type_id | duel_type_name | ball_receipt_outcome_id | ball_receipt_outcome_name | out | clearance_left_foot | pass_switch | off_camera | clearance_aerial_won | dribble_outcome_id | dribble_outcome_name | pass_cross | pass_assisted_shot_id | pass_shot_assist | shot_statsbomb_xg | shot_end_location | shot_key_pass_id | shot_body_part_id | shot_body_part_name | shot_technique_id | shot_technique_name | shot_outcome_id | shot_outcome_name | shot_type_id | shot_type_name | shot_freeze_frame | goalkeeper_end_location | goalkeeper_type_id | goalkeeper_type_name | goalkeeper_position_id | goalkeeper_position_name | ball_recovery_recovery_failure | foul_committed_advantage | foul_won_advantage | dribble_overrun | clearance_right_foot | interception_outcome_id | interception_outcome_name | foul_won_defensive | pass_aerial_won | pass_deflected | pass_inswinging | pass_technique_id | pass_technique_name | goalkeeper_body_part_id | goalkeeper_body_part_name | goalkeeper_technique_id | goalkeeper_technique_name | goalkeeper_outcome_id | goalkeeper_outcome_name | pass_outswinging | pass_goal_assist | shot_one_on_one | miscontrol_aerial_won | shot_deflected | block_deflection | shot_first_time | block_offensive | pass_through_ball | foul_committed_card_id | foul_committed_card_name | foul_committed_penalty | foul_won_penalty | dribble_nutmeg | pass_miscommunication | pass_no_touch | foul_committed_offensive | goalkeeper_lost_out | pass_straight | substitution_outcome_id | substitution_outcome_name | substitution_replacement_id | substitution_replacement_name | match_id | goalkeeper_punched_out | shot_aerial_won | pass_cut_back | goalkeeper_success_in_play | 50_50_outcome_id | 50_50_outcome_name | foul_committed_type_id | foul_committed_type_name | ball_recovery_offensive | shot_saved_off_target | goalkeeper_shot_saved_off_target | shot_open_goal | dribble_no_touch | bad_behaviour_card_id | bad_behaviour_card_name | half_start_late_video_start | block_save_block | shot_follows_dribble | clearance_other | goalkeeper_shot_saved_to_post | shot_redirect | injury_stoppage_in_chain | shot_saved_to_post | goalkeeper_success_out | goalkeeper_lost_in_play | half_end_early_video_end | player_off_permanent | goalkeeper_saved_to_post | pass_backheel | shot_kick_off | goalkeeper_penalty_saved_to_post | index_y | match_date | kick_off | home_score | away_score | match_status | last_updated | match_week | referee | stadium | competition_competition_id | competition_country_name | competition_competition_name | season_season_id | season_season_name | home_team_home_team_id | home_team_home_team_name | home_team_home_team_gender | home_team_home_team_group | home_team_managers | home_team_country_id | home_team_country_name | away_team_away_team_id | away_team_away_team_name | away_team_away_team_gender | away_team_away_team_group | away_team_managers | away_team_country_id | away_team_country_name | metadata_data_version | metadata_shot_fidelity_version | metadata_xy_fidelity_version | competition_stage_id | competition_stage_name | competition_id | season_id | country_name | competition_name | competition_gender | season_name | match_updated | match_available | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 41e0ff39-da7c-451a-8f08-82d3a9b369f2 | 1 | 1 | 00:00:00.000 | 0 | 0 | 1 | 0.000000 | 35 | Starting XI | 1 | Arsenal | 1 | Regular Play | 1 | Arsenal | 442.0 | [{'player': {'id': 20015, 'name': 'Jens Lehman... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3749257 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0 | 2004-05-15 | 16:00:00.000 | 2 | 1 | available | 2020-08-30T08:12:14.579037 | 38 | {'id': 1279, 'name': 'None'} | NaN | 2 | England | Premier League | 44 | 2003/2004 | 1 | Arsenal | male | NaN | [{'id': 577, 'name': 'Arsène Wenger', 'nicknam... | 68 | England | 22 | Leicester City | male | NaN | [{'id': 2974, 'name': 'Micky Adams', 'nickname... | 68 | England | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 2 | 44 | England | Premier League | male | 2003/2004 | 2020-08-31T20:40:28.969635 | 2020-08-31T20:40:28.969635 |
1 | 1 | d8c32d32-494b-4ae1-bb0c-d2f738952e3c | 2 | 1 | 00:00:00.000 | 0 | 0 | 1 | 0.000000 | 35 | Starting XI | 1 | Arsenal | 1 | Regular Play | 22 | Leicester City | 442.0 | [{'player': {'id': 40236, 'name': 'Ian Walker'... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3749257 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0 | 2004-05-15 | 16:00:00.000 | 2 | 1 | available | 2020-08-30T08:12:14.579037 | 38 | {'id': 1279, 'name': 'None'} | NaN | 2 | England | Premier League | 44 | 2003/2004 | 1 | Arsenal | male | NaN | [{'id': 577, 'name': 'Arsène Wenger', 'nicknam... | 68 | England | 22 | Leicester City | male | NaN | [{'id': 2974, 'name': 'Micky Adams', 'nickname... | 68 | England | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 2 | 44 | England | Premier League | male | 2003/2004 | 2020-08-31T20:40:28.969635 | 2020-08-31T20:40:28.969635 |
2 | 2 | 6e678cba-67c3-4e9a-acca-78ab69b7d68b | 3 | 1 | 00:00:00.000 | 0 | 0 | 1 | 0.000000 | 18 | Half Start | 1 | Arsenal | 1 | Regular Play | 1 | Arsenal | NaN | NaN | ['b31e69b0-a75e-4721-b023-c06094ddcfa0'] | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3749257 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0 | 2004-05-15 | 16:00:00.000 | 2 | 1 | available | 2020-08-30T08:12:14.579037 | 38 | {'id': 1279, 'name': 'None'} | NaN | 2 | England | Premier League | 44 | 2003/2004 | 1 | Arsenal | male | NaN | [{'id': 577, 'name': 'Arsène Wenger', 'nicknam... | 68 | England | 22 | Leicester City | male | NaN | [{'id': 2974, 'name': 'Micky Adams', 'nickname... | 68 | England | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 2 | 44 | England | Premier League | male | 2003/2004 | 2020-08-31T20:40:28.969635 | 2020-08-31T20:40:28.969635 |
3 | 3 | b31e69b0-a75e-4721-b023-c06094ddcfa0 | 4 | 1 | 00:00:00.000 | 0 | 0 | 1 | 0.000000 | 18 | Half Start | 1 | Arsenal | 1 | Regular Play | 22 | Leicester City | NaN | NaN | ['6e678cba-67c3-4e9a-acca-78ab69b7d68b'] | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3749257 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0 | 2004-05-15 | 16:00:00.000 | 2 | 1 | available | 2020-08-30T08:12:14.579037 | 38 | {'id': 1279, 'name': 'None'} | NaN | 2 | England | Premier League | 44 | 2003/2004 | 1 | Arsenal | male | NaN | [{'id': 577, 'name': 'Arsène Wenger', 'nicknam... | 68 | England | 22 | Leicester City | male | NaN | [{'id': 2974, 'name': 'Micky Adams', 'nickname... | 68 | England | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 2 | 44 | England | Premier League | male | 2003/2004 | 2020-08-31T20:40:28.969635 | 2020-08-31T20:40:28.969635 |
4 | 4 | 0613063a-1cd4-4a18-83a7-9722be2d9f40 | 5 | 1 | 00:00:01.036 | 0 | 1 | 2 | 0.238292 | 30 | Pass | 22 | Leicester City | 9 | From Kick Off | 22 | Leicester City | NaN | NaN | ['500a6fd9-61c7-4b61-bb3c-8e6605c24084'] | [61.0, 40.1] | 40240.0 | Paul Dickov | 24.0 | Left Center Forward | 40242.0 | Marcus Bent | 1.104536 | -1.661456 | 1.0 | Ground Pass | [60.9, 39.0] | 65.0 | Kick Off | 38.0 | Left Foot | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3749257 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0 | 2004-05-15 | 16:00:00.000 | 2 | 1 | available | 2020-08-30T08:12:14.579037 | 38 | {'id': 1279, 'name': 'None'} | NaN | 2 | England | Premier League | 44 | 2003/2004 | 1 | Arsenal | male | NaN | [{'id': 577, 'name': 'Arsène Wenger', 'nicknam... | 68 | England | 22 | Leicester City | male | NaN | [{'id': 2974, 'name': 'Micky Adams', 'nickname... | 68 | England | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 2 | 44 | England | Premier League | male | 2003/2004 | 2020-08-31T20:40:28.969635 | 2020-08-31T20:40:28.969635 |
# Display the last 5 rows of the raw DataFrame, df_sb
df_sb.tail()
level_0 | id | index_x | period | timestamp | minute | second | possession | duration | type_id | type_name | possession_team_id | possession_team_name | play_pattern_id | play_pattern_name | team_id | team_name | tactics_formation | tactics_lineup | related_events | location | player_id | player_name | position_id | position_name | pass_recipient_id | pass_recipient_name | pass_length | pass_angle | pass_height_id | pass_height_name | pass_end_location | pass_type_id | pass_type_name | pass_body_part_id | pass_body_part_name | carry_end_location | pass_outcome_id | pass_outcome_name | under_pressure | clearance_head | clearance_body_part_id | clearance_body_part_name | counterpress | duel_outcome_id | duel_outcome_name | duel_type_id | duel_type_name | ball_receipt_outcome_id | ball_receipt_outcome_name | out | clearance_left_foot | pass_switch | off_camera | clearance_aerial_won | dribble_outcome_id | dribble_outcome_name | pass_cross | pass_assisted_shot_id | pass_shot_assist | shot_statsbomb_xg | shot_end_location | shot_key_pass_id | shot_body_part_id | shot_body_part_name | shot_technique_id | shot_technique_name | shot_outcome_id | shot_outcome_name | shot_type_id | shot_type_name | shot_freeze_frame | goalkeeper_end_location | goalkeeper_type_id | goalkeeper_type_name | goalkeeper_position_id | goalkeeper_position_name | ball_recovery_recovery_failure | foul_committed_advantage | foul_won_advantage | dribble_overrun | clearance_right_foot | interception_outcome_id | interception_outcome_name | foul_won_defensive | pass_aerial_won | pass_deflected | pass_inswinging | pass_technique_id | pass_technique_name | goalkeeper_body_part_id | goalkeeper_body_part_name | goalkeeper_technique_id | goalkeeper_technique_name | goalkeeper_outcome_id | goalkeeper_outcome_name | pass_outswinging | pass_goal_assist | shot_one_on_one | miscontrol_aerial_won | shot_deflected | block_deflection | shot_first_time | block_offensive | pass_through_ball | foul_committed_card_id | foul_committed_card_name | foul_committed_penalty | foul_won_penalty | dribble_nutmeg | pass_miscommunication | pass_no_touch | foul_committed_offensive | goalkeeper_lost_out | pass_straight | substitution_outcome_id | substitution_outcome_name | substitution_replacement_id | substitution_replacement_name | match_id | goalkeeper_punched_out | shot_aerial_won | pass_cut_back | goalkeeper_success_in_play | 50_50_outcome_id | 50_50_outcome_name | foul_committed_type_id | foul_committed_type_name | ball_recovery_offensive | shot_saved_off_target | goalkeeper_shot_saved_off_target | shot_open_goal | dribble_no_touch | bad_behaviour_card_id | bad_behaviour_card_name | half_start_late_video_start | block_save_block | shot_follows_dribble | clearance_other | goalkeeper_shot_saved_to_post | shot_redirect | injury_stoppage_in_chain | shot_saved_to_post | goalkeeper_success_out | goalkeeper_lost_in_play | half_end_early_video_end | player_off_permanent | goalkeeper_saved_to_post | pass_backheel | shot_kick_off | goalkeeper_penalty_saved_to_post | index_y | match_date | kick_off | home_score | away_score | match_status | last_updated | match_week | referee | stadium | competition_competition_id | competition_country_name | competition_competition_name | season_season_id | season_season_name | home_team_home_team_id | home_team_home_team_name | home_team_home_team_gender | home_team_home_team_group | home_team_managers | home_team_country_id | home_team_country_name | away_team_away_team_id | away_team_away_team_name | away_team_away_team_gender | away_team_away_team_group | away_team_managers | away_team_country_id | away_team_country_name | metadata_data_version | metadata_shot_fidelity_version | metadata_xy_fidelity_version | competition_stage_id | competition_stage_name | competition_id | season_id | country_name | competition_name | competition_gender | season_name | match_updated | match_available | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
3158153 | 4237 | 3821ac0d-f832-4bbd-a9c3-f00dc45bfd2a | 4238 | 4 | 00:22:30.391 | 127 | 30 | 268 | 0.040000 | 43 | Carry | 858 | Sweden Women's | 4 | From Throw In | 858 | Sweden Women's | NaN | NaN | ['4d7320fa-dde2-4191-9172-05745c4e25d2', '633c... | [106.0, 3.8] | 10222.0 | Jonna Andersson | 6.0 | Left Back | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | [106.0, 3.8] | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 69284 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 51 | 2019-07-03 | 21:00:00.000 | 1 | 0 | available | 2020-07-29T05:00 | 6 | {'id': 1627, 'name': 'M. Beaudoin'} | {'id': 193, 'name': 'Groupama Stadium', 'count... | 72 | International | Women's World Cup | 30 | 2019 | 851 | Netherlands Women's | female | NaN | [{'id': 45, 'name': 'Sarina Glotzbach-Wiegman'... | 160 | Netherlands | 858 | Sweden Women's | female | NaN | [{'id': 3016, 'name': 'Peter Gerhardsson', 'ni... | 220 | Sweden | 1.1.0 | 2.0 | 2.0 | 15 | Semi-finals | 72 | 30 | International | Women's World Cup | female | 2019 | 2020-07-29T05:00 | 2020-07-29T05:00 |
3158154 | 4238 | 633cac33-a3e7-4e4e-9bc8-10c8bf67c5ca | 4239 | 4 | 00:22:30.431 | 127 | 30 | 268 | 2.176919 | 30 | Pass | 858 | Sweden Women's | 4 | From Throw In | 858 | Sweden Women's | NaN | NaN | ['2a96c784-b880-4d0e-a66e-5b4f765cf924'] | [106.0, 3.8] | 10222.0 | Jonna Andersson | 6.0 | Left Back | NaN | NaN | 38.552303 | 1.435502 | 3.0 | High Pass | [111.2, 42.0] | NaN | NaN | 38.0 | Left Foot | NaN | 9.0 | Incomplete | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | True | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 69284 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 51 | 2019-07-03 | 21:00:00.000 | 1 | 0 | available | 2020-07-29T05:00 | 6 | {'id': 1627, 'name': 'M. Beaudoin'} | {'id': 193, 'name': 'Groupama Stadium', 'count... | 72 | International | Women's World Cup | 30 | 2019 | 851 | Netherlands Women's | female | NaN | [{'id': 45, 'name': 'Sarina Glotzbach-Wiegman'... | 160 | Netherlands | 858 | Sweden Women's | female | NaN | [{'id': 3016, 'name': 'Peter Gerhardsson', 'ni... | 220 | Sweden | 1.1.0 | 2.0 | 2.0 | 15 | Semi-finals | 72 | 30 | International | Women's World Cup | female | 2019 | 2020-07-29T05:00 | 2020-07-29T05:00 |
3158155 | 4239 | 2a96c784-b880-4d0e-a66e-5b4f765cf924 | 4240 | 4 | 00:22:32.608 | 127 | 32 | 269 | 0.000000 | 23 | Goal Keeper | 851 | Netherlands Women's | 8 | From Keeper | 851 | Netherlands Women's | NaN | NaN | ['633cac33-a3e7-4e4e-9bc8-10c8bf67c5ca'] | [9.8, 39.0] | 10646.0 | Sari van Veenendaal | 1.0 | Goalkeeper | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 25.0 | Collected | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 15.0 | Success | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 69284 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 51 | 2019-07-03 | 21:00:00.000 | 1 | 0 | available | 2020-07-29T05:00 | 6 | {'id': 1627, 'name': 'M. Beaudoin'} | {'id': 193, 'name': 'Groupama Stadium', 'count... | 72 | International | Women's World Cup | 30 | 2019 | 851 | Netherlands Women's | female | NaN | [{'id': 45, 'name': 'Sarina Glotzbach-Wiegman'... | 160 | Netherlands | 858 | Sweden Women's | female | NaN | [{'id': 3016, 'name': 'Peter Gerhardsson', 'ni... | 220 | Sweden | 1.1.0 | 2.0 | 2.0 | 15 | Semi-finals | 72 | 30 | International | Women's World Cup | female | 2019 | 2020-07-29T05:00 | 2020-07-29T05:00 |
3158156 | 4240 | dc2ac9d4-03bb-4e2f-b462-ddf16187934c | 4241 | 4 | 00:22:38.347 | 127 | 38 | 269 | 0.000000 | 34 | Half End | 851 | Netherlands Women's | 8 | From Keeper | 858 | Sweden Women's | NaN | NaN | ['9125ce39-0492-406a-8186-0332f1669dc7'] | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 69284 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 51 | 2019-07-03 | 21:00:00.000 | 1 | 0 | available | 2020-07-29T05:00 | 6 | {'id': 1627, 'name': 'M. Beaudoin'} | {'id': 193, 'name': 'Groupama Stadium', 'count... | 72 | International | Women's World Cup | 30 | 2019 | 851 | Netherlands Women's | female | NaN | [{'id': 45, 'name': 'Sarina Glotzbach-Wiegman'... | 160 | Netherlands | 858 | Sweden Women's | female | NaN | [{'id': 3016, 'name': 'Peter Gerhardsson', 'ni... | 220 | Sweden | 1.1.0 | 2.0 | 2.0 | 15 | Semi-finals | 72 | 30 | International | Women's World Cup | female | 2019 | 2020-07-29T05:00 | 2020-07-29T05:00 |
3158157 | 4241 | 9125ce39-0492-406a-8186-0332f1669dc7 | 4242 | 4 | 00:22:38.347 | 127 | 38 | 269 | 0.000000 | 34 | Half End | 851 | Netherlands Women's | 8 | From Keeper | 851 | Netherlands Women's | NaN | NaN | ['dc2ac9d4-03bb-4e2f-b462-ddf16187934c'] | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 69284 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 51 | 2019-07-03 | 21:00:00.000 | 1 | 0 | available | 2020-07-29T05:00 | 6 | {'id': 1627, 'name': 'M. Beaudoin'} | {'id': 193, 'name': 'Groupama Stadium', 'count... | 72 | International | Women's World Cup | 30 | 2019 | 851 | Netherlands Women's | female | NaN | [{'id': 45, 'name': 'Sarina Glotzbach-Wiegman'... | 160 | Netherlands | 858 | Sweden Women's | female | NaN | [{'id': 3016, 'name': 'Peter Gerhardsson', 'ni... | 220 | Sweden | 1.1.0 | 2.0 | 2.0 | 15 | Semi-finals | 72 | 30 | International | Women's World Cup | female | 2019 | 2020-07-29T05:00 | 2020-07-29T05:00 |
# Print the shape of the raw DataFrame, df_sb
print(df_sb.shape)
(3158158, 193)
# Print the column names of the raw DataFrame, df_sb
print(df_sb.columns)
Index(['level_0', 'id', 'index_x', 'period', 'timestamp', 'minute', 'second', 'possession', 'duration', 'type_id', ... 'competition_stage_id', 'competition_stage_name', 'competition_id', 'season_id', 'country_name', 'competition_name', 'competition_gender', 'season_name', 'match_updated', 'match_available'], dtype='object', length=193)
The joined dataset has one hundred and ninety three features (columns). Full details of these attributes can be found in the Data Dictionary.
# Data types of the features of the raw DataFrame, df_sb
with pd.option_context('display.max_rows', None, 'display.max_columns', None):
print(df_sb.dtypes)
level_0 int64 id object index_x int64 period int64 timestamp object minute int64 second int64 possession int64 duration float64 type_id int64 type_name object possession_team_id int64 possession_team_name object play_pattern_id int64 play_pattern_name object team_id int64 team_name object tactics_formation float64 tactics_lineup object related_events object location object player_id float64 player_name object position_id float64 position_name object pass_recipient_id float64 pass_recipient_name object pass_length float64 pass_angle float64 pass_height_id float64 pass_height_name object pass_end_location object pass_type_id float64 pass_type_name object pass_body_part_id float64 pass_body_part_name object carry_end_location object pass_outcome_id float64 pass_outcome_name object under_pressure object clearance_head object clearance_body_part_id float64 clearance_body_part_name object counterpress object duel_outcome_id float64 duel_outcome_name object duel_type_id float64 duel_type_name object ball_receipt_outcome_id float64 ball_receipt_outcome_name object out object clearance_left_foot object pass_switch object off_camera object clearance_aerial_won object dribble_outcome_id float64 dribble_outcome_name object pass_cross object pass_assisted_shot_id object pass_shot_assist object shot_statsbomb_xg float64 shot_end_location object shot_key_pass_id object shot_body_part_id float64 shot_body_part_name object shot_technique_id float64 shot_technique_name object shot_outcome_id float64 shot_outcome_name object shot_type_id float64 shot_type_name object shot_freeze_frame object goalkeeper_end_location object goalkeeper_type_id float64 goalkeeper_type_name object goalkeeper_position_id float64 goalkeeper_position_name object ball_recovery_recovery_failure object foul_committed_advantage object foul_won_advantage object dribble_overrun object clearance_right_foot object interception_outcome_id float64 interception_outcome_name object foul_won_defensive object pass_aerial_won object pass_deflected object pass_inswinging object pass_technique_id float64 pass_technique_name object goalkeeper_body_part_id float64 goalkeeper_body_part_name object goalkeeper_technique_id float64 goalkeeper_technique_name object goalkeeper_outcome_id float64 goalkeeper_outcome_name object pass_outswinging object pass_goal_assist object shot_one_on_one object miscontrol_aerial_won object shot_deflected object block_deflection object shot_first_time object block_offensive object pass_through_ball object foul_committed_card_id float64 foul_committed_card_name object foul_committed_penalty object foul_won_penalty object dribble_nutmeg object pass_miscommunication object pass_no_touch object foul_committed_offensive object goalkeeper_lost_out object pass_straight object substitution_outcome_id float64 substitution_outcome_name object substitution_replacement_id float64 substitution_replacement_name object match_id int64 goalkeeper_punched_out object shot_aerial_won object pass_cut_back object goalkeeper_success_in_play object 50_50_outcome_id float64 50_50_outcome_name object foul_committed_type_id float64 foul_committed_type_name object ball_recovery_offensive object shot_saved_off_target object goalkeeper_shot_saved_off_target object shot_open_goal object dribble_no_touch object bad_behaviour_card_id float64 bad_behaviour_card_name object half_start_late_video_start object block_save_block object shot_follows_dribble object clearance_other object goalkeeper_shot_saved_to_post object shot_redirect object injury_stoppage_in_chain object shot_saved_to_post object goalkeeper_success_out object goalkeeper_lost_in_play object half_end_early_video_end object player_off_permanent object goalkeeper_saved_to_post object pass_backheel object shot_kick_off object goalkeeper_penalty_saved_to_post object index_y int64 match_date object kick_off object home_score int64 away_score int64 match_status object last_updated object match_week int64 referee object stadium object competition_competition_id int64 competition_country_name object competition_competition_name object season_season_id int64 season_season_name object home_team_home_team_id int64 home_team_home_team_name object home_team_home_team_gender object home_team_home_team_group object home_team_managers object home_team_country_id int64 home_team_country_name object away_team_away_team_id int64 away_team_away_team_name object away_team_away_team_gender object away_team_away_team_group object away_team_managers object away_team_country_id int64 away_team_country_name object metadata_data_version object metadata_shot_fidelity_version float64 metadata_xy_fidelity_version float64 competition_stage_id int64 competition_stage_name object competition_id int64 season_id int64 country_name object competition_name object competition_gender object season_name object match_updated object match_available object dtype: object
Full details of these attributes and their data types can be found in the Data Dictionary.
# Info for the raw DataFrame, df_sb
df_sb.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 3158158 entries, 0 to 3158157 Columns: 193 entries, level_0 to match_available dtypes: float64(36), int64(24), object(133) memory usage: 4.5+ GB
# Description of the raw DataFrame, df_sb, showing some summary statistics for each numberical column in the DataFrame
df_sb.describe()
level_0 | index_x | period | minute | second | possession | duration | type_id | possession_team_id | play_pattern_id | team_id | tactics_formation | player_id | position_id | pass_recipient_id | pass_length | pass_angle | pass_height_id | pass_type_id | pass_body_part_id | pass_outcome_id | clearance_body_part_id | duel_outcome_id | duel_type_id | ball_receipt_outcome_id | dribble_outcome_id | shot_statsbomb_xg | shot_body_part_id | shot_technique_id | shot_outcome_id | shot_type_id | goalkeeper_type_id | goalkeeper_position_id | interception_outcome_id | pass_technique_id | goalkeeper_body_part_id | goalkeeper_technique_id | goalkeeper_outcome_id | foul_committed_card_id | substitution_outcome_id | substitution_replacement_id | match_id | 50_50_outcome_id | foul_committed_type_id | bad_behaviour_card_id | index_y | home_score | away_score | match_week | competition_competition_id | season_season_id | home_team_home_team_id | home_team_country_id | away_team_away_team_id | away_team_country_id | metadata_shot_fidelity_version | metadata_xy_fidelity_version | competition_stage_id | competition_id | season_id | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
count | 3.158158e+06 | 3.158158e+06 | 3.158158e+06 | 3.158158e+06 | 3.158158e+06 | 3.158158e+06 | 2.313994e+06 | 3.158158e+06 | 3.158158e+06 | 3.158158e+06 | 3.158158e+06 | 3301.000000 | 3.141590e+06 | 3.141590e+06 | 809438.000000 | 871308.000000 | 871308.000000 | 871308.000000 | 171945.00000 | 819407.000000 | 185449.000000 | 30932.000000 | 34423.000000 | 55407.000000 | 123579.0 | 36494.000000 | 22357.000000 | 22357.000000 | 22357.000000 | 22357.000000 | 22357.000000 | 26473.000000 | 22337.000000 | 16815.000000 | 10304.000000 | 6448.000000 | 8660.000000 | 12634.000000 | 2799.000000 | 4842.000000 | 4847.000000 | 3.158158e+06 | 1366.000000 | 1575.000000 | 628.000000 | 3.158158e+06 | 3.158158e+06 | 3.158158e+06 | 3.158158e+06 | 3.158158e+06 | 3.158158e+06 | 3.158158e+06 | 3.158158e+06 | 3.158158e+06 | 3.158158e+06 | 2494494.0 | 2154338.0 | 3.158158e+06 | 3.158158e+06 | 3.158158e+06 |
mean | 1.820498e+03 | 1.821498e+03 | 1.500939e+00 | 4.486634e+01 | 2.930872e+01 | 9.664262e+01 | 1.273816e+00 | 3.236920e+01 | 4.930352e+02 | 2.823449e+00 | 4.976638e+02 | 4814.252348 | 1.263005e+04 | 1.124376e+01 | 12222.931576 | 21.058518 | 0.013494 | 1.555189 | 65.13010 | 39.882497 | 19.264547 | 38.253136 | 11.894199 | 10.621275 | 9.0 | 8.381789 | 0.117009 | 38.998166 | 92.906070 | 98.163394 | 85.528380 | 31.258868 | 43.852532 | 10.267023 | 106.536685 | 36.551179 | 45.561085 | 40.609387 | 6.931404 | 102.945477 | 14064.650505 | 4.397187e+05 | 2.036603 | 23.274286 | 6.939490 | 2.397784e+01 | 1.808959e+00 | 1.436360e+00 | 1.491716e+01 | 2.319544e+01 | 2.205346e+01 | 5.127428e+02 | 1.671042e+02 | 5.100286e+02 | 1.666108e+02 | 2.0 | 2.0 | 2.563879e+00 | 2.319544e+01 | 2.205346e+01 |
std | 1.076392e+03 | 1.076392e+03 | 5.160235e-01 | 2.714136e+01 | 1.738708e+01 | 5.767026e+01 | 2.148291e+00 | 1.213322e+01 | 3.640865e+02 | 2.198834e+00 | 3.655942e+02 | 11433.567582 | 8.832031e+03 | 7.189082e+00 | 8679.003819 | 14.275584 | 1.542211 | 0.815164 | 1.91996 | 4.434959 | 24.014366 | 2.643092 | 4.937000 | 0.485074 | 0.0 | 0.485832 | 0.157306 | 1.999809 | 0.830046 | 2.064860 | 5.919048 | 6.652252 | 0.502779 | 5.258971 | 1.732251 | 2.272881 | 0.496283 | 20.157284 | 0.328984 | 0.227070 | 9347.389479 | 9.243830e+05 | 1.179858 | 1.250034 | 0.318741 | 2.130848e+01 | 1.694212e+00 | 1.428223e+00 | 1.084382e+01 | 1.809714e+01 | 1.553319e+01 | 3.683820e+02 | 6.943479e+01 | 3.717773e+02 | 7.005726e+01 | 0.0 | 0.0 | 5.538984e+00 | 1.809714e+01 | 1.553319e+01 |
min | 0.000000e+00 | 1.000000e+00 | 1.000000e+00 | 0.000000e+00 | 0.000000e+00 | 1.000000e+00 | -7.398828e+02 | 2.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.000000e+00 | 55.000000 | 2.941000e+03 | 0.000000e+00 | 2941.000000 | 0.000000 | -3.138562 | 1.000000 | 61.00000 | 37.000000 | 9.000000 | 37.000000 | 4.000000 | 10.000000 | 9.0 | 8.000000 | 0.000000 | 37.000000 | 89.000000 | 96.000000 | 61.000000 | 25.000000 | 42.000000 | 4.000000 | 104.000000 | 35.000000 | 45.000000 | 1.000000 | 5.000000 | 102.000000 | 2948.000000 | 7.430000e+03 | 1.000000 | 19.000000 | 5.000000 | 0.000000e+00 | 0.000000e+00 | 0.000000e+00 | 1.000000e+00 | 2.000000e+00 | 1.000000e+00 | 1.000000e+00 | 1.100000e+01 | 1.000000e+00 | 1.100000e+01 | 2.0 | 2.0 | 1.000000e+00 | 2.000000e+00 | 1.000000e+00 |
25% | 8.990000e+02 | 9.000000e+02 | 1.000000e+00 | 2.100000e+01 | 1.400000e+01 | 4.700000e+01 | 3.653680e-01 | 3.000000e+01 | 2.170000e+02 | 1.000000e+00 | 2.170000e+02 | 433.000000 | 5.216000e+03 | 5.000000e+00 | 5216.000000 | 11.313708 | -1.162647 | 1.000000 | 63.00000 | 38.000000 | 9.000000 | 37.000000 | 4.000000 | 10.000000 | 9.0 | 8.000000 | 0.026083 | 38.000000 | 93.000000 | 97.000000 | 87.000000 | 30.000000 | 44.000000 | 4.000000 | 105.000000 | 35.000000 | 45.000000 | 15.000000 | 7.000000 | 103.000000 | 5528.500000 | 1.975700e+04 | 1.000000 | 23.000000 | 7.000000 | 9.000000e+00 | 1.000000e+00 | 0.000000e+00 | 5.000000e+00 | 1.100000e+01 | 4.000000e+00 | 2.170000e+02 | 6.800000e+01 | 2.170000e+02 | 6.800000e+01 | 2.0 | 2.0 | 1.000000e+00 | 1.100000e+01 | 4.000000e+00 |
50% | 1.798000e+03 | 1.799000e+03 | 1.000000e+00 | 4.500000e+01 | 2.900000e+01 | 9.500000e+01 | 1.059719e+00 | 3.800000e+01 | 2.170000e+02 | 2.000000e+00 | 2.170000e+02 | 442.000000 | 7.179000e+03 | 1.100000e+01 | 6829.000000 | 17.088007 | 0.000000 | 1.000000 | 66.00000 | 40.000000 | 9.000000 | 37.000000 | 14.000000 | 11.000000 | 9.0 | 8.000000 | 0.053939 | 40.000000 | 93.000000 | 98.000000 | 87.000000 | 32.000000 | 44.000000 | 13.000000 | 108.000000 | 35.000000 | 46.000000 | 52.000000 | 7.000000 | 103.000000 | 10650.000000 | 6.923400e+04 | 1.000000 | 24.000000 | 7.000000 | 1.900000e+01 | 1.000000e+00 | 1.000000e+00 | 1.300000e+01 | 1.100000e+01 | 2.400000e+01 | 2.200000e+02 | 2.140000e+02 | 2.200000e+02 | 2.140000e+02 | 2.0 | 2.0 | 1.000000e+00 | 1.100000e+01 | 2.400000e+01 |
75% | 2.700000e+03 | 2.701000e+03 | 2.000000e+00 | 6.800000e+01 | 4.400000e+01 | 1.430000e+02 | 1.737000e+00 | 4.200000e+01 | 8.520000e+02 | 4.000000e+00 | 8.570000e+02 | 4231.000000 | 1.976700e+04 | 1.700000e+01 | 19419.000000 | 26.419690 | 1.195864 | 2.000000 | 66.00000 | 40.000000 | 9.000000 | 40.000000 | 16.000000 | 11.000000 | 9.0 | 9.000000 | 0.132065 | 40.000000 | 93.000000 | 100.000000 | 87.000000 | 32.000000 | 44.000000 | 16.000000 | 108.000000 | 39.000000 | 46.000000 | 55.000000 | 7.000000 | 103.000000 | 23791.000000 | 2.666690e+05 | 3.000000 | 24.000000 | 7.000000 | 3.000000e+01 | 3.000000e+00 | 2.000000e+00 | 2.300000e+01 | 3.700000e+01 | 3.900000e+01 | 8.650000e+02 | 2.140000e+02 | 9.010000e+02 | 2.140000e+02 | 2.0 | 2.0 | 1.000000e+00 | 3.700000e+01 | 3.900000e+01 |
max | 5.025000e+03 | 5.026000e+03 | 5.000000e+00 | 1.280000e+02 | 5.900000e+01 | 3.020000e+02 | 1.471906e+03 | 4.300000e+01 | 1.475000e+03 | 9.000000e+00 | 1.475000e+03 | 312112.000000 | 4.112500e+04 | 2.500000e+01 | 41125.000000 | 119.199410 | 3.141593 | 3.000000 | 67.00000 | 106.000000 | 77.000000 | 70.000000 | 17.000000 | 11.000000 | 9.0 | 9.000000 | 0.931740 | 70.000000 | 95.000000 | 116.000000 | 88.000000 | 114.000000 | 44.000000 | 17.000000 | 108.000000 | 41.000000 | 46.000000 | 117.000000 | 7.000000 | 103.000000 | 41125.000000 | 3.752619e+06 | 4.000000 | 24.000000 | 7.000000 | 1.060000e+02 | 1.300000e+01 | 8.000000e+00 | 3.800000e+01 | 7.200000e+01 | 4.400000e+01 | 1.475000e+03 | 2.550000e+02 | 1.475000e+03 | 2.420000e+02 | 2.0 | 2.0 | 3.300000e+01 | 7.200000e+01 | 4.400000e+01 |
"""
# Plot visualisation of the missing values for each feature of the raw DataFrame, df_sb
msno.matrix(df_sb, figsize = (30, 7))
"""
'\n# Plot visualisation of the missing values for each feature of the raw DataFrame, df_sb\nmsno.matrix(df_sb, figsize = (30, 7))\n'
# Counts of missing values
null_value_stats = df_sb.isnull().sum(axis=0)
null_value_stats[null_value_stats != 0]
duration 844164 tactics_formation 3154857 tactics_lineup 3154857 related_events 134286 location 24733 ... home_team_managers 340420 away_team_away_team_group 2841295 away_team_managers 340420 metadata_shot_fidelity_version 663664 metadata_xy_fidelity_version 1003820 Length: 143, dtype: int64
The visualisation shows us that there are no missing values in the DataFrame.
Before conducting an Exploratory Data Analysis (EDA) of the data, we'll first need to clean and wrangle the datasets to a form that meet our needs.
Sort data by match_date
, kick_off
, and period
, timestamp
, as well as a few other attributes to be sure. Important for when determining previous events. which are attributes created for the DataFrame in the Data Engineering notebook.
# Sort data by match_date, kick_off, period, timestamp, and a few other attributes to be sure
df_sb = df_sb.sort_values(['match_date', 'kick_off', 'competition_name', 'season_name', 'home_team_home_team_name', 'away_team_away_team_name', 'period', 'timestamp', 'index_x'])
df_sb['team'] = np.where(df_sb['team_name'] == df_sb['home_team_home_team_name'], df_sb['home_team_home_team_name'], df_sb['away_team_away_team_name'])
df_sb['opponent'] = np.where(df_sb['team_name'] == df_sb['away_team_away_team_name'], df_sb['home_team_home_team_name'], df_sb['away_team_away_team_name'])
df_sb['full_fixture_date'] = df_sb['match_date'].astype(str) + ' ' + df_sb['home_team_home_team_name'].astype(str) + ' ' + df_sb['home_score'].astype(str) + ' ' + ' vs. ' + ' ' + df_sb['away_score'].astype(str) + ' ' + df_sb['away_team_away_team_name'].astype(str)
df_sb.head()
level_0 | id | index_x | period | timestamp | minute | second | possession | duration | type_id | type_name | possession_team_id | possession_team_name | play_pattern_id | play_pattern_name | team_id | team_name | tactics_formation | tactics_lineup | related_events | location | player_id | player_name | position_id | position_name | pass_recipient_id | pass_recipient_name | pass_length | pass_angle | pass_height_id | pass_height_name | pass_end_location | pass_type_id | pass_type_name | pass_body_part_id | pass_body_part_name | carry_end_location | pass_outcome_id | pass_outcome_name | under_pressure | clearance_head | clearance_body_part_id | clearance_body_part_name | counterpress | duel_outcome_id | duel_outcome_name | duel_type_id | duel_type_name | ball_receipt_outcome_id | ball_receipt_outcome_name | out | clearance_left_foot | pass_switch | off_camera | clearance_aerial_won | dribble_outcome_id | dribble_outcome_name | pass_cross | pass_assisted_shot_id | pass_shot_assist | shot_statsbomb_xg | shot_end_location | shot_key_pass_id | shot_body_part_id | shot_body_part_name | shot_technique_id | shot_technique_name | shot_outcome_id | shot_outcome_name | shot_type_id | shot_type_name | shot_freeze_frame | goalkeeper_end_location | goalkeeper_type_id | goalkeeper_type_name | goalkeeper_position_id | goalkeeper_position_name | ball_recovery_recovery_failure | foul_committed_advantage | foul_won_advantage | dribble_overrun | clearance_right_foot | interception_outcome_id | interception_outcome_name | foul_won_defensive | pass_aerial_won | pass_deflected | pass_inswinging | pass_technique_id | pass_technique_name | goalkeeper_body_part_id | goalkeeper_body_part_name | goalkeeper_technique_id | goalkeeper_technique_name | goalkeeper_outcome_id | goalkeeper_outcome_name | pass_outswinging | pass_goal_assist | shot_one_on_one | miscontrol_aerial_won | shot_deflected | block_deflection | shot_first_time | block_offensive | pass_through_ball | foul_committed_card_id | foul_committed_card_name | foul_committed_penalty | foul_won_penalty | dribble_nutmeg | pass_miscommunication | pass_no_touch | foul_committed_offensive | goalkeeper_lost_out | pass_straight | substitution_outcome_id | substitution_outcome_name | substitution_replacement_id | substitution_replacement_name | match_id | goalkeeper_punched_out | shot_aerial_won | pass_cut_back | goalkeeper_success_in_play | 50_50_outcome_id | 50_50_outcome_name | foul_committed_type_id | foul_committed_type_name | ball_recovery_offensive | shot_saved_off_target | goalkeeper_shot_saved_off_target | shot_open_goal | dribble_no_touch | bad_behaviour_card_id | bad_behaviour_card_name | half_start_late_video_start | block_save_block | shot_follows_dribble | clearance_other | goalkeeper_shot_saved_to_post | shot_redirect | injury_stoppage_in_chain | shot_saved_to_post | goalkeeper_success_out | goalkeeper_lost_in_play | half_end_early_video_end | player_off_permanent | goalkeeper_saved_to_post | pass_backheel | shot_kick_off | goalkeeper_penalty_saved_to_post | index_y | match_date | kick_off | home_score | away_score | match_status | last_updated | match_week | referee | stadium | competition_competition_id | competition_country_name | competition_competition_name | season_season_id | season_season_name | home_team_home_team_id | home_team_home_team_name | home_team_home_team_gender | home_team_home_team_group | home_team_managers | home_team_country_id | home_team_country_name | away_team_away_team_id | away_team_away_team_name | away_team_away_team_gender | away_team_away_team_group | away_team_managers | away_team_country_id | away_team_country_name | metadata_data_version | metadata_shot_fidelity_version | metadata_xy_fidelity_version | competition_stage_id | competition_stage_name | competition_id | season_id | country_name | competition_name | competition_gender | season_name | match_updated | match_available | team | opponent | full_fixture_date | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
65644 | 0 | d78142c2-54c8-48fd-8346-67ab75d01a5e | 1 | 1 | 00:00:00.000 | 0 | 0 | 1 | 0.000000 | 35 | Starting XI | 1 | Arsenal | 1 | Regular Play | 1 | Arsenal | 442.0 | [{'player': {'id': 20015, 'name': 'Jens Lehman... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3749493 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 19 | 2003-08-16 | 16:00:00.000 | 2 | 1 | available | 2020-07-29T05:00 | 1 | {'id': 1279, 'name': 'None'} | NaN | 2 | England | Premier League | 44 | 2003/2004 | 1 | Arsenal | male | NaN | NaN | 68 | England | 29 | Everton | male | NaN | NaN | 68 | England | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 2 | 44 | England | Premier League | male | 2003/2004 | 2020-08-31T20:40:28.969635 | 2020-08-31T20:40:28.969635 | Arsenal | Everton | 2003-08-16 Arsenal 2 vs. 1 Everton |
65645 | 1 | 9815d71d-139d-430d-9c7a-5260db57773f | 2 | 1 | 00:00:00.000 | 0 | 0 | 1 | 0.000000 | 35 | Starting XI | 1 | Arsenal | 1 | Regular Play | 29 | Everton | 442.0 | [{'player': {'id': 40280, 'name': 'Richard Wri... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3749493 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 19 | 2003-08-16 | 16:00:00.000 | 2 | 1 | available | 2020-07-29T05:00 | 1 | {'id': 1279, 'name': 'None'} | NaN | 2 | England | Premier League | 44 | 2003/2004 | 1 | Arsenal | male | NaN | NaN | 68 | England | 29 | Everton | male | NaN | NaN | 68 | England | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 2 | 44 | England | Premier League | male | 2003/2004 | 2020-08-31T20:40:28.969635 | 2020-08-31T20:40:28.969635 | Everton | Arsenal | 2003-08-16 Arsenal 2 vs. 1 Everton |
65646 | 2 | d9b7e5eb-8235-4295-84e9-db9d84b847ee | 3 | 1 | 00:00:00.000 | 0 | 0 | 1 | 0.000000 | 18 | Half Start | 1 | Arsenal | 1 | Regular Play | 1 | Arsenal | NaN | NaN | ['c1d423be-aee9-4e1b-a6d5-ec99ed7a0551'] | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3749493 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 19 | 2003-08-16 | 16:00:00.000 | 2 | 1 | available | 2020-07-29T05:00 | 1 | {'id': 1279, 'name': 'None'} | NaN | 2 | England | Premier League | 44 | 2003/2004 | 1 | Arsenal | male | NaN | NaN | 68 | England | 29 | Everton | male | NaN | NaN | 68 | England | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 2 | 44 | England | Premier League | male | 2003/2004 | 2020-08-31T20:40:28.969635 | 2020-08-31T20:40:28.969635 | Arsenal | Everton | 2003-08-16 Arsenal 2 vs. 1 Everton |
65647 | 3 | c1d423be-aee9-4e1b-a6d5-ec99ed7a0551 | 4 | 1 | 00:00:00.000 | 0 | 0 | 1 | 0.000000 | 18 | Half Start | 1 | Arsenal | 1 | Regular Play | 29 | Everton | NaN | NaN | ['d9b7e5eb-8235-4295-84e9-db9d84b847ee'] | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3749493 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 19 | 2003-08-16 | 16:00:00.000 | 2 | 1 | available | 2020-07-29T05:00 | 1 | {'id': 1279, 'name': 'None'} | NaN | 2 | England | Premier League | 44 | 2003/2004 | 1 | Arsenal | male | NaN | NaN | 68 | England | 29 | Everton | male | NaN | NaN | 68 | England | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 2 | 44 | England | Premier League | male | 2003/2004 | 2020-08-31T20:40:28.969635 | 2020-08-31T20:40:28.969635 | Everton | Arsenal | 2003-08-16 Arsenal 2 vs. 1 Everton |
65648 | 4 | 729957b9-d479-49ab-995f-608a19177be5 | 5 | 1 | 00:00:00.983 | 0 | 0 | 2 | 1.278634 | 30 | Pass | 1 | Arsenal | 9 | From Kick Off | 1 | Arsenal | NaN | NaN | ['1deff0f2-ee63-4951-90ba-f8a8ff399960'] | [60.0, 40.0] | 15512.0 | Sylvain Wiltord | 22.0 | Right Center Forward | 15515.0 | Patrick Vieira | 11.294689 | -2.78904 | 1.0 | Ground Pass | [49.4, 36.1] | 65.0 | Kick Off | 40.0 | Right Foot | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3749493 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 19 | 2003-08-16 | 16:00:00.000 | 2 | 1 | available | 2020-07-29T05:00 | 1 | {'id': 1279, 'name': 'None'} | NaN | 2 | England | Premier League | 44 | 2003/2004 | 1 | Arsenal | male | NaN | NaN | 68 | England | 29 | Everton | male | NaN | NaN | 68 | England | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 2 | 44 | England | Premier League | male | 2003/2004 | 2020-08-31T20:40:28.969635 | 2020-08-31T20:40:28.969635 | Arsenal | Everton | 2003-08-16 Arsenal 2 vs. 1 Everton |
Subset DataFrame into
# List unique values in the df_sb['type_name'] column
sorted(df_sb['type_name'].unique())
['50/50', 'Bad Behaviour', 'Ball Receipt*', 'Ball Recovery', 'Block', 'Camera On', 'Camera off', 'Carry', 'Clearance', 'Dispossessed', 'Dribble', 'Dribbled Past', 'Duel', 'Error', 'Foul Committed', 'Foul Won', 'Goal Keeper', 'Half End', 'Half Start', 'Injury Stoppage', 'Interception', 'Miscontrol', 'Offside', 'Own Goal Against', 'Own Goal For', 'Pass', 'Player Off', 'Player On', 'Pressure', 'Referee Ball-Drop', 'Shield', 'Shot', 'Starting XI', 'Substitution', 'Tactical Shift']
DataFrame of only player's actions i.e. removing line ups, halves, etc.
lst_events = ['50/50',
'Bad Behaviour',
'Ball Receipt*',
'Ball Recovery',
'Block',
'Carry',
'Clearance',
'Dispossessed',
'Dribble',
'Dribbled Past',
'Duel',
'Error',
'Foul Committed',
'Foul Won',
'Goal Keeper',
'Interception',
'Miscontrol',
'Offside',
'Own Goal Against',
'Own Goal For',
'Pass',
'Pressure',
'Shield',
'Shot',
]
df_sb_events = df_sb[df_sb['type_name'].isin(lst_events)]
df_sb_events.shape
(3133322, 196)
df_sb.shape
(3158158, 196)
# Display all location columns
for col in df_sb_events.columns:
if 'location' in col:
print(col)
location pass_end_location carry_end_location shot_end_location goalkeeper_end_location
There are the following five 'location' attributes:
location
pass.end_location
carry.end_location
shot.end_location
goalkeeper.end_location
From reviewing the official documentation [link], the five attributes have the following dimensionality:
location
[x, y]pass.end_location
[x, y]carry.end_location
[x, y]shot.end_location
[x, y, z]goalkeeper.end_location
[x, y]df_sb_events.loc[df_sb['type_name'] == 'Shot']
level_0 | id | index_x | period | timestamp | minute | second | possession | duration | type_id | type_name | possession_team_id | possession_team_name | play_pattern_id | play_pattern_name | team_id | team_name | tactics_formation | tactics_lineup | related_events | location | player_id | player_name | position_id | position_name | pass_recipient_id | pass_recipient_name | pass_length | pass_angle | pass_height_id | pass_height_name | pass_end_location | pass_type_id | pass_type_name | pass_body_part_id | pass_body_part_name | carry_end_location | pass_outcome_id | pass_outcome_name | under_pressure | clearance_head | clearance_body_part_id | clearance_body_part_name | counterpress | duel_outcome_id | duel_outcome_name | duel_type_id | duel_type_name | ball_receipt_outcome_id | ball_receipt_outcome_name | out | clearance_left_foot | pass_switch | off_camera | clearance_aerial_won | dribble_outcome_id | dribble_outcome_name | pass_cross | pass_assisted_shot_id | pass_shot_assist | shot_statsbomb_xg | shot_end_location | shot_key_pass_id | shot_body_part_id | shot_body_part_name | shot_technique_id | shot_technique_name | shot_outcome_id | shot_outcome_name | shot_type_id | shot_type_name | shot_freeze_frame | goalkeeper_end_location | goalkeeper_type_id | goalkeeper_type_name | goalkeeper_position_id | goalkeeper_position_name | ball_recovery_recovery_failure | foul_committed_advantage | foul_won_advantage | dribble_overrun | clearance_right_foot | interception_outcome_id | interception_outcome_name | foul_won_defensive | pass_aerial_won | pass_deflected | pass_inswinging | pass_technique_id | pass_technique_name | goalkeeper_body_part_id | goalkeeper_body_part_name | goalkeeper_technique_id | goalkeeper_technique_name | goalkeeper_outcome_id | goalkeeper_outcome_name | pass_outswinging | pass_goal_assist | shot_one_on_one | miscontrol_aerial_won | shot_deflected | block_deflection | shot_first_time | block_offensive | pass_through_ball | foul_committed_card_id | foul_committed_card_name | foul_committed_penalty | foul_won_penalty | dribble_nutmeg | pass_miscommunication | pass_no_touch | foul_committed_offensive | goalkeeper_lost_out | pass_straight | substitution_outcome_id | substitution_outcome_name | substitution_replacement_id | substitution_replacement_name | match_id | goalkeeper_punched_out | shot_aerial_won | pass_cut_back | goalkeeper_success_in_play | 50_50_outcome_id | 50_50_outcome_name | foul_committed_type_id | foul_committed_type_name | ball_recovery_offensive | shot_saved_off_target | goalkeeper_shot_saved_off_target | shot_open_goal | dribble_no_touch | bad_behaviour_card_id | bad_behaviour_card_name | half_start_late_video_start | block_save_block | shot_follows_dribble | clearance_other | goalkeeper_shot_saved_to_post | shot_redirect | injury_stoppage_in_chain | shot_saved_to_post | goalkeeper_success_out | goalkeeper_lost_in_play | half_end_early_video_end | player_off_permanent | goalkeeper_saved_to_post | pass_backheel | shot_kick_off | goalkeeper_penalty_saved_to_post | index_y | match_date | kick_off | home_score | away_score | match_status | last_updated | match_week | referee | stadium | competition_competition_id | competition_country_name | competition_competition_name | season_season_id | season_season_name | home_team_home_team_id | home_team_home_team_name | home_team_home_team_gender | home_team_home_team_group | home_team_managers | home_team_country_id | home_team_country_name | away_team_away_team_id | away_team_away_team_name | away_team_away_team_gender | away_team_away_team_group | away_team_managers | away_team_country_id | away_team_country_name | metadata_data_version | metadata_shot_fidelity_version | metadata_xy_fidelity_version | competition_stage_id | competition_stage_name | competition_id | season_id | country_name | competition_name | competition_gender | season_name | match_updated | match_available | team | opponent | full_fixture_date | location_x | location_y | pass_end_location_x | pass_end_location_y | carry_end_location_x | carry_end_location_y | shot_end_location_x | shot_end_location_y | shot_end_location_z | goalkeeper_end_location_x | goalkeeper_end_location_y | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
65822 | 178 | 52e9cf2c-e406-48f0-b950-26acbfbf18a8 | 179 | 1 | 00:03:51.134 | 3 | 51 | 9 | 1.753289 | 16 | Shot | 1 | Arsenal | 1 | Regular Play | 1 | Arsenal | NaN | NaN | ['e92d30d5-dc0a-4c0c-830e-a45076d77f71'] | 91.5, 37.1 | 15512.0 | Sylvain Wiltord | 22.0 | Right Center Forward | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0.022911 | 120.0, 26.7, 6.2 | 282abb6d-2f41-46bd-ba22-a411ce0d7a8c | 38.0 | Left Foot | 93.0 | Normal | 98.0 | Off T | 87.0 | Open Play | [{'location': [85.1, 52.6], 'player': {'id': 4... | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3749493 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 19 | 2003-08-16 | 16:00:00.000 | 2 | 1 | available | 2020-07-29T05:00 | 1 | {'id': 1279, 'name': 'None'} | NaN | 2 | England | Premier League | 44 | 2003/2004 | 1 | Arsenal | male | NaN | NaN | 68 | England | 29 | Everton | male | NaN | NaN | 68 | England | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 2 | 44 | England | Premier League | male | 2003/2004 | 2020-08-31T20:40:28.969635 | 2020-08-31T20:40:28.969635 | Arsenal | Everton | 2003-08-16 Arsenal 2 vs. 1 Everton | 91.5 | 37.1 | nan | NaN | nan | NaN | 120.0 | 26.7 | 6.2 | nan | NaN |
65831 | 187 | 95f3617d-e00d-4e68-aad3-3566a19583ae | 188 | 1 | 00:04:23.834 | 4 | 23 | 10 | 1.786395 | 16 | Shot | 29 | Everton | 7 | From Goal Kick | 29 | Everton | NaN | NaN | ['650321cc-f4b8-4f43-a9c6-c3f175290901', '84ee... | 80.7, 28.4 | 40289.0 | Mark Pembridge | 16.0 | Left Midfield | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | nan | NaN | NaN | True | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0.006424 | 118.6, 42.5, 2.1 | NaN | 38.0 | Left Foot | 91.0 | Half Volley | 100.0 | Saved | 87.0 | Open Play | [{'location': [81.0, 31.5], 'player': {'id': 4... | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3749493 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 19 | 2003-08-16 | 16:00:00.000 | 2 | 1 | available | 2020-07-29T05:00 | 1 | {'id': 1279, 'name': 'None'} | NaN | 2 | England | Premier League | 44 | 2003/2004 | 1 | Arsenal | male | NaN | NaN | 68 | England | 29 | Everton | male | NaN | NaN | 68 | England | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 2 | 44 | England | Premier League | male | 2003/2004 | 2020-08-31T20:40:28.969635 | 2020-08-31T20:40:28.969635 | Everton | Arsenal | 2003-08-16 Arsenal 2 vs. 1 Everton | 80.7 | 28.4 | nan | NaN | nan | NaN | 118.6 | 42.5 | 2.1 | nan | NaN |
65921 | 277 | 7a82b711-af7e-40c6-b895-3d79e28c7f5f | 278 | 1 | 00:06:10.511 | 6 | 10 | 16 | 0.452368 | 16 | Shot | 29 | Everton | 1 | Regular Play | 29 | Everton | NaN | NaN | ['e2445ac4-39cc-44c4-ae48-c3ce3fd51128'] | 111.7, 39.3 | 40283.0 | Nick Chadwick | 24.0 | Left Center Forward | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0.277126 | 117.5, 42.1, 0.2 | 3925e6b6-525c-4738-b710-46e47c825ae6 | 40.0 | Right Foot | 93.0 | Normal | 100.0 | Saved | 87.0 | Open Play | [{'location': [101.9, 32.2], 'player': {'id': ... | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | True | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3749493 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 19 | 2003-08-16 | 16:00:00.000 | 2 | 1 | available | 2020-07-29T05:00 | 1 | {'id': 1279, 'name': 'None'} | NaN | 2 | England | Premier League | 44 | 2003/2004 | 1 | Arsenal | male | NaN | NaN | 68 | England | 29 | Everton | male | NaN | NaN | 68 | England | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 2 | 44 | England | Premier League | male | 2003/2004 | 2020-08-31T20:40:28.969635 | 2020-08-31T20:40:28.969635 | Everton | Arsenal | 2003-08-16 Arsenal 2 vs. 1 Everton | 111.7 | 39.3 | nan | NaN | nan | NaN | 117.5 | 42.1 | 0.2 | nan | NaN |
65925 | 281 | bfc075ba-5b6b-4f02-9027-2c59afcc13fd | 282 | 1 | 00:06:14.029 | 6 | 14 | 16 | 0.281833 | 16 | Shot | 29 | Everton | 1 | Regular Play | 29 | Everton | NaN | NaN | ['47022283-c052-42da-ba2e-c85f76e4ccb4', '4ac9... | 109.8, 23.9 | 40289.0 | Mark Pembridge | 16.0 | Left Midfield | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0.018100 | 110.5, 25.0 | NaN | 38.0 | Left Foot | 95.0 | Volley | 96.0 | Blocked | 87.0 | Open Play | [{'location': [119.0, 37.1], 'player': {'id': ... | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | True | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3749493 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 19 | 2003-08-16 | 16:00:00.000 | 2 | 1 | available | 2020-07-29T05:00 | 1 | {'id': 1279, 'name': 'None'} | NaN | 2 | England | Premier League | 44 | 2003/2004 | 1 | Arsenal | male | NaN | NaN | 68 | England | 29 | Everton | male | NaN | NaN | 68 | England | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 2 | 44 | England | Premier League | male | 2003/2004 | 2020-08-31T20:40:28.969635 | 2020-08-31T20:40:28.969635 | Everton | Arsenal | 2003-08-16 Arsenal 2 vs. 1 Everton | 109.8 | 23.9 | nan | NaN | nan | NaN | 110.5 | 25.0 | NaN | nan | NaN |
66018 | 374 | d66902a9-dd0f-45e0-b5f5-b0f17dd918a2 | 375 | 1 | 00:10:31.500 | 10 | 31 | 24 | 1.204235 | 16 | Shot | 1 | Arsenal | 3 | From Free Kick | 1 | Arsenal | NaN | NaN | ['dd519855-d60c-49a6-a4ae-7a394792c545'] | 92.5, 11.9 | 15516.0 | Thierry Henry | 24.0 | Left Center Forward | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0.077935 | 120.0, 39.0, 3.5 | NaN | 40.0 | Right Foot | 93.0 | Normal | 98.0 | Off T | 62.0 | Free Kick | [{'location': [109.8, 36.7], 'player': {'id': ... | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3749493 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 19 | 2003-08-16 | 16:00:00.000 | 2 | 1 | available | 2020-07-29T05:00 | 1 | {'id': 1279, 'name': 'None'} | NaN | 2 | England | Premier League | 44 | 2003/2004 | 1 | Arsenal | male | NaN | NaN | 68 | England | 29 | Everton | male | NaN | NaN | 68 | England | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 2 | 44 | England | Premier League | male | 2003/2004 | 2020-08-31T20:40:28.969635 | 2020-08-31T20:40:28.969635 | Arsenal | Everton | 2003-08-16 Arsenal 2 vs. 1 Everton | 92.5 | 11.9 | nan | NaN | nan | NaN | 120.0 | 39.0 | 3.5 | nan | NaN |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1574083 | 3557 | 8deb6ee1-3cef-44bd-8040-677d43ea8ea1 | 3558 | 2 | 00:36:54.737 | 81 | 54 | 147 | 1.079143 | 16 | Shot | 206 | Deportivo Alavés | 1 | Regular Play | 206 | Deportivo Alavés | NaN | NaN | ['9caa99c4-5cce-489b-8cef-d2e02645ff6d'] | 102.7, 43.8 | 3265.0 | José Luis Sanmartín Mato | 23.0 | Center Forward | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0.138089 | 120.0, 45.1, 0.6 | 1bf0f6bd-2a77-4038-8ab4-c4fc60fcdcc2 | 37.0 | Head | 93.0 | Normal | 98.0 | Off T | 87.0 | Open Play | [{'location': [110.5, 41.1], 'player': {'id': ... | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | True | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 303421 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0 | 2020-07-19 | 17:00:00.000 | 0 | 5 | available | 2020-07-29T05:00 | 38 | {'id': 207, 'name': 'Juan Martínez', 'country'... | {'id': 348, 'name': 'Estadio de Mendizorroza',... | 11 | Spain | La Liga | 42 | 2019/2020 | 206 | Deportivo Alavés | male | NaN | [{'id': 2, 'name': 'Juan Ramón López Muñiz', '... | 214 | Spain | 217 | Barcelona | male | NaN | [{'id': 238, 'name': 'Enrique Setién Solar', '... | 214 | Spain | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 11 | 42 | Spain | La Liga | male | 2019/2020 | 2020-10-11T20:05:57.703730 | 2020-10-11T20:05:57.703730 | Deportivo Alavés | Barcelona | 2020-07-19 Deportivo Alavés 0 vs. 5 Barcelona | 102.7 | 43.8 | nan | NaN | nan | NaN | 120.0 | 45.1 | 0.6 | nan | NaN |
1574143 | 3617 | 08294b81-c46f-4c05-8e88-a591b5716de4 | 3618 | 2 | 00:39:28.643 | 84 | 28 | 151 | 0.663865 | 16 | Shot | 206 | Deportivo Alavés | 3 | From Free Kick | 206 | Deportivo Alavés | NaN | NaN | ['99b38aab-91a4-49ec-972f-33a4b455d6be'] | 105.6, 22.9 | 3265.0 | José Luis Sanmartín Mato | 23.0 | Center Forward | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0.033484 | 120.0, 46.2, 1.2 | NaN | 40.0 | Right Foot | 93.0 | Normal | 98.0 | Off T | 87.0 | Open Play | [{'location': [118.3, 36.0], 'player': {'id': ... | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 303421 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0 | 2020-07-19 | 17:00:00.000 | 0 | 5 | available | 2020-07-29T05:00 | 38 | {'id': 207, 'name': 'Juan Martínez', 'country'... | {'id': 348, 'name': 'Estadio de Mendizorroza',... | 11 | Spain | La Liga | 42 | 2019/2020 | 206 | Deportivo Alavés | male | NaN | [{'id': 2, 'name': 'Juan Ramón López Muñiz', '... | 214 | Spain | 217 | Barcelona | male | NaN | [{'id': 238, 'name': 'Enrique Setién Solar', '... | 214 | Spain | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 11 | 42 | Spain | La Liga | male | 2019/2020 | 2020-10-11T20:05:57.703730 | 2020-10-11T20:05:57.703730 | Deportivo Alavés | Barcelona | 2020-07-19 Deportivo Alavés 0 vs. 5 Barcelona | 105.6 | 22.9 | nan | NaN | nan | NaN | 120.0 | 46.2 | 1.2 | nan | NaN |
1574329 | 3803 | 39a97936-7ca4-4277-8af5-464e6dde5d9b | 3804 | 2 | 00:44:10.351 | 89 | 10 | 159 | 0.797488 | 16 | Shot | 217 | Barcelona | 3 | From Free Kick | 217 | Barcelona | NaN | NaN | ['d1267bcc-086a-4a6c-8abc-09452cd61dbb', 'edf0... | 113.6, 28.6 | 4447.0 | Martin Braithwaite Christensen | 21.0 | Left Wing | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | nan | NaN | NaN | True | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0.132526 | 119.1, 43.8 | 3a7f0714-0ec5-4ac6-83f2-83dd06be8e48 | 38.0 | Left Foot | 91.0 | Half Volley | 101.0 | Wayward | 87.0 | Open Play | [{'location': [110.1, 38.4], 'player': {'id': ... | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | True | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 303421 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0 | 2020-07-19 | 17:00:00.000 | 0 | 5 | available | 2020-07-29T05:00 | 38 | {'id': 207, 'name': 'Juan Martínez', 'country'... | {'id': 348, 'name': 'Estadio de Mendizorroza',... | 11 | Spain | La Liga | 42 | 2019/2020 | 206 | Deportivo Alavés | male | NaN | [{'id': 2, 'name': 'Juan Ramón López Muñiz', '... | 214 | Spain | 217 | Barcelona | male | NaN | [{'id': 238, 'name': 'Enrique Setién Solar', '... | 214 | Spain | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 11 | 42 | Spain | La Liga | male | 2019/2020 | 2020-10-11T20:05:57.703730 | 2020-10-11T20:05:57.703730 | Barcelona | Deportivo Alavés | 2020-07-19 Deportivo Alavés 0 vs. 5 Barcelona | 113.6 | 28.6 | nan | NaN | nan | NaN | 119.1 | 43.8 | NaN | nan | NaN |
1574332 | 3806 | 89d8acd7-2997-4467-8573-518aa1fb86dd | 3807 | 2 | 00:44:11.771 | 89 | 11 | 159 | 0.124053 | 16 | Shot | 217 | Barcelona | 3 | From Free Kick | 217 | Barcelona | NaN | NaN | ['6446d18b-9f7c-4a1a-9296-a992556f4618'] | 118.9, 45.3 | 5246.0 | Luis Alberto Suárez Díaz | 23.0 | Center Forward | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0.238426 | 120.0, 44.7, 0.2 | NaN | 40.0 | Right Foot | 93.0 | Normal | 98.0 | Off T | 87.0 | Open Play | [{'location': [120.0, 27.5], 'player': {'id': ... | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 303421 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | True | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0 | 2020-07-19 | 17:00:00.000 | 0 | 5 | available | 2020-07-29T05:00 | 38 | {'id': 207, 'name': 'Juan Martínez', 'country'... | {'id': 348, 'name': 'Estadio de Mendizorroza',... | 11 | Spain | La Liga | 42 | 2019/2020 | 206 | Deportivo Alavés | male | NaN | [{'id': 2, 'name': 'Juan Ramón López Muñiz', '... | 214 | Spain | 217 | Barcelona | male | NaN | [{'id': 238, 'name': 'Enrique Setién Solar', '... | 214 | Spain | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 11 | 42 | Spain | La Liga | male | 2019/2020 | 2020-10-11T20:05:57.703730 | 2020-10-11T20:05:57.703730 | Barcelona | Deportivo Alavés | 2020-07-19 Deportivo Alavés 0 vs. 5 Barcelona | 118.9 | 45.3 | nan | NaN | nan | NaN | 120.0 | 44.7 | 0.2 | nan | NaN |
1574492 | 3966 | 801b268e-8f4e-4236-879d-c2b72360a113 | 3967 | 2 | 00:48:57.727 | 93 | 57 | 166 | 0.108611 | 16 | Shot | 206 | Deportivo Alavés | 3 | From Free Kick | 206 | Deportivo Alavés | NaN | NaN | ['45256fb7-dfed-49af-b2a2-72f6d033f80a', 'f8dd... | 99.1, 36.5 | 24049.0 | Luis Jesús Rioja González | 16.0 | Left Midfield | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0.056378 | 100.9, 36.8 | NaN | 38.0 | Left Foot | 93.0 | Normal | 96.0 | Blocked | 87.0 | Open Play | [{'location': [78.9, 59.9], 'player': {'id': 4... | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 303421 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0 | 2020-07-19 | 17:00:00.000 | 0 | 5 | available | 2020-07-29T05:00 | 38 | {'id': 207, 'name': 'Juan Martínez', 'country'... | {'id': 348, 'name': 'Estadio de Mendizorroza',... | 11 | Spain | La Liga | 42 | 2019/2020 | 206 | Deportivo Alavés | male | NaN | [{'id': 2, 'name': 'Juan Ramón López Muñiz', '... | 214 | Spain | 217 | Barcelona | male | NaN | [{'id': 238, 'name': 'Enrique Setién Solar', '... | 214 | Spain | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 11 | 42 | Spain | La Liga | male | 2019/2020 | 2020-10-11T20:05:57.703730 | 2020-10-11T20:05:57.703730 | Deportivo Alavés | Barcelona | 2020-07-19 Deportivo Alavés 0 vs. 5 Barcelona | 99.1 | 36.5 | nan | NaN | nan | NaN | 100.9 | 36.8 | NaN | nan | NaN |
22357 rows × 207 columns
"""
# CURRENTLY NOT WORKING, NEED TO FIX
# Normalize 'shot.freeze_frame' avvtribute - see: https://stackoverflow.com/questions/52795561/flattening-nested-json-in-pandas-data-frame
## explode all columns with lists of dicts
df_sb_events_normalize = df_sb_events.apply(lambda x: x.explode()).reset_index(drop=True)
## list of columns with dicts
cols_to_normalize = ['shot.freeze_frame']
## if there are keys, which will become column names, overlap with excising column names. add the current column name as a prefix
normalized = list()
for col in cols_to_normalize:
d = pd.json_normalize(df_sb_events_normalize[col], sep='_')
d.columns = [f'{col}_{v}' for v in d.columns]
normalized.append(d.copy())
## combine df with the normalized columns
df_sb_events_normalize = pd.concat([df_sb_events_normalize] + normalized, axis=1).drop(columns=cols_to_normalize)
## display(df_lineup_select_normalize)
df_sb_events_normalize.head(30)
"""
#
##
df_sb_events['location'] = df_sb_events['location'].astype(str)
df_sb_events['pass_end_location'] = df_sb_events['pass_end_location'].astype(str)
df_sb_events['carry_end_location'] = df_sb_events['carry_end_location'].astype(str)
df_sb_events['shot_end_location'] = df_sb_events['shot_end_location'].astype(str)
df_sb_events['goalkeeper_end_location'] = df_sb_events['goalkeeper_end_location'].astype(str)
df_sb_events['shot_end_location'] = df_sb_events['shot_end_location'].astype(str)
#df_sb_events['shot_freeze_frame'] = df_sb_events['shot_freeze_frame'].astype(str)
##
###
df_sb_events['location'] = df_sb_events['location'].str.replace('[','')
df_sb_events['pass_end_location'] = df_sb_events['pass_end_location'].str.replace('[','')
df_sb_events['carry_end_location'] = df_sb_events['carry_end_location'].str.replace('[','')
df_sb_events['shot_end_location'] = df_sb_events['shot_end_location'].str.replace('[','')
df_sb_events['goalkeeper_end_location'] = df_sb_events['goalkeeper_end_location'].str.replace('[','')
#df_sb_events['shot_freeze_frame'] = df_sb_events['shot_freeze_frame'].str.replace('[','')
###
df_sb_events['location'] = df_sb_events['location'].str.replace(']','')
df_sb_events['pass_end_location'] = df_sb_events['pass_end_location'].str.replace(']','')
df_sb_events['carry_end_location'] = df_sb_events['carry_end_location'].str.replace(']','')
df_sb_events['shot_end_location'] = df_sb_events['shot_end_location'].str.replace(']','')
df_sb_events['goalkeeper_end_location'] = df_sb_events['goalkeeper_end_location'].str.replace(']','')
#df_sb_events['shot_freeze_frame'] = df_sb_events['shot_freeze_frame'].str.replace(']','')
## Break down each location attributes
df_sb_events['location_x'], df_sb_events['location_y'] = df_sb_events['location'].str.split(',', 1).str
df_sb_events['pass_end_location_x'], df_sb_events['pass_end_location_y'] = df_sb_events['pass_end_location'].str.split(',', 1).str
df_sb_events['carry_end_location_x'], df_sb_events['carry_end_location_y'] = df_sb_events['carry_end_location'].str.split(',', 1).str
df_sb_events['shot_end_location_x'], df_sb_events['shot_end_location_y'], df_sb_events['shot_end_location_z'] = df_sb_events['shot_end_location'].str.split(',', 3).str[0:3].str
df_sb_events['goalkeeper_end_location_x'], df_sb_events['goalkeeper_end_location_y'] = df_sb_events['goalkeeper_end_location'].str.split(',', 1).str
#df_sb_events['shot_freeze_frame_x'], df_sb_events['shot_freeze_frame_y'] = df_sb_events['shot_freeze_frame'].str.split(',', 1).str
## Display DataFrame
df_sb_events.head(10)
/opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:4: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy after removing the cwd from sys.path. /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:5: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy """ /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:6: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:7: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy import sys /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:8: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:9: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy if __name__ == '__main__': /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:16: FutureWarning: The default value of regex will change from True to False in a future version. In addition, single character regular expressions will*not* be treated as literal strings when regex=True. app.launch_new_instance() /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:16: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy app.launch_new_instance() /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:17: FutureWarning: The default value of regex will change from True to False in a future version. In addition, single character regular expressions will*not* be treated as literal strings when regex=True. /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:17: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:18: FutureWarning: The default value of regex will change from True to False in a future version. In addition, single character regular expressions will*not* be treated as literal strings when regex=True. /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:18: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:19: FutureWarning: The default value of regex will change from True to False in a future version. In addition, single character regular expressions will*not* be treated as literal strings when regex=True. /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:19: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:20: FutureWarning: The default value of regex will change from True to False in a future version. In addition, single character regular expressions will*not* be treated as literal strings when regex=True. /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:20: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:24: FutureWarning: The default value of regex will change from True to False in a future version. In addition, single character regular expressions will*not* be treated as literal strings when regex=True. /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:24: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:25: FutureWarning: The default value of regex will change from True to False in a future version. In addition, single character regular expressions will*not* be treated as literal strings when regex=True. /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:25: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:26: FutureWarning: The default value of regex will change from True to False in a future version. In addition, single character regular expressions will*not* be treated as literal strings when regex=True. /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:26: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:27: FutureWarning: The default value of regex will change from True to False in a future version. In addition, single character regular expressions will*not* be treated as literal strings when regex=True. /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:27: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:28: FutureWarning: The default value of regex will change from True to False in a future version. In addition, single character regular expressions will*not* be treated as literal strings when regex=True. /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:28: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:33: FutureWarning: Columnar iteration over characters will be deprecated in future releases. /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:33: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:34: FutureWarning: Columnar iteration over characters will be deprecated in future releases. /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:34: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:35: FutureWarning: Columnar iteration over characters will be deprecated in future releases. /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:35: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:36: FutureWarning: Columnar iteration over characters will be deprecated in future releases. /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:36: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:37: FutureWarning: Columnar iteration over characters will be deprecated in future releases. /opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:37: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
level_0 | id | index_x | period | timestamp | minute | second | possession | duration | type_id | type_name | possession_team_id | possession_team_name | play_pattern_id | play_pattern_name | team_id | team_name | tactics_formation | tactics_lineup | related_events | location | player_id | player_name | position_id | position_name | pass_recipient_id | pass_recipient_name | pass_length | pass_angle | pass_height_id | pass_height_name | pass_end_location | pass_type_id | pass_type_name | pass_body_part_id | pass_body_part_name | carry_end_location | pass_outcome_id | pass_outcome_name | under_pressure | clearance_head | clearance_body_part_id | clearance_body_part_name | counterpress | duel_outcome_id | duel_outcome_name | duel_type_id | duel_type_name | ball_receipt_outcome_id | ball_receipt_outcome_name | out | clearance_left_foot | pass_switch | off_camera | clearance_aerial_won | dribble_outcome_id | dribble_outcome_name | pass_cross | pass_assisted_shot_id | pass_shot_assist | shot_statsbomb_xg | shot_end_location | shot_key_pass_id | shot_body_part_id | shot_body_part_name | shot_technique_id | shot_technique_name | shot_outcome_id | shot_outcome_name | shot_type_id | shot_type_name | shot_freeze_frame | goalkeeper_end_location | goalkeeper_type_id | goalkeeper_type_name | goalkeeper_position_id | goalkeeper_position_name | ball_recovery_recovery_failure | foul_committed_advantage | foul_won_advantage | dribble_overrun | clearance_right_foot | interception_outcome_id | interception_outcome_name | foul_won_defensive | pass_aerial_won | pass_deflected | pass_inswinging | pass_technique_id | pass_technique_name | goalkeeper_body_part_id | goalkeeper_body_part_name | goalkeeper_technique_id | goalkeeper_technique_name | goalkeeper_outcome_id | goalkeeper_outcome_name | pass_outswinging | pass_goal_assist | shot_one_on_one | miscontrol_aerial_won | shot_deflected | block_deflection | shot_first_time | block_offensive | pass_through_ball | foul_committed_card_id | foul_committed_card_name | foul_committed_penalty | foul_won_penalty | dribble_nutmeg | pass_miscommunication | pass_no_touch | foul_committed_offensive | goalkeeper_lost_out | pass_straight | substitution_outcome_id | substitution_outcome_name | substitution_replacement_id | substitution_replacement_name | match_id | goalkeeper_punched_out | shot_aerial_won | pass_cut_back | goalkeeper_success_in_play | 50_50_outcome_id | 50_50_outcome_name | foul_committed_type_id | foul_committed_type_name | ball_recovery_offensive | shot_saved_off_target | goalkeeper_shot_saved_off_target | shot_open_goal | dribble_no_touch | bad_behaviour_card_id | bad_behaviour_card_name | half_start_late_video_start | block_save_block | shot_follows_dribble | clearance_other | goalkeeper_shot_saved_to_post | shot_redirect | injury_stoppage_in_chain | shot_saved_to_post | goalkeeper_success_out | goalkeeper_lost_in_play | half_end_early_video_end | player_off_permanent | goalkeeper_saved_to_post | pass_backheel | shot_kick_off | goalkeeper_penalty_saved_to_post | index_y | match_date | kick_off | home_score | away_score | match_status | last_updated | match_week | referee | stadium | competition_competition_id | competition_country_name | competition_competition_name | season_season_id | season_season_name | home_team_home_team_id | home_team_home_team_name | home_team_home_team_gender | home_team_home_team_group | home_team_managers | home_team_country_id | home_team_country_name | away_team_away_team_id | away_team_away_team_name | away_team_away_team_gender | away_team_away_team_group | away_team_managers | away_team_country_id | away_team_country_name | metadata_data_version | metadata_shot_fidelity_version | metadata_xy_fidelity_version | competition_stage_id | competition_stage_name | competition_id | season_id | country_name | competition_name | competition_gender | season_name | match_updated | match_available | team | opponent | full_fixture_date | location_x | location_y | pass_end_location_x | pass_end_location_y | carry_end_location_x | carry_end_location_y | shot_end_location_x | shot_end_location_y | shot_end_location_z | goalkeeper_end_location_x | goalkeeper_end_location_y | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
65648 | 4 | 729957b9-d479-49ab-995f-608a19177be5 | 5 | 1 | 00:00:00.983 | 0 | 0 | 2 | 1.278634 | 30 | Pass | 1 | Arsenal | 9 | From Kick Off | 1 | Arsenal | NaN | NaN | ['1deff0f2-ee63-4951-90ba-f8a8ff399960'] | 60.0, 40.0 | 15512.0 | Sylvain Wiltord | 22.0 | Right Center Forward | 15515.0 | Patrick Vieira | 11.294689 | -2.789040 | 1.0 | Ground Pass | 49.4, 36.1 | 65.0 | Kick Off | 40.0 | Right Foot | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3749493 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 19 | 2003-08-16 | 16:00:00.000 | 2 | 1 | available | 2020-07-29T05:00 | 1 | {'id': 1279, 'name': 'None'} | NaN | 2 | England | Premier League | 44 | 2003/2004 | 1 | Arsenal | male | NaN | NaN | 68 | England | 29 | Everton | male | NaN | NaN | 68 | England | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 2 | 44 | England | Premier League | male | 2003/2004 | 2020-08-31T20:40:28.969635 | 2020-08-31T20:40:28.969635 | Arsenal | Everton | 2003-08-16 Arsenal 2 vs. 1 Everton | 60.0 | 40.0 | 49.4 | 36.1 | nan | NaN | nan | NaN | NaN | nan | NaN |
65649 | 5 | 1deff0f2-ee63-4951-90ba-f8a8ff399960 | 6 | 1 | 00:00:02.262 | 0 | 2 | 2 | NaN | 42 | Ball Receipt* | 1 | Arsenal | 9 | From Kick Off | 1 | Arsenal | NaN | NaN | ['729957b9-d479-49ab-995f-608a19177be5'] | 49.4, 36.1 | 15515.0 | Patrick Vieira | 9.0 | Right Defensive Midfield | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3749493 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 19 | 2003-08-16 | 16:00:00.000 | 2 | 1 | available | 2020-07-29T05:00 | 1 | {'id': 1279, 'name': 'None'} | NaN | 2 | England | Premier League | 44 | 2003/2004 | 1 | Arsenal | male | NaN | NaN | 68 | England | 29 | Everton | male | NaN | NaN | 68 | England | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 2 | 44 | England | Premier League | male | 2003/2004 | 2020-08-31T20:40:28.969635 | 2020-08-31T20:40:28.969635 | Arsenal | Everton | 2003-08-16 Arsenal 2 vs. 1 Everton | 49.4 | 36.1 | nan | NaN | nan | NaN | nan | NaN | NaN | nan | NaN |
65650 | 6 | 1300c0aa-0704-4fcb-a0fd-dc98380ba3c4 | 7 | 1 | 00:00:02.262 | 0 | 2 | 2 | 0.172026 | 43 | Carry | 1 | Arsenal | 9 | From Kick Off | 1 | Arsenal | NaN | NaN | ['1deff0f2-ee63-4951-90ba-f8a8ff399960', 'a6f6... | 49.4, 36.1 | 15515.0 | Patrick Vieira | 9.0 | Right Defensive Midfield | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | 49.0, 35.9 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3749493 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 19 | 2003-08-16 | 16:00:00.000 | 2 | 1 | available | 2020-07-29T05:00 | 1 | {'id': 1279, 'name': 'None'} | NaN | 2 | England | Premier League | 44 | 2003/2004 | 1 | Arsenal | male | NaN | NaN | 68 | England | 29 | Everton | male | NaN | NaN | 68 | England | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 2 | 44 | England | Premier League | male | 2003/2004 | 2020-08-31T20:40:28.969635 | 2020-08-31T20:40:28.969635 | Arsenal | Everton | 2003-08-16 Arsenal 2 vs. 1 Everton | 49.4 | 36.1 | nan | NaN | 49.0 | 35.9 | nan | NaN | NaN | nan | NaN |
65651 | 7 | a6f65e54-2f12-4c52-9868-318ade5adf0b | 8 | 1 | 00:00:02.434 | 0 | 2 | 2 | 2.159856 | 30 | Pass | 1 | Arsenal | 9 | From Kick Off | 1 | Arsenal | NaN | NaN | ['10d578c5-4c81-4563-ad15-eb356ac08ee6'] | 49.0, 35.9 | 15515.0 | Patrick Vieira | 9.0 | Right Defensive Midfield | 40222.0 | Laureano Bisan-Etame Mayer | 33.127180 | 1.658450 | 1.0 | Ground Pass | 46.1, 68.9 | NaN | NaN | 40.0 | Right Foot | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3749493 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 19 | 2003-08-16 | 16:00:00.000 | 2 | 1 | available | 2020-07-29T05:00 | 1 | {'id': 1279, 'name': 'None'} | NaN | 2 | England | Premier League | 44 | 2003/2004 | 1 | Arsenal | male | NaN | NaN | 68 | England | 29 | Everton | male | NaN | NaN | 68 | England | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 2 | 44 | England | Premier League | male | 2003/2004 | 2020-08-31T20:40:28.969635 | 2020-08-31T20:40:28.969635 | Arsenal | Everton | 2003-08-16 Arsenal 2 vs. 1 Everton | 49.0 | 35.9 | 46.1 | 68.9 | nan | NaN | nan | NaN | NaN | nan | NaN |
65652 | 8 | 10d578c5-4c81-4563-ad15-eb356ac08ee6 | 9 | 1 | 00:00:04.593 | 0 | 4 | 2 | NaN | 42 | Ball Receipt* | 1 | Arsenal | 9 | From Kick Off | 1 | Arsenal | NaN | NaN | ['a6f65e54-2f12-4c52-9868-318ade5adf0b'] | 46.1, 68.9 | 40222.0 | Laureano Bisan-Etame Mayer | 2.0 | Right Back | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3749493 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 19 | 2003-08-16 | 16:00:00.000 | 2 | 1 | available | 2020-07-29T05:00 | 1 | {'id': 1279, 'name': 'None'} | NaN | 2 | England | Premier League | 44 | 2003/2004 | 1 | Arsenal | male | NaN | NaN | 68 | England | 29 | Everton | male | NaN | NaN | 68 | England | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 2 | 44 | England | Premier League | male | 2003/2004 | 2020-08-31T20:40:28.969635 | 2020-08-31T20:40:28.969635 | Arsenal | Everton | 2003-08-16 Arsenal 2 vs. 1 Everton | 46.1 | 68.9 | nan | NaN | nan | NaN | nan | NaN | NaN | nan | NaN |
65653 | 9 | 8b68a8cf-7574-4f98-8a34-f12f9171a194 | 10 | 1 | 00:00:04.593 | 0 | 4 | 2 | 0.711508 | 43 | Carry | 1 | Arsenal | 9 | From Kick Off | 1 | Arsenal | NaN | NaN | ['10d578c5-4c81-4563-ad15-eb356ac08ee6', '7a9e... | 46.1, 68.9 | 40222.0 | Laureano Bisan-Etame Mayer | 2.0 | Right Back | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | 46.7, 68.9 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3749493 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 19 | 2003-08-16 | 16:00:00.000 | 2 | 1 | available | 2020-07-29T05:00 | 1 | {'id': 1279, 'name': 'None'} | NaN | 2 | England | Premier League | 44 | 2003/2004 | 1 | Arsenal | male | NaN | NaN | 68 | England | 29 | Everton | male | NaN | NaN | 68 | England | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 2 | 44 | England | Premier League | male | 2003/2004 | 2020-08-31T20:40:28.969635 | 2020-08-31T20:40:28.969635 | Arsenal | Everton | 2003-08-16 Arsenal 2 vs. 1 Everton | 46.1 | 68.9 | nan | NaN | 46.7 | 68.9 | nan | NaN | NaN | nan | NaN |
65654 | 10 | 7a9e4bcf-d6d9-453a-a4ab-c5c19489646b | 11 | 1 | 00:00:05.305 | 0 | 5 | 2 | 1.203699 | 30 | Pass | 1 | Arsenal | 9 | From Kick Off | 1 | Arsenal | NaN | NaN | ['66f3ea0a-ccc5-417a-8134-b9e400a2ba9c'] | 46.7, 68.9 | 40222.0 | Laureano Bisan-Etame Mayer | 2.0 | Right Back | 15754.0 | Fredrik Ljungberg | 9.004998 | 0.523278 | 1.0 | Ground Pass | 54.5, 73.4 | NaN | NaN | 40.0 | Right Foot | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3749493 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 19 | 2003-08-16 | 16:00:00.000 | 2 | 1 | available | 2020-07-29T05:00 | 1 | {'id': 1279, 'name': 'None'} | NaN | 2 | England | Premier League | 44 | 2003/2004 | 1 | Arsenal | male | NaN | NaN | 68 | England | 29 | Everton | male | NaN | NaN | 68 | England | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 2 | 44 | England | Premier League | male | 2003/2004 | 2020-08-31T20:40:28.969635 | 2020-08-31T20:40:28.969635 | Arsenal | Everton | 2003-08-16 Arsenal 2 vs. 1 Everton | 46.7 | 68.9 | 54.5 | 73.4 | nan | NaN | nan | NaN | NaN | nan | NaN |
65655 | 11 | 66f3ea0a-ccc5-417a-8134-b9e400a2ba9c | 12 | 1 | 00:00:06.509 | 0 | 6 | 2 | NaN | 42 | Ball Receipt* | 1 | Arsenal | 9 | From Kick Off | 1 | Arsenal | NaN | NaN | ['7a9e4bcf-d6d9-453a-a4ab-c5c19489646b'] | 54.5, 73.4 | 15754.0 | Fredrik Ljungberg | 12.0 | Right Midfield | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3749493 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 19 | 2003-08-16 | 16:00:00.000 | 2 | 1 | available | 2020-07-29T05:00 | 1 | {'id': 1279, 'name': 'None'} | NaN | 2 | England | Premier League | 44 | 2003/2004 | 1 | Arsenal | male | NaN | NaN | 68 | England | 29 | Everton | male | NaN | NaN | 68 | England | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 2 | 44 | England | Premier League | male | 2003/2004 | 2020-08-31T20:40:28.969635 | 2020-08-31T20:40:28.969635 | Arsenal | Everton | 2003-08-16 Arsenal 2 vs. 1 Everton | 54.5 | 73.4 | nan | NaN | nan | NaN | nan | NaN | NaN | nan | NaN |
65656 | 12 | 02221287-278f-4a3a-be77-3dd0f1fc1d09 | 13 | 1 | 00:00:06.509 | 0 | 6 | 2 | 0.636673 | 43 | Carry | 1 | Arsenal | 9 | From Kick Off | 1 | Arsenal | NaN | NaN | ['66f3ea0a-ccc5-417a-8134-b9e400a2ba9c', 'f8c9... | 54.5, 73.4 | 15754.0 | Fredrik Ljungberg | 12.0 | Right Midfield | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | 54.9, 73.2 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3749493 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 19 | 2003-08-16 | 16:00:00.000 | 2 | 1 | available | 2020-07-29T05:00 | 1 | {'id': 1279, 'name': 'None'} | NaN | 2 | England | Premier League | 44 | 2003/2004 | 1 | Arsenal | male | NaN | NaN | 68 | England | 29 | Everton | male | NaN | NaN | 68 | England | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 2 | 44 | England | Premier League | male | 2003/2004 | 2020-08-31T20:40:28.969635 | 2020-08-31T20:40:28.969635 | Arsenal | Everton | 2003-08-16 Arsenal 2 vs. 1 Everton | 54.5 | 73.4 | nan | NaN | 54.9 | 73.2 | nan | NaN | NaN | nan | NaN |
65657 | 13 | f8c972df-6b67-45de-98e2-87720bb43536 | 14 | 1 | 00:00:07.145 | 0 | 7 | 2 | 1.094971 | 30 | Pass | 1 | Arsenal | 9 | From Kick Off | 1 | Arsenal | NaN | NaN | ['5e5b4022-e7f1-4627-9fcc-49fb1e87cec7'] | 54.9, 73.2 | 15754.0 | Fredrik Ljungberg | 12.0 | Right Midfield | 40221.0 | Gilberto Aparecido da Silva | 10.080674 | -1.381183 | 1.0 | Ground Pass | 56.8, 63.3 | NaN | NaN | 40.0 | Right Foot | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | nan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3749493 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 19 | 2003-08-16 | 16:00:00.000 | 2 | 1 | available | 2020-07-29T05:00 | 1 | {'id': 1279, 'name': 'None'} | NaN | 2 | England | Premier League | 44 | 2003/2004 | 1 | Arsenal | male | NaN | NaN | 68 | England | 29 | Everton | male | NaN | NaN | 68 | England | 1.1.0 | 2.0 | 2.0 | 1 | Regular Season | 2 | 44 | England | Premier League | male | 2003/2004 | 2020-08-31T20:40:28.969635 | 2020-08-31T20:40:28.969635 | Arsenal | Everton | 2003-08-16 Arsenal 2 vs. 1 Everton | 54.9 | 73.2 | 56.8 | 63.3 | nan | NaN | nan | NaN | NaN | nan | NaN |
df_sb_events.shape
(3133322, 207)
# Export DataFrame as a CSV file
if not os.path.exists(os.path.join(data_dir_sb, 'events', 'engineered', 'events.csv')):
df_sb_events.to_csv(os.path.join(data_dir_sb, 'events', 'engineered', 'events.csv'), index=None, header=True)
else:
pass
"""
# Export DataFrame as a CSV file
if not os.path.exists(os.path.join(data_dir_sb, 'export', 'sb_events.csv')):
df_sb_events.to_csv(os.path.join(data_dir_sb, 'export', 'sb_events.csv'), index=None, header=True)
else:
pass
"""
The following DataFrame is the CSV extract used for Tableau dashboarding
df1 = df_sb_events.copy()
df1['df_name'] = 'df1'
df1.head()
df2 = df_sb_events.copy()
df2['df_name'] = 'df2'
df2.head()
df1.head()
df_sb_events_passing = pd.concat([df1, df2])
df_sb_events_passing.shape
df_sb_events_passing['Pass_X'] = np.where(df_sb_events_passing['df_name'] == 'df1', df_sb_events_passing['location_x'], df_sb_events_passing['pass.end_location_x'])
df_sb_events_passing['Pass_Y'] = np.where(df_sb_events_passing['df_name'] == 'df1', df_sb_events_passing['location_y'], df_sb_events_passing['pass.end_location_y'])
df_sb_events_passing.head()
sorted(df_sb_events_passing.columns)
# Export DataFrame as a CSV file
if not os.path.exists(os.path.join(data_dir_sb, 'export', 'sb_wsl_events_passing_matrix.csv')):
df_sb_events_passing.to_csv(os.path.join(data_dir_sb, 'export', 'sb_wsl_events_passing_matrix.csv'), index=None, header=True)
else:
pass
df_sb_pass_network = df_sb_events_passing.copy()
df_sb_pass_network = df_sb_pass_network[df_sb_pass_network['type.name'] == 'Pass']
df_sb_pass_network['player_recipient'] = np.where(df_sb_pass_network['df_name'] == 'df1', df_sb_pass_network['player.name'], df_sb_pass_network['pass.recipient.name'])
df_sb_pass_network.head()
sorted(df_sb_pass_network.columns)
df_sb_pass_network.shape
# Select columns of interest
## Define columns
cols = ['df_name',
'id',
'index',
'competition_name',
'season_name',
'match_date',
'kick_off',
'Full_Fixture_Date',
'Team',
'Opponent',
'home_team.home_team_name',
'away_team.away_team_name',
'home_score',
'away_score',
'player_recipient',
'player.name',
'pass.recipient.name',
'position.id',
'position.name',
'type.name',
'pass.type.name',
'pass.outcome.name',
'location_x',
'location_y',
'pass.end_location_x',
'pass.end_location_y',
'Pass_X',
'Pass_Y'
]
##
df_sb_pass_network_select = df_sb_pass_network[cols]
df_sb_pass_network_select['pass.to.from'] = df_sb_pass_network_select['player.name'] + ' - ' + df_sb_pass_network_select['pass.recipient.name']
# List unique values in the df_sb_pass_network_select['pass.outcome.name'] column
df_sb_pass_network_select['pass.outcome.name'].unique()
df_sb_pass_network_select = df_sb_pass_network_select[df_sb_pass_network_select['pass.outcome.name'].isnull()]
df_sb_pass_network_select.shape
df_sb_pass_network_select = df_sb_pass_network_select.sort_values(['season_name', 'match_date', 'kick_off', 'Full_Fixture_Date', 'index', 'id', 'df_name'], ascending=[True, True, True, True, True, True, True])
df_sb_pass_network_select['Pass_X'] = df_sb_pass_network_select['Pass_X'].astype(str).astype(float)
df_sb_pass_network_select['Pass_Y'] = df_sb_pass_network_select['Pass_Y'].astype(str).astype(float)
df_sb_pass_network_select['location_x'] = df_sb_pass_network_select['location_x'].astype(str).astype(float)
df_sb_pass_network_select['location_y'] = df_sb_pass_network_select['location_y'].astype(str).astype(float)
df_sb_pass_network_select['pass.end_location_x'] = df_sb_pass_network_select['pass.end_location_x'].astype(str).astype(float)
df_sb_pass_network_select['pass.end_location_y'] = df_sb_pass_network_select['pass.end_location_y'].astype(str).astype(float)
df_sb_pass_network_select.dtypes
df_sb_pass_network_select.head()
#
##
df_sb_pass_network_grouped = (df_sb_pass_network_select
.groupby(['competition_name',
'season_name',
'match_date',
'kick_off',
'Full_Fixture_Date',
'Team',
'Opponent',
'home_team.home_team_name',
'away_team.away_team_name',
'home_score',
'away_score',
'pass.to.from',
'player.name',
'pass.recipient.name',
'player_recipient'
])
.agg({'pass.to.from': ['count']
})
)
##
df_sb_pass_network_grouped.columns = df_sb_pass_network_grouped.columns.droplevel(level=0)
##
df_sb_pass_network_grouped = df_sb_pass_network_grouped.reset_index()
##
df_sb_pass_network_grouped.columns = ['competition_name',
'season_name',
'match_date',
'kick_off',
'full_fixture_date',
'team',
'opponent',
'home_team_name',
'away_team_name',
'home_score',
'away_score',
'pass_to_from',
'player_name',
'pass_recipient_name',
'player_recipient',
'count_passes',
]
##
#df_sb_pass_network_grouped['count_passes'] = df_sb_pass_network_grouped['count_passes'] / 2
##
df_sb_pass_network_grouped = df_sb_pass_network_grouped.sort_values(['season_name', 'match_date', 'kick_off', 'full_fixture_date', 'team', 'opponent', 'pass_to_from'], ascending=[True, True, True, True, True, True, True])
##
df_sb_pass_network_grouped.head()
df_sb_pass_network_grouped.shape
# Select columns of interest
## Define columns
cols = ['Full_Fixture_Date',
'player.name',
'position.id',
'position.name',
'Pass_X',
'Pass_Y'
]
##
df_sb_pass_network_avg_pass = df_sb_pass_network_select[cols]
df_sb_pass_network_avg_pass
#
##
df_sb_pass_network_avg_pass_grouped = (df_sb_pass_network_avg_pass
.groupby(['Full_Fixture_Date',
'player.name',
'position.id',
'position.name',
])
.agg({'Pass_X': ['mean'],
'Pass_Y': ['mean']
})
)
##
df_sb_pass_network_avg_pass_grouped.columns = df_sb_pass_network_avg_pass_grouped .columns.droplevel(level=0)
##
df_sb_pass_network_avg_pass_grouped = df_sb_pass_network_avg_pass_grouped.reset_index()
##
df_sb_pass_network_avg_pass_grouped.columns = ['full_fixture_date',
'player_name',
'position_id',
'position_name',
'avg_location_pass_x',
'avg_location_pass_y'
]
##
df_sb_pass_network_avg_pass_grouped['avg_location_pass_x'] = df_sb_pass_network_avg_pass_grouped['avg_location_pass_x'].round(decimals=1)
df_sb_pass_network_avg_pass_grouped['avg_location_pass_y'] = df_sb_pass_network_avg_pass_grouped['avg_location_pass_y'].round(decimals=1)
##
df_sb_pass_network_avg_pass_grouped = df_sb_pass_network_avg_pass_grouped.sort_values(['full_fixture_date', 'player_name'], ascending=[True, True])
##
df_sb_pass_network_avg_pass_grouped.head()
# Join the Events DataFrame to the Matches DataFrame
df_sb_pass_network_final = pd.merge(df_sb_pass_network_grouped, df_sb_pass_network_avg_pass_grouped, left_on=['full_fixture_date', 'player_recipient'], right_on=['full_fixture_date', 'player_name'])
## Rename columns
df_sb_pass_network_final = df_sb_pass_network_final.rename(columns={'player_name_x': 'player_name',
#'player_name_x': 'player_name'
}
)
df_sb_pass_network_final.head()
df_sb_pass_network_final.shape
# Export DataFrame as a CSV file
if not os.path.exists(os.path.join(data_dir_sb, 'export', 'engineered', 'sb_events_passing_network.csv')):
df_sb_pass_network_final.to_csv(os.path.join(data_dir_sb, 'export', 'engineered', 'sb_events_passing_network.csv'), index=None, header=True)
else:
pass
# Export DataFrame as a CSV file
if not os.path.exists(os.path.join(data_dir_sb, 'export', 'engineered', 'sb_events_passing_network.csv')):
df_sb_pass_network_final.to_csv(os.path.join(data_dir, 'export', 'sb_events_passing_network.csv'), index=None, header=True)
else:
pass
# Export
#df_sb_pass_network_final.to_csv(data_dir_sb + '/events/engineered/' + '/sb_events_passing_network_1819_2021_wsl.csv', index=None, header=True)
# Export
#df_sb_pass_network_final.to_csv(data_dir + '/export/' + '/sb_wsl_events_passing_network.csv', index=None, header=True)
# List unique values in the df_sb['type.name'] column
df_sb['type.name'].unique()
The starting XI players and formation can be found in the rows where type.name
is 'Starting XI'.
df_lineup = df_sb[df_sb['type.name'] == 'Starting XI']
df_lineup
# Streamline DataFrame to include just the columns of interest
## Define columns
cols = ['id', 'type.name', 'match_date', 'kick_off', 'Full_Fixture_Date', 'team.id', 'team.name', 'tactics.formation', 'tactics.lineup', 'competition_name', 'season_name', 'home_team.home_team_name', 'away_team.away_team_name', 'Team', 'Opponent', 'home_score', 'away_score']
## Select only columns of interest
df_lineup_select = df_lineup[cols]
df_lineup_select
We can see from the extracted lineup data so far. To get the stating XI players, we need to breakdown the tactics.lineup
attribute.
# Normalize tactics.lineup - see: https://stackoverflow.com/questions/52795561/flattening-nested-json-in-pandas-data-frame
## explode all columns with lists of dicts
df_lineup_select_normalize = df_lineup_select.apply(lambda x: x.explode()).reset_index(drop=True)
## list of columns with dicts
cols_to_normalize = ['tactics.lineup']
## if there are keys, which will become column names, overlap with excising column names. add the current column name as a prefix
normalized = list()
for col in cols_to_normalize:
d = pd.json_normalize(df_lineup_select_normalize[col], sep='_')
d.columns = [f'{col}_{v}' for v in d.columns]
normalized.append(d.copy())
## combine df with the normalized columns
df_lineup_select_normalize = pd.concat([df_lineup_select_normalize] + normalized, axis=1).drop(columns=cols_to_normalize)
## display(df_lineup_select_normalize)
df_lineup_select_normalize.head(30)
df_lineup_engineered = df_lineup_select_normalize
# Streamline DataFrame to include just the columns of interest
## Define columns
cols = ['id', 'match_date', 'kick_off', 'Full_Fixture_Date', 'type.name', 'season_name', 'competition_name', 'home_team.home_team_name', 'away_team.away_team_name', 'Team', 'Opponent', 'home_score', 'away_score', 'tactics.formation', 'tactics.lineup_jersey_number', 'tactics.lineup_position_id', 'tactics.lineup_player_name', 'tactics.lineup_position_name']
## Select only columns of interest
df_lineup_engineered_select = df_lineup_engineered[cols]
df_lineup_engineered_select['tactics.formation'] = df_lineup_engineered_select['tactics.formation'].astype('Int64')
df_lineup_engineered_select['tactics.lineup_jersey_number'] = df_lineup_engineered_select['tactics.lineup_jersey_number'].astype('Int64')
df_lineup_engineered_select.head(5)
df_lineup_engineered_select.columns
## Rename columns
df_lineup_engineered_select = df_lineup_engineered_select.rename(columns={'id': 'Match_Id',
'match_date': 'Match_Date',
'kick_off': 'Kick_Off',
'type.name': 'Type_Name',
'season_name': 'Season',
'competition_name': 'Competition',
'home_team.home_team_name': 'Home_Team',
'away_team.away_team_name': 'Away_Team',
'home_score': 'Home_Score',
'away_score': 'Away_Score',
'tactics.formation': 'Formation',
'tactics.lineup_jersey_number': 'Shirt_Number',
'tactics.lineup_position_id': 'Position_Number',
'tactics.lineup_player_name': 'Player_Name',
'tactics.lineup_position_name': 'Position_Name'
}
)
## Display DataFrame
df_lineup_engineered_select.head()
# Convert Match_Date from string to datetime64[ns]
df_lineup_engineered_select['Match_Date']= pd.to_datetime(df_lineup_engineered_select['Match_Date'])
"""
# THIS IS NOT WORKING ATM
# Convert Kick_Off from string to datetime64[ns]
df_lineup_engineered_select['Kick_Off']= pd.to_datetime(df_lineup_engineered_select['Kick_Off'], format='%H:%M', errors='ignore')
df_lineup_engineered_select['Kick_Off'] = df_lineup_engineered_select['Kick_Off'].dt.time
"""
df_lineup_engineered_select.dtypes
# Put hyphens between numbers in Formation attribute
## Convert Formation attribute from Integer to String
df_lineup_engineered_select['Formation'] = df_lineup_engineered_select['Formation'].astype(str)
## Define custom function to add hyphen between letters: StackOverflow: https://stackoverflow.com/questions/29382285/python-making-a-function-that-would-add-between-letters
def f(s):
m = s[0]
for i in s[1:]:
m += '-' + i
return m
## Apply custom function
df_lineup_engineered_select['Formation'] = df_lineup_engineered_select.apply(lambda row: f(row['Formation']),axis=1)
lst_formation = df_lineup_engineered_select['Formation'].unique().tolist()
lst_formation
df_formations_coords = pd.read_csv(data_dir_sb + '/sb_formation_coordinates.csv')
#df_formations_coords['Id'] = df_formations_coords['Id'].astype('Int8')
#df_formations_coords['Player_Number'] = df_formations_coords['Player_Number'].astype('Int8')
df_lineup_engineered_select = pd.merge(df_lineup_engineered_select, df_formations_coords, how='left', left_on=['Formation', 'Position_Number'], right_on=['Formation', 'Player_Number'])
#df_lineup_engineered_select = df_lineup_engineered_select.drop(['Player_Number'], axis=1)
df_lineup_engineered_select = df_lineup_engineered_select.drop(['Id'], axis=1)
df_lineup_engineered_select = df_lineup_engineered_select.drop(['Player_Position'], axis=1)
df_lineup_engineered_select.head()
# Select columns of interest
## Define columns
cols = ['Match_Date',
'Competition',
'Full_Fixture_Date',
'Team',
'Formation'
]
##
df_lineup_opponent = df_lineup_engineered_select[cols]
##
df_lineup_opponent = df_lineup_opponent.drop_duplicates()
##
df_lineup_opponent.head()
# Join DataFrame to itself on 'Date', 'Fixture', 'Team'/'Opponent', and 'Event', to join Team and Opponent together
df_lineup_engineered_opponent_select = pd.merge(df_lineup_engineered_select, df_lineup_opponent, how='left', left_on=['Match_Date', 'Competition', 'Full_Fixture_Date', 'Opponent'], right_on = ['Match_Date', 'Competition', 'Full_Fixture_Date', 'Team'])
# Clean Data
## Drop columns
df_lineup_engineered_opponent_select = df_lineup_engineered_opponent_select.drop(columns=['Team_y'])
## Rename columns
df_lineup_engineered_opponent_select = df_lineup_engineered_opponent_select.rename(columns={'Team_x': 'Team',
'Formation_x': 'Formation',
'Formation_y': 'Opponent_Formation'
}
)
## Display DataFrame
df_lineup_engineered_opponent_select.head()
# Export
#df_lineup_engineered_opponent_select.to_csv(data_dir_sb + '/lineups/engineered/' + '/sb_lineups_1819_2021_wsl.csv', index=None, header=True)
# Export
#df_lineup_engineered_opponent_select.to_csv(data_dir + '/export/' + '/sb_wsl_lineups.csv', index=None, header=True)
df_tactics = df_sb[df_sb['type.name'] == 'Tactical Shift']
df_tactics
# Select columns of interest
##
cols = ['id', 'type.name', 'team.id', 'team.name', 'tactics.formation', 'tactics.lineup']
##
df_tactics_select = df_tactics[cols]
df_tactics_select
# Normalize tactics.lineup - see: https://stackoverflow.com/questions/52795561/flattening-nested-json-in-pandas-data-frame
## explode all columns with lists of dicts
df_tactics_select_normalize = df_tactics_select.apply(lambda x: x.explode()).reset_index(drop=True)
## list of columns with dicts
cols_to_normalize = ['tactics.lineup']
## if there are keys, which will become column names, overlap with excising column names. add the current column name as a prefix
normalized = list()
for col in cols_to_normalize:
d = pd.json_normalize(df_tactics_select_normalize[col], sep='_')
d.columns = [f'{col}_{v}' for v in d.columns]
normalized.append(d.copy())
## combine df with the normalized columns
df_tactics_select_normalize = pd.concat([df_tactics_select_normalize] + normalized, axis=1).drop(columns=cols_to_normalize)
## display(df_lineup_select_normalize)
df_tactics_select_normalize.head(10)
df_half = df_sb[df_sb['type.name'] == 'Half Start']
df_half
# Export
#df_sb.to_csv(data_dir_sb + '/combined/raw/csv/wsl/' + '/df_sb_combined_data_wsl.csv', index=None, header=True)
This notebook engineers previous parsed Event data drom StatsBomb data using pandas for data manipulation through DataFrames.
The step is to take the engineered dataset created in this notebook that is now ready for use in projects including Expected Goals (xG) models and Tableau visualisations.
*Visit my website EddWebster.com or my GitHub Repository for more projects. If you'd like to get in contact, my Twitter handle is @eddwebster and my email is: edd.j.webster@gmail.com.*