{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Wyscout Data Engineering\n",
"##### Notebook to engineered previously parsed Event data from [Wyscout](https://wyscout.com/).\n",
"\n",
"### By [Edd Webster](https://www.twitter.com/eddwebster)\n",
"Notebook first written: 26/01/2021 \n",
"Notebook last updated: 12/02/2021\n",
"\n",
"![title](../../img/wyscout_logo.png)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## Introduction \n",
"This notebook parses pubicly available [Wyscout](https://wyscout.com/) football match data for the Big 5 European leagues for the 17/18 season, using [pandas](http://pandas.pydata.org/) for data manipulation through DataFrames.\n",
"\n",
"For more information about this notebook and the author, I'm 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/);\n",
"* [public.tableau.com/profile/edd.webster](https://public.tableau.com/profile/edd.webster);\n",
"* [kaggle.com/eddwebster](https://www.kaggle.com/eddwebster); and\n",
"* [hackerrank.com/eddwebster](https://www.hackerrank.com/eddwebster).\n",
"\n",
"![title](../../img/edd_webster/fifa21eddwebsterbanner.png)\n",
"\n",
"The accompanying GitHub repository for this notebook can be found [here](https://github.com/eddwebster/football_analytics) and a static version of this notebook can be found [here](https://nbviewer.jupyter.org/github/eddwebster/football_analytics/blob/master/notebooks/3_data_engineering/Wyscout%20Data%20Engineering.ipynb)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"___\n",
"\n",
"## Notebook Contents \n",
"1. [Notebook Dependencies](#section1) \n",
"2. [Project Brief](#section2) \n",
"3. [Data Sources](#section3) \n",
" 1. [Introduction](#section3.1) \n",
" 2. [Competitions](#section3.2) \n",
" 3. [Events](#section3.3) \n",
" 4. [Matches](#section3.4) \n",
" 5. [Players](#section3.5) \n",
" 6. [Teams](#section3.6) \n",
"4. [Data Engineering](#section4) \n",
" 1. [Join Datasets](#section4.1) \n",
" 5. [Export DataFrame](#section4.5) \n",
"5. [Exploratory Data Analysis (EDA)](#section5) \n",
" 1. [...](#section5.1) \n",
" 2. [...](#section5.2) \n",
" 3. [...](#section5.3) \n",
"6. [Summary](#section6) \n",
"7. [Next Steps](#section7) \n",
"8. [Bibliography](#section8) "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## 1. Notebook Dependencies "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"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 except for BeautifulSoup 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": [
"%load_ext autoreload\n",
"%autoreload 2\n",
"\n",
"# 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",
"import math\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 os\n",
"import re\n",
"import random\n",
"from io import BytesIO\n",
"from pathlib import Path\n",
"\n",
"# Reading directories\n",
"import glob\n",
"import os\n",
"from os.path import basename\n",
"\n",
"# Working with JSON\n",
"import json\n",
"from pandas.io.json import json_normalize\n",
"\n",
"# Data Visualisation\n",
"import matplotlib as mpl\n",
"import matplotlib.pyplot as plt\n",
"from matplotlib import patches\n",
"from matplotlib.patches import Arc\n",
"import seaborn as sns\n",
"plt.style.use('seaborn-whitegrid')\n",
"import missingno as msno\n",
"\n",
"# Downloading data sources\n",
"from urllib.parse import urlparse\n",
"from urllib.request import urlopen, urlretrieve\n",
"from zipfile import ZipFile, is_zipfile\n",
"from tqdm import tqdm # Progress Bar\n",
"\n",
"# Display in Jupyter\n",
"from IPython.display import Image, Video, 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('Setup Complete')"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Python: 3.7.6\n",
"NumPy: 1.18.0\n",
"pandas: 1.2.0\n",
"matplotlib: 3.3.2\n",
"Seaborn: 0.11.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__))\n",
"print('Seaborn: {}'.format(sns.__version__))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Defined Variables"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# Define today's date\n",
"today = datetime.datetime.now().strftime('%d/%m/%Y').replace('/', '')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Defined Filepaths"
]
},
{
"cell_type": "code",
"execution_count": 4,
"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_wyscout = os.path.join(base_dir, 'data', 'wyscout')\n",
"scripts_dir = os.path.join(base_dir, 'scripts')\n",
"scripts_dir_wyscout = os.path.join(base_dir, 'scripts', 'wyscout')\n",
"img_dir = os.path.join(base_dir, 'img')\n",
"fig_dir = os.path.join(base_dir, 'img', 'fig')\n",
"fig_dir_wyscout = os.path.join(base_dir, 'img', 'fig', 'wyscout')\n",
"video_dir = os.path.join(base_dir, 'video')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Notebook Settings"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# Display all DataFrame columns\n",
"pd.set_option('display.max_columns', None)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## 2. Project Brief \n",
"This Jupyter notebook explores how to parse pubicly available [Wyscout](https://wyscout.com/) JSON data of football matches for the Big 5 European leagues for the 17/18 season using [pandas](http://pandas.pydata.org/) for data manipulation through DataFrames.\n",
"\n",
"The resulting five engineered DataFrames for each of the Big 5 European league are exported to CSV files. This data can be further analysed in Python, joined to other datasets, or explored using Tableau, PowerBI, Microsoft Excel.\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_`.\n",
"\n",
"**References**: \n",
"This notebook uses Wyscout data, made publicly available in the following paper by Luca Pappalardo, Paolo Cintia, Alessio Rossi, Emanuele Massucco, Paolo Ferragina, Dino Pedreschi, and Fosca Giannotti. **[A Public Data Set of Spatio-Temporal Match Events in Soccer Competitions](https://www.nature.com/articles/s41597-019-0247-7)**. In *Scientific Data 6*, no. 1 (2019): 1-15."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## 3. Data Sources "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3.1. Introduction "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 3.1.1. About Wyscout \n",
"[Wyscout](https://wyscout.com/) is an Italian company that supports football scouting, match analysis and transfer dynamics. The company was founded in Genoa, Italy in 2004 and provides video analysis tools and digital databases regarding performances and matches for coaches, teams and players dealing with football business.\n",
"\n",
"![title](../../img/wyscout_logo.png)\n",
"\n",
"The purpose is to allow them have a detailed sight of a large number of athletes about individual performances, patterns of play and tactical strategy.\n",
"\n",
"This notebook explores a complete dataset of event data for the Big 5 European leagues during the 17/18 season."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 3.1.2. About the Wyscout publicly available data \n",
"A detailed description of the data can be found in the following paper:\n",
"- Pappalardo, L., Cintia, P., Rossi, A. et al. **A public data set of spatio-temporal match events in soccer competitions**. Scientific Data 6, 236 (2019) doi:10.1038/s41597-019-0247-7, https://www.nature.com/articles/s41597-019-0247-7\n",
"\n",
"It is from this paper import the *matches*, *events*, *players*, *playerank*, *referees*, *coaches*, and *competition* data sets from the figshare repository . Data are stored in the `JSON` format. \n",
"\n",
"The complete data set contains:\n",
"- 1,941 matches\n",
"- 3,251,294 events\n",
"- 4,299 players.\n",
"\n",
"The datasets we will be using are:\n",
"- competitions;\n",
"- events;\n",
"- matches;\n",
"- players; and\n",
"- teams\n",
"\n",
"The data needs to be imported as a DataFrame in the Data Sources section [Section 3](#section3) and cleaned in the Data Engineering section [Section 4](#section4)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3.2. Read in Data \n",
"The following cells read in the engineered CSV data prepared in the [Data Parsing](https://nbviewer.jupyter.org/github/eddwebster/football_analytics/blob/master/notebooks/2_data_parsing/Wyscout%20Parsing.ipynb) noteook."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 3.3.1. Data Dictionary \n",
"\n",
"The [Wyscout](https://wyscout.com/) Events dataset has twelve features (columns) with the following definitions and data types:\n",
"\n",
"| Feature | Data type |\n",
"|------|-----|\n",
"| `eventId` | int64 |\n",
"| `subEventName` | object |\n",
"| `tags` | object |\n",
"| `playerId` | int64 |\n",
"| `positions` | object |\n",
"| `matchId` | int64 |\n",
"| `eventName` | object |\n",
"| `teamId` | int64 |\n",
"| `matchPeriod` | object |\n",
"| `eventSec` | float64 |\n",
"| `subEventId` | object |\n",
"| `id` | int64 |\n",
"\n",
"Refer to the Wyscout [API docs](https://apidocs.wyscout.com/) and [Events Manual](https://footballdata.wyscout.com/wp-content/uploads/2018/03/Wyscout-Events-Manual.pdf) for further information about event and subevents."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 3.3.2. Read in CSV as pandas DataFrame "
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/opt/anaconda3/lib/python3.7/site-packages/IPython/core/interactiveshell.py:3147: DtypeWarning: Columns (18,26) have mixed types.Specify dtype option on import or set low_memory=False.\n",
" interactivity=interactivity, compiler=compiler, result=result)\n"
]
}
],
"source": [
"# Read in preparsed Wyscout Events DataFrame\n",
"df_wyscout_raw = pd.read_csv(os.path.join(data_dir_wyscout, 'raw', 'csv', 'combined', 'wyscout_big5_combined.csv'))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3.3. Initial Data Handling \n",
"Let's 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": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" eventId \n",
" subEventName \n",
" playerId \n",
" positions \n",
" matchId \n",
" eventName \n",
" teamId \n",
" matchPeriod \n",
" eventSec \n",
" subEventId \n",
" id \n",
" tags \n",
" status \n",
" roundId \n",
" gameweek \n",
" seasonId \n",
" dateutc \n",
" winner \n",
" venue \n",
" wyId_x \n",
" label \n",
" date \n",
" referees \n",
" duration \n",
" competitionId \n",
" wyId_y \n",
" area_name \n",
" weight \n",
" firstName \n",
" middleName \n",
" lastName \n",
" birthDate \n",
" height \n",
" wyId_x.1 \n",
" foot \n",
" shortName \n",
" passportArea_name \n",
" role_name \n",
" birthArea_name \n",
" name \n",
" wyId_y.1 \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 8 \n",
" Simple pass \n",
" 26010 \n",
" [{'y': 48, 'x': 50}, {'y': 50, 'x': 47}] \n",
" 1694390 \n",
" Pass \n",
" 4418 \n",
" 1H \n",
" 1.255990 \n",
" 85.0 \n",
" 88178642 \n",
" [{'id': 1801}] \n",
" Played \n",
" 4165470 \n",
" 1 \n",
" 9291 \n",
" 2016-06-10 19:00:00 \n",
" 4418 \n",
" Stade de France \n",
" 1694390 \n",
" France - Romania, 2 - 1 \n",
" 2016-06-10 21:00:00-02:00 \n",
" [{'refereeId': 383185, 'role': 'referee'}, {'r... \n",
" Regular \n",
" 102 \n",
" 102 \n",
" NaN \n",
" 88 \n",
" Olivier \n",
" NaN \n",
" Giroud \n",
" 1986-09-30 \n",
" 192 \n",
" 26010 \n",
" left \n",
" O. Giroud \n",
" France \n",
" Forward \n",
" France \n",
" France \n",
" 4418 \n",
" \n",
" \n",
" 1 \n",
" 8 \n",
" Simple pass \n",
" 3682 \n",
" [{'y': 50, 'x': 47}, {'y': 48, 'x': 41}] \n",
" 1694390 \n",
" Pass \n",
" 4418 \n",
" 1H \n",
" 2.351908 \n",
" 85.0 \n",
" 88178643 \n",
" [{'id': 1801}] \n",
" Played \n",
" 4165470 \n",
" 1 \n",
" 9291 \n",
" 2016-06-10 19:00:00 \n",
" 4418 \n",
" Stade de France \n",
" 1694390 \n",
" France - Romania, 2 - 1 \n",
" 2016-06-10 21:00:00-02:00 \n",
" [{'refereeId': 383185, 'role': 'referee'}, {'r... \n",
" Regular \n",
" 102 \n",
" 102 \n",
" NaN \n",
" 71 \n",
" Antoine \n",
" NaN \n",
" Griezmann \n",
" 1991-03-21 \n",
" 175 \n",
" 3682 \n",
" left \n",
" A. Griezmann \n",
" France \n",
" Forward \n",
" France \n",
" France \n",
" 4418 \n",
" \n",
" \n",
" 2 \n",
" 8 \n",
" Simple pass \n",
" 31528 \n",
" [{'y': 48, 'x': 41}, {'y': 35, 'x': 32}] \n",
" 1694390 \n",
" Pass \n",
" 4418 \n",
" 1H \n",
" 3.241028 \n",
" 85.0 \n",
" 88178644 \n",
" [{'id': 1801}] \n",
" Played \n",
" 4165470 \n",
" 1 \n",
" 9291 \n",
" 2016-06-10 19:00:00 \n",
" 4418 \n",
" Stade de France \n",
" 1694390 \n",
" France - Romania, 2 - 1 \n",
" 2016-06-10 21:00:00-02:00 \n",
" [{'refereeId': 383185, 'role': 'referee'}, {'r... \n",
" Regular \n",
" 102 \n",
" 102 \n",
" NaN \n",
" 68 \n",
" N'Golo \n",
" NaN \n",
" Kanté \n",
" 1991-03-29 \n",
" 168 \n",
" 31528 \n",
" right \n",
" N. Kanté \n",
" Mali \n",
" Midfielder \n",
" France \n",
" France \n",
" 4418 \n",
" \n",
" \n",
" 3 \n",
" 8 \n",
" High pass \n",
" 7855 \n",
" [{'y': 35, 'x': 32}, {'y': 6, 'x': 89}] \n",
" 1694390 \n",
" Pass \n",
" 4418 \n",
" 1H \n",
" 6.033681 \n",
" 83.0 \n",
" 88178645 \n",
" [{'id': 1802}] \n",
" Played \n",
" 4165470 \n",
" 1 \n",
" 9291 \n",
" 2016-06-10 19:00:00 \n",
" 4418 \n",
" Stade de France \n",
" 1694390 \n",
" France - Romania, 2 - 1 \n",
" 2016-06-10 21:00:00-02:00 \n",
" [{'refereeId': 383185, 'role': 'referee'}, {'r... \n",
" Regular \n",
" 102 \n",
" 102 \n",
" NaN \n",
" 75 \n",
" Laurent \n",
" NaN \n",
" Koscielny \n",
" 1985-09-10 \n",
" 186 \n",
" 7855 \n",
" right \n",
" L. Koscielny \n",
" Poland \n",
" Defender \n",
" France \n",
" France \n",
" 4418 \n",
" \n",
" \n",
" 4 \n",
" 1 \n",
" Ground defending duel \n",
" 25437 \n",
" [{'y': 6, 'x': 89}, {'y': 0, 'x': 85}] \n",
" 1694390 \n",
" Duel \n",
" 4418 \n",
" 1H \n",
" 13.143591 \n",
" 12.0 \n",
" 88178646 \n",
" [{'id': 702}, {'id': 1801}] \n",
" Played \n",
" 4165470 \n",
" 1 \n",
" 9291 \n",
" 2016-06-10 19:00:00 \n",
" 4418 \n",
" Stade de France \n",
" 1694390 \n",
" France - Romania, 2 - 1 \n",
" 2016-06-10 21:00:00-02:00 \n",
" [{'refereeId': 383185, 'role': 'referee'}, {'r... \n",
" Regular \n",
" 102 \n",
" 102 \n",
" NaN \n",
" 70 \n",
" Blaise \n",
" NaN \n",
" Matuidi \n",
" 1987-04-09 \n",
" 175 \n",
" 25437 \n",
" left \n",
" B. Matuidi \n",
" Angola \n",
" Midfielder \n",
" France \n",
" France \n",
" 4418 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" eventId subEventName playerId \\\n",
"0 8 Simple pass 26010 \n",
"1 8 Simple pass 3682 \n",
"2 8 Simple pass 31528 \n",
"3 8 High pass 7855 \n",
"4 1 Ground defending duel 25437 \n",
"\n",
" positions matchId eventName teamId \\\n",
"0 [{'y': 48, 'x': 50}, {'y': 50, 'x': 47}] 1694390 Pass 4418 \n",
"1 [{'y': 50, 'x': 47}, {'y': 48, 'x': 41}] 1694390 Pass 4418 \n",
"2 [{'y': 48, 'x': 41}, {'y': 35, 'x': 32}] 1694390 Pass 4418 \n",
"3 [{'y': 35, 'x': 32}, {'y': 6, 'x': 89}] 1694390 Pass 4418 \n",
"4 [{'y': 6, 'x': 89}, {'y': 0, 'x': 85}] 1694390 Duel 4418 \n",
"\n",
" matchPeriod eventSec subEventId id tags \\\n",
"0 1H 1.255990 85.0 88178642 [{'id': 1801}] \n",
"1 1H 2.351908 85.0 88178643 [{'id': 1801}] \n",
"2 1H 3.241028 85.0 88178644 [{'id': 1801}] \n",
"3 1H 6.033681 83.0 88178645 [{'id': 1802}] \n",
"4 1H 13.143591 12.0 88178646 [{'id': 702}, {'id': 1801}] \n",
"\n",
" status roundId gameweek seasonId dateutc winner \\\n",
"0 Played 4165470 1 9291 2016-06-10 19:00:00 4418 \n",
"1 Played 4165470 1 9291 2016-06-10 19:00:00 4418 \n",
"2 Played 4165470 1 9291 2016-06-10 19:00:00 4418 \n",
"3 Played 4165470 1 9291 2016-06-10 19:00:00 4418 \n",
"4 Played 4165470 1 9291 2016-06-10 19:00:00 4418 \n",
"\n",
" venue wyId_x label \\\n",
"0 Stade de France 1694390 France - Romania, 2 - 1 \n",
"1 Stade de France 1694390 France - Romania, 2 - 1 \n",
"2 Stade de France 1694390 France - Romania, 2 - 1 \n",
"3 Stade de France 1694390 France - Romania, 2 - 1 \n",
"4 Stade de France 1694390 France - Romania, 2 - 1 \n",
"\n",
" date \\\n",
"0 2016-06-10 21:00:00-02:00 \n",
"1 2016-06-10 21:00:00-02:00 \n",
"2 2016-06-10 21:00:00-02:00 \n",
"3 2016-06-10 21:00:00-02:00 \n",
"4 2016-06-10 21:00:00-02:00 \n",
"\n",
" referees duration competitionId \\\n",
"0 [{'refereeId': 383185, 'role': 'referee'}, {'r... Regular 102 \n",
"1 [{'refereeId': 383185, 'role': 'referee'}, {'r... Regular 102 \n",
"2 [{'refereeId': 383185, 'role': 'referee'}, {'r... Regular 102 \n",
"3 [{'refereeId': 383185, 'role': 'referee'}, {'r... Regular 102 \n",
"4 [{'refereeId': 383185, 'role': 'referee'}, {'r... Regular 102 \n",
"\n",
" wyId_y area_name weight firstName middleName lastName birthDate \\\n",
"0 102 NaN 88 Olivier NaN Giroud 1986-09-30 \n",
"1 102 NaN 71 Antoine NaN Griezmann 1991-03-21 \n",
"2 102 NaN 68 N'Golo NaN Kanté 1991-03-29 \n",
"3 102 NaN 75 Laurent NaN Koscielny 1985-09-10 \n",
"4 102 NaN 70 Blaise NaN Matuidi 1987-04-09 \n",
"\n",
" height wyId_x.1 foot shortName passportArea_name role_name \\\n",
"0 192 26010 left O. Giroud France Forward \n",
"1 175 3682 left A. Griezmann France Forward \n",
"2 168 31528 right N. Kanté Mali Midfielder \n",
"3 186 7855 right L. Koscielny Poland Defender \n",
"4 175 25437 left B. Matuidi Angola Midfielder \n",
"\n",
" birthArea_name name wyId_y.1 \n",
"0 France France 4418 \n",
"1 France France 4418 \n",
"2 France France 4418 \n",
"3 France France 4418 \n",
"4 France France 4418 "
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Display the first 5 rows of the raw DataFrame, df_wyscout_raw\n",
"df_wyscout_raw.head()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" eventId \n",
" subEventName \n",
" playerId \n",
" positions \n",
" matchId \n",
" eventName \n",
" teamId \n",
" matchPeriod \n",
" eventSec \n",
" subEventId \n",
" id \n",
" tags \n",
" status \n",
" roundId \n",
" gameweek \n",
" seasonId \n",
" dateutc \n",
" winner \n",
" venue \n",
" wyId_x \n",
" label \n",
" date \n",
" referees \n",
" duration \n",
" competitionId \n",
" wyId_y \n",
" area_name \n",
" weight \n",
" firstName \n",
" middleName \n",
" lastName \n",
" birthDate \n",
" height \n",
" wyId_x.1 \n",
" foot \n",
" shortName \n",
" passportArea_name \n",
" role_name \n",
" birthArea_name \n",
" name \n",
" wyId_y.1 \n",
" \n",
" \n",
" \n",
" \n",
" 3025251 \n",
" 2 \n",
" Foul \n",
" 21234 \n",
" [{'y': 87, 'x': 24}, {'y': 82, 'x': 26}] \n",
" 2576338 \n",
" Foul \n",
" 3185 \n",
" 2H \n",
" 2824.741855 \n",
" 20.0 \n",
" 253567159 \n",
" [] \n",
" Played \n",
" 4406278 \n",
" 38 \n",
" 181248 \n",
" 2018-05-20 13:00:00 \n",
" 3185 \n",
" NaN \n",
" 2576338 \n",
" Genoa - Torino, 1 - 2 \n",
" May 20, 2018 at 3:00:00 PM GMT+2 \n",
" [{'refereeId': 393614, 'role': 'referee'}, {'r... \n",
" Regular \n",
" 524 \n",
" 524 \n",
" Italy \n",
" 72 \n",
" Andrea \n",
" NaN \n",
" Belotti \n",
" 1993-12-20 \n",
" 181 \n",
" 21234 \n",
" right \n",
" A. Belotti \n",
" Italy \n",
" Forward \n",
" Italy \n",
" Torino \n",
" 3185 \n",
" \n",
" \n",
" 3025252 \n",
" 3 \n",
" Free kick cross \n",
" 70974 \n",
" [{'y': 23, 'x': 75}, {'y': 65, 'x': 95}] \n",
" 2576338 \n",
" Free Kick \n",
" 3193 \n",
" 2H \n",
" 2870.982660 \n",
" 32.0 \n",
" 253567160 \n",
" [{'id': 801}, {'id': 1801}] \n",
" Played \n",
" 4406278 \n",
" 38 \n",
" 181248 \n",
" 2018-05-20 13:00:00 \n",
" 3185 \n",
" NaN \n",
" 2576338 \n",
" Genoa - Torino, 1 - 2 \n",
" May 20, 2018 at 3:00:00 PM GMT+2 \n",
" [{'refereeId': 393614, 'role': 'referee'}, {'r... \n",
" Regular \n",
" 524 \n",
" 524 \n",
" Italy \n",
" 64 \n",
" Iuri José \n",
" NaN \n",
" Picanço Medeiros \n",
" 1994-07-10 \n",
" 174 \n",
" 70974 \n",
" left \n",
" Iuri Medeiros \n",
" Portugal \n",
" Forward \n",
" Portugal \n",
" Genoa \n",
" 3193 \n",
" \n",
" \n",
" 3025253 \n",
" 1 \n",
" Ground loose ball duel \n",
" 14745 \n",
" [{'y': 35, 'x': 5}, {'y': 36, 'x': 3}] \n",
" 2576338 \n",
" Duel \n",
" 3185 \n",
" 2H \n",
" 2872.101142 \n",
" 13.0 \n",
" 253567161 \n",
" [{'id': 702}, {'id': 1801}] \n",
" Played \n",
" 4406278 \n",
" 38 \n",
" 181248 \n",
" 2018-05-20 13:00:00 \n",
" 3185 \n",
" NaN \n",
" 2576338 \n",
" Genoa - Torino, 1 - 2 \n",
" May 20, 2018 at 3:00:00 PM GMT+2 \n",
" [{'refereeId': 393614, 'role': 'referee'}, {'r... \n",
" Regular \n",
" 524 \n",
" 524 \n",
" Italy \n",
" 82 \n",
" Cristian \n",
" NaN \n",
" Molinaro \n",
" 1983-07-30 \n",
" 182 \n",
" 14745 \n",
" left \n",
" C. Molinaro \n",
" Italy \n",
" Defender \n",
" Italy \n",
" Torino \n",
" 3185 \n",
" \n",
" \n",
" 3025254 \n",
" 1 \n",
" Ground loose ball duel \n",
" 413041 \n",
" [{'y': 65, 'x': 95}, {'y': 64, 'x': 97}] \n",
" 2576338 \n",
" Duel \n",
" 3193 \n",
" 2H \n",
" 2872.990437 \n",
" 13.0 \n",
" 253567163 \n",
" [{'id': 702}, {'id': 1801}] \n",
" Played \n",
" 4406278 \n",
" 38 \n",
" 181248 \n",
" 2018-05-20 13:00:00 \n",
" 3185 \n",
" NaN \n",
" 2576338 \n",
" Genoa - Torino, 1 - 2 \n",
" May 20, 2018 at 3:00:00 PM GMT+2 \n",
" [{'refereeId': 393614, 'role': 'referee'}, {'r... \n",
" Regular \n",
" 524 \n",
" 524 \n",
" Italy \n",
" 83 \n",
" Jawad \n",
" NaN \n",
" El Yamiq \n",
" 1992-02-29 \n",
" 190 \n",
" 413041 \n",
" right \n",
" J. El Yamiq \n",
" Morocco \n",
" Defender \n",
" Morocco \n",
" Genoa \n",
" 3193 \n",
" \n",
" \n",
" 3025255 \n",
" 1 \n",
" Air duel \n",
" 20927 \n",
" [{'y': 36, 'x': 3}, {'y': 100, 'x': 100}] \n",
" 2576338 \n",
" Duel \n",
" 3185 \n",
" 2H \n",
" 2874.049206 \n",
" 10.0 \n",
" 253567162 \n",
" [{'id': 703}, {'id': 1801}] \n",
" Played \n",
" 4406278 \n",
" 38 \n",
" 181248 \n",
" 2018-05-20 13:00:00 \n",
" 3185 \n",
" NaN \n",
" 2576338 \n",
" Genoa - Torino, 1 - 2 \n",
" May 20, 2018 at 3:00:00 PM GMT+2 \n",
" [{'refereeId': 393614, 'role': 'referee'}, {'r... \n",
" Regular \n",
" 524 \n",
" 524 \n",
" Italy \n",
" 84 \n",
" Lorenzo \n",
" NaN \n",
" De Silvestri \n",
" 1988-05-23 \n",
" 186 \n",
" 20927 \n",
" right \n",
" L. De Silvestri \n",
" Italy \n",
" Defender \n",
" Italy \n",
" Torino \n",
" 3185 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" eventId subEventName playerId \\\n",
"3025251 2 Foul 21234 \n",
"3025252 3 Free kick cross 70974 \n",
"3025253 1 Ground loose ball duel 14745 \n",
"3025254 1 Ground loose ball duel 413041 \n",
"3025255 1 Air duel 20927 \n",
"\n",
" positions matchId eventName \\\n",
"3025251 [{'y': 87, 'x': 24}, {'y': 82, 'x': 26}] 2576338 Foul \n",
"3025252 [{'y': 23, 'x': 75}, {'y': 65, 'x': 95}] 2576338 Free Kick \n",
"3025253 [{'y': 35, 'x': 5}, {'y': 36, 'x': 3}] 2576338 Duel \n",
"3025254 [{'y': 65, 'x': 95}, {'y': 64, 'x': 97}] 2576338 Duel \n",
"3025255 [{'y': 36, 'x': 3}, {'y': 100, 'x': 100}] 2576338 Duel \n",
"\n",
" teamId matchPeriod eventSec subEventId id \\\n",
"3025251 3185 2H 2824.741855 20.0 253567159 \n",
"3025252 3193 2H 2870.982660 32.0 253567160 \n",
"3025253 3185 2H 2872.101142 13.0 253567161 \n",
"3025254 3193 2H 2872.990437 13.0 253567163 \n",
"3025255 3185 2H 2874.049206 10.0 253567162 \n",
"\n",
" tags status roundId gameweek seasonId \\\n",
"3025251 [] Played 4406278 38 181248 \n",
"3025252 [{'id': 801}, {'id': 1801}] Played 4406278 38 181248 \n",
"3025253 [{'id': 702}, {'id': 1801}] Played 4406278 38 181248 \n",
"3025254 [{'id': 702}, {'id': 1801}] Played 4406278 38 181248 \n",
"3025255 [{'id': 703}, {'id': 1801}] Played 4406278 38 181248 \n",
"\n",
" dateutc winner venue wyId_x label \\\n",
"3025251 2018-05-20 13:00:00 3185 NaN 2576338 Genoa - Torino, 1 - 2 \n",
"3025252 2018-05-20 13:00:00 3185 NaN 2576338 Genoa - Torino, 1 - 2 \n",
"3025253 2018-05-20 13:00:00 3185 NaN 2576338 Genoa - Torino, 1 - 2 \n",
"3025254 2018-05-20 13:00:00 3185 NaN 2576338 Genoa - Torino, 1 - 2 \n",
"3025255 2018-05-20 13:00:00 3185 NaN 2576338 Genoa - Torino, 1 - 2 \n",
"\n",
" date \\\n",
"3025251 May 20, 2018 at 3:00:00 PM GMT+2 \n",
"3025252 May 20, 2018 at 3:00:00 PM GMT+2 \n",
"3025253 May 20, 2018 at 3:00:00 PM GMT+2 \n",
"3025254 May 20, 2018 at 3:00:00 PM GMT+2 \n",
"3025255 May 20, 2018 at 3:00:00 PM GMT+2 \n",
"\n",
" referees duration \\\n",
"3025251 [{'refereeId': 393614, 'role': 'referee'}, {'r... Regular \n",
"3025252 [{'refereeId': 393614, 'role': 'referee'}, {'r... Regular \n",
"3025253 [{'refereeId': 393614, 'role': 'referee'}, {'r... Regular \n",
"3025254 [{'refereeId': 393614, 'role': 'referee'}, {'r... Regular \n",
"3025255 [{'refereeId': 393614, 'role': 'referee'}, {'r... Regular \n",
"\n",
" competitionId wyId_y area_name weight firstName middleName \\\n",
"3025251 524 524 Italy 72 Andrea NaN \n",
"3025252 524 524 Italy 64 Iuri José NaN \n",
"3025253 524 524 Italy 82 Cristian NaN \n",
"3025254 524 524 Italy 83 Jawad NaN \n",
"3025255 524 524 Italy 84 Lorenzo NaN \n",
"\n",
" lastName birthDate height wyId_x.1 foot \\\n",
"3025251 Belotti 1993-12-20 181 21234 right \n",
"3025252 Picanço Medeiros 1994-07-10 174 70974 left \n",
"3025253 Molinaro 1983-07-30 182 14745 left \n",
"3025254 El Yamiq 1992-02-29 190 413041 right \n",
"3025255 De Silvestri 1988-05-23 186 20927 right \n",
"\n",
" shortName passportArea_name role_name birthArea_name name \\\n",
"3025251 A. Belotti Italy Forward Italy Torino \n",
"3025252 Iuri Medeiros Portugal Forward Portugal Genoa \n",
"3025253 C. Molinaro Italy Defender Italy Torino \n",
"3025254 J. El Yamiq Morocco Defender Morocco Genoa \n",
"3025255 L. De Silvestri Italy Defender Italy Torino \n",
"\n",
" wyId_y.1 \n",
"3025251 3185 \n",
"3025252 3193 \n",
"3025253 3185 \n",
"3025254 3193 \n",
"3025255 3185 "
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Display the last 5 rows of the raw DataFrame, df_wyscout_raw\n",
"df_wyscout_raw.tail()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(3025256, 41)\n"
]
}
],
"source": [
"# Print the shape of the raw DataFrame, ddf_wyscout_raw\n",
"print(df_wyscout_raw.shape)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Index(['eventId', 'subEventName', 'playerId', 'positions', 'matchId',\n",
" 'eventName', 'teamId', 'matchPeriod', 'eventSec', 'subEventId', 'id',\n",
" 'tags', 'status', 'roundId', 'gameweek', 'seasonId', 'dateutc',\n",
" 'winner', 'venue', 'wyId_x', 'label', 'date', 'referees', 'duration',\n",
" 'competitionId', 'wyId_y', 'area_name', 'weight', 'firstName',\n",
" 'middleName', 'lastName', 'birthDate', 'height', 'wyId_x.1', 'foot',\n",
" 'shortName', 'passportArea_name', 'role_name', 'birthArea_name', 'name',\n",
" 'wyId_y.1'],\n",
" dtype='object')\n"
]
}
],
"source": [
"# Print the column names of the raw DataFrame, df_wyscout_raw\n",
"print(df_wyscout_raw.columns)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The joined dataset has forty features (columns). Full details of these attributes can be found in the [Data Dictionary](section3.3.1)."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"eventId int64\n",
"subEventName object\n",
"playerId int64\n",
"positions object\n",
"matchId int64\n",
"eventName object\n",
"teamId int64\n",
"matchPeriod object\n",
"eventSec float64\n",
"subEventId float64\n",
"id int64\n",
"tags object\n",
"status object\n",
"roundId int64\n",
"gameweek int64\n",
"seasonId int64\n",
"dateutc object\n",
"winner int64\n",
"venue object\n",
"wyId_x int64\n",
"label object\n",
"date object\n",
"referees object\n",
"duration object\n",
"competitionId int64\n",
"wyId_y int64\n",
"area_name object\n",
"weight int64\n",
"firstName object\n",
"middleName float64\n",
"lastName object\n",
"birthDate object\n",
"height int64\n",
"wyId_x.1 int64\n",
"foot object\n",
"shortName object\n",
"passportArea_name object\n",
"role_name object\n",
"birthArea_name object\n",
"name object\n",
"wyId_y.1 int64\n",
"dtype: object"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Data types of the features of the raw DataFrame, df_wyscout_raw\n",
"df_wyscout_raw.dtypes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Full details of these attributes and their data types can be found in the [Data Dictionary](section3.3.1)."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"RangeIndex: 3025256 entries, 0 to 3025255\n",
"Data columns (total 41 columns):\n",
" # Column Dtype \n",
"--- ------ ----- \n",
" 0 eventId int64 \n",
" 1 subEventName object \n",
" 2 playerId int64 \n",
" 3 positions object \n",
" 4 matchId int64 \n",
" 5 eventName object \n",
" 6 teamId int64 \n",
" 7 matchPeriod object \n",
" 8 eventSec float64\n",
" 9 subEventId float64\n",
" 10 id int64 \n",
" 11 tags object \n",
" 12 status object \n",
" 13 roundId int64 \n",
" 14 gameweek int64 \n",
" 15 seasonId int64 \n",
" 16 dateutc object \n",
" 17 winner int64 \n",
" 18 venue object \n",
" 19 wyId_x int64 \n",
" 20 label object \n",
" 21 date object \n",
" 22 referees object \n",
" 23 duration object \n",
" 24 competitionId int64 \n",
" 25 wyId_y int64 \n",
" 26 area_name object \n",
" 27 weight int64 \n",
" 28 firstName object \n",
" 29 middleName float64\n",
" 30 lastName object \n",
" 31 birthDate object \n",
" 32 height int64 \n",
" 33 wyId_x.1 int64 \n",
" 34 foot object \n",
" 35 shortName object \n",
" 36 passportArea_name object \n",
" 37 role_name object \n",
" 38 birthArea_name object \n",
" 39 name object \n",
" 40 wyId_y.1 int64 \n",
"dtypes: float64(3), int64(16), object(22)\n",
"memory usage: 946.3+ MB\n"
]
}
],
"source": [
"# Info for the raw DataFrame, df_wyscout_raw\n",
"df_wyscout_raw.info()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" eventId \n",
" playerId \n",
" matchId \n",
" teamId \n",
" eventSec \n",
" subEventId \n",
" id \n",
" roundId \n",
" gameweek \n",
" seasonId \n",
" winner \n",
" wyId_x \n",
" competitionId \n",
" wyId_y \n",
" weight \n",
" middleName \n",
" height \n",
" wyId_x.1 \n",
" wyId_y.1 \n",
" \n",
" \n",
" \n",
" \n",
" count \n",
" 3.025256e+06 \n",
" 3.025256e+06 \n",
" 3.025256e+06 \n",
" 3.025256e+06 \n",
" 3.025256e+06 \n",
" 3.017102e+06 \n",
" 3.025256e+06 \n",
" 3.025256e+06 \n",
" 3.025256e+06 \n",
" 3.025256e+06 \n",
" 3.025256e+06 \n",
" 3.025256e+06 \n",
" 3.025256e+06 \n",
" 3.025256e+06 \n",
" 3.025256e+06 \n",
" 0.0 \n",
" 3.025256e+06 \n",
" 3.025256e+06 \n",
" 3.025256e+06 \n",
" \n",
" \n",
" mean \n",
" 5.694230e+00 \n",
" 8.953778e+04 \n",
" 2.494932e+06 \n",
" 3.004373e+03 \n",
" 1.390728e+03 \n",
" 6.013484e+01 \n",
" 2.158336e+08 \n",
" 4.391560e+06 \n",
" 1.815116e+01 \n",
" 1.709805e+05 \n",
" 2.317237e+03 \n",
" 2.494932e+06 \n",
" 4.797790e+02 \n",
" 4.797790e+02 \n",
" 7.622714e+01 \n",
" NaN \n",
" 1.820490e+02 \n",
" 8.953778e+04 \n",
" 3.004373e+03 \n",
" \n",
" \n",
" std \n",
" 3.141030e+00 \n",
" 1.169272e+05 \n",
" 1.591746e+05 \n",
" 2.925207e+03 \n",
" 8.347843e+02 \n",
" 3.257763e+01 \n",
" 3.023051e+07 \n",
" 5.686541e+04 \n",
" 1.126545e+01 \n",
" 4.054451e+04 \n",
" 3.021050e+03 \n",
" 1.591746e+05 \n",
" 1.845044e+02 \n",
" 1.845044e+02 \n",
" 7.149052e+00 \n",
" NaN \n",
" 7.032542e+00 \n",
" 1.169272e+05 \n",
" 2.925207e+03 \n",
" \n",
" \n",
" min \n",
" 1.000000e+00 \n",
" 1.200000e+01 \n",
" 1.694390e+06 \n",
" 6.740000e+02 \n",
" 0.000000e+00 \n",
" 1.000000e+01 \n",
" 8.817864e+07 \n",
" 4.165363e+06 \n",
" 0.000000e+00 \n",
" 9.291000e+03 \n",
" 0.000000e+00 \n",
" 1.694390e+06 \n",
" 2.800000e+01 \n",
" 2.800000e+01 \n",
" 0.000000e+00 \n",
" NaN \n",
" 0.000000e+00 \n",
" 1.200000e+01 \n",
" 6.740000e+02 \n",
" \n",
" \n",
" 25% \n",
" 1.000000e+00 \n",
" 9.380000e+03 \n",
" 2.500086e+06 \n",
" 1.619000e+03 \n",
" 6.608105e+02 \n",
" 1.300000e+01 \n",
" 1.988861e+08 \n",
" 4.405654e+06 \n",
" 8.000000e+00 \n",
" 1.811440e+05 \n",
" 6.740000e+02 \n",
" 2.500086e+06 \n",
" 3.640000e+02 \n",
" 3.640000e+02 \n",
" 7.200000e+01 \n",
" NaN \n",
" 1.780000e+02 \n",
" 9.380000e+03 \n",
" 1.619000e+03 \n",
" \n",
" \n",
" 50% \n",
" 8.000000e+00 \n",
" 2.562300e+04 \n",
" 2.516836e+06 \n",
" 2.460000e+03 \n",
" 1.374896e+03 \n",
" 8.300000e+01 \n",
" 2.191298e+08 \n",
" 4.405655e+06 \n",
" 1.800000e+01 \n",
" 1.811500e+05 \n",
" 1.633000e+03 \n",
" 2.516836e+06 \n",
" 4.260000e+02 \n",
" 4.260000e+02 \n",
" 7.600000e+01 \n",
" NaN \n",
" 1.820000e+02 \n",
" 2.562300e+04 \n",
" 2.460000e+03 \n",
" \n",
" \n",
" 75% \n",
" 8.000000e+00 \n",
" 1.345420e+05 \n",
" 2.565827e+06 \n",
" 3.766000e+03 \n",
" 2.109554e+03 \n",
" 8.500000e+01 \n",
" 2.352463e+08 \n",
" 4.406122e+06 \n",
" 2.800000e+01 \n",
" 1.811890e+05 \n",
" 3.173000e+03 \n",
" 2.565827e+06 \n",
" 5.240000e+02 \n",
" 5.240000e+02 \n",
" 8.100000e+01 \n",
" NaN \n",
" 1.870000e+02 \n",
" 1.345420e+05 \n",
" 3.766000e+03 \n",
" \n",
" \n",
" max \n",
" 1.000000e+01 \n",
" 5.685830e+05 \n",
" 2.576338e+06 \n",
" 1.983000e+04 \n",
" 3.537356e+03 \n",
" 1.000000e+02 \n",
" 2.802175e+08 \n",
" 4.406278e+06 \n",
" 3.800000e+01 \n",
" 1.812480e+05 \n",
" 1.983000e+04 \n",
" 2.576338e+06 \n",
" 7.950000e+02 \n",
" 7.950000e+02 \n",
" 1.010000e+02 \n",
" NaN \n",
" 2.030000e+02 \n",
" 5.685830e+05 \n",
" 1.983000e+04 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" eventId playerId matchId teamId eventSec \\\n",
"count 3.025256e+06 3.025256e+06 3.025256e+06 3.025256e+06 3.025256e+06 \n",
"mean 5.694230e+00 8.953778e+04 2.494932e+06 3.004373e+03 1.390728e+03 \n",
"std 3.141030e+00 1.169272e+05 1.591746e+05 2.925207e+03 8.347843e+02 \n",
"min 1.000000e+00 1.200000e+01 1.694390e+06 6.740000e+02 0.000000e+00 \n",
"25% 1.000000e+00 9.380000e+03 2.500086e+06 1.619000e+03 6.608105e+02 \n",
"50% 8.000000e+00 2.562300e+04 2.516836e+06 2.460000e+03 1.374896e+03 \n",
"75% 8.000000e+00 1.345420e+05 2.565827e+06 3.766000e+03 2.109554e+03 \n",
"max 1.000000e+01 5.685830e+05 2.576338e+06 1.983000e+04 3.537356e+03 \n",
"\n",
" subEventId id roundId gameweek seasonId \\\n",
"count 3.017102e+06 3.025256e+06 3.025256e+06 3.025256e+06 3.025256e+06 \n",
"mean 6.013484e+01 2.158336e+08 4.391560e+06 1.815116e+01 1.709805e+05 \n",
"std 3.257763e+01 3.023051e+07 5.686541e+04 1.126545e+01 4.054451e+04 \n",
"min 1.000000e+01 8.817864e+07 4.165363e+06 0.000000e+00 9.291000e+03 \n",
"25% 1.300000e+01 1.988861e+08 4.405654e+06 8.000000e+00 1.811440e+05 \n",
"50% 8.300000e+01 2.191298e+08 4.405655e+06 1.800000e+01 1.811500e+05 \n",
"75% 8.500000e+01 2.352463e+08 4.406122e+06 2.800000e+01 1.811890e+05 \n",
"max 1.000000e+02 2.802175e+08 4.406278e+06 3.800000e+01 1.812480e+05 \n",
"\n",
" winner wyId_x competitionId wyId_y weight \\\n",
"count 3.025256e+06 3.025256e+06 3.025256e+06 3.025256e+06 3.025256e+06 \n",
"mean 2.317237e+03 2.494932e+06 4.797790e+02 4.797790e+02 7.622714e+01 \n",
"std 3.021050e+03 1.591746e+05 1.845044e+02 1.845044e+02 7.149052e+00 \n",
"min 0.000000e+00 1.694390e+06 2.800000e+01 2.800000e+01 0.000000e+00 \n",
"25% 6.740000e+02 2.500086e+06 3.640000e+02 3.640000e+02 7.200000e+01 \n",
"50% 1.633000e+03 2.516836e+06 4.260000e+02 4.260000e+02 7.600000e+01 \n",
"75% 3.173000e+03 2.565827e+06 5.240000e+02 5.240000e+02 8.100000e+01 \n",
"max 1.983000e+04 2.576338e+06 7.950000e+02 7.950000e+02 1.010000e+02 \n",
"\n",
" middleName height wyId_x.1 wyId_y.1 \n",
"count 0.0 3.025256e+06 3.025256e+06 3.025256e+06 \n",
"mean NaN 1.820490e+02 8.953778e+04 3.004373e+03 \n",
"std NaN 7.032542e+00 1.169272e+05 2.925207e+03 \n",
"min NaN 0.000000e+00 1.200000e+01 6.740000e+02 \n",
"25% NaN 1.780000e+02 9.380000e+03 1.619000e+03 \n",
"50% NaN 1.820000e+02 2.562300e+04 2.460000e+03 \n",
"75% NaN 1.870000e+02 1.345420e+05 3.766000e+03 \n",
"max NaN 2.030000e+02 5.685830e+05 1.983000e+04 "
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Description of the raw DataFrame, df_wyscout_raw, showing some summary statistics for each numberical column in the DataFrame\n",
"df_wyscout_raw.describe()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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EEIwyGeidHfGGNPKFGMtV2unhaEfj/fQ9PEefj/GeL0AiNOnT4vs7GzRvn17ERAQIP7617+2drGI/u0YY/tgrHitiOhljLV9MNZyVVZWijfffLO1i9GEMmluTIuF6F+DMc5vGWt9N8ZyGWtbSkRNMcj3Pa1evVosXLhQPH/+XNjZ2YkjR44wyGfCjHVlirGWi4iIiIiIiIj+tRhTYIH+tRjj/Jax1ndjLRcRGT8G+b4nLy8v8eabb4rJkyeL69evizFjxjDIZ+KMdWWKsZaLiIiIiIiIiIjou+D8FhGRulo36b0Jmjx5snB2dhavvvqquH79emsXhwzAWDsaxlouIiIiIiIiIiKi74LzW0RE6mKQ73tyc3Nr7SIQERERERERERERERHRvzkG+VqAh4dHaxdBz/z584UQQgwfPrxVy9EYy/XdGWOZhGC5vi9jLJcxlkkIluv7MsZyGWOZhGC5vg9jLJMQLNf3ZYzlMsYyCcFyfV/GWC5jLJMQxl8ua2vrVi1Hczim/m6M+R4KYVz30djvIcv13RhjuYyxTEKwXN+HMZZJCJbrhyooKGjtIvzb8PT0bJW/19HRUUyfPr1V/m5j8UprF4CIiIiIiIiIiIiIiIjo+6ioqGjtIrQ6BvmIiIiIiIiIiIiIiIjIpPzqV79q7SK0Ogb5iIiIiIiIiIiIiIiIiEwMg3xERERERERERERERERkUh49etTaRWh1DPIRERERERERERERERGRSfn973/f2kVodQzyERERERERERERERERkUkpLS1t7SK0Ogb5iIiIiIiIiIiIiIiIyKT89a9/be0itLrXWrsApiwsLEyEhYW1djGIiIiIiIiIiIiIiIj+rVRVVbV2EVodd/IRERERERERERERERGRSfnzn//c2kVodQzyERERERERERERERERkUl59dVXW7sIrY5BPiIiIiIiIiIiIiIiIjIp5eXlrV2EVscgHxEREREREREREREREZmUn//8561dhFbHIB8RERERERERERERERGZlOvXr7d2EVodg3xERERERERERERERERkUiorK1u7CK2OQT4iIiIiIiIiIiIiIiIyKUzXySAfERERERERERERERERmZhf/epXrV2EVscgHxEREREREREREREREZmUmzdvtnYRWh2DfERERERERERERERERGRSmK6TQT4iIiIiIiIiIiIiIiIyMb/97W9buwitjkE+IiIiIiIiIiIiIiIiMim/+MUvWrsIre611i4AERERERERERERERER0feRl5cn8vLyvvfvbd68Wfz+979XoUQtj0E+IiIiIiIiIhJCCOHh4dHaRZDmz5/f2kUgIiIion9BERERYu/eva1dDINgkI+IiIiIiIiIiIiIiIh+kG3btonbt2+LNm3aCCGEaNOmTZP/D0DvdwCIuLi4Fi/rvxoG+YiIiIiIiIiIiIiIiOgH+dWvfiV+9atftXYx/i290toFICIiIiIiIiIiIiIiIqLvh0E+IiIiIiIiIiIiIiIiIhPDIB8RERERERERERERERGRiWGQj4iIiIiIiIiIiIiIiMjEMMhHREREREREREREREREZGIY5CMiIiIiIiIiIiIiIiIyMQzyEREREREREREREREREZkYBvmIiIiIiIiIiIiIiIiITAyDfEREREREREREREREREQmhkE+IiIiIiIiIiIiIiIiIhPDIB8RERERERERERERERGRiWGQj4iIiIiIiIiIiIiIiMjEMMhHREREREREREREREREZGIY5CMiIiIiIiIiIiIiIiIyMQzyEREREREREREREREREZkYBvmIiIiIiIiIiIiIiIiITAyDfEREREREREREREREREQmhkE+IiIiIiIiIiIiIiIiIhPDIB8RERERERERERERERGRiWGQj4iIiIiIiIiIiIiIiMjEMMhHREREREREREREREREZGIY5CMiIiIiIiIiIiIiIiIyMQzyEREREREREREREREREZkYBvmIiIiIiIiIiIiIiIiITAyDfEREREREREREREREREQmhkE+IiIiIiIiIiIiIiIiIhPDIB8RERERERERERERERGRiWGQj4iIiIiIiIiIiIiIiMjEMMhHREREREREREREREREZGIY5CMiIiIiIiIiIiIiIiIyMQzyEREREREREREREREREZkYBvmIiIiIiIiIiIiIiIiITAyDfEREREREREREREREREQmhkE+IiIiIiIiIiIiIiIiIhPDIB8RERERERERERERERGRiWGQj4iIiIiIiIiIiIiIiMjEMMhHREREREREREREREREZGIY5CMiIiIiIiIiIiIiIiIyMQzyEREREREREREREREREZkYBvmIiIiIiIiIiIiIiIiITAyDfEREREREREREREREREQmhkE+IiIiIiIiIiIiIiIiIhPDIB8RERERERERERERERGRiWGQj4iIiIiIiIiIiIiIiMjEMMhHREREREREREREREREZGIY5CMiIiIiIiIiIiIiIiIyMQzyEREREREREREREREREZkYBvmIiIiIiIiIiIiIiIiITAyDfEREREREREREREREREQmhkE+IiIiIiIiIiIiIiIiIhPDIB8RERERERERERERERGRiWGQj4iIiIiIiIiIiIiIiMjEMMhHREREREREREREREREZGIY5CMiIiIiIiIiIiIiIiIyMQzyEREREREREREREREREZkYBvmIiIiIiIiIiIiIiIiITAyDfEREREREREREREREREQmhkE+IiIiIiIiIiIiIiIiIhPDIB8RERERERERERERERGRiWGQj4iIiIiIiIiIiIiIiMjEMMhHREREREREREREREREZGIY5CMiIiIiIiIiIiIiIiIyMQzyEREREREREREREREREZkYBvmIiIiIiIiIiIiIiIiITAyDfEREREREREREREREREQmhkE+IiIiIiIiIiIiIiIiIhPDIB8RERERERERERERERGRiWGQj4iIiIiIiIiIiIiIiMjEMMhHREREREREREREREREZGIY5CMiIiIiIiIiIiIiIiIyMQzyEREREREREREREREREZkYBvmIiIiIiIiIiIiIiIiITAyDfEREREREREREREREREQmhkE+IiIiIiIiIiIiIiIiIhPDIB8RERERERERERERERGRiWGQj4iIiIiIiIiIiIiIiMjEMMhHREREREREREREREREZGIY5CMiIiIiIiIiIiIiIiIyMa+1dgGIiIiIiIiIiIiIiIjINBUVFYkjR4689M/btGnznX5G3x+DfERERERERERERERERPSDDBw4sLWL8G+LQT4iIiIiIiIiIiIiIiL6QZYsWSIOHjwoALz0M8qftWnTRv7/9evXt0j5/pUxyEdEREREREREREREREQ/iJmZmTAzM/vev8cg34/3SmsXgIiIiIiIiIiIiIiIiIi+Hwb5iIiIiIiIiIiIiIiIiEwMg3xEREREREREREREREREJoZBPiIiIiIiIiIiIiIiIiIT81prF4CIiIiIiIiIiIiIiIhMk6enZ2sX4d8Wd/IRERERERERERERERHRDxIeHt7aRfi3xZ18RERERERERERERERE9IMMHTpUDB069Hv/HncA/njcyUdERERERERERERERERkYhjkIyIiIiIiIiIiIiIiIjIxDPIRERERERERERERERERmRgG+YiIiIiIiIiIiIiIiIhMDIN8RERERERERERERERERCaGQT4iIiIiIiIiIiIiIiIiE8MgHxEREREREREREREREZGJYZCPiIiIiIiIiIiIiIiIyMQwyEdERERERERERERERERkYhjkIyIiIiIiIiIiIiIiIjIxDPIRERERERERERERERERmRgG+YiIiIiIiIiIiIiIiIhMDIN8RERERERERERERERERCaGQT4iIiIiIiIiIiIiIiIiE8MgHxEREREREREREREREZGJYZCPiIiIiIiIiIiIiIiIyMQwyEdERERERERERERERERkYhjkIyIiIiIiIiIiIiIiIjIxDPIRERERERERERERERERmRgG+YiIiIiIiIiIiIiIiIhMDIN8RERERERERERERERERCaGQT4iIiIiIiIiIiIiIiIiE8MgHxEREREREREREREREZGJYZCPiIiIiIiIiIiIiIiIyMQwyEdERERERERERERERERkYhjkIyIiIiIiIiIiIiIiIjIxDPIRERERERERERERERERmRgG+YiIiIiIiIiIiIiIiIhMDIN8RERERERERERERERERCaGQT4iIiIiIiIiIiIiIiIiE8MgHxEREREREREREREREZGJYZCPiIiIiIiIiIiIiIiIyMQwyEdERERERERERERERERkYl5r7QIQERERERERERER/RAFBQWtXQQiIqJWwyAfERERERERERERmSQPD4/WLoI0f/781i4CERH9m2G6TiIiIiIiIiIiIiIiIiITwyAfERERERERERERERERkYlhkI+IiIiIiIiIiIiIiIjIxDDIR0RERERERERERERERGRiGOQjIiIiIiIiIiIiIiIiMjEM8hERERERERERERERERGZGAb5iIiIiIiIiIiIiIiIiEwMg3xEREREREREREREREREJoZBPiIiIiIiIiIiIiIiIiITwyAfERERERERERERERERkYlhkI+IiIiIiIiIiIiIiIjIxDDIR0RERERERERERERERGRiGOQjIiIiIiIiIiIiIiIiMjEM8hERERERERERERERERGZGAb5iIiIiIiIiIiIiIiIiEwMg3xEREREREREREREREREJoZBPiIiIiIiIiIiIiIiIiITwyAfERERERERERERERERkYlhkI+IiIiIiIiIiIiIiIjIxDDIR0RERERERERERERERGRiGOQjIiIiIiIiIiIiIiIiMjEM8hERERERERERERERERGZGAb5iIiIiIiIiIiIiIiIiEwMg3xEREREREREREREREREJoZBPiIiIiIiIiIiIiIiIiITwyAfERERERERERERERERkYlhkI+IiIiIiIiIiIiIiIjIxDDIR0RERERERERERERERGRiGOQjIiIiIiIiIiIiIiIiMjEM8hERERERERERERERERGZGAb5iIiIiIiIiIiIiIiIiEwMg3xEREREREREREREREREJoZBPiIiIiIiIiIiIiIiIiITwyAfERERERERERERERERkYlhkI+IiIiIiIiIiIiIiIjIxDDIR0RERERERERERERERGRiGOQjIiIiIiIiIiIiIiIiMjEM8hERERERERERERERERGZGAb5iIiIiOj/t3fvQV/P+f/HHykJldotdjt8lWxah07WEmm7KIdrShnnQ5FlsZGx7Sw22hW7zFpEpRAdteO0y4xDsy3VYiOnrAgpFJFVLYWOrt8fps+4ttOV71eX929vt5lmruv9fn9en+f1ec/0z31e7w8AAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMGIfAAAAAAAAFAwIh8AAAAAAAAUjMgHAAAAAAAABSPyAQAAAAAAQMHUqu4BAAAAAAAAKKZ169Zl7dq1pd8rKio2ee3mzrH1RD4AAPiGTJs2rbpH2MCsWbOqewQAAAD+P9KtW7fqHuG/lsgHAAAAAABA4fz617+u9Pv6nYJf3TH41Z/r1KmTzp07b5vhtgGRDwAAAAAAgELp0aNHunfvXt1jVKvtqnsAAAAAAAAA2BpLliyp7hGqncgHAAAAAABAoSxbtqy6R6h2Ih8AAAAAAACFsmLFiuoeodqJfAAAAAAAABRKvXr1qnuEalerugcAAAAAAACArTFnzpyUlZVt9esGDx78tV73bWQnHwAAAAAAAP8VJkyYUN0j/J+xkw8AAAAAAIDCOeaYYzZ5rkaNGhv8Xq9evRx33HHf9FjbjMgHAAAAAABAobRv3z4XX3xxdY9RrTyuEwAAAAAAgEL59NNPq3uEamcnHwAAAAAAAIUyd+7cnHHGGUk2fDTneuuP16hRIzVq1EijRo1ywQUXpHnz5ttszm+SyPdfbNq0adU9wgZmzZpV3SMA32L+3wIAAAAA1luwYMFWXT9//vxMmTIlZ5111jc00bYl8v0X69q1a3WPUMnQoUOrewTgW87/WwAAAADAerfeeusGxza1q2/9uRYtWnyDE21bIh8AAAAAAACFUlZWltatW1f3GNVqu6peuGzZslx99dXp1q1b2rZtm/Ly8owePTpr167d4NoHHnggvXv3Tvv27dOlS5dcc801G/0CxNWrV2fUqFEpLy/Pfvvtl/333z/9+vXLM888s8G177zzTvbaa69N/lu1alWl6x955JGcfPLJ6dChQ9q2bZvevXvn7rvv3ujf1qVLl02u+/e//73StatWrcrw4cNz5JFHZr/99ku3bt3y+9//Pp988klVP0oAAAAAAIDNmjdvXs4888x06NAhZWVlGT16dOnc4sWL8/Of/zzt27dP165dc9ddd1XjpNXj3Xffre4Rtsrm7uecOXNy6qmnpkOHDundu3eeeOKJKq1ZpZ18K1asyKmnnpr58+enrKws3bt3zwsvvJDrrrsuzz33XEaOHFna/njrrbfmhhtuyF577ZXTTz89b7zxRsaOHZuXXnop48ePT+3atZMkX3zxRc4///w8+eSTad26dU455ZQsX748kydPzplnnpkbbrghRx99dGmG119/PUlSXl6ePfbYY4MZa9asWfp55MiRGTp0aBo1apSePXumVq1amTp1agYPHpy5c+fm8ssvL1378ccfZ/HixWnXrl0OPfTQDdbdfffdSz+vWbMmZ599dmbOnJkf//jHOfzww/Pyyy9n3LhxmTVrViZOnFj6+wAAAAAAAL6ONWvW5JxzzsmBBx6YK6+8MvPnz8/AgQOz6667pkePHjn//PPTsGHD3H///ZkzZ04uvfTStGjRIoccckh1j77N7LTTTtU9QpVt7n527tw5ffv2zWGHHZarrroqs2bNyoUXXpgJEyZkv/322+y6VYp8t912W+bPn59Bgwalb9++peMDBw7MQw89lOnTp6dr165ZtGhRbr755nTo0CETJkzI9ttvnyS56aabcsstt+See+7J6aefniR59NFH8+STT+aII47IjTfemFq1vhzl7LPPzvHHH58hQ4bk8MMPL0Wz9ZHv3HPPTZs2bTY56/vvv58RI0akWbNmue+++9KwYcPSrKeddlomTJiQY489Nvvss0+S5LXXXkuS9OjRo9LftjHjx4/PzJkz89Of/jS/+tWvSseHDBmSu+66K4888kh69+5dlY8UAAAAAABgoxYvXpy2bdvmN7/5TerUqZPdd989Bx98cJ599tnssssuefvtt3PnnXemQYMGadWqVWbOnJkXX3zxvyryffe7363uEapsc/fzo48+ys4775yrr74622+/fVq1apWXXnopY8aMyQ033LDZdav0uM733nsv3//+93PqqadWOl5eXp4kefHFF5Mkd999d9auXZtzzz23FPiS5LzzzkvdunVz7733lo799a9/TZJceOGFpcCXJK1atUp5eXmWLl2al19+uXT89ddfL/1xm/P4449nzZo16devXynwJcnOO++cfv36JUmlR3Cuj4d77bXXFj+Hu+66K02bNs3FF19c6fhZZ52VY489NjvssMMW1wAAAAAAANicZs2aZejQoalTp04qKiry/PPP59lnn02nTp3y9NNP58ADD0yDBg1K1w8ZMiQXXHDBNp9z3bp12/w9v+57r1u3LjNmzMj48eMzY8aMbTr75u7nwoULs++++1bqam3atMmsWbO2uG6VdvJdf/31Gz0+f/78JEmjRo2SJM8++2yS5IADDqh03Q477JD27dvnySefzPLly1OvXr0cffTRadmyZVq2bLnBuut373322WelY6+//npatmxZ6Y/cmH333TcXXXRROnXqVOV1ky1HvjfffDPvvfde+vTps8EMzZo1y7XXXrvZ1wMAAAAAAGytLl265MMPP0xZWVmOPPLIPPzww2nSpEluvPHGPPDAA6lbt27OPPPMnHDCCdt0rnXr1lV66uG2tnLlyipfu37WOXPmZOXKlalTp05++MMf5g9/+EOlr4PbFv7zfs6fP7/SprckWbRoUZYtW7bFtaoU+b6qoqIiS5cuzeTJkzNs2LA0adIkxxxzTJJkwYIFadSoUerWrbvB65o2bZokeeutt9K2bdscddRROeqooza4bvXq1Zk+fXqSZM8990zyZZRbuHBh6Vml06dPz0cffZRWrVqlX79+pfdPknbt2qVdu3Ybnf1vf/tbpXWTLyNfgwYNct999+Uvf/lLFi5cmMaNG6dXr14577zzSmHwjTfeSJL84Ac/yPTp0zNy5MjMmTMn9erVS48ePTJgwIBCPf8VAIBvXteuXat7hEqGDh1a3SMAAACwlW655ZZ8+OGH+e1vf5trrrkmn376aR588MEcccQRGTFiRF599dUMGTIkDRs2TLdu3bbZXDNnzsycOXO22fv9p2eeeSZlZWVf67Wff/55Xn311cycOXOjm8a+Sf95P08++eTccsstmThxYk466aS88soruf/++7NmzZotrlWjoqKiYmvefOjQoRk5cmSSL3fwTZgwIXvssUeSL3fRNWvWLJMnT97gddddd11Gjx6dMWPG5OCDD97k+sOHD8+wYcPSpUuX3H777UmSWbNm5aSTTkry5Y67Qw45JMuWLcvjjz+ejz/+OP3798+AAQM2O/fTTz+dM888Mw0bNsxjjz2WnXbaKV988UU6duyYzz//PI0bN0737t1To0aNPPXUU3n77bfTqVOnjB49OrVq1crYsWNzzTXXpKysLFOnTs1PfvKTtGzZMjNnzsyrr76a/fffP+PGjdviTkMAAAAAAICt9fDDD+eSSy5Jx44d8+6772bKlCmlXWhDhgzJO++8kzvuuGObzTN+/PiMHTs2X81MNWrUSL9+/dKnT59tNkdVfBtnXX8/X3jhhTz66KO56qqr8umnn+Z//ud/0rt374wdOzbPPPPMZtfY6p18TZs2zVlnnZWFCxfmsccey2mnnZbRo0dnn332ydq1a0s73/7T+uOrVq3a5NoPPPBAhg8fnnr16mXw4MGl48uXL0/Lli1zyCGHZNCgQdluuy+/SnDx4sU55ZRTcsstt+SII45ImzZtNrrua6+9lgEDBqSioiJXXnllacfd0qVLs/vuu6d+/foZMWJE6tevX5rxoosuytSpUzNp0qT07ds3n3/+eZJk6tSpueqqq3LiiScm+XKL5y9+8YtMnjw5kyZNyhlnnLE1HycAAAAAAEAlixcvzuzZs3P44YeXjrVq1Spr1qxJ06ZNU7NmzUqPmWzZsmVmzJixTWfs27dv+vbtu03f8+uq7lk3dz9XrFiRXr16pWfPnvnoo4/SuHHjTJo0qfSEzM3ZbmsHOeGEE3LJJZdk+PDhGTlyZJYtW5ZLLrkkFRUVqVOnzia3D65evTpJsuOOO270/D333JPLLrsstWvXzvDhw9O8efPSuUMPPTSTJ0/OFVdcUQp8SbLbbrulf//+qaioyMMPP7zRdf/5z3/mjDPOyMcff5yBAwfmiCOOKJ1r1KhRHnzwwUyYMKEU+JIvv0Nw0KBBSVJad/377r333qXAlyQ1a9YsPXP20Ucf3cSnBgAAAAAAUDXz5s3LhRdemCVLlpSOvfLKK/nOd76TDh065I033qjUY958880qRSGqx+bu59y5czNgwIBst9122XXXXVOjRo08/vjjOfDAA7e47lZHvq/q2rVrOnXqlLlz52bBggWpX79+li9fvtFr1x+vV6/eBueGDRuWK664InXq1MmoUaNy0EEHVXmGffbZJ0ny7rvvbnBu2rRp6du3b/79739n4MCB+dnPflbldZs3b55ddtmltO767xnce++9N7i2adOmqV+/fhYuXFjl9QEAAAAAADbmgAMOSKtWrXLppZdm3rx5mTp1aq6//vqcd955KS8vT61atXL55ZfnrbfeyoMPPpg///nPOfXUU6t7bDZhc/ezZcuWeeKJJzJu3LgsXLgwN910U1566aUqPTlyi5Fv7dq1+cc//pGnnnpqo+ebNGmSJFm2bFlatGiRJUuWZOXKlRtc995772W77bbL7rvvXjpWUVGRwYMHZ/jw4WnQoEHGjh270e/rW7BgQWbMmFF6ZOZXrX+vHXbYodLxBx54IP3798+qVaty5ZVXbjTwLVmyJM8991zef//9Dc5VVFRk1apVpXVbtGiRJJvcqbh27drUqVNno+cAAAAAAACqavvtt8+tt96amjVr5oQTTsjgwYNzxhlnpG/fvqlbt27GjBmTxYsX55hjjslNN92UwYMH57DDDqvusdmEzd3PXXfdNTfddFPuueee9OzZM08//XTGjBmT733ve1tct0rfyXfeeedl5513zpNPPlnpGa/Jl993V6NGjTRr1iz7779/nnnmmTz33HPp3Llz6ZpVq1Zl1qxZ2XPPPUs74pLk2muvzd13353ddtstd955Z/bcc8+Nvv/w4cPz4IMPZtiwYZUet5kkzz//fJJk3333LR2bMmVKLrvsstSsWTM33nhjjjrqqI2uO3Xq1AwaNCh9+vTJ5ZdfXunc7Nmzs3LlytK6bdu2Te3atfPss89m3bp1lT6HefPm5bPPPkunTp02+RkCAAAAAABUVZMmTTJq1KiNnttjjz0yduzYbTsQ/yubu59dunRJly5dtnrNLe7kq1WrVrp3756lS5fmjjvuqHRu0qRJmT17drp27ZpGjRqlZ8+eqVmzZoYPH176Dr4kGTVqVFasWJGTTjqpdOyxxx7L2LFj06BBg0ycOHGTgS9JKdKNGDEin332Wen4/Pnzc9ttt2WXXXZJjx49kiQffPBBLr300lRUVGw28CVJWVlZ6tSpk/vvvz/z588vHV+xYkV+97vfJUlpe2u9evVy9NFHZ9GiRbnttttK165ZsybXXXddkuS4447b5HsBAAAAAADA/5UaFRUVFVu6aPHixTnxxBPzwQcfpHPnzmndunXmzJmTGTNmpFmzZpk0aVJ22223JMkf//jH3H777WnVqlXKysry5ptvZtq0aenYsWPGjRuX2rVrJ0l69uyZN954IwcddFB+9KMfbfR9y8vL06pVqyTJwIED89BDD6Vp06Y57LDD8sknn2TKlClZvXp1hg0bVtqGevXVV2fChAlp3rx5evXqtdF127VrVyqif/rTn/Lb3/42O+20U8rLy1O7du1MmzYtixYtyjnnnJNf/vKXpdctWbIkp5xySt55550cfPDBadOmTWbMmJE5c+akvLw8N954Y1U/dwAAAAAAAPjaqhT5kuRf//pXbr755kydOjXLli3Lrrvumu7du+f8889Pw4YNS9dVVFRk0qRJmTRpUhYsWJDGjRune/fuueCCC1KvXr0kyfLlyzcZ9r5qxIgR6datW5Lkiy++yMSJE3Pvvffmrbfeyo477piOHTumf//+adu2bek1vXr1ymuvvbbZdfv27ZtBgwaVfp8+fXpGjx6d2bNnp6KiIq1bt06fPn3Ss2fPDV67bNmyjBgxIlOmTMnSpUvTtGnTHH/88enXr98GjzIFAAAAAACAb0KVIx8AAAAAAADw7bDF7+QDAAAAAAAAvl1EPgAAAAAAACgYkQ8AAAAAAAAKRuQDAAAAAACAghH5AAAAAAAAoGBEPgAAAAAAACgYkQ8AAAAAAAAKRuQDAAAAAACAghH5AAAAAAAAoGD+H72oI/3SXz1OAAAAAElFTkSuQmCC\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Plot visualisation of the missing values for each feature of the raw DataFrame, df_wyscout_raw\n",
"msno.matrix(df_wyscout_raw, figsize = (30, 7))"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"subEventName 8154\n",
"subEventId 8154\n",
"venue 166662\n",
"area_name 179899\n",
"middleName 3025256\n",
"foot 609\n",
"dtype: int64"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Counts of missing values\n",
"null_value_stats = df_wyscout_raw.isnull().sum(axis=0)\n",
"null_value_stats[null_value_stats != 0]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The visualisation shows us that there are no missing values in the DataFrame."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## 4. Data Engineering \n",
"Before any Feature Engineering or Data Visualisation, we first need to clean and wrangle the datasets to a form that meet our needs."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.1. Assign Raw DataFrame to Engineered DataFrame "
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"# Assign Raw DataFrame to Engineered DataFrame\n",
"df_wyscout = df_wyscout_raw"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.2. String Cleaning "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### Split `Label` column into seperate `Fixture` and `Score` columns"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"# Break down 'Label' column into constituent parts - Fixtures, Score, Date, Home Goals, Away Goals, etc.\n",
"df_wyscout['fixture'] = df_wyscout['label'].str.split(', ').str[0]\n",
"df_wyscout['score_home_away'] = df_wyscout['label'].str.split(', ').str[1]\n",
"df_wyscout['team_home'] = df_wyscout['fixture'].str.split(' - ').str[0]\n",
"df_wyscout['team_away'] = df_wyscout['fixture'].str.split(' - ').str[1]\n",
"df_wyscout['goals_home'] = df_wyscout['score_home_away'].str.split(' - ').str[0]\n",
"df_wyscout['goals_away'] = df_wyscout['score_home_away'].str.split(' - ').str[1]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### Split `date` column into separate `date_isolated` and `time_isolated` columns"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"df_wyscout['date_isolated'] = df_wyscout['date'].str.split(' at').str[0]\n",
"df_wyscout['time_isolated'] = df_wyscout['date'].str.split(' at ').str[1]\n",
"df_wyscout['date_time_isolated'] = df_wyscout['date'].str.split(' GMT').str[0].str.replace(' at ', ' ', regex=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.3. Rename Columns "
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"df_wyscout = df_wyscout.rename(columns={'name': 'teamName'})"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.4. Convert Data Types "
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"df_wyscout['date_time_timestamp'] = pd.to_datetime(df_wyscout['dateutc'])\n",
"df_wyscout['date_date'] = df_wyscout['date_time_timestamp'].dt.strftime('%d-%m-%Y')\n",
"df_wyscout['time_time'] = df_wyscout['date_time_timestamp'].dt.time"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"df_wyscout['full_fixture_date'] = df_wyscout['date_date'].astype(str) + ' ' + df_wyscout['team_home'].astype(str) + ' ' + df_wyscout['goals_home'].astype(str) + ' ' + ' v ' + ' ' + df_wyscout['goals_away'].astype(str) + ' ' + df_wyscout['team_away'].astype(str) "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.5. Reorder DataFrame \n",
"Correctly order all the rows in the DataFrame by date, time, country, fixture, half, and time in the match. Important when looking at events and the following event e.g. is possession retains? Which player receives the pass, etc."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"df_wyscout = df_wyscout.sort_values(['date_date', 'time_time', 'competitionId', 'full_fixture_date', 'matchPeriod', 'eventSec'], ascending=[True, True, True, True, True, True])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.6. Create Features "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### Create `competition_name` column derived from the `competitionId` column"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"#\n",
"\n",
"## Define dictionary of competition names per competition ID\n",
"dict_competition_name_wyscout = {28: 'FIFA World Cup',\n",
" 102: 'UEFA EURO 2018',\n",
" 364: 'Premier League',\n",
" 412: 'Ligue 1',\n",
" 426: 'Bundesliga',\n",
" 524: 'Seria A',\n",
" 795: 'La Liga'\n",
" }\n",
"\n",
"## Apply dictionary of competition names per competition ID\n",
"df_wyscout['competition_name'] = df_wyscout['competitionId'].map(dict_competition_name_wyscout)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### Create `season` attribute"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
"#\n",
"\n",
"## Define dictionary of seasons per competition ID\n",
"dict_season_wyscout = {28: '2018',\n",
" 102: '2016',\n",
" 364: '17/18',\n",
" 412: '17/18',\n",
" 426: '17/18',\n",
" 524: '17/18',\n",
" 795: '17/18'\n",
" }\n",
"\n",
"## Apply dictionary of seasons per competition ID\n",
"df_wyscout['season'] = df_wyscout['competitionId'].map(dict_season_wyscout)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### Create `fullName` attribute \n",
"Join together the `firstName` and `lastName` attribute to create a `fullName` attribute."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"df_wyscout['fullName'] = df_wyscout['firstName'].astype(str) + ' ' + df_wyscout['lastName'].astype(str)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### Create `previous_event` attribute "
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"df_wyscout['previous_event'] = df_wyscout['subEventName'].shift(1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### Create `followingPossession` column\n",
"'teamIdNext' = following 'teamId'"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [],
"source": [
"df_wyscout['teamIdNext'] = df_wyscout['teamId'].shift(-1)\n",
"df_wyscout['teamNameNext'] = df_wyscout['teamName'].shift(-1)\n",
"df_wyscout['fullNameNext'] = df_wyscout['fullName'].shift(-1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### Create `player2player` column"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"df_wyscout['player2player'] = df_wyscout['fullName'] + ' - ' + df_wyscout['fullNameNext']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### Create `isPossessionRetained` column\n",
"When `teamId` is not followed by the same `teamId` in the following row, possession is lost. We want to creat a column that stats this."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"df_wyscout['isPossessionRetained'] = np.where(df_wyscout['teamId'] == df_wyscout['teamIdNext'], True, False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.7. Drop columns \n",
"As this is a large dataset with >3mil rows, we will remove every column that is not required at this stage."
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
"df_wyscout = df_wyscout.drop(['wyId_x', 'wyId_y', 'wyId_x.1'], axis=1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.8. Aggregate Data \n",
"Aggregated data used for Tableau dashboarding"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 4.8.1. Fixture Level "
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:20: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n"
]
}
],
"source": [
"# Select columns of interest\n",
"\n",
"## Define columns\n",
"cols = ['season',\n",
" 'date_time_timestamp',\n",
" 'fixture',\n",
" 'team_home',\n",
" 'team_away',\n",
" 'teamName',\n",
" 'goals_home',\n",
" 'goals_away',\n",
" 'eventName',\n",
" 'subEventName'\n",
" ]\n",
"\n",
"## Streamline DataFrame with columns of interest\n",
"df_wyscout_select = df_wyscout[cols]\n",
"\n",
"## \n",
"df_wyscout_select['Opponent'] = np.where(df_wyscout_select['team_home'] == df_wyscout_select['teamName'], df_wyscout_select['team_away'], df_wyscout_select['team_home'])"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Season \n",
" Date \n",
" Fixture \n",
" Team \n",
" Opponent \n",
" Goals_Home \n",
" Goals_Away \n",
" Event \n",
" Team_Value \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Monaco \n",
" Toulouse \n",
" 3 \n",
" 2 \n",
" Duel \n",
" 220 \n",
" \n",
" \n",
" 1 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Monaco \n",
" Toulouse \n",
" 3 \n",
" 2 \n",
" Foul \n",
" 12 \n",
" \n",
" \n",
" 2 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Monaco \n",
" Toulouse \n",
" 3 \n",
" 2 \n",
" Free Kick \n",
" 58 \n",
" \n",
" \n",
" 3 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Monaco \n",
" Toulouse \n",
" 3 \n",
" 2 \n",
" Goalkeeper leaving line \n",
" 2 \n",
" \n",
" \n",
" 4 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Monaco \n",
" Toulouse \n",
" 3 \n",
" 2 \n",
" Offside \n",
" 5 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Season Date Fixture Team Opponent Goals_Home \\\n",
"0 17/18 2017-08-04 18:45:00 Monaco - Toulouse Monaco Toulouse 3 \n",
"1 17/18 2017-08-04 18:45:00 Monaco - Toulouse Monaco Toulouse 3 \n",
"2 17/18 2017-08-04 18:45:00 Monaco - Toulouse Monaco Toulouse 3 \n",
"3 17/18 2017-08-04 18:45:00 Monaco - Toulouse Monaco Toulouse 3 \n",
"4 17/18 2017-08-04 18:45:00 Monaco - Toulouse Monaco Toulouse 3 \n",
"\n",
" Goals_Away Event Team_Value \n",
"0 2 Duel 220 \n",
"1 2 Foul 12 \n",
"2 2 Free Kick 58 \n",
"3 2 Goalkeeper leaving line 2 \n",
"4 2 Offside 5 "
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#\n",
"\n",
"## Group DataFrame and Aggregate on 'eventName'\n",
"df_wyscout_fixture_grouped = (df_wyscout_select\n",
" .groupby(['season', 'date_time_timestamp', 'fixture', 'teamName', 'Opponent', 'goals_home', 'goals_away', 'eventName'])\n",
" .agg({'eventName': ['count']})\n",
" )\n",
"\n",
"## Drop level\n",
"df_wyscout_fixture_grouped.columns = df_wyscout_fixture_grouped.columns.droplevel(level=0)\n",
"\n",
"\n",
"## Reset index\n",
"df_wyscout_fixture_grouped = df_wyscout_fixture_grouped.reset_index()\n",
"\n",
"## Rename columns\n",
"df_wyscout_fixture_grouped = df_wyscout_fixture_grouped.rename(columns={'season': 'Season',\n",
" 'date_time_timestamp': 'Date',\n",
" 'fixture': 'Fixture',\n",
" 'teamName': 'Team',\n",
" 'Opponent': 'Opponent',\n",
" 'goals_home': 'Goals_Home',\n",
" 'goals_away': 'Goals_Away',\n",
" 'eventName': 'Event',\n",
" 'count': 'Team_Value'\n",
" }\n",
" )\n",
"\n",
"## Display DataFrame\n",
"df_wyscout_fixture_grouped.head()"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
"# Select columns of interest\n",
"\n",
"## Define columns\n",
"cols = ['Season',\n",
" 'Date',\n",
" 'Fixture',\n",
" 'Team',\n",
" 'Opponent',\n",
" 'Event',\n",
" 'Team_Value'\n",
" ]\n",
"\n",
"## Streamline DataFrame with columns of interest\n",
"df_wyscout_fixture_grouped_select = df_wyscout_fixture_grouped[cols]"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [],
"source": [
"# Join DataFrame to itself on 'Date', 'Fixture', 'Team'/'Opponent', and 'Event', to join Team and Opponent together\n",
"df_wyscout_fixture_grouped = pd.merge(df_wyscout_fixture_grouped, df_wyscout_fixture_grouped, how='left', left_on=['Season', 'Date', 'Fixture', 'Opponent', 'Event'], right_on = ['Season', 'Date', 'Fixture', 'Team', 'Event'])"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Season \n",
" Date \n",
" Fixture \n",
" Team \n",
" Opponent \n",
" Goals_Home \n",
" Goals_Away \n",
" Event \n",
" Team_Value \n",
" Opponent_Value \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Monaco \n",
" Toulouse \n",
" 3 \n",
" 2 \n",
" Duel \n",
" 220 \n",
" 205 \n",
" \n",
" \n",
" 1 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Monaco \n",
" Toulouse \n",
" 3 \n",
" 2 \n",
" Foul \n",
" 12 \n",
" 23 \n",
" \n",
" \n",
" 2 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Monaco \n",
" Toulouse \n",
" 3 \n",
" 2 \n",
" Free Kick \n",
" 58 \n",
" 47 \n",
" \n",
" \n",
" 3 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Monaco \n",
" Toulouse \n",
" 3 \n",
" 2 \n",
" Goalkeeper leaving line \n",
" 2 \n",
" 0 \n",
" \n",
" \n",
" 4 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Monaco \n",
" Toulouse \n",
" 3 \n",
" 2 \n",
" Offside \n",
" 5 \n",
" 1 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Season Date Fixture Team Opponent Goals_Home \\\n",
"0 17/18 2017-08-04 18:45:00 Monaco - Toulouse Monaco Toulouse 3 \n",
"1 17/18 2017-08-04 18:45:00 Monaco - Toulouse Monaco Toulouse 3 \n",
"2 17/18 2017-08-04 18:45:00 Monaco - Toulouse Monaco Toulouse 3 \n",
"3 17/18 2017-08-04 18:45:00 Monaco - Toulouse Monaco Toulouse 3 \n",
"4 17/18 2017-08-04 18:45:00 Monaco - Toulouse Monaco Toulouse 3 \n",
"\n",
" Goals_Away Event Team_Value Opponent_Value \n",
"0 2 Duel 220 205 \n",
"1 2 Foul 12 23 \n",
"2 2 Free Kick 58 47 \n",
"3 2 Goalkeeper leaving line 2 0 \n",
"4 2 Offside 5 1 "
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Clean Data\n",
"\n",
"## Drop columns\n",
"df_wyscout_fixture_grouped = df_wyscout_fixture_grouped.drop(columns=['Team_y', 'Opponent_y', 'Goals_Home_y', 'Goals_Away_y'])\n",
"\n",
"## Rename columns\n",
"df_wyscout_fixture_grouped = df_wyscout_fixture_grouped.rename(columns={'Season_x': 'Season',\n",
" 'Team_x': 'Team',\n",
" 'Opponent_x': 'Opponent',\n",
" 'Goals_Home_x': 'Goals_Home',\n",
" 'Goals_Away_x': 'Goals_Away',\n",
" 'Team_Value_x': 'Team_Value',\n",
" 'Team_Value_y': 'Opponent_Value',\n",
" }\n",
" )\n",
"\n",
"## Replace null values with zeros\n",
"df_wyscout_fixture_grouped['Team_Value'] = df_wyscout_fixture_grouped['Team_Value'].replace(np.nan, 0)\n",
"df_wyscout_fixture_grouped['Opponent_Value'] = df_wyscout_fixture_grouped['Opponent_Value'].replace(np.nan, 0)\n",
"\n",
"## Convert Opponent_Value' from Float64 to Int64 type\n",
"df_wyscout_fixture_grouped['Opponent_Value'] = df_wyscout_fixture_grouped['Opponent_Value'].astype('Int64')\n",
"\n",
"## Display DataFrame\n",
"df_wyscout_fixture_grouped.head()"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Team \n",
" Date \n",
" Gameweek \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" AFC Bournemouth \n",
" 2017-08-12 14:00:00 \n",
" 1 \n",
" \n",
" \n",
" 1 \n",
" AFC Bournemouth \n",
" 2017-08-19 14:00:00 \n",
" 2 \n",
" \n",
" \n",
" 2 \n",
" AFC Bournemouth \n",
" 2017-08-26 11:30:00 \n",
" 3 \n",
" \n",
" \n",
" 3 \n",
" AFC Bournemouth \n",
" 2017-09-09 14:00:00 \n",
" 4 \n",
" \n",
" \n",
" 4 \n",
" AFC Bournemouth \n",
" 2017-09-15 19:00:00 \n",
" 5 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Team Date Gameweek\n",
"0 AFC Bournemouth 2017-08-12 14:00:00 1\n",
"1 AFC Bournemouth 2017-08-19 14:00:00 2\n",
"2 AFC Bournemouth 2017-08-26 11:30:00 3\n",
"3 AFC Bournemouth 2017-09-09 14:00:00 4\n",
"4 AFC Bournemouth 2017-09-15 19:00:00 5"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#\n",
"\n",
"##\n",
"df_fixture_gw = (df_wyscout_fixture_grouped\n",
" .groupby(['Date', 'Team'])\n",
" .agg({'Team': ['nunique']})\n",
" )\n",
"\n",
"##\n",
"df_fixture_gw.columns = df_fixture_gw.columns.droplevel(level=0)\n",
"\n",
"\n",
"##\n",
"df_fixture_gw = df_fixture_gw.reset_index()\n",
"\n",
"##\n",
"df_fixture_gw = df_fixture_gw.rename(columns={'Date': 'Date',\n",
" 'nunique': 'Gameweek',\n",
" }\n",
" )\n",
"\n",
"## Groupby. See: https://stackoverflow.com/questions/18554920/pandas-aggregate-count-distinct\n",
"df_fixture_gw = (df_fixture_gw.groupby(['Team', 'Date']).sum()\n",
" .groupby(level=0).cumsum().reset_index()\n",
" )\n",
"\n",
"## Display DataFrame\n",
"df_fixture_gw.head()"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Season \n",
" Date \n",
" Fixture \n",
" Team \n",
" Opponent \n",
" Goals_Home \n",
" Goals_Away \n",
" Event \n",
" Team_Value \n",
" Opponent_Value \n",
" Gameweek \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Monaco \n",
" Toulouse \n",
" 3 \n",
" 2 \n",
" Duel \n",
" 220 \n",
" 205 \n",
" 1 \n",
" \n",
" \n",
" 1 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Monaco \n",
" Toulouse \n",
" 3 \n",
" 2 \n",
" Foul \n",
" 12 \n",
" 23 \n",
" 1 \n",
" \n",
" \n",
" 2 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Monaco \n",
" Toulouse \n",
" 3 \n",
" 2 \n",
" Free Kick \n",
" 58 \n",
" 47 \n",
" 1 \n",
" \n",
" \n",
" 3 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Monaco \n",
" Toulouse \n",
" 3 \n",
" 2 \n",
" Goalkeeper leaving line \n",
" 2 \n",
" 0 \n",
" 1 \n",
" \n",
" \n",
" 4 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Monaco \n",
" Toulouse \n",
" 3 \n",
" 2 \n",
" Offside \n",
" 5 \n",
" 1 \n",
" 1 \n",
" \n",
" \n",
" 5 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Monaco \n",
" Toulouse \n",
" 3 \n",
" 2 \n",
" Others on the ball \n",
" 46 \n",
" 49 \n",
" 1 \n",
" \n",
" \n",
" 6 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Monaco \n",
" Toulouse \n",
" 3 \n",
" 2 \n",
" Pass \n",
" 467 \n",
" 170 \n",
" 1 \n",
" \n",
" \n",
" 7 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Monaco \n",
" Toulouse \n",
" 3 \n",
" 2 \n",
" Save attempt \n",
" 4 \n",
" 7 \n",
" 1 \n",
" \n",
" \n",
" 8 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Monaco \n",
" Toulouse \n",
" 3 \n",
" 2 \n",
" Shot \n",
" 12 \n",
" 4 \n",
" 1 \n",
" \n",
" \n",
" 9 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Toulouse \n",
" Monaco \n",
" 3 \n",
" 2 \n",
" Duel \n",
" 205 \n",
" 220 \n",
" 1 \n",
" \n",
" \n",
" 10 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Toulouse \n",
" Monaco \n",
" 3 \n",
" 2 \n",
" Foul \n",
" 23 \n",
" 12 \n",
" 1 \n",
" \n",
" \n",
" 11 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Toulouse \n",
" Monaco \n",
" 3 \n",
" 2 \n",
" Free Kick \n",
" 47 \n",
" 58 \n",
" 1 \n",
" \n",
" \n",
" 12 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Toulouse \n",
" Monaco \n",
" 3 \n",
" 2 \n",
" Offside \n",
" 1 \n",
" 5 \n",
" 1 \n",
" \n",
" \n",
" 13 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Toulouse \n",
" Monaco \n",
" 3 \n",
" 2 \n",
" Others on the ball \n",
" 49 \n",
" 46 \n",
" 1 \n",
" \n",
" \n",
" 14 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Toulouse \n",
" Monaco \n",
" 3 \n",
" 2 \n",
" Pass \n",
" 170 \n",
" 467 \n",
" 1 \n",
" \n",
" \n",
" 15 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Toulouse \n",
" Monaco \n",
" 3 \n",
" 2 \n",
" Save attempt \n",
" 7 \n",
" 4 \n",
" 1 \n",
" \n",
" \n",
" 16 \n",
" 17/18 \n",
" 2017-08-04 18:45:00 \n",
" Monaco - Toulouse \n",
" Toulouse \n",
" Monaco \n",
" 3 \n",
" 2 \n",
" Shot \n",
" 4 \n",
" 12 \n",
" 1 \n",
" \n",
" \n",
" 17 \n",
" 17/18 \n",
" 2017-08-05 15:15:00 \n",
" PSG - Amiens SC \n",
" Amiens SC \n",
" PSG \n",
" 2 \n",
" 0 \n",
" Duel \n",
" 205 \n",
" 192 \n",
" 1 \n",
" \n",
" \n",
" 18 \n",
" 17/18 \n",
" 2017-08-05 15:15:00 \n",
" PSG - Amiens SC \n",
" Amiens SC \n",
" PSG \n",
" 2 \n",
" 0 \n",
" Foul \n",
" 12 \n",
" 9 \n",
" 1 \n",
" \n",
" \n",
" 19 \n",
" 17/18 \n",
" 2017-08-05 15:15:00 \n",
" PSG - Amiens SC \n",
" Amiens SC \n",
" PSG \n",
" 2 \n",
" 0 \n",
" Free Kick \n",
" 33 \n",
" 41 \n",
" 1 \n",
" \n",
" \n",
" 20 \n",
" 17/18 \n",
" 2017-08-05 15:15:00 \n",
" PSG - Amiens SC \n",
" Amiens SC \n",
" PSG \n",
" 2 \n",
" 0 \n",
" Goalkeeper leaving line \n",
" 1 \n",
" 3 \n",
" 1 \n",
" \n",
" \n",
" 21 \n",
" 17/18 \n",
" 2017-08-05 15:15:00 \n",
" PSG - Amiens SC \n",
" Amiens SC \n",
" PSG \n",
" 2 \n",
" 0 \n",
" Others on the ball \n",
" 82 \n",
" 55 \n",
" 1 \n",
" \n",
" \n",
" 22 \n",
" 17/18 \n",
" 2017-08-05 15:15:00 \n",
" PSG - Amiens SC \n",
" Amiens SC \n",
" PSG \n",
" 2 \n",
" 0 \n",
" Pass \n",
" 328 \n",
" 724 \n",
" 1 \n",
" \n",
" \n",
" 23 \n",
" 17/18 \n",
" 2017-08-05 15:15:00 \n",
" PSG - Amiens SC \n",
" Amiens SC \n",
" PSG \n",
" 2 \n",
" 0 \n",
" Save attempt \n",
" 5 \n",
" 1 \n",
" 1 \n",
" \n",
" \n",
" 24 \n",
" 17/18 \n",
" 2017-08-05 15:15:00 \n",
" PSG - Amiens SC \n",
" Amiens SC \n",
" PSG \n",
" 2 \n",
" 0 \n",
" Shot \n",
" 6 \n",
" 15 \n",
" 1 \n",
" \n",
" \n",
" 25 \n",
" 17/18 \n",
" 2017-08-05 15:15:00 \n",
" PSG - Amiens SC \n",
" PSG \n",
" Amiens SC \n",
" 2 \n",
" 0 \n",
" Duel \n",
" 192 \n",
" 205 \n",
" 1 \n",
" \n",
" \n",
" 26 \n",
" 17/18 \n",
" 2017-08-05 15:15:00 \n",
" PSG - Amiens SC \n",
" PSG \n",
" Amiens SC \n",
" 2 \n",
" 0 \n",
" Foul \n",
" 9 \n",
" 12 \n",
" 1 \n",
" \n",
" \n",
" 27 \n",
" 17/18 \n",
" 2017-08-05 15:15:00 \n",
" PSG - Amiens SC \n",
" PSG \n",
" Amiens SC \n",
" 2 \n",
" 0 \n",
" Free Kick \n",
" 41 \n",
" 33 \n",
" 1 \n",
" \n",
" \n",
" 28 \n",
" 17/18 \n",
" 2017-08-05 15:15:00 \n",
" PSG - Amiens SC \n",
" PSG \n",
" Amiens SC \n",
" 2 \n",
" 0 \n",
" Goalkeeper leaving line \n",
" 3 \n",
" 1 \n",
" 1 \n",
" \n",
" \n",
" 29 \n",
" 17/18 \n",
" 2017-08-05 15:15:00 \n",
" PSG - Amiens SC \n",
" PSG \n",
" Amiens SC \n",
" 2 \n",
" 0 \n",
" Offside \n",
" 3 \n",
" 0 \n",
" 1 \n",
" \n",
" \n",
" 30 \n",
" 17/18 \n",
" 2017-08-05 15:15:00 \n",
" PSG - Amiens SC \n",
" PSG \n",
" Amiens SC \n",
" 2 \n",
" 0 \n",
" Others on the ball \n",
" 55 \n",
" 82 \n",
" 1 \n",
" \n",
" \n",
" 31 \n",
" 17/18 \n",
" 2017-08-05 15:15:00 \n",
" PSG - Amiens SC \n",
" PSG \n",
" Amiens SC \n",
" 2 \n",
" 0 \n",
" Pass \n",
" 724 \n",
" 328 \n",
" 1 \n",
" \n",
" \n",
" 32 \n",
" 17/18 \n",
" 2017-08-05 15:15:00 \n",
" PSG - Amiens SC \n",
" PSG \n",
" Amiens SC \n",
" 2 \n",
" 0 \n",
" Save attempt \n",
" 1 \n",
" 5 \n",
" 1 \n",
" \n",
" \n",
" 33 \n",
" 17/18 \n",
" 2017-08-05 15:15:00 \n",
" PSG - Amiens SC \n",
" PSG \n",
" Amiens SC \n",
" 2 \n",
" 0 \n",
" Shot \n",
" 15 \n",
" 6 \n",
" 1 \n",
" \n",
" \n",
" 34 \n",
" 17/18 \n",
" 2017-08-05 18:00:00 \n",
" Metz - Guingamp \n",
" Guingamp \n",
" Metz \n",
" 1 \n",
" 3 \n",
" Duel \n",
" 160 \n",
" 168 \n",
" 1 \n",
" \n",
" \n",
" 35 \n",
" 17/18 \n",
" 2017-08-05 18:00:00 \n",
" Metz - Guingamp \n",
" Guingamp \n",
" Metz \n",
" 1 \n",
" 3 \n",
" Foul \n",
" 12 \n",
" 7 \n",
" 1 \n",
" \n",
" \n",
" 36 \n",
" 17/18 \n",
" 2017-08-05 18:00:00 \n",
" Metz - Guingamp \n",
" Guingamp \n",
" Metz \n",
" 1 \n",
" 3 \n",
" Free Kick \n",
" 34 \n",
" 51 \n",
" 1 \n",
" \n",
" \n",
" 37 \n",
" 17/18 \n",
" 2017-08-05 18:00:00 \n",
" Metz - Guingamp \n",
" Guingamp \n",
" Metz \n",
" 1 \n",
" 3 \n",
" Goalkeeper leaving line \n",
" 4 \n",
" 1 \n",
" 1 \n",
" \n",
" \n",
" 38 \n",
" 17/18 \n",
" 2017-08-05 18:00:00 \n",
" Metz - Guingamp \n",
" Guingamp \n",
" Metz \n",
" 1 \n",
" 3 \n",
" Offside \n",
" 1 \n",
" 3 \n",
" 1 \n",
" \n",
" \n",
" 39 \n",
" 17/18 \n",
" 2017-08-05 18:00:00 \n",
" Metz - Guingamp \n",
" Guingamp \n",
" Metz \n",
" 1 \n",
" 3 \n",
" Others on the ball \n",
" 46 \n",
" 44 \n",
" 1 \n",
" \n",
" \n",
" 40 \n",
" 17/18 \n",
" 2017-08-05 18:00:00 \n",
" Metz - Guingamp \n",
" Guingamp \n",
" Metz \n",
" 1 \n",
" 3 \n",
" Pass \n",
" 396 \n",
" 528 \n",
" 1 \n",
" \n",
" \n",
" 41 \n",
" 17/18 \n",
" 2017-08-05 18:00:00 \n",
" Metz - Guingamp \n",
" Guingamp \n",
" Metz \n",
" 1 \n",
" 3 \n",
" Save attempt \n",
" 4 \n",
" 5 \n",
" 1 \n",
" \n",
" \n",
" 42 \n",
" 17/18 \n",
" 2017-08-05 18:00:00 \n",
" Metz - Guingamp \n",
" Guingamp \n",
" Metz \n",
" 1 \n",
" 3 \n",
" Shot \n",
" 8 \n",
" 6 \n",
" 1 \n",
" \n",
" \n",
" 43 \n",
" 17/18 \n",
" 2017-08-05 18:00:00 \n",
" Metz - Guingamp \n",
" Metz \n",
" Guingamp \n",
" 1 \n",
" 3 \n",
" Duel \n",
" 168 \n",
" 160 \n",
" 1 \n",
" \n",
" \n",
" 44 \n",
" 17/18 \n",
" 2017-08-05 18:00:00 \n",
" Metz - Guingamp \n",
" Metz \n",
" Guingamp \n",
" 1 \n",
" 3 \n",
" Foul \n",
" 7 \n",
" 12 \n",
" 1 \n",
" \n",
" \n",
" 45 \n",
" 17/18 \n",
" 2017-08-05 18:00:00 \n",
" Metz - Guingamp \n",
" Metz \n",
" Guingamp \n",
" 1 \n",
" 3 \n",
" Free Kick \n",
" 51 \n",
" 34 \n",
" 1 \n",
" \n",
" \n",
" 46 \n",
" 17/18 \n",
" 2017-08-05 18:00:00 \n",
" Metz - Guingamp \n",
" Metz \n",
" Guingamp \n",
" 1 \n",
" 3 \n",
" Goalkeeper leaving line \n",
" 1 \n",
" 4 \n",
" 1 \n",
" \n",
" \n",
" 47 \n",
" 17/18 \n",
" 2017-08-05 18:00:00 \n",
" Metz - Guingamp \n",
" Metz \n",
" Guingamp \n",
" 1 \n",
" 3 \n",
" Offside \n",
" 3 \n",
" 1 \n",
" 1 \n",
" \n",
" \n",
" 48 \n",
" 17/18 \n",
" 2017-08-05 18:00:00 \n",
" Metz - Guingamp \n",
" Metz \n",
" Guingamp \n",
" 1 \n",
" 3 \n",
" Others on the ball \n",
" 44 \n",
" 46 \n",
" 1 \n",
" \n",
" \n",
" 49 \n",
" 17/18 \n",
" 2017-08-05 18:00:00 \n",
" Metz - Guingamp \n",
" Metz \n",
" Guingamp \n",
" 1 \n",
" 3 \n",
" Pass \n",
" 528 \n",
" 396 \n",
" 1 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Season Date Fixture Team Opponent \\\n",
"0 17/18 2017-08-04 18:45:00 Monaco - Toulouse Monaco Toulouse \n",
"1 17/18 2017-08-04 18:45:00 Monaco - Toulouse Monaco Toulouse \n",
"2 17/18 2017-08-04 18:45:00 Monaco - Toulouse Monaco Toulouse \n",
"3 17/18 2017-08-04 18:45:00 Monaco - Toulouse Monaco Toulouse \n",
"4 17/18 2017-08-04 18:45:00 Monaco - Toulouse Monaco Toulouse \n",
"5 17/18 2017-08-04 18:45:00 Monaco - Toulouse Monaco Toulouse \n",
"6 17/18 2017-08-04 18:45:00 Monaco - Toulouse Monaco Toulouse \n",
"7 17/18 2017-08-04 18:45:00 Monaco - Toulouse Monaco Toulouse \n",
"8 17/18 2017-08-04 18:45:00 Monaco - Toulouse Monaco Toulouse \n",
"9 17/18 2017-08-04 18:45:00 Monaco - Toulouse Toulouse Monaco \n",
"10 17/18 2017-08-04 18:45:00 Monaco - Toulouse Toulouse Monaco \n",
"11 17/18 2017-08-04 18:45:00 Monaco - Toulouse Toulouse Monaco \n",
"12 17/18 2017-08-04 18:45:00 Monaco - Toulouse Toulouse Monaco \n",
"13 17/18 2017-08-04 18:45:00 Monaco - Toulouse Toulouse Monaco \n",
"14 17/18 2017-08-04 18:45:00 Monaco - Toulouse Toulouse Monaco \n",
"15 17/18 2017-08-04 18:45:00 Monaco - Toulouse Toulouse Monaco \n",
"16 17/18 2017-08-04 18:45:00 Monaco - Toulouse Toulouse Monaco \n",
"17 17/18 2017-08-05 15:15:00 PSG - Amiens SC Amiens SC PSG \n",
"18 17/18 2017-08-05 15:15:00 PSG - Amiens SC Amiens SC PSG \n",
"19 17/18 2017-08-05 15:15:00 PSG - Amiens SC Amiens SC PSG \n",
"20 17/18 2017-08-05 15:15:00 PSG - Amiens SC Amiens SC PSG \n",
"21 17/18 2017-08-05 15:15:00 PSG - Amiens SC Amiens SC PSG \n",
"22 17/18 2017-08-05 15:15:00 PSG - Amiens SC Amiens SC PSG \n",
"23 17/18 2017-08-05 15:15:00 PSG - Amiens SC Amiens SC PSG \n",
"24 17/18 2017-08-05 15:15:00 PSG - Amiens SC Amiens SC PSG \n",
"25 17/18 2017-08-05 15:15:00 PSG - Amiens SC PSG Amiens SC \n",
"26 17/18 2017-08-05 15:15:00 PSG - Amiens SC PSG Amiens SC \n",
"27 17/18 2017-08-05 15:15:00 PSG - Amiens SC PSG Amiens SC \n",
"28 17/18 2017-08-05 15:15:00 PSG - Amiens SC PSG Amiens SC \n",
"29 17/18 2017-08-05 15:15:00 PSG - Amiens SC PSG Amiens SC \n",
"30 17/18 2017-08-05 15:15:00 PSG - Amiens SC PSG Amiens SC \n",
"31 17/18 2017-08-05 15:15:00 PSG - Amiens SC PSG Amiens SC \n",
"32 17/18 2017-08-05 15:15:00 PSG - Amiens SC PSG Amiens SC \n",
"33 17/18 2017-08-05 15:15:00 PSG - Amiens SC PSG Amiens SC \n",
"34 17/18 2017-08-05 18:00:00 Metz - Guingamp Guingamp Metz \n",
"35 17/18 2017-08-05 18:00:00 Metz - Guingamp Guingamp Metz \n",
"36 17/18 2017-08-05 18:00:00 Metz - Guingamp Guingamp Metz \n",
"37 17/18 2017-08-05 18:00:00 Metz - Guingamp Guingamp Metz \n",
"38 17/18 2017-08-05 18:00:00 Metz - Guingamp Guingamp Metz \n",
"39 17/18 2017-08-05 18:00:00 Metz - Guingamp Guingamp Metz \n",
"40 17/18 2017-08-05 18:00:00 Metz - Guingamp Guingamp Metz \n",
"41 17/18 2017-08-05 18:00:00 Metz - Guingamp Guingamp Metz \n",
"42 17/18 2017-08-05 18:00:00 Metz - Guingamp Guingamp Metz \n",
"43 17/18 2017-08-05 18:00:00 Metz - Guingamp Metz Guingamp \n",
"44 17/18 2017-08-05 18:00:00 Metz - Guingamp Metz Guingamp \n",
"45 17/18 2017-08-05 18:00:00 Metz - Guingamp Metz Guingamp \n",
"46 17/18 2017-08-05 18:00:00 Metz - Guingamp Metz Guingamp \n",
"47 17/18 2017-08-05 18:00:00 Metz - Guingamp Metz Guingamp \n",
"48 17/18 2017-08-05 18:00:00 Metz - Guingamp Metz Guingamp \n",
"49 17/18 2017-08-05 18:00:00 Metz - Guingamp Metz Guingamp \n",
"\n",
" Goals_Home Goals_Away Event Team_Value Opponent_Value \\\n",
"0 3 2 Duel 220 205 \n",
"1 3 2 Foul 12 23 \n",
"2 3 2 Free Kick 58 47 \n",
"3 3 2 Goalkeeper leaving line 2 0 \n",
"4 3 2 Offside 5 1 \n",
"5 3 2 Others on the ball 46 49 \n",
"6 3 2 Pass 467 170 \n",
"7 3 2 Save attempt 4 7 \n",
"8 3 2 Shot 12 4 \n",
"9 3 2 Duel 205 220 \n",
"10 3 2 Foul 23 12 \n",
"11 3 2 Free Kick 47 58 \n",
"12 3 2 Offside 1 5 \n",
"13 3 2 Others on the ball 49 46 \n",
"14 3 2 Pass 170 467 \n",
"15 3 2 Save attempt 7 4 \n",
"16 3 2 Shot 4 12 \n",
"17 2 0 Duel 205 192 \n",
"18 2 0 Foul 12 9 \n",
"19 2 0 Free Kick 33 41 \n",
"20 2 0 Goalkeeper leaving line 1 3 \n",
"21 2 0 Others on the ball 82 55 \n",
"22 2 0 Pass 328 724 \n",
"23 2 0 Save attempt 5 1 \n",
"24 2 0 Shot 6 15 \n",
"25 2 0 Duel 192 205 \n",
"26 2 0 Foul 9 12 \n",
"27 2 0 Free Kick 41 33 \n",
"28 2 0 Goalkeeper leaving line 3 1 \n",
"29 2 0 Offside 3 0 \n",
"30 2 0 Others on the ball 55 82 \n",
"31 2 0 Pass 724 328 \n",
"32 2 0 Save attempt 1 5 \n",
"33 2 0 Shot 15 6 \n",
"34 1 3 Duel 160 168 \n",
"35 1 3 Foul 12 7 \n",
"36 1 3 Free Kick 34 51 \n",
"37 1 3 Goalkeeper leaving line 4 1 \n",
"38 1 3 Offside 1 3 \n",
"39 1 3 Others on the ball 46 44 \n",
"40 1 3 Pass 396 528 \n",
"41 1 3 Save attempt 4 5 \n",
"42 1 3 Shot 8 6 \n",
"43 1 3 Duel 168 160 \n",
"44 1 3 Foul 7 12 \n",
"45 1 3 Free Kick 51 34 \n",
"46 1 3 Goalkeeper leaving line 1 4 \n",
"47 1 3 Offside 3 1 \n",
"48 1 3 Others on the ball 44 46 \n",
"49 1 3 Pass 528 396 \n",
"\n",
" Gameweek \n",
"0 1 \n",
"1 1 \n",
"2 1 \n",
"3 1 \n",
"4 1 \n",
"5 1 \n",
"6 1 \n",
"7 1 \n",
"8 1 \n",
"9 1 \n",
"10 1 \n",
"11 1 \n",
"12 1 \n",
"13 1 \n",
"14 1 \n",
"15 1 \n",
"16 1 \n",
"17 1 \n",
"18 1 \n",
"19 1 \n",
"20 1 \n",
"21 1 \n",
"22 1 \n",
"23 1 \n",
"24 1 \n",
"25 1 \n",
"26 1 \n",
"27 1 \n",
"28 1 \n",
"29 1 \n",
"30 1 \n",
"31 1 \n",
"32 1 \n",
"33 1 \n",
"34 1 \n",
"35 1 \n",
"36 1 \n",
"37 1 \n",
"38 1 \n",
"39 1 \n",
"40 1 \n",
"41 1 \n",
"42 1 \n",
"43 1 \n",
"44 1 \n",
"45 1 \n",
"46 1 \n",
"47 1 \n",
"48 1 \n",
"49 1 "
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Join DataFrame \n",
"df_wyscout_fixture_grouped = pd.merge(df_wyscout_fixture_grouped, df_fixture_gw, how='left', left_on=['Date', 'Team'], right_on = ['Date', 'Team'])\n",
"\n",
"# Display DataFrame\n",
"df_wyscout_fixture_grouped.head(50)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 4.8.2. Team Level "
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Team \n",
" Event \n",
" Team_Value \n",
" Opponent_Value \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" AFC Bournemouth \n",
" Duel \n",
" 7977 \n",
" 8003 \n",
" \n",
" \n",
" 1 \n",
" AFC Bournemouth \n",
" Foul \n",
" 350 \n",
" 459 \n",
" \n",
" \n",
" 2 \n",
" AFC Bournemouth \n",
" Free Kick \n",
" 1818 \n",
" 1631 \n",
" \n",
" \n",
" 3 \n",
" AFC Bournemouth \n",
" Goalkeeper leaving line \n",
" 75 \n",
" 45 \n",
" \n",
" \n",
" 4 \n",
" AFC Bournemouth \n",
" Offside \n",
" 51 \n",
" 79 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Team Event Team_Value Opponent_Value\n",
"0 AFC Bournemouth Duel 7977 8003\n",
"1 AFC Bournemouth Foul 350 459\n",
"2 AFC Bournemouth Free Kick 1818 1631\n",
"3 AFC Bournemouth Goalkeeper leaving line 75 45\n",
"4 AFC Bournemouth Offside 51 79"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Group DataFrame by Team\n",
"\n",
"##\n",
"df_wyscout_team_grouped = (df_wyscout_fixture_grouped\n",
" .groupby(['Team', 'Event'])\n",
" .agg({'Team_Value': ['sum'],\n",
" 'Opponent_Value': ['sum']\n",
" }\n",
" )\n",
" )\n",
"\n",
"##\n",
"df_wyscout_team_grouped.columns = df_wyscout_team_grouped.columns.droplevel(level=0)\n",
"\n",
"##\n",
"df_wyscout_team_grouped = df_wyscout_team_grouped.reset_index()\n",
"\n",
"## Rename columns\n",
"df_wyscout_team_grouped.columns = ['Team', 'Event', 'Team_Value', 'Opponent_Value']\n",
"\n",
"## Display columns\n",
"df_wyscout_team_grouped.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.9. Filter Final DataFrames for 'Big 5' European Leagues Only "
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [],
"source": [
"lst_big5_leagues = [364, 412, 426, 524, 795]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### Events DataFrame"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [],
"source": [
"df_wyscout_big5 = df_wyscout[df_wyscout['competitionId'].isin(lst_big5_leagues)]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### Aggregated DataFrame at fixture level"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {},
"outputs": [
{
"ename": "KeyError",
"evalue": "'competitionId'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 3079\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3080\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcasted_key\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3081\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32mpandas/_libs/index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32mpandas/_libs/index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n",
"\u001b[0;31mKeyError\u001b[0m: 'competitionId'",
"\nThe above exception was the direct cause of the following exception:\n",
"\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mdf_wyscout_fixture_grouped_big5\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf_wyscout_fixture_grouped\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mdf_wyscout_fixture_grouped\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'competitionId'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlst_big5_leagues\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 3022\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnlevels\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3023\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_getitem_multilevel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3024\u001b[0;31m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3025\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mis_integer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3026\u001b[0m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/anaconda3/lib/python3.7/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 3080\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcasted_key\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3081\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3082\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3083\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3084\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtolerance\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mKeyError\u001b[0m: 'competitionId'"
]
}
],
"source": [
"df_wyscout_fixture_grouped_big5 = df_wyscout_fixture_grouped[df_wyscout_fixture_grouped['competitionId'].isin(lst_big5_leagues)]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### Aggregated DataFrame at team level"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df_wyscout_team_grouped_big5 = df_wyscout_team_grouped[df_wyscout_team_grouped['competitionId'].isin(lst_big5_leagues)]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## 5. Export Data \n",
"Export Data ready for building the Expected Goals models in the subsequent notebooks."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### Events DataFrames"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [],
"source": [
"# Export Events DataFrame as CSV\n",
"if not os.path.exists(os.path.join(data_dir_wyscout, 'engineered', 'combined', 'wyscout_events_all_1718.csv')):\n",
" df_wyscout.to_csv(os.path.join(data_dir_wyscout, 'engineered', 'combined', 'wyscout_events_all_1718.csv'), index=None, header=True)\n",
"else:\n",
" pass"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [],
"source": [
"# Export Events DataFrame as CSV\n",
"if not os.path.exists(os.path.join(data_dir_wyscout, 'engineered', 'combined', 'wyscout_events_big5_1718.csv')):\n",
" df_wyscout_big5.to_csv(os.path.join(data_dir_wyscout, 'engineered', 'combined', 'wyscout_events_big5_1718.csv'), index=None, header=True)\n",
"else:\n",
" pass"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### Aggregated DataFrames at fixture level"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Export Aggregated DataFrame at the fixture Level as CSV\n",
"if not os.path.exists(os.path.join(data_dir_wyscout, 'engineered', 'combined', 'wyscout_aggregated_fixtures_all_1718.csv')):\n",
" df_wyscout_fixture_grouped.to_csv(os.path.join(data_dir_wyscout, 'engineered', 'combined', 'wyscout_aggregated_fixtures_all_1718.csv'), index=None, header=True)\n",
"else:\n",
" pass"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Export Aggregated DataFrame at the fixture Level as CSV\n",
"if not os.path.exists(os.path.join(data_dir_wyscout, 'engineered', 'combined', 'wyscout_aggregated_fixtures_big5_1718.csv')):\n",
" df_wyscout_fixture_grouped_big5.to_csv(os.path.join(data_dir_wyscout, 'engineered', 'combined', 'wyscout_aggregated_fixtures_big5_1718.csv'), index=None, header=True)\n",
"else:\n",
" pass"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### Aggregated DataFrames at team level"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Export Aggregated DataFrame at the team Level as CSV\n",
"if not os.path.exists(os.path.join(data_dir_wyscout, 'engineered', 'combined', 'wyscout_aggregated_team_all_1718.csv')):\n",
" df_wyscout_team_grouped.to_csv(os.path.join(data_dir_wyscout, 'engineered', 'combined', 'wyscout_aggregated_team_all_1718.csv'), index=None, header=True)\n",
"else:\n",
" pass"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Export Aggregated DataFrame at the team Level as CSV\n",
"if not os.path.exists(os.path.join(data_dir_wyscout, 'engineered', 'combined', 'wyscout_aggregated_team_big5_1718.csv')):\n",
" df_wyscout_team_grouped_big5.to_csv(os.path.join(data_dir_wyscout, 'engineered', 'combined', 'wyscout_aggregated_team_big5_1718.csv'), index=None, header=True)\n",
"else:\n",
" pass"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## 6. Summary \n",
"This notebook parses Wyscout data using [pandas](http://pandas.pydata.org/) for data manipulation through DataFrames."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## 7. Next Steps \n",
"The step is to take the dataset created in this notebook and ..."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## 8. References \n",
"* Data Parsing notebook: https://nbviewer.jupyter.org/github/eddwebster/football_analytics/blob/master/notebooks/2_data_parsing/Wyscout%20Parsing.ipynb\n",
"* Wyscout: https://wyscout.com/\n",
"* Wyscout Events data manual: https://footballdata.wyscout.com/events-manual/\n",
"* Pappalardo, Luca; Massucco, Emanuele (2019): Soccer match event dataset. figshare. Collection. https://doi.org/10.6084/m9.figshare.c.4415000.v5\n",
"* Pappalardo, L., Cintia, P., Rossi, A. et al. **A public data set of spatio-temporal match events in soccer competitions**. Scientific Data 6, 236 (2019) doi:10.1038/s41597-019-0247-7, https://www.nature.com/articles/s41597-019-0247-7\n",
"* Custom function to flatten pandas DataFrames with nested JSON column: https://stackoverflow.com/questions/39899005/how-to-flatten-a-pandas-dataframe-with-some-columns-as-json"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## 9. Further Reading "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"***Visit my website [EddWebster.com](https://www.eddwebster.com) or my [GitHub Repository](https://github.com/eddwebster) for more projects. If you'd like to get in contact, my Twitter handle is [@eddwebster](http://www.twitter.com/eddwebster) and my email is: edd.j.webster@gmail.com.***"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Back to the top](#top)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.6"
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"oldHeight": 642,
"position": {
"height": "664px",
"left": "1059px",
"right": "20px",
"top": "-2px",
"width": "489px"
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"varInspector_section_display": "block",
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}