{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Opta Data Engineering\n",
"##### Notebook to engineer [Opta data](https://www.statsperform.com/opta/) by [Stats Perform](https://www.statsperform.com/) Event data using [pandas](http://pandas.pydata.org/).\n",
"\n",
"### By [Edd Webster](https://www.twitter.com/eddwebster)\n",
"Notebook first written: 20/01/2022 \n",
"Notebook last updated: 01/02/2022\n",
"\n",
"![Opta](../../img/logos/opta_sports_logo_small.png)\n",
"\n",
"![Stats Perform](../../img/logos/stats_perform_logo_small.png)\n",
"\n",
"![Watford F.C.](../../img/club_badges/premier_league/watford_fc_logo_small.png)\n",
"\n",
"Click [here](#section4) to jump straight into the Data Engineering section and skip the [Notebook Brief](#section2) and [Data Sources](#section3) sections."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"___\n",
"\n",
"\n",
"## Introduction\n",
"This notebook engineers a parsed F24 and F7 [Opta data](https://www.statsperform.com/opta/) by [Stats Perform](https://www.statsperform.com/) that have been provided by [Watford F.C](https://www.watfordfc.com/), using [pandas](http://pandas.pydata.org/) for data manipulation through DataFrames.\n",
"\n",
"For more information about this notebook and the author, I am available through all the following channels:\n",
"* [eddwebster.com](https://www.eddwebster.com/);\n",
"* edd.j.webster@gmail.com;\n",
"* [@eddwebster](https://www.twitter.com/eddwebster);\n",
"* [linkedin.com/in/eddwebster](https://www.linkedin.com/in/eddwebster/);\n",
"* [github/eddwebster](https://github.com/eddwebster/); and\n",
"* [public.tableau.com/profile/edd.webster](https://public.tableau.com/profile/edd.webster).\n",
"\n",
"A static version of this notebook can be found [here](https://nbviewer.org/github/eddwebster/watford/blob/main/notebooks/2_data_engineering/Opta%20Data%20Engineering.ipynb). This notebook has an accompanying [`watford`](https://github.com/eddwebster/watford) GitHub repository and for my full repository of football analysis, see my [`football_analysis`](https://github.com/eddwebster/football_analytics) GitHub repository."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"___\n",
"\n",
"## Notebook Contents\n",
"1. [Notebook Dependencies](#section1) \n",
"2. [Notebook Brief](#section2) \n",
"3. [Data Sources](#section3) \n",
" 1. [Introduction](#section3.1) \n",
" 2. [Read in the Datasets](#section3.2) \n",
" 3. [Initial Data Handling](#section3.3) \n",
"4. [Data Engineering](#section4) \n",
" 1. [Assign Raw DataFrame to Engineered DataFrame](#section4.1) \n",
" 2. [Rename Columns](#section4.2) \n",
" 3. [Drop Duplicate Columns](#section4.3) \n",
" 4. [Sort the DataFrame](#section4.4) \n",
" 3. [Determine Each Player's Most Frequent Position](#section4.3) \n",
" 6. [Determine Each Player's Total Minutes Played](#section4.6) \n",
" 7. [Break Down All location Attributes](#section4.7) \n",
"5. [Summary](#section5) \n",
"6. [Next Steps](#section6) \n",
"7. [References](#section7) "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"___\n",
"\n",
"\n",
"\n",
"## 1. Notebook Dependencies\n",
"\n",
"This notebook was written using [Python 3](https://docs.python.org/3.7/) and requires the following libraries:\n",
"* [`Jupyter notebooks`](https://jupyter.org/) for this notebook environment with which this project is presented;\n",
"* [`NumPy`](http://www.numpy.org/) for multidimensional array computing; and\n",
"* [`pandas`](http://pandas.pydata.org/) for data analysis and manipulation.\n",
"\n",
"All packages used for this notebook can be obtained by downloading and installing the [Conda](https://anaconda.org/anaconda/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](https://medium.com/@GalarnykMichael/install-python-on-windows-anaconda-c63c7c3d1444) and Mac [here](https://medium.com/@GalarnykMichael/install-python-on-mac-anaconda-ccd9f2014072), as well as in the Anaconda documentation itself [here](https://docs.anaconda.com/anaconda/install/)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Import Libraries and Modules"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Setup Complete\n"
]
}
],
"source": [
"# Python ≥3.5 (ideally)\n",
"import platform\n",
"import sys, getopt\n",
"assert sys.version_info >= (3, 5)\n",
"import csv\n",
"\n",
"# Import Dependencies\n",
"%matplotlib inline\n",
"\n",
"# Math Operations\n",
"import numpy as np\n",
"from math import pi\n",
"\n",
"# Datetime\n",
"import datetime\n",
"from datetime import date\n",
"import time\n",
"\n",
"# Data Preprocessing\n",
"import pandas as pd\n",
"import pandas_profiling as pp\n",
"import os\n",
"import re\n",
"import chardet\n",
"import random\n",
"from io import BytesIO\n",
"from pathlib import Path\n",
"\n",
"# Reading Directories\n",
"import glob\n",
"import os\n",
"\n",
"# Working with JSON\n",
"import json\n",
"from pandas import json_normalize\n",
"\n",
"# Data Visualisation\n",
"import matplotlib as mpl\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import missingno as msno\n",
"\n",
"# Requests and downloads\n",
"import tqdm\n",
"import requests\n",
"\n",
"# Machine Learning\n",
"import scipy as sp\n",
"import scipy.spatial\n",
"from scipy.spatial import distance\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"import sklearn.metrics as sk_metrics\n",
"from sklearn.metrics import log_loss, brier_score_loss, roc_auc_score , roc_curve, average_precision_score\n",
"from sklearn.model_selection import train_test_split, KFold, cross_val_score, GridSearchCV, RandomizedSearchCV\n",
"from sklearn.linear_model import LogisticRegression\n",
"from scikitplot.metrics import plot_roc_curve, plot_precision_recall_curve, plot_calibration_curve\n",
"import pickle\n",
"from xgboost import XGBClassifier\n",
"\n",
"# Display in Jupyter\n",
"from IPython.display import Image, YouTubeVideo\n",
"from IPython.core.display import HTML\n",
"\n",
"# Ignore Warnings\n",
"import warnings\n",
"warnings.filterwarnings(action=\"ignore\", message=\"^internal gelsd\")\n",
"\n",
"# Print message\n",
"print(\"Setup Complete\")"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Python: 3.7.6\n",
"NumPy: 1.19.1\n",
"pandas: 1.1.3\n",
"matplotlib: 3.3.1\n"
]
}
],
"source": [
"# Python / module versions used here for reference\n",
"print('Python: {}'.format(platform.python_version()))\n",
"print('NumPy: {}'.format(np.__version__))\n",
"print('pandas: {}'.format(pd.__version__))\n",
"print('matplotlib: {}'.format(mpl.__version__))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Defined Filepaths"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# Set up initial paths to subfolders\n",
"base_dir = os.path.join('..', '..')\n",
"data_dir = os.path.join(base_dir, 'data')\n",
"data_dir_second_spectrum = os.path.join(base_dir, 'data', 'second_spectrum')\n",
"data_dir_opta = os.path.join(base_dir, 'data', 'opta')\n",
"scripts_dir = os.path.join(base_dir, 'scripts')\n",
"scripts_dir_second_spectrum = os.path.join(base_dir, 'scripts', 'second_spectrum')\n",
"scripts_dir_metrica_sports = os.path.join(base_dir, 'scripts', 'metrica_sports')\n",
"models_dir = os.path.join(base_dir, 'models')\n",
"img_dir = os.path.join(base_dir, 'img')\n",
"fig_dir = os.path.join(base_dir, 'img', 'fig')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Create Directory Structure"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\"\\n# Make the directory structure\\nfor folder in ['combined', 'competitions', 'events', 'tactics', 'lineups', 'three-sixty']:\\n path = os.path.join(data_dir, 'raw', folder)\\n if not os.path.exists(path):\\n os.mkdir(path)\\n\""
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\"\"\"\n",
"# Make the directory structure\n",
"for folder in ['combined', 'competitions', 'events', 'tactics', 'lineups', 'three-sixty']:\n",
" path = os.path.join(data_dir, 'raw', folder)\n",
" if not os.path.exists(path):\n",
" os.mkdir(path)\n",
"\"\"\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Custom Functions"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# ADD CODE HERE IF REQUIRED"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Notebook Settings"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"# Display all columns of displayed pandas DataFrames\n",
"pd.set_option('display.max_columns', None)\n",
"#pd.set_option('display.max_rows', None)\n",
"pd.options.mode.chained_assignment = None"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"\n",
"\n",
"## 2. Notebook Brief\n",
"This notebook parses and engineers [Opta data](https://www.statsperform.com/opta/) by [Stats Perform](https://www.statsperform.com/) ... using [pandas](http://pandas.pydata.org/).\n",
"\n",
"\n",
"**Notebook Conventions**: \n",
"* Variables that refer a `DataFrame` object are prefixed with `df_`.\n",
"* Variables that refer to a collection of `DataFrame` objects (e.g., a list, a set or a dict) are prefixed with `dfs_`."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"\n",
"\n",
"## 3. Data Sources"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"### 3.1. Introduction\n",
"[Opta data](https://www.statsperform.com/opta/) by [Stats Perform](https://www.statsperform.com/) is... football analytics, data provider ... \n",
"\n",
"F24 data is... F7 data is...\n",
"\n",
"![Opta](../../img/logos/opta_sports_logo_small.png)\n",
"\n",
"![Stats Perform](../../img/logos/stats_perform_logo_small.png)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"### 3.2. Import Data\n",
"The following cells read in previously parsed `XML` files that have been saved as `CSV` files, using [FC.rSTATS](https://twitter.com/FC_rstats)'s `parse_f24` and `parse_f7` functions (see the following for more info [[link](http://www.fcrstats.com/fcrstats_package.html)]). These `CSV` files are read in as [pandas](https://pandas.pydata.org/) DataFrames."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"#### 3.2.1. F7 Files\n",
"The each of the two parsed F7 data has been save into the following four files:\n",
"* Game data\n",
"* Players data\n",
"* Goals data\n",
"* Bookings data\n",
"\n",
"Two matches are available. There are therefore are 8 F7 files to import in total."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['../../data/opta/raw/F7/srml-8-2021-f2210324-matchresults-bookings.csv', '../../data/opta/raw/F7/srml-8-2021-f2210324-matchresults-goals.csv', '../../data/opta/raw/F7/srml-8-2021-f2210334-matchresults-players.csv', '../../data/opta/raw/F7/srml-8-2021-f2210334-matchresults-bookings.csv', '../../data/opta/raw/F7/srml-8-2021-f2210324-matchresults-gamedata.csv', '../../data/opta/raw/F7/srml-8-2021-f2210334-matchresults-goals.csv', '../../data/opta/raw/F7/srml-8-2021-f2210324-matchresults-players.csv', '../../data/opta/raw/F7/srml-8-2021-f2210334-matchresults-gamedata.csv']\n"
]
}
],
"source": [
"# Show files in directory\n",
"print(glob.glob(os.path.join(data_dir_opta, 'raw', 'F7/*.csv')))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The two datasets provided are for the following matches:\n",
"* [27/09/2021: Crystal Palace (1) vs. (1) Brighton & Hove Albion](https://www.bbc.co.uk/sport/football/58620544) (f2210324)\n",
"* [03/10/2021: Crystal Palace (2) vs. (2) Leicester City](https://www.bbc.co.uk/sport/football/58667896) (f2210334)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"# Import CSV files as pandas DataFrames\n",
"\n",
"## 27/09/2021: Crystal Palace (1) vs. (1) Brighton & Hove Albion (f2210324)\n",
"df_cry_bri_game_raw = pd.read_csv(os.path.join(data_dir_opta, 'raw', 'F7', 'srml-8-2021-f2210324-matchresults-gamedata.csv'))\n",
"df_cry_bri_players_raw = pd.read_csv(os.path.join(data_dir_opta, 'raw', 'F7', 'srml-8-2021-f2210324-matchresults-players.csv'))\n",
"df_cry_bri_goals_raw = pd.read_csv(os.path.join(data_dir_opta, 'raw', 'F7', 'srml-8-2021-f2210324-matchresults-goals.csv'))\n",
"df_cry_bri_bookings_raw = pd.read_csv(os.path.join(data_dir_opta, 'raw', 'F7', 'srml-8-2021-f2210324-matchresults-bookings.csv'))\n",
"\n",
"## 03/10/2021: Crystal Palace (2) vs. (2) Leicester City (f2210334)\n",
"df_cry_lei_game_raw = pd.read_csv(os.path.join(data_dir_opta, 'raw', 'F7', 'srml-8-2021-f2210334-matchresults-gamedata.csv'))\n",
"df_cry_lei_players_raw = pd.read_csv(os.path.join(data_dir_opta, 'raw', 'F7', 'srml-8-2021-f2210334-matchresults-players.csv'))\n",
"df_cry_lei_goals_raw = pd.read_csv(os.path.join(data_dir_opta, 'raw', 'F7', 'srml-8-2021-f2210334-matchresults-goals.csv'))\n",
"df_cry_lei_bookings_raw = pd.read_csv(os.path.join(data_dir_opta, 'raw', 'F7', 'srml-8-2021-f2210334-matchresults-bookings.csv'))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"#### 3.2.2. F24 Files\n",
"Each of the two matches has a single Event file. There are therefore 2 F24 files to import in total."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['../../data/opta/raw/F24/f24-8-2021-2210334-eventdetails.csv', '../../data/opta/raw/F24/f24-8-2021-2210324-eventdetails.csv']\n"
]
}
],
"source": [
"# Show files in directory\n",
"print(glob.glob(os.path.join(data_dir_opta, 'raw', 'F24/*.csv')))"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"# Import CSV files as pandas DataFrames\n",
"\n",
"## 27/09/2021: Crystal Palace (1) vs. (1) Brighton & Hove Albion (f2210324)\n",
"df_cry_bri_events_raw = pd.read_csv(os.path.join(data_dir_opta, 'raw', 'F24', 'f24-8-2021-2210324-eventdetails.csv'))\n",
"\n",
"## 03/10/2021: Crystal Palace (2) vs. (2) Leicester City (f2210334)\n",
"df_cry_lei_events_raw = pd.read_csv(os.path.join(data_dir_opta, 'raw', 'F24', 'f24-8-2021-2210334-eventdetails.csv'))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"### 3.3. Initial Data Handling\n",
"To avoid duplication commands, this section just goes through the first of the two Event files, [Crystal Palace vs. Leicester City](https://www.bbc.co.uk/sport/football/58620544) (f2210334).\n",
"\n",
"First check the quality of the dataset by looking first and last rows in pandas using the [`head()`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.head.html) and [`tail()`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.tail.html) methods."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Unnamed: 0
\n",
"
id
\n",
"
event_id
\n",
"
type_id
\n",
"
period_id
\n",
"
min
\n",
"
sec
\n",
"
team_id
\n",
"
outcome
\n",
"
x
\n",
"
y
\n",
"
timestamp
\n",
"
last_modified
\n",
"
version
\n",
"
player_id
\n",
"
keypass
\n",
"
assist
\n",
"
1
\n",
"
102
\n",
"
103
\n",
"
107
\n",
"
108
\n",
"
123
\n",
"
124
\n",
"
127
\n",
"
13
\n",
"
130
\n",
"
131
\n",
"
139
\n",
"
140
\n",
"
141
\n",
"
144
\n",
"
145
\n",
"
146
\n",
"
147
\n",
"
15
\n",
"
152
\n",
"
153
\n",
"
154
\n",
"
155
\n",
"
156
\n",
"
157
\n",
"
167
\n",
"
168
\n",
"
17
\n",
"
170
\n",
"
173
\n",
"
174
\n",
"
177
\n",
"
178
\n",
"
179
\n",
"
18
\n",
"
180
\n",
"
182
\n",
"
183
\n",
"
185
\n",
"
189
\n",
"
194
\n",
"
196
\n",
"
197
\n",
"
199
\n",
"
2
\n",
"
20
\n",
"
209
\n",
"
21
\n",
"
210
\n",
"
211
\n",
"
212
\n",
"
213
\n",
"
214
\n",
"
215
\n",
"
22
\n",
"
223
\n",
"
224
\n",
"
225
\n",
"
227
\n",
"
228
\n",
"
229
\n",
"
230
\n",
"
231
\n",
"
233
\n",
"
236
\n",
"
237
\n",
"
24
\n",
"
240
\n",
"
241
\n",
"
25
\n",
"
250
\n",
"
255
\n",
"
256
\n",
"
257
\n",
"
259
\n",
"
265
\n",
"
279
\n",
"
285
\n",
"
286
\n",
"
287
\n",
"
29
\n",
"
292
\n",
"
293
\n",
"
294
\n",
"
295
\n",
"
3
\n",
"
30
\n",
"
302
\n",
"
31
\n",
"
328
\n",
"
346
\n",
"
347
\n",
"
363
\n",
"
374
\n",
"
375
\n",
"
376
\n",
"
377
\n",
"
378
\n",
"
383
\n",
"
384
\n",
"
385
\n",
"
386
\n",
"
387
\n",
"
388
\n",
"
389
\n",
"
391
\n",
"
392
\n",
"
393
\n",
"
395
\n",
"
396
\n",
"
397
\n",
"
399
\n",
"
4
\n",
"
406
\n",
"
41
\n",
"
42
\n",
"
44
\n",
"
458
\n",
"
46
\n",
"
47
\n",
"
49
\n",
"
5
\n",
"
53
\n",
"
55
\n",
"
56
\n",
"
57
\n",
"
59
\n",
"
6
\n",
"
63
\n",
"
64
\n",
"
65
\n",
"
7
\n",
"
72
\n",
"
73
\n",
"
74
\n",
"
75
\n",
"
76
\n",
"
78
\n",
"
80
\n",
"
81
\n",
"
82
\n",
"
83
\n",
"
88
\n",
"
89
\n",
"
94
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
1
\n",
"
2338644647
\n",
"
1
\n",
"
34
\n",
"
16
\n",
"
0
\n",
"
0
\n",
"
13
\n",
"
1
\n",
"
0.0
\n",
"
0.0
\n",
"
2021-10-03T13:00:03.370
\n",
"
2021-10-03T14:00:20
\n",
"
1633266020074
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
2.0
\n",
"
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 0, 0, 0,...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
17745.0
\n",
"
NaN
\n",
"
4973.0
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
17745, 166477, 40146, 197469, 218031, 93100, 2...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
1, 2, 2, 3, 2, 2, 3, 3, 4, 4, 3, 5, 5, 5, 5, 5...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
1, 27, 5, 20, 4, 23, 37, 8, 9, 14, 7, 10, 11, ...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
"
\n",
"
1
\n",
"
2
\n",
"
2338644677
\n",
"
1
\n",
"
34
\n",
"
16
\n",
"
0
\n",
"
0
\n",
"
31
\n",
"
1
\n",
"
0.0
\n",
"
0.0
\n",
"
2021-10-03T13:00:06.394
\n",
"
2021-10-03T13:54:21
\n",
"
1633265661489
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
4.0
\n",
"
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 0, 0, 0,...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
66975.0
\n",
"
NaN
\n",
"
406.0
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
40836, 55494, 244723, 66975, 174874, 209036, 2...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
1, 2, 2, 3, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
13, 2, 3, 4, 16, 6, 23, 18, 22, 9, 11, 1, 5, 7...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
"
\n",
"
2
\n",
"
3
\n",
"
2338696239
\n",
"
2
\n",
"
32
\n",
"
1
\n",
"
0
\n",
"
0
\n",
"
31
\n",
"
1
\n",
"
0.0
\n",
"
0.0
\n",
"
2021-10-03T14:00:24.495
\n",
"
2021-10-03T22:13:38
\n",
"
1633295617200
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
Right to Left
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
"
\n",
"
3
\n",
"
4
\n",
"
2338696245
\n",
"
2
\n",
"
32
\n",
"
1
\n",
"
0
\n",
"
0
\n",
"
13
\n",
"
1
\n",
"
0.0
\n",
"
0.0
\n",
"
2021-10-03T14:00:24.495
\n",
"
2021-10-03T22:13:39
\n",
"
1633295617265
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
Left to Right
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
"
\n",
"
4
\n",
"
5
\n",
"
2338696299
\n",
"
3
\n",
"
1
\n",
"
1
\n",
"
0
\n",
"
0
\n",
"
31
\n",
"
1
\n",
"
50.2
\n",
"
50.0
\n",
"
2021-10-03T14:00:24.576
\n",
"
2021-10-03T22:27:55
\n",
"
1633296474956
\n",
"
50471.0
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
33.1
\n",
"
49.0
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
-1.0
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
18.0
\n",
"
3.2
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
S
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
Back
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Unnamed: 0 id event_id type_id period_id min sec team_id \\\n",
"0 1 2338644647 1 34 16 0 0 13 \n",
"1 2 2338644677 1 34 16 0 0 31 \n",
"2 3 2338696239 2 32 1 0 0 31 \n",
"3 4 2338696245 2 32 1 0 0 13 \n",
"4 5 2338696299 3 1 1 0 0 31 \n",
"\n",
" outcome x y timestamp last_modified \\\n",
"0 1 0.0 0.0 2021-10-03T13:00:03.370 2021-10-03T14:00:20 \n",
"1 1 0.0 0.0 2021-10-03T13:00:06.394 2021-10-03T13:54:21 \n",
"2 1 0.0 0.0 2021-10-03T14:00:24.495 2021-10-03T22:13:38 \n",
"3 1 0.0 0.0 2021-10-03T14:00:24.495 2021-10-03T22:13:39 \n",
"4 1 50.2 50.0 2021-10-03T14:00:24.576 2021-10-03T22:27:55 \n",
"\n",
" version player_id keypass assist 1 102 103 107 108 123 \\\n",
"0 1633266020074 NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1 1633265661489 NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"2 1633295617200 NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"3 1633295617265 NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"4 1633296474956 50471.0 NaN NaN NaN NaN NaN NaN NaN NaN \n",
"\n",
" 124 127 13 130 \\\n",
"0 NaN NaN NaN 2.0 \n",
"1 NaN NaN NaN 4.0 \n",
"2 NaN Right to Left NaN NaN \n",
"3 NaN Left to Right NaN NaN \n",
"4 NaN NaN NaN NaN \n",
"\n",
" 131 139 140 141 144 \\\n",
"0 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 0, 0, 0,... NaN NaN NaN NaN \n",
"1 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 0, 0, 0,... NaN NaN NaN NaN \n",
"2 NaN NaN NaN NaN NaN \n",
"3 NaN NaN NaN NaN NaN \n",
"4 NaN NaN 33.1 49.0 NaN \n",
"\n",
" 145 146 147 15 152 153 154 155 156 157 167 168 17 170 173 \\\n",
"0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"4 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"\n",
" 174 177 178 179 18 180 182 183 185 189 194 196 197 199 \\\n",
"0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 17745.0 NaN 4973.0 NaN \n",
"1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 66975.0 NaN 406.0 NaN \n",
"2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"4 NaN NaN -1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"\n",
" 2 20 209 21 210 211 212 213 214 215 22 223 224 225 \\\n",
"0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"4 NaN NaN NaN NaN NaN NaN 18.0 3.2 NaN NaN NaN NaN NaN NaN \n",
"\n",
" 227 228 229 230 231 233 \\\n",
"0 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0... NaN NaN NaN NaN NaN \n",
"1 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0... NaN NaN NaN NaN NaN \n",
"2 NaN NaN NaN NaN NaN NaN \n",
"3 NaN NaN NaN NaN NaN NaN \n",
"4 NaN NaN NaN NaN NaN NaN \n",
"\n",
" 236 237 24 240 241 25 250 255 256 257 259 265 279 285 286 \\\n",
"0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"4 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN S NaN NaN \n",
"\n",
" 287 29 292 293 294 295 3 \\\n",
"0 NaN NaN NaN NaN NaN NaN NaN \n",
"1 NaN NaN NaN NaN NaN NaN NaN \n",
"2 NaN NaN NaN NaN NaN NaN NaN \n",
"3 NaN NaN NaN NaN NaN NaN NaN \n",
"4 NaN NaN NaN NaN NaN NaN NaN \n",
"\n",
" 30 302 31 328 346 347 \\\n",
"0 17745, 166477, 40146, 197469, 218031, 93100, 2... NaN NaN NaN NaN NaN \n",
"1 40836, 55494, 244723, 66975, 174874, 209036, 2... NaN NaN NaN NaN NaN \n",
"2 NaN NaN NaN NaN NaN NaN \n",
"3 NaN NaN NaN NaN NaN NaN \n",
"4 NaN NaN NaN NaN NaN NaN \n",
"\n",
" 363 374 375 376 377 378 383 384 385 386 387 388 389 391 392 \\\n",
"0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"4 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"\n",
" 393 395 396 397 399 4 406 41 42 \\\n",
"0 NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1 NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"2 NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"3 NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"4 NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"\n",
" 44 458 46 47 49 5 53 \\\n",
"0 1, 2, 2, 3, 2, 2, 3, 3, 4, 4, 3, 5, 5, 5, 5, 5... NaN NaN NaN NaN NaN NaN \n",
"1 1, 2, 2, 3, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5... NaN NaN NaN NaN NaN NaN \n",
"2 NaN NaN NaN NaN NaN NaN NaN \n",
"3 NaN NaN NaN NaN NaN NaN NaN \n",
"4 NaN NaN NaN NaN NaN NaN NaN \n",
"\n",
" 55 56 57 59 6 63 \\\n",
"0 NaN NaN NaN 1, 27, 5, 20, 4, 23, 37, 8, 9, 14, 7, 10, 11, ... NaN NaN \n",
"1 NaN NaN NaN 13, 2, 3, 4, 16, 6, 23, 18, 22, 9, 11, 1, 5, 7... NaN NaN \n",
"2 NaN NaN NaN NaN NaN NaN \n",
"3 NaN NaN NaN NaN NaN NaN \n",
"4 NaN Back NaN NaN NaN NaN \n",
"\n",
" 64 65 7 72 73 74 75 76 78 80 81 82 83 88 89 94 \n",
"0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"4 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN "
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Display the first five rows of the DataFrame, df_cry_lei_events_raw\n",
"df_cry_lei_events_raw.head()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Unnamed: 0
\n",
"
id
\n",
"
event_id
\n",
"
type_id
\n",
"
period_id
\n",
"
min
\n",
"
sec
\n",
"
team_id
\n",
"
outcome
\n",
"
x
\n",
"
y
\n",
"
timestamp
\n",
"
last_modified
\n",
"
version
\n",
"
player_id
\n",
"
keypass
\n",
"
assist
\n",
"
1
\n",
"
102
\n",
"
103
\n",
"
107
\n",
"
108
\n",
"
123
\n",
"
124
\n",
"
127
\n",
"
13
\n",
"
130
\n",
"
131
\n",
"
139
\n",
"
140
\n",
"
141
\n",
"
144
\n",
"
145
\n",
"
146
\n",
"
147
\n",
"
15
\n",
"
152
\n",
"
153
\n",
"
154
\n",
"
155
\n",
"
156
\n",
"
157
\n",
"
167
\n",
"
168
\n",
"
17
\n",
"
170
\n",
"
173
\n",
"
174
\n",
"
177
\n",
"
178
\n",
"
179
\n",
"
18
\n",
"
180
\n",
"
182
\n",
"
183
\n",
"
185
\n",
"
189
\n",
"
194
\n",
"
196
\n",
"
197
\n",
"
199
\n",
"
2
\n",
"
20
\n",
"
209
\n",
"
21
\n",
"
210
\n",
"
211
\n",
"
212
\n",
"
213
\n",
"
214
\n",
"
215
\n",
"
22
\n",
"
223
\n",
"
224
\n",
"
225
\n",
"
227
\n",
"
228
\n",
"
229
\n",
"
230
\n",
"
231
\n",
"
233
\n",
"
236
\n",
"
237
\n",
"
24
\n",
"
240
\n",
"
241
\n",
"
25
\n",
"
250
\n",
"
255
\n",
"
256
\n",
"
257
\n",
"
259
\n",
"
265
\n",
"
279
\n",
"
285
\n",
"
286
\n",
"
287
\n",
"
29
\n",
"
292
\n",
"
293
\n",
"
294
\n",
"
295
\n",
"
3
\n",
"
30
\n",
"
302
\n",
"
31
\n",
"
328
\n",
"
346
\n",
"
347
\n",
"
363
\n",
"
374
\n",
"
375
\n",
"
376
\n",
"
377
\n",
"
378
\n",
"
383
\n",
"
384
\n",
"
385
\n",
"
386
\n",
"
387
\n",
"
388
\n",
"
389
\n",
"
391
\n",
"
392
\n",
"
393
\n",
"
395
\n",
"
396
\n",
"
397
\n",
"
399
\n",
"
4
\n",
"
406
\n",
"
41
\n",
"
42
\n",
"
44
\n",
"
458
\n",
"
46
\n",
"
47
\n",
"
49
\n",
"
5
\n",
"
53
\n",
"
55
\n",
"
56
\n",
"
57
\n",
"
59
\n",
"
6
\n",
"
63
\n",
"
64
\n",
"
65
\n",
"
7
\n",
"
72
\n",
"
73
\n",
"
74
\n",
"
75
\n",
"
76
\n",
"
78
\n",
"
80
\n",
"
81
\n",
"
82
\n",
"
83
\n",
"
88
\n",
"
89
\n",
"
94
\n",
"
\n",
" \n",
" \n",
"
\n",
"
1960
\n",
"
1961
\n",
"
2339193269
\n",
"
1893
\n",
"
83
\n",
"
2
\n",
"
76
\n",
"
10
\n",
"
31
\n",
"
1
\n",
"
6.8
\n",
"
96.2
\n",
"
2021-10-03T15:35:16.117
\n",
"
2021-10-04T01:47:40
\n",
"
1633308458373
\n",
"
244723.0
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
219352.0
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
"
\n",
"
1961
\n",
"
1962
\n",
"
2339194665
\n",
"
1895
\n",
"
83
\n",
"
1
\n",
"
2
\n",
"
39
\n",
"
31
\n",
"
1
\n",
"
47.2
\n",
"
86.7
\n",
"
2021-10-03T14:03:04.304
\n",
"
2021-10-04T01:51:14
\n",
"
1633308673534
\n",
"
50471.0
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
219352.0
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
"
\n",
"
1962
\n",
"
1963
\n",
"
2339197895
\n",
"
1289
\n",
"
1
\n",
"
2
\n",
"
76
\n",
"
2
\n",
"
13
\n",
"
1
\n",
"
92.0
\n",
"
22.2
\n",
"
2021-10-03T15:35:08.436
\n",
"
2021-10-04T02:03:55
\n",
"
1633309435556
\n",
"
219352.0
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
86.9
\n",
"
34.3
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
-1.0
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
9.8
\n",
"
2.1
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
Center
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
"
\n",
"
1963
\n",
"
1964
\n",
"
2339198193
\n",
"
1290
\n",
"
61
\n",
"
1
\n",
"
14
\n",
"
11
\n",
"
13
\n",
"
1
\n",
"
30.7
\n",
"
30.6
\n",
"
2021-10-03T14:14:36.345
\n",
"
2021-10-04T02:05:11
\n",
"
1633309511458
\n",
"
197469.0
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
-1.0
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
Back
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
"
\n",
"
1964
\n",
"
1965
\n",
"
2369553309
\n",
"
1896
\n",
"
24
\n",
"
16
\n",
"
0
\n",
"
0
\n",
"
31
\n",
"
1
\n",
"
0.0
\n",
"
0.0
\n",
"
2021-10-03T14:00:14.495
\n",
"
2021-12-22T16:08:01
\n",
"
1640189281031
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
-1.0
\n",
"
0.0
\n",
"
0.0
\n",
"
0.0
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
0.0
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
5.0
\n",
"
4.0
\n",
"
22445.0
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Unnamed: 0 id event_id type_id period_id min sec team_id \\\n",
"1960 1961 2339193269 1893 83 2 76 10 31 \n",
"1961 1962 2339194665 1895 83 1 2 39 31 \n",
"1962 1963 2339197895 1289 1 2 76 2 13 \n",
"1963 1964 2339198193 1290 61 1 14 11 13 \n",
"1964 1965 2369553309 1896 24 16 0 0 31 \n",
"\n",
" outcome x y timestamp last_modified \\\n",
"1960 1 6.8 96.2 2021-10-03T15:35:16.117 2021-10-04T01:47:40 \n",
"1961 1 47.2 86.7 2021-10-03T14:03:04.304 2021-10-04T01:51:14 \n",
"1962 1 92.0 22.2 2021-10-03T15:35:08.436 2021-10-04T02:03:55 \n",
"1963 1 30.7 30.6 2021-10-03T14:14:36.345 2021-10-04T02:05:11 \n",
"1964 1 0.0 0.0 2021-10-03T14:00:14.495 2021-12-22T16:08:01 \n",
"\n",
" version player_id keypass assist 1 102 103 107 108 123 \\\n",
"1960 1633308458373 244723.0 NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1961 1633308673534 50471.0 NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1962 1633309435556 219352.0 NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1963 1633309511458 197469.0 NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1964 1640189281031 NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"\n",
" 124 127 13 130 131 139 140 141 144 145 146 147 15 152 \\\n",
"1960 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1961 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1962 NaN NaN NaN NaN NaN NaN 86.9 34.3 NaN NaN NaN NaN NaN NaN \n",
"1963 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1964 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"\n",
" 153 154 155 156 157 167 168 17 170 173 174 177 178 179 18 \\\n",
"1960 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1961 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1962 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN -1.0 NaN NaN \n",
"1963 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN -1.0 NaN NaN \n",
"1964 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"\n",
" 180 182 183 185 189 194 196 197 199 2 20 209 21 210 211 \\\n",
"1960 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1961 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1962 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1963 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1964 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"\n",
" 212 213 214 215 22 223 224 225 227 228 229 230 231 233 \\\n",
"1960 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1961 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1962 9.8 2.1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1963 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1964 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"\n",
" 236 237 24 240 241 25 250 255 256 257 259 265 279 285 286 \\\n",
"1960 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1961 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1962 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1963 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1964 NaN NaN NaN NaN NaN NaN NaN -1.0 0.0 0.0 0.0 NaN NaN NaN NaN \n",
"\n",
" 287 29 292 293 294 295 3 30 302 31 328 346 347 363 374 \\\n",
"1960 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1961 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1962 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1963 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1964 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.0 NaN \n",
"\n",
" 375 376 377 378 383 384 385 386 387 388 389 391 392 393 \\\n",
"1960 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1961 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1962 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1963 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1964 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"\n",
" 395 396 397 399 4 406 41 42 44 458 46 47 49 \\\n",
"1960 NaN NaN NaN 219352.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1961 NaN NaN NaN 219352.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1962 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1963 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1964 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.0 4.0 22445.0 \n",
"\n",
" 5 53 55 56 57 59 6 63 64 65 7 72 73 74 75 76 78 \\\n",
"1960 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1961 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1962 NaN NaN NaN Center NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1963 NaN NaN NaN Back NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"1964 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n",
"\n",
" 80 81 82 83 88 89 94 \n",
"1960 NaN NaN NaN NaN NaN NaN NaN \n",
"1961 NaN NaN NaN NaN NaN NaN NaN \n",
"1962 NaN NaN NaN NaN NaN NaN NaN \n",
"1963 NaN NaN NaN NaN NaN NaN NaN \n",
"1964 NaN NaN NaN NaN NaN NaN NaN "
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Display the last five rows of the DataFrame, df_cry_lei_events_raw\n",
"df_cry_lei_events_raw.tail()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(1965, 162)\n"
]
}
],
"source": [
"# Print the shape of the DataFrame, df_cry_lei_events_raw\n",
"print(df_cry_lei_events_raw.shape)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Index(['Unnamed: 0', 'id', 'event_id', 'type_id', 'period_id', 'min', 'sec',\n",
" 'team_id', 'outcome', 'x',\n",
" ...\n",
" '75', '76', '78', '80', '81', '82', '83', '88', '89', '94'],\n",
" dtype='object', length=162)\n"
]
}
],
"source": [
"# Print the column names of the DataFrame, df_cry_lei_events_raw\n",
"print(df_cry_lei_events_raw.columns)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Unnamed: 0 int64\n",
"id int64\n",
"event_id int64\n",
"type_id int64\n",
"period_id int64\n",
" ... \n",
"82 float64\n",
"83 float64\n",
"88 float64\n",
"89 float64\n",
"94 float64\n",
"Length: 162, dtype: object"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Data types of the features of the raw DataFrame, df_cry_lei_events_raw\n",
"df_cry_lei_events_raw.dtypes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Full details of these attributes and their data types is discussed further in the [Data Dictionary](section3.2.2)."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Unnamed: 0 int64\n",
"id int64\n",
"event_id int64\n",
"type_id int64\n",
"period_id int64\n",
"min int64\n",
"sec int64\n",
"team_id int64\n",
"outcome int64\n",
"x float64\n",
"y float64\n",
"timestamp object\n",
"last_modified object\n",
"version int64\n",
"player_id float64\n",
"keypass float64\n",
"assist float64\n",
"1 float64\n",
"102 float64\n",
"103 float64\n",
"107 float64\n",
"108 float64\n",
"123 float64\n",
"124 float64\n",
"127 object\n",
"13 float64\n",
"130 float64\n",
"131 object\n",
"139 float64\n",
"140 float64\n",
"141 float64\n",
"144 float64\n",
"145 float64\n",
"146 float64\n",
"147 float64\n",
"15 float64\n",
"152 float64\n",
"153 float64\n",
"154 float64\n",
"155 float64\n",
"156 float64\n",
"157 float64\n",
"167 float64\n",
"168 float64\n",
"17 float64\n",
"170 float64\n",
"173 float64\n",
"174 float64\n",
"177 float64\n",
"178 float64\n",
"179 float64\n",
"18 float64\n",
"180 float64\n",
"182 float64\n",
"183 float64\n",
"185 float64\n",
"189 float64\n",
"194 float64\n",
"196 float64\n",
"197 float64\n",
"199 float64\n",
"2 float64\n",
"20 float64\n",
"209 float64\n",
"21 float64\n",
"210 float64\n",
"211 float64\n",
"212 float64\n",
"213 float64\n",
"214 float64\n",
"215 float64\n",
"22 float64\n",
"223 float64\n",
"224 float64\n",
"225 float64\n",
"227 object\n",
"228 float64\n",
"229 float64\n",
"230 float64\n",
"231 float64\n",
"233 float64\n",
"236 float64\n",
"237 float64\n",
"24 float64\n",
"240 float64\n",
"241 float64\n",
"25 float64\n",
"250 float64\n",
"255 float64\n",
"256 float64\n",
"257 float64\n",
"259 float64\n",
"265 float64\n",
"279 object\n",
"285 float64\n",
"286 float64\n",
"287 float64\n",
"29 float64\n",
"292 float64\n",
"293 float64\n",
"294 float64\n",
"295 float64\n",
"3 float64\n",
"30 object\n",
"302 float64\n",
"31 float64\n",
"328 float64\n",
"346 float64\n",
"347 float64\n",
"363 float64\n",
"374 object\n",
"375 object\n",
"376 float64\n",
"377 float64\n",
"378 float64\n",
"383 float64\n",
"384 float64\n",
"385 float64\n",
"386 float64\n",
"387 float64\n",
"388 float64\n",
"389 float64\n",
"391 float64\n",
"392 float64\n",
"393 float64\n",
"395 float64\n",
"396 float64\n",
"397 float64\n",
"399 float64\n",
"4 float64\n",
"406 object\n",
"41 object\n",
"42 float64\n",
"44 object\n",
"458 float64\n",
"46 float64\n",
"47 float64\n",
"49 float64\n",
"5 float64\n",
"53 float64\n",
"55 float64\n",
"56 object\n",
"57 float64\n",
"59 object\n",
"6 float64\n",
"63 float64\n",
"64 float64\n",
"65 float64\n",
"7 float64\n",
"72 float64\n",
"73 float64\n",
"74 float64\n",
"75 float64\n",
"76 float64\n",
"78 float64\n",
"80 float64\n",
"81 float64\n",
"82 float64\n",
"83 float64\n",
"88 float64\n",
"89 float64\n",
"94 float64\n",
"dtype: object\n"
]
}
],
"source": [
"# Displays all columns\n",
"with pd.option_context('display.max_rows', None, 'display.max_columns', None):\n",
" print(df_cry_lei_events_raw.dtypes)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\"\\n# Print statements about the dataset\\n\\n## Define variables for print statments\\ncount_events = len(df_cry_lei_events)\\ncount_shots = len(df_cry_lei_events[(df_cry_lei_events['type_name'] == 'Shot')])\\ncount_goals = len(df_cry_lei_events[(df_cry_lei_events['type_name'] == 'Shot') & (df_cry_lei_events['shot_outcome_name'] == 'Goal')])\\ncols = list(df_cry_lei_events)\\ncount_event_type = len(df_cry_lei_events['type_name'].unique())\\nvals_event_type = df_cry_lei_events['type_name'].unique()\\n\\n## Print statements\\nprint(f'The EURO 2020 Events DataFrame contains the data for {count_matches:,} matches, of which there are {count_events:,} total events.\\n')\\nprint(f'Of these events, there are {count_shots:,} shots ({round(100*count_shots/count_events,1)}%) and {count_goals:,} goals ({round(100*count_goals/count_events,1)}%).\\n')\\nprint(f'This translates to a shot to goal conversion percentage of {round(100*count_goals/count_shots, 1)}%.\\n')\\nprint(f'The dataset contains the following features: {cols}\\n')\\nprint(f'The 'event_type' column contain {count_event_type:,} different values, including the following: {vals_event_type}\\n') \\n\""
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\"\"\"\n",
"# Print statements about the dataset\n",
"\n",
"## Define variables for print statments\n",
"count_events = len(df_cry_lei_events)\n",
"count_shots = len(df_cry_lei_events[(df_cry_lei_events['type_name'] == 'Shot')])\n",
"count_goals = len(df_cry_lei_events[(df_cry_lei_events['type_name'] == 'Shot') & (df_cry_lei_events['shot_outcome_name'] == 'Goal')])\n",
"cols = list(df_cry_lei_events)\n",
"count_event_type = len(df_cry_lei_events['type_name'].unique())\n",
"vals_event_type = df_cry_lei_events['type_name'].unique()\n",
"\n",
"## Print statements\n",
"print(f'The EURO 2020 Events DataFrame contains the data for {count_matches:,} matches, of which there are {count_events:,} total events.\\n')\n",
"print(f'Of these events, there are {count_shots:,} shots ({round(100*count_shots/count_events,1)}%) and {count_goals:,} goals ({round(100*count_goals/count_events,1)}%).\\n')\n",
"print(f'This translates to a shot to goal conversion percentage of {round(100*count_goals/count_shots, 1)}%.\\n')\n",
"print(f'The dataset contains the following features: {cols}\\n')\n",
"print(f'The \\'event_type\\' column contain {count_event_type:,} different values, including the following: {vals_event_type}\\n') \n",
"\"\"\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Counts of the event types:"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"# Shot outcomes types and their frequency\n",
"#df_cry_lei_events_raw.groupby(['type_name']).type_name.count()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There are eight outcomes of a shot: 'Blocked', 'Goal', 'Off T', 'Post', 'Saved', 'Saved Off Target', 'Saved to Post', 'Wayward'."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"# Filter DataFrame for only shots and then groupby the 'typeName' (Event type) and count the number of each\n",
"#df_cry_lei_events_raw[(df_cry_lei_events['type_name'] == 'Shot')].groupby(['shot_type_name']).shot_type_name.count()"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"RangeIndex: 1965 entries, 0 to 1964\n",
"Columns: 162 entries, Unnamed: 0 to 94\n",
"dtypes: float64(138), int64(10), object(14)\n",
"memory usage: 2.4+ MB\n"
]
}
],
"source": [
"# Info for the raw DataFrame, df_cry_lei_events_raw\n",
"df_cry_lei_events_raw.info()"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABuQAAAGdCAYAAADquBVzAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAAsTAAALEwEAmpwYAABjwElEQVR4nO3deZhcVZk4/vdWpZcsQICAQEB2NCiLbIIIJCAjy4Awg6ioIy6gwIiC6G/GZWDGEUaUcWPcZmTcRwYV0MGvC9AKKoIsLRC2sIUlJCQGDIQk3V11f38kXXQn6e7qSnXdW1Wfz/PUU3WXuuet7dS9973nnCRN0wAAAAAAAAAmRiHrAAAAAAAAAKCVScgBAAAAAADABJKQAwAAAAAAgAkkIQcAAAAAAAATSEIOAAAAAAAAJpCEHAAAAAAAAEwgCTkAAAAAAACYQE2fkEuS5KQkSb6UJMmNSZIsS5IkTZLku1nHBQAAAAAAABERk7IOoA4+HhF7RcTzEfFERLw823AAAAAAAADgRU3fQi4izomI3SJi44g4I+NYAAAAAAAAYJimbyGXpmnP4OMkSbIMBQAAAAAAANbRCi3kAAAAAAAAILck5AAAAAAAAGACNX2XlfUwe/bsdKx1Pv/5z0dExAc/+MFcrKO87Mrbe++9R90OAAAAAABjavcxqEbMS/z0pz+Nf//3f29kLMMUCoW47rrrMis/IxP+fZSQgzbR29tbVVJSwrE61b6fEZK80OzG+r37HWdDPQwAQDOq5vgiIuyjQpvbeeedMy2/XC7HO9/5zigWi+u9zZw5M84666zo6urKNM5mIyEHbWLvvfeOX//611mH0TLG835636G5qT/zST3cHmbPnj3qcglVAID2Zn+RVrX77rtHT09PZTpN0yiXy8Pu/+u//it++MMfTlgMjz766IjLbr/99nj66afjkEMOmbDyI1a31DviiCOis7NzQstpFAk5yEhvb29EuGq/WWmZ0XhaeWZD67DmVs3BaURz1lPNXA/7XVVPMhUAYMO0eos8+4u0iyRJolgsDpv39re/PZ555pno6+uLNE3jt7/9bUNjuvnmm+Pmm2+e8HIuvvjiMdf5+te/HrvuuuuEx7KhJOQgI4M7OnYcmpOWGY2nlRKMXyvXU81cD6vPAABoFPue0JweeeSReNe73pV1GE2jWbrOlJADAEbk4I3x0F0MALA+rd5CBwDqbe7cuZmWv/POO8c//MM/RKFQiCRJIiKG3adpWll36PTgOutTLBZj2223ncCo86/pE3JJkpwQESesmdxqzf1BSZJ8c83jJWmantfgsIAW18xdpcF46FqP8Whk8lY9DADNw0VeADA+WSeujj766Nhll10yjaEVNX1CLiL2joh3rDVvpzW3iIj5ESEhBwAAAAAA5N7LX/7yOPLII+ORRx4Zs/XZ0NZqAwMDUSqVIk3TGBgYiFWrVkVfX1/09/dHf39/1eVfeumlceutt653WbUt5Pbbb7848cQTR201126aPiGXpukFEXFBxmEAbaaZxy4CaAXq4fagG1QitNYGWof/NQCq1d3dHR/96EdHXWdgYCB6enpiYGAgIiKefvrp+OY3v1m3GP7whz9s0PNvuummmD17dmy22WZ1iqj5NX1CDiALukoDyJZ6uD1IphKhqzugdajLAKin//7v/47vf//7DSmro6Mj/vmf/3nElnHrM3PmTMm4tUjIQUZ6e3sjwklCqFa1J9/9ZgAAAABodW95y1vi+eefj76+vohY3XXlYBeV5XK5ciuVSpXH991337i6rhzU398fBx10UL1fQtuRkIOMDCYNXCHXnHSV1niujs+G9528Ug+3B117AUOpEwAAXjRlypQ488wzo7+/P/r6+uKuu+6KCy64IOuwGIWEHEANdJVGuzBuD3mlHm4PzZpMrabujAjfPRinZq0TgHzzvw00i6OPPjpWrlyZSdlveMMbMim31UjIAdAUdFkJQLPQuhgAmof/bSCv7rnnnnj22WcjSZKIiJg6dWpNCbkkSSJJkiiXyzXHcvXVV495Xo6xScgB1EBXaY3nIAkYSj3cHnRPR4TW2gAAtJ+bbropPvrRj9ZlW2maRpqmG7ydOXPmjPs5P/vZz2Ly5MkbXHarkJADxs1JEV2lQTtR5+WTerg9SKYS4aIcAADaT7FYzDqEujjmmGMaUs4PfvCDeMlLXtKQsjaEhBwwbk6KAO1EnQcAAAA00v777x9vetObYt68ecPmD23pNn/+/Fi6dGmjQ8ulxYsXS8gBAAAAAABQvT/+8Y9x+eWXZx3GMBdffHEUi8UoFAoxZcqU2HrrrSvj2yVJEoVCofJ4fbeIiEKhUHncjiTkAGpg7CLahdZh5JV6uD0YQw4YSp0AALSL/fffP84777xYtGjRiOvceuutce+99zYspo985CPDpi+88MI46KCDGlZ+K5CQg4z09vZGhHFtmpWxixqv2vfc+1lfxk8jr9TD7UEyFRhKnQAAtIskSWKXXXaJGTNmDJs31JIlSxqakNtpp50iTdMol8sxc+bM2GOPPRpWdquQkIOMDJ78c1AJ1dFSCwAAAIB2cNttt8V5552XdRjDfOMb38g6hKYnIQcAG6DVW5BJhAIAsKGq2WeOiKbebwaAetpzzz3jpJNOivnz56+zLE3TUZ87dPn61h067y9/+Us8/PDDY8Zz+OGHj7kOY5OQA6iBsYsY1OoJq1ZPONK81MPtwXhRVMvJfsi3Vt9nBoB66+joiLPOOmvcz3vhhRdi5cqVkSRJJEkSf/jDH+ILX/hCRESlu8nBx2maRqlUqmq7119/fVx//fWjrnPeeefFscceO+6Y24mEHDBuTtAbuwgga+rh9uDkLdVysh8AgFazZMmSSnKtUChEoVCIJEkqybTe3t749Kc/nXWYFQ888ICE3Bgk5IBxc8JDywyArKmHAcgDLXmB8XJOBajGnXfeGR/4wAcyjeGUU06pPD7ggANir732yjCa1iAhB1ADLTMAsqUeBiAPnFQHxks3y0A1dt111zj00EPjwQcfjHK5HAMDA9Hf3x99fX2xatWqSteTE+Woo46K0047bULLaEcScgA10DKDduHqTfJKPQwAQDNyjAVU484774wbbrihoWW+7GUviyRJYtKkSfGOd7yjoWW3Cwk5gIwZkw8A1k9XcETYVwKgtWghB+TRtttuG4ccckgUCoUoFovx29/+NpIkiYhY535ta88faf3JkyfH4YcfHsVisd7hNw0JOYCMuToOAAAAABj06le/Onp6eobNK5fLUS6Xo1QqRalUii9/+ctxzTXX1KW8J554Iv7rv/6rLtsazdKlS+NNb3rThJeTVxJyADUwdhFAttTD7cEFK0S4eGk8tColr7QIAoANVygUolAoxKRJq9M6v//97ye0vBNPPLHyOE3TYfdrz1/b+tafOnVqvOENb6h3mE1FQg4y0tvbGxGNO0lY7YlLB0AAw+kqDYBmIXFJXkmsA0D9fe9734v//d//jSRJoqurK6677rqYN29e3bb/y1/+MkqlUpTL5Tj55JPj3e9+d9223a4k5CAjgydvG3VQ4gCovsbzfnrfobmpP/NJPdwetPahWlrfAADQ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rbbaKtPyv/zlL8esWbMyjaEVSchBRhrdZaUrsIBa6CYMAAAAoLF233336OnpqXQvGRGVbicH75csWRKf/OQnY9myZbFq1ap49tln61b+bbfdJiE3ASTkAAAAAAAAciZJkigWixERlftB2223XXz961/foO3Pnz8/Tj311Hj1q18ds2bNiu7u7ujq6oqjjjpqg7bL+knIQUYa3WUlTIRGtp7S7SpZ0UoQAABaly4kgTxavHhxnHzyyQ0r7+abb46bb765Mv2FL3xhnXWSJIkkSdZ5nKbpsPtBhxxySJxxxhlRKBQiYnVCcbPNNpuQ+JuFhBxkpNFdVsJEaGRXqLpdJSu+ewAA0Lrs7wN5tGzZsqxDWEeapusk3Ubzm9/8Jn7zm98Mm/ehD30o/vqv/7reoTUNCTkAAAAAAICc2HnnnaOnp2fUde688874wAc+0KCIxq+7uzumTZtWmd5kk03i1a9+dYYRZU9CDgAAAAAAoInsueeew5J2g+PBTZSxEoSMTUIOAADIpdmzZ4+6fHBMF+M8YvwfAADa3fbbbx+f+9zn4pFHHon+/v7o6+uLO+64I26//fa6bH/OnDmVx1OnTo3//u//ji222KIu224XEnIAAEAuVTuei3FfMP4PAACs3i8eehHaj3/84wkpZ/ny5fHkk09KyI2ThBwAAAAAAEATS9M07r333li2bFmkaRoREWeccUbcc8890d/fH6VSKQYGBiq3UqkUixYtiocffnjMbe+0007xjW98Y6JfQsuTkAMAAAAAAGhi9913X5x11ll12daxxx4bb3nLW6JYLEapVIrp06fXZbvtTkIOABiRLsAAoHlUM+6icfTIgnEeAWB8Fi5cGG95y1syK/+aa66Ja665Zti8np6ejKJpHYWsAwAAAAAAAGC1F154IesQmABayAEAI6rmamZXMgNAPmjVTl7pdQEAxmfp0qVZhzDMZpttlnUILUFCDqAG4zmgdOBJM3PyhLxSDwMA0IwcYwHV2GmnnRpe5l577RVpmkZERJqmldvg9JlnnlmZ3mabbeK8886LyZMnNzzOZiYhB21irFYuEVq6jEe172dEaF0EMAHUwwAANCNjKgLV+POf/9zwMv/0pz9Vve59990Xhx9+eBx88METGFHrkZCDNuEKrPpq9ZYZErgM0mUledXq9TAAAADta9ddd42enp5xPeeOO+6Ic889d4Iiirj00ksjSZJIkiSmTJkS22+//YSV1aok5CAjvb29EeGq/WbV6i0z8pjAlSQEhmr1ehgAAID2NW/evDj99NOzDqPihBNOiFe84hVZh9H0JOQgI4Mn//KW9KA69WyZoQVSdfKYJGwH3nfySgs5AACakWMsoBoPPvhg1iEMc9VVV8UHPvCBrMNoehJyADWod8sMO+PklYQxeaWFHAAAzcgYckA1dtppp4aW9573vCdOPPHESpeUhUIhIiIKhUJlHhtOQg4AAAAAACAnttxyy5gxY0YsWbKkIeXde++9sfvuu1eScaVSKVatWhWrVq2Kvr6+eNnLXhYvfelLGxJLK5OQAwAAAAAAyIlNN900rrjiinE955577omzzjqrpvJ+97vfxe9+97tR1+np6alp27xIQg4AAAAAAKCJ7b777vG9730vnn322Uo3kxdccEEsWrQo69BYQ0IOoAbjGffN+HA0M2Mcklfq4fYwe/bsUZcbA7A9GM8UAADG9pe//CU+85nPxNy5cyMiIk3TGBgYqOq5u+66a5xwwgnR0dERhUIhZs+eHcVicSLDbUsScgA1GOvEUMSLAzE7gUQzcxKUvFIPtwfJVCJcHAIAANXo7e2N3t7emp47b968+MxnPlOZvv/+++PMM8+sU2QMkpADAAAAAABoYltttdUGPX+XXXaJiIhisRgnnHBCHSJibRJykJHBqxVctQ/VqbY1jN8MvKia7v4i/BflkToPAACA0Vx55ZXxxS9+sW7bW758eaRpGgsXLoy3vvWtG7y9PffcMz7zmc9EZ2dnHaJrDRJykJHBE2iN6n7HiT2ane6qsuF9b27GWGtefnsAAACMZo899qjr9p566qm6bu/OO++MVatWScgNISEHbcKJvfoaz/vpfQeoP/Vwe6imlaeLiaB9qBMAAF60yy67RE9PT2X6gQceiPe+97112famm24aX/va16JYLEahUKjcBqeTJBn2mOpIyAHUoNoWhxG6gqO5jfVd9x0mK+rh9iCZCgylTgAAGNnGG29ct20988wzcfLJJw+bNzT5R20k5ABqoGUGQLbUw+1BaxgiXBwCQ6kXAYCR9PX1Tdi2999//wnbdjuRkAMARqS7WwCA/LBfBgCM5PHHH6/5uVdddVVssskmdYyG9ZGQA6iBrtJoF1olkFfq4fbgxDMRLg4BAIBqbLPNNjU/94QTThh1+ZZbbhmXX355zdtnNQk5AAAAAACAJrbjjjtGT09PpGkapVIp+vr6oq+vL/r7+yuP15734IMPxje+8Y0xt93Z2dmAV9D6JOQAamDsItqFVgnklXq4PRgriQittQEAoBpPP/10vOlNb6rLtmbPnh3nn39+XbbFiyTkAIAROQkKZEkylQgXhwAAwPo88cQTcfbZZ8czzzxT923/+te/ju222y5KpVKUSqU48MADnf+pAwk5AGBEToICWdJCjmpVcwFJRPi+AADQNB599NF47rnnKtNpmg57fPnll09IMm7Qd77zncrjyy+/PHp6eiasrHYhIQcAjEgLOQAAAIDGuuOOO+Lcc89tWHkzZsyIOXPmxKRJk6JQKESxWKzcF4vF2GeffRoWSyuTkAOowVhJiogXr8SWzACoP/Uwg1w4AAAAtJqVK1c2tLwlS5bE1VdfXemiMkmSYUm573//++sk6To7O6OjoyM6Ozujs7Mzzj777Nh5550bGnezkZADYB3Vnuh2grP16bISyFK19Y96Cv9XkG+6lQWA8dlvv/3ijW98Yzz22GORJEkUCoWIiEiSpHI/9PHQ+0KhMGzetttuG0mSRLlcjjRNh92vWLEirr766oiI6Ovrq5SfpmkMDAyMK+b3vOc9urUcg4QcQA3Gc9KnGU8OOanFIC1PyKtWr4dZzRhyRPgvgqGatV50fAEA49PR0RFnnnnmuJ6zdOnS+Nu//dsJimhsp556amZlNwsJOQAAIJecvCXCiXwYym8BABj05JNPxoc+9KFYsWJFREQsW7asbts+5ZRT4rTTTqvb9lhNQg5yrtquPVw1DOSZblDJs3q2vtGSp377LhG6LgMmhnqK8fB9qa9mbeVJNkb7vmT1u/Id1g1xoyxcuDDe8pa3ZFb+97///fjBD36QWfnjscMOO8Qll1wS06dPzzqUMUnIQc5Ve0WwKyUbq9rkQoRkKURo3UD91bsertf303fdvguQf+opxsP3pb68T4xHHr8veYyp0RzzNMaqVauyDiHK5XLWIVTl4Ycfjoceeij23XffrEMZk4QcAAAAAABATqxcuTLrENZx+eWXR5IklekkSSq3ofOGLlt73aHr1GsbERHFYnGDX18jSMgBAAAAAADkxKabbpp1COt405veNGz6P//zP2OXXXbJKJrmJCEHUIPxNM/XjJ88Gs+Ybo38Dhs3k2qph9uDMTqAvFNPAQAT4dprr806hDE988wzsXjx4nVaua3dem2otZdNmzYtJk1qnzRV+7xSgDoyhhzNrtpkRjUJsnp+h43RQbXUw+0hj7/1RteLQL7lsZ4CAJrf8ccfH5dffnksW7Ys61BG9JGPfGSDt9HR0RG//OUv6xBNc5CQA6iBlhm0C4M1k1fqYbKiXgQANoR9CaBa2267bdx3332RpmmkaZp1OOvYaKONxjV22/pew/ve9756hpR7EnIAGXOlPQCsn67ggKHUCUArqLabfvUZtLf58+fHPffck3UYozr33HPH3D9jOAk5gIy5Og4A1s//IzCUOgFoBc4BANWYOXNmzJgxI5YsWZJ1KCMaT+s4VpOQA6iBsYtoF1pwklfqYQAAmpEWckA1Fi1alLtk3KxZs6K7uzsiIrbZZps44IADMo6o+UjIAQAAAAAA5MRg4quRpk6dGt3d3dHV1RWFQiH22Wef6Orqiu7u7njlK18pAVcHEnIAAAAAAAA58ac//anhZS5fvjyWL19emX7iiScqjw899NDYZJNNolAoRJIkkSTJsMdDp0cydNng48033zw6Ozsn4NXkk4QcQA3G0+e7vuFpZsY3IK/Uw+1hrAHCdTkK7UWdAAC0i7/+67+OUqkUixYtqsxbO9m19vQzzzwTP//5zycknhtuuCFuuOGGum+3WCzGtddeW/ft5pWEHAAwImPIAVmSTAWGUicAAO2iUCjEiSeeOOo6jzzySLznPe+Jcrk8ITF0dHRUWr1NmzYturq6IiIiTdOqtzF03fU977TTTtvwQJuIhBxADcZKUkS8OBCzZAZA/amHAQAAaFX3339/vO9978us/O233z6++c1vZlZ+qypkHQAAAAAAAACrbbnllpmWP1ZX4dRGCzmAGhi7iHZhDDnySj3cHowXBQylTgAA2sWDDz6Yafl77LFHpuW3Kgk5yEhvb29E6EarWekqrfGqfc+9n/VlDDnySj3cHiRTgaHUCQBAu5g1a1am5Z933nnDpl/xilfEpZdemlE0rUNCDjIyePLPQWVz0jKj8bTUAoZSDwMAANCq7rrrrqxDGGbu3LlZh9ASJOQAgBFJhAJZ0j0dMJQ6AQBoFxtttFHWITABJOQAWIfuIQHIAxcEAEOpE+prtATnYLfP9drfr6Yb9HqWBwDN7pWvfGX84he/iIiINE2H3crlcqRpGnfffXd89KMfzThSxkNCDoB1aBXFIGPIAQC0pkbu7zu+AIDxue++++KMM87IOoxhrr766kiSJAqFQiRJss7t4IMPjmnTpmUdZq5JyAHUoNoWZBEhmQFNTlIyn9TD0Bp0QQgAAOvaeuutY5tttokFCxZkHUrF4DF2M3jb294W7373u7MOYx0ScgAAo3BFN8DEUb8CAMC6Ntlkk/je97436jqXXXZZfOc732lQRM0lr2PwScgBAAAAAAA0kb333rtuCblDDz00TjzxxNh4441j2rRp0d3dHZMnT46Ojo66bJ/VJOQAajCeFjOu/AaoP/Vwe9CdIQAANKex9uUjHKttqH322Sd6enpGXedXv/pVXHjhhdHR0RHFYjGKxWJMmjSpclu0aFFERNxwww1xww03NCLsCfGtb30rXvrSl2Ydxpgk5ACAEemuEQCYaNWM1xoREvAA0EScS2i8Z555Jk499dRYtmzZOsv6+/ujv78/g6gaY9WqVVmHUBUJOYAajHXSIOLFEwdjnVxwYgFg/NTD7cFBPIxPs7YqdQFQ65N0BYDapWka5XK5cr/248HpX/ziF+tNxmVljz32iM9+9rPR2dmZdSi5ISEHUANdpdEuqjl54sQJWVAPA6xLfcd4jJbArXeCTNIVAMbnnnvuibPOOivTGC644IIRl2200Uaxzz77NC6YFiEhB1ADLTMAsqUeBoANI0EGAPk1c+bM2HLLLePpp5/OLIavfe1rkSRJpGkaJ5xwQpx88smZxdIqClkHAAAAAAAAwGqPPfZYpsm4iIinnnoqFixYEE899VR85StfyTSWVqGFHEANdJUGkC31cHto1vGwqC/dJwMA0G6ef/75rENYx5w5c4ZNf+tb34qXvvSlGUXTnCTkAIARGe8DgKxV819UTdJucFsAAJB306ZNyzqEMa1YsSLrEJqOhBwAAJBLLgigWi4gAaBZ+M8CqjF16tSGlnf88cfHLrvsEkmSVHXbZJNNYrfddmtojK1AQg6gBmNdhR3x4pXYuliimekmjLxSDwMA0Iy06gaq8fDDDze0vJ/85Cfjfs7uu+8ehx56aEREJEkybNlY0+NZd0OnIyJ22WWX2H333UeMoVEk5ABqYOwi2oWrN8kr9XB7MIYctAcnpwEAhstD8mgs99xzT9xzzz1Zh1G1K6+8MqZPn55pDBJyADXQMoN2oYUceaUebg+SqdAeXAAEADDcNttsEz09PeN6zrXXXhuf+tSnJiiiiXPiiSeOuCxN03Wm15431voREXvttVfmybgICTkAAAAAAIDcePDBB+O0007LOoxRfepTn4rXvOY1WYfRVCTkAKiZ1lO0A99zAABoXbrNBfJok002yTqEMW233XZZh9B0JOQAamDsotV0L9T6fMbeg7xSD7cHY8hRLSdTAaiV/X0gj7bYYotxd1m5YsWKOP7442NgYGDU9aZMmRJ77bVXlEqlWLx4cTzyyCM1xbh48WJJuXGSkAOogbGLaBdah5FX6uH24OQY1XIyFQCAVvLYY4/FO97xjgnZ9gsvvBA33XTTsHmvfvWrY999942NNtoopk2bFtOmTYvu7u6YPHlydHd3R3d3d3R0dMSkSZNi0qRJUSgUJiS2VichB1ADLTMAsqUeBgAAoFVNmtTY1M3NN98cN99886jrjLfFHuuSkAOogZYZANlSDwMAANCqttlmmzETYFdeeWV88YtfrFuZM2bMiFKptN7bySefXLdy2pmEHAAAAAAAQBM58cQT48QTT4yIiDRN409/+lOcc845NW3rQx/6UPz1X/91PcNjPSTkICO9vb0R4ap9qFa1rWH8ZgAAAABoJ0mSxKxZs2LHHXeMRx55ZNzPv+SSS+KSSy4ZcflJJ50UZ5111oaESEjIQWYGkwbGtWlOxi5qvPG859SP9528Ug8DANCMHGMB1Xj22WfjrLPOigULFmQdSkRE/PCHP5SQqwMJOQAAAAAAgJy49957M03GnXPOOXHsscdGoVCIJEkyi6PVSMgB1KDa7hMjdEtKcxvru+47TFbUwwAANKNqjrEiwj4qtLlp06Y1tLxzzz03jjvuuIaW2Y4KWQcAAAAAAADAag8//HBDy9tyyy0bWl670kIOAAAAAAAgJw488MAJ3f6MGTOiVCpFX19fLF++PJYvXz6h5bGahBxADcYzCLPBmmlmBhwnr9TD7WH27NmjLtflKLQXdQIA0C5e8pKXRE9Pz6jr/OxnP4vPfOYzNW1/yZIlw6aNE9cYEnIANTB2Ee3CGHLklXq4PUimAkOpEwAAItI0jXK5HDNnzqzbNv/lX/4lrr322hGXv+51r4s5c+bUrbx2JSEHUAMtMwAmTrWJYPUwMKiaeiMiJOABAGgKd911V5x99tkNLfP3v//9qMsk5DachBxADbTMAJg41STb1MPAULpYBgCglfz5z39uaHkHHnhgHHvssZEkSaRpus7ynXfeuaHxtCoJOYAaaJkBkC31cHswXhQRuk+GiTJaHatVKQBka8qUKQ0tb86cOfHa1762oWW2Iwk5yEhvb29EuGq/WWmZsVojT5BV+5438/sJVE893B4kU4nQ+g0mit8VrKbbYyCP1tdKbSJddNFFcdFFF23QNs4+++w48cQT6xRRa5KQg4wM7sg5CKKZNfIEmZNxAAAA1JtjTSCPDjjggPjwhz8cixcvjkKhULkVi8VIkmTYvCRJolgsxgMPPBA/+clPMot5wYIFmZXdLCTkAAAAAAAAciJJkjjmmGPG9Zw999yzbgm5173udfGxj32sLtviRRJyAAAAAAAATWybbbaJ2bNnx0033RRpmka5XI5yuRxpmlbVBeaUKVNi6tSpMXXq1HjsscfizDPPjGKxGIVCIY4++ug46qijGvAqWpuEHEANxtOlha4vaGa6byGv1MMAADQjx1hANf785z/H29/+9lixYkXDynzhhRfihRdeiMWLF6+z7M4774z99tuv0m3m2l1mFgqF6OjoiCRJGhZvM5KQg4z09vZGRIw5cLBBg/NprEGfI14c+NlnDNSbgefVwwAANCf78kA1Hn/88YYm46rxxje+cdTlBx54YFx00UUNiqY5SchBRgZ3rFwV1Zy0zKBdVHOw6ECx8VxVqx4GAACgdT3zzDNZhxCbbrpppevLiKh0fTk4b+h0mqZx4oknZhxx/knIwRoSZNlwsh/yTeIHAACgfhxjAdXYeeedG1refvvtF8cdd1ylC8qOjo7o7u6OYrEYSZLENttsE9OnT29oTK1IQg7W0IVkNpp1R1RXabQLSXPySj0MAEAz0mUlUI2FCxc2tLxbb701br311lHX6enpaVA0rUtCDgAYUbMmzQEAyA8JCAAYn/7+/qxDWEdfX190dnZmHUZTk5ADAEakhRwAABvKRV4AMD59fX1ZhzDMQQcdFMViMeswmp6EHJB7eUwIjOeA0oEnzczJE/JKPQyQvdmzZ4+63IU7ZEWLPPLMMRZQjYMPPjjOO++8WLZsWWXe17/+9YbGsOuuu0aaplEul2PhwoXx7ne/O9I0jTRNY+bMmfGxj30spk2b1tCYmp2EHJB7edxZNXYR7SKPCXGIUA8D5EHe9tFhUB6PIWGQhDFQjc7Ozjj22GOHzTv22GNjwYIFlenHHnssLrroogmLYd68eSMue/zxx+Pcc8+NAw44INI0jYiIE044IbbYYosJi6cVSMgB1EDLDNqFkxnklXq4PWh9AwylTgAA2tnGG28cG2+8cWX65S9/efzVX/1VZfovf/lL/OM//mPce++9DYln3rx5w5J2t99+e3zlK19pSNnNSkIOoAZaZtAutJAjr9TD7UEyFRhKnQAAMLKlS5dOaDLuHe94RyRJUplOkqRyi4g45phjJqzsViEhBwAAAAAA0KTSNI2XvvSl8Ytf/CL6+/tjYGAgBgYGor+/P0qlUmXe2sseeuihqsemO/XUUyf2RbQBCTmAGugqjXahy0rySj0MAEAzcowFVGPp0qVx6qmnxnPPPdewMvfZZ58Rl73+9a9vWBytTEIOMtLb2xsRzdmNli7sdJVG+/B7J6/Uw0AtjEEGQNaqOcaKCP9H0OaWLFnS0GRcxOox4EZbdtFFF436/FNOOSVOO+20eofVUiTkICODO1bNeFWUq7kAAGhG9mEBAGgGu+22W/T09Iy6zvz58+PMM8+MlStXVuaVy+WJDm1Em2yySWZlNwsJOQAAAAAAgCay/fbbxzXXXFOZfvLJJ+Ntb3tbTds666yz4phjjolisRiFQqFyT31JyAHUwNhFtAstYskr9XB70L0gMJQ6AQBgZMuWLav5uZtttllMmTKljtGwPhJyADUwdhFAttTD7UEyFcan1RNW6oTmZcwsABif/v7++M///M947LHH1rs8TdN15i1ZsqTm8j75yU/GJz/5yRGXd3V1xc9//vOat89qEnIANdAyAyBb6uH20OrJBerHyf7V1HfklV4XAGB87rzzzrjiiiuyDqNi1apVWYfQEiTkAAAAaGpO9jc3CVUAgOH23Xff+PKXvxzPPvvssPlJkqyz7uC8G2+8cdiYcvU2Z86cum9z3333jc9+9rN1325eScgB1EBXabSLak6Q+Q6TBfVwe5BggfYgoQoAsK5Zs2aNa/2ddtppQhNyE2GTTTbJOoSGkpADqIGu0mgXTpCRV+rh9qDLSmgPWsgBAKzrqaeeiuXLl1e1bpIksXDhwgmOqP5uuOGGrENoKAk5AGBEWsgBWZJMhfbgAiAAgOF++9vfxic+8YmswxjmZS97WUREpGm63tv6lq09b3C6XC5HRMRpp52WwSvJjoQcADAiJ8iALGkhBwylTgAA2sXUqVMbXubuu+8eSZJEsViMJEmiUChUlh177LFxxBFHNDymViMhB1ADYxfRLrSQI6/Uw+3BBQHAUOoEAKBdvOpVr4rrr78+SqVS9Pf3R19fX+V+8Hb33XfHl770pbqVec8994y47I477pCQqwMJOYAaGLuIdqGFHHmlHgYAoBk5xgKqkUWXlRtvvHF0dnZGR0dHTJo0KTo6OirTb3zjGxsaS6uSkAMARqSFHJAl3dNRrWr+ryLC9wWAzPnPAqoxZcqUhpe5bNmyEZfdddddMWPGjGHzkiSJiKiMDTc4vfbj9Rlcfvrpp8fhhx9eU7zNSEIOMtLb2xsRrduNVrVdibX664to3c+40Vr9O5VXrt4kr9TD7UH9Q7X8XwEAI5EEpRnts88+0dPTM67n3HXXXXH22WdPUEQRS5Ysqfs2L7zwQgk5YOIN/sm36okDJ0WoN9+pbGghB2SpmhZyEZKuONEGAIzM+QRaxXe+85247LLLKtODrcySJIkkSaJUKjU0nlNPPTWOPPLIKBQKw+IYbDE3kqHLN9tsswmNMW8k5ABoKRJIAK3DOIFUy4k2AABayZNPPhlve9vbRl1nMLE1VgJsohx00EGxzTbbZFJ2s5KQA2Adzdw9pBNy9eX9BABgQ2nFCgDjUy6Xsw5hTO9973s3eBsHH3xw/Ou//msdomkOEnKQkVYfQ47m1upJGK3oque9AgBgQ7X68QUA1NuiRYuyDqEhJk1qrxRVe71ayJFWH0Ou1Y3ngNJnnD9OCEDzUw8DAADQqgYGBrIOYR09PT1Zh9D0JOQAalBtl44RWkECTAT1MAAAAK0qq3HhBh1zzDHxgQ98IDo6OiJJkkxjaSUScgAAAAAAADlRLBYbWt4rXvGKePOb3xxTpkyJyZMnx3bbbRelUikiIpIkiUKhEIVCQXJuA0nIQc5VO/i1q/8bS1dp9WWcMshOs/7+8loPN+v7WU/12neJiJZ/r8gnv+P68n4C7WT27NmjLh/cx2ll1bwH6v1sjPbZ2P/OnwMOOCB+9rOfxcDAwDqt5dI0jXK5vM79Cy+8EF/+8pfjzjvvjK6urujs7Iyurq5hyb0kSYYl1Z555plYtmxZzJ07Nz7xiU807PWN5oc//GFsvvnmWYcxISTkICO9vb0RUV0irZoTiXlL+lTblViz/tHrKq2+qvmet/p3Kq+Mt9f6mvUzzms93KzvZz01674LDPI7ri/vJ9BOqqnvBs8Htao81vnVXjDW6ucT8vjZMLr7778/lixZEuVyeVjibeht6Lybb745br/99oiI6Ovryzj62pXL5axDmDAScpCRwT/5Vv0zdOBNvflOAQCMTqsE8srJcCBLzifQjG677bY477zzsg5jVJ/73Of8d4+ThBwAMCLdTAFA83CykbxyMhwAxmfvvfeOt7/97fHkk09Wxm771a9+lVk8hx56aJx//vlRKBQyi6EVSMhBzhlDLp+aeeyiiMZ+X/IYE/CiZk26NnM9nMf3s57qOYacrorJgt8x5JvfKHnWzGPINev4YlqH06qKxWK8613vGjZv+fLl8fvf/z6TeG644YY44ogjMim7Fuecc04cf/zxWYexDgk5yIgx5Jp7p6jZxy5q5PcljzFRPVczt75m/YybvR5uZfWs99v9vSQbfseQb36j5FkzjyHXrL+rat9z3ebSbEqlUvzwhz+MBQsWVObNmDGjkmRKkmSd5zz88MNx1113NSzGPHv88cezDmG9JOQgI8aQa255bZkB0C7Uw+3BFc/AUOoEAGrR6ueoaE233XZbfPWrX806jBFNmjQp3vWud0WxWIyIiDRNK8vSNF3vdHd3d7zhDW+ISZPaNy3Vvq8cYAPktWUG1Jsugcgr9XB7cOIEGEqdAAC0i/333z8++clPxpIlS9ZZNjTZNdQf/vCHuOWWWyY6tIiIGBgYiG222SYOO+ywhpTXKiTkAAAAAAAAciJJknjta187ruccddRR8dnPfjZuuummGBgYiFKpFOVyuernb7zxxtHV1RUbbbRRnHTSSTFz5swolUqV7Qw+LpVKMXXq1Nh3333H+7LanoQcQA10lUa70LUHeaUeBgCgGTnGAqqxZMmSePOb3xylUqlhZS5btiwiIhYvXhwXX3xxfOhDH4r+/v4YGBiIvfbaK3bbbbeGxdKqJOQAgBHpshIAAKB+qjnGigjHWdDmnn322YYm49bnkksuGTbd09OTUSStQ0IOoAbGLgLIlnoYAACAVvXCCy80tLxXvOIVsd1220W5XI5yuRxJkkRHR0dMmjQpJk2aFIccckhD42lVEnIAAC1q9uzZoy6XsGp+WrECMJGq2ZfwPwMA9bfTTjs1tLy5c+fG3LlzR1z+4x//eMxtvPe97403v/nN9Qyr5UjIAdTA2EW0C+MbNLdWrqfUw6v5jQIwkfzHQP3ZfwOqcfPNN2cdwrg999xzWYeQexJyADXQVRrtQusb8ko9DABAMzKGHFCNbbfdNusQYs8994wkSSIi4qijjoqjjjoq44ian4QcQA20zKBduHqTvFIPAwDQjBxjAdWYMWNGdHR0RH9/f8PK3H///WP69Okxffr0OOSQQ6KjoyMKhUIUCoUoFosxf/78SJIkisViZf7QW5Ikw25dXV3R2dnZsPibgYQcADAiLeSALBm7iAj/RQC0Fi3kgGo888wzDU3GRUT88Y9/rDy+4oor6rLNq666KjbZZJO6bKsVSMgB1EBXaQDZUg+3B1ePE6ElAQAA7WerrbaKvfbaKx544IFK67Oh9xGxzvxFixZNaEzTp0+Pzs7OSNM00jSNcrkcaZpGRFSmI6Iyf/bs2TFt2rQJjanZSMhBRnp7eyPCSUIAAAAAAF706KOPxp/+9Kesw6g44YQT4uyzz66MKUdtJOQgI4OJNlf7AnmmVQIANA/dvJJXuugDgPHZbrvtYsaMGbFkyZLMYujp6cms7FYlIQcAjMi4PQDQPFxEQ165yAsAxuepp57KNBl3+umnZ1Z2K5OQAwAAAAAAyImXv/zl8Ytf/CJKpVJl3uA4beVyOUqlUjzwwAPxD//wD3Upr1AoxA477FCZvvbaa+Paa6+tTB933HFxwgkn1KWsdiYhBwAAAAAAkBN33313vP/9729YeeVyOR5++OERl3/hC1+QkKsDCTkAAAAAAICcWLx4ccPL3HfffaOrqys6OjoiSZIolUrR398fAwMDcdxxxzU8nlYkIQdQg/GMgWCsBJqZ8T7IK/Vwe5g9e/aoy41jCe1FnQAAtIvZs2fHihUrKom5QqFQuSVJUrkNnV64cGFcccUVNZd52223jbjs1ltvjZ6enpq3zWoSctAment744Mf/OCo6ziArV6172dEjLqe9xygNurh9iCZCgylTgAA2kWSJHHMMceM6zk33XTTBiXk1vb2t789Jk2aFB0dHbHvvvvWbbt5liTJWRHx3ojYYc2suRHxr2maXrOedb8eEadFxIfTNP1sNduXkIM20cytXMY66ZrFyVQtM1bL42cDtAf1cHvQGqa5jfb5DSbM6/X5VbNPUs/yAAAgb7q7u+u2rb333ju23XbbSJIkIiLmz58f8+fPr9v2B73qVa+KGTNm1H27G+CJiPj/ImJeRBQi4h0RcVWSJPumaXrn4EpJkpwUEftHxILxbFxCDsi9PCYTtcxYLY+fDfUl6UpeqYfbg/+Y5tbIz88+CQAArSRN0/jtb38bixYtilKpNOw2MDBQeVwulyNN00jTNEqlUsyYMSOef/75ynppmtZUfm9vb/T29tb3RY1gIrvCLJVKccstt8S8efNi1113jQMOOCCKxeKI66dpevVasz6WJMkZEXFQRNwZEZEkyfYR8YWIeF1E/L/xxCMhB1ADLTNoF05wklfq4faghRwwlDoBAGgXf/zjH+Of/umfMo3hiCOOqLSQG2p9Sb6h640nCXjCCSfUFFs1SqVSfOQjH4l77703Vq5cGd3d3TFr1qy4+OKLR03KDUqSpBgRb4yIaRHx+zXzJkXE/8TqbizvXd/7MxoJORgnrUWI0DKj3qrtZso4iI2nzmtueTxxWa/vlHp4tVb/jUqmAkOpExovj/sSQPtoZPfXkDf77bdfnHHGGbFo0aKYNGlSFIvF9d4KhUIkSRJJksTChQvjhz/8Yd1iuO666+q2raFxJklSmb7pppuGzRtcd6T11zc/YnUSsFwuR7lcrrQcXLFiRTz//POVGFasWBH33HNP3HLLLXHQQQeNGGuSJHtExE0R0R0Rz0fEiWma3rVm8T9HxJ/TNP1KLe+DhByMk9YiUH/V/q789hpPndfcCY88fna+U/Xl/QSGkjyh3ur1H2OcR6AW9nNpZ4VCIU4++eT1LhtMOg3ttnLw8Rvf+MYol8uV9d761rc2MuwRDcaUtVWrVsWDDz44akIuIu6PiL0jYnpE/G1EfCtJktkRsXlEnLpmWU0k5KBNVNuSwAEQwHASHgA0C/9X5JX9KQAYn3nz5sXpp5+edRijOuSQQyoXhA1ttTY4PXT++tYZ6XkjbWO0502aNCk6OjqiWCxGR0dHTJo0KXp7e+MLX/hCrFy5svK8rq6u2GWXXUZ9XWma9kXEg2smb02SZP+IOCciHo+IrSPiqSGxFCPi00mSfDBN023Hes8k5CAjg4NiNqrVhQMgoBbN3DoMAAAAoBktWbIk6xDWsc8++1TGh9tuu+3igx/84HrHmMuLI488Mn71q1/FPffcE6tWrYqurq7Yfffd44ADDhjvpgoR0RURX46ItfsE/UWsHlPuP6vZkIQcAAAAAABATsyaNSu22GKLWLx4cdahVNx+++2Vx3fccUfss88+cdhhh2UY0eiKxWJcfPHFccstt8SDDz4Yu+yySxxwwAFRLBZHfE6SJP8WEdfE6tZwG0XEKRExOyKOTdP06Yh4eq31+yNiYZqm91cTk4QcZGSwRYlWa81pPC0OfcYA9aceBgAAoFVNnz49/vd//3fUde666644++yzGxTRur7yla/Ef/3Xf1WmB1vPDXrta18bp5122qgJsIlWLBbjoIMOGmvMuKG2iojvrrn/S0TcGRFHp2n6i3rEIyEH46T7NiKqH5MvonHdkjYzv6v80t0t9Vav37t6GGBdg2N4jESdR1aq+f+PCN9PABiHJ598MtPyFy1aNOryyy+/PC6//PIoFAqVeesbI27o47GWrd1F5vrGl4uI+Od//uea9ivSND11nOvvMJ71JeRgnJycph1Ue6LbGIetT7KUevN7B5g46lfyyv8/AIzfM888E6tWrYpSqRSlUinK5XLlcalUim233TY+//nPV+Y//vjj8cUvfjHrsNdRLpcbXuYPfvCDXJ6vkpADYB0OmAEAAAAgG7///e/jYx/7WNZhjMu2224bF1544Tot1tbXiq0e8yJWd5O5dleZaZrGRhttVPfXVw8ScgAAAAAAADnx/PPPZx3COn76059GoVCoJMQGu6IcvC8Wi+t0HclwEnIAwIi0lgSA5mEMOfLKGHIAMD6zZ8+O++67L+bPn79OC7CIqMwbev/UU0/F4sWLJyymadOmTdi224WEHAAwImPIAUDzcBENeeUiLwAYn6eeeiquvPLKTGM48sgjK+PTzZkzJ9NYWoWEHAAAAAAAQE6USqVMyz/uuOPi3HPPzTSGViQhBxnp7e2NiNDyBAAAAACAiuXLl2da/kte8pJMy29VEnKQkcFEm247AAAAAAAYtMcee8RPf/rT6OvrW+/yNE2jXC6vc/+jH/0o5s6dG2marnedtectXLhwvdufPn36BL669iUhBwAAAAAAkBP9/f3x7W9/Ox577LGqn/P444/HggULairv9NNPj7e85S01PZfqScgBAAAAAADkxJ133hlXXHFFw8r78Y9/HJ2dnZEkSURE5X6kx9XOGzrd3d0ds2fPjkKhUP8X0CQk5ABoCr29vaOOuRhh3EUAAAAAmt9GG23U0PKWLFkSl1566YSXs3jx4njTm9404eXklYQcQA32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OwCADfXrX/+6ruvRuvbee2/fAwAAWsYWW2wxrDvK9fnJT34Sn/vc5xoU0bruvffeuPfeezdoG9ddd92Yr7OVSMgB4+aEx/jeg3Z/r2hufu/klXoYAIBm5BgLqMbjjz8ef/d3f5d1GMN8+MMfjoiIJEkq84Y+XtvgstHWb7dGHRJyAAAAAAAAOfHss89mHcI6jjnmmKxDaHoScpCR3t7eiDDmSbMaq9vOCOPa1Fu177n3s750UVtf1YyH5f2sjnoYAIBmZNxToFmtPYbcd7/73Zg5c2ZG0TQnCTnIyOCOlW4KaGaNTNbo1oOs1PN77jsMAAD5IkEGUJu5c+dKyI2ThBxADYxdtJokGe3A9zyf1MPtQatSquVkKgC1sr8P5NEee+wRV111VfT19UVERJqmkaZp5fHQ+8HHTz/9dJxzzjkNi/GlL31pw8pqFRJykBFdVjY3XaWtpjtDICvq4fbg5BjVcjIVgFq5qAPIq0022WTc62+zzTaxYMGCCYpouCRJGlJOK5GQg4zospJW4OQXAAAAzcxxLdCsli5dGp/97Gejv78/Ojs749lnn21YMi4i4qabboqXvexlDSuvFUjIAQAAAAAANJGrr746brrppgnZdqFQiOOPPz66urqis7Mzurq6Ko87Oztj8803j/33339Cym5lEnIAAAAAAABN5B3veEfss88+sWrVqujr64tly5bF3LlzY/LkycO6kyyXy+u9lUqlWLBgQcydO3edbZfL5bjqqqtGLf/iiy+WlBsnCTkAAAAAAIAmUigUYq+99ho275hjjhnXNhYsWBBvfetbq1p30003jVKpFKVSKbbbbrvYbbfdxlUWEnIAAAAAAABNJ03TSou3wcdpmkapVIo0TeOhhx6KK664IorFYhQKhSgWi7HjjjtGd3d3DAwMxOOPP151Wd///veju7t7Al9N65OQAwAAAAAAyIkHHngg3vve92YdRsVJJ50UXV1dWYfR9CTkICO9vb0REfHBD35wxHU+//nPx957792QeAAAAAAAyN6MGTNik002ib/85S+ZlP+ud70rTjnllCgUCsPGo2PDSMhBRgYTbb/+9a8zjQMAAAAAgPzYbLPN4qqrrhrXcx555JF417veVZfyL7vssrjsssuGzevp6anLttuZhBwAAAAAAEBOpGka1157bSxatGjY/MHWakmSrNNy7dZbb21Y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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Plot visualisation of the missing values for each feature of the raw DataFrame, df_cry_lei_events_raw\n",
"msno.matrix(df_cry_lei_events_raw, figsize = (30, 7))"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"player_id 23\n",
"keypass 1948\n",
"assist 1964\n",
"1 1809\n",
"102 1938\n",
" ... \n",
"82 1958\n",
"83 1961\n",
"88 1964\n",
"89 1964\n",
"94 1958\n",
"Length: 148, dtype: int64"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Counts of missing values\n",
"null_value_stats = df_cry_lei_events_raw.isnull().sum(axis=0)\n",
"null_value_stats[null_value_stats != 0]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"\n",
"\n",
"## 4. Data Engineering\n",
"The next step is to wrangle the dataset to into a format that’s suitable for analysis.\n",
"\n",
"This section is broken down into the following subsections:\n",
"\n",
"4.01. [Assign Raw DataFrame to Engineered DataFrame](#section4.1) \n",
"4.02. [Rename Columns](#section4.2) \n",
"4.02. [Drop Duplicate Columns](#section4.3) \n",
"4.04. [Sort the DataFrame](#section4.4) \n",
"4.05. [Determine Each Player's Most Frequent Position](#section4.5) \n",
"4.06. [Determine Each Player's Total Minutes Played](#section4.6) \n",
"4.07. [Break Down All location Attributes](#section4.7) "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"### 4.01. Assign Raw DataFrames to Engineered DataFrames"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"# Import CSV files as pandas DataFrames\n",
"\n",
"## F7 data\n",
"\n",
"### 27/09/2021: Crystal Palace (1) vs. (1) Brighton & Hove Albion (f2210324)\n",
"df_cry_bri_game = df_cry_bri_game_raw.copy()\n",
"df_cry_bri_players = df_cry_bri_players_raw.copy()\n",
"df_cry_bri_goals = df_cry_bri_goals_raw.copy()\n",
"df_cry_bri_bookings = df_cry_bri_bookings_raw.copy()\n",
"\n",
"### 03/10/2021: Crystal Palace (2) vs. (2) Leicester City (f2210334)\n",
"df_cry_lei_game = df_cry_lei_game_raw.copy()\n",
"df_cry_lei_players = df_cry_lei_players_raw.copy()\n",
"df_cry_lei_goals = df_cry_lei_goals_raw.copy()\n",
"df_cry_lei_bookings = df_cry_lei_bookings_raw.copy()\n",
"\n",
"\n",
"## F24 data\n",
"\n",
"### 27/09/2021: Crystal Palace (1) vs. (1) Brighton & Hove Albion (f2210324)\n",
"df_cry_bri_events = df_cry_bri_events_raw.copy()\n",
"\n",
"### 03/10/2021: Crystal Palace (2) vs. (2) Leicester City (f2210334)\n",
"df_cry_lei_events = df_cry_lei_events_raw.copy()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"### 4.02. Drop Columns"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"#df_cry_bri_events = df_cry_bri_events.drop('Unnamed: 0', axis=1)\n",
"#df_cry_lei_events = df_cry_bri_events.drop('Unnamed: 0', axis=1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"### 4.03. Sort DataFrames\n",
"Sorting DataFrame into correct order of matches and their events by time and date. This is important as certain features created in the subsequent sections require logic that is dependent on proceeded and subsequent events and for these to be in the correct order."
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [],
"source": [
"# Sort DataFrame by 'matchDate', 'startTime', 'matchId', 'minute', 'second', 'eventId' \n",
"#df_cry_bri_events = df_opta_events.sort_values(['startTime', 'matchId', 'minute', 'second', 'eventId'], ascending=[True, True, True, True, True])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"### 4.04. Clean Event Types Columns\n",
"Specifically with the `type_id` attribute of the Event data, there are 74 different types (65 as per the Opta F24 Appendices documentation).\n",
"\n",
"**Note:** there are 7 event types missing from the definitions list as they are not observed in the event data . The IDs of these Events are: 26, 29, 31, 33, 46, 48, 62.\n",
"\n",
"For the event types that were available in the documentation and observed in the event data, they have the following Ids and definitions ((see the Opta F24 Appendices document [[link](https://github.com/eddwebster/football_analytics/blob/master/docs/opta/f24_appendices.docx)].\n",
"\n",
"| No. | `typeName` | `typeId` | Definition |\n",
"|-----------|-------------------------------------|----------------|-----------------------------------------------|\n",
"| 1. | `Pass` | `1` | Any pass attempted from one player to another – free kicks, corners, throw ins, goal kicks and goal assists |\n",
"| 2. | `Offside Pass` | `2` | Attempted pass made to a player who is in an offside position |\n",
"| 3. | `Take On` | `3` | Attempted dribble past an opponent (excluding when qualifier 211 is present as this is ‘overrun’ and is not always a duel event) |\n",
"| 4. | `Foul` | `4` | This event is shown when a foul is committed resulting in a free kick |\n",
"| 5. | `Out` | `5` | Shown each time the ball goes out of play for a throw-in or goal kick |\n",
"| 6. | `Corner Awarded` | `6` | Ball goes out of play for a corner kick |\n",
"| 7. | `Tackle` | `7` | Tackle = dispossesses an opponent of the ball - Outcome 1 = win & retain possession or out of play, 0 = win tackle but not possession |\n",
"| 8. | `Interception` | `8` | When a player intercepts any pass event between opposition players and prevents the ball reaching its target. Cannot be a clearance. |\n",
"| 9. | `Turnover` | `9` | Unforced error / loss of possession - i.e. bad control of ball – NO LONGER USED (Replaced with Unsuccessful Touch + Overrun) |\n",
"| 10. | `Save` | `10` | Goalkeeper event; saving a shot on goal. Can also be an outfield player event with qualifier 94 for blocked shot |\n",
"| 11. | `Claim` | `11` | Goalkeeper event; catching a crossed ball |\n",
"| 12. | `Clearance` | `12` | Player under pressure hits the ball clear of the defensive zone or/and out of play |\n",
"| 13. | `MissedShots` or `Miss` | `13` | Any shot on goal which goes wide or over the goal |\n",
"| 14. | `ShotOnPost` or `Post` | `14` | Whenever the ball hits the frame of the goal |\n",
"| 15. | `SavedShot` or `Attempt Saved` | `15` | Shot saved - this event is for the player who made the shot. Qualifier 82 can be added for blocked shot. |\n",
"| 16. | `Goal` | `16` | All goals |\n",
"| 17. | `Card` | `17` | Bookings; will have red, yellow or 2nd yellow qualifier plus a reason |\n",
"| 18. | `SubstitutionOff` or`Player off` | `18` | Player is substituted off |\n",
"| 19. | `SubstitutionOn` or `Player on` | `19` | Player comes on as a substitute |\n",
"| 20. | `Player retired` | `20` | Player is forced to leave the pitch due to injury and the team have no substitutions left |\n",
"| 21. | `Player returns` | `21` | Player comes back on the pitch |\n",
"| 22. | `Player becomes goalkeeper` | `22` | When an outfield player has to replace the goalkeeper |\n",
"| 23. | `Goalkeeper becomes player` | `23` | If goalkeeper becomes an outfield player |\n",
"| 24. | `Condition change` | `24` | Change in playing conditions |\n",
"| 25. | `Official change` | `25` | Referee or linesman is replaced |\n",
"| 26. | | `26` | |\n",
"| 27. | `Start delay` | `27` | Used when there is a stoppage in play such as a player injury |\n",
"| 28. | `End delay` | `28` | Used when the stoppage ends and play resumes |\n",
"| 29. | | | |\n",
"| 30. | `End` | `30` | End of a match period |\n",
"| 31. | | | |\n",
"| 32. | `Start` | `32` | Start of a match period |\n",
"| 33. | | | |\n",
"| 34. | `FormationSet` or `Team set up` | `34` | Team line up; qualifiers 30, 44, 59, 130, 131 will show player line up and formation |\n",
"| 35. | `Player changed position` | `35` | Player moved to a different position but the team formation remained the same |\n",
"| 36. | `Player changed Jersey number` | `36` | Player is forced to change jersey number, qualifier will show the new number |\n",
"| 37. | `Collection End` | `37` | Event 30 signals end of half. This signals end of the match and thus data collection. |\n",
"| 38. | `Temp_Goal` | `38` | Goal has occurred but it is pending additional detail qualifiers from Opta. Will change to event 16. |\n",
"| 39. | `Temp_Attempt` | `39` | Shot on goal has occurred but is pending additional detail qualifiers from Opta. Will change to event 15. |\n",
"| 40. | `FormationChange` or `Formation change` | `40` | Team alters its formation |\n",
"| 41. | `Punch` | `41` | Goalkeeper event; ball is punched clear |\n",
"| 42. | `GoodSkill` or `Good Skill` | `42` | A player shows a good piece of skill on the ball Ð such as a step over or turn on the ball Ð NO LONGER USED |\n",
"| 43. | `Deleted event` | `43` | Event has been deleted Ð the event will remain as it was originally with the same ID but will be resent with the type altered to 43. |\n",
"| 44. | `Aerial` | `44` | Aerial duel Ð 50/50 when the ball is in the air Ð outcome will represent whether the duel was won or lost |\n",
"| 45. | `Challenge` | `45` | When a player fails to win the ball as an opponent successfully dribbles past them |\n",
"| 46. | | | |\n",
"| 47. | `Rescinded card` | `47` | This can occur post match if the referee rescinds a card he has awarded |\n",
"| 48. | | `48` | |\n",
"| 49. | `BallRecovery` or `Ball recovery` | `49` | Team wins the possession of the ball and successfully keeps possession for at least two passes or an attacking play |\n",
"| 50. | `Dispossessed` | `50` | Player is successfully tackled and loses possession of the ball |\n",
"| 51. | `Error` | `51` | Mistake by player losing the ball. Leads to a shot or goals as described with qualifier 169 or 170 |\n",
"| 52. | `KeeperPickup` or `Keeper pick-up` | `52` | Goalkeeper event; picks up the ball |\n",
"| 53. | `CrossNotClaimed` or `Cross not claimed` | `53` | Goalkeeper event; cross not successfully caught |\n",
"| 54. | `Smother` | `54` | Goalkeeper event; comes out and covers the ball in the box winning possession |\n",
"| 55. | `OffsideProvoked` or `Offside provoked` | `55` | Awarded to last defender when an offside decision is given against an attacker |\n",
"| 56. | `ShieldBallOpp` or `Shield ball opp` | `56` | Defender uses his body to shield the ball from an opponent as it rolls out of play |\n",
"| 57. | `Foul throw-in` | `57` | A throw-in not taken correctly resulting in the throw being awarded to the opposing team |\n",
"| 58. | `PenaltyFaced` or `Penalty faced` | `58` | Goalkeeper event; penalty by opposition team |\n",
"| 59. | `KeeperSweeper` or `Keeper Sweeper` | `59` | When keeper comes off his line and/or out of his box to clear the ball |\n",
"| 60. | `ChanceMissed` or `Chance missed` | `60` | Used when a player does not actually make a shot on goal but was in a good position to score and on`ly just missed receiving a pass |\n",
"| 61. | `BallTouch` or `Ball touch` | `61 | Used when a player makes a bad touch on the ball and loses possession. Outcome 1 Ð ball simply hit the player unintentionally. Outcome 0 Ð Player unsuccessfully controlled the ball. |\n",
"| 62. | | | |\n",
"| 63. | `Temp_Save` | `63` | An event indicating a save has occurred but without full details. Event 10 will follow shortly afterwards with full details. |\n",
"| 64. | `Resume` | `64` | Match resumes on a new date after being abandoned mid game. |\n",
"| 65. | `Contentious referee decision` | `65` | Any major talking point or error made by the referee Ð decision will be assigned to the relevant team |\n",
"| 66. | `Possession Data` | `66` | Possession event will appear every 5 mins |\n",
"| 67. | `50/50` | `67` | \tNew duel - 2 players running for a loose ball - GERMAN ONLY. Outcome 1 or 0. |\n",
"| 68. | `Referee Drop Ball` | `68` | Delay - ref stops - this to event given to both teams on restart. No Outcome |\n",
"| 69. | `Failed to Block` | `69` | New duel (put through-Q266 is the winning duel event). Attempt to block a shot or pass - challenge lost |\n",
"| 70. | `Injury Time Announcement` | `70` | Injury Time awarded by Referee |\n",
"| 71. | `Coach Setup` | `71` | Coach Type; 1,2,18,30,32,54,57,58,59 |\n",
"| 72. | `Caught Offside` | `72` | \tNew event to just show player who is offside instead of offside pass event |\n",
"| 73. | `Other Ball Contact` | `73` | This is an automated extra event for DFL. It comes with a tackle or an interception and indicates if the player who made the tackle/interception retained the ball after this action or if the tackle/interception was a single ball touch (other ball contact with type “interception”, type “Defensive Clearance” or type “ TackleRetainedBall). |\n",
"| 74. | `Blocked Pass` | `74` | Defender is close to player in possession and blocks a pass. Different from interception which is where the player has moved to intercept. |\n",
"| 75. | `Delayed Start` | `75` | Match start delayed |\n",
"| 76. | `Early end` | `76` | The match has had an early end |\n",
"| 77. | `Player Off Pitch` | `77` | Event indicating that a player is now off the pitch |\n",
"| 80. | `Unknown` | `80` | |\n",
"| 83. | `Unknown` | `83` | |"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([34, 32, 1, 49, 5, 61, 4, 12, 6, 13, 44, 43, 74, 52, 7, 55, 2,\n",
" 10, 15, 3, 45, 8, 50, 27, 28, 17, 16, 51, 11, 42, 30, 14, 18, 19,\n",
" 37, 80, 83, 67, 24])"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_cry_lei_events['type_id'].unique()"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"# Define function to \n",
"def clean_event_names(df):\n",
" \n",
" \"\"\"\n",
" Function to...\n",
" \"\"\"\n",
" \n",
" ## Read in the reference dataset of Event Types as a pandas DataFrame\n",
" df_event_types_ref = pd.read_csv(os.path.join(data_dir_opta, 'reference', 'opta_event_types.csv'))\n",
"\n",
"\n",
" ## Prepare DataFrame to create dictionary\n",
"\n",
" ### Remove Null values\n",
" df_event_types_ref = df_event_types_ref[df_event_types_ref['eventTypeId'].notna()]\n",
"\n",
" ### Convert data types\n",
" df_event_types_ref['eventTypeId'] = df_event_types_ref['eventTypeId'].astype(int)\n",
" #df_event_types_ref['eventTypeId'] = 'isEventType_' + df_event_types_ref['eventTypeId'].astype(str)\n",
"\n",
" ### \n",
" df_event_types_ref['eventTypeName'] = df_event_types_ref['eventTypeName'].str.title().str.replace(' ', '').str.replace('/', '').str.replace('-', '')\n",
" df_event_types_ref['eventTypeName'] = 'is' + df_event_types_ref['eventTypeName'].astype(str)\n",
"\n",
"\n",
" ## Create a dictionary of Event IDs and Event Names from the reference dataset\n",
" dict_event_types = dict(zip(df_event_types_ref['eventTypeId'], df_event_types_ref['eventTypeName']))\n",
" \n",
" \n",
" ## Map Event Names to Type IDs\n",
" df['event_name'] = df['type_id'].map(dict_event_types)\n",
" \n",
" \n",
" ## Return DataFrame\n",
" return df"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
"# Apply Clean Event Types column function\n",
"df_cry_lei_events = clean_event_names(df_cry_lei_events)\n",
"df_cry_bri_events = clean_event_names(df_cry_bri_events)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now that the Event Types column has been cleaned, the next stage is to clean up the Qualifier types."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"### 4.05. Clean Qualifier Types Columns\n",
"There are 229 different qualifiers with the following Ids and definitions (see the Opta F24 Appendices document [[link](https://github.com/eddwebster/football_analytics/blob/master/docs/opta/f24_appendices.docx)]). Also see the definitions on the Stats Perform website [[link](https://www.statsperform.com/opta-event-definitions/)])\n",
"\n",
"**Note:** these Qualifier Types are not to be confused with the 219 Satisified Event Types (see below), that are available in the JSON string extracted from [WhoScored!](https://www.whoscored.com/).\n",
"\n",
"**Note:** there are 19 qualifier types missing from the definitions list as they are not observed in the event data. The IDs of these Events are: 27, 43, 52, 58, 98, 99, 104, 105, 125, 126, 129, 142, 143, 148, 149, 150, 151, 152, 193.\n",
"\n",
"\n",
"| No. | `qualifierTypeName` | `qualifierTypeId` | Values | Definition | Qualifier Category | Associated Event Type (`typeName`) |\n",
"|----------|-----------------------------------|-----------------------|-------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------|-----------------------------------------|\n",
"| 1. | `Long ball` | `1` | | Long pass over 35 yards | Pass Events | 1 |\n",
"| 2. | `Cross` | `2` | | A ball played in from wide areas into the box | Pass Events | 1 |\n",
"| 3. | `Head pass` | `3` | | Pass made with a players head | Pass Events | 1 |\n",
"| 4. | `Through ball` | `4` | | Ball played through for player making an attacking run to create a chance on goal | Pass Events | 1 |\n",
"| 5. | `Free kick taken` | `5` | | Any free kick; direct or indirect | Pass Events | 1 |\n",
"| 6. | `Corner taken` | `6` | | All corners. Look for qualifier 6 but excluding qualifier 2 for short corners | Pass Events | 1 |\n",
"| 7. | `Players caught offside` | `7` | Player ID | Player who was in an offside position when pass was made. | Pass Events | 1 |\n",
"| 8. | `Goal disallowed` | `8` | | Pass led to a goal disallowed for a foul or offside | Pass Events | 1 |\n",
"| 9. | `Penalty` | `9` | | When attempt on goal was a penalty kick. ALSO used on Event type 4 to indicate a penalty was awarded | Shot Descriptors | 13, 14, 15, 16 |\n",
"| 10. | `Hand` | `10` | | Handball | Foul & Card Events | 4 |\n",
"| 11. | `6-seconds violation` | `11` | | Goalkeeper held onto the ball longer than 6 seconds resulting in a free kick | Foul & Card Events | 4 |\n",
"| 12. | `Dangerous play` | `12` | | A foul due to dangerous play | Foul & Card Events | 4 |\n",
"| 13. | `Foul` | `13` | | All fouls | Foul & Card Events | 4 |\n",
"| 14. | `Last line` | `14` | | When a player makes a defensive action and they are the last person between the opponent and the goal | Defensive Events | |\n",
"| 15. | `Head` | `15` | | Any event where the player used their head such as a shot or a clearance | Body Part | |\n",
"| 16. | `Small box-centre` | `16` | | Zone of the pitch - See appendix 7 | Shot Location Descriptors | |\n",
"| 17. | `Box-centre` | `17` | | Zone of the pitch - See appendix 7 | Shot Location Descriptors | |\n",
"| 18. | `Out of box-centre` | `18` | | Zone of the pitch - See appendix 7 | Shot Location Descriptors | |\n",
"| 19. | `35+ centre` | `19` | | Zone of the pitch - See appendix 7 | Shot Location Descriptors | |\n",
"| 20. | `Right footed` | `20` | | Player shot with right footed | Body Part | |\n",
"| 21. | `Other body part` | `21` | | Shot was neither via a player’s head or foot for example knee or chest | Body Part | |\n",
"| 22. | `Regular play` | `22` | | Shot during open play as opposed to from a set play | Pattern of Play | 13, 14, 15, 16 |\n",
"| 23. | `Fast break` | `23` | | Shot occurred following a fast break situation | Pattern of Play | 13, 14, 15, 16 |\n",
"| 24. | `Set piece` | `24` | | Shot occurred from a crossed free kick | Pattern of Play | 13, 14, 15, 16 |\n",
"| 25. | `From corner` | `25` | | Shot occurred from a corner | Pattern of Play | 13, 14, 15, 16 |\n",
"| 26. | `Free kick` | `26` | | Shot occurred directly from a free kick | Pattern of Play | 13, 14, 15, 16 |\n",
"| 27. | | | | | | |\n",
"| 28. | `own goal` | `28` | | Own goal. Note: Use the inverse coordinates of the goal location | Shot Descriptors | 13, 14, 15, 16 |\n",
"| 29. | `Assisted` | `29` | | Indicates that there was a pass (assist) from another player to set up the goal opportunity | Line Up / Subs / Formation | 13, 14, 15, 16 |\n",
"| 30. | `Involved` | `30` | | Player ID's in line up | Foul & Card Events | 32, 34, 35, 36, 40 |\n",
"| 31. | `Yellow Card` | `31` | | Player shown a yellow card | Foul & Card Events | |\n",
"| 32. | `Second yellow` | `32` | | Player receives a 2nd yellow card which automatically results in a red card | Foul & Card Events | |\n",
"| 33. | `Red Card` | `33` | | Player shown a straight red card | Foul & Card Events | |\n",
"| 34. | `Referee abuse` | `34` | | Card shown to player because of abuse to the referee | Foul & Card Events | 4 |\n",
"| 35. | `Argument` | `35` | | Card shown to player because of an argument | Foul & Card Events | 4 |\n",
"| 36. | `Fight` | `36` | | Card shown to player because of their involvement in a fight | Foul & Card Events | 4 |\n",
"| 37. | `Time wasting` | `37` | | Card shown to player for time wasting | Foul & Card Events | 4 |\n",
"| 38. | `Excessive celebration` | `38` | | Card shown to player for excessively celebrating a goal | Foul & Card Events | 4 |\n",
"| 39. | `Crowd interaction` | `39` | | Card shown to player because of contact or communication with the crowd | Foul & Card Events | 4 |\n",
"| 40. | `Other reason` | `40` | | Card shown for unknown reason | Foul & Card Events | 4 |\n",
"| 41. | `Injury` | `41` | | Substitution, event 18, because of injury | Line Up / Subs / Formation | 32, 34, 35, 36, 40 |\n",
"| 42. | `Tactical` | `42` | | Substitution, event 18 for tactical reasons | Line Up / Subs / Formation | 32, 34, 35, 36, 40 |\n",
"| 43. | | | | | | |\n",
"| 44. | `Player Position` | `44` | Dynamic | Goalkeeper, Defender, Midfielder, Forward or Substitute. These are the default / natural positions associated with each player and not necessarily the position they played in the match; see qualifier 131 for this. | Line Up / Subs / Formation | 32, 34, 35, 36, 40 |\n",
"| 45. | `Temperature` | `45` | | ... | ... | |\n",
"| 46. | `Conditions` | `46` | | ... | ... | |\n",
"| 47. | `Field Pitch` | `47` | | ... | ... | |\n",
"| 48. | `Lightings` | `48` | | ... | ... | |\n",
"| 49. | `Attendance figure` | `49` | Dynamic | Number of people in the crowd | Attendance | |\n",
"| 50. | `Official position` | `50` | 1, 2, 3, 4 | Referee, Linesman#1, Linesman#2, Forth official | Referee | |\n",
"| 51. | `Official Id` | `51` | Official ID | Unique ID for the official | Referee | |\n",
"| 52. | | | | | | |\n",
"| 53. | `Injured player id` | `53` | ID of player injured | ID of the player who is injured and causing a delay in the game | Stoppages | 27 |\n",
"| 54. | `End cause` | `54` | 1,2,3,4,5,6,7,99,100 | Golden goal, weather, crowd, insufficient players, floodlight failure, frozen pitch, waterlogged pitch, other, unknown | General | |\n",
"| 55. | `Related event ID` | `55` | Event_id | This will appear for goals or shots, the related event_id will be that of the assist and thus show the assisting player ID | Pattern of Play | 13, 14, 15, 16 |\n",
"| 56. | `Zone` | `56` | Back, left, centre, right | Area on the pitch - see appendix 7 | General | |\n",
"| 57. | `End type` | `57` | End of the match | This will be shown for substitutions, line ups, line up changes | General | |\n",
"| 58. | | | | | | |\n",
"| 59. | `Jersey Number` | `59` | Shirt number of player(s) | This will be shown for substitutions, line ups, line up changes | Line Up / Subs / Formation | 32, 34, 35, 36, 40 |\n",
"| 60. | `Small box-right` | `60` | | Zone of the pitch - See appendix 7 | Shot Location Descriptors | |\n",
"| 61. | `Small box-left` | `61` | | Zone of the pitch - See appendix 7 | Shot Location Descriptors | |\n",
"| 62. | `Box-deep right` | `62` | | Zone of the pitch - See appendix 7 | Shot Location Descriptors | |\n",
"| 63. | `Box-right` | `63` | | Zone of the pitch - See appendix 7 | Shot Location Descriptors | |\n",
"| 64. | `Box-left` | `64` | | Zone of the pitch - See appendix 7 | Shot Location Descriptors | |\n",
"| 65. | `Box-deep left` | `65` | | Zone of the pitch - See appendix 7 | Shot Location Descriptors | |\n",
"| 66. | `Out of box-deep right` | `66` | | Zone of the pitch - See appendix 7 | Shot Location Descriptors | |\n",
"| 67. | `Out of box-right` | `67` | | Zone of the pitch - See appendix 7 | Shot Location Descriptors | |\n",
"| 68. | `Out of box-left` | `68` | | Zone of the pitch - See appendix 7 | Shot Location Descriptors | |\n",
"| 69. | `Out of box-deep left` | `69` | | Zone of the pitch - See appendix 7 | Shot Location Descriptors | |\n",
"| 70. | `35+ right` | `70` | | Zone of the pitch - See appendix 7 | Shot Location Descriptors | |\n",
"| 71. | `35+ left` | `71` | | Zone of the pitch - See appendix 7 | Shot Location Descriptors | |\n",
"| 72. | `Left footed` | `72` | | Player shot with their left foot | Body Part | |\n",
"| 73. | `Left` | `73` | | Hit the left post or missed left | Shot Location Descriptors | |\n",
"| 74. | `High` | `74` | | Hit crossbar or missed over | Shot Location Descriptors | |\n",
"| 75. | `Right` | `75` | | Hit right post or missed right | Shot Location Descriptors | |\n",
"| 76. | `Low Left` | `76` | | Zone of the goalmouth - See appendix 6 | Shot Location Descriptors | |\n",
"| 77. | `High Left` | `77` | | Zone of the goalmouth - See appendix 6 | Shot Location Descriptors | |\n",
"| 78. | `Low Centre` | `78` | | Zone of the goalmouth - See appendix 6 | Shot Location Descriptors | |\n",
"| 79. | `High Centre` | `79` | | Zone of the goalmouth - See appendix 6 | Shot Location Descriptors | |\n",
"| 80. | `Low Right` | `80` | | Zone of the goalmouth - See appendix 6 | Shot Location Descriptors | |\n",
"| 81. | `High Right` | `81` | | Zone of the goalmouth - See appendix 6 | Shot Location Descriptors | |\n",
"| 82. | `Blocked` | `82` | | Zone of the goalmouth - See appendix 6 | Shot Location Descriptors | |\n",
"| 83. | `Close Left` | `83` | | Zone of the goalmouth - See appendix 6 | Shot Location Descriptors | |\n",
"| 84. | `Close Right` | `84` | | Zone of the goalmouth - See appendix 6 | Shot Location Descriptors | |\n",
"| 85. | `Close High` | `85` | | Zone of the goalmouth - See appendix 6 | Shot Location Descriptors | |\n",
"| 86. | `Close Left and High` | `86` | | Zone of the goalmouth - See appendix 6 | Shot Location Descriptors | |\n",
"| 87. | `Close Right and High` | `87` | | Zone of the goalmouth - See appendix 6 | Shot Location Descriptors | |\n",
"| 88. | `High claim` | `88` | | Event 11 Claim - Goalkeeper claims possession of a crossed ball | Goalkeeper Events | 10, 11, 12 |\n",
"| 89. | `1 on 1` | `89` | | Event 10 Save; when attacker was clear with no defenders between him and the goalkeeper | Goalkeeper Events | 10, 11, 12 |\n",
"| 90. | `Deflected save` | `90` | | Event 10 Save; when goalkeeper saves a shot but does not catch the ball | Goalkeeper Events | 10, 11, 12 |\n",
"| 91. | `Dive and deflect` | `91` | | Event 10 Save; when goalkeeper saves a shot while diving but does not catch the ball | Goalkeeper Events | 10, 11, 12 |\n",
"| 92. | `Catch` | `92` | | Event 10 Save; when goalkeeper saves a shot and catches it | Goalkeeper Events | 10, 11, 12 |\n",
"| 93. | `Dive and catch` | `93` | | Event 10 Save; when goalkeeper saves a shot while diving and catches it | Goalkeeper Events | 10, 11, 12 |\n",
"| 94. | `Def block` | `94` | | Defender blocks an opposition shot. Shown with event 10. | Defensive Events | |\n",
"| 95. | `Back pass` | `95` | | Free kick given for an illegal pass to the goalkeeper which was collected by his hands or picked up | Foul & Card Events | 4 |\n",
"| 96. | `Corner situation` | `96` | | Pass or shot event in corner situation. 25 is used when the goal is direct from corner, 96 relates to 2nd phase attack. | Pattern of Play | 13, 14, 15, 16 |\n",
"| 97. | `Direct free` | `97` | | 26 will be used for shot directly from a free kick. 97 only used with Opta GoalData (game system 4) but not with full data. | Pattern of Play | 13, 14, 15, 16 |\n",
"| 98. | | | | | | |\n",
"| 99. | | | | | | |\n",
"| 100. | `Six Yard Blocked` | `100` | | Shot blocked on the 6 yard line | Shot Location Descriptors | |\n",
"| 101. | `Saved Off Line` | `101` | | Shot saved on the goal line | Shot Location Descriptors | |\n",
"| 102. | `Goal Mouth Y Coordinate` | `102` | 0-100 | Y Co-ordinate of where a shot crossed goal line - see Appendix 4 | Shot Location Descriptors | |\n",
"| 103. | `Goal Mouth Z Coordinate` | `103` | 0-100 | Z Co-ordinate for height at which a shot crossed the goal line - see Appendix 4 | Shot Location Descriptors | |\n",
"| 104. | | | | | | |\n",
"| 105. | | | | | | |\n",
"| 106. | `Attacking Pass` | `106` | | A pass in the opposition’s half of the pitch | Pass Events | 1 |\n",
"| 107. | `Throw In` | `107` | | Throw-in taken | Pass Events | 1 |\n",
"| 108. | `Volley` | `108` | | | ... | |\n",
"| 109. | `Overhead` | `109` | | | ... | |\n",
"| 110. | `Half Volley` | `110` | | | ... | |\n",
"| 111. | `Diving Header` | `111` | | | ... | |\n",
"| 112. | `Scramble` | `112` | | Goal where there was a scramble for possession of the ball and the defence had an opportunity to clear | Pattern of Play | 13, 14, 15, 16 |\n",
"| 113. | `Strong` | `113` | | Shot was subjectively classed as strong | Shot Descriptors | 13, 14, 15, 16 |\n",
"| 114. | `Weak` | `114` | | Shot was subjectively classed as weak | Shot Descriptors | 13, 14, 15, 16 |\n",
"| 115. | `Rising` | `115` | | Shot was rising in the air | Shot Descriptors | 13, 14, 15, 16 |\n",
"| 116. | `Dipping` | `116` | | Shot was dipping towards the ground | Shot Descriptors | 13, 14, 15, 16 |\n",
"| 117. | `Lob` | `117` | | Shot was an attempt by the attacker to play the ball over the goalkeeper and into the goal | Shot Descriptors | 13, 14, 15, 16 |\n",
"| 118. | `One Bounce` | `118` | | | Shot Descriptors | 13, 14, 15, 16 |\n",
"| 119. | `Few Bounces` | `119` | | | Shot Descriptors | 13, 14, 15, 16 |\n",
"| 120. | `Swerve Left` | `120` | | Shot which swerves to the left - from attackers perspective | Shot Descriptors | 13, 14, 15, 16 |\n",
"| 121. | `Swerve Right` | `121` | | Shot which swerves to the right - from attackers perspective | Shot Descriptors | 13, 14, 15, 16 |\n",
"| 122. | `Swerve Moving` | `122` | | Shot which swerves in several directions | Shot Descriptors | 13, 14, 15, 16 |\n",
"| 123. | `Keeper Throw` | `123` | | Pass event - goalkeeper throws the ball out | Goalkeeper Events | 10, 11, 12 |\n",
"| 124. | `Goal Kick` | `124` | | Pass event – goal kick | Goalkeeper Events | 10, 11, 12 |\n",
"| 125. | | | | | | |\n",
"| 126. | | | | | | |\n",
"| 127. | `Direction of play` | `127` | Right to Left | Event type 32 - Actual direction of play in relation to TV camera. X/Y coordinates however are ALWAYS all normalized to Left to Right. | General | |\n",
"| 128. | `Punch` | `128` | | Clearance by goalkeeper where he punches the ball clear | Goalkeeper Events | 10, 11, 12 |\n",
"| 129. | | | | | | |\n",
"| 130. | `Team Formation` | `130` | Formation ID | See appendix 8 | Line Up / Subs / Formation | 32, 34, 35, 36, 40 |\n",
"| 131. | `Team Player Formation` | `131` | 1 to 11 | Player position within a formation - 'See appendix 8 | Line Up / Subs / Formation | 32, 34, 35, 36, 40 |\n",
"| 132. | `Dive` | `132` | | Free kick or card event; player penalised for simulation | Foul & Card Events | 4 |\n",
"| 133. | `Deflection` | `133` | | Shot deflected off another player | Shot Descriptors | 13, 14, 15, 16 |\n",
"| 134. | `Far Wide Left` | `134` | | | ... | |\n",
"| 135. | `Far Wide Right` | `135` | | | ... | |\n",
"| 136. | `Keeper Touched` | `136` | | Goal where the goalkeeper got a touch on the ball as it went in | Shot Descriptors | 13, 14, 15, 16 |\n",
"| 137. | `Keeper Saved` | `137` | | Shot going wide or over the goal but still collected/saved by the goalkeeper with event type 15 | Shot Descriptors | 13, 14, 15, 16 |\n",
"| 138. | `Hit Woodwork` | `138` | | Any shot which hits the post or crossbar | Shot Descriptors | 13, 14, 15, 16 |\n",
"| 139. | `Own Player` | `139` | | Shot saved by goalkeeper that was deflected by a defender | Goalkeeper Events | 13, 14, 15, 16 |\n",
"| 140. | `Pass End X` | `140` | 0-100 | The x pitch coordinate for the end point of a pass - See Appendix 5 | Pass Events | 1 |\n",
"| 141. | `Pass End Y` | `141` | 0-100 | The y pitch coordinate for the end point of a pass - See Appendix 5 | Pass Events | 1 |\n",
"| 142. | | | | | | |\n",
"| 143. | | | | | | |\n",
"| 144. | `Deleted Event Type` | `144` | Event ID | An event which should be removed. Value will show the ID of this event | General | |\n",
"| 145. | `Formation slot` | `145` | 1 to 11 | Formation position of a player coming on - see appendix 8 | Line Up / Subs / Formation | 32, 34, 35, 36, 40 |\n",
"| 146. | `Blocked X Coordinate` | `146` | 0-100 | The x pitch coordinate for where a shot was blocked | Shot Location Descriptors | |\n",
"| 147. | `Blocked Y Coordinate` | `147` | 0-100 | The y pitch coordinate for where a shot was blocked | Shot Location Descriptors | |\n",
"| 148. | | | | | | |\n",
"| 149. | | | | | | |\n",
"| 150. | | | | | | |\n",
"| 151. | | | | | | |\n",
"| 152. | | | | | | |\n",
"| 153. | `Not past goal line` | `153` | | Shot missed which does not pass the goal line | Shot Descriptors | 13, 14, 15, 16 |\n",
"| 154. | `Intentional Assist` | `154` | | Shot from an intentional assist i.e. The assisting player intended the pass, no deflection etc | Pattern of Play | 13, 14, 15, 16 |\n",
"| 155. | `Chipped` | `155` | | Pass which was chipped into the air | Pass Events | 1 |\n",
"| 156. | `Lay-off` | `156` | | Pass where player laid the ball into the path of a teammates run | Pass Events | 1 |\n",
"| 157. | `Launch` | `157` | | Pass played from a player’s own half up towards front players. Aimed to hit a zone rather than a specific player | Pass Events | 1 |\n",
"| 158. | `Persistent Infringement` | `158` | | Card shown to player for persistent fouls | Foul & Card Events | 4 |\n",
"| 159. | `Foul and Abusive Language` | `159` | | Card shown for player using foul language | Foul & Card Events | 4 |\n",
"| 160. | `Throw In set piece` | `160` | | Shot came from a throw-in set piece | Pattern of Play | 13, 14, 15, 16 |\n",
"| 161. | `Encroachment` | `161` | | Card shown for player who moves within 10 yards of an opponent’s free kick | Foul & Card Events | 4 |\n",
"| 162. | `Leaving field` | `162` | | Card shown for player leaving the field without permission | Foul & Card Events | 4 |\n",
"| 163. | `Entering field` | `163` | | Card shown for player entering the field during play without referee's permission | Foul & Card Events | 4 |\n",
"| 164. | `Spitting` | `164` | | Card shown for spitting | Foul & Card Events | 4 |\n",
"| 165. | `Professional foul` | `165` | | Card shown for a deliberate tactical foul | Foul & Card Events | 4 |\n",
"| 166. | `Handling on the line` | `166` | | Card shown to an outfield player for using their hand to keep the ball out of the goal | Foul & Card Events | 4 |\n",
"| 167. | `Out of play` | `167` | | Tackle or clearance event sent the ball out of play | Defensive Events | |\n",
"| 168. | `Flick-on` | `168` | | Pass where a player has \"flicked\" the ball forward using their head | Pass Events | 1 |\n",
"| 169. | `Leading to attempt` | `169` | | A player error, event 51, which leads to an opponent shot on goal | Defensive Events | |\n",
"| 170. | `Leading to goal` | `170` | | A player error, event 51, which lead to an opponent scoring a goal | Defensive Events | |\n",
"| 171. | `Rescinded Card` | `171` | | Referee rescind a card post match | Foul & Card Events | 4 |\n",
"| 172. | `No impact on timing` | `172` | | Player booked on bench but who hasn't played any minutes in the match | Foul & Card Events | 4 |\n",
"| 173. | `Parried safe` | `173` | | Goalkeeper save where shot is parried to safety | Goalkeeper Events | 10, 11, 12 |\n",
"| 174. | `Parried danger` | `174` | | Goalkeeper save where shot is parried but only to another opponent | Goalkeeper Events | 10, 11, 12 |\n",
"| 175. | `Fingertip` | `175` | | Goalkeeper save using his fingertips | Goalkeeper Events | 10, 11, 12 |\n",
"| 176. | `Caught` | `176` | | Goalkeeper catches the ball | Goalkeeper Events | 10, 11, 12 |\n",
"| 177. | `Collected` | `177` | | Goalkeeper save and collects possession of the ball | Goalkeeper Events | 10, 11, 12 |\n",
"| 178. | `Standing` | `178` | | Goalkeeper save while standing | Goalkeeper Events | 10, 11, 12 |\n",
"| 179. | `Diving` | `179` | | Goalkeeper save while diving | Goalkeeper Events | 10, 11, 12 |\n",
"| 180. | `Stooping` | `180` | | Goalkeeper saves while stooping | Goalkeeper Events | 10, 11, 12 |\n",
"| 181. | `Reaching` | `181` | | Goalkeeper save where goalkeeper reaches for the ball | Goalkeeper Events | 10, 11, 12 |\n",
"| 182. | `Hands` | `182` | | Goalkeeper saves with his hands | Goalkeeper Events | 10, 11, 12 |\n",
"| 183. | `Feet` | `183` | | Goalkeeper save using his feet | Goalkeeper Events | 10, 11, 12 |\n",
"| 184. | `Dissent` | `184` | | Cad shown when a player does not obey referee instructions | Foul & Card Events | 4 |\n",
"| 185. | `Blocked cross` | `185` | | Clearance; cross is blocked | Defensive Events | |\n",
"| 186. | `Scored` | `186` | | Goalkeeper event - shots faced and not saved resulting in goal | Goalkeeper Events | 10, 11, 12 |\n",
"| 187. | `Saved` | `187` | | Goalkeeper event - shots faced and saved | Goalkeeper Events | 10, 11, 12 |\n",
"| 188. | `Missed` | `188` | | Goalkeeper event - shot faced which went wide or over. Did not require a save. | Goalkeeper Events | 10, 11, 12 |\n",
"| 189. | `Player Not Visible` | `189` | | Broadcast footage showing replay and not live footage – this event is what Opta analysts believe occurred. | General | |\n",
"| 190. | `From shot off target` | `190` | | Used with Event 10. Indicates a shot was saved by the goalkeeper but in fact the shot was going wide and not on target | Goalkeeper Events | 10, 11, 12 |\n",
"| 191. | `Off the ball foul` | `191` | | Foul committed by and on a player who is not in possession of the ball | Foul & Card Events | 4 |\n",
"| 192. | `Block by hand` | `192` | | Outfield player blocks a shot with their hand | Foul & Card Events | 4 |\n",
"| 193. | | | | | | |\n",
"| 194. | `Captain` | `194` | Player ID | ID of the player who is the team captain | Line Up / Subs / Formation | 32, 34, 35, 36, 40 |\n",
"| 195. | `Pull Back` | `195` | | Player in opposition’s penalty box reaches the by-line and passes (cuts) the ball backwards to a teammate | Pass Events | 1 |\n",
"| 196. | `Switch of play` | `196` | | Any pass which crosses the centre zone of the pitch and in length is greater than 60 on the y axis of the pitch | Pass Events | 1 |\n",
"| 197. | `Team kit` | `197` | Kit ID | Kit of the team | Line Up / Subs / Formation | 32, 34, 35, 36, 40 |\n",
"| 198. | `GK hoof` | `198` | | Goalkeeper drops the ball on the ground and kicks it long towards a position rather than a specific player | Goalkeeper Events | 10, 11, 12 |\n",
"| 199. | `Gk kick from hands` | `199` | | Goalkeeper kicks the ball forward straight out of his hands | Goalkeeper Events | 10, 11, 12 |\n",
"| 200. | `Referee stop` | `200` | | Referee stops play | Referee | |\n",
"| 201. | `Referee delay` | `201` | | Delay in play instructed by referee | Referee | |\n",
"| 202. | `Weather problem` | `202` | | Bad weather stops or interrupts play | Stoppages | 27 |\n",
"| 203. | `Crowd trouble` | `203` | | Trouble within the crowd stops or delays play | Stoppages | 27 |\n",
"| 204. | `Fire` | `204` | | Fire with the stadium stops or delays play | Stoppages | 27 |\n",
"| 205. | `Object thrown on pitch` | `205` | | Object throw from the crowd lands on the pitch and delays play | Stoppages | 27 |\n",
"| 206. | `Spectator on pitch` | `206` | | Spectator comes onto the pitch and forces a delay in play | Stoppages | 27 |\n",
"| 207. | `Awaiting officials decision` | `207` | | Given to an event/delay where the referee still has to make a decision | Stoppages | 27 |\n",
"| 208. | `Referee Injury` | `208` | | Referee sustained injury causing stoppage in play | Referee / Stoppages | 27 |\n",
"| 209. | `Game end` | `209` | | The game is finished | General | |\n",
"| 210. | `Assist` | `210` | | The pass was an assist for a shot. The type of shot then dictates whether it was a goal assist or just key pass. | Pass Events | 1 |\n",
"| 211. | `Overrun` | `211` | | TAKE ON (3) – where a player takes on an opponent but the ball runs away from them out of play or to an opponent. | General | |\n",
"| 212. | `Length` | `212` | Dynamic - yards of pitch | The estimated length the ball has travelled during the associated event. | Pass Events | 1 |\n",
"| 213. | `Angle` | `213` | 0 to 6.28 (Radians) | The angle the ball travels at during an event relative to the direction of play. Shown in radians. | Pass Events | 1 |\n",
"| 214. | `Big Chance` | `214` | | Shot was deemed by Opta analysts an excellent opportunity to score – clear cut chance eg one on one | Shot Descriptors | 13, 14, 15, 16 |\n",
"| 215. | `Individual Play` | `215` | | Player created the chance to shoot by himself, not assisted. For example he dribbled to create space for himself and shot. | Shot Descriptors | 13, 14, 15, 16 |\n",
"| 216. | `2nd related event ID` | `216` | Event_id | If there was a 2nd assist, i.e a pass to create the opportunity for the player making the assist. MLS and German Bundesliga 1 & 2. | Pattern of Play | 13, 14, 15, 16 |\n",
"| 217. | `2nd assited` | `217` | | Indicates that this shot had a significant pass to create the opportunity for the pass which led to a goal | Shot Descriptors | 13, 14, 15, 16 |\n",
"| 218. | `2nd assist` | `218` | | Pass was deemed a 2nd assist - created the opportunity for another player to assist a goal | Pass Events | 1 |\n",
"| 219. | `Players on both posts` | `219` | | Assigned to event 6 indicating there were defensive players on both posts when a corner was taken | Pass Events | 1 |\n",
"| 220. | `Player on near post` | `220` | | Assigned to event 6 indicating there was a defensive player on only the near post when a corner was taken | Pass Events | 1 |\n",
"| 221. | `Player on far post` | `221` | | Assigned to event 6 indicating there was a defensive player on only the far post when corner was taken | Pass Events | 1 |\n",
"| 222. | `No players on posts` | `222` | | Assigned to event 6 indicating there were no defensive players on either post when a corner was taken | Pass Events | 1 |\n",
"| 223. | `Inswinger` | `223` | | Corner was crossed into the box swerving towards the goal | Pass Events | 1 |\n",
"| 224. | `Outswinger` | `224` | | Corner was crossed into the box swerving away from the goal | Pass Events | 1 |\n",
"| 225. | `Straight` | `225` | | Corner was crossed into the box with a straight ball flight | Pass Events | 1 |\n",
"| 226. | `Suspended` | `226` | | Game is has not finished but is suspended | Stoppages | 27 |\n",
"| 227. | `Resume` | `227` | | Game has resumed after being suspended mid-way through on a previous date | Stoppages | 27 |\n",
"| 228. | `Own shot blocked` | `228` | | Player blocks an attacking shot unintentionally from their teammate | Shot Descriptors | 13, 14, 15, 16 |\n",
"| 229. | `Post match complete` | `229` | | Opta post match quality control has been completed on this match | General | |"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
"# Define function to \n",
"def clean_qualifier_names(df):\n",
" \n",
" \"\"\"\n",
" Function to...\n",
" \"\"\"\n",
" \n",
" ## Read in the reference dataset of Event Types as a pandas DataFrame\n",
" df_qualifier_types_ref = pd.read_csv(os.path.join(data_dir_opta, 'reference', 'opta_qualifier_types.csv'))\n",
"\n",
"\n",
" ## Prepare DataFrame to create dictionary\n",
"\n",
" ### Remove Null values\n",
" df_qualifier_types_ref = df_qualifier_types_ref[df_qualifier_types_ref['qualifierTypeId'].notna()]\n",
"\n",
" ### Convert data types\n",
" df_qualifier_types_ref['qualifierTypeId'] = df_qualifier_types_ref['qualifierTypeId'].astype(int)\n",
" df_qualifier_types_ref['qualifierTypeId'] = df_qualifier_types_ref['qualifierTypeId'].astype(str)\n",
"\n",
" ### \n",
" df_qualifier_types_ref['qualifierTypeName'] = df_qualifier_types_ref['qualifierTypeName'].str.title().str.replace(' ', '').str.replace('/', '').str.replace('-', '')\n",
" df_qualifier_types_ref['qualifierTypeName'] = 'is' + df_qualifier_types_ref['qualifierTypeName'].astype(str)\n",
"\n",
"\n",
" ## Create a dictionary of Qualifier IDs and Qualifier Names from the reference dataset\n",
" dict_qualifier_types = dict(zip(df_qualifier_types_ref['qualifierTypeId'], df_qualifier_types_ref['qualifierTypeName']))\n",
"\n",
"\n",
" ## Map Qualifier Names to Qualifier IDs\n",
" df = df.rename(columns=dict_qualifier_types)\n",
" \n",
" \n",
" ## Drop Unknown columns (Qualifier Types 345-458)\n",
" df.drop(['isUnknown'], axis=1, inplace=True)\n",
" \n",
" ## Return DataFrame\n",
" return df"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"# Apply Clean Qualifier ID columns function\n",
"df_cry_lei_events = clean_qualifier_names(df_cry_lei_events)\n",
"df_cry_bri_events = clean_qualifier_names(df_cry_bri_events)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"### 4.06. Rename Columns\n",
"Some columns require to be manually renamed following the previous steps."
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"