{ "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
eventIdsubEventNameplayerIdpositionsmatchIdeventNameteamIdmatchPeriodeventSecsubEventIdidtagsstatusroundIdgameweekseasonIddateutcwinnervenuewyId_xlabeldaterefereesdurationcompetitionIdwyId_yarea_nameweightfirstNamemiddleNamelastNamebirthDateheightwyId_x.1footshortNamepassportArea_namerole_namebirthArea_namenamewyId_y.1
08Simple pass26010[{'y': 48, 'x': 50}, {'y': 50, 'x': 47}]1694390Pass44181H1.25599085.088178642[{'id': 1801}]Played4165470192912016-06-10 19:00:004418Stade de France1694390France - Romania, 2 - 12016-06-10 21:00:00-02:00[{'refereeId': 383185, 'role': 'referee'}, {'r...Regular102102NaN88OlivierNaNGiroud1986-09-3019226010leftO. GiroudFranceForwardFranceFrance4418
18Simple pass3682[{'y': 50, 'x': 47}, {'y': 48, 'x': 41}]1694390Pass44181H2.35190885.088178643[{'id': 1801}]Played4165470192912016-06-10 19:00:004418Stade de France1694390France - Romania, 2 - 12016-06-10 21:00:00-02:00[{'refereeId': 383185, 'role': 'referee'}, {'r...Regular102102NaN71AntoineNaNGriezmann1991-03-211753682leftA. GriezmannFranceForwardFranceFrance4418
28Simple pass31528[{'y': 48, 'x': 41}, {'y': 35, 'x': 32}]1694390Pass44181H3.24102885.088178644[{'id': 1801}]Played4165470192912016-06-10 19:00:004418Stade de France1694390France - Romania, 2 - 12016-06-10 21:00:00-02:00[{'refereeId': 383185, 'role': 'referee'}, {'r...Regular102102NaN68N'GoloNaNKanté1991-03-2916831528rightN. KantéMaliMidfielderFranceFrance4418
38High pass7855[{'y': 35, 'x': 32}, {'y': 6, 'x': 89}]1694390Pass44181H6.03368183.088178645[{'id': 1802}]Played4165470192912016-06-10 19:00:004418Stade de France1694390France - Romania, 2 - 12016-06-10 21:00:00-02:00[{'refereeId': 383185, 'role': 'referee'}, {'r...Regular102102NaN75LaurentNaNKoscielny1985-09-101867855rightL. KoscielnyPolandDefenderFranceFrance4418
41Ground defending duel25437[{'y': 6, 'x': 89}, {'y': 0, 'x': 85}]1694390Duel44181H13.14359112.088178646[{'id': 702}, {'id': 1801}]Played4165470192912016-06-10 19:00:004418Stade de France1694390France - Romania, 2 - 12016-06-10 21:00:00-02:00[{'refereeId': 383185, 'role': 'referee'}, {'r...Regular102102NaN70BlaiseNaNMatuidi1987-04-0917525437leftB. MatuidiAngolaMidfielderFranceFrance4418
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
eventIdsubEventNameplayerIdpositionsmatchIdeventNameteamIdmatchPeriodeventSecsubEventIdidtagsstatusroundIdgameweekseasonIddateutcwinnervenuewyId_xlabeldaterefereesdurationcompetitionIdwyId_yarea_nameweightfirstNamemiddleNamelastNamebirthDateheightwyId_x.1footshortNamepassportArea_namerole_namebirthArea_namenamewyId_y.1
30252512Foul21234[{'y': 87, 'x': 24}, {'y': 82, 'x': 26}]2576338Foul31852H2824.74185520.0253567159[]Played4406278381812482018-05-20 13:00:003185NaN2576338Genoa - Torino, 1 - 2May 20, 2018 at 3:00:00 PM GMT+2[{'refereeId': 393614, 'role': 'referee'}, {'r...Regular524524Italy72AndreaNaNBelotti1993-12-2018121234rightA. BelottiItalyForwardItalyTorino3185
30252523Free kick cross70974[{'y': 23, 'x': 75}, {'y': 65, 'x': 95}]2576338Free Kick31932H2870.98266032.0253567160[{'id': 801}, {'id': 1801}]Played4406278381812482018-05-20 13:00:003185NaN2576338Genoa - Torino, 1 - 2May 20, 2018 at 3:00:00 PM GMT+2[{'refereeId': 393614, 'role': 'referee'}, {'r...Regular524524Italy64Iuri JoséNaNPicanço Medeiros1994-07-1017470974leftIuri MedeirosPortugalForwardPortugalGenoa3193
30252531Ground loose ball duel14745[{'y': 35, 'x': 5}, {'y': 36, 'x': 3}]2576338Duel31852H2872.10114213.0253567161[{'id': 702}, {'id': 1801}]Played4406278381812482018-05-20 13:00:003185NaN2576338Genoa - Torino, 1 - 2May 20, 2018 at 3:00:00 PM GMT+2[{'refereeId': 393614, 'role': 'referee'}, {'r...Regular524524Italy82CristianNaNMolinaro1983-07-3018214745leftC. MolinaroItalyDefenderItalyTorino3185
30252541Ground loose ball duel413041[{'y': 65, 'x': 95}, {'y': 64, 'x': 97}]2576338Duel31932H2872.99043713.0253567163[{'id': 702}, {'id': 1801}]Played4406278381812482018-05-20 13:00:003185NaN2576338Genoa - Torino, 1 - 2May 20, 2018 at 3:00:00 PM GMT+2[{'refereeId': 393614, 'role': 'referee'}, {'r...Regular524524Italy83JawadNaNEl Yamiq1992-02-29190413041rightJ. El YamiqMoroccoDefenderMoroccoGenoa3193
30252551Air duel20927[{'y': 36, 'x': 3}, {'y': 100, 'x': 100}]2576338Duel31852H2874.04920610.0253567162[{'id': 703}, {'id': 1801}]Played4406278381812482018-05-20 13:00:003185NaN2576338Genoa - Torino, 1 - 2May 20, 2018 at 3:00:00 PM GMT+2[{'refereeId': 393614, 'role': 'referee'}, {'r...Regular524524Italy84LorenzoNaNDe Silvestri1988-05-2318620927rightL. De SilvestriItalyDefenderItalyTorino3185
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
eventIdplayerIdmatchIdteamIdeventSecsubEventIdidroundIdgameweekseasonIdwinnerwyId_xcompetitionIdwyId_yweightmiddleNameheightwyId_x.1wyId_y.1
count3.025256e+063.025256e+063.025256e+063.025256e+063.025256e+063.017102e+063.025256e+063.025256e+063.025256e+063.025256e+063.025256e+063.025256e+063.025256e+063.025256e+063.025256e+060.03.025256e+063.025256e+063.025256e+06
mean5.694230e+008.953778e+042.494932e+063.004373e+031.390728e+036.013484e+012.158336e+084.391560e+061.815116e+011.709805e+052.317237e+032.494932e+064.797790e+024.797790e+027.622714e+01NaN1.820490e+028.953778e+043.004373e+03
std3.141030e+001.169272e+051.591746e+052.925207e+038.347843e+023.257763e+013.023051e+075.686541e+041.126545e+014.054451e+043.021050e+031.591746e+051.845044e+021.845044e+027.149052e+00NaN7.032542e+001.169272e+052.925207e+03
min1.000000e+001.200000e+011.694390e+066.740000e+020.000000e+001.000000e+018.817864e+074.165363e+060.000000e+009.291000e+030.000000e+001.694390e+062.800000e+012.800000e+010.000000e+00NaN0.000000e+001.200000e+016.740000e+02
25%1.000000e+009.380000e+032.500086e+061.619000e+036.608105e+021.300000e+011.988861e+084.405654e+068.000000e+001.811440e+056.740000e+022.500086e+063.640000e+023.640000e+027.200000e+01NaN1.780000e+029.380000e+031.619000e+03
50%8.000000e+002.562300e+042.516836e+062.460000e+031.374896e+038.300000e+012.191298e+084.405655e+061.800000e+011.811500e+051.633000e+032.516836e+064.260000e+024.260000e+027.600000e+01NaN1.820000e+022.562300e+042.460000e+03
75%8.000000e+001.345420e+052.565827e+063.766000e+032.109554e+038.500000e+012.352463e+084.406122e+062.800000e+011.811890e+053.173000e+032.565827e+065.240000e+025.240000e+028.100000e+01NaN1.870000e+021.345420e+053.766000e+03
max1.000000e+015.685830e+052.576338e+061.983000e+043.537356e+031.000000e+022.802175e+084.406278e+063.800000e+011.812480e+051.983000e+042.576338e+067.950000e+027.950000e+021.010000e+02NaN2.030000e+025.685830e+051.983000e+04
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SeasonDateFixtureTeamOpponentGoals_HomeGoals_AwayEventTeam_Value
017/182017-08-04 18:45:00Monaco - ToulouseMonacoToulouse32Duel220
117/182017-08-04 18:45:00Monaco - ToulouseMonacoToulouse32Foul12
217/182017-08-04 18:45:00Monaco - ToulouseMonacoToulouse32Free Kick58
317/182017-08-04 18:45:00Monaco - ToulouseMonacoToulouse32Goalkeeper leaving line2
417/182017-08-04 18:45:00Monaco - ToulouseMonacoToulouse32Offside5
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SeasonDateFixtureTeamOpponentGoals_HomeGoals_AwayEventTeam_ValueOpponent_Value
017/182017-08-04 18:45:00Monaco - ToulouseMonacoToulouse32Duel220205
117/182017-08-04 18:45:00Monaco - ToulouseMonacoToulouse32Foul1223
217/182017-08-04 18:45:00Monaco - ToulouseMonacoToulouse32Free Kick5847
317/182017-08-04 18:45:00Monaco - ToulouseMonacoToulouse32Goalkeeper leaving line20
417/182017-08-04 18:45:00Monaco - ToulouseMonacoToulouse32Offside51
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
TeamDateGameweek
0AFC Bournemouth2017-08-12 14:00:001
1AFC Bournemouth2017-08-19 14:00:002
2AFC Bournemouth2017-08-26 11:30:003
3AFC Bournemouth2017-09-09 14:00:004
4AFC Bournemouth2017-09-15 19:00:005
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SeasonDateFixtureTeamOpponentGoals_HomeGoals_AwayEventTeam_ValueOpponent_ValueGameweek
017/182017-08-04 18:45:00Monaco - ToulouseMonacoToulouse32Duel2202051
117/182017-08-04 18:45:00Monaco - ToulouseMonacoToulouse32Foul12231
217/182017-08-04 18:45:00Monaco - ToulouseMonacoToulouse32Free Kick58471
317/182017-08-04 18:45:00Monaco - ToulouseMonacoToulouse32Goalkeeper leaving line201
417/182017-08-04 18:45:00Monaco - ToulouseMonacoToulouse32Offside511
517/182017-08-04 18:45:00Monaco - ToulouseMonacoToulouse32Others on the ball46491
617/182017-08-04 18:45:00Monaco - ToulouseMonacoToulouse32Pass4671701
717/182017-08-04 18:45:00Monaco - ToulouseMonacoToulouse32Save attempt471
817/182017-08-04 18:45:00Monaco - ToulouseMonacoToulouse32Shot1241
917/182017-08-04 18:45:00Monaco - ToulouseToulouseMonaco32Duel2052201
1017/182017-08-04 18:45:00Monaco - ToulouseToulouseMonaco32Foul23121
1117/182017-08-04 18:45:00Monaco - ToulouseToulouseMonaco32Free Kick47581
1217/182017-08-04 18:45:00Monaco - ToulouseToulouseMonaco32Offside151
1317/182017-08-04 18:45:00Monaco - ToulouseToulouseMonaco32Others on the ball49461
1417/182017-08-04 18:45:00Monaco - ToulouseToulouseMonaco32Pass1704671
1517/182017-08-04 18:45:00Monaco - ToulouseToulouseMonaco32Save attempt741
1617/182017-08-04 18:45:00Monaco - ToulouseToulouseMonaco32Shot4121
1717/182017-08-05 15:15:00PSG - Amiens SCAmiens SCPSG20Duel2051921
1817/182017-08-05 15:15:00PSG - Amiens SCAmiens SCPSG20Foul1291
1917/182017-08-05 15:15:00PSG - Amiens SCAmiens SCPSG20Free Kick33411
2017/182017-08-05 15:15:00PSG - Amiens SCAmiens SCPSG20Goalkeeper leaving line131
2117/182017-08-05 15:15:00PSG - Amiens SCAmiens SCPSG20Others on the ball82551
2217/182017-08-05 15:15:00PSG - Amiens SCAmiens SCPSG20Pass3287241
2317/182017-08-05 15:15:00PSG - Amiens SCAmiens SCPSG20Save attempt511
2417/182017-08-05 15:15:00PSG - Amiens SCAmiens SCPSG20Shot6151
2517/182017-08-05 15:15:00PSG - Amiens SCPSGAmiens SC20Duel1922051
2617/182017-08-05 15:15:00PSG - Amiens SCPSGAmiens SC20Foul9121
2717/182017-08-05 15:15:00PSG - Amiens SCPSGAmiens SC20Free Kick41331
2817/182017-08-05 15:15:00PSG - Amiens SCPSGAmiens SC20Goalkeeper leaving line311
2917/182017-08-05 15:15:00PSG - Amiens SCPSGAmiens SC20Offside301
3017/182017-08-05 15:15:00PSG - Amiens SCPSGAmiens SC20Others on the ball55821
3117/182017-08-05 15:15:00PSG - Amiens SCPSGAmiens SC20Pass7243281
3217/182017-08-05 15:15:00PSG - Amiens SCPSGAmiens SC20Save attempt151
3317/182017-08-05 15:15:00PSG - Amiens SCPSGAmiens SC20Shot1561
3417/182017-08-05 18:00:00Metz - GuingampGuingampMetz13Duel1601681
3517/182017-08-05 18:00:00Metz - GuingampGuingampMetz13Foul1271
3617/182017-08-05 18:00:00Metz - GuingampGuingampMetz13Free Kick34511
3717/182017-08-05 18:00:00Metz - GuingampGuingampMetz13Goalkeeper leaving line411
3817/182017-08-05 18:00:00Metz - GuingampGuingampMetz13Offside131
3917/182017-08-05 18:00:00Metz - GuingampGuingampMetz13Others on the ball46441
4017/182017-08-05 18:00:00Metz - GuingampGuingampMetz13Pass3965281
4117/182017-08-05 18:00:00Metz - GuingampGuingampMetz13Save attempt451
4217/182017-08-05 18:00:00Metz - GuingampGuingampMetz13Shot861
4317/182017-08-05 18:00:00Metz - GuingampMetzGuingamp13Duel1681601
4417/182017-08-05 18:00:00Metz - GuingampMetzGuingamp13Foul7121
4517/182017-08-05 18:00:00Metz - GuingampMetzGuingamp13Free Kick51341
4617/182017-08-05 18:00:00Metz - GuingampMetzGuingamp13Goalkeeper leaving line141
4717/182017-08-05 18:00:00Metz - GuingampMetzGuingamp13Offside311
4817/182017-08-05 18:00:00Metz - GuingampMetzGuingamp13Others on the ball44461
4917/182017-08-05 18:00:00Metz - GuingampMetzGuingamp13Pass5283961
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
TeamEventTeam_ValueOpponent_Value
0AFC BournemouthDuel79778003
1AFC BournemouthFoul350459
2AFC BournemouthFree Kick18181631
3AFC BournemouthGoalkeeper leaving line7545
4AFC BournemouthOffside5179
\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 }