{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# The Guardian Player Recorded Transfer Fees Data Engineering\n", "##### Notebook to engineer player recorded transfer data scraped from [The Guardian](https://www.theguardian.com/football/ng-interactive/2021/jun/07/mens-transfer-window-summer-2021-all-deals-from-europes-top-five-leagues).\n", "\n", "### By [Edd Webster](https://www.twitter.com/eddwebster)\n", "Notebook first written: 22/08/2021
\n", "Notebook last updated: 06/09/2021\n", "\n", "![title](../../img/logos/the-guardian-logo.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "___\n", "\n", "\n", "\n", "## Introduction\n", "This notebook engineers transfer data data from the [Guardian](https://www.theguardian.com/football/ng-interactive/2021/jun/07/mens-transfer-window-summer-2021-all-deals-from-europes-top-five-leagues) provided by [Tom Worville](https://twitter.com/Worville/) (see Tweet [[link](https://twitter.com/Worville/status/1420035521988993034)]), and manipulates this landed data as DataFrames using [pandas](http://pandas.pydata.org/) and [matplotlib](https://matplotlib.org/) for visualisation.\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/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/A%29%20Web%20Scraping/TransferMarkt%20Web%20Scraping%20and%20Parsing.ipynb)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "___\n", "\n", "\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. [Data Dictionary](#section3.2)
\n", " 3. [Creating the DataFrame](#section3.3)
\n", " 4. [Initial Data Handling](#section3.4)
\n", " 5. [Export the Raw DataFrame](#section3.5)
\n", "4. [Data Engineering](#section4)
\n", " 1. [Introduction](#section4.1)
\n", " 2. [Columns of Interest](#section4.2)
\n", " 3. [String Cleaning](#section4.3)
\n", " 4. [Converting Data Types](#section4.4)
\n", " 5. [Export the Engineered 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", "\n", "\n", "## 1. Notebook Dependencies\n", "This notebook was written using [Python 3](https://docs.python.org/3.7/) and requires the following libraries:\n", "* [`Jupyter notebooks`](https://jupyter.org/) for this notebook environment with which this project is presented;\n", "* [`NumPy`](http://www.numpy.org/) for multidimensional array computing;\n", "* [`pandas`](http://pandas.pydata.org/) for data analysis and manipulation; and\n", "* [`matplotlib`](https://matplotlib.org/contents.html?v=20200411155018) for data visualisations.\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": [ "# 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", "# Flatten lists\n", "from functools import reduce\n", "\n", "# Working with JSON\n", "import json\n", "from pandas.io.json import json_normalize\n", "\n", "# Web Scraping\n", "import requests\n", "from bs4 import BeautifulSoup\n", "import re\n", "\n", "# Currency Convert\n", "from forex_python.converter import CurrencyRates\n", "\n", "# APIs\n", "from tyrone_mings import * \n", "\n", "# Fuzzy Matching - Record Linkage\n", "import recordlinkage\n", "import jellyfish\n", "import numexpr as ne\n", "\n", "# Data Visualisation\n", "import matplotlib as mpl\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "plt.style.use('seaborn-whitegrid')\n", "import missingno as msno\n", "\n", "# Progress Bar\n", "from tqdm import tqdm\n", "\n", "# Display in Jupyter\n", "from IPython.display import Image, YouTubeVideo\n", "from IPython.core.display import HTML\n", "\n", "# Ignore Warnings\n", "import warnings\n", "warnings.filterwarnings(action=\"ignore\", message=\"^internal gelsd\")\n", "\n", "print('Setup Complete')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Python: 3.7.6\n", "NumPy: 1.20.3\n", "pandas: 1.3.2\n", "matplotlib: 3.4.2\n" ] } ], "source": [ "# Python / module versions used here for reference\n", "print('Python: {}'.format(platform.python_version()))\n", "print('NumPy: {}'.format(np.__version__))\n", "print('pandas: {}'.format(pd.__version__))\n", "print('matplotlib: {}'.format(mpl.__version__))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Defined 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 Dictionaries" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Defined Dictionaries\n", "\n", "## Seasons\n", "dict_seasons = {2016: '2016/2017',\n", " 2017: '2017/2018',\n", " 2018: '2018/2019',\n", " 2019: '2019/2020',\n", " 2020: '2020/2021',\n", " 2021: '2021/2022'\n", " }\n", "\n", "## Positions\n", "dict_positions_grouped = {'GK': 'Goalkeeper',\n", " 'D': 'Defender',\n", " 'M': 'Midfielder',\n", " 'W': 'Forward', # I think 'W' in the dataset is 'Winger', therefore a forward\n", " 'F': 'Forward',\n", " }" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Defined Filepaths" ] }, { "cell_type": "code", "execution_count": 5, "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_guardian = os.path.join(base_dir, 'data', 'guardian')\n", "img_dir = os.path.join(base_dir, 'img')\n", "fig_dir = os.path.join(base_dir, 'img', 'fig')\n", "video_dir = os.path.join(base_dir, 'video')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Notebook Settings" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "pd.set_option('display.max_columns', None)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "\n", "\n", "## 2. Project Brief\n", "This Jupyter notebook is part of a series of notebooks to scrape, parse, engineer, unify, and the model, culminating in a an Expected Transfer (xTransfer) player performance vs. valuation model. This model aims to determine the under- and over-performing players based on their on-the-pitch output against transfer fee and wages.\n", "\n", "This particular notebook is one of several data engineering notebooks, that cleans recorded transfer fee player data from [Guardian](https://www.theguardian.com/football/ng-interactive/2021/jun/07/mens-transfer-window-summer-2021-all-deals-from-europes-top-five-leagues) using [pandas](http://pandas.pydata.org/).\n", "\n", "This notebook, along with the other notebooks in this project workflow are shown in the following diagram:\n", "\n", "![roadmap](../../img/football_analytics_data_roadmap.png)\n", "\n", "Links to these notebooks in the [`football_analytics`](https://github.com/eddwebster/football_analytics) GitHub repository can be found at the following:\n", "* [Webscraping](https://github.com/eddwebster/football_analytics/tree/master/notebooks/1_data_scraping)\n", " + [FBref Player Stats Webscraping](https://github.com/eddwebster/football_analytics/blob/master/notebooks/1_data_scraping/FBref%20Player%20Stats%20Web%20Scraping.ipynb)\n", " + [TransferMarket Player Bio and Status Webscraping](https://github.com/eddwebster/football_analytics/blob/master/notebooks/1_data_scraping/TransferMarkt%20Player%20Bio%20and%20Status%20Web%20Scraping.ipynb)\n", " + [TransferMarket Player Valuation Webscraping](https://github.com/eddwebster/football_analytics/blob/master/notebooks/1_data_scraping/TransferMarkt%20Player%20Valuation%20Web%20Scraping.ipynb)\n", " + [TransferMarkt Player Recorded Transfer Fees Webscraping](https://github.com/eddwebster/football_analytics/blob/master/notebooks/1_data_scraping/TransferMarkt%20Player%20Recorded%20Transfer%20Fees%20Webscraping.ipynb)\n", " + [Capology Player Salary Webscraping](https://github.com/eddwebster/football_analytics/blob/master/notebooks/1_data_scraping/Capology%20Player%20Salary%20Web%20Scraping.ipynb)\n", " + [FBref Team Stats Webscraping](https://github.com/eddwebster/football_analytics/blob/master/notebooks/1_data_scraping/FBref%20Team%20Stats%20Web%20Scraping.ipynb)\n", "* [Data Parsing](https://github.com/eddwebster/football_analytics/tree/master/notebooks/2_data_parsing)\n", " + [ELO Team Ratings Data Parsing](https://github.com/eddwebster/football_analytics/blob/master/notebooks/2_data_parsing/ELO%20Team%20Ratings%20Data%20Parsing.ipynb)\n", "* [Data Engineering](https://github.com/eddwebster/football_analytics/tree/master/notebooks/3_data_engineering)\n", " + [FBref Player Stats Data Engineering](https://github.com/eddwebster/football_analytics/blob/master/notebooks/3_data_engineering/FBref%20Player%20Stats%20Data%20Engineering.ipynb)\n", " + [TransferMarket Player Bio and Status Data Engineering](https://github.com/eddwebster/football_analytics/blob/master/notebooks/3_data_engineering/TransferMarkt%20Player%20Bio%20and%20Status%20Data%20Engineering.ipynb)\n", " + [TransferMarket Player Valuation Data Engineering](https://github.com/eddwebster/football_analytics/blob/master/notebooks/3_data_engineering/TransferMarkt%20Player%20Valuation%20Data%20Engineering.ipynb)\n", " + [TransferMarkt Player Recorded Transfer Fees Data Engineering](https://github.com/eddwebster/football_analytics/blob/master/notebooks/3_data_engineering/TransferMarkt%20Player%20Recorded%20Transfer%20Fees%20Data%20Engineering.ipynb)\n", " + [Guardian Player Recorded Transfer Fees Data Engineering](https://github.com/eddwebster/football_analytics/blob/master/notebooks/3_data_engineering/Guardian%20Player%20Recorded%20Transfer%20Fees%20Data%20Engineering.ipynb)\n", " + [Capology Player Salary Data Engineering](https://github.com/eddwebster/football_analytics/blob/master/notebooks/3_data_engineering/Capology%20Player%20Salary%20Data%20Engineering.ipynb)\n", " + [FBref Team Stats Data Engineering](https://github.com/eddwebster/football_analytics/blob/master/notebooks/3_data_engineering/FBref%20Team%20Stats%20Data%20Engineering.ipynb)\n", " + [ELO Team Ratings Data Parsing](https://github.com/eddwebster/football_analytics/blob/master/notebooks/3_data_engineering/ELO%20Team%20Ratings%20Data%20Parsing.ipynb)\n", " + [TransferMarkt Team Recorded Transfer Fee Data Engineering](https://github.com/eddwebster/football_analytics/blob/master/notebooks/3_data_engineering/TransferMarkt%20Team%20Recorded%20Transfer%20Fee%20Data%20Engineering.ipynb) (aggregated from [TransferMarkt Player Recorded Transfer Fees notebook](https://github.com/eddwebster/football_analytics/blob/master/notebooks/3_data_engineering/TransferMarkt%20Player%20Recorded%20Transfer%20Fees%20Data%20Engineering.ipynb))\n", " + [Capology Team Salary Data Engineering](https://github.com/eddwebster/football_analytics/blob/master/notebooks/3_data_engineering/Capology%20Team%20Salary%20Data%20Engineering.ipynb) (aggregated from [Capology Player Salary notebook](https://github.com/eddwebster/football_analytics/blob/master/notebooks/3_data_engineering/Capology%20Player%20Salary%20Data%20Engineering.ipynb))\n", "* [Data Unification](https://github.com/eddwebster/football_analytics/tree/master/notebooks/4_data_unification)\n", " + [Golden ID for Player Level Datasets](https://github.com/eddwebster/football_analytics/blob/master/notebooks/4_data_unification/Golden%20ID%20for%20Player%20Level%20Datasets.ipynb)\n", " + [Golden ID for Team Level Datasets](https://github.com/eddwebster/football_analytics/blob/master/notebooks/4_data_unification/Golden%20ID%20for%20Team%20Level%20Datasets.ipynb)\n", "* [Production Datasets](https://github.com/eddwebster/football_analytics/tree/master/notebooks/5_production_datasets)\n", " + [Player Performance/Market Value Dataset](https://github.com/eddwebster/football_analytics/tree/master/notebooks/5_production_datasets/Player%20Performance/Market%20Value%20Dataset.ipynb)\n", " + [Team Performance/Market Value Dataset](https://github.com/eddwebster/football_analytics/tree/master/notebooks/5_production_datasets/Team%20Performance/Market%20Value%20Dataset.ipynb)\n", "* [Expected Transfer (xTransfer) Modeling](https://github.com/eddwebster/football_analytics/tree/master/notebooks/6_data_analysis_and_projects/expected_transfer_modeling)\n", " + [Expected Transfer (xTransfer) Modeling](https://github.com/eddwebster/football_analytics/tree/master/notebooks/6_data_analysis_and_projects/expected_transfer_modeling/Expected%20Transfer%20%20Modeling.ipynb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "\n", "\n", "## 3. Data Sources" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "### 3.1. Introduction\n", "Before conducting our EDA, 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).\n", "\n", "We'll be using the [pandas](http://pandas.pydata.org/) library to import our data to this workbook as a DataFrame." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.2. Data Dictionaries\n", "The [Guardian](https://www.theguardian.com/football/ng-interactive/2021/jun/07/mens-transfer-window-summer-2021-all-deals-from-europes-top-five-leagues) dataset has six features (columns) with the following definitions and data types:\n", "\n", "| Feature | Data type |\n", "|------|-----|\n", "| `position_number` | object |\n", "| `position_description` | object |\n", "| `name` | object |\n", "| `dob` | object |\n", "| `nationality` | object |\n", "| `value` | object |" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "### 3.3. Read in Data" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "## Filename\n", "file_name = 'guardian_transfer_data'" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# Import DataFrame as a CSV file\n", "df_guardian_transfers_all_raw = pd.read_csv(data_dir_guardian + f'/raw/' + f'{file_name}_latest.csv')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.3. Preliminary 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": 9, "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", "
transfer_idtransfer_yearwindow_daywindow_opentimestampplayer_nametransfer_statustransfer_typeprimary_player_positionprice_in_poundsprevious_clubnew_clubprevious_leaguenew_leaguebig_dealflow_id
012021482021-06-092021-07-27Zito Luvumbodone dealloanWNaNCagliariComoSerie ASerie CNaN100
122021482021-06-092021-07-27David Juncàdone dealfreeDNaNCelta VigoGironaLa LigaSpanish SegundaNaN241
212021482021-06-092021-07-27Giuseppe Pezzelladone dealloanDNaNParmaAtalantaSerie BSerie ANaN106
312021482021-06-092021-07-27Pablo Rosariodone dealfeeM5130000.0PSV EindhovenNiceEredivisieLigue 1Yes8
412021482021-06-092021-07-27Martín Calderóndone dealundisclosedMNaNReal MadridCádizLa LigaLa LigaNaN265
\n", "
" ], "text/plain": [ " transfer_id transfer_year window_day window_open timestamp \\\n", "0 1 2021 48 2021-06-09 2021-07-27 \n", "1 2 2021 48 2021-06-09 2021-07-27 \n", "2 1 2021 48 2021-06-09 2021-07-27 \n", "3 1 2021 48 2021-06-09 2021-07-27 \n", "4 1 2021 48 2021-06-09 2021-07-27 \n", "\n", " player_name transfer_status transfer_type primary_player_position \\\n", "0 Zito Luvumbo done deal loan W \n", "1 David Juncà done deal free D \n", "2 Giuseppe Pezzella done deal loan D \n", "3 Pablo Rosario done deal fee M \n", "4 Martín Calderón done deal undisclosed M \n", "\n", " price_in_pounds previous_club new_club previous_league new_league \\\n", "0 NaN Cagliari Como Serie A Serie C \n", "1 NaN Celta Vigo Girona La Liga Spanish Segunda \n", "2 NaN Parma Atalanta Serie B Serie A \n", "3 5130000.0 PSV Eindhoven Nice Eredivisie Ligue 1 \n", "4 NaN Real Madrid Cádiz La Liga La Liga \n", "\n", " big_deal flow_id \n", "0 NaN 100 \n", "1 NaN 241 \n", "2 NaN 106 \n", "3 Yes 8 \n", "4 NaN 265 " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Display the first 5 rows of the raw DataFrame, df_guardian_transfers_all_raw\n", "df_guardian_transfers_all_raw.head()" ] }, { "cell_type": "code", "execution_count": 10, "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", "
transfer_idtransfer_yearwindow_daywindow_opentimestampplayer_nametransfer_statustransfer_typeprimary_player_positionprice_in_poundsprevious_clubnew_clubprevious_leaguenew_leaguebig_dealflow_id
721412017-382017-07-012017-05-24Joey Bartondone dealreleasedNaN0.0BurnleyFree agentPremier LeagueFree agentNo2
721512017-382017-07-012017-05-24Matthias Ostrzolekdone dealfeeNaN0.0HamburgHannover 961. Bundesliga1. BundesligaNo1
721612017-382017-07-012017-05-24Benoît Trémoulinasdone dealreleasedNaN0.0SevillaFree agentLa LigaFree agentNo1
721712017-382017-07-012017-05-24Youri Tielemansdone dealfeeNaN21600000.0AnderlechtMonacoBelgian Jupiler Pro LeagueLigue 1Yes1
721812017-392017-07-012017-05-23Juan Cuadradodone dealfeeNaN17330000.0ChelseaJuventusPremier LeagueSerie AYes1
\n", "
" ], "text/plain": [ " transfer_id transfer_year window_day window_open timestamp \\\n", "7214 1 2017 -38 2017-07-01 2017-05-24 \n", "7215 1 2017 -38 2017-07-01 2017-05-24 \n", "7216 1 2017 -38 2017-07-01 2017-05-24 \n", "7217 1 2017 -38 2017-07-01 2017-05-24 \n", "7218 1 2017 -39 2017-07-01 2017-05-23 \n", "\n", " player_name transfer_status transfer_type \\\n", "7214 Joey Barton done deal released \n", "7215 Matthias Ostrzolek done deal fee \n", "7216 Benoît Trémoulinas done deal released \n", "7217 Youri Tielemans done deal fee \n", "7218 Juan Cuadrado done deal fee \n", "\n", " primary_player_position price_in_pounds previous_club new_club \\\n", "7214 NaN 0.0 Burnley Free agent \n", "7215 NaN 0.0 Hamburg Hannover 96 \n", "7216 NaN 0.0 Sevilla Free agent \n", "7217 NaN 21600000.0 Anderlecht Monaco \n", "7218 NaN 17330000.0 Chelsea Juventus \n", "\n", " previous_league new_league big_deal flow_id \n", "7214 Premier League Free agent No 2 \n", "7215 1. Bundesliga 1. Bundesliga No 1 \n", "7216 La Liga Free agent No 1 \n", "7217 Belgian Jupiler Pro League Ligue 1 Yes 1 \n", "7218 Premier League Serie A Yes 1 " ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Display the last five rows of the raw DataFrame, df_guardian_transfers_all_raw\n", "df_guardian_transfers_all_raw.tail()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(7219, 16)\n" ] } ], "source": [ "# Print the shape of the raw DataFrame, df_guardian_transfers_all_raw\n", "print(df_guardian_transfers_all_raw.shape)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Index(['transfer_id', 'transfer_year', 'window_day', 'window_open',\n", " 'timestamp', 'player_name', 'transfer_status', 'transfer_type',\n", " 'primary_player_position', 'price_in_pounds', 'previous_club',\n", " 'new_club', 'previous_league', 'new_league', 'big_deal', 'flow_id'],\n", " dtype='object')\n" ] } ], "source": [ "# Print the column names of the raw DataFrame, df_guardian_transfers_all_raw\n", "print(df_guardian_transfers_all_raw.columns)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The dataset has twelve features (columns)." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "transfer_id int64\n", "transfer_year int64\n", "window_day int64\n", "window_open object\n", "timestamp object\n", "player_name object\n", "transfer_status object\n", "transfer_type object\n", "primary_player_position object\n", "price_in_pounds float64\n", "previous_club object\n", "new_club object\n", "previous_league object\n", "new_league object\n", "big_deal object\n", "flow_id int64\n", "dtype: object" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Data types of the features of the raw DataFrame, df_guardian_transfers_all_raw\n", "df_guardian_transfers_all_raw.dtypes" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 7219 entries, 0 to 7218\n", "Data columns (total 16 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 transfer_id 7219 non-null int64 \n", " 1 transfer_year 7219 non-null int64 \n", " 2 window_day 7219 non-null int64 \n", " 3 window_open 7219 non-null object \n", " 4 timestamp 7219 non-null object \n", " 5 player_name 7219 non-null object \n", " 6 transfer_status 7216 non-null object \n", " 7 transfer_type 7219 non-null object \n", " 8 primary_player_position 5614 non-null object \n", " 9 price_in_pounds 2077 non-null float64\n", " 10 previous_club 7219 non-null object \n", " 11 new_club 7219 non-null object \n", " 12 previous_league 7216 non-null object \n", " 13 new_league 7217 non-null object \n", " 14 big_deal 2193 non-null object \n", " 15 flow_id 7219 non-null int64 \n", "dtypes: float64(1), int64(4), object(11)\n", "memory usage: 902.5+ KB\n" ] } ], "source": [ "# Info for the raw DataFrame, df_guardian_transfers_all_raw\n", "df_guardian_transfers_all_raw.info()" ] }, { "cell_type": "code", "execution_count": 15, "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", "
transfer_idtransfer_yearwindow_dayprice_in_poundsflow_id
count7219.0000007219.0000007219.0000002.077000e+037219.000000
mean1.0335232018.75869245.5766738.547637e+0665.337443
std0.1838171.28775233.3194951.270805e+0783.022501
min1.0000002017.000000-47.0000000.000000e+001.000000
25%1.0000002018.00000021.0000001.800000e+067.000000
50%1.0000002019.00000045.0000004.400000e+0628.000000
75%1.0000002020.00000068.0000001.052000e+0795.000000
max3.0000002021.000000216.0000001.980000e+08425.000000
\n", "
" ], "text/plain": [ " transfer_id transfer_year window_day price_in_pounds flow_id\n", "count 7219.000000 7219.000000 7219.000000 2.077000e+03 7219.000000\n", "mean 1.033523 2018.758692 45.576673 8.547637e+06 65.337443\n", "std 0.183817 1.287752 33.319495 1.270805e+07 83.022501\n", "min 1.000000 2017.000000 -47.000000 0.000000e+00 1.000000\n", "25% 1.000000 2018.000000 21.000000 1.800000e+06 7.000000\n", "50% 1.000000 2019.000000 45.000000 4.400000e+06 28.000000\n", "75% 1.000000 2020.000000 68.000000 1.052000e+07 95.000000\n", "max 3.000000 2021.000000 216.000000 1.980000e+08 425.000000" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Description of the raw DataFrame, df_guardian_transfers_all_raw, showing some summary statistics for each numberical column in the DataFrame\n", "df_guardian_transfers_all_raw.describe()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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orq6Olq1ahW33XZbfsqqyZMnx1/+8pe45ZZb4qSTTorzzjtvieOd55fO4r46c+bMOO200+Lzzz+PTz75JA466KDo1atXDB48OB599NH42c9+Fg888EAsWLAgPvvss+jVq1c0b948brzxxvwHUYMGDYoNN9wwDjjggIzf1Yph8Yd4H374YTz22GPx8MMPx5prrhktW7aM3r17R/PmzePqq6+OkSNHxu233x4bbrhh/tjFPzfnmtq5/vrr44477oj/+Z//iUMPPTS6dOkSY8eOjV69esXRRx8dxx9//BL7W1ewdvT5bOnvy68f6td+pynMvHnzomvXrrHxxhvHhRdeGM2bN4/x48fH0UcfHSeffHKccsop3zlGf4elo7hWD82dOzc++uijuPnmm6N79+7xy1/+MiIi7rzzzhg8eHDsuOOOceaZZ0bTpk2jqqoq3n777dhss83iyCOPdDdILWn74lrcXnPmzInHHnssVltttfjZz34WO+20UwwfPjwuv/zy2HHHHaOysjL/i9jLL78cd9xxR+y7775x+OGH+wWtANp9+bFo0aLo2bNnzJs3L+6+++7429/+lp+q6tRTT40//OEP8fTTT8ejjz4aa6yxRv4PlZ+aW53v+mabzZgxI04//fSYOnVqTJ48OU444YTYfffdY8stt4yDDz44OnXqFGeeeeZ3jvu+7/lprq3Z0fbFlVJaYprks846K7766qs46KCD4sMPP4x77rknDjvssLjsssvyx0yZMiWGDRsWN910U1x88cXx29/+Nqv4K6xvnperq6vjt7/9bay55ppx9NFHR7NmzWLWrFmx5557xqRJk2LQoEHx5JNP5qepmj59ejRq1CgefPBBo5ILsLi9vn1tnDp1ajz00EPx17/+NT755JM4/PDDo0mTJvHOO+/EYYcdFh06dIjq6ur8TSuKDEvv220+atSouOKKK2LBggUxadKk6NChQxxxxBHxxBNPxNy5c+O8886L9ddff4k1wiK+HtFw1VVX+eC1hvT5bOjv2ajN74Hf7uP+hirM3LlzY//9949JkybFuuuuG7169YoDDzwwnn322bjmmmvipptuitatW+f3//aINf0dfpriWj108cUXx8MPPxxrr712DBkyJH7+85/nH7vrrrvivvvui5122inOOOOM2GKLLZY41h+EtaPti2fxRX/WrFlx+OGH56fIaNGiRZxwwglxxBFHxO233x6DBg2KddZZJ0444YSYMWNGPP3009G0adO44447oqSkRLsvJe2encV/nKSUYsGCBfnpCAcMGBAPPvhgdOzYMe677744++yzo3v37lFSUhJ9+/aN8ePHx5AhQzJOv2L7ZtvPmTMnVltttYiIeO+99+Lxxx+Pp556KubPnx/HHXdczJw5M/7yl7/EfffdF2VlZRknrx9cW7Oj7Ytj/Pjxscoqq8Smm24aEZGfrmrcuHGx1157xR577BGzZs2Kxx57LK6++uo44ogjol+/fvnjJ02aFC+88EIceuihiplL4dvtHhHxyiuvxLnnnhvXXHNNtG3bNr990aJFMXv27Bg3blyUlJTEY489Fk2aNInmzZvHcccdZ6rlAiw+R8yaNStuvvnm+Oijj6K0tDT22WefOOSQQ/Ifqg4cODBee+21eO2112L69Omx8847x/33359x+hXbN9f6mjt3bn407KWXXhpjxoyJPn36xKWXXho/+9nPYtGiRTFq1Ki4+uqro2PHjks8z/333x9XXXVVXHbZZT54rQF9Phv6ezYWf24we/bsuPXWW+M3v/nNEiMwa3JsxNfX6s0228y6djX0fb9/P/744/Hggw9GSikmTJgQrVu3jm222SY+/PDDWHvttaNnz575v28V1mDpudWlHvh2ffSCCy6IAw88ML788st4+eWXY86cOfnHTjzxxDjuuOMil8vFFVdcER9//PESx/oQZOlo++JbsGBBLFiwIEpKSmLRokVx7bXXxsYbbxx33HFH3HfffdG8efO444474qGHHoqTTz45rrzyylhnnXXiqquuimHDhsUGG2wQf/7zn/Nzemv3mtHu2Vq0aFE0bNgwZs2aFf369Yuzzz477rrrroiIOOOMM2KTTTaJe++9N4444og45ZRTorS0NCZMmBDjxo2LrbbaKuP0K7bFH5bOmjUrrrjiijjjjDNiwIABMXny5Nhyyy3jnHPOiVtuuSVOP/30uO++++Lvf/97zJo1K/71r39FxNd/4LB0XFuzo+2Lb+LEidGzZ88YNWpUfltVVVVccsklMWTIkJg7d25ERKy++upxyCGHxIUXXhgPPvhgXH755fn9N9xwwzj88MPzBR5+2ve1e8TXhcqpU6fmp/tdfA5fuHBh3H777XHDDTfEzjvvHFdccUX06dMnTjzxxPyINYW1pdOgQYOYPXt2dOnSJV599dVYuHBhlJaWxoUXXhi/+93vYsyYMRER0bNnz+jbt29ce+21+SL+okWLMky+4lu81teRRx4Z1157bYwcOTIivr6hYvbs2TF69Oh47LHHolWrVtGwYcOYP39+9OvXLyZMmJB/jieffDKuuOIKH7wuBX0+G/p78S3+3GDhwoXx2muvxa233hqDBg2KyZMn/+Sx3yysDRo0KM4///z49NNP6zpyvdGgQYOYM2dOPPjggzFz5syIiNhpp51i1VVXjQ4dOsQ111wTq622WgwdOjQee+yxeP7552PKlClRUlKSb/f7778/rrzySv0daiqxQps/f37+36+++irNnj07pZTS7Nmz0wknnJDatGmThg8fnubNm7fEcTfddFM6/fTT08KFC4ueub7Q9sX15ptv5ts4pZRmzZqVHn744XT22WenRx55JL/9rbfeSj169Ej77bdfGjp0aH77Rx99lL766qu0aNGilNL//fz4cdp9+TFnzpzUqVOn1L59+3TIIYekrbfeOp177rlp9uzZ6fPPP09dunRJu+66azr33HPTJZdckjp27JgOPvjgfJsv/hlQc4vP01999VXq0KFDat++fTr66KPTtttum84888z0zjvvLLH/jBkz0v33359++9vfpj322CPNmTMni9grNNfW7Gj77Dz33HMppZTmzZuXvvjii5RSSg8//HAqLy9PZ599dvryyy/z+3711Vfp/vvvTzvssEM655xzsohbb3yz3T///POUUkrjxo1L2267bRo0aFB+v8X/b4waNSq1atUqvffee/r7MnLDDTekTp06pQ8++CDfpv369UvbbrttevXVV9NXX32VUvq/32GmTJmS38/PYOl9+3fBa6+9NnXp0iXttttu6aabbkrz5s1Lw4cPT8cee2x66aWX0oIFC9K4cePS2Wefnbp06bJEm3/11Vdp+PDhxX4LKzx9vnj092x88++nY489NvXo0SOVlZWlsrKydNFFF6WpU6f+4LHf/Jnde++9qaysbInPFvhxi9v+qquuSjvuuGM69NBD02uvvZZSSunll19OrVq1Si+99FJKKaV//vOfaf/9909lZWXp8ssvzx+/+HOFBx98MJs3ASsgxbUV2IIFC1JKKc2cOTNVVFSkTp06pTPPPDN/0Z8zZ0467rjj0i677PK9H4YsvnD5JW3pafvimjJlStp7773Tbbfdlt/297//Pf9L2jeLPCml9M4776QePXqk/fffP919993feT7tXjPaPXuLzzUppfTee++lk046KX3wwQdp+vTp6Zlnnknbb799Ou+889Ls2bNTdXV1uvbaa9NJJ52Uunfvnq655pr8B4LffB6WTnV1dTrxxBPT8ccfnz799NOUUkoDBgxIZWVl6eyzz07jx49fYv8FCxakyZMnp06dOuX/P1DYrBnX1uxo+2x8s72qq6tTjx490vHHH58+++yzlFJKQ4YMSdtuu23q169f/gPXlL7+wOr2229Pxx57rDYvwPe1e7du3dKECRNSSildcMEFaeedd05PP/30Esc99dRTqWPHjmnKlClFzVuffPv3kd/97nfptNNOy3//+OOPp1atWqVBgwalZ599Ng0ZMiSl9N3rqH6/9Bb/Trhw4cI0a9as/Hn8008/Tbfcckvafvvt06mnnppuuumm1KtXr/SHP/xhiXP94p/BggUL3Cy3FPT5bOjv2Zo3b1468sgj07HHHpuqqqrSSy+9lAYOHJi23377dP75539vge3bhbWtt946PfDAA8WMvcL69nmmuro6Pf/88+nEE09M2267bbryyivTu+++m4YMGZIOO+yw9P7776eUUpo2bVq64447vtPHJ0+eXLTsUB+YFnIFlf7/adVmzpwZnTt3jvfeey/Kysrirbfeij/+8Y/x9NNPR5MmTeLWW2+NsrKy6NevXzz//PMxb968/HMsnp7NQrhLR9sX31prrRXXX399nHzyyTFv3ryYO3dudOjQISorKyMi4rHHHot33nknv3/Lli2jV69e0bJly7jlllvimWeeWeL5tHvNaPdsLZ4vfe7cufGPf/wjnnjiiWjYsGFsscUW0bRp0/y0Ds8880z06dMnFi5cGOeff37ccccd8ec//zl69+6dnyLM9Gw1884778Qrr7yyxFSOn3/+eUybNi2OP/74aN68eX7KsPbt28c//vGPuOGGG2L8+PH5/Rs0aBDNmjWLVVZZJT744IOICItv14Bra3a0fXbS/z8N59y5c2PcuHGx+eabx6effhrXXnttfPbZZ3HMMcfERRddFA8++GBcf/31+el91lhjjejatWvce++9UVpaarqwpfR97T5x4sT4wx/+EFOmTIlTTz01tt9+++jXr1/cc8898f7778fIkSNj6NCh0bx581hnnXUyfgcrpsW/18yZMydeffXViIho0qRJTJs2LSIinnnmmTj//PPjrLPOim7dusX7778fN998c/7xb3KuWTqLpy2dOXNmVFRURLdu3aJjx45xzjnnxH//+9/o2bNnPProo9G4ceP4f//v/8Xw4cPjnnvuieeffz7/HIunhm/QoIEpUGtIn8+G/l5cr7/+eowePXqJqcU/+OCDmDJlSpxwwgmx5557Rrt27aJHjx7xhz/8If72t7/F9ddfv8QUkYsWLbLWV4EW/60/d+7cGD58eNx///0xfPjw2GWXXeLOO++Miy66KMaOHRs9evSIl19+OdZff/0YMWJEzJs3L9Zee+046aST8p8ZLP4Zrrfeehm/K1jBZFPTY1mYP39+Ouuss9KJJ56YPvnkk5RSSoMGDUq77LJLOuSQQ9ITTzyRUvr6buMTTjghlZWVpdGjR2cZud7Q9sXzzTuYZs+enY4++ui0xx57pJkzZ6aUUnr00UdTWVlZ6tWrV3rvvfeWOHbcuHHp+uuvN2qnANo9W4vbf+bMmWn//fdPbdu2TWVlZWn33XdPY8aMWWLfp59+Ou2www6pd+/e+enEWHrV1dWpc+fOqW3btmn06NH5/vvmm2+msrKy9M9//jOl9PWotb333juNHz8+/fWvf01lZWXpggsuyJ/3U0rptddeS/vss0/q2bNnqq6uNnKthlxbs6Pti2/xOWbOnDlpr732ShdccEFKKaWBAwemffbZJ5111ln50bKDBw9O2267bbrsssuWGMGWkpGxS+vH2n3vvfdOFRUVadq0aen9999PF1xwQdp2223Tdtttl/bcc890zDHHpOrq6pSSUSRL65vtvvfee6ezzjorpZTS7bffnlq3bp369u2bWrVqlW677bZ821555ZWpS5cu+vgyMnv27HTggQemI488Mv3pT39K1157berWrdsSv+NMnz49jRw5Mp1zzjmprKwsnXrqqRmnXnHp89nS34tj3rx56ZBDDkk33XTTEttfe+21VFZWlp9++Zt9+s9//nMqKytLV199dZo6dWpatGhR/nEj1pbON6fgPPjgg1OHDh3SjjvumHbYYYe0//77p+effz6llNL48ePTkCFD0i677JLKysrSzjvvnCZOnJhldKhX3IKxgll891NExLx582LChAlx6KGHxiabbBLTpk2Ljz76KLbbbruYMmVKDBw4MBo3bhz7779/DBw4MK6//vrYaaedMn4HKy5tn43FdzAtWLAgjjzyyFhllVWiefPm8Zvf/CaGDBkShx56aCxatCguuuiiiPh6Aehf/OIXERGx9dZbx9Zbbx0RS/78+GnaPRsLFy6MlFI0bNgwFi1aFNdee21ssskmccEFF8SXX34Zl112Wdx2221xzjnnxJZbbhkREQceeGBERPTq1Ss233zz6NGjR5ZvYYXVqFGj+OMf/xinn3569OnTJy6//PJo3bp1/OIXv4ju3bvHZpttFi+++GL8+c9/jj/96U/RokWLmD59ekREPPHEE7FgwYLo2LFjlJSUxLRp06Jly5ZRUVERjRo1yvaNLedcW7Oj7bPVoEGDmDdvXowaNSq22mqrOOaYYyIiokePHpFSikceeSSuu+66OP/88+M3v/lNlJSUxGWXXRabbLJJnHTSSfnnMTJ26fxUuz/00ENx+eWXx8UXXxxXX311dOvWLSZMmBDrrbdelJeXR2lpaSxYsMBIhqX0zXbfcssto3v37hER0b179xg5cmQMGzYsDj300OjWrVuUlpbGhx9+GLlcLsrKyvTxWkopRUlJSTz22GNRUlISV111Vf539ltvvTVGjRoV8+bNi2nTpsU666wTbdu2jbZt28a+++4b++23X8bpV1z6fDb09+Jq3Lhx3HvvvbHWWmvF3Llz4913341WrVrFRhttFFtssUVUVVXFDjvsEM2aNcsfs8MOO0RExKBBg2LBggXRp0+f/PfXXXedEWs1sPh3+NLS0pg/f35UVFTEWmutFVdccUWsv/768dlnn8V1110XvXv3juuvvz5+9atfRYsWLWKPPfaIgQMHxqRJk2L99dfP+m1A/ZFpaY+lsvjup9mzZ6e33347/fe//02tW7fOr3t08803p1133TV9/PHH6T//+U8qKytLHTp0SNdee+0Sz2PO6KWn7ZcPl1xySdpjjz3Sn//853TggQemQw45JD+S6uGHH05lZWXp3HPPTW+99VbGSesX7V73/vOf/6RJkyblv581a1a65557Uq9evdJjjz2W3/7CCy+k7bbbLvXs2TO9++67SzzHSy+95ByzDEycODF17NgxdejQIb388ssppZQfKXLhhRemU045JaX09XXh73//e+rZs2caN27cd0YxzJo1q7jBV0CurdnR9suH008/Pd+206ZNW+KxW265Je2zzz6poqIivwbb8OHDtfky8FPtvngE2+I12L7JqPzC/VC7T58+PZ1wwgmpTZs26Xe/+13q1atX6tixYzr44IPz/d1IntobMGBAat++fZo+fXpK6euZD8rKytI999yTRo0alc4+++zvnQHBOadw+nx29PfiO/PMM9NOO+2U/v3vf6eUUqqsrEytWrVKQ4cOXaL/V1VVpe7du6e77747lZWVpWeffTbNmDEjtW/fPv3lL3/JKv4K4Z133sn328V9dcKECemggw5Kf/3rX5fYd+bMmemoo45KBx100BJ/p86ZM2eJNQWB2jNx8wpg0aJFS6y9c8ghh8Stt94aa665Zpx55pnRokWLyOVycdNNN0W/fv1i0003jZ///OfRrFmzaNasWbz11ltLrMXgTsua0/bZWbBgQUTEEnN3H3zwwbHFFlvE/Pnz4/jjj4/p06fHscceG7NmzYrOnTvHNddcE08++WQ8++yzWcVe4Wn34psxY0b07t07Hnjggfy2N954I6666qp4+umnY8aMGfntu+22W/zpT3+K559/PiorK5dY66tdu3b5+dJZOt/s7xtttFHcfvvt0ahRo+jTp0+MHj06VllllYj4eoTIpEmTYty4cTFhwoS49957Y9GiRbH11ltHaWlpfuRhRMRqq62WyXtZEbi2ZkfbL1969+4dbdq0iY8//jiee+65qK6uzj/Ws2fP6Ny5c4wdOzYuuuiimDp1auy3337O88vAT7V7ly5dYuzYsdG3b98l1oSJCKPxa+GH2r1p06Zx1113Rbdu3aJx48Yxd+7c2GeffeLhhx/O93cjeZbON3+vWbyObGlpaVRXV0fTpk3jmWeeiV69esXZZ58dxx13XEycODGee+65mDp16neey3m+cPp8cejv2fhmu0dEnHfeebHpppvGhRdeGGPGjImzzjorDj300Ojfv3/ceOON8c9//jOeffbZuOmmm2KVVVaJAw44IJo3bx6ffPJJrLXWWvHAAw/EUUcdldG7Wf69/fbbccIJJ8Rhhx0WX3zxRb6vTp8+PSZMmJCfLSWlFCmlWH311ePcc8+NCRMmxBNPPBERX/8d0KRJk/xayX6ngWUkq6oeP23KlClLfD937tx0//33p+7du6ePP/44LVq0KH8Hwu23354OP/zwlNLX8x6PHDkyHXnkkenFF1/M35VgbYCa0/bLh5kzZ6b+/fvn54pOKaW+ffumQw89NE2ZMiX99a9/Tbvttls67LDD8iOpqqqq3HFWS9q9eKZOnZpSSvl16+bMmZO/G23kyJFpm222SYcddljK5XJLHPfiiy+m8vLy1LVr1/Txxx8XN3Q98+07hBefrydOnJgOOuig1KFDhzRq1KiUUkqPPPJIateuXWrbtm3aY489UufOnd1hvBRcW7Oj7bP3Y+eagw8+OLVv3z69/PLL37mL+LrrrktnnnmmNi+Qds9GTdp91KhRP3nXvLvql97itl+wYEFasGBB/vtPP/007bjjjumwww5LrVq1SnfeeWf+5/Poo4+mDh06fO9oTWpGn8+G/p6NxeuPLm7Txf9OnDgxHXjggWmfffbJj2C75ZZbUqdOnVJZWVlq37596tq1a5o/f37673//mw466KD06KOPZvIeViRjx45NO+20UzrppJPSHnvskTp06JD/zOD9999PrVu3TldccUV+/8U/j48//jiVl5dbww7qmJFry6nq6uq4/fbb4+abb85vGzBgQPz+97+PWbNmxQYbbBAlJSVRWvp/P8LXX3893nzzzXj99dfj5ptvjrXWWivatWuXvyvhm/vyw7T98uPpp5+O+++/P3r27BkDBw6MuXPnxsUXXxzz5s2LG2+8MQ444IDo3bt3TJ8+PQ488MCYO3du7Lnnnu7qriXtXhzV1dX59bsWrwVwwQUXRIcOHWLixInRtm3b+NOf/hRvvfVW3HLLLfHmm2/mj911113jhhtuiJKSkmjevHlWb2GFt3DhwmjYsGHMmjUrrr/++jj99NPjsssui7/+9a+x0UYbxR133BGNGzeOPn36xKuvvhqHHXZYXH755dG9e/fo1q1bDBs2zB3GNeTamh1tn72fOtfceuutsfrqq8cll1wSr7zySv7O+4iv7wSvrKyM0tLSJUYN8tO0ezZq2u59+/Zdot3Tt0ZBRBgpuLS+2fa9e/eO4447Lq666qoYNWpUNG/ePM4666yYMmVKtGjRIo4//viYM2dOjB8/PgYPHhwtWrSITTfdNOu3sELS57OhvxfXpEmT8qO5GzVqFDNnzozrrrsuevbsGZdffnm+v995552x6qqrRu/evWPMmDHRs2fPuOeee+LJJ5+MP/3pT3H77bdHgwYN4sorr4zZs2dHmzZtMn5ny7///d//jSZNmsRtt90Wffv2jc8//zyOO+64+Pzzz+PnP/95nHjiiTF48OB48MEHI+L/1uOdMmVKbLjhhrHeeutlGR/qvZL0fVd0MlddXR1XXXVVjBw5Mjp16hRPPPFEtG7dOt5777348MMPY+jQobHlllvG/Pnzo1GjRvHWW29Fnz594o033oj11lsvNtpooxg6dGg0atQoFi1a5EOQpaDts/Pt9po9e3b06dMnXnnllZg2bVq0adMmDjjggFh11VVj2LBh8bvf/S7+53/+J4YNGxYjR46MyspKf5AUQLtn4/vONW3bto1XX3015s+fH/fcc09svPHG8dxzz8Vpp50Wu+++e5x11lmx7bbbfue5nGuWXvr/FzyfM2dOdOnSJRo0aBDNmjWLmTNnxrhx4+LYY4+Niy++OCZNmhTdu3ePefPmxTXXXBOtW7de4nkWT7HHj3NtzY62z9bSnmsWLFgQl19+ebRu3XqJc8vi56FmtHs2llW7s/QWt/3cuXPj8MMPj9LS0thggw3i3XffjXXWWSfOP//82GWXXeLee++Nm266KdZbb71YZZVVYtGiRdG4ceMYNmyY83wB9Pls6O/FNXPmzPjVr34VxxxzTPzud7+LNddcMw488MBo2LBhrL322jFz5swYO3ZsnHDCCdG7d+/4/PPPo3v37lFdXR1XXnlllJeXR6NGjWLEiBExdOjQmDFjRnz66adx++23R6tWrbJ+e8u9xx57LC6//PLo3LlzPP/88/Gzn/0sPvzww2jQoEHcf//9se6660afPn3i8ccfj2OOOSZat24dCxcujHvuuScaNmwYgwcPdr6BulT0sXLU2PTp01P37t3Tdtttl/bZZ580efLk9Nxzz6W999477bHHHunzzz9fYv8JEyakZ555Jv3tb3/LTydgmrbCaPviWzx0fd68eemDDz7Ib3vggQfSmWeemZ555pl0/vnnp6OOOip16NAhderUKf3hD3/IH2NR1sJo92z90LmmQ4cOad99902fffZZSunraTe32WabdOqpp35nikiW3jen7Hn00UdTly5d8lNzfv755+nuu+9O2267bbryyitTSv83pc+OO+6Y3nzzzcxyr+hcW7Oj7bNR6LmmdevWzjW1oN2zod2z8822f/rpp1O3bt3SRx99lFJK6YUXXkhHH310Ovjgg9NLL72UUkrpo48+Stddd10aMGBAGjJkiPN8gfT5bOjv2RgxYkRq1apVGjBgQLr33nvTUUcdlcaPH59S+uH+3qlTpyX6+4gRI1L//v3TwIED8z8zftqiRYtSv3790nbbbZf22GOPNGXKlPTCCy+k/fbbL3Xo0CFNmTIlLVy4MP35z39OO++8c9p+++3Tvvvum0488cT8FJ4+r4G6o7i2nDvmmGNS27ZtU/v27dOgQYNSSl9/yNqhQ4fUoUOH/Ich37fWi5Nn7Wj74lu4cGE68cQT069//ev83NsLFy5M3bp1S2eddVZKKaV//etf6ZRTTkllZWWprKwsvfbaa/njrXlUGO2erR8713y7wFZWVpauueaaLOPWGwsWLEhHHXVUOu6449Ipp5yyxGNz5sxJd955Z9p6663Ts88+m1L6es768847z/m9llxbs6Pts+Fckw3tng3tnp0FCxako48+OnXr1i2dffbZSzz23HPPpaOOOiodcsgh6Z///OcPHs/S0+ezob9n44UXXkitWrVKnTt3Tt27d1/iscX9vays7Dv9XSGz9vbdd9+0xx57pF/96lf5zwOef/75tO+++6YOHTqkSZMmpZS+XoPtjTfeSO+9915+7UftD3VLcW0598knn6TXX389nXrqqWnfffdNd999d0ppyQ9DFp9EnTCXLW2fjbFjx6aLLrootWrVKvXq1Su98cYbaerUqWn//fdPt99+e36/m266KZ122mnafhnR7tn5qXPNfvvtly+wjRkzRtsvQyNGjMgvrv3tkTsTJ05MHTt2TDfeeON3jvMHeeFcW7Oj7bPjXJMN7Z4N7Z6dxW1/6KGHfqftn3vuuXTMMcekzp07p6effjqjhPWTPp8N/T0bL730UiorK1vi98bFPvvss/TrX/86P9PNNy0eQZWSm3MLMX78+DRu3LjUv3//tOuuu6arr746pfR1gW3xCLZv/3+QUsoX2IC6Y3Lh5dwmm2wS2223XfTt2zd+8YtfxODBg2PQoEGx5557xsUXXxwNGzaMAw88ML788sto2LBh1nHrFW2fjVatWkW/fv3i1ltvjbfffjv69esXN9xwQxx++OExZsyY+M9//hMREaeffnr86U9/ioYNG8aCBQsyTr3i0+7Z+alzTaNGjeKggw6KqVOnxo477qjtl6G99tor7rnnnvjss8/ib3/7W8yaNSv/2EYbbRRNmjSJqVOnfuc4c9YXzrU1O9o+O8412dDu2dDu2dlrr71i0KBBMW7cuBg8eHBMnjw5/9gee+wRPXr0iFmzZsULL7yQYcr6R5/Phv6ejXbt2sU999wTH330UTz99NMxc+bM/GMbb7xxrLbaavHll19+57hGjRrlv7aW6dJr0aJFbL311tGzZ8/49a9/HU899VRcc801sfvuu0ffvn2jtLQ0/3v8N1lTEOqev5xXEM2bN49LLrkk+vfvH0OHDo2UUuyzzz7RsmXL2GKLLWKttdbKOmK9pe2Lr3HjxrH77rtHy5Yt4x//+Ec88sgj8fDDD8caa6wRW2+9deywww75fVNKPgRcRrR7tn7qXNOsWbP8vtp+2dlll13i9ttvjx49ekRJSUl07Ngx1l133XjnnXdi1qxZ8fOf/zzriPWSa2t2tH02nGuyod2zod2z07Zt27jzzjvjpJNOipKSkujatWtssMEGERGx++67x7XXXhvbbbddxinrH30+G/p7Nr7d3zt16hTrrrtujB8/Pr766qv42c9+lnXEemudddaJHj16RETEU089FSUlJdG7d+8499xz46mnnvJ7PGSgJKWUsg5BzX366adx5ZVXxpgxY2LmzJmx1VZbxYMPPhgNGjSIhQsXuvupDmn7bKSUorq6Ov74xz/G/fffHzvssEPcd999Wceq97R7dpxrsvHCCy/EySefHFtuuWVsttlmMWXKlJg/f3488MADS9xpybKlv2dH22fDuSYb2j0b2j07L774YnTv3j1OO+206Nq1a6y//vpLPO48Xzf0+Wzo79lY3N+33nrraNGiRXz22Wcxd+7ceOihh9wMWsemTJkSt956awwfPjx23333uOKKK/KP6e9QXCtscW3SpElx4IEHxhlnnBHHH3981nGK6vPPP48XXnghpkyZEieffHI0bNjQybNItH3xpZTy0wa88cYbsc0220RpaekS21n2tHu2nGuyMWrUqDj++ONjhx12iI4dO8Zxxx0XERHz58/3gUgd0t+zo+2z4VyTDe2eDe2enX/961/RvXv36Nq1a/zud7+LtddeO+tIKwV9Phv6ezYW9/eddtopunTpEoceemg0aNAgFixYoMBWx6ZOnRq///3vY8aMGTFw4ECf00BGVsji2qxZs+KEE06I1157LS688MKVrrj2bS5a2dH2xfHtgo4P/opDuy8/nGuKZ+TIkdG9e/c4+eST48QTTzS1Rgb09+xo++JxrsmGds+Gds/OP//5z7jtttti6NChPngtIn0+G/p7NqqqqmLQoEExaNCgiPC5QTHNmDEj1lxzzSgtLY1FixZZYw0ysMIV1z799NM444wz4s0334yIUFwDAJapF198MU455ZQ49thj45RTTon11lsv60hAPeRckw3tng3tnp3FN8yZgaK49Pls6O/Z0O7ZUliD7KxQ/+cNGjQoOnXqFG+99Va0bds26zgAQD202267xcCBA+ORRx7xRwpQZ5xrsqHds6Hds+MD72zo89nQ37Oh3bPlHAPZWaFGru29996x+uqrx2WXXRYffvhhXHjhhUauAQB1Yvbs2bHaaqtlHQOo55xrsqHds6HdWdno8wBQf61Qiypcdtll8atf/SoaNGgQH374YdZxAIB6zAchQDE412RDu2dDu7Oy0ecBoP5aoYpru+++e9YRAAAAAAAAWImtUMW1pbXXXntlHWGlVFlZGRERFRUVmeZY2Wj3bGj3bGj37Gj7bGj3bGj37Gj7bFRWVkZ5eXnWMVZa/n4tPueabGj3bGj37Li+ZieXy+nzGamqqso6ArXUvn37orzO6quvHk899VRRXmtZs+IhAAAAAAAARdWlS5esIxRMcQ0AAAAAAICiuvfee7OOUDDFNQAAAAAAAIpqo402yjpCwRTXAAAAAAAAKKo999wz6wgFU1wDAAAAAACgqLbaaqusIxRMcQ0AAAAAAICi+uSTT7KOUDDFNQAAAAAAAIrq7rvvzjpCwRpmHaBQnTt3js6dO2cdAwAAAAAAgJWIkWsAAAAAAABQQ4prAAAAAAAAUEMr7LSQAAArk/Ly8qiqqso6xkonl8tlHQEAAAAKNmPGjOjVq1e8//77WUepVxTXAABWALlcLioqKrKOsVKprKzMOgIAAADUyoQJExTW6oDiGgAAAAAAQD20/fbbx4gRIyIiIqX0vf99+7EDDzywKNl+//vfF+V16oI11wAAAAAAAL5HdXV1dOzYMV566aX8tpEjR0aXLl1ixx13jP333z8efPDBDBPWXElJSZSWlkaDBg2iYcOG0ahRo2jcuHE0btw4VllllWjSpEmsuuqqRctz3nnnFe21ljUj1wAAAAAAAL5l3rx5cc4558S7776b3/bhhx/GqaeeGj179owDDjggXnvttbj44otj3XXXjb333jvDtBST4hoAAAAAAMA3vPfee3HOOefkp01c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kWtZMHINAID64osvvsg6QtFYcw0AAAAAAIBaWW211bKOUDRGrgEAABARpoUEAAAK17Rp06wjFI2RawAAAAAAANRKs2bNso5QNEauAQAAEBHWXMuCNdcAAKgv3nzzzWjVqlXWMYpCcQ0AAICIMC0kAABQuA022CDrCEWjuAYAAEBEGLmWBSPXAACoL7744ousIxSN4hoAAAARYeQaAABQuPXXXz/rCEWjuAYAAEBEGLmWBSPXAACoLyZOnJh1hKIpzToAAAAAAAAAK7YWLVpkHaFojFwDAAAgIkwLCQAAFG7s2LHRpk2brGMUhZFrAAAAAAAA1Mp+++2XdYSiUVwDAAAAAACgVj799NOsIxSN4hoAAAAAAAC1ssoqq2QdoWgU1wAAAAAAAKiVqVOnZh2haBpmHQAAAIDlQy6Xi4qKiqxjrFQqKyuzjgAAAMvEBx98kHWEolFcAwAAICIiysvLo6qqKusYAADACqhFixZZRygaxTUAAAAiwsi1LBi5BgBAfbFgwYKsIxSN4hoAAAARYeQaAABQuDXWWCPrCEVTmnUAAAAAAAAAVmwlJSVZRygaI9cAAACICNNCZsG0kAAA1BeLFi3KOkLRKK4BAAAQEaaFBAAACtegQYOsIxSNaSEBAAAAAAColerq6qwjFI2RawAAAESEaSGzYFpIAADqi4ULF2YdoWgU1wAAAIgI00ICAACF+/zzz7OOUDSmhQQAAAAAAKBWNt5446wjFI3iGgAAAAAAALViWkgAAABWOtZcKz5rrgEAUF80bLjylJx+8p2WlZX95JPce++9scsuu0RExMyZM2PgwIHx7LPPxsSJE2P11VeP1q1bxxlnnBGtWrX6wedYtGhRHHnkkbHBBhvEwIEDv3efYcOGxeDBg+ODDz6IddZZJ/baa6/o2bNnbLjhhj+ZEQAAAAAAgLoxb968rCMUzU8W104//fTv3T516tQYOnRorLvuutGiRYuIiJg9e3Z07do13nrrrdhxxx1j3333jc8//zyGDx8eL774Ytx9993RunXr732+K664Il5//fXYZ599vvfxyy67LIYMGRLrrrtuHHbYYVFdXR2PP/54jBgxIu69997YYostaviWAQAAAAAAWJbWWmutrCMUzU8W184444zv3X7aaadFRMS1114b66+/fkRE3H///fHWW2/Fb3/72+jTp09+39GjR8fxxx8fl156aTz55JNLPM/cuXPjkksuiSeeeOIHM7z88ssxZMiQ2HzzzWPw4MH51zvuuOPiyCOPjEsuuSTuu+++n3orAAAAAAAA1IGPPvooP8thfVfQBJiPPPJIjBgxIjp37hy77757fvvw4cOjpKTkO3P0t2nTJtq0aRMjR46MSZMm5adxfOmll+KSSy6JTz75JHbbbbd48cUXv/f1nn766YiIOOuss/KFtYiIbbbZJg477LB44IEHYuzYsbHNNtsU8nYAAACIiPLy8qiqqso6BgAAsALacccds45QNEtdXJszZ04MGDAgVltttTj33HOXeOyoo46K/fbbL9ZYY43vHNe4ceOIiJg1a1Z+2xNPPBGzZs2KK6+8Mtq2bfuDU0J++umnERHxy1/+8juPLV4T7tVXX1VcAwAAqIVcLvedmyWpW5WVlVlHAACAZeL999+Pli1bZh2jKJa6uHbPPffEF198ET179ox11113iceOOOKI7z1m2rRp8corr8Rqq60Wm266aX774YcfHn369Ik11lgjPvnkkx98zUaNGkVERHV19Xce++qrryIi4rPPPlvatwIAAAAAAMAysHjWwpVBSUop1XTn6urq2HvvveO///1vVFVVxTrrrFOj4y688MJ45JFH4phjjolLL730e/f55JNPYp999ol99tknBg4cuMRjN998c9x0003Rq1evOPXUU/PbU0px9NFHRy6XiyOOOCKuuOKKmr4VAAAAAAAAWGqlS7Pz3/72t5g8eXIceuihNS6sDRw4MB555JHYZJNN4uyzzy4o5BFHHBFrrLFG3HLLLTF48OD48ssv47PPPou+ffvGO++8ExFfF9oAAAAAAACgLi1Vce3xxx+PiB+e/vHbbrzxxrjxxhujWbNmceutt0bTpk2XPmF8PZTw5ptvjlVXXTUuv/zyaNu2bbRv3z5GjhwZ/fr1i4iIVVddtaDnBgAAAAAAgJqq8ZprM2fOjNGjR8cmm2wS22+//Y/uu3Dhwujbt2889NBDse6668Zdd91V60Xs2rVrF8OHD4///d//jcmTJ8fmm28ee++9d7z00ksREd9Z/w0AAAAAAACWtRoX1/71r3/F/Pnzo0OHDj+6X3V1dZx55pkxYsSI2GSTTeKuu+6KLbbYorY5IyKiadOm0blz5yW2vfHGGxERseWWWy6T1wAAAAAAAIAfUuNpIXO5XERE7Lzzzj+4T0opzjnnnBgxYkS0bNkyhg4dukwKa8OHD4+2bdvG3//+9+99rHHjxtGmTZtavw4AAAAAAAD8mBoX18aNGxcR8aNTQt53330xfPjw2HzzzePee++NDTfcsPYJI2KbbbaJ6dOnx7BhwyKllN9+yy23xNtvvx1HHXVUweu5AQAAAAAAQE3VeFrICRMmRJMmTX6wYFZdXR0DBw6MiIiysrIYPHjw9+539NFHx/rrr79UITfddNPo1q1bDBo0KI4++ujYeeed45133onnn38+tt122zjrrLOW6vkAAAAAAACgEDUurk2fPj022mijH3x8/Pjx8eWXX0bE11M1Dh8+/Hv323fffZe6uBYRcf7558fGG28cDz30UNx///2x4YYbxqmnnhonn3xyrLnmmkv9fAAAAAAAALC0StI351kEAAAAAAAAflCN11wDAAAAAACAlZ3iGgAAAAAAANSQ4hoAAAAAAADUkOIaAAAAAAAA1JDiGgAAAAAAANSQ4hoAAAAAAADUkOIaAAAAAAAA1JDiGgAAAAAAANSQ4hoAAAAAAADU0P8HVNG2xULISm0AAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plot visualisation of the missing values for each feature of the raw DataFrame, df_guardian_transfers_all_raw\n", "msno.matrix(df_guardian_transfers_all_raw, figsize = (30, 7))" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "transfer_status 3\n", "primary_player_position 1605\n", "price_in_pounds 5142\n", "previous_league 3\n", "new_league 2\n", "big_deal 5026\n", "dtype: int64" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Counts of missing values\n", "null_value_stats = df_guardian_transfers_all_raw.isnull().sum(axis=0)\n", "null_value_stats[null_value_stats != 0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The visualisation shows us very quickly that there a few missing values in the ... columns." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "\n", "\n", "## 4. Data Engineering\n", "Before we answer the questions in the brief through [Exploratory Data Analysis (EDA)](#section5), we'll first need to clean and wrangle the datasets to a form that meet our needs." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.1. Assign Raw DataFrames to New Engineered DataFrames" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "# Assign Raw DataFrames to new Engineered DataFrames\n", "df_guardian_transfers_all = df_guardian_transfers_all_raw.copy()" ] }, { "cell_type": "code", "execution_count": 19, "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", "
transfer_idtransfer_yearwindow_daywindow_opentimestampplayer_nametransfer_statustransfer_typeprimary_player_positionprice_in_poundsprevious_clubnew_clubprevious_leaguenew_leaguebig_dealflow_id
012021482021-06-092021-07-27Zito Luvumbodone dealloanWNaNCagliariComoSerie ASerie CNaN100
122021482021-06-092021-07-27David Juncàdone dealfreeDNaNCelta VigoGironaLa LigaSpanish SegundaNaN241
212021482021-06-092021-07-27Giuseppe Pezzelladone dealloanDNaNParmaAtalantaSerie BSerie ANaN106
312021482021-06-092021-07-27Pablo Rosariodone dealfeeM5130000.0PSV EindhovenNiceEredivisieLigue 1Yes8
412021482021-06-092021-07-27Martín Calderóndone dealundisclosedMNaNReal MadridCádizLa LigaLa LigaNaN265
\n", "
" ], "text/plain": [ " transfer_id transfer_year window_day window_open timestamp \\\n", "0 1 2021 48 2021-06-09 2021-07-27 \n", "1 2 2021 48 2021-06-09 2021-07-27 \n", "2 1 2021 48 2021-06-09 2021-07-27 \n", "3 1 2021 48 2021-06-09 2021-07-27 \n", "4 1 2021 48 2021-06-09 2021-07-27 \n", "\n", " player_name transfer_status transfer_type primary_player_position \\\n", "0 Zito Luvumbo done deal loan W \n", "1 David Juncà done deal free D \n", "2 Giuseppe Pezzella done deal loan D \n", "3 Pablo Rosario done deal fee M \n", "4 Martín Calderón done deal undisclosed M \n", "\n", " price_in_pounds previous_club new_club previous_league new_league \\\n", "0 NaN Cagliari Como Serie A Serie C \n", "1 NaN Celta Vigo Girona La Liga Spanish Segunda \n", "2 NaN Parma Atalanta Serie B Serie A \n", "3 5130000.0 PSV Eindhoven Nice Eredivisie Ligue 1 \n", "4 NaN Real Madrid Cádiz La Liga La Liga \n", "\n", " big_deal flow_id \n", "0 NaN 100 \n", "1 NaN 241 \n", "2 NaN 106 \n", "3 Yes 8 \n", "4 NaN 265 " ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_guardian_transfers_all.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.2. String Cleaning" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Player" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "# Remove accents and create lowercase name\n", "df_guardian_transfers_all['player_name_lower'] = (df_guardian_transfers_all['player_name']\n", " .str.normalize('NFKD')\n", " .str.encode('ascii', errors='ignore')\n", " .str.decode('utf-8')\n", " .str.lower()\n", " )" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "# First Name Lower\n", "df_guardian_transfers_all['first_name_lower'] = df_guardian_transfers_all['player_name_lower'].str.rsplit(' ', 0).str[0]\n", "\n", "# Last Name Lower\n", "df_guardian_transfers_all['last_name_lower'] = df_guardian_transfers_all['player_name_lower'].str.rsplit(' ', 1).str[-1]\n", "\n", "# First Initial Lower\n", "df_guardian_transfers_all['first_initial_lower'] = df_guardian_transfers_all['player_name_lower'].astype(str).str[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Season" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "# Map season to DataFrame\n", "df_guardian_transfers_all['season'] = df_guardian_transfers_all['transfer_year'].map(dict_seasons)" ] }, { "cell_type": "code", "execution_count": 23, "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", "
transfer_idtransfer_yearwindow_daywindow_opentimestampplayer_nametransfer_statustransfer_typeprimary_player_positionprice_in_poundsprevious_clubnew_clubprevious_leaguenew_leaguebig_dealflow_idplayer_name_lowerfirst_name_lowerlast_name_lowerfirst_initial_lowerseason
012021482021-06-092021-07-27Zito Luvumbodone dealloanWNaNCagliariComoSerie ASerie CNaN100zito luvumbozitoluvumboz2021/2022
122021482021-06-092021-07-27David Juncàdone dealfreeDNaNCelta VigoGironaLa LigaSpanish SegundaNaN241david juncadavidjuncad2021/2022
212021482021-06-092021-07-27Giuseppe Pezzelladone dealloanDNaNParmaAtalantaSerie BSerie ANaN106giuseppe pezzellagiuseppepezzellag2021/2022
312021482021-06-092021-07-27Pablo Rosariodone dealfeeM5130000.0PSV EindhovenNiceEredivisieLigue 1Yes8pablo rosariopablorosariop2021/2022
412021482021-06-092021-07-27Martín Calderóndone dealundisclosedMNaNReal MadridCádizLa LigaLa LigaNaN265martin calderonmartincalderonm2021/2022
\n", "
" ], "text/plain": [ " transfer_id transfer_year window_day window_open timestamp \\\n", "0 1 2021 48 2021-06-09 2021-07-27 \n", "1 2 2021 48 2021-06-09 2021-07-27 \n", "2 1 2021 48 2021-06-09 2021-07-27 \n", "3 1 2021 48 2021-06-09 2021-07-27 \n", "4 1 2021 48 2021-06-09 2021-07-27 \n", "\n", " player_name transfer_status transfer_type primary_player_position \\\n", "0 Zito Luvumbo done deal loan W \n", "1 David Juncà done deal free D \n", "2 Giuseppe Pezzella done deal loan D \n", "3 Pablo Rosario done deal fee M \n", "4 Martín Calderón done deal undisclosed M \n", "\n", " price_in_pounds previous_club new_club previous_league new_league \\\n", "0 NaN Cagliari Como Serie A Serie C \n", "1 NaN Celta Vigo Girona La Liga Spanish Segunda \n", "2 NaN Parma Atalanta Serie B Serie A \n", "3 5130000.0 PSV Eindhoven Nice Eredivisie Ligue 1 \n", "4 NaN Real Madrid Cádiz La Liga La Liga \n", "\n", " big_deal flow_id player_name_lower first_name_lower last_name_lower \\\n", "0 NaN 100 zito luvumbo zito luvumbo \n", "1 NaN 241 david junca david junca \n", "2 NaN 106 giuseppe pezzella giuseppe pezzella \n", "3 Yes 8 pablo rosario pablo rosario \n", "4 NaN 265 martin calderon martin calderon \n", "\n", " first_initial_lower season \n", "0 z 2021/2022 \n", "1 d 2021/2022 \n", "2 g 2021/2022 \n", "3 p 2021/2022 \n", "4 m 2021/2022 " ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_guardian_transfers_all.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Position" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['W', 'D', 'M', 'F', 'GK', nan]" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lst_postions = list(df_guardian_transfers_all['primary_player_position'].unique())\n", "lst_postions" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "# Map grouped positions to DataFrame\n", "df_guardian_transfers_all['primary_player_position_grouped'] = df_guardian_transfers_all['primary_player_position'].map(dict_positions_grouped)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Goalkeeper / Outfielder" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "# Separate Goalkeeper and Outfielders\n", "df_guardian_transfers_all['outfielder_goalkeeper'] = np.where(df_guardian_transfers_all['primary_player_position_grouped'] == 'Goalkeeper', 'Goalkeeper', 'Outfielder')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.3. Filter Players in 'Big 5' European Leagues and MLS" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Serie C',\n", " 'Spanish Segunda',\n", " 'Serie A',\n", " 'Ligue 1',\n", " 'La Liga',\n", " 'Serie B',\n", " 'Qatar Stars League',\n", " 'Premier League',\n", " 'Portugal Liga NOS',\n", " 'Serie D',\n", " '3. Bundesliga',\n", " 'Scottish Premiership',\n", " 'Ligue 2',\n", " 'National',\n", " 'Swiss Challenge League',\n", " 'MLS',\n", " 'National 2',\n", " '2. Bundesliga',\n", " 'Bayern Regionaliga',\n", " '1. Bundesliga',\n", " 'Turkish Super Lig',\n", " 'League One',\n", " 'Championship',\n", " 'Segunda B',\n", " 'Danish SuperLiga',\n", " 'Russian Premier League',\n", " 'National League',\n", " 'Belgian Jupiler Pro League',\n", " 'Eredivisie',\n", " 'Saudi Professional League',\n", " 'Swiss Superleague',\n", " 'UAE Gulf League',\n", " 'J League',\n", " 'Austrian Bundesliga',\n", " 'Croatian 1.HNL',\n", " 'Free agent',\n", " 'NL South',\n", " 'Austrian Bundeliga',\n", " 'K-League',\n", " 'Greek Super League',\n", " 'Super League',\n", " 'League Two',\n", " 'Liga MX',\n", " 'Austrian 2. Liga',\n", " 'Polish Ekstraklasa',\n", " 'Dutch Kampioen Divisie',\n", " 'Fortuna Liga',\n", " 'Romanian Liga 1',\n", " 'Serbian Super Liga',\n", " nan,\n", " 'Brazilian Serie A',\n", " 'Estonian League',\n", " 'Ukrainian Premier League',\n", " 'Colombian Primera',\n", " 'Bulgarian League',\n", " 'Serbian Prva Liga',\n", " 'Scottish Championship',\n", " 'Cyprus',\n", " 'Allsvenskan',\n", " 'Czech First League',\n", " 'A-League',\n", " 'Poland 3. Liga',\n", " 'Dutch Kampioen',\n", " 'Bulgaria',\n", " 'Croatian top flight',\n", " 'Belgium',\n", " 'Greek Superleague 1',\n", " 'Superliga',\n", " 'Spal',\n", " 'Slovenian Prva Liga',\n", " 'Belgian Proximus',\n", " 'Algeria',\n", " 'Slovenian Liga',\n", " 'National League North',\n", " 'Greece Superleague',\n", " 'Pescara',\n", " 'Ereste Divisie',\n", " 'Chinese Super League',\n", " '1. HNL',\n", " 'Regionalliga',\n", " 'Belgian D2',\n", " 'Danubio',\n", " 'Eliteserien',\n", " 'Eerste Amateur',\n", " 'Slovak Fortuna Liga',\n", " 'Bulgarian Liga',\n", " 'Belgian Second Division',\n", " 'France CFA',\n", " 'Saudi League',\n", " 'Bundesliga 2.',\n", " 'Belgian Proximus League',\n", " 'Retired',\n", " 'Eerste Divisie',\n", " 'Azerbaijan League',\n", " 'Northern Premier League',\n", " 'Bourg-en-Bresse',\n", " 'Championnat National',\n", " 'Poland Ekstraklasa',\n", " 'Hungarian NB I',\n", " 'Argentina Primera Division',\n", " 'Cypriot First Division',\n", " 'Mouscron',\n", " 'Chilean Primera',\n", " 'Belgian Super League',\n", " '3.Liga',\n", " 'Norwegian Eliteserien',\n", " 'Croatia HNL Liga',\n", " 'QPR',\n", " 'National League South',\n", " 'Ecuador Liga Pro',\n", " 'Greece Super League',\n", " 'Regionalliga West',\n", " 'Portuguese Primeira Liga',\n", " 'Evo-Stik League South',\n", " 'retired',\n", " 'Portuguese Segunda Liga',\n", " 'Kazakh League',\n", " 'Regionalliga Südwest',\n", " 'Spanish Segunda B',\n", " 'Russian Premier Liga',\n", " 'Argentina Primeira',\n", " 'Slovak Super Liga',\n", " 'Qatari Stars League',\n", " 'NI Premiership',\n", " 'Cyprus First Division',\n", " 'Ecuador Serie A',\n", " 'Croatian League',\n", " 'Czech League',\n", " 'Polish 1 Liga',\n", " 'Cypriot League',\n", " 'Cercle Brugge',\n", " 'Turkish Süper Lig',\n", " 'Parva Liga',\n", " 'Belgian B Division',\n", " 'Eredivise',\n", " 'USL',\n", " 'Bostik Football League',\n", " 'Lega Pro',\n", " '2 Bundesliga',\n", " 'Kazakh Premier Liga',\n", " 'Slovakian Fortuna Liga',\n", " 'Kazakh Premier League',\n", " 'Qatari Stars Leagur',\n", " 'Israeli Premier League',\n", " 'Slovakia Fortuna Liga',\n", " 'Bulgarian First League',\n", " 'Israeli Ligat',\n", " 'League of Ireland',\n", " 'Belgian First Division',\n", " 'Southern League',\n", " 'Uruguayan Primera División',\n", " '2. Bungesliga',\n", " 'Maltese Premier League',\n", " 'Turkey Super Lig',\n", " 'Liga Pro',\n", " 'Cyprus 1. Division',\n", " 'Ecuador Primera',\n", " 'UAE Arabian Gulf League',\n", " 'Chilean Primera División',\n", " 'Austrian First League',\n", " 'Serie B',\n", " 'Brasileiro',\n", " 'Southern League Premier Division',\n", " 'Tercera División de México',\n", " 'Premier League (Israel)',\n", " 'Liga Super (Malaysia)',\n", " 'National 1',\n", " 'US Orléans',\n", " 'Belgian second division',\n", " 'Primera División (Mexico)',\n", " 'Premier League (Russia)',\n", " 'Premier League (Kazakhstan)']" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lst_leagues = list(df_guardian_transfers_all['new_league'].unique())\n", "lst_leagues" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "# Filter plays in the 'Big 5' European Leagues and MLS\n", "\n", "## Define list of countries\n", "lst_big5_mls_leagues = ['Serie A', 'Ligue 1', 'La Liga', 'Premier League', '1. Bundesliga', 'MLS']" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "df_guardian_transfers_all['previous_league_isbig5'] = np.where(df_guardian_transfers_all['previous_league'].isin(lst_big5_mls_leagues), True, False)\n", "df_guardian_transfers_all['new_league_isbig5'] = np.where(df_guardian_transfers_all['new_league'].isin(lst_big5_mls_leagues), True, False)\n", "df_guardian_transfers_all['isbig5transfer'] = np.where((df_guardian_transfers_all['previous_league_isbig5'] == True) | (df_guardian_transfers_all['new_league_isbig5'] == True), True, False)\n", "df_guardian_transfers_all = df_guardian_transfers_all[df_guardian_transfers_all['isbig5transfer'] == True]\n", "df_guardian_transfers_big5 = df_guardian_transfers_all.drop(['previous_league_isbig5', 'new_league_isbig5', 'isbig5transfer'], axis=1)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(7214, 26)" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_guardian_transfers_all.shape" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(7214, 23)" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_guardian_transfers_big5.shape" ] }, { "cell_type": "code", "execution_count": 32, "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", "
transfer_idtransfer_yearwindow_daywindow_opentimestampplayer_nametransfer_statustransfer_typeprimary_player_positionprice_in_poundsprevious_clubnew_clubprevious_leaguenew_leaguebig_dealflow_idplayer_name_lowerfirst_name_lowerlast_name_lowerfirst_initial_lowerseasonprimary_player_position_groupedoutfielder_goalkeeper
012021482021-06-092021-07-27Zito Luvumbodone dealloanWNaNCagliariComoSerie ASerie CNaN100zito luvumbozitoluvumboz2021/2022ForwardOutfielder
122021482021-06-092021-07-27David Juncàdone dealfreeDNaNCelta VigoGironaLa LigaSpanish SegundaNaN241david juncadavidjuncad2021/2022DefenderOutfielder
212021482021-06-092021-07-27Giuseppe Pezzelladone dealloanDNaNParmaAtalantaSerie BSerie ANaN106giuseppe pezzellagiuseppepezzellag2021/2022DefenderOutfielder
312021482021-06-092021-07-27Pablo Rosariodone dealfeeM5130000.0PSV EindhovenNiceEredivisieLigue 1Yes8pablo rosariopablorosariop2021/2022MidfielderOutfielder
412021482021-06-092021-07-27Martín Calderóndone dealundisclosedMNaNReal MadridCádizLa LigaLa LigaNaN265martin calderonmartincalderonm2021/2022MidfielderOutfielder
........................................................................
721412017-382017-07-012017-05-24Joey Bartondone dealreleasedNaN0.0BurnleyFree agentPremier LeagueFree agentNo2joey bartonjoeybartonj2017/2018NaNOutfielder
721512017-382017-07-012017-05-24Matthias Ostrzolekdone dealfeeNaN0.0HamburgHannover 961. Bundesliga1. BundesligaNo1matthias ostrzolekmatthiasostrzolekm2017/2018NaNOutfielder
721612017-382017-07-012017-05-24Benoît Trémoulinasdone dealreleasedNaN0.0SevillaFree agentLa LigaFree agentNo1benoit tremoulinasbenoittremoulinasb2017/2018NaNOutfielder
721712017-382017-07-012017-05-24Youri Tielemansdone dealfeeNaN21600000.0AnderlechtMonacoBelgian Jupiler Pro LeagueLigue 1Yes1youri tielemansyouritielemansy2017/2018NaNOutfielder
721812017-392017-07-012017-05-23Juan Cuadradodone dealfeeNaN17330000.0ChelseaJuventusPremier LeagueSerie AYes1juan cuadradojuancuadradoj2017/2018NaNOutfielder
\n", "

7214 rows × 23 columns

\n", "
" ], "text/plain": [ " transfer_id transfer_year window_day window_open timestamp \\\n", "0 1 2021 48 2021-06-09 2021-07-27 \n", "1 2 2021 48 2021-06-09 2021-07-27 \n", "2 1 2021 48 2021-06-09 2021-07-27 \n", "3 1 2021 48 2021-06-09 2021-07-27 \n", "4 1 2021 48 2021-06-09 2021-07-27 \n", "... ... ... ... ... ... \n", "7214 1 2017 -38 2017-07-01 2017-05-24 \n", "7215 1 2017 -38 2017-07-01 2017-05-24 \n", "7216 1 2017 -38 2017-07-01 2017-05-24 \n", "7217 1 2017 -38 2017-07-01 2017-05-24 \n", "7218 1 2017 -39 2017-07-01 2017-05-23 \n", "\n", " player_name transfer_status transfer_type \\\n", "0 Zito Luvumbo done deal loan \n", "1 David Juncà done deal free \n", "2 Giuseppe Pezzella done deal loan \n", "3 Pablo Rosario done deal fee \n", "4 Martín Calderón done deal undisclosed \n", "... ... ... ... \n", "7214 Joey Barton done deal released \n", "7215 Matthias Ostrzolek done deal fee \n", "7216 Benoît Trémoulinas done deal released \n", "7217 Youri Tielemans done deal fee \n", "7218 Juan Cuadrado done deal fee \n", "\n", " primary_player_position price_in_pounds previous_club new_club \\\n", "0 W NaN Cagliari Como \n", "1 D NaN Celta Vigo Girona \n", "2 D NaN Parma Atalanta \n", "3 M 5130000.0 PSV Eindhoven Nice \n", "4 M NaN Real Madrid Cádiz \n", "... ... ... ... ... \n", "7214 NaN 0.0 Burnley Free agent \n", "7215 NaN 0.0 Hamburg Hannover 96 \n", "7216 NaN 0.0 Sevilla Free agent \n", "7217 NaN 21600000.0 Anderlecht Monaco \n", "7218 NaN 17330000.0 Chelsea Juventus \n", "\n", " previous_league new_league big_deal flow_id \\\n", "0 Serie A Serie C NaN 100 \n", "1 La Liga Spanish Segunda NaN 241 \n", "2 Serie B Serie A NaN 106 \n", "3 Eredivisie Ligue 1 Yes 8 \n", "4 La Liga La Liga NaN 265 \n", "... ... ... ... ... \n", "7214 Premier League Free agent No 2 \n", "7215 1. Bundesliga 1. Bundesliga No 1 \n", "7216 La Liga Free agent No 1 \n", "7217 Belgian Jupiler Pro League Ligue 1 Yes 1 \n", "7218 Premier League Serie A Yes 1 \n", "\n", " player_name_lower first_name_lower last_name_lower first_initial_lower \\\n", "0 zito luvumbo zito luvumbo z \n", "1 david junca david junca d \n", "2 giuseppe pezzella giuseppe pezzella g \n", "3 pablo rosario pablo rosario p \n", "4 martin calderon martin calderon m \n", "... ... ... ... ... \n", "7214 joey barton joey barton j \n", "7215 matthias ostrzolek matthias ostrzolek m \n", "7216 benoit tremoulinas benoit tremoulinas b \n", "7217 youri tielemans youri tielemans y \n", "7218 juan cuadrado juan cuadrado j \n", "\n", " season primary_player_position_grouped outfielder_goalkeeper \n", "0 2021/2022 Forward Outfielder \n", "1 2021/2022 Defender Outfielder \n", "2 2021/2022 Defender Outfielder \n", "3 2021/2022 Midfielder Outfielder \n", "4 2021/2022 Midfielder Outfielder \n", "... ... ... ... \n", "7214 2017/2018 NaN Outfielder \n", "7215 2017/2018 NaN Outfielder \n", "7216 2017/2018 NaN Outfielder \n", "7217 2017/2018 NaN Outfielder \n", "7218 2017/2018 NaN Outfielder \n", "\n", "[7214 rows x 23 columns]" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_guardian_transfers_big5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.4. Filter for 2017/2018 Season Onwards\n", "This step is not required as the data only goes as far back as the 17/18 season." ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['2021/2022', '2020/2021', '2019/2020', '2018/2019', '2017/2018']" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lst_seasons = list(df_guardian_transfers_all['season'].unique())\n", "lst_seasons" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "lst_seasons_1718_2122 = ['2017/2018', '2018/2019', '2019/2020', '2020/2021', '2021/2022']" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "df_guardian_transfers_all_1718_2122 = df_guardian_transfers_all[df_guardian_transfers_all['season'].isin(lst_seasons_1718_2122)]\n", "df_guardian_transfers_big5_1718_2122 = df_guardian_transfers_all[df_guardian_transfers_all['season'].isin(lst_seasons_1718_2122)]" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(7214, 26)" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_guardian_transfers_all.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "\n", "\n", "## 5. Exporting the Engineered DataFrames\n", "Export the two engineered [The Guardian](https://www.theguardian.com/uk) DataFrames as CSV files." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "## Filename\n", "file_name = 'tm_player_joined_big5_mls'\n", "\n", "## Full season string\n", "full_season_string = '2016/2017 - 2021/2022'\n", "\n", "## Short season string\n", "short_season_string = '1617-2122'" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Export DataFrame as a CSV file\n", "\n", "## Export a copy to the 'archive' subfolder of the TM folder, including the date\n", "df_tm_market_value_bio_status_select.to_csv(data_dir_tm + f'/engineered/{short_season_string}/joined/archive/' + f'{file_name}_{short_season_string}_last_updated_{today}.csv', index=None, header=True)\n", "\n", "## Export another copy to the TM folder called 'latest' (can be overwritten)\n", "df_tm_market_value_bio_status_select.to_csv(data_dir_tm + f'/engineered/{short_season_string}/joined/' + f'{file_name}_{short_season_string}_latest.csv', index=None, header=True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Export DataFrame as a CSV file\n", "\n", "## All data\n", "df_guardian_transfers_all.to_csv(data_dir_tm + f'/engineered/transfers/archive/' + f'tm_player_transfers_all_last_updated_{today}.csv', index=None, header=True)\n", "df_guardian_transfers_all.to_csv(data_dir_tm + f'/engineered/transfers/' + f'tm_transfers_player_all_latest.csv', index=None, header=True)\n", "df_guardian_transfers_all.to_csv(data_dir + f'/export/' + f'tm_transfers_player_all_latest.csv', index=None, header=True)\n", "\n", "\n", "## 'Big 5' European Leagues\n", "df_transfers_big5.to_csv(data_dir_tm + f'/engineered/transfers/archive/' + f'tm_player_transfers_big5_last_updated_{today}.csv', index=None, header=True)\n", "df_transfers_big5.to_csv(data_dir_tm + f'/engineered/transfers/' + f'tm_player_transfers_big5_latest.csv', index=None, header=True)\n", "df_transfers_big5.to_csv(data_dir + f'/export/' + f'tm_player_transfers_big5_latest.csv', index=None, header=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 6. Summary\n", "This Jupyter notebook engineered scraped football data from [The Guardian](https://www.theguardian.com/uk) using [pandas](http://pandas.pydata.org/) for data manipulation through DataFrames." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 7. Next Steps\n", "The step is to use this data to..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 8. References\n", "* \n", "* \n", "* " ] }, { "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 (ipykernel)", "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": "1119px", "right": "20px", "top": "-7px", "width": "489px" }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "varInspector_section_display": "block", "window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }