{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Physical Data Engineering, Part 2\n", "##### Notebook to engineer the second of two provided datasets of physical data by [Watford F.C](https://www.watfordfc.com/), using [Python](https://www.python.org/) [pandas](http://pandas.pydata.org/).\n", "\n", "### By [Edd Webster](https://www.twitter.com/eddwebster)\n", "Notebook first written: 11/02/2022
\n", "Notebook last updated: 12/02/2022\n", "\n", "![Watford F.C.](../../img/club_badges/premier_league/watford_fc_logo_small.png)\n", "\n", "Click [here](#section4) to jump straight into the Data Engineering section and skip the [Notebook Brief](#section2) and [Data Sources](#section3) sections." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "___\n", "\n", "\n", "## Introduction\n", "This notebook engineers a second of two provided datasets of physical data by [Watford F.C](https://www.watfordfc.com/), using [pandas](http://pandas.pydata.org/) for data manipulation through DataFrames.\n", "\n", "For more information about this notebook and the author, I am available through all the following channels:\n", "* [eddwebster.com](https://www.eddwebster.com/);\n", "* edd.j.webster@gmail.com;\n", "* [@eddwebster](https://www.twitter.com/eddwebster);\n", "* [linkedin.com/in/eddwebster](https://www.linkedin.com/in/eddwebster/);\n", "* [github/eddwebster](https://github.com/eddwebster/); and\n", "* [public.tableau.com/profile/edd.webster](https://public.tableau.com/profile/edd.webster).\n", "\n", "A static version of this notebook can be found [here](https://nbviewer.org/github/eddwebster/watford/blob/main/notebooks/2_data_engineering/Physical%20Data%20Engineering%20Part%202.ipynb). This notebook has an accompanying [`watford`](https://github.com/eddwebster/watford) GitHub repository and for my full repository of football analysis, see my [`football_analysis`](https://github.com/eddwebster/football_analytics) GitHub repository." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "___\n", "\n", "## Notebook Contents\n", "1. [Notebook Dependencies](#section1)
\n", "2. [Notebook Brief](#section2)
\n", "3. [Data Sources](#section3)
\n", " 1. [Introduction](#section3.1)
\n", " 2. [Read in the Datasets](#section3.2)
\n", " 3. [Initial Data Handling](#section3.3)
\n", "4. [Data Engineering](#section4)
\n", " 1. [Prepare Training Data](#section4.1)
\n", " 2. [Split Out Unified Training Data into Individual Training Drills](#section4.2)
\n", " 3. [Engineer DataFrame to Match Tracking Data Format](#section4.3)
\n", " 4. [Calculate Speed, Distance, and Acceleration](#section4.4)
\n", " 5. [Create Physical Reports for Each Individual Training Session](#section4.5)
\n", " 6. [Create Single Physical Report for the Day of Interest](#section4.6)
\n", "5. [Summary](#section5)
\n", "6. [Next Steps](#section6)
\n", "7. [References](#section7)
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "___\n", "\n", "\n", "\n", "## 1. Notebook Dependencies\n", "\n", "This notebook was written using [Python 3](https://www.python.org/) and requires the following libraries:\n", "* [`Jupyter notebooks`](https://jupyter.org/) for this notebook environment with which this project is presented;\n", "* [`NumPy`](http://www.numpy.org/) for multidimensional array computing; and\n", "* [`pandas`](http://pandas.pydata.org/) for data analysis and manipulation.\n", "\n", "All packages used for this notebook can be obtained by downloading and installing the [Conda](https://anaconda.org/anaconda/conda) distribution, available on all platforms (Windows, Linux and Mac OSX). Step-by-step guides on how to install Anaconda can be found for Windows [here](https://medium.com/@GalarnykMichael/install-python-on-windows-anaconda-c63c7c3d1444) and Mac [here](https://medium.com/@GalarnykMichael/install-python-on-mac-anaconda-ccd9f2014072), as well as in the Anaconda documentation itself [here](https://docs.anaconda.com/anaconda/install/)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Import Libraries and Modules" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Setup Complete\n" ] } ], "source": [ "# Python ≥3.5 (ideally)\n", "import platform\n", "import sys, getopt\n", "assert sys.version_info >= (3, 5)\n", "import csv\n", "\n", "# Import Dependencies\n", "%matplotlib inline\n", "\n", "# Math Operations\n", "import numpy as np\n", "from math import pi\n", "\n", "# Datetime\n", "import datetime\n", "from datetime import date\n", "import time\n", "\n", "# Data Preprocessing\n", "import pandas as pd\n", "import pandas_profiling as pp\n", "import os\n", "import re\n", "import chardet\n", "import random\n", "from io import BytesIO\n", "from pathlib import Path\n", "\n", "# Reading Directories\n", "import glob\n", "import os\n", "\n", "# Working with JSON\n", "import json\n", "from pandas import json_normalize\n", "\n", "# Data Visualisation\n", "import matplotlib as mpl\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "import missingno as msno\n", "\n", "# Machine learning\n", "import scipy.signal as signal\n", "\n", "# Requests and downloads\n", "import tqdm\n", "import requests\n", "\n", "# Display in Jupyter\n", "from IPython.display import Image, YouTubeVideo\n", "from IPython.core.display import HTML\n", "\n", "# Ignore Warnings\n", "import warnings\n", "warnings.filterwarnings(action=\"ignore\", message=\"^internal gelsd\")\n", "\n", "# Print message\n", "print('Setup Complete')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Python: 3.7.6\n", "NumPy: 1.19.1\n", "pandas: 1.1.3\n", "matplotlib: 3.3.1\n" ] } ], "source": [ "# Python / module versions used here for reference\n", "print('Python: {}'.format(platform.python_version()))\n", "print('NumPy: {}'.format(np.__version__))\n", "print('pandas: {}'.format(pd.__version__))\n", "print('matplotlib: {}'.format(mpl.__version__))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Defined Filepaths" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Set up initial paths to subfolders\n", "base_dir = os.path.join('..', '..')\n", "data_dir = os.path.join(base_dir, 'data')\n", "data_dir_physical = os.path.join(base_dir, 'data', 'physical')\n", "scripts_dir = os.path.join(base_dir, 'scripts')\n", "models_dir = os.path.join(base_dir, 'models')\n", "img_dir = os.path.join(base_dir, 'img')\n", "fig_dir = os.path.join(base_dir, 'img', 'fig')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Notebook Settings" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Display all columns of displayed pandas DataFrames\n", "pd.set_option('display.max_columns', None)\n", "#pd.set_option('display.max_rows', None)\n", "pd.options.mode.chained_assignment = None" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "\n", "\n", "## 2. Notebook Brief\n", "This notebook parses and engineers a provided dataset of physical data using [pandas](http://pandas.pydata.org/).\n", "\n", "\n", "**Notebook Conventions**:
\n", "* Variables that refer a `DataFrame` object are prefixed with `df_`.\n", "* Variables that refer to a collection of `DataFrame` objects (e.g., a list, a set or a dict) are prefixed with `dfs_`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "\n", "\n", "## 3. Data Sources" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "### 3.1. Introduction\n", "The physical data..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "### 3.2. Import Data\n", "The `CSV` files provided will be read in as [pandas](https://pandas.pydata.org/) DataFrames." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[]\n" ] } ], "source": [ "# Read data directory\n", "print(glob.glob(os.path.join(data_dir_physical, 'raw', 'Set 2', '*')))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Unify Training data" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# Define function for unifying all the training data for a an indicated date into unified DataFrames\n", "def unify_training_data(date): \n", "\n", " \"\"\"\n", " Define a function to unify all the training data for a single data, defined in the function's parameter\n", " of the formation 'YYYY-MM-DD'\n", " \n", " For this example dataset, there is data for just '2022-02-02'\n", " \n", " # KEY STEPS\n", " # - USE GLOB TO PRODUCE SEPARATE DATAFRAMES FOR THE FOLLOWING:\n", " ## + ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY\n", " ## + CROSSING-AND-FINISHING-HSR-SPR\n", " ## + FULL-SESSION-MODIFIED\n", " ## + MATCH-MSG\n", " ## + PASSING-DRILL-PHYSICAL\n", " ## + WARM-UP-COORDINATION-AGILITY\n", " # - THESE UNIFIED DATAFRAMES NEED TO INCLUDE NEW COLUMNS FOR DATE (FILENAME) AND PLAYER NAME (FILENAME OR COLUMM)\n", " # - AT THIS STAGE, THE UNIFIED DATAFRAMES CAN BE EXPORTED AS ENGINEERED FILES, BUT UNIFIED\n", " # - NEXT, DROP ALL COLUMNS EXCEPT: Player Display Name, Time, Lat, Lon, Speed (m/s)\n", " # - DEDUPLICATE THE DATAFRAME, MANY COLUMNS REMOVED ONCE GYRO DATA IGNORED\n", " # - USE Player Display Name TO RENAME THE COLUMNS FOR Time, Lat, Lon, Speed (m/s), TO PREFIX WITH NAME\n", " # - THEN DROP Player Display Name\n", " # - USE LAURIE'S METRICA SCRIPT TO CALCULATE THE SPEED, DISTANCE, AND ACCELERATION USING THE LAT/LON AND TIMESTEP\n", " \"\"\"\n", " \n", " ## Read in exported CSV file if exists, if not, download the latest JSON data\n", " if not os.path.exists(os.path.join(data_dir_physical, 'engineered', 'Set 2', '1_unified_training_dataset', f'{date}-ALL-TRAINING-DATA-ALL-PLAYERS.csv')):\n", " \n", " ### Start timer\n", " tic = datetime.datetime.now()\n", "\n", "\n", " ### Print time reading of CSV files started\n", " print(f'Reading of CSV files started at: {tic}')\n", "\n", "\n", " ### List all files available\n", " lst_all_files = glob.glob(os.path.join(data_dir_physical, 'raw', 'Set 2', f'{date}-*.csv'))\n", "\n", "\n", " ### Create an empty list to append individual DataFrames\n", " lst_files_to_append =[]\n", "\n", "\n", " ### Iterate through each file in list of all files\n", " for file in lst_all_files:\n", "\n", " ### Create temporary DataFrame with each file\n", " df_temp = pd.read_csv(file, index_col=None, header=0)\n", "\n", " ### Create a column that contains the filename - useful for information about the date, player, and training drill\n", " df_temp['Filename'] = os.path.basename(file) \n", "\n", " ### Append each individual Define each individual file to the empty list (to be concatenated) \n", " lst_files_to_append.append(df_temp)\n", "\n", "\n", " ### Concatenate all the files\n", " df_all = pd.concat(lst_files_to_append, axis=0, ignore_index=True)\n", "\n", "\n", " ### Save DataFrame\n", "\n", " #### Define filename for each combined file to be saved\n", " save_filename = f'{date}-ALL-TRAINING-DATA-ALL-PLAYERS'.replace(' ', '-').replace('(', '').replace(')', '').replace(':', '').replace('.', '').replace('__', '_').upper()\n", "\n", " #### Define the filepath to save each combined file\n", " path = os.path.join(data_dir_physical, 'engineered', 'Set 2', '1_unified_training_dataset')\n", "\n", " #### Save the combined file as a CSV\n", " df_all.to_csv(path + f'/{save_filename}.csv', index=None, header=True)\n", "\n", "\n", " ### Engineer the data\n", "\n", " #### \n", " df_all['Date'] = date\n", "\n", " #### \n", " #df_all['Training Type'] = training_type\n", "\n", " #### Reorder Columns\n", " #df_all = df_all[['Filename'] + [col for col in df_all.columns if col != 'Filename']]\n", " #df_all = df_all[['Date'] + [col for col in df_all.columns if col != 'Date']]\n", " \n", " \n", " ### End timer\n", " toc = datetime.datetime.now()\n", " \n", " \n", " ### Print time reading of CSV files end\n", " print(f'Reading of CSV files ended at: {toc}')\n", "\n", "\n", " ### Calculate time take\n", " total_time = (toc-tic).total_seconds()\n", " print(f'Time taken create a single DataFrame for from the individual CSV files is: {total_time/60:0.2f} minutes.')\n", "\n", " \n", " \n", " ## If CSV file already exists, read in previously saved DataFrame\n", " else:\n", " \n", " ### Print time reading of CSV files started\n", " print('CSV file already saved to local storage. Reading in file as a pandas DataFrame.')\n", " \n", " ### Read in raw DataFrame\n", " df_all = pd.read_csv(os.path.join(data_dir_physical, 'engineered', 'Set 2', '1_unified_training_dataset', f'{date}-ALL-TRAINING-DATA-ALL-PLAYERS.csv'))\n", "\n", " \n", " ## Return DataFrame\n", " return df_all" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CSV file already saved to local storage. Reading in file as a pandas DataFrame.\n" ] } ], "source": [ "df_training_data_all = unify_training_data('2022-02-02')" ] }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Player Display NameTimeLatLonSpeed (m/s)Heart Rate (bpm)HaccHdopQuality of SignalNo. of SatellitesInstantaneous Acceleration ImpulseAccl XAccl YAccl ZGyro Yro XGyro YGyro ZFilename
0MASINA12:57:43.251.711186-0.2815831.202779000.4298211.0833340.1339560.9369600.79934414.00-24.08-6.652022-02-02-MASINA-MATCH-MSG.csv
1MASINA12:57:43.251.711186-0.2815831.202779000.4298211.0833340.1976400.8981640.73053610.71-31.92-4.762022-02-02-MASINA-MATCH-MSG.csv
2MASINA12:57:43.251.711186-0.2815831.202779000.4298211.0833340.2466840.9032880.6573363.85-38.080.072022-02-02-MASINA-MATCH-MSG.csv
3MASINA12:57:43.251.711186-0.2815831.202779000.4298211.0833340.2474160.8923080.632448-2.10-40.677.072022-02-02-MASINA-MATCH-MSG.csv
4MASINA12:57:43.251.711186-0.2815831.202779000.4298211.0833340.1932480.8827920.663924-4.76-39.6913.512022-02-02-MASINA-MATCH-MSG.csv
\n", "
" ], "text/plain": [ " Player Display Name Time Lat Lon Speed (m/s) \\\n", "0 MASINA 12:57:43.2 51.711186 -0.281583 1.202779 \n", "1 MASINA 12:57:43.2 51.711186 -0.281583 1.202779 \n", "2 MASINA 12:57:43.2 51.711186 -0.281583 1.202779 \n", "3 MASINA 12:57:43.2 51.711186 -0.281583 1.202779 \n", "4 MASINA 12:57:43.2 51.711186 -0.281583 1.202779 \n", "\n", " Heart Rate (bpm) Hacc Hdop Quality of Signal No. of Satellites \\\n", "0 0 0 0.4 298 21 \n", "1 0 0 0.4 298 21 \n", "2 0 0 0.4 298 21 \n", "3 0 0 0.4 298 21 \n", "4 0 0 0.4 298 21 \n", "\n", " Instantaneous Acceleration Impulse Accl X Accl Y Accl Z \\\n", "0 1.083334 0.133956 0.936960 0.799344 \n", "1 1.083334 0.197640 0.898164 0.730536 \n", "2 1.083334 0.246684 0.903288 0.657336 \n", "3 1.083334 0.247416 0.892308 0.632448 \n", "4 1.083334 0.193248 0.882792 0.663924 \n", "\n", " Gyro Yro X Gyro Y Gyro Z Filename \n", "0 14.00 -24.08 -6.65 2022-02-02-MASINA-MATCH-MSG.csv \n", "1 10.71 -31.92 -4.76 2022-02-02-MASINA-MATCH-MSG.csv \n", "2 3.85 -38.08 0.07 2022-02-02-MASINA-MATCH-MSG.csv \n", "3 -2.10 -40.67 7.07 2022-02-02-MASINA-MATCH-MSG.csv \n", "4 -4.76 -39.69 13.51 2022-02-02-MASINA-MATCH-MSG.csv " ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Display DataFrame\n", "df_training_data_all.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "### 3.3. Initial Data Handling\n", "First check the quality of the dataset by looking first and last rows in pandas using the [`head()`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.head.html) and [`tail()`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.tail.html) methods." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Player Display NameTimeLatLonSpeed (m/s)Heart Rate (bpm)HaccHdopQuality of SignalNo. of SatellitesInstantaneous Acceleration ImpulseAccl XAccl YAccl ZGyro Yro XGyro YGyro ZFilename
0MASINA12:57:43.251.711186-0.2815831.202779000.4298211.0833340.1339560.9369600.79934414.00-24.08-6.652022-02-02-MASINA-MATCH-MSG.csv
1MASINA12:57:43.251.711186-0.2815831.202779000.4298211.0833340.1976400.8981640.73053610.71-31.92-4.762022-02-02-MASINA-MATCH-MSG.csv
2MASINA12:57:43.251.711186-0.2815831.202779000.4298211.0833340.2466840.9032880.6573363.85-38.080.072022-02-02-MASINA-MATCH-MSG.csv
3MASINA12:57:43.251.711186-0.2815831.202779000.4298211.0833340.2474160.8923080.632448-2.10-40.677.072022-02-02-MASINA-MATCH-MSG.csv
4MASINA12:57:43.251.711186-0.2815831.202779000.4298211.0833340.1932480.8827920.663924-4.76-39.6913.512022-02-02-MASINA-MATCH-MSG.csv
\n", "
" ], "text/plain": [ " Player Display Name Time Lat Lon Speed (m/s) \\\n", "0 MASINA 12:57:43.2 51.711186 -0.281583 1.202779 \n", "1 MASINA 12:57:43.2 51.711186 -0.281583 1.202779 \n", "2 MASINA 12:57:43.2 51.711186 -0.281583 1.202779 \n", "3 MASINA 12:57:43.2 51.711186 -0.281583 1.202779 \n", "4 MASINA 12:57:43.2 51.711186 -0.281583 1.202779 \n", "\n", " Heart Rate (bpm) Hacc Hdop Quality of Signal No. of Satellites \\\n", "0 0 0 0.4 298 21 \n", "1 0 0 0.4 298 21 \n", "2 0 0 0.4 298 21 \n", "3 0 0 0.4 298 21 \n", "4 0 0 0.4 298 21 \n", "\n", " Instantaneous Acceleration Impulse Accl X Accl Y Accl Z \\\n", "0 1.083334 0.133956 0.936960 0.799344 \n", "1 1.083334 0.197640 0.898164 0.730536 \n", "2 1.083334 0.246684 0.903288 0.657336 \n", "3 1.083334 0.247416 0.892308 0.632448 \n", "4 1.083334 0.193248 0.882792 0.663924 \n", "\n", " Gyro Yro X Gyro Y Gyro Z Filename \n", "0 14.00 -24.08 -6.65 2022-02-02-MASINA-MATCH-MSG.csv \n", "1 10.71 -31.92 -4.76 2022-02-02-MASINA-MATCH-MSG.csv \n", "2 3.85 -38.08 0.07 2022-02-02-MASINA-MATCH-MSG.csv \n", "3 -2.10 -40.67 7.07 2022-02-02-MASINA-MATCH-MSG.csv \n", "4 -4.76 -39.69 13.51 2022-02-02-MASINA-MATCH-MSG.csv " ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Display the first five rows of the DataFrame, df_training_data_all\n", "df_training_data_all.head()" ] }, { "cell_type": "code", "execution_count": 12, "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", "
Player Display NameTimeLatLonSpeed (m/s)Heart Rate (bpm)HaccHdopQuality of SignalNo. of SatellitesInstantaneous Acceleration ImpulseAccl XAccl YAccl ZGyro Yro XGyro YGyro ZFilename
20164525KALU13:12:40.851.711182-0.2813790.0000.4335210.00.0980880.9889320.433344-4.690.847.212022-02-02-KALU-FULL-SESSION-MODIFIED.csv
20164526KALU13:12:40.851.711182-0.2813790.0000.4335210.00.1032120.9845400.4494480.701.336.792022-02-02-KALU-FULL-SESSION-MODIFIED.csv
20164527KALU13:12:40.851.711182-0.2813790.0000.4335210.00.1127280.9699000.4611603.921.126.372022-02-02-KALU-FULL-SESSION-MODIFIED.csv
20164528KALU13:12:40.851.711182-0.2813790.0000.4335210.00.1229760.9567240.4611604.200.006.442022-02-02-KALU-FULL-SESSION-MODIFIED.csv
20164529KALU13:12:40.851.711182-0.2813790.0000.4335210.00.1288320.9508680.4545721.96-1.266.162022-02-02-KALU-FULL-SESSION-MODIFIED.csv
\n", "
" ], "text/plain": [ " Player Display Name Time Lat Lon Speed (m/s) \\\n", "20164525 KALU 13:12:40.8 51.711182 -0.281379 0.0 \n", "20164526 KALU 13:12:40.8 51.711182 -0.281379 0.0 \n", "20164527 KALU 13:12:40.8 51.711182 -0.281379 0.0 \n", "20164528 KALU 13:12:40.8 51.711182 -0.281379 0.0 \n", "20164529 KALU 13:12:40.8 51.711182 -0.281379 0.0 \n", "\n", " Heart Rate (bpm) Hacc Hdop Quality of Signal No. of Satellites \\\n", "20164525 0 0 0.4 335 21 \n", "20164526 0 0 0.4 335 21 \n", "20164527 0 0 0.4 335 21 \n", "20164528 0 0 0.4 335 21 \n", "20164529 0 0 0.4 335 21 \n", "\n", " Instantaneous Acceleration Impulse Accl X Accl Y Accl Z \\\n", "20164525 0.0 0.098088 0.988932 0.433344 \n", "20164526 0.0 0.103212 0.984540 0.449448 \n", "20164527 0.0 0.112728 0.969900 0.461160 \n", "20164528 0.0 0.122976 0.956724 0.461160 \n", "20164529 0.0 0.128832 0.950868 0.454572 \n", "\n", " Gyro Yro X Gyro Y Gyro Z \\\n", "20164525 -4.69 0.84 7.21 \n", "20164526 0.70 1.33 6.79 \n", "20164527 3.92 1.12 6.37 \n", "20164528 4.20 0.00 6.44 \n", "20164529 1.96 -1.26 6.16 \n", "\n", " Filename \n", "20164525 2022-02-02-KALU-FULL-SESSION-MODIFIED.csv \n", "20164526 2022-02-02-KALU-FULL-SESSION-MODIFIED.csv \n", "20164527 2022-02-02-KALU-FULL-SESSION-MODIFIED.csv \n", "20164528 2022-02-02-KALU-FULL-SESSION-MODIFIED.csv \n", "20164529 2022-02-02-KALU-FULL-SESSION-MODIFIED.csv " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Display the last five rows of the DataFrame, df_training_data_all\n", "df_training_data_all.tail()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(20164530, 18)\n" ] } ], "source": [ "# Print the shape of the DataFrame, df_training_data_all\n", "print(df_training_data_all.shape)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Index(['Player Display Name', 'Time', 'Lat', 'Lon', 'Speed (m/s)',\n", " 'Heart Rate (bpm)', 'Hacc', 'Hdop', 'Quality of Signal',\n", " 'No. of Satellites', 'Instantaneous Acceleration Impulse', 'Accl X',\n", " 'Accl Y', 'Accl Z', 'Gyro Yro X', 'Gyro Y', 'Gyro Z', 'Filename'],\n", " dtype='object')\n" ] } ], "source": [ "# Print the column names of the DataFrame, df_training_data_all\n", "print(df_training_data_all.columns)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Player Display Name object\n", "Time object\n", "Lat float64\n", "Lon float64\n", "Speed (m/s) float64\n", "Heart Rate (bpm) int64\n", "Hacc int64\n", "Hdop float64\n", "Quality of Signal int64\n", "No. of Satellites int64\n", "Instantaneous Acceleration Impulse float64\n", "Accl X float64\n", "Accl Y float64\n", "Accl Z float64\n", "Gyro Yro X float64\n", "Gyro Y float64\n", "Gyro Z float64\n", "Filename object\n", "dtype: object" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Data types of the features of the DataFrame, df_training_data_all\n", "df_training_data_all.dtypes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Full details of these attributes and their data types is discussed further in the [Data Dictionary](section3.2.2)." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Player Display Name object\n", "Time object\n", "Lat float64\n", "Lon float64\n", "Speed (m/s) float64\n", "Heart Rate (bpm) int64\n", "Hacc int64\n", "Hdop float64\n", "Quality of Signal int64\n", "No. of Satellites int64\n", "Instantaneous Acceleration Impulse float64\n", "Accl X float64\n", "Accl Y float64\n", "Accl Z float64\n", "Gyro Yro X float64\n", "Gyro Y float64\n", "Gyro Z float64\n", "Filename object\n", "dtype: object\n" ] } ], "source": [ "# Displays all columns\n", "with pd.option_context('display.max_rows', None, 'display.max_columns', None):\n", " print(df_training_data_all.dtypes)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 20164530 entries, 0 to 20164529\n", "Data columns (total 18 columns):\n", " # Column Dtype \n", "--- ------ ----- \n", " 0 Player Display Name object \n", " 1 Time object \n", " 2 Lat float64\n", " 3 Lon float64\n", " 4 Speed (m/s) float64\n", " 5 Heart Rate (bpm) int64 \n", " 6 Hacc int64 \n", " 7 Hdop float64\n", " 8 Quality of Signal int64 \n", " 9 No. of Satellites int64 \n", " 10 Instantaneous Acceleration Impulse float64\n", " 11 Accl X float64\n", " 12 Accl Y float64\n", " 13 Accl Z float64\n", " 14 Gyro Yro X float64\n", " 15 Gyro Y float64\n", " 16 Gyro Z float64\n", " 17 Filename object \n", "dtypes: float64(11), int64(4), object(3)\n", "memory usage: 2.7+ GB\n" ] } ], "source": [ "# Info for the DataFrame, df_training_data_all\n", "df_training_data_all.info()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The memory usage is 2.7+ GB. The saved file is 4.2 GB, quite large." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "# Plot visualisation of the missing values for each feature of the raw DataFrame, df_training_data_all\n", "#msno.matrix(df_training_data_all, figsize = (30, 7))" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Series([], dtype: int64)" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Counts of missing values\n", "null_value_stats = df_training_data_all.isnull().sum(axis=0)\n", "null_value_stats[null_value_stats != 0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The dataset as expected, has no null values and is ready to be engineered." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "\n", "\n", "## 4. Data Engineering\n", "The next step is to wrangle the dataset to into a format that’s suitable for analysis and also to work with existing code to determine metrics such as speeds, distance, acceleration.\n", "\n", "This section is broken down into the following subsections:\n", "\n", "4.1. [Prepare Training Data](#section4.1)
\n", "4.2. [Split Out Unified Training Data into Individual Training Drills](#section4.2)
\n", "4.3. [Engineer DataFrame to Match Tracking Data Format](#section4.3)
\n", "4.4. [Calculate Speed, Distance, and Acceleration](#section4.4)
\n", "4.5. [Create Physical Reports for Each Individual Training Session](#section4.5)
\n", "4.6. [Create Single Physical Report for the Day of Interest](#section4.6)
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "### 4.1. Prepare Training Data" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "# Define function for unifying all the training data for a an indicated date into unified DataFrames\n", "def prepare_training_data(df, date): \n", "\n", " \"\"\"\n", " Define a function to prepare the unified training dataset'\n", " \"\"\"\n", " \n", " ## Read in exported CSV file if exists, if not, download the latest JSON data\n", " if not os.path.exists(os.path.join(data_dir_physical, 'engineered', 'Set 2', '2_prepared_training_dataset', f'{date}-ALL-MOVEMENT-TRAINING-DATA-ALL-PLAYERS.csv')):\n", " \n", " \n", " ### Start timer\n", " tic = datetime.datetime.now()\n", "\n", " \n", " ### Print time of engineering of tracking data started\n", " print(f'Engineering of the unified training data CSV file started at: {tic}')\n", " \n", " \n", " ### Select columns of interest and dedupe the DataFrame\n", " df_select = df_training_data_all[['Player Display Name', 'Time', 'Lat', 'Lon', 'Speed (m/s)', 'Filename']].drop_duplicates().reset_index(drop=True)\n", " \n", " \n", " ### Create Date column\n", " df_select['Date'] = date\n", " \n", " \n", " ### Convert Speed (m/s) to Speed (km/h)\n", " df_select['Speed (km/h)'] = df_select['Speed (m/s)'] * 18/5\n", " \n", " \n", " ### Use the Filename, Player Display Name and Date to determining the Training Drill\n", " df_select['Training Drill'] = df_select['Filename']\n", " df_select['Training Drill'] = df_select['Training Drill'].str.replace('JOAO-PEDRO', 'JOAO PEDRO') # Temporary fix for Joao Pedro bug, fix later\n", " df_select['Training Drill'] = df_select.apply(lambda x: x['Training Drill'].replace(x['Player Display Name'], ''), axis=1)\n", " df_select['Training Drill'] = df_select.apply(lambda x: x['Training Drill'].replace(x['Date'], ''), axis=1)\n", " df_select['Training Drill'] = df_select['Training Drill'].str.replace('--', '').str.replace('.csv', '')\n", " \n", " \n", " ### Convert date from string type to date type\n", " df_select['Date'] = pd.to_datetime(df_select['Date'], errors='coerce', format='%Y-%m-%d')\n", " \n", " \n", " ### Save DataFrame\n", "\n", " #### Define filename for each combined file to be saved\n", " save_filename = f'{date}-ALL-MOVEMENT-TRAINING-DATA-ALL-PLAYERS'.replace(' ', '-').replace('(', '').replace(')', '').replace(':', '').replace('.', '').replace('__', '_').upper()\n", "\n", " #### Define the filepath to save each combined file\n", " path = os.path.join(data_dir_physical, 'engineered', 'Set 2', '2_prepared_training_dataset')\n", "\n", " #### Save the combined file as a CSV\n", " df_select.to_csv(path + f'/{save_filename}.csv', index=None, header=True)\n", " \n", " \n", " ### End timer\n", " toc = datetime.datetime.now()\n", " \n", " \n", " ### Print time of engineering of tracking data ended\n", " print(f'Engineering of the unified training data CSV file ended at: {toc}')\n", "\n", "\n", " ### Calculate time take\n", " total_time = (toc-tic).total_seconds()\n", " print(f'Time taken to engineer and save unified training data is: {total_time/60:0.2f} minutes.')\n", " \n", " \n", " \n", " ## If CSV file already exists, read in previously saved DataFrame\n", " else:\n", " \n", " ### Print time reading of CSV files started\n", " print('Engineered CSV file of unified training already saved to local storage. Reading in file as a pandas DataFrame.')\n", " \n", " ### Read in raw DataFrame\n", " df_select = pd.read_csv(os.path.join(data_dir_physical, 'engineered', 'Set 2', '2_prepared_training_dataset', f'{date}-ALL-MOVEMENT-TRAINING-DATA-ALL-PLAYERS.csv'))\n", " \n", " \n", " \n", " ## Return DataFrame\n", " return df_select" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Engineered CSV file of unified training already saved to local storage. Reading in file as a pandas DataFrame.\n" ] } ], "source": [ "df_training_data_select = prepare_training_data(df_training_data_all, '2022-02-02')" ] }, { "cell_type": "code", "execution_count": 22, "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", "
Player Display NameTimeLatLonSpeed (m/s)FilenameDateSpeed (km/h)Training Drill
0MASINA12:57:43.251.711186-0.2815831.2027792022-02-02-MASINA-MATCH-MSG.csv2022-02-024.330003MATCH-MSG
1MASINA12:57:43.351.711185-0.2815821.2583342022-02-02-MASINA-MATCH-MSG.csv2022-02-024.530004MATCH-MSG
2MASINA12:57:43.451.711184-0.2815821.3055572022-02-02-MASINA-MATCH-MSG.csv2022-02-024.700004MATCH-MSG
3MASINA12:57:43.551.711183-0.2815811.1194452022-02-02-MASINA-MATCH-MSG.csv2022-02-024.030003MATCH-MSG
4MASINA12:57:43.651.711182-0.2815801.1500012022-02-02-MASINA-MATCH-MSG.csv2022-02-024.140003MATCH-MSG
..............................
2016448KALU13:12:40.451.711182-0.2813800.0000002022-02-02-KALU-FULL-SESSION-MODIFIED.csv2022-02-020.000000FULL-SESSION-MODIFIED
2016449KALU13:12:40.551.711182-0.2813800.0000002022-02-02-KALU-FULL-SESSION-MODIFIED.csv2022-02-020.000000FULL-SESSION-MODIFIED
2016450KALU13:12:40.651.711182-0.2813790.0000002022-02-02-KALU-FULL-SESSION-MODIFIED.csv2022-02-020.000000FULL-SESSION-MODIFIED
2016451KALU13:12:40.751.711182-0.2813790.0000002022-02-02-KALU-FULL-SESSION-MODIFIED.csv2022-02-020.000000FULL-SESSION-MODIFIED
2016452KALU13:12:40.851.711182-0.2813790.0000002022-02-02-KALU-FULL-SESSION-MODIFIED.csv2022-02-020.000000FULL-SESSION-MODIFIED
\n", "

2016453 rows × 9 columns

\n", "
" ], "text/plain": [ " Player Display Name Time Lat Lon Speed (m/s) \\\n", "0 MASINA 12:57:43.2 51.711186 -0.281583 1.202779 \n", "1 MASINA 12:57:43.3 51.711185 -0.281582 1.258334 \n", "2 MASINA 12:57:43.4 51.711184 -0.281582 1.305557 \n", "3 MASINA 12:57:43.5 51.711183 -0.281581 1.119445 \n", "4 MASINA 12:57:43.6 51.711182 -0.281580 1.150001 \n", "... ... ... ... ... ... \n", "2016448 KALU 13:12:40.4 51.711182 -0.281380 0.000000 \n", "2016449 KALU 13:12:40.5 51.711182 -0.281380 0.000000 \n", "2016450 KALU 13:12:40.6 51.711182 -0.281379 0.000000 \n", "2016451 KALU 13:12:40.7 51.711182 -0.281379 0.000000 \n", "2016452 KALU 13:12:40.8 51.711182 -0.281379 0.000000 \n", "\n", " Filename Date Speed (km/h) \\\n", "0 2022-02-02-MASINA-MATCH-MSG.csv 2022-02-02 4.330003 \n", "1 2022-02-02-MASINA-MATCH-MSG.csv 2022-02-02 4.530004 \n", "2 2022-02-02-MASINA-MATCH-MSG.csv 2022-02-02 4.700004 \n", "3 2022-02-02-MASINA-MATCH-MSG.csv 2022-02-02 4.030003 \n", "4 2022-02-02-MASINA-MATCH-MSG.csv 2022-02-02 4.140003 \n", "... ... ... ... \n", "2016448 2022-02-02-KALU-FULL-SESSION-MODIFIED.csv 2022-02-02 0.000000 \n", "2016449 2022-02-02-KALU-FULL-SESSION-MODIFIED.csv 2022-02-02 0.000000 \n", "2016450 2022-02-02-KALU-FULL-SESSION-MODIFIED.csv 2022-02-02 0.000000 \n", "2016451 2022-02-02-KALU-FULL-SESSION-MODIFIED.csv 2022-02-02 0.000000 \n", "2016452 2022-02-02-KALU-FULL-SESSION-MODIFIED.csv 2022-02-02 0.000000 \n", "\n", " Training Drill \n", "0 MATCH-MSG \n", "1 MATCH-MSG \n", "2 MATCH-MSG \n", "3 MATCH-MSG \n", "4 MATCH-MSG \n", "... ... \n", "2016448 FULL-SESSION-MODIFIED \n", "2016449 FULL-SESSION-MODIFIED \n", "2016450 FULL-SESSION-MODIFIED \n", "2016451 FULL-SESSION-MODIFIED \n", "2016452 FULL-SESSION-MODIFIED \n", "\n", "[2016453 rows x 9 columns]" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_training_data_select " ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "(2016453, 9)" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_training_data_select.shape" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 2016453 entries, 0 to 2016452\n", "Data columns (total 9 columns):\n", " # Column Dtype \n", "--- ------ ----- \n", " 0 Player Display Name object \n", " 1 Time object \n", " 2 Lat float64\n", " 3 Lon float64\n", " 4 Speed (m/s) float64\n", " 5 Filename object \n", " 6 Date object \n", " 7 Speed (km/h) float64\n", " 8 Training Drill object \n", "dtypes: float64(4), object(5)\n", "memory usage: 138.5+ MB\n" ] } ], "source": [ "df_training_data_select.info()" ] }, { "cell_type": "code", "execution_count": 25, "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", "
Player Display NameTimeLatLonSpeed (m/s)FilenameDateSpeed (km/h)Training Drill
0MASINA12:57:43.251.711186-0.2815831.2027792022-02-02-MASINA-MATCH-MSG.csv2022-02-024.330003MATCH-MSG
1MASINA12:57:43.351.711185-0.2815821.2583342022-02-02-MASINA-MATCH-MSG.csv2022-02-024.530004MATCH-MSG
2MASINA12:57:43.451.711184-0.2815821.3055572022-02-02-MASINA-MATCH-MSG.csv2022-02-024.700004MATCH-MSG
3MASINA12:57:43.551.711183-0.2815811.1194452022-02-02-MASINA-MATCH-MSG.csv2022-02-024.030003MATCH-MSG
4MASINA12:57:43.651.711182-0.2815801.1500012022-02-02-MASINA-MATCH-MSG.csv2022-02-024.140003MATCH-MSG
5MASINA12:57:43.751.711181-0.2815791.1194452022-02-02-MASINA-MATCH-MSG.csv2022-02-024.030003MATCH-MSG
6MASINA12:57:43.851.711180-0.2815781.0083342022-02-02-MASINA-MATCH-MSG.csv2022-02-023.630003MATCH-MSG
7MASINA12:57:43.951.711180-0.2815771.1305562022-02-02-MASINA-MATCH-MSG.csv2022-02-024.070003MATCH-MSG
8MASINA12:57:44.051.711179-0.2815771.0138902022-02-02-MASINA-MATCH-MSG.csv2022-02-023.650003MATCH-MSG
9MASINA12:57:44.151.711178-0.2815760.9472232022-02-02-MASINA-MATCH-MSG.csv2022-02-023.410003MATCH-MSG
\n", "
" ], "text/plain": [ " Player Display Name Time Lat Lon Speed (m/s) \\\n", "0 MASINA 12:57:43.2 51.711186 -0.281583 1.202779 \n", "1 MASINA 12:57:43.3 51.711185 -0.281582 1.258334 \n", "2 MASINA 12:57:43.4 51.711184 -0.281582 1.305557 \n", "3 MASINA 12:57:43.5 51.711183 -0.281581 1.119445 \n", "4 MASINA 12:57:43.6 51.711182 -0.281580 1.150001 \n", "5 MASINA 12:57:43.7 51.711181 -0.281579 1.119445 \n", "6 MASINA 12:57:43.8 51.711180 -0.281578 1.008334 \n", "7 MASINA 12:57:43.9 51.711180 -0.281577 1.130556 \n", "8 MASINA 12:57:44.0 51.711179 -0.281577 1.013890 \n", "9 MASINA 12:57:44.1 51.711178 -0.281576 0.947223 \n", "\n", " Filename Date Speed (km/h) Training Drill \n", "0 2022-02-02-MASINA-MATCH-MSG.csv 2022-02-02 4.330003 MATCH-MSG \n", "1 2022-02-02-MASINA-MATCH-MSG.csv 2022-02-02 4.530004 MATCH-MSG \n", "2 2022-02-02-MASINA-MATCH-MSG.csv 2022-02-02 4.700004 MATCH-MSG \n", "3 2022-02-02-MASINA-MATCH-MSG.csv 2022-02-02 4.030003 MATCH-MSG \n", "4 2022-02-02-MASINA-MATCH-MSG.csv 2022-02-02 4.140003 MATCH-MSG \n", "5 2022-02-02-MASINA-MATCH-MSG.csv 2022-02-02 4.030003 MATCH-MSG \n", "6 2022-02-02-MASINA-MATCH-MSG.csv 2022-02-02 3.630003 MATCH-MSG \n", "7 2022-02-02-MASINA-MATCH-MSG.csv 2022-02-02 4.070003 MATCH-MSG \n", "8 2022-02-02-MASINA-MATCH-MSG.csv 2022-02-02 3.650003 MATCH-MSG \n", "9 2022-02-02-MASINA-MATCH-MSG.csv 2022-02-02 3.410003 MATCH-MSG " ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_training_data_select.head(10)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The Training DataFrame for 2022-02-02 contains the data for 6 different training drills, including: ['MATCH-MSG' 'CROSSING-AND-FINISHING-HSR-SPR'\n", " 'ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY' 'FULL-SESSION-MODIFIED'\n", " 'PASSING-DRILL-PHYSICAL' 'WARM-UP-COORDINATION-AGILITY'].\n", "\n", "The Training DataFrame for 2022-02-02 contains the data for 23 different players, including: ['MASINA' 'NGAKIA' 'CATHCART' 'KAMARA' 'KING' 'EKONG' 'ETEBO' 'KUCKA'\n", " 'DENNIS' 'GOSLING' 'KAYEMBE' 'BAAH' 'SISSOKO' 'SEMA' 'SIERRALTA' 'SAMIR'\n", " 'KABASELE' 'LOUZA' 'FLETCHER' 'FEMENIA' 'JOAO PEDRO' 'KALU' 'CLEVERLEY'].\n", "\n" ] } ], "source": [ "# Print statements about the dataset\n", "\n", "## Define variables for print statments\n", "training_drill_types = df_training_data_select['Training Drill'].unique()\n", "players = df_training_data_select['Player Display Name'].unique()\n", "count_training_drill_types = len(df_training_data_select['Training Drill'].unique())\n", "count_players = len(df_training_data_select['Player Display Name'].unique())\n", "\n", "## Print statements\n", "print(f'The Training DataFrame for 2022-02-02 contains the data for {count_training_drill_types:,} different training drills, including: {training_drill_types}.\\n')\n", "print(f'The Training DataFrame for 2022-02-02 contains the data for {count_players:,} different players, including: {players}.\\n')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "### 4.2. Split Out Unified Training Data into Individual Training Drills\n", "Split out the unified DataFrame into the individual training drills.\n", "\n", "**Note**: It's important to do this before later conversions of the format and speed/acceleration calculations because not all the training sessions take place at the same time, as then they sessions could later get mixed up." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['MATCH-MSG',\n", " 'CROSSING-AND-FINISHING-HSR-SPR',\n", " 'ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY',\n", " 'FULL-SESSION-MODIFIED',\n", " 'PASSING-DRILL-PHYSICAL',\n", " 'WARM-UP-COORDINATION-AGILITY']" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lst_training_types = list(df_training_data_select['Training Drill'].unique())\n", "lst_training_types " ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "df_training_match_msg = df_training_data_select[df_training_data_select['Training Drill'] == 'MATCH-MSG']\n", "df_training_crossing_and_finishing_hsr_spr = df_training_data_select[df_training_data_select['Training Drill'] == 'CROSSING-AND-FINISHING-HSR-SPR']\n", "df_training_attack_vs_defence_attack_superiority = df_training_data_select[df_training_data_select['Training Drill'] == 'ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY']\n", "df_training_full_session_modified = df_training_data_select[df_training_data_select['Training Drill'] == 'FULL-SESSION-MODIFIED']\n", "df_training_passing_drill_physical = df_training_data_select[df_training_data_select['Training Drill'] == 'PASSING-DRILL-PHYSICAL']\n", "df_training_warm_up_coordination_agility = df_training_data_select[df_training_data_select['Training Drill'] == 'WARM-UP-COORDINATION-AGILITY']" ] }, { "cell_type": "code", "execution_count": 29, "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", "
Player Display NameTimeLatLonSpeed (m/s)FilenameDateSpeed (km/h)Training Drill
0MASINA12:57:43.251.711186-0.2815831.2027792022-02-02-MASINA-MATCH-MSG.csv2022-02-024.330003MATCH-MSG
1MASINA12:57:43.351.711185-0.2815821.2583342022-02-02-MASINA-MATCH-MSG.csv2022-02-024.530004MATCH-MSG
2MASINA12:57:43.451.711184-0.2815821.3055572022-02-02-MASINA-MATCH-MSG.csv2022-02-024.700004MATCH-MSG
3MASINA12:57:43.551.711183-0.2815811.1194452022-02-02-MASINA-MATCH-MSG.csv2022-02-024.030003MATCH-MSG
4MASINA12:57:43.651.711182-0.2815801.1500012022-02-02-MASINA-MATCH-MSG.csv2022-02-024.140003MATCH-MSG
\n", "
" ], "text/plain": [ " Player Display Name Time Lat Lon Speed (m/s) \\\n", "0 MASINA 12:57:43.2 51.711186 -0.281583 1.202779 \n", "1 MASINA 12:57:43.3 51.711185 -0.281582 1.258334 \n", "2 MASINA 12:57:43.4 51.711184 -0.281582 1.305557 \n", "3 MASINA 12:57:43.5 51.711183 -0.281581 1.119445 \n", "4 MASINA 12:57:43.6 51.711182 -0.281580 1.150001 \n", "\n", " Filename Date Speed (km/h) Training Drill \n", "0 2022-02-02-MASINA-MATCH-MSG.csv 2022-02-02 4.330003 MATCH-MSG \n", "1 2022-02-02-MASINA-MATCH-MSG.csv 2022-02-02 4.530004 MATCH-MSG \n", "2 2022-02-02-MASINA-MATCH-MSG.csv 2022-02-02 4.700004 MATCH-MSG \n", "3 2022-02-02-MASINA-MATCH-MSG.csv 2022-02-02 4.030003 MATCH-MSG \n", "4 2022-02-02-MASINA-MATCH-MSG.csv 2022-02-02 4.140003 MATCH-MSG " ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_training_match_msg.head()" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(146308, 9)" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_training_match_msg.shape" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['MASINA',\n", " 'KING',\n", " 'DENNIS',\n", " 'GOSLING',\n", " 'BAAH',\n", " 'NGAKIA',\n", " 'KUCKA',\n", " 'LOUZA',\n", " 'KABASELE',\n", " 'KAYEMBE',\n", " 'KALU',\n", " 'JOAO PEDRO',\n", " 'ETEBO',\n", " 'EKONG',\n", " 'FLETCHER',\n", " 'SISSOKO',\n", " 'SIERRALTA',\n", " 'CATHCART',\n", " 'SEMA',\n", " 'KAMARA',\n", " 'FEMENIA',\n", " 'SAMIR']" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(df_training_match_msg['Player Display Name'].unique())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "### 4.3. Engineer DataFrame to Match Tracking Data Format\n", "To work with the existing Tracking data libraries, based on [Laurie Shaw](https://twitter.com/EightyFivePoint)'s Metrica Sports Tracking data libraries, [`LaurieOnTracking`](https://github.com/Friends-of-Tracking-Data-FoTD/LaurieOnTracking), the data needs to be engineered to match the Metrica schema, which is the following:\n", "\n", "| Feature | Data type | Definition |\n", "|-------------------------------------------|---------------|----------------|\n", "| `Frame` | int64 | |\n", "| `Period` | int64 | |\n", "| `Time [s]` | float64 | |\n", "| `Home/Away_No._x` (repeated 14 times) | float64 | |\t\n", "| `Home/Away_No._y` (repeated 14 times) | float64 | |\n", "| `ball_x` | float64 |\t |\n", "| `ball_y` | float64 | |\n", "\n", "However, as this is Training data, the `Home` and `Away` columns need to be replaced with the players names, which takes place in this code. However, to make the visualisation Tracking data scripts compatible, such as creating Pitch Control clips, that code will require some alteration to work with the player names. However, for the purposes of this exercise to calculate metrics such as the Speed, Accelerations, and Total Distances covered by the players, this alteration of the visualisation code is out of scope and is not covered.\n", "\n", "To learn more about the Metrica Sports schema, see the official documentation [[link](https://github.com/metrica-sports/sample-data/blob/master/documentation/events-definitions.pdf)]." ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "# Define function for unifying all the training data for a an indicated date into unified DataFrames\n", "def convert_training_data_format(df, date, training_drill): \n", "\n", " \"\"\"\n", " Define a function to convert the format of the training dataset to match Tracking data'\n", " \"\"\"\n", " \n", " ## Read in exported CSV file if exists, if not, download the latest JSON data\n", " if not os.path.exists(os.path.join(data_dir_physical, 'engineered', 'Set 2', '3_individual_training_sessions_dataset', f'{date}-{training_drill}-MOVEMENT-TRAINING-DATA-ALL-PLAYERS.csv')):\n", " \n", " \n", " ### Start timer\n", " tic = datetime.datetime.now()\n", "\n", " \n", " ### Print time of engineering of tracking data started\n", " print(f'Conversion of the format of the training data started at: {tic}') \n", " \n", " \n", " ##\n", " df_pvt = df.copy()\n", "\n", "\n", " ##\n", " lst_players = list(df_pvt['Player Display Name'].unique())\n", "\n", "\n", " ## Rename columns\n", " df_pvt = df_pvt.rename(columns={'Time': 'Time [s]',\n", " 'Lon': 'x',\n", " 'Lat': 'y'\n", " }\n", " )\n", "\n", "\n", " ##\n", " df_pvt = df_pvt.drop(columns=['Filename'])\n", "\n", "\n", " ## Create empty DataFrame of timestamps\n", " df_time = df_pvt[['Time [s]', 'Date', 'Training Drill']].drop_duplicates().reset_index(drop=True)\n", " \n", " \n", " ## Create empty DataFrame of timestamps\n", " df_time = df_time.reset_index(drop=False)\n", " \n", " \n", " ## Rename index column to 'Frame'\n", " df_time = df_time.rename(columns={'index': 'Frame'})\n", " \n", " \n", " ##\n", " df_pvt_final = df_time.copy()\n", "\n", "\n", " ## Iterate through each file in list of all files\n", " for player in lst_players:\n", "\n", " ### Create temporary DataFrame with each file\n", " df_player = df_pvt[df_pvt['Player Display Name'] == player]\n", "\n", " ###\n", " df_player['Player'] = df_player['Player Display Name'].str.title()\n", "\n", " ### \n", " player_title = player.title()\n", "\n", " ###\n", " df_player = df_player.rename(columns={'Time [s]': 'Time',\n", " 'x': f'{player_title}_x',\n", " 'y': f'{player_title}_y',\n", " 'Speed (m/s)': f'{player_title} Speed (m/s)',\n", " 'Speed (km/h)': f'{player_title} Speed (km/h)'\n", " }\n", " )\n", "\n", "\n", " ### \n", " df_player = df_player[['Time', f'{player_title}_x', f'{player_title}_y', f'{player_title} Speed (m/s)', f'{player_title} Speed (km/h)']]\n", "\n", "\n", " ### Join each individual DataFrame to time DataFrame\n", " df_pvt_final = pd.merge(df_pvt_final, df_player, left_on=['Time [s]'], right_on=['Time'], how='left')\n", "\n", " ### \n", " df_pvt_final = df_pvt_final.drop(columns=['Time'])\n", "\n", " ### \n", " df_pvt_final = df_pvt_final.drop_duplicates()\n", " \n", " \n", " \n", " ### Save DataFrame\n", "\n", " #### Define filename for each combined file to be saved\n", " save_filename = f'{date}-{training_drill}-MOVEMENT-TRAINING-DATA-ALL-PLAYERS'.replace(' ', '-').replace('(', '').replace(')', '').replace(':', '').replace('.', '').replace('__', '_').upper()\n", "\n", " #### Define the filepath to save each combined file\n", " path = os.path.join(data_dir_physical, 'engineered', 'Set 2', '3_individual_training_sessions_dataset')\n", "\n", " #### Save the combined file as a CSV\n", " df_pvt_final.to_csv(path + f'/{save_filename}.csv', index=None, header=True)\n", " \n", " \n", " ### End timer\n", " toc = datetime.datetime.now()\n", " \n", " \n", " ### Print time of engineering of tracking data ended\n", " print(f'Conversion of the format of the training data ended at: {toc}')\n", "\n", "\n", " ### Calculate time take\n", " total_time = (toc-tic).total_seconds()\n", " print(f'Time taken to convert the format and save the training data is: {total_time:0.2f} seconds.')\n", " \n", " \n", " \n", " ## If CSV file already exists, read in previously saved DataFrame\n", " else:\n", " \n", " ### Print time reading of CSV files started\n", " print('Converted training data already saved to local storage. Reading in file as a pandas DataFrame.')\n", " \n", " ### Read in raw DataFrame\n", " df_pvt_final = pd.read_csv(os.path.join(data_dir_physical, 'engineered', 'Set 2', '3_individual_training_sessions_dataset', f'{date}-{training_drill}-MOVEMENT-TRAINING-DATA-ALL-PLAYERS.csv'))\n", " \n", " \n", " ## Return the DataFrame\n", " return(df_pvt_final)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Converted training data already saved to local storage. Reading in file as a pandas DataFrame.\n", "Converted training data already saved to local storage. Reading in file as a pandas DataFrame.\n", "Converted training data already saved to local storage. Reading in file as a pandas DataFrame.\n", "Converted training data already saved to local storage. Reading in file as a pandas DataFrame.\n", "Converted training data already saved to local storage. Reading in file as a pandas DataFrame.\n", "Converted training data already saved to local storage. Reading in file as a pandas DataFrame.\n" ] } ], "source": [ "df_training_match_msg_pvt = convert_training_data_format(df=df_training_match_msg, date='2022-02-02', training_drill='MATCH-MSG')\n", "df_training_crossing_and_finishing_hsr_spr_pvt = convert_training_data_format(df=df_training_crossing_and_finishing_hsr_spr, date='2022-02-02', training_drill='CROSSING-AND-FINISHING-HSR-SPR')\n", "df_training_attack_vs_defence_attack_superiority_pvt = convert_training_data_format(df=df_training_attack_vs_defence_attack_superiority, date='2022-02-02', training_drill='ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY')\n", "df_training_full_session_modified_pvt = convert_training_data_format(df=df_training_full_session_modified, date='2022-02-02', training_drill='FULL-SESSION-MODIFIED')\n", "df_training_passing_drill_physical_pvt = convert_training_data_format(df=df_training_passing_drill_physical, date='2022-02-02', training_drill='PASSING-DRILL-PHYSICAL')\n", "df_training_warm_up_coordination_agility_pvt = convert_training_data_format(df=df_training_warm_up_coordination_agility, date='2022-02-02', training_drill='WARM-UP-COORDINATION-AGILITY')" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Plot visualisation of the missing values for each feature of the DataFrame, df_training_match_msg_pvt\n", "msno.matrix(df_training_match_msg_pvt, figsize = (30, 7))" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Plot visualisation of the missing values for each feature of the DataFrame, df_training_crossing_and_finishing_hsr_spr_pvt\n", "msno.matrix(df_training_crossing_and_finishing_hsr_spr_pvt, figsize = (30, 7))" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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zMxEURRRFEVExKHXw1lr3JHmdtrRRx+dtf5KGngAAAAAAAC05Zprrol3vetduWNsWRp4AAAAAAAAtOXMM8+Ma665JqanpyMiIqVUej2ctcatfPbggw9WEbUlMzMzXavVCg08AAAAAAAA2nLSSSfF3/zN33S0xsjISEfXb7Z9+/au1WpFX+4AAAAAAAAAkNPU1FTuCCV24AFUaHx8PPsauTNMTExsuD4AAAAAQDfNz8/njlCigQdQoeHh4XXPbTQaERExOjqaZX6VGQAAAAAANpOBgXq1zByhCQAAAAAAQE8bGhrKHaGkXu1EYNPavXv3pj/6sQ7zt0IGR2gCAAAAwNb39a9/PX75l385d4zK9PXVa8+bBh5QiYmJiS1x9GMvf4cqMwAAAAAAW9tW+4f8U1NTuSOUaOABAAAAAADQlhe84AXxghe8oKM1RkZGOrp+s4WFha7VakW99gMCAAAAAABAlzlCEwAAAAAAgI655ZZb4rLLLis9Symt+f5w1po3Oztbep5SiqIooiiKQ+/bqRURh+Z2mwYeANAzxsfHs6+Re/5WOw8eAAAAqL/3v//98d3vfjd3DDZAAw8A6Jjh4eF1z200GhERMTo6uinnN68BAAAA0E1//Md/HN/73vcOvS+KovT5yverfba8m+5w8/bv3x+XXHJJFXFrYXp6OneEEg08AAAAAACALaS/vz8e8YhHdLTGD/3QD8XY2FhHazznOc+JBx98sKM1lu3atasrdVqlgQcAAAAAADW2Fa6oqGoNeku3mncREQsLC12r1QoNPAAAAAAAqLHNfEVFVWtEaADWzSc/+cm4/PLLc8eozN133x0nn3xy7hiH9OUOAAAAAAAAwObS17e1WkzHH3987gglW+tPFwAAAAAAgI771re+lTvCluYITQAAAAAAANry8pe/PH7mZ34miqKIlNKhn2WrPVvtefPryvkvfOELu/BNFs3OznatVis08AAAAAAAAGhLSike+9jH5o5RmcHBwdwRShyhCQAAAAAAADWigQcAAAAAAEBP6+urV8vMEZoAAAAAAAC05frrr4/LLrssd4zK1O0OvHq1EwEAAAAAAKi9o48+OneESs3NzeWOUGIHHgAAAAAAAG05/fTTY2xsrKM1RkZGOrp+sx07dnStVis08AAAAAAAAGhbURSrvq42ptVxq33WDXU7QlMDDwAAAAAAgLZce+218c53vjN3jMosLCzkjlDiDjwAAAAAAADa8vSnPz2GhoYOvU8pRUop+vr61vzp7++P/v7+GBgYiIGBgRgcHDzsTzellLpa70jswAMAAAAAAKAtJ598cnzyk5/saI1u3oE3MzPTtVqtsAMPAAAAAACAnrZr167cEUo08AAAAAAAAKids846q2u1un1k55E4QhMAAAAAAIC2TE9Px0c+8pGYm5uLoige8vnys+XXlNJDnq02vtk//MM/VBl5Tffdd1886lGP6lq9I9HAAwAAAAAAoC179uyJD3/4w7ljVKavr16HVmrgAQAAAAAA0JaXvvSlcdNNN8XMzEzHatx1110dW3slR2gCAAAAAACwqb3//e+P/fv3545RmU42ItdDAw8AAAAAAIC2XHjhhXHPPffE7OxsRCzecdf8ejgrx601/jOf+UwVUVsyNDTUtVqt0MADAAAAAACgLccee2xccsklHa3RzQbe1NRU12q1ol438gEAAAAAAECXLSws5I5QooEHAAAAAABAT9u+fXvuCCUaeAAAAAAAANTOM5/5zK7VqtsdeBp4AAAAAAAA1M63v/3trtWamZnpWq1WaOABAAAAAABQO7feemvuCNlo4AEAAAAAAFA7xx9/fNdq9ff3d61WKzTwAAAAAAAAqJ177723a7Xm5+e7VqsVGngAAAAAAAD0tNnZ2dwRSjTwAAAAAAAA6GmO0AQAAAAAAIAaGRwczB2hRAMPAAAAAACA2nniE5+YO0I2GngAAAAAAADUzle/+tXcEbIZyB0AAAAAAACAzaUoirjzzjtjYWFh1c9TSofGNb9fbdzymNXed8vc3FzXa65FAw8AAAAAoIbGx8ezr5F7PlBf733ve+Pqq6/OHaMyk5OTuSOUaOABAAAAANTQ8PDwuuc2Go2IiBgdHd2U85vXAOrpnHPOic9+9rMxOzsbEeWddq3uoDvSzrs777yzorRHdrgdgrlo4AEAAAAAANCWE044Ifbs2dPRGiMjIx1dv9nOnTu7VqsVGngAAAAAAAC05Xvf+168+c1vjpmZmUPPmnfRrXXn3eGer9yR103LOwnrQgMPAAAAAACAtlx33XXxhS98IXeMLUsDDwAAAAAAgLa88pWvjKc//emxsLCw5rhW7sY73F14r3vd6ypKe2RDQ0Ndq9UKDTwAAAAAAADa0tfXF095ylNyx6jM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AAAAAIC23HHHHbkjVKq/vz93hBI78AAAAAAAAGjLWWedFTfffPOhIzRXHoO5bK2jMo/kn/7pnzYWsg2Tk5Ndq9UKDTwAAAAAAADacu2118bY2FjuGJVZWFjIHaFEAw8AAAAAAIC2XHTRRfHkJz+5tKuueZddu3fKrdyhl1KKN77xjdWEbcHAQL1aZvVKAwAAAAAATcbHx7POr0sGqJt77rknPvShD8X09PShxlvz68pnqz1f+dlqz7tlaGio6zXXooEHAHTMVvhL0kbnT0xMbGg+AABArxseHl7XvEajERERo6Oj66690TWqmg919Ou//utx9913545Rmenp6dwRSjTwAICOWe9fsiLq85ekKv6iBwAAALDV/N7v/V685jWvyR2jMhp4AAAAAAAAbGq7d++OsbGxjtYYGRnp6PrNjjnmmK7VakVf7gAAAAAAAACQ08zMTO4IJRp4AAAAAAAA9LT+/v7cEUo08AAAAAAAAOhps7OzuSOUaOABAAAAAABQO7t27eparcHBwa7VasVA7gAAAAAAAMDhjY+PZ1+jDhmolwMHDsRVV10Vs7OzURTFQz5ffrb8mlJ6yLPVxjd74IEHqoy8poWFha7VaoUGHgAAAABADdWhYZJ7PouGh4fXPbfRaERExOjoaJb5Va0R4X9PdfO+970v/vqv/zp3jMpMT0/njlCigQcAAAAAUEObuWlTZdMHqKeLLrooTjzxxJifn4+IxR12za8rf19ptfErP7v88ssry7vZaOABAAAAAADQlsHBwTj33HM7WuOKK65Y9WjNTjj66KO7UqdVGngAAAAAAAC05d///d/jkksuiampqYgo33G3UWvdldcp/f39XavVCg08AAAAAAAA2vKZz3wm9u/fnztGZQ4ePJg7QokGHgAAAAAAAG156UtfGuecc84Rd8mtdQ/ekVx44YXrntuuXbt2da1WKzTwAAAAAIBa2b17d4yPj29ojdzzq1oDoK6++MUvxute97rcMSqzfBRoXWjgAQAAAAC1MjExEaOjo+ua22g0IiKyza8yA0Cdffe7380doVKzs7O5I5Ro4AEAAAAAANCWc845J84555yO1hgZGeno+s2Ghoa6VqsVfbkDAAAAAAAAwEqPecxjckfIRgMPAAAAAACA2vnGN77RtVrz8/Ndq9UKDTwAAAAAAABqZ3BwsGu1+vrq1TJzBx4A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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Plot visualisation of the missing values for each feature of the DataFrame, df_training_attack_vs_defence_attack_superiority_pvt\n", "msno.matrix(df_training_attack_vs_defence_attack_superiority_pvt, figsize = (30, 7))" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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ANBpJ510Ul70ohcNjtB8wxve0DSPAg8AAAAAAIBOO/fcc3PRRRe1jjHQax0AAAAAAAAAWrr22mtbRxiiwAMAAAAAAKDTDj744NYRhijwAAAAAAAA6LRnPetZrSMMcQceAAAAAAAAnfbc5z43q1evHjyPjY01TKPAAwAAAAAAoONqrbn11ltTa8309HTrOAo8AAAAAAAAuu3ss8/OypUrW8cYUOABAAAAAADQaYccckhuuOGGJEkpJd///veb5lHgAQAAAAAA0Gn9fj+33HJL6xgDvdYBAAAAAAAAoKX3v//9rSMMUeABAAAAAADQabvvvnvrCEMcoQkAAAAAAIvE5OTkop2f79qwPf31X/913vzmN7eOMaDAAwAAAACARWJ0dHROcxMTE0mS8fHxHT4/37UfpABke7riiitaRxjiCE0AAAAAAAA67e67724dYYgdeAAAAAAAAHTa+9///qHnsbGxRklmKPAAAAAAAADotKmpqXzlK1/J1NRUpqenW8dR4AEAAAAAANBtp59+ei655JLWMQYUeAAAAAAAAHTaEUcckdtvvz2llPR6vVx//fVN8yjwAAAAAAAA6LTdd989p5122uC59R14vaarAwAAAAAAAEPswAMAAAAAAKDTaq256667smHDhjzwwAOt4yjwAAAAAAAA6LYPfehD+eQnP9k6xoAjNAEAAAAAAOi03/u938sTnvCE7LbbbnnSk57UOo4deAAAAAAAAHTbvffemzvvvLN1jAE78AAAAAAAAOi0L3/5y60jDFHgAQAAAAAA0GkLafdd4ghNAAAAAABYNCYnJxft/HzXhu3pj/7oj/LZz362dYwBBR4AAAAAACwSo6Ojc5qbmJhIkoyPj+/w+fmu/SAFINvTypUrW0cYosADAAAAAACg0171qlfliU98Ykop6fV6Of/885vmUeABAAAAAADQab/2a7+W5cuXD55bF3i9pqsDAAAAAAAAQxR4AAAAAAAA8BD77bdf0/UdoQkAAAAAAECnrVu3Lq997WszNTWVWmvuvvvupnkUeAAAAAAAAHTalVdemZ/85CetYww4QhMAAAAAAIBOW7t2besIQxR4AAAAAAAAdNrXvva11hGGOEITABgYGRnJ5OTkvD6j5fx8Zvv9/pxnAQAAAFjcPvaxj+XYY49NrTVJMjU11TSPAg8AGOj3+xkfH5/T7MTERJI0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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Plot visualisation of the missing values for each feature of the DataFrame, df_training_full_session_modified_pvt\n", "msno.matrix(df_training_full_session_modified_pvt, figsize = (30, 7))" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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67j4bXW/7Q4AwETV19cX3/72t2Pr1q3D3ht6P7bB18e6R9vJPteIvzOU9fLLL2fLKkshBwAAQF1qtdop/dvqftsdAICJ7sEHH4wvfOELzR6jYZ5++ulmjzCMQg4AAAAAAGACu+KKK+KP//iPY/v27UccTykd8Xz06xN97uj3nn766fiXf/mXhs18IqO9PG6VFHIAAAAAAAATWEop3vzmN1ea0dXVla2QW7RoUZackVDIARxHI+6F0uz19e7hPigAAAAAjeXfnBiL1qxZE7feemuzx2iYrq6uZo8wjEIO4DjquRfKWLqPSb0zAAAAANA4E/3fnAYp9MaWvXv3NnuEhlqwYEGzRxhGIQcAAAAAADCBrVq1akzed22kurq64sYbb4zzzjuv2aMMo5ADAAAAAACgUr29vXH77bfH2rVrIyKiKIooimLY68GfIyL6+vqir68viqI44nnoY+ixnp6eiIg4ePBg5m93cgo5AAAAAAAAKvXYY4/FP/zDP2TJuu++++Ltb397lqyyFHIAAAAAAAAT3Pr166O7u/vwz0PPXjv62FBlP7dx48ZGjXpSCxcuzJZVlkIOAAAAAABgAluzZk3ceuutzR6jYfr6+po9wjAtzR4AAAAAAACA5mltbY3Fixc3e4yGWbFiRbNHGEYhBwAAAAAAMIE9/PDDsXnz5maP0TA5L49ZlktWAgAAUJfW1tbo6Oioe59692j2+lqtVtd6AABolksvvTTe//73x5YtWyKlFCmliIgjnus9tnPnzob8vaGM0047LUvOSCjkAAAAqEutVou2trZRr29vb4+IGPUezV4/dA8AADgVTZ48OW666aZKM3bv3p2tkDvzzDOz5IyEQg4AAAAAAGCC27t3bxw8eDAiIoqiOOK9oiiGHYuI6OvrO3x88DNHPwY/9+KLL1b8DX5u27Zt2bLKUsgBAAAAAABMYLVaLT7+8Y83e4yGGSwWxxKFHAAAAAAAwAS2bNmyaG1tjeeee+7wscF7wA39+ehjI/lczrPW9u7dmy2rLIUcAAAAAADABDZ9+vT4y7/8y0oz1q9fHzfffHOlGYOmTJmSJWckFHIAAAAAAABUatmyZfH2t7897r777obum1I6fK+6/fv3x6FDh+LVr351QzMaQSEHAAAAAABApTZt2hR33HFHlqx169bFddddlyWrLIUcAAAAAADABLZu3br4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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Plot visualisation of the missing values for each feature of the DataFrame, df_training_passing_drill_physical_pvt\n", "msno.matrix(df_training_passing_drill_physical_pvt, figsize = (30, 7))" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Plot visualisation of the missing values for each feature of the DataFrame, df_training_warm_up_coordination_agility_pvt\n", "msno.matrix(df_training_warm_up_coordination_agility_pvt, figsize = (30, 7))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "From the visualisation, we can see that, that for certain drills, all the players are involved. However, for some drills the players are involved at different times" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "scrolled": true }, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
FrameTime [s]DateTraining DrillNgakia_xNgakia_yNgakia Speed (m/s)Ngakia Speed (km/h)Cathcart_xCathcart_yCathcart Speed (m/s)Cathcart Speed (km/h)Etebo_xEtebo_yEtebo Speed (m/s)Etebo Speed (km/h)Dennis_xDennis_yDennis Speed (m/s)Dennis Speed (km/h)Kayembe_xKayembe_yKayembe Speed (m/s)Kayembe Speed (km/h)Baah_xBaah_yBaah Speed (m/s)Baah Speed (km/h)Sierralta_xSierralta_ySierralta Speed (m/s)Sierralta Speed (km/h)Ekong_xEkong_yEkong Speed (m/s)Ekong Speed (km/h)King_xKing_yKing Speed (m/s)King Speed (km/h)Kucka_xKucka_yKucka Speed (m/s)Kucka Speed (km/h)Kamara_xKamara_yKamara Speed (m/s)Kamara Speed (km/h)Fletcher_xFletcher_yFletcher Speed (m/s)Fletcher Speed (km/h)Louza_xLouza_yLouza Speed (m/s)Louza Speed (km/h)Gosling_xGosling_yGosling Speed (m/s)Gosling Speed (km/h)Femenia_xFemenia_yFemenia Speed (m/s)Femenia Speed (km/h)Samir_xSamir_ySamir Speed (m/s)Samir Speed (km/h)Joao Pedro_xJoao Pedro_yJoao Pedro Speed (m/s)Joao Pedro Speed (km/h)Sissoko_xSissoko_ySissoko Speed (m/s)Sissoko Speed (km/h)Kabasele_xKabasele_yKabasele Speed (m/s)Kabasele Speed (km/h)Masina_xMasina_yMasina Speed (m/s)Masina Speed (km/h)Kalu_xKalu_yKalu Speed (m/s)Kalu Speed (km/h)Sema_xSema_ySema Speed (m/s)Sema Speed (km/h)
0012:08:24.22022-02-02ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY-0.28109151.7113850.00.0-0.28112451.7113930.00.0-0.28136251.7108961.0555563.800003-0.28158151.7112632.3611138.500007-0.28127351.7109670.00.0-0.28105751.7113730.00.0-0.28108351.7113500.00.0-0.28096251.7112570.00.0-0.28137051.7111951.9277796.940006-0.28156651.7112572.0250027.290006-0.28100551.7114630.5583342.010002-0.28128451.7110881.3055574.700004-0.28158251.7111261.5750015.670005-0.28096351.7112480.00.0-0.28147851.7113051.1055563.980003-0.28098451.7112950.00.0-0.28156651.7113111.9500027.020006-0.28144751.7111961.4388905.180004-0.28138251.7112240.7416672.670002-0.28131651.7111360.0000000.000000-0.28141051.7110471.5944465.740005-0.28094551.7112470.00.0
1112:08:24.32022-02-02ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY-0.28109151.7113850.00.0-0.28112551.7113930.00.0-0.28136251.7108951.0222233.680003-0.28158051.7112631.0750013.870003-0.28127351.7109670.00.0-0.28105751.7113730.00.0-0.28108351.7113500.00.0-0.28096251.7112570.00.0-0.28137251.7111951.8638906.710005-0.28156451.7112571.1750014.230003-0.28100651.7114620.8527783.070002-0.28128551.7110891.2611124.540004-0.28158151.7111261.3777794.960004-0.28096351.7112480.00.0-0.28147751.7113060.9611123.460003-0.28098451.7112950.00.0-0.28156451.7113102.1833357.860006-0.28144851.7111971.4666685.280004-0.28138151.7112240.6333342.280002-0.28131651.7111360.0000000.000000-0.28141051.7110481.5777795.680005-0.28094551.7112470.00.0
2212:08:24.42022-02-02ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY-0.28109151.7113850.00.0-0.28112451.7113930.00.0-0.28136251.7108940.9500013.420003-0.28157951.7112630.7333342.640002-0.28127351.7109660.00.0-0.28105751.7113730.00.0-0.28108351.7113500.00.0-0.28096251.7112570.00.0-0.28137451.7111961.8638906.710005-0.28156451.7112580.8416673.030002-0.28100851.7114621.0194453.670003-0.28128751.7110891.3527794.870004-0.28157951.7111261.0472233.770003-0.28096351.7112480.00.0-0.28147651.7113071.5666685.640005-0.28098451.7112950.00.0-0.28156051.7113092.5722249.260007-0.28144951.7111980.9750013.510003-0.28137951.7112251.4805575.330004-0.28131651.7111360.0000000.000000-0.28141051.7110501.4722235.300004-0.28094551.7112470.00.0
3312:08:24.52022-02-02ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY-0.28109151.7113850.00.0-0.28112451.7113930.00.0-0.28136251.7108930.9750013.510003-0.28157851.7112620.8472233.050002-0.28127351.7109660.00.0-0.28105751.7113730.00.0-0.28108351.7113500.00.0-0.28096251.7112570.00.0-0.28137651.7111971.4916685.370004-0.28156251.7112570.7861122.830002-0.28101051.7114621.2944454.660004-0.28128851.7110901.4333345.160004-0.28157851.7111260.8916673.210003-0.28096351.7112480.00.0-0.28147451.7113081.2527794.510004-0.28098451.7112950.00.0-0.28155551.7113083.04722510.970009-0.28144951.7111990.9500013.420003-0.28137851.7112261.5972245.750005-0.28131651.7111360.0000000.000000-0.28141051.7110522.1194467.630006-0.28094551.7112470.00.0
4412:08:24.62022-02-02ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY-0.28109151.7113860.00.0-0.28112451.7113930.00.0-0.28136251.7108920.9138903.290003-0.28157751.7112610.8722233.140003-0.28127451.7109660.00.0-0.28105751.7113730.00.0-0.28108351.7113500.00.0-0.28096251.7112570.00.0-0.28137751.7111991.7722246.380005-0.28156251.7112580.6750012.430002-0.28101151.7114621.0166673.660003-0.28129051.7110911.4833355.340004-0.28157751.7111260.6805562.450002-0.28096351.7112480.00.0-0.28147351.7113080.9777793.520003-0.28098451.7112950.00.0-0.28155151.7113083.23333611.640009-0.28144951.7112000.9194453.310003-0.28137751.7112271.4055575.060004-0.28131551.7111360.0000000.000000-0.28141051.7110542.0916687.530006-0.28094551.7112470.00.0
5512:08:24.72022-02-02ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY-0.28109151.7113860.00.0-0.28112451.7113930.00.0-0.28136251.7108920.9138903.290003-0.28157651.7112601.3000014.680004-0.28127451.7109660.00.0-0.28105751.7113730.00.0-0.28108351.7113500.00.0-0.28096251.7112570.00.0-0.28137851.7112012.0111137.240006-0.28156051.7112580.8361123.010002-0.28101251.7114620.6083342.190002-0.28129251.7110921.4777795.320004-0.28157651.7111260.9277793.340003-0.28096351.7112480.00.0-0.28147351.7113091.0111123.640003-0.28098451.7112950.00.0-0.28154551.7113083.86111413.900011-0.28144951.7112000.8638903.110002-0.28137751.7112280.8583343.090002-0.28131551.7111350.5972232.150002-0.28141151.7110562.1222247.640006-0.28094551.7112470.00.0
6612:08:24.82022-02-02ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY-0.28109151.7113860.00.0-0.28112451.7113930.00.0-0.28136251.7108910.8555563.080002-0.28157551.7112581.6805576.050005-0.28127451.7109670.00.0-0.28105751.7113730.00.0-0.28108351.7113500.00.0-0.28096251.7112570.00.0-0.28137851.7112021.4444465.200004-0.28155951.7112570.7361122.650002-0.28101251.7114620.4277781.540001-0.28129451.7110921.5444465.560004-0.28157451.7111271.2222234.400004-0.28096351.7112480.00.0-0.28147351.7113101.0555563.800003-0.28098351.7112950.00.0-0.28154051.7113063.65278113.150011-0.28144851.7112011.0111123.640003-0.28137651.7112280.9194453.310003-0.28131551.7111350.7472232.690002-0.28141151.7110582.2527808.110006-0.28094551.7112470.00.0
7712:08:24.92022-02-02ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY-0.28109151.7113860.00.0-0.28112451.7113930.00.0-0.28136251.7108900.8611123.100002-0.28157351.7112572.0111137.240006-0.28127451.7109660.00.0-0.28105751.7113730.00.0-0.28108351.7113500.00.0-0.28096251.7112570.00.0-0.28137951.7112021.1222234.040003-0.28155951.7112570.5444451.960002-0.28101251.7114620.0000000.000000-0.28129651.7110921.4944465.380004-0.28157351.7111281.3361124.810004-0.28096351.7112480.00.0-0.28147451.7113111.1444454.120003-0.28098451.7112950.00.0-0.28153651.7113053.25000311.700009-0.28144951.7112010.0000000.000000-0.28137551.7112290.6416672.310002-0.28131451.7111340.7805562.810002-0.28141151.7110592.0333357.320006-0.28094551.7112470.00.0
8812:08:25.02022-02-02ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY-0.28109151.7113860.00.0-0.28112551.7113930.00.0-0.28136251.7108900.7416672.670002-0.28157151.7112562.0777797.480006-0.28127551.7109660.00.0-0.28105751.7113740.00.0-0.28108351.7113500.00.0-0.28096251.7112570.00.0-0.28138151.7112031.3555574.880004-0.28155951.7112570.3611111.300001-0.28101251.7114620.0000000.000000-0.28129951.7110921.5472235.570004-0.28157151.7111291.3611124.900004-0.28096351.7112480.00.0-0.28147551.7113121.0166673.660003-0.28098351.7112950.00.0-0.28153351.7113033.18333611.460009-0.28145051.7112010.6888892.480002-0.28137451.7112301.1805574.250003-0.28131451.7111330.7111122.560002-0.28141151.7110622.3916698.610007-0.28094551.7112470.00.0
9912:08:25.12022-02-02ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY-0.28109151.7113860.00.0-0.28112551.7113930.00.0-0.28136151.7108890.9083343.270003-0.28157051.7112532.2694468.170007-0.28127551.7109660.00.0-0.28105751.7113740.00.0-0.28108351.7113500.00.0-0.28096251.7112570.00.0-0.28138251.7112041.1333344.080003-0.28155951.7112570.3638891.310001-0.28101351.7114610.5805562.090002-0.28130151.7110921.4861125.350004-0.28157051.7111291.1916684.290003-0.28096351.7112480.00.0-0.28147551.7113130.7638892.750002-0.28098351.7112950.00.0-0.28153051.7113013.15000311.340009-0.28145251.7112011.2638904.550004-0.28137351.7112311.3055574.700004-0.28131351.7111330.7194452.590002-0.28141151.7110642.5972249.350007-0.28094451.7112470.00.0
101012:08:25.22022-02-02ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY-0.28109151.7113860.00.0-0.28112551.7113930.00.0-0.28136151.7108881.0777793.880003-0.28156851.7112512.79166910.050008-0.28127551.7109660.00.0-0.28105751.7113740.00.0-0.28108351.7113500.00.0-0.28096251.7112580.00.0-0.28138451.7112031.2472234.490004-0.28156051.7112560.7111122.560002-0.28101451.7114610.8666673.120002-0.28130351.7110921.4166685.100004-0.28156851.7111291.1138904.010003-0.28096351.7112480.00.0-0.28147551.7113130.3666671.320001-0.28098351.7112950.00.0-0.28152851.7112992.6222249.440008-0.28145451.7112021.4861125.350004-0.28137351.7112310.6194452.230002-0.28131351.7111320.8250012.970002-0.28141151.7110662.3694468.530007-0.28094451.7112470.00.0
111112:08:25.32022-02-02ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY-0.28109151.7113860.00.0-0.28112551.7113930.00.0-0.28136051.7108871.2444454.480004-0.28156851.7112492.6277809.460008-0.28127551.7109660.00.0-0.28105751.7113740.00.0-0.28108351.7113510.00.0-0.28096251.7112580.00.0-0.28138651.7112031.3777794.960004-0.28156151.7112550.8916673.210003-0.28101451.7114600.9166673.300003-0.28130451.7110921.2694454.570004-0.28156751.7111301.0055563.620003-0.28096351.7112480.00.0-0.28147551.7113130.0000000.000000-0.28098351.7112950.00.0-0.28152651.7112962.92778010.540008-0.28145751.7112021.5666685.640005-0.28137351.7112310.3861111.390001-0.28131351.7111311.0055563.620003-0.28141251.7110682.78611310.030008-0.28094451.7112470.00.0
121212:08:25.42022-02-02ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY-0.28109151.7113860.00.0-0.28112551.7113920.00.0-0.28135951.7108861.2000014.320003-0.28156751.7112472.4000028.640007-0.28127651.7109660.00.0-0.28105851.7113740.00.0-0.28108351.7113510.00.0-0.28096251.7112580.00.0-0.28138851.7112021.5583355.610004-0.28156251.7112550.8666673.120002-0.28101651.7114591.0972233.950003-0.28130651.7110921.2472234.490004-0.28156851.7111310.9444453.400003-0.28096351.7112480.00.0-0.28147551.7113130.0000000.000000-0.28098351.7112950.00.0-0.28152551.7112933.45833612.450010-0.28146051.7112022.0972247.550006-0.28137351.7112310.3861111.390001-0.28131351.7111301.0777793.880003-0.28141351.7110702.2361138.050006-0.28094451.7112470.00.0
131312:08:25.52022-02-02ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY-0.28109151.7113860.00.0-0.28112551.7113920.00.0-0.28135951.7108850.9361123.370003-0.28156751.7112442.4944468.980007-0.28127651.7109660.00.0-0.28105851.7113740.00.0-0.28108451.7113510.00.0-0.28096251.7112580.00.0-0.28139051.7112021.5388905.540004-0.28156351.7112540.7944452.860002-0.28101751.7114591.1555564.160003-0.28130851.7110911.4388905.180004-0.28157251.7111322.1388917.700006-0.28096351.7112480.00.0-0.28147451.7113130.0000000.000000-0.28098351.7112950.00.0-0.28152351.7112903.46389212.470010-0.28146251.7112021.5722235.660005-0.28137351.7112310.0000000.000000-0.28131351.7111291.1805574.250003-0.28141351.7110721.5916685.730005-0.28094451.7112470.00.0
141412:08:25.62022-02-02ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY-0.28109151.7113860.00.0-0.28112451.7113920.00.0-0.28135951.7108850.4805561.730001-0.28156751.7112422.7027809.730008-0.28127651.7109660.00.0-0.28105851.7113740.00.0-0.28108451.7113510.00.0-0.28096251.7112580.00.0-0.28139251.7112021.1805574.250003-0.28156351.7112530.8388903.020002-0.28101851.7114581.1138904.010003-0.28131051.7110911.3972235.030004-0.28157551.7111332.3277808.380007-0.28096351.7112480.00.0-0.28147451.7113120.4083341.470001-0.28098351.7112950.00.0-0.28152151.7112873.10000211.160009-0.28146351.7112011.0055563.620003-0.28137451.7112310.5000001.800001-0.28131351.7111281.1861124.270003-0.28141451.7110731.7722246.380005-0.28094451.7112470.00.0
151512:08:25.72022-02-02ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY-0.28109151.7113860.00.0-0.28112451.7113920.00.0-0.28135951.7108850.0000000.000000-0.28156651.7112402.4194468.710007-0.28127651.7109660.00.0-0.28105851.7113740.00.0-0.28108451.7113510.00.0-0.28096351.7112580.00.0-0.28139351.7112020.9861123.550003-0.28156451.7112530.9500013.420003-0.28102051.7114581.2805574.610004-0.28131351.7110911.5472235.570004-0.28157751.7111352.2583358.130007-0.28096351.7112480.00.0-0.28147351.7113120.6388892.300002-0.28098351.7112950.00.0-0.28152251.7112852.86111310.300008-0.28146651.7112011.5194465.470004-0.28137651.7112301.0277793.700003-0.28131551.7111271.3500014.860004-0.28141551.7110741.6583355.970005-0.28094451.7112470.00.0
161612:08:25.82022-02-02ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY-0.28109151.7113860.00.0-0.28112451.7113920.00.0-0.28135951.7108860.0000000.000000-0.28156651.7112382.3583358.490007-0.28127651.7109660.00.0-0.28105851.7113740.00.0-0.28108451.7113510.00.0-0.28096351.7112570.00.0-0.28139551.7112011.3361124.810004-0.28156551.7112521.2166684.380004-0.28102251.7114581.4000015.040004-0.28131551.7110901.5083355.430004-0.28158051.7111372.7027809.730008-0.28096351.7112480.00.0-0.28147351.7113110.7444452.680002-0.28098351.7112950.00.0-0.28152351.7112823.31666911.940010-0.28146651.7112000.9000013.240003-0.28137751.7112291.6138905.810005-0.28131651.7111261.4083345.070004-0.28141651.7110751.5638905.630005-0.28094451.7112470.00.0
171712:08:25.92022-02-02ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY-0.28109151.7113860.00.0-0.28112451.7113920.00.0-0.28135851.7108860.4138891.490001-0.28156851.7112362.4250028.730007-0.28127651.7109660.00.0-0.28105851.7113740.00.0-0.28108451.7113510.00.0-0.28096251.7112570.00.0-0.28139651.7112001.4750015.310004-0.28156651.7112511.3500014.860004-0.28102451.7114571.4194465.110004-0.28131751.7110891.4611125.260004-0.28158351.7111382.7250029.810008-0.28096351.7112480.00.0-0.28147251.7113110.6111122.200002-0.28098351.7112950.00.0-0.28152451.7112802.83333610.200008-0.28146751.7112000.6055562.180002-0.28137951.7112272.3666698.520007-0.28131751.7111241.5055575.420004-0.28141751.7110761.0833343.900003-0.28094351.7112470.00.0
181812:08:26.02022-02-02ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY-0.28109151.7113860.00.0-0.28112451.7113920.00.0-0.28135851.7108870.5527781.990002-0.28156951.7112342.6305589.470008-0.28127551.7109650.00.0-0.28105851.7113740.00.0-0.28108451.7113510.00.0-0.28096251.7112570.00.0-0.28139851.7111991.2250014.410004-0.28156751.7112501.4055575.060004-0.28102551.7114571.2111124.360003-0.28131851.7110891.5777795.680005-0.28158851.7111403.39722512.230010-0.28096351.7112480.00.0-0.28147351.7113090.9861123.550003-0.28098351.7112950.00.0-0.28152551.7112782.4638918.870007-0.28146751.7111991.0500013.780003-0.28138051.7112252.3916698.610007-0.28131951.7111241.4388905.180004-0.28141751.7110771.2388904.460004-0.28094351.7112460.00.0
191912:08:26.12022-02-02ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY-0.28109151.7113860.00.0-0.28112451.7113920.00.0-0.28135851.7108870.6166672.220002-0.28157151.7112322.6000029.360007-0.28127551.7109650.00.0-0.28105851.7113740.00.0-0.28108451.7113510.00.0-0.28096251.7112570.00.0-0.28139951.7111991.1083343.990003-0.28156851.7112481.4972235.390004NaNNaNNaNNaN-0.28132051.7110881.6916686.090005NaNNaNNaNNaN-0.28096251.7112480.00.0-0.28147351.7113090.9555563.440003-0.28098351.7112950.00.0-0.28152751.7112762.6722249.620008-0.28146751.7111971.1944454.300003-0.28138251.7112232.2027807.930006-0.28132151.7111231.3694464.930004-0.28141951.7110771.1527794.150003-0.28094351.7112460.00.0
\n", "
" ], "text/plain": [ " Frame Time [s] Date Training Drill \\\n", "0 0 12:08:24.2 2022-02-02 ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY \n", "1 1 12:08:24.3 2022-02-02 ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY \n", "2 2 12:08:24.4 2022-02-02 ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY \n", "3 3 12:08:24.5 2022-02-02 ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY \n", "4 4 12:08:24.6 2022-02-02 ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY \n", "5 5 12:08:24.7 2022-02-02 ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY \n", "6 6 12:08:24.8 2022-02-02 ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY \n", "7 7 12:08:24.9 2022-02-02 ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY \n", "8 8 12:08:25.0 2022-02-02 ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY \n", "9 9 12:08:25.1 2022-02-02 ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY \n", "10 10 12:08:25.2 2022-02-02 ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY \n", "11 11 12:08:25.3 2022-02-02 ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY \n", "12 12 12:08:25.4 2022-02-02 ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY \n", "13 13 12:08:25.5 2022-02-02 ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY \n", "14 14 12:08:25.6 2022-02-02 ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY \n", "15 15 12:08:25.7 2022-02-02 ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY \n", "16 16 12:08:25.8 2022-02-02 ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY \n", "17 17 12:08:25.9 2022-02-02 ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY \n", "18 18 12:08:26.0 2022-02-02 ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY \n", "19 19 12:08:26.1 2022-02-02 ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY \n", "\n", " Ngakia_x Ngakia_y Ngakia Speed (m/s) Ngakia Speed (km/h) Cathcart_x \\\n", "0 -0.281091 51.711385 0.0 0.0 -0.281124 \n", "1 -0.281091 51.711385 0.0 0.0 -0.281125 \n", "2 -0.281091 51.711385 0.0 0.0 -0.281124 \n", "3 -0.281091 51.711385 0.0 0.0 -0.281124 \n", "4 -0.281091 51.711386 0.0 0.0 -0.281124 \n", "5 -0.281091 51.711386 0.0 0.0 -0.281124 \n", "6 -0.281091 51.711386 0.0 0.0 -0.281124 \n", "7 -0.281091 51.711386 0.0 0.0 -0.281124 \n", "8 -0.281091 51.711386 0.0 0.0 -0.281125 \n", "9 -0.281091 51.711386 0.0 0.0 -0.281125 \n", "10 -0.281091 51.711386 0.0 0.0 -0.281125 \n", "11 -0.281091 51.711386 0.0 0.0 -0.281125 \n", "12 -0.281091 51.711386 0.0 0.0 -0.281125 \n", "13 -0.281091 51.711386 0.0 0.0 -0.281125 \n", "14 -0.281091 51.711386 0.0 0.0 -0.281124 \n", "15 -0.281091 51.711386 0.0 0.0 -0.281124 \n", "16 -0.281091 51.711386 0.0 0.0 -0.281124 \n", "17 -0.281091 51.711386 0.0 0.0 -0.281124 \n", "18 -0.281091 51.711386 0.0 0.0 -0.281124 \n", "19 -0.281091 51.711386 0.0 0.0 -0.281124 \n", "\n", " Cathcart_y Cathcart Speed (m/s) Cathcart Speed (km/h) Etebo_x \\\n", "0 51.711393 0.0 0.0 -0.281362 \n", "1 51.711393 0.0 0.0 -0.281362 \n", "2 51.711393 0.0 0.0 -0.281362 \n", "3 51.711393 0.0 0.0 -0.281362 \n", "4 51.711393 0.0 0.0 -0.281362 \n", "5 51.711393 0.0 0.0 -0.281362 \n", "6 51.711393 0.0 0.0 -0.281362 \n", "7 51.711393 0.0 0.0 -0.281362 \n", "8 51.711393 0.0 0.0 -0.281362 \n", "9 51.711393 0.0 0.0 -0.281361 \n", "10 51.711393 0.0 0.0 -0.281361 \n", "11 51.711393 0.0 0.0 -0.281360 \n", "12 51.711392 0.0 0.0 -0.281359 \n", "13 51.711392 0.0 0.0 -0.281359 \n", "14 51.711392 0.0 0.0 -0.281359 \n", "15 51.711392 0.0 0.0 -0.281359 \n", "16 51.711392 0.0 0.0 -0.281359 \n", "17 51.711392 0.0 0.0 -0.281358 \n", "18 51.711392 0.0 0.0 -0.281358 \n", "19 51.711392 0.0 0.0 -0.281358 \n", "\n", " Etebo_y Etebo Speed (m/s) Etebo Speed (km/h) Dennis_x Dennis_y \\\n", "0 51.710896 1.055556 3.800003 -0.281581 51.711263 \n", "1 51.710895 1.022223 3.680003 -0.281580 51.711263 \n", "2 51.710894 0.950001 3.420003 -0.281579 51.711263 \n", "3 51.710893 0.975001 3.510003 -0.281578 51.711262 \n", "4 51.710892 0.913890 3.290003 -0.281577 51.711261 \n", "5 51.710892 0.913890 3.290003 -0.281576 51.711260 \n", "6 51.710891 0.855556 3.080002 -0.281575 51.711258 \n", "7 51.710890 0.861112 3.100002 -0.281573 51.711257 \n", "8 51.710890 0.741667 2.670002 -0.281571 51.711256 \n", "9 51.710889 0.908334 3.270003 -0.281570 51.711253 \n", "10 51.710888 1.077779 3.880003 -0.281568 51.711251 \n", "11 51.710887 1.244445 4.480004 -0.281568 51.711249 \n", "12 51.710886 1.200001 4.320003 -0.281567 51.711247 \n", "13 51.710885 0.936112 3.370003 -0.281567 51.711244 \n", "14 51.710885 0.480556 1.730001 -0.281567 51.711242 \n", "15 51.710885 0.000000 0.000000 -0.281566 51.711240 \n", "16 51.710886 0.000000 0.000000 -0.281566 51.711238 \n", "17 51.710886 0.413889 1.490001 -0.281568 51.711236 \n", "18 51.710887 0.552778 1.990002 -0.281569 51.711234 \n", "19 51.710887 0.616667 2.220002 -0.281571 51.711232 \n", "\n", " Dennis Speed (m/s) Dennis Speed (km/h) Kayembe_x Kayembe_y \\\n", "0 2.361113 8.500007 -0.281273 51.710967 \n", "1 1.075001 3.870003 -0.281273 51.710967 \n", "2 0.733334 2.640002 -0.281273 51.710966 \n", "3 0.847223 3.050002 -0.281273 51.710966 \n", "4 0.872223 3.140003 -0.281274 51.710966 \n", "5 1.300001 4.680004 -0.281274 51.710966 \n", "6 1.680557 6.050005 -0.281274 51.710967 \n", "7 2.011113 7.240006 -0.281274 51.710966 \n", "8 2.077779 7.480006 -0.281275 51.710966 \n", "9 2.269446 8.170007 -0.281275 51.710966 \n", "10 2.791669 10.050008 -0.281275 51.710966 \n", "11 2.627780 9.460008 -0.281275 51.710966 \n", "12 2.400002 8.640007 -0.281276 51.710966 \n", "13 2.494446 8.980007 -0.281276 51.710966 \n", "14 2.702780 9.730008 -0.281276 51.710966 \n", "15 2.419446 8.710007 -0.281276 51.710966 \n", "16 2.358335 8.490007 -0.281276 51.710966 \n", "17 2.425002 8.730007 -0.281276 51.710966 \n", "18 2.630558 9.470008 -0.281275 51.710965 \n", "19 2.600002 9.360007 -0.281275 51.710965 \n", "\n", " Kayembe Speed (m/s) Kayembe Speed (km/h) Baah_x Baah_y \\\n", "0 0.0 0.0 -0.281057 51.711373 \n", "1 0.0 0.0 -0.281057 51.711373 \n", "2 0.0 0.0 -0.281057 51.711373 \n", "3 0.0 0.0 -0.281057 51.711373 \n", "4 0.0 0.0 -0.281057 51.711373 \n", "5 0.0 0.0 -0.281057 51.711373 \n", "6 0.0 0.0 -0.281057 51.711373 \n", "7 0.0 0.0 -0.281057 51.711373 \n", "8 0.0 0.0 -0.281057 51.711374 \n", "9 0.0 0.0 -0.281057 51.711374 \n", "10 0.0 0.0 -0.281057 51.711374 \n", "11 0.0 0.0 -0.281057 51.711374 \n", "12 0.0 0.0 -0.281058 51.711374 \n", "13 0.0 0.0 -0.281058 51.711374 \n", "14 0.0 0.0 -0.281058 51.711374 \n", "15 0.0 0.0 -0.281058 51.711374 \n", "16 0.0 0.0 -0.281058 51.711374 \n", "17 0.0 0.0 -0.281058 51.711374 \n", "18 0.0 0.0 -0.281058 51.711374 \n", "19 0.0 0.0 -0.281058 51.711374 \n", "\n", " Baah Speed (m/s) Baah Speed (km/h) Sierralta_x Sierralta_y \\\n", "0 0.0 0.0 -0.281083 51.711350 \n", "1 0.0 0.0 -0.281083 51.711350 \n", "2 0.0 0.0 -0.281083 51.711350 \n", "3 0.0 0.0 -0.281083 51.711350 \n", "4 0.0 0.0 -0.281083 51.711350 \n", "5 0.0 0.0 -0.281083 51.711350 \n", "6 0.0 0.0 -0.281083 51.711350 \n", "7 0.0 0.0 -0.281083 51.711350 \n", "8 0.0 0.0 -0.281083 51.711350 \n", "9 0.0 0.0 -0.281083 51.711350 \n", "10 0.0 0.0 -0.281083 51.711350 \n", "11 0.0 0.0 -0.281083 51.711351 \n", "12 0.0 0.0 -0.281083 51.711351 \n", "13 0.0 0.0 -0.281084 51.711351 \n", "14 0.0 0.0 -0.281084 51.711351 \n", "15 0.0 0.0 -0.281084 51.711351 \n", "16 0.0 0.0 -0.281084 51.711351 \n", "17 0.0 0.0 -0.281084 51.711351 \n", "18 0.0 0.0 -0.281084 51.711351 \n", "19 0.0 0.0 -0.281084 51.711351 \n", "\n", " Sierralta Speed (m/s) Sierralta Speed (km/h) Ekong_x Ekong_y \\\n", "0 0.0 0.0 -0.280962 51.711257 \n", "1 0.0 0.0 -0.280962 51.711257 \n", "2 0.0 0.0 -0.280962 51.711257 \n", "3 0.0 0.0 -0.280962 51.711257 \n", "4 0.0 0.0 -0.280962 51.711257 \n", "5 0.0 0.0 -0.280962 51.711257 \n", "6 0.0 0.0 -0.280962 51.711257 \n", "7 0.0 0.0 -0.280962 51.711257 \n", "8 0.0 0.0 -0.280962 51.711257 \n", "9 0.0 0.0 -0.280962 51.711257 \n", "10 0.0 0.0 -0.280962 51.711258 \n", "11 0.0 0.0 -0.280962 51.711258 \n", "12 0.0 0.0 -0.280962 51.711258 \n", "13 0.0 0.0 -0.280962 51.711258 \n", "14 0.0 0.0 -0.280962 51.711258 \n", "15 0.0 0.0 -0.280963 51.711258 \n", "16 0.0 0.0 -0.280963 51.711257 \n", "17 0.0 0.0 -0.280962 51.711257 \n", "18 0.0 0.0 -0.280962 51.711257 \n", "19 0.0 0.0 -0.280962 51.711257 \n", "\n", " Ekong Speed (m/s) Ekong Speed (km/h) King_x King_y \\\n", "0 0.0 0.0 -0.281370 51.711195 \n", "1 0.0 0.0 -0.281372 51.711195 \n", "2 0.0 0.0 -0.281374 51.711196 \n", "3 0.0 0.0 -0.281376 51.711197 \n", "4 0.0 0.0 -0.281377 51.711199 \n", "5 0.0 0.0 -0.281378 51.711201 \n", "6 0.0 0.0 -0.281378 51.711202 \n", "7 0.0 0.0 -0.281379 51.711202 \n", "8 0.0 0.0 -0.281381 51.711203 \n", "9 0.0 0.0 -0.281382 51.711204 \n", "10 0.0 0.0 -0.281384 51.711203 \n", "11 0.0 0.0 -0.281386 51.711203 \n", "12 0.0 0.0 -0.281388 51.711202 \n", "13 0.0 0.0 -0.281390 51.711202 \n", "14 0.0 0.0 -0.281392 51.711202 \n", "15 0.0 0.0 -0.281393 51.711202 \n", "16 0.0 0.0 -0.281395 51.711201 \n", "17 0.0 0.0 -0.281396 51.711200 \n", "18 0.0 0.0 -0.281398 51.711199 \n", "19 0.0 0.0 -0.281399 51.711199 \n", "\n", " King Speed (m/s) King Speed (km/h) Kucka_x Kucka_y \\\n", "0 1.927779 6.940006 -0.281566 51.711257 \n", "1 1.863890 6.710005 -0.281564 51.711257 \n", "2 1.863890 6.710005 -0.281564 51.711258 \n", "3 1.491668 5.370004 -0.281562 51.711257 \n", "4 1.772224 6.380005 -0.281562 51.711258 \n", "5 2.011113 7.240006 -0.281560 51.711258 \n", "6 1.444446 5.200004 -0.281559 51.711257 \n", "7 1.122223 4.040003 -0.281559 51.711257 \n", "8 1.355557 4.880004 -0.281559 51.711257 \n", "9 1.133334 4.080003 -0.281559 51.711257 \n", "10 1.247223 4.490004 -0.281560 51.711256 \n", "11 1.377779 4.960004 -0.281561 51.711255 \n", "12 1.558335 5.610004 -0.281562 51.711255 \n", "13 1.538890 5.540004 -0.281563 51.711254 \n", "14 1.180557 4.250003 -0.281563 51.711253 \n", "15 0.986112 3.550003 -0.281564 51.711253 \n", "16 1.336112 4.810004 -0.281565 51.711252 \n", "17 1.475001 5.310004 -0.281566 51.711251 \n", "18 1.225001 4.410004 -0.281567 51.711250 \n", "19 1.108334 3.990003 -0.281568 51.711248 \n", "\n", " Kucka Speed (m/s) Kucka Speed (km/h) Kamara_x Kamara_y \\\n", "0 2.025002 7.290006 -0.281005 51.711463 \n", "1 1.175001 4.230003 -0.281006 51.711462 \n", "2 0.841667 3.030002 -0.281008 51.711462 \n", "3 0.786112 2.830002 -0.281010 51.711462 \n", "4 0.675001 2.430002 -0.281011 51.711462 \n", "5 0.836112 3.010002 -0.281012 51.711462 \n", "6 0.736112 2.650002 -0.281012 51.711462 \n", "7 0.544445 1.960002 -0.281012 51.711462 \n", "8 0.361111 1.300001 -0.281012 51.711462 \n", "9 0.363889 1.310001 -0.281013 51.711461 \n", "10 0.711112 2.560002 -0.281014 51.711461 \n", "11 0.891667 3.210003 -0.281014 51.711460 \n", "12 0.866667 3.120002 -0.281016 51.711459 \n", "13 0.794445 2.860002 -0.281017 51.711459 \n", "14 0.838890 3.020002 -0.281018 51.711458 \n", "15 0.950001 3.420003 -0.281020 51.711458 \n", "16 1.216668 4.380004 -0.281022 51.711458 \n", "17 1.350001 4.860004 -0.281024 51.711457 \n", "18 1.405557 5.060004 -0.281025 51.711457 \n", "19 1.497223 5.390004 NaN NaN \n", "\n", " Kamara Speed (m/s) Kamara Speed (km/h) Fletcher_x Fletcher_y \\\n", "0 0.558334 2.010002 -0.281284 51.711088 \n", "1 0.852778 3.070002 -0.281285 51.711089 \n", "2 1.019445 3.670003 -0.281287 51.711089 \n", "3 1.294445 4.660004 -0.281288 51.711090 \n", "4 1.016667 3.660003 -0.281290 51.711091 \n", "5 0.608334 2.190002 -0.281292 51.711092 \n", "6 0.427778 1.540001 -0.281294 51.711092 \n", "7 0.000000 0.000000 -0.281296 51.711092 \n", "8 0.000000 0.000000 -0.281299 51.711092 \n", "9 0.580556 2.090002 -0.281301 51.711092 \n", "10 0.866667 3.120002 -0.281303 51.711092 \n", "11 0.916667 3.300003 -0.281304 51.711092 \n", "12 1.097223 3.950003 -0.281306 51.711092 \n", "13 1.155556 4.160003 -0.281308 51.711091 \n", "14 1.113890 4.010003 -0.281310 51.711091 \n", "15 1.280557 4.610004 -0.281313 51.711091 \n", "16 1.400001 5.040004 -0.281315 51.711090 \n", "17 1.419446 5.110004 -0.281317 51.711089 \n", "18 1.211112 4.360003 -0.281318 51.711089 \n", "19 NaN NaN -0.281320 51.711088 \n", "\n", " Fletcher Speed (m/s) Fletcher Speed (km/h) Louza_x Louza_y \\\n", "0 1.305557 4.700004 -0.281582 51.711126 \n", "1 1.261112 4.540004 -0.281581 51.711126 \n", "2 1.352779 4.870004 -0.281579 51.711126 \n", "3 1.433334 5.160004 -0.281578 51.711126 \n", "4 1.483335 5.340004 -0.281577 51.711126 \n", "5 1.477779 5.320004 -0.281576 51.711126 \n", "6 1.544446 5.560004 -0.281574 51.711127 \n", "7 1.494446 5.380004 -0.281573 51.711128 \n", "8 1.547223 5.570004 -0.281571 51.711129 \n", "9 1.486112 5.350004 -0.281570 51.711129 \n", "10 1.416668 5.100004 -0.281568 51.711129 \n", "11 1.269445 4.570004 -0.281567 51.711130 \n", "12 1.247223 4.490004 -0.281568 51.711131 \n", "13 1.438890 5.180004 -0.281572 51.711132 \n", "14 1.397223 5.030004 -0.281575 51.711133 \n", "15 1.547223 5.570004 -0.281577 51.711135 \n", "16 1.508335 5.430004 -0.281580 51.711137 \n", "17 1.461112 5.260004 -0.281583 51.711138 \n", "18 1.577779 5.680005 -0.281588 51.711140 \n", "19 1.691668 6.090005 NaN NaN \n", "\n", " Louza Speed (m/s) Louza Speed (km/h) Gosling_x Gosling_y \\\n", "0 1.575001 5.670005 -0.280963 51.711248 \n", "1 1.377779 4.960004 -0.280963 51.711248 \n", "2 1.047223 3.770003 -0.280963 51.711248 \n", "3 0.891667 3.210003 -0.280963 51.711248 \n", "4 0.680556 2.450002 -0.280963 51.711248 \n", "5 0.927779 3.340003 -0.280963 51.711248 \n", "6 1.222223 4.400004 -0.280963 51.711248 \n", "7 1.336112 4.810004 -0.280963 51.711248 \n", "8 1.361112 4.900004 -0.280963 51.711248 \n", "9 1.191668 4.290003 -0.280963 51.711248 \n", "10 1.113890 4.010003 -0.280963 51.711248 \n", "11 1.005556 3.620003 -0.280963 51.711248 \n", "12 0.944445 3.400003 -0.280963 51.711248 \n", "13 2.138891 7.700006 -0.280963 51.711248 \n", "14 2.327780 8.380007 -0.280963 51.711248 \n", "15 2.258335 8.130007 -0.280963 51.711248 \n", "16 2.702780 9.730008 -0.280963 51.711248 \n", "17 2.725002 9.810008 -0.280963 51.711248 \n", "18 3.397225 12.230010 -0.280963 51.711248 \n", "19 NaN NaN -0.280962 51.711248 \n", "\n", " Gosling Speed (m/s) Gosling Speed (km/h) Femenia_x Femenia_y \\\n", "0 0.0 0.0 -0.281478 51.711305 \n", "1 0.0 0.0 -0.281477 51.711306 \n", "2 0.0 0.0 -0.281476 51.711307 \n", "3 0.0 0.0 -0.281474 51.711308 \n", "4 0.0 0.0 -0.281473 51.711308 \n", "5 0.0 0.0 -0.281473 51.711309 \n", "6 0.0 0.0 -0.281473 51.711310 \n", "7 0.0 0.0 -0.281474 51.711311 \n", "8 0.0 0.0 -0.281475 51.711312 \n", "9 0.0 0.0 -0.281475 51.711313 \n", "10 0.0 0.0 -0.281475 51.711313 \n", "11 0.0 0.0 -0.281475 51.711313 \n", "12 0.0 0.0 -0.281475 51.711313 \n", "13 0.0 0.0 -0.281474 51.711313 \n", "14 0.0 0.0 -0.281474 51.711312 \n", "15 0.0 0.0 -0.281473 51.711312 \n", "16 0.0 0.0 -0.281473 51.711311 \n", "17 0.0 0.0 -0.281472 51.711311 \n", "18 0.0 0.0 -0.281473 51.711309 \n", "19 0.0 0.0 -0.281473 51.711309 \n", "\n", " Femenia Speed (m/s) Femenia Speed (km/h) Samir_x Samir_y \\\n", "0 1.105556 3.980003 -0.280984 51.711295 \n", "1 0.961112 3.460003 -0.280984 51.711295 \n", "2 1.566668 5.640005 -0.280984 51.711295 \n", "3 1.252779 4.510004 -0.280984 51.711295 \n", "4 0.977779 3.520003 -0.280984 51.711295 \n", "5 1.011112 3.640003 -0.280984 51.711295 \n", "6 1.055556 3.800003 -0.280983 51.711295 \n", "7 1.144445 4.120003 -0.280984 51.711295 \n", "8 1.016667 3.660003 -0.280983 51.711295 \n", "9 0.763889 2.750002 -0.280983 51.711295 \n", "10 0.366667 1.320001 -0.280983 51.711295 \n", "11 0.000000 0.000000 -0.280983 51.711295 \n", "12 0.000000 0.000000 -0.280983 51.711295 \n", "13 0.000000 0.000000 -0.280983 51.711295 \n", "14 0.408334 1.470001 -0.280983 51.711295 \n", "15 0.638889 2.300002 -0.280983 51.711295 \n", "16 0.744445 2.680002 -0.280983 51.711295 \n", "17 0.611112 2.200002 -0.280983 51.711295 \n", "18 0.986112 3.550003 -0.280983 51.711295 \n", "19 0.955556 3.440003 -0.280983 51.711295 \n", "\n", " Samir Speed (m/s) Samir Speed (km/h) Joao Pedro_x Joao Pedro_y \\\n", "0 0.0 0.0 -0.281566 51.711311 \n", "1 0.0 0.0 -0.281564 51.711310 \n", "2 0.0 0.0 -0.281560 51.711309 \n", "3 0.0 0.0 -0.281555 51.711308 \n", "4 0.0 0.0 -0.281551 51.711308 \n", "5 0.0 0.0 -0.281545 51.711308 \n", "6 0.0 0.0 -0.281540 51.711306 \n", "7 0.0 0.0 -0.281536 51.711305 \n", "8 0.0 0.0 -0.281533 51.711303 \n", "9 0.0 0.0 -0.281530 51.711301 \n", "10 0.0 0.0 -0.281528 51.711299 \n", "11 0.0 0.0 -0.281526 51.711296 \n", "12 0.0 0.0 -0.281525 51.711293 \n", "13 0.0 0.0 -0.281523 51.711290 \n", "14 0.0 0.0 -0.281521 51.711287 \n", "15 0.0 0.0 -0.281522 51.711285 \n", "16 0.0 0.0 -0.281523 51.711282 \n", "17 0.0 0.0 -0.281524 51.711280 \n", "18 0.0 0.0 -0.281525 51.711278 \n", "19 0.0 0.0 -0.281527 51.711276 \n", "\n", " Joao Pedro Speed (m/s) Joao Pedro Speed (km/h) Sissoko_x Sissoko_y \\\n", "0 1.950002 7.020006 -0.281447 51.711196 \n", "1 2.183335 7.860006 -0.281448 51.711197 \n", "2 2.572224 9.260007 -0.281449 51.711198 \n", "3 3.047225 10.970009 -0.281449 51.711199 \n", "4 3.233336 11.640009 -0.281449 51.711200 \n", "5 3.861114 13.900011 -0.281449 51.711200 \n", "6 3.652781 13.150011 -0.281448 51.711201 \n", "7 3.250003 11.700009 -0.281449 51.711201 \n", "8 3.183336 11.460009 -0.281450 51.711201 \n", "9 3.150003 11.340009 -0.281452 51.711201 \n", "10 2.622224 9.440008 -0.281454 51.711202 \n", "11 2.927780 10.540008 -0.281457 51.711202 \n", "12 3.458336 12.450010 -0.281460 51.711202 \n", "13 3.463892 12.470010 -0.281462 51.711202 \n", "14 3.100002 11.160009 -0.281463 51.711201 \n", "15 2.861113 10.300008 -0.281466 51.711201 \n", "16 3.316669 11.940010 -0.281466 51.711200 \n", "17 2.833336 10.200008 -0.281467 51.711200 \n", "18 2.463891 8.870007 -0.281467 51.711199 \n", "19 2.672224 9.620008 -0.281467 51.711197 \n", "\n", " Sissoko Speed (m/s) Sissoko Speed (km/h) Kabasele_x Kabasele_y \\\n", "0 1.438890 5.180004 -0.281382 51.711224 \n", "1 1.466668 5.280004 -0.281381 51.711224 \n", "2 0.975001 3.510003 -0.281379 51.711225 \n", "3 0.950001 3.420003 -0.281378 51.711226 \n", "4 0.919445 3.310003 -0.281377 51.711227 \n", "5 0.863890 3.110002 -0.281377 51.711228 \n", "6 1.011112 3.640003 -0.281376 51.711228 \n", "7 0.000000 0.000000 -0.281375 51.711229 \n", "8 0.688889 2.480002 -0.281374 51.711230 \n", "9 1.263890 4.550004 -0.281373 51.711231 \n", "10 1.486112 5.350004 -0.281373 51.711231 \n", "11 1.566668 5.640005 -0.281373 51.711231 \n", "12 2.097224 7.550006 -0.281373 51.711231 \n", "13 1.572223 5.660005 -0.281373 51.711231 \n", "14 1.005556 3.620003 -0.281374 51.711231 \n", "15 1.519446 5.470004 -0.281376 51.711230 \n", "16 0.900001 3.240003 -0.281377 51.711229 \n", "17 0.605556 2.180002 -0.281379 51.711227 \n", "18 1.050001 3.780003 -0.281380 51.711225 \n", "19 1.194445 4.300003 -0.281382 51.711223 \n", "\n", " Kabasele Speed (m/s) Kabasele Speed (km/h) Masina_x Masina_y \\\n", "0 0.741667 2.670002 -0.281316 51.711136 \n", "1 0.633334 2.280002 -0.281316 51.711136 \n", "2 1.480557 5.330004 -0.281316 51.711136 \n", "3 1.597224 5.750005 -0.281316 51.711136 \n", "4 1.405557 5.060004 -0.281315 51.711136 \n", "5 0.858334 3.090002 -0.281315 51.711135 \n", "6 0.919445 3.310003 -0.281315 51.711135 \n", "7 0.641667 2.310002 -0.281314 51.711134 \n", "8 1.180557 4.250003 -0.281314 51.711133 \n", "9 1.305557 4.700004 -0.281313 51.711133 \n", "10 0.619445 2.230002 -0.281313 51.711132 \n", "11 0.386111 1.390001 -0.281313 51.711131 \n", "12 0.386111 1.390001 -0.281313 51.711130 \n", "13 0.000000 0.000000 -0.281313 51.711129 \n", "14 0.500000 1.800001 -0.281313 51.711128 \n", "15 1.027779 3.700003 -0.281315 51.711127 \n", "16 1.613890 5.810005 -0.281316 51.711126 \n", "17 2.366669 8.520007 -0.281317 51.711124 \n", "18 2.391669 8.610007 -0.281319 51.711124 \n", "19 2.202780 7.930006 -0.281321 51.711123 \n", "\n", " Masina Speed (m/s) Masina Speed (km/h) Kalu_x Kalu_y \\\n", "0 0.000000 0.000000 -0.281410 51.711047 \n", "1 0.000000 0.000000 -0.281410 51.711048 \n", "2 0.000000 0.000000 -0.281410 51.711050 \n", "3 0.000000 0.000000 -0.281410 51.711052 \n", "4 0.000000 0.000000 -0.281410 51.711054 \n", "5 0.597223 2.150002 -0.281411 51.711056 \n", "6 0.747223 2.690002 -0.281411 51.711058 \n", "7 0.780556 2.810002 -0.281411 51.711059 \n", "8 0.711112 2.560002 -0.281411 51.711062 \n", "9 0.719445 2.590002 -0.281411 51.711064 \n", "10 0.825001 2.970002 -0.281411 51.711066 \n", "11 1.005556 3.620003 -0.281412 51.711068 \n", "12 1.077779 3.880003 -0.281413 51.711070 \n", "13 1.180557 4.250003 -0.281413 51.711072 \n", "14 1.186112 4.270003 -0.281414 51.711073 \n", "15 1.350001 4.860004 -0.281415 51.711074 \n", "16 1.408334 5.070004 -0.281416 51.711075 \n", "17 1.505557 5.420004 -0.281417 51.711076 \n", "18 1.438890 5.180004 -0.281417 51.711077 \n", "19 1.369446 4.930004 -0.281419 51.711077 \n", "\n", " Kalu Speed (m/s) Kalu Speed (km/h) Sema_x Sema_y \\\n", "0 1.594446 5.740005 -0.280945 51.711247 \n", "1 1.577779 5.680005 -0.280945 51.711247 \n", "2 1.472223 5.300004 -0.280945 51.711247 \n", "3 2.119446 7.630006 -0.280945 51.711247 \n", "4 2.091668 7.530006 -0.280945 51.711247 \n", "5 2.122224 7.640006 -0.280945 51.711247 \n", "6 2.252780 8.110006 -0.280945 51.711247 \n", "7 2.033335 7.320006 -0.280945 51.711247 \n", "8 2.391669 8.610007 -0.280945 51.711247 \n", "9 2.597224 9.350007 -0.280944 51.711247 \n", "10 2.369446 8.530007 -0.280944 51.711247 \n", "11 2.786113 10.030008 -0.280944 51.711247 \n", "12 2.236113 8.050006 -0.280944 51.711247 \n", "13 1.591668 5.730005 -0.280944 51.711247 \n", "14 1.772224 6.380005 -0.280944 51.711247 \n", "15 1.658335 5.970005 -0.280944 51.711247 \n", "16 1.563890 5.630005 -0.280944 51.711247 \n", "17 1.083334 3.900003 -0.280943 51.711247 \n", "18 1.238890 4.460004 -0.280943 51.711246 \n", "19 1.152779 4.150003 -0.280943 51.711246 \n", "\n", " Sema Speed (m/s) Sema Speed (km/h) \n", "0 0.0 0.0 \n", "1 0.0 0.0 \n", "2 0.0 0.0 \n", "3 0.0 0.0 \n", "4 0.0 0.0 \n", "5 0.0 0.0 \n", "6 0.0 0.0 \n", "7 0.0 0.0 \n", "8 0.0 0.0 \n", "9 0.0 0.0 \n", "10 0.0 0.0 \n", "11 0.0 0.0 \n", "12 0.0 0.0 \n", "13 0.0 0.0 \n", "14 0.0 0.0 \n", "15 0.0 0.0 \n", "16 0.0 0.0 \n", "17 0.0 0.0 \n", "18 0.0 0.0 \n", "19 0.0 0.0 " ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_training_attack_vs_defence_attack_superiority_pvt.head(20)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "### 4.4. Calculate Speed, Distance, and Acceleration" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [], "source": [ "# Define function for calculating the velocities and accelerations of the training data using the x, y locations and timestep\n", "def calc_player_velocities_accelerations(df, date='2022-02-02', training_drill='NOT-DEFINED', smoothing_v=True, smoothing_a=True, filter_='moving_average', window=7, polyorder=1, maxspeed=12, dt=0.1):\n", " \"\"\" calc_player_velocities_accelerations( training data )\n", " \n", " Calculate player velocities in x & y direction, and total player speed at each timestamp of the tracking data\n", " \n", " Parameters\n", " -----------\n", " df: the tracking DataFrame\n", " smoothing_v: boolean variable that determines whether velocity measures are smoothed. Default is True.\n", " filter: type of filter to use when smoothing_v the velocities. Default is Savitzky-Golay, which fits a polynomial of order 'polyorder' to the data within each window\n", " window: smoothing_v window size in # of frames\n", " polyorder: order of the polynomial for the Savitzky-Golay filter. Default is 1 - a linear fit to the velcoity, so gradient is the acceleration\n", " maxspeed: the maximum speed that a player can realisitically achieve (in meters/second). Speed measures that exceed maxspeed are tagged as outliers and set to NaN. \n", " \n", " Returns\n", " -----------\n", " df : the tracking DataFrame with columns for speed in the x & y direction and total speed added\n", "\n", " \"\"\"\n", " \n", " ## Read in exported CSV file if exists, if not, download the latest JSON data\n", " if not os.path.exists(os.path.join(data_dir_physical, 'engineered', 'Set 2', '4_modified_individual_training_sessions_dataset', f'{date}-{training_drill}-MOVEMENT-SPEED-ACCELERATION-TRAINING-DATA-ALL-PLAYERS.csv')):\n", " \n", " \n", " ### Start timer\n", " tic = datetime.datetime.now()\n", "\n", " \n", " ### Print time of engineering of tracking data started\n", " print(f'Calculation of each player\\'s speed and accelerations for the {training_drill} started at: {tic}') \n", " \n", " \n", " # Create columns\n", " #df['Date Time [s]'] = pd.to_datetime(df['Date'] + ' ' + df['Time [s]'])\n", " df['Period'] = 1\n", "\n", " # remove any velocity data already in the dataframe\n", " df = remove_player_velocities_accelerations(df)\n", "\n", " # Get the player ids\n", " player_ids = [col for col in df.columns if '_x' in col]\n", " player_ids = [s.replace('_x', '') for s in player_ids]\n", "\n", " # Calculate the timestep from one frame to the next - not required.\n", " #dt = df['Time [s]'].diff()\n", " #dt = df['Date Time [s]'].diff()\n", "\n", " # index of first frame in second half\n", " #second_half_idx = df.Period.idxmax(2)\n", " second_half_idx = df[df.Period == 2].first_valid_index()\n", "\n", " # estimate velocities for players in df\n", " for player in player_ids: # cycle through players individually\n", " # difference player positions in timestep dt to get unsmoothed estimate of velicity\n", " vx = df[player + '_x'].diff() / dt\n", " vy = df[player + '_y'].diff() / dt\n", "\n", " if maxspeed>0:\n", " # remove unsmoothed data points that exceed the maximum speed (these are most likely position errors)\n", " raw_speed = np.sqrt( vx**2 + vy**2 )\n", " #acceleration = raw_speed.diff() / dt\n", " vx[ raw_speed>maxspeed ] = np.nan\n", " vy[ raw_speed>maxspeed ] = np.nan\n", " #if maxacc>0:\n", " #ax[ raw_acc>maxacc ] = np.nan\n", " #ay[ raw_acc>maxacc ] = np.nan\n", " if smoothing_v:\n", " if filter_=='Savitzky-Golay':\n", " # calculate first half velocity\n", " vx.loc[:second_half_idx] = signal.savgol_filter(vx.loc[:second_half_idx],window_length=window,polyorder=polyorder)\n", " vy.loc[:second_half_idx] = signal.savgol_filter(vy.loc[:second_half_idx],window_length=window,polyorder=polyorder) \n", " # calculate second half velocity\n", " vx.loc[second_half_idx:] = signal.savgol_filter(vx.loc[second_half_idx:],window_length=window,polyorder=polyorder)\n", " vy.loc[second_half_idx:] = signal.savgol_filter(vy.loc[second_half_idx:],window_length=window,polyorder=polyorder)\n", " elif filter_=='moving average':\n", " ma_window = np.ones( window ) / window \n", " # calculate first half velocity\n", " vx.loc[:second_half_idx] = np.convolve( vx.loc[:second_half_idx], ma_window, mode='same') \n", " vy.loc[:second_half_idx] = np.convolve( vy.loc[:second_half_idx], ma_window, mode='same') \n", " # calculate second half velocity\n", " vx.loc[second_half_idx:] = np.convolve( vx.loc[second_half_idx:], ma_window, mode='same') \n", " vy.loc[second_half_idx:] = np.convolve( vy.loc[second_half_idx:], ma_window, mode='same') \n", " #speed = ( vx**2 + vy**2 )**.5\n", " #acceleration = np.diff(speed) / dt\n", " #ax = np.convolve( ax, ma_window, mode='same' ) \n", " #ay = np.convolve( ay, ma_window, mode='same' ) \n", " # put player speed in x, y direction, and total speed back in the data frame\n", "\n", " # put player speed in x, y direction, and total speed back in the data frame\n", " df[player + '_vx'] = vx\n", " df[player + '_vy'] = vy\n", " df[player + '_speed'] = np.sqrt(vx**2 + vy**2)\n", " #df[player + '_ax'] = ax\n", " #df[player + '_ay'] = ay\n", " #df[player + '_rawspeed'] = raw_speed\n", " #df[player + '_rawacc'] = raw_acc\n", " df[player + '_speed'] = np.sqrt(vx**2 + vy**2)\n", " # Calculate acceleration - method 1, using speed calculated\n", " #acceleration = df[player + '_speed'].diff() / dt\n", " #df[player + '_acceleration'] = acceleration\n", " # Calculate acceleration - method 2, using speed provided\n", " acceleration = df[player + ' Speed (m/s)'].diff() / dt\n", " #acceleration = (df[player + ' Speed (m/s)'] - df[player + ' Speed (m/s)'].shift()) / 0.1\n", " df[player + ' Acceleration (m/s/s)'] = acceleration \n", " if smoothing_a:\n", " ma_window = np.ones( window ) / window \n", " df[player + ' Acceleration (m/s/s)'] = np.convolve( acceleration, ma_window, mode='same') \n", " \n", " \n", " ### Save DataFrame\n", "\n", " #### Define filename for each combined file to be saved\n", " save_filename = f'{date}-{training_drill}-MOVEMENT-SPEED-ACCELERATION-TRAINING-DATA-ALL-PLAYERS'.replace(' ', '-').replace('(', '').replace(')', '').replace(':', '').replace('.', '').replace('__', '_').upper()\n", "\n", " #### Define the filepath to save each combined file\n", " path = os.path.join(data_dir_physical, 'engineered', 'Set 2', '4_modified_individual_training_sessions_dataset')\n", "\n", " #### Save the combined file as a CSV\n", " df.to_csv(path + f'/{save_filename}.csv', index=None, header=True)\n", " \n", " \n", " ### End timer\n", " toc = datetime.datetime.now()\n", " \n", " \n", " ### Print time of engineering of tracking data ended\n", " print(f'Calculation of each player\\'s speed and accelerations for the {training_drill} ended at: {toc}')\n", "\n", "\n", " ### Calculate time take\n", " total_time = (toc-tic).total_seconds()\n", " print(f'Time taken to calculate speed and acceleration and save the training data is: {total_time:0.2f} seconds.')\n", " \n", " \n", " \n", " ## If CSV file already exists, read in previously saved DataFrame\n", " else:\n", " \n", " ### Print time reading of CSV files started\n", " print('Training data with calculated velocities and accelerations already saved to local storage. Reading in file as a pandas DataFrame.')\n", " \n", " ### Read in raw DataFrame\n", " df = pd.read_csv(os.path.join(data_dir_physical, 'engineered', 'Set 2', '4_modified_individual_training_sessions_dataset', f'{date}-{training_drill}-MOVEMENT-SPEED-ACCELERATION-TRAINING-DATA-ALL-PLAYERS.csv'))\n", " \n", " \n", " ## Return the DataFrame\n", " return(df)\n", "\n", "def remove_player_velocities_accelerations(df):\n", " # remove player velocities and acceleration measures that are already in the 'df' dataframe\n", " columns = [c for c in df.columns if c.split('_')[-1] in ['vx', 'vy', 'ax', 'ay', 'rawspeed', 'rawacc', 'speed', 'acceleration']] # Get the player ids\n", " df = df.drop(columns=columns)\n", " return df" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Calculation of each player's speed and accelerations for the MATCH-MSG started at: 2022-02-15 23:02:52.807892\n", "Calculation of each player's speed and accelerations for the MATCH-MSG ended at: 2022-02-15 23:02:55.054667\n", "Time taken to calculate speed and acceleration and save the training data is: 2.25 seconds.\n", "Calculation of each player's speed and accelerations for the CROSSING-AND-FINISHING-HSR-SPR started at: 2022-02-15 23:02:55.056062\n", "Calculation of each player's speed and accelerations for the CROSSING-AND-FINISHING-HSR-SPR ended at: 2022-02-15 23:02:56.524802\n", "Time taken to calculate speed and acceleration and save the training data is: 1.47 seconds.\n", "Calculation of each player's speed and accelerations for the ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY started at: 2022-02-15 23:02:56.528356\n", "Calculation of each player's speed and accelerations for the ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY ended at: 2022-02-15 23:03:01.069064\n", "Time taken to calculate speed and acceleration and save the training data is: 4.54 seconds.\n", "Calculation of each player's speed and accelerations for the FULL-SESSION-MODIFIED started at: 2022-02-15 23:03:01.070138\n", "Calculation of each player's speed and accelerations for the FULL-SESSION-MODIFIED ended at: 2022-02-15 23:03:13.994752\n", "Time taken to calculate speed and acceleration and save the training data is: 12.92 seconds.\n", "Calculation of each player's speed and accelerations for the PASSING-DRILL-PHYSICAL started at: 2022-02-15 23:03:14.012260\n", "Calculation of each player's speed and accelerations for the PASSING-DRILL-PHYSICAL ended at: 2022-02-15 23:03:15.304846\n", "Time taken to calculate speed and acceleration and save the training data is: 1.29 seconds.\n", "Calculation of each player's speed and accelerations for the WARM-UP-COORDINATION-AGILITY started at: 2022-02-15 23:03:15.307837\n", "Calculation of each player's speed and accelerations for the WARM-UP-COORDINATION-AGILITY ended at: 2022-02-15 23:03:16.238336\n", "Time taken to calculate speed and acceleration and save the training data is: 0.93 seconds.\n" ] } ], "source": [ "# Calculate the velocity and accelerations for each player in each of the six training sessions\n", "df_training_match_msg_vel = calc_player_velocities_accelerations(df=df_training_match_msg_pvt, date='2022-02-02', training_drill='MATCH-MSG', smoothing_v=True, smoothing_a=True, filter_='moving_average', window=7, polyorder=1, maxspeed=12, dt=0.1)\n", "df_training_crossing_and_finishing_hsr_spr_vel = calc_player_velocities_accelerations(df=df_training_crossing_and_finishing_hsr_spr_pvt, date='2022-02-02', training_drill='CROSSING-AND-FINISHING-HSR-SPR', smoothing_v=True, smoothing_a=True, filter_='moving_average', window=7, polyorder=1, maxspeed=12, dt=0.1)\n", "df_training_attack_vs_defence_attack_superiority_vel = calc_player_velocities_accelerations(df=df_training_attack_vs_defence_attack_superiority_pvt, date='2022-02-02', training_drill='ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY', smoothing_v=True, smoothing_a=True, filter_='moving_average', window=7, polyorder=1, maxspeed=12, dt=0.1)\n", "df_training_full_session_modified_vel = calc_player_velocities_accelerations(df=df_training_full_session_modified_pvt, date='2022-02-02', training_drill='FULL-SESSION-MODIFIED', smoothing_v=True, smoothing_a=True, filter_='moving_average', window=7, polyorder=1, maxspeed=12, dt=0.1)\n", "df_training_passing_drill_physical_vel = calc_player_velocities_accelerations(df=df_training_passing_drill_physical_pvt, date='2022-02-02', training_drill='PASSING-DRILL-PHYSICAL', smoothing_v=True, smoothing_a=True, filter_='moving_average', window=7, polyorder=1, maxspeed=12, dt=0.1)\n", "df_training_warm_up_coordination_agility_vel = calc_player_velocities_accelerations(df=df_training_warm_up_coordination_agility_pvt, date='2022-02-02', training_drill='WARM-UP-COORDINATION-AGILITY', smoothing_v=True, smoothing_a=True, filter_='moving_average', window=7, polyorder=1, maxspeed=12, dt=0.1)" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Baah Acceleration (m/s/s)',\n", " 'Baah Speed (km/h)',\n", " 'Baah Speed (m/s)',\n", " 'Baah_acceleration',\n", " 'Baah_speed',\n", " 'Baah_vx',\n", " 'Baah_vy',\n", " 'Baah_x',\n", " 'Baah_y',\n", " 'Cathcart Acceleration (m/s/s)',\n", " 'Cathcart Speed (km/h)',\n", " 'Cathcart Speed (m/s)',\n", " 'Cathcart_acceleration',\n", " 'Cathcart_speed',\n", " 'Cathcart_vx',\n", " 'Cathcart_vy',\n", " 'Cathcart_x',\n", " 'Cathcart_y',\n", " 'Date',\n", " 'Dennis Acceleration (m/s/s)',\n", " 'Dennis Speed (km/h)',\n", " 'Dennis Speed (m/s)',\n", " 'Dennis_acceleration',\n", " 'Dennis_speed',\n", " 'Dennis_vx',\n", " 'Dennis_vy',\n", " 'Dennis_x',\n", " 'Dennis_y',\n", " 'Ekong Acceleration (m/s/s)',\n", " 'Ekong Speed (km/h)',\n", " 'Ekong Speed (m/s)',\n", " 'Ekong_acceleration',\n", " 'Ekong_speed',\n", " 'Ekong_vx',\n", " 'Ekong_vy',\n", " 'Ekong_x',\n", " 'Ekong_y',\n", " 'Etebo Acceleration (m/s/s)',\n", " 'Etebo Speed (km/h)',\n", " 'Etebo Speed (m/s)',\n", " 'Etebo_acceleration',\n", " 'Etebo_speed',\n", " 'Etebo_vx',\n", " 'Etebo_vy',\n", " 'Etebo_x',\n", " 'Etebo_y',\n", " 'Femenia Acceleration (m/s/s)',\n", " 'Femenia Speed (km/h)',\n", " 'Femenia Speed (m/s)',\n", " 'Femenia_acceleration',\n", " 'Femenia_speed',\n", " 'Femenia_vx',\n", " 'Femenia_vy',\n", " 'Femenia_x',\n", " 'Femenia_y',\n", " 'Fletcher Acceleration (m/s/s)',\n", " 'Fletcher Speed (km/h)',\n", " 'Fletcher Speed (m/s)',\n", " 'Fletcher_acceleration',\n", " 'Fletcher_speed',\n", " 'Fletcher_vx',\n", " 'Fletcher_vy',\n", " 'Fletcher_x',\n", " 'Fletcher_y',\n", " 'Frame',\n", " 'Gosling Acceleration (m/s/s)',\n", " 'Gosling Speed (km/h)',\n", " 'Gosling Speed (m/s)',\n", " 'Gosling_acceleration',\n", " 'Gosling_speed',\n", " 'Gosling_vx',\n", " 'Gosling_vy',\n", " 'Gosling_x',\n", " 'Gosling_y',\n", " 'Joao Pedro Acceleration (m/s/s)',\n", " 'Joao Pedro Speed (km/h)',\n", " 'Joao Pedro Speed (m/s)',\n", " 'Joao Pedro_acceleration',\n", " 'Joao Pedro_speed',\n", " 'Joao Pedro_vx',\n", " 'Joao Pedro_vy',\n", " 'Joao Pedro_x',\n", " 'Joao Pedro_y',\n", " 'Kabasele Acceleration (m/s/s)',\n", " 'Kabasele Speed (km/h)',\n", " 'Kabasele Speed (m/s)',\n", " 'Kabasele_acceleration',\n", " 'Kabasele_speed',\n", " 'Kabasele_vx',\n", " 'Kabasele_vy',\n", " 'Kabasele_x',\n", " 'Kabasele_y',\n", " 'Kalu Acceleration (m/s/s)',\n", " 'Kalu Speed (km/h)',\n", " 'Kalu Speed (m/s)',\n", " 'Kalu_acceleration',\n", " 'Kalu_speed',\n", " 'Kalu_vx',\n", " 'Kalu_vy',\n", " 'Kalu_x',\n", " 'Kalu_y',\n", " 'Kamara Acceleration (m/s/s)',\n", " 'Kamara Speed (km/h)',\n", " 'Kamara Speed (m/s)',\n", " 'Kamara_acceleration',\n", " 'Kamara_speed',\n", " 'Kamara_vx',\n", " 'Kamara_vy',\n", " 'Kamara_x',\n", " 'Kamara_y',\n", " 'Kayembe Acceleration (m/s/s)',\n", " 'Kayembe Speed (km/h)',\n", " 'Kayembe Speed (m/s)',\n", " 'Kayembe_acceleration',\n", " 'Kayembe_speed',\n", " 'Kayembe_vx',\n", " 'Kayembe_vy',\n", " 'Kayembe_x',\n", " 'Kayembe_y',\n", " 'King Acceleration (m/s/s)',\n", " 'King Speed (km/h)',\n", " 'King Speed (m/s)',\n", " 'King_acceleration',\n", " 'King_speed',\n", " 'King_vx',\n", " 'King_vy',\n", " 'King_x',\n", " 'King_y',\n", " 'Kucka Acceleration (m/s/s)',\n", " 'Kucka Speed (km/h)',\n", " 'Kucka Speed (m/s)',\n", " 'Kucka_acceleration',\n", " 'Kucka_speed',\n", " 'Kucka_vx',\n", " 'Kucka_vy',\n", " 'Kucka_x',\n", " 'Kucka_y',\n", " 'Louza Acceleration (m/s/s)',\n", " 'Louza Speed (km/h)',\n", " 'Louza Speed (m/s)',\n", " 'Louza_acceleration',\n", " 'Louza_speed',\n", " 'Louza_vx',\n", " 'Louza_vy',\n", " 'Louza_x',\n", " 'Louza_y',\n", " 'Masina Acceleration (m/s/s)',\n", " 'Masina Speed (km/h)',\n", " 'Masina Speed (m/s)',\n", " 'Masina_acceleration',\n", " 'Masina_speed',\n", " 'Masina_vx',\n", " 'Masina_vy',\n", " 'Masina_x',\n", " 'Masina_y',\n", " 'Ngakia Acceleration (m/s/s)',\n", " 'Ngakia Speed (km/h)',\n", " 'Ngakia Speed (m/s)',\n", " 'Ngakia_acceleration',\n", " 'Ngakia_speed',\n", " 'Ngakia_vx',\n", " 'Ngakia_vy',\n", " 'Ngakia_x',\n", " 'Ngakia_y',\n", " 'Period',\n", " 'Samir Acceleration (m/s/s)',\n", " 'Samir Speed (km/h)',\n", " 'Samir Speed (m/s)',\n", " 'Samir_acceleration',\n", " 'Samir_speed',\n", " 'Samir_vx',\n", " 'Samir_vy',\n", " 'Samir_x',\n", " 'Samir_y',\n", " 'Sema Acceleration (m/s/s)',\n", " 'Sema Speed (km/h)',\n", " 'Sema Speed (m/s)',\n", " 'Sema_acceleration',\n", " 'Sema_speed',\n", " 'Sema_vx',\n", " 'Sema_vy',\n", " 'Sema_x',\n", " 'Sema_y',\n", " 'Sierralta Acceleration (m/s/s)',\n", " 'Sierralta Speed (km/h)',\n", " 'Sierralta Speed (m/s)',\n", " 'Sierralta_acceleration',\n", " 'Sierralta_speed',\n", " 'Sierralta_vx',\n", " 'Sierralta_vy',\n", " 'Sierralta_x',\n", " 'Sierralta_y',\n", " 'Sissoko Acceleration (m/s/s)',\n", " 'Sissoko Speed (km/h)',\n", " 'Sissoko Speed (m/s)',\n", " 'Sissoko_acceleration',\n", " 'Sissoko_speed',\n", " 'Sissoko_vx',\n", " 'Sissoko_vy',\n", " 'Sissoko_x',\n", " 'Sissoko_y',\n", " 'Time [s]',\n", " 'Training Drill']" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sorted(df_training_attack_vs_defence_attack_superiority_vel.columns)" ] }, { "cell_type": "code", "execution_count": 64, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
FrameTime [s]DateTraining DrillNgakia_xNgakia_yNgakia Speed (m/s)Ngakia Speed (km/h)Cathcart_xCathcart_yCathcart Speed (m/s)Cathcart Speed (km/h)Etebo_xEtebo_yEtebo Speed (m/s)Etebo Speed (km/h)Dennis_xDennis_yDennis Speed (m/s)Dennis Speed (km/h)Kayembe_xKayembe_yKayembe Speed (m/s)Kayembe Speed (km/h)Baah_xBaah_yBaah Speed (m/s)Baah Speed (km/h)Sierralta_xSierralta_ySierralta Speed (m/s)Sierralta Speed (km/h)Ekong_xEkong_yEkong Speed (m/s)Ekong Speed (km/h)King_xKing_yKing Speed (m/s)King Speed (km/h)Kucka_xKucka_yKucka Speed (m/s)Kucka Speed (km/h)Kamara_xKamara_yKamara Speed (m/s)Kamara Speed (km/h)Fletcher_xFletcher_yFletcher Speed (m/s)Fletcher Speed (km/h)Louza_xLouza_yLouza Speed (m/s)Louza Speed (km/h)Gosling_xGosling_yGosling Speed (m/s)Gosling Speed (km/h)Femenia_xFemenia_yFemenia Speed (m/s)Femenia Speed (km/h)Samir_xSamir_ySamir Speed (m/s)Samir Speed (km/h)Joao Pedro_xJoao Pedro_yJoao Pedro Speed (m/s)Joao Pedro Speed (km/h)Sissoko_xSissoko_ySissoko Speed (m/s)Sissoko Speed (km/h)Kabasele_xKabasele_yKabasele Speed (m/s)Kabasele Speed (km/h)Masina_xMasina_yMasina Speed (m/s)Masina Speed (km/h)Kalu_xKalu_yKalu Speed (m/s)Kalu Speed (km/h)Sema_xSema_ySema Speed (m/s)Sema Speed (km/h)PeriodNgakia_vxNgakia_vyNgakia_speedNgakia Acceleration (m/s/s)Cathcart_vxCathcart_vyCathcart_speedCathcart Acceleration (m/s/s)Etebo_vxEtebo_vyEtebo_speedEtebo Acceleration (m/s/s)Dennis_vxDennis_vyDennis_speedDennis Acceleration (m/s/s)Kayembe_vxKayembe_vyKayembe_speedKayembe Acceleration (m/s/s)Baah_vxBaah_vyBaah_speedBaah Acceleration (m/s/s)Sierralta_vxSierralta_vySierralta_speedSierralta Acceleration (m/s/s)Ekong_vxEkong_vyEkong_speedEkong Acceleration (m/s/s)King_vxKing_vyKing_speedKing Acceleration (m/s/s)Kucka_vxKucka_vyKucka_speedKucka Acceleration (m/s/s)Kamara_vxKamara_vyKamara_speedKamara Acceleration (m/s/s)Fletcher_vxFletcher_vyFletcher_speedFletcher Acceleration (m/s/s)Louza_vxLouza_vyLouza_speedLouza Acceleration (m/s/s)Gosling_vxGosling_vyGosling_speedGosling Acceleration (m/s/s)Femenia_vxFemenia_vyFemenia_speedFemenia Acceleration (m/s/s)Samir_vxSamir_vySamir_speedSamir Acceleration (m/s/s)Joao Pedro_vxJoao Pedro_vyJoao Pedro_speedJoao Pedro Acceleration (m/s/s)Sissoko_vxSissoko_vySissoko_speedSissoko Acceleration (m/s/s)Kabasele_vxKabasele_vyKabasele_speedKabasele Acceleration (m/s/s)Masina_vxMasina_vyMasina_speedMasina Acceleration (m/s/s)Kalu_vxKalu_vyKalu_speedKalu Acceleration (m/s/s)Sema_vxSema_vySema_speedSema Acceleration (m/s/s)
0012:08:24.22022-02-02ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY-0.28109151.7113850.00.0-0.28112451.7113930.00.0-0.28136251.7108961.0555563.800003-0.28158151.7112632.3611138.500007-0.28127351.7109670.00.0-0.28105751.7113730.00.0-0.28108351.711350.00.0-0.28096251.7112570.00.0-0.28137051.7111951.9277796.940006-0.28156651.7112572.0250027.290006-0.28100551.7114630.5583342.010002-0.28128451.7110881.3055574.700004-0.28158251.7111261.5750015.670005-0.28096351.7112480.00.0-0.28147851.7113051.1055563.980003-0.28098451.7112950.00.0-0.28156651.7113111.9500027.020006-0.28144751.7111961.4388905.180004-0.28138251.7112240.7416672.670002-0.28131651.7111360.00.0-0.2814151.7110471.5944465.740005-0.28094551.7112470.00.01NaNNaNNaN0.0NaNNaNNaN0.0NaNNaNNaN2.023811NaNNaNNaN21.269858NaNNaNNaN0.0NaNNaNNaN0.0NaNNaNNaN0.0NaNNaNNaN0.0NaNNaNNaN2.222224NaNNaNNaN19.285730NaNNaNNaN-6.547624NaNNaNNaN-2.539685NaNNaNNaN12.777788NaNNaNNaN0.0NaNNaNNaN1.825398NaNNaNNaN0.0NaNNaNNaN-18.333348NaNNaNNaN7.420641NaNNaNNaN-9.484135NaNNaNNaN0.000000NaNNaNNaN-7.103180NaNNaNNaN0.0
1112:08:24.32022-02-02ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY-0.28109151.7113850.00.0-0.28112551.7113930.00.0-0.28136251.7108951.0222233.680003-0.28158051.7112631.0750013.870003-0.28127351.7109670.00.0-0.28105751.7113730.00.0-0.28108351.711350.00.0-0.28096251.7112570.00.0-0.28137251.7111951.8638906.710005-0.28156451.7112571.1750014.230003-0.28100651.7114620.8527783.070002-0.28128551.7110891.2611124.540004-0.28158151.7111261.3777794.960004-0.28096351.7112480.00.0-0.28147751.7113060.9611123.460003-0.28098451.7112950.00.0-0.28156451.7113102.1833357.860006-0.28144851.7111971.4666685.280004-0.28138151.7112240.6333342.280002-0.28131651.7111360.00.0-0.2814151.7110481.5777795.680005-0.28094551.7112470.00.010.0000000.0000000.0000000.0-0.0000170.00.0000170.00.000050-0.0000830.0000972.0238110.0000500.0000330.00006015.1587420.000000-0.0000330.0000330.0-0.0000170.0000170.0000240.0-0.0000170.0000000.0000170.00.0000170.0000000.0000170.0-0.0002170.0000670.000227-1.1904770.0001500.0000000.00015016.984141-0.000117-0.0000330.000121-0.714286-0.0001330.0000830.000157-2.4603190.000183-0.0000170.0001849.2460390.00.0000000.0000000.00.0000500.0000830.0000971.3492070.00.00.00.00.000250-0.0001330.000283-27.301609-0.0001330.0001000.0001678.2142920.0000500.0000330.000060-1.6666680.0000000.0000000.000000-8.531753-0.0000500.0001500.000158-7.5396890.0000000.00.0000000.0
2212:08:24.42022-02-02ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY-0.28109151.7113850.00.0-0.28112451.7113930.00.0-0.28136251.7108940.9500013.420003-0.28157951.7112630.7333342.640002-0.28127351.7109660.00.0-0.28105751.7113730.00.0-0.28108351.711350.00.0-0.28096251.7112570.00.0-0.28137451.7111961.8638906.710005-0.28156451.7112580.8416673.030002-0.28100851.7114621.0194453.670003-0.28128751.7110891.3527794.870004-0.28157951.7111261.0472233.770003-0.28096351.7112480.00.0-0.28147651.7113071.5666685.640005-0.28098451.7112950.00.0-0.28156051.7113092.5722249.260007-0.28144951.7111980.9750013.510003-0.28137951.7112251.4805575.330004-0.28131651.7111360.00.0-0.2814151.7110501.4722235.300004-0.28094551.7112470.00.01-0.0000170.0000000.0000170.00.0000170.00.0000170.00.000017-0.0000830.0000852.8571450.000117-0.0000670.0001349.7222300.000000-0.0000330.0000330.00.0000000.0000000.0000000.00.0000000.0000170.0000170.00.000017-0.0000170.0000240.0-0.0002170.0001170.0002466.9047670.0000830.0000330.00009018.412713-0.000167-0.0000170.0001671.865081-0.0001670.0000830.000186-3.4127010.0001170.0000000.0001175.0396870.0-0.0000170.0000170.00.0001170.0001330.0001770.7142860.00.00.00.00.000383-0.0000500.000387-24.325416-0.0000670.0000670.0000946.1111160.0001670.0001170.000203-2.539685-0.0000170.0000170.000024-10.6746120.0000000.0001500.000150-9.4047690.0000000.00.0000000.0
3312:08:24.52022-02-02ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY-0.28109151.7113850.00.0-0.28112451.7113930.00.0-0.28136251.7108930.9750013.510003-0.28157851.7112620.8472233.050002-0.28127351.7109660.00.0-0.28105751.7113730.00.0-0.28108351.711350.00.0-0.28096251.7112570.00.0-0.28137651.7111971.4916685.370004-0.28156251.7112570.7861122.830002-0.28101051.7114621.2944454.660004-0.28128851.7110901.4333345.160004-0.28157851.7111260.8916673.210003-0.28096351.7112480.00.0-0.28147451.7113081.2527794.510004-0.28098451.7112950.00.0-0.28155551.7113083.04722510.970009-0.28144951.7111990.9500013.420003-0.28137851.7112261.5972245.750005-0.28131651.7111360.00.0-0.2814151.7110522.1194467.630006-0.28094551.7112470.00.010.0000000.0000000.0000000.00.0000000.00.0000000.00.000000-0.0000830.0000832.7777800.000117-0.0000500.0001275.0000040.0000000.0000000.0000000.00.0000000.0000000.0000000.0-0.0000170.0000000.0000170.00.000017-0.0000170.0000240.0-0.0001500.0001000.00018011.5079460.000117-0.0000170.00011821.150811-0.0002000.0000000.0002007.976197-0.0002000.0000670.000211-2.6984150.0001170.0000170.0001183.4127010.00.0000000.0000000.00.0001670.0000330.000170-0.5555560.00.00.00.00.000433-0.0001000.000445-18.571443-0.0000330.0000670.00007520.5555720.0001170.0001170.0001651.4285730.000017-0.0000170.000024-11.1508030.0000170.0002170.000217-6.2698460.0000170.00.0000170.0
4412:08:24.62022-02-02ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY-0.28109151.7113860.00.0-0.28112451.7113930.00.0-0.28136251.7108920.9138903.290003-0.28157751.7112610.8722233.140003-0.28127451.7109660.00.0-0.28105751.7113730.00.0-0.28108351.711350.00.0-0.28096251.7112570.00.0-0.28137751.7111991.7722246.380005-0.28156251.7112580.6750012.430002-0.28101151.7114621.0166673.660003-0.28129051.7110911.4833355.340004-0.28157751.7111260.6805562.450002-0.28096351.7112480.00.0-0.28147351.7113080.9777793.520003-0.28098451.7112950.00.0-0.28155151.7113083.23333611.640009-0.28144951.7112000.9194453.310003-0.28137751.7112271.4055575.060004-0.28131551.7111360.00.0-0.2814151.7110542.0916687.530006-0.28094551.7112470.00.010.0000170.0000170.0000240.00.0000000.00.0000000.0-0.000017-0.0000670.0000694.0079400.000067-0.0000830.000107-14.325408-0.0000170.0000000.0000170.00.0000000.0000170.0000170.00.0000000.0000170.0000170.00.0000000.0000170.0000170.0-0.0001330.0001330.0001897.2619110.0000830.0000170.00008511.626993-0.0001330.0000000.00013312.182549-0.0001670.0000830.000186-4.0873050.000083-0.0000170.0000850.2380950.00.0000000.0000000.00.0001000.0000500.000112-0.7936510.00.00.00.00.000450-0.0000500.000453-14.2857260.0000000.0000830.00008311.1111200.0001000.0001000.000141-7.8174670.000017-0.0000170.000024-10.1587380.0000170.0001670.000167-11.6269930.0000000.00.0000000.0
\n", "
" ], "text/plain": [ " Frame Time [s] Date Training Drill \\\n", "0 0 12:08:24.2 2022-02-02 ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY \n", "1 1 12:08:24.3 2022-02-02 ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY \n", "2 2 12:08:24.4 2022-02-02 ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY \n", "3 3 12:08:24.5 2022-02-02 ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY \n", "4 4 12:08:24.6 2022-02-02 ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY \n", "\n", " Ngakia_x Ngakia_y Ngakia Speed (m/s) Ngakia Speed (km/h) Cathcart_x \\\n", "0 -0.281091 51.711385 0.0 0.0 -0.281124 \n", "1 -0.281091 51.711385 0.0 0.0 -0.281125 \n", "2 -0.281091 51.711385 0.0 0.0 -0.281124 \n", "3 -0.281091 51.711385 0.0 0.0 -0.281124 \n", "4 -0.281091 51.711386 0.0 0.0 -0.281124 \n", "\n", " Cathcart_y Cathcart Speed (m/s) Cathcart Speed (km/h) Etebo_x \\\n", "0 51.711393 0.0 0.0 -0.281362 \n", "1 51.711393 0.0 0.0 -0.281362 \n", "2 51.711393 0.0 0.0 -0.281362 \n", "3 51.711393 0.0 0.0 -0.281362 \n", "4 51.711393 0.0 0.0 -0.281362 \n", "\n", " Etebo_y Etebo Speed (m/s) Etebo Speed (km/h) Dennis_x Dennis_y \\\n", "0 51.710896 1.055556 3.800003 -0.281581 51.711263 \n", "1 51.710895 1.022223 3.680003 -0.281580 51.711263 \n", "2 51.710894 0.950001 3.420003 -0.281579 51.711263 \n", "3 51.710893 0.975001 3.510003 -0.281578 51.711262 \n", "4 51.710892 0.913890 3.290003 -0.281577 51.711261 \n", "\n", " Dennis Speed (m/s) Dennis Speed (km/h) Kayembe_x Kayembe_y \\\n", "0 2.361113 8.500007 -0.281273 51.710967 \n", "1 1.075001 3.870003 -0.281273 51.710967 \n", "2 0.733334 2.640002 -0.281273 51.710966 \n", "3 0.847223 3.050002 -0.281273 51.710966 \n", "4 0.872223 3.140003 -0.281274 51.710966 \n", "\n", " Kayembe Speed (m/s) Kayembe Speed (km/h) Baah_x Baah_y \\\n", "0 0.0 0.0 -0.281057 51.711373 \n", "1 0.0 0.0 -0.281057 51.711373 \n", "2 0.0 0.0 -0.281057 51.711373 \n", "3 0.0 0.0 -0.281057 51.711373 \n", "4 0.0 0.0 -0.281057 51.711373 \n", "\n", " Baah Speed (m/s) Baah Speed (km/h) Sierralta_x Sierralta_y \\\n", "0 0.0 0.0 -0.281083 51.71135 \n", "1 0.0 0.0 -0.281083 51.71135 \n", "2 0.0 0.0 -0.281083 51.71135 \n", "3 0.0 0.0 -0.281083 51.71135 \n", "4 0.0 0.0 -0.281083 51.71135 \n", "\n", " Sierralta Speed (m/s) Sierralta Speed (km/h) Ekong_x Ekong_y \\\n", "0 0.0 0.0 -0.280962 51.711257 \n", "1 0.0 0.0 -0.280962 51.711257 \n", "2 0.0 0.0 -0.280962 51.711257 \n", "3 0.0 0.0 -0.280962 51.711257 \n", "4 0.0 0.0 -0.280962 51.711257 \n", "\n", " Ekong Speed (m/s) Ekong Speed (km/h) King_x King_y \\\n", "0 0.0 0.0 -0.281370 51.711195 \n", "1 0.0 0.0 -0.281372 51.711195 \n", "2 0.0 0.0 -0.281374 51.711196 \n", "3 0.0 0.0 -0.281376 51.711197 \n", "4 0.0 0.0 -0.281377 51.711199 \n", "\n", " King Speed (m/s) King Speed (km/h) Kucka_x Kucka_y \\\n", "0 1.927779 6.940006 -0.281566 51.711257 \n", "1 1.863890 6.710005 -0.281564 51.711257 \n", "2 1.863890 6.710005 -0.281564 51.711258 \n", "3 1.491668 5.370004 -0.281562 51.711257 \n", "4 1.772224 6.380005 -0.281562 51.711258 \n", "\n", " Kucka Speed (m/s) Kucka Speed (km/h) Kamara_x Kamara_y \\\n", "0 2.025002 7.290006 -0.281005 51.711463 \n", "1 1.175001 4.230003 -0.281006 51.711462 \n", "2 0.841667 3.030002 -0.281008 51.711462 \n", "3 0.786112 2.830002 -0.281010 51.711462 \n", "4 0.675001 2.430002 -0.281011 51.711462 \n", "\n", " Kamara Speed (m/s) Kamara Speed (km/h) Fletcher_x Fletcher_y \\\n", "0 0.558334 2.010002 -0.281284 51.711088 \n", "1 0.852778 3.070002 -0.281285 51.711089 \n", "2 1.019445 3.670003 -0.281287 51.711089 \n", "3 1.294445 4.660004 -0.281288 51.711090 \n", "4 1.016667 3.660003 -0.281290 51.711091 \n", "\n", " Fletcher Speed (m/s) Fletcher Speed (km/h) Louza_x Louza_y \\\n", "0 1.305557 4.700004 -0.281582 51.711126 \n", "1 1.261112 4.540004 -0.281581 51.711126 \n", "2 1.352779 4.870004 -0.281579 51.711126 \n", "3 1.433334 5.160004 -0.281578 51.711126 \n", "4 1.483335 5.340004 -0.281577 51.711126 \n", "\n", " Louza Speed (m/s) Louza Speed (km/h) Gosling_x Gosling_y \\\n", "0 1.575001 5.670005 -0.280963 51.711248 \n", "1 1.377779 4.960004 -0.280963 51.711248 \n", "2 1.047223 3.770003 -0.280963 51.711248 \n", "3 0.891667 3.210003 -0.280963 51.711248 \n", "4 0.680556 2.450002 -0.280963 51.711248 \n", "\n", " Gosling Speed (m/s) Gosling Speed (km/h) Femenia_x Femenia_y \\\n", "0 0.0 0.0 -0.281478 51.711305 \n", "1 0.0 0.0 -0.281477 51.711306 \n", "2 0.0 0.0 -0.281476 51.711307 \n", "3 0.0 0.0 -0.281474 51.711308 \n", "4 0.0 0.0 -0.281473 51.711308 \n", "\n", " Femenia Speed (m/s) Femenia Speed (km/h) Samir_x Samir_y \\\n", "0 1.105556 3.980003 -0.280984 51.711295 \n", "1 0.961112 3.460003 -0.280984 51.711295 \n", "2 1.566668 5.640005 -0.280984 51.711295 \n", "3 1.252779 4.510004 -0.280984 51.711295 \n", "4 0.977779 3.520003 -0.280984 51.711295 \n", "\n", " Samir Speed (m/s) Samir Speed (km/h) Joao Pedro_x Joao Pedro_y \\\n", "0 0.0 0.0 -0.281566 51.711311 \n", "1 0.0 0.0 -0.281564 51.711310 \n", "2 0.0 0.0 -0.281560 51.711309 \n", "3 0.0 0.0 -0.281555 51.711308 \n", "4 0.0 0.0 -0.281551 51.711308 \n", "\n", " Joao Pedro Speed (m/s) Joao Pedro Speed (km/h) Sissoko_x Sissoko_y \\\n", "0 1.950002 7.020006 -0.281447 51.711196 \n", "1 2.183335 7.860006 -0.281448 51.711197 \n", "2 2.572224 9.260007 -0.281449 51.711198 \n", "3 3.047225 10.970009 -0.281449 51.711199 \n", "4 3.233336 11.640009 -0.281449 51.711200 \n", "\n", " Sissoko Speed (m/s) Sissoko Speed (km/h) Kabasele_x Kabasele_y \\\n", "0 1.438890 5.180004 -0.281382 51.711224 \n", "1 1.466668 5.280004 -0.281381 51.711224 \n", "2 0.975001 3.510003 -0.281379 51.711225 \n", "3 0.950001 3.420003 -0.281378 51.711226 \n", "4 0.919445 3.310003 -0.281377 51.711227 \n", "\n", " Kabasele Speed (m/s) Kabasele Speed (km/h) Masina_x Masina_y \\\n", "0 0.741667 2.670002 -0.281316 51.711136 \n", "1 0.633334 2.280002 -0.281316 51.711136 \n", "2 1.480557 5.330004 -0.281316 51.711136 \n", "3 1.597224 5.750005 -0.281316 51.711136 \n", "4 1.405557 5.060004 -0.281315 51.711136 \n", "\n", " Masina Speed (m/s) Masina Speed (km/h) Kalu_x Kalu_y \\\n", "0 0.0 0.0 -0.28141 51.711047 \n", "1 0.0 0.0 -0.28141 51.711048 \n", "2 0.0 0.0 -0.28141 51.711050 \n", "3 0.0 0.0 -0.28141 51.711052 \n", "4 0.0 0.0 -0.28141 51.711054 \n", "\n", " Kalu Speed (m/s) Kalu Speed (km/h) Sema_x Sema_y Sema Speed (m/s) \\\n", "0 1.594446 5.740005 -0.280945 51.711247 0.0 \n", "1 1.577779 5.680005 -0.280945 51.711247 0.0 \n", "2 1.472223 5.300004 -0.280945 51.711247 0.0 \n", "3 2.119446 7.630006 -0.280945 51.711247 0.0 \n", "4 2.091668 7.530006 -0.280945 51.711247 0.0 \n", "\n", " Sema Speed (km/h) Period Ngakia_vx Ngakia_vy Ngakia_speed \\\n", "0 0.0 1 NaN NaN NaN \n", "1 0.0 1 0.000000 0.000000 0.000000 \n", "2 0.0 1 -0.000017 0.000000 0.000017 \n", "3 0.0 1 0.000000 0.000000 0.000000 \n", "4 0.0 1 0.000017 0.000017 0.000024 \n", "\n", " Ngakia Acceleration (m/s/s) Cathcart_vx Cathcart_vy Cathcart_speed \\\n", "0 0.0 NaN NaN NaN \n", "1 0.0 -0.000017 0.0 0.000017 \n", "2 0.0 0.000017 0.0 0.000017 \n", "3 0.0 0.000000 0.0 0.000000 \n", "4 0.0 0.000000 0.0 0.000000 \n", "\n", " Cathcart Acceleration (m/s/s) Etebo_vx Etebo_vy Etebo_speed \\\n", "0 0.0 NaN NaN NaN \n", "1 0.0 0.000050 -0.000083 0.000097 \n", "2 0.0 0.000017 -0.000083 0.000085 \n", "3 0.0 0.000000 -0.000083 0.000083 \n", "4 0.0 -0.000017 -0.000067 0.000069 \n", "\n", " Etebo Acceleration (m/s/s) Dennis_vx Dennis_vy Dennis_speed \\\n", "0 2.023811 NaN NaN NaN \n", "1 2.023811 0.000050 0.000033 0.000060 \n", "2 2.857145 0.000117 -0.000067 0.000134 \n", "3 2.777780 0.000117 -0.000050 0.000127 \n", "4 4.007940 0.000067 -0.000083 0.000107 \n", "\n", " Dennis Acceleration (m/s/s) Kayembe_vx Kayembe_vy Kayembe_speed \\\n", "0 21.269858 NaN NaN NaN \n", "1 15.158742 0.000000 -0.000033 0.000033 \n", "2 9.722230 0.000000 -0.000033 0.000033 \n", "3 5.000004 0.000000 0.000000 0.000000 \n", "4 -14.325408 -0.000017 0.000000 0.000017 \n", "\n", " Kayembe Acceleration (m/s/s) Baah_vx Baah_vy Baah_speed \\\n", "0 0.0 NaN NaN NaN \n", "1 0.0 -0.000017 0.000017 0.000024 \n", "2 0.0 0.000000 0.000000 0.000000 \n", "3 0.0 0.000000 0.000000 0.000000 \n", "4 0.0 0.000000 0.000017 0.000017 \n", "\n", " Baah Acceleration (m/s/s) Sierralta_vx Sierralta_vy Sierralta_speed \\\n", "0 0.0 NaN NaN NaN \n", "1 0.0 -0.000017 0.000000 0.000017 \n", "2 0.0 0.000000 0.000017 0.000017 \n", "3 0.0 -0.000017 0.000000 0.000017 \n", "4 0.0 0.000000 0.000017 0.000017 \n", "\n", " Sierralta Acceleration (m/s/s) Ekong_vx Ekong_vy Ekong_speed \\\n", "0 0.0 NaN NaN NaN \n", "1 0.0 0.000017 0.000000 0.000017 \n", "2 0.0 0.000017 -0.000017 0.000024 \n", "3 0.0 0.000017 -0.000017 0.000024 \n", "4 0.0 0.000000 0.000017 0.000017 \n", "\n", " Ekong Acceleration (m/s/s) King_vx King_vy King_speed \\\n", "0 0.0 NaN NaN NaN \n", "1 0.0 -0.000217 0.000067 0.000227 \n", "2 0.0 -0.000217 0.000117 0.000246 \n", "3 0.0 -0.000150 0.000100 0.000180 \n", "4 0.0 -0.000133 0.000133 0.000189 \n", "\n", " King Acceleration (m/s/s) Kucka_vx Kucka_vy Kucka_speed \\\n", "0 2.222224 NaN NaN NaN \n", "1 -1.190477 0.000150 0.000000 0.000150 \n", "2 6.904767 0.000083 0.000033 0.000090 \n", "3 11.507946 0.000117 -0.000017 0.000118 \n", "4 7.261911 0.000083 0.000017 0.000085 \n", "\n", " Kucka Acceleration (m/s/s) Kamara_vx Kamara_vy Kamara_speed \\\n", "0 19.285730 NaN NaN NaN \n", "1 16.984141 -0.000117 -0.000033 0.000121 \n", "2 18.412713 -0.000167 -0.000017 0.000167 \n", "3 21.150811 -0.000200 0.000000 0.000200 \n", "4 11.626993 -0.000133 0.000000 0.000133 \n", "\n", " Kamara Acceleration (m/s/s) Fletcher_vx Fletcher_vy Fletcher_speed \\\n", "0 -6.547624 NaN NaN NaN \n", "1 -0.714286 -0.000133 0.000083 0.000157 \n", "2 1.865081 -0.000167 0.000083 0.000186 \n", "3 7.976197 -0.000200 0.000067 0.000211 \n", "4 12.182549 -0.000167 0.000083 0.000186 \n", "\n", " Fletcher Acceleration (m/s/s) Louza_vx Louza_vy Louza_speed \\\n", "0 -2.539685 NaN NaN NaN \n", "1 -2.460319 0.000183 -0.000017 0.000184 \n", "2 -3.412701 0.000117 0.000000 0.000117 \n", "3 -2.698415 0.000117 0.000017 0.000118 \n", "4 -4.087305 0.000083 -0.000017 0.000085 \n", "\n", " Louza Acceleration (m/s/s) Gosling_vx Gosling_vy Gosling_speed \\\n", "0 12.777788 NaN NaN NaN \n", "1 9.246039 0.0 0.000000 0.000000 \n", "2 5.039687 0.0 -0.000017 0.000017 \n", "3 3.412701 0.0 0.000000 0.000000 \n", "4 0.238095 0.0 0.000000 0.000000 \n", "\n", " Gosling Acceleration (m/s/s) Femenia_vx Femenia_vy Femenia_speed \\\n", "0 0.0 NaN NaN NaN \n", "1 0.0 0.000050 0.000083 0.000097 \n", "2 0.0 0.000117 0.000133 0.000177 \n", "3 0.0 0.000167 0.000033 0.000170 \n", "4 0.0 0.000100 0.000050 0.000112 \n", "\n", " Femenia Acceleration (m/s/s) Samir_vx Samir_vy Samir_speed \\\n", "0 1.825398 NaN NaN NaN \n", "1 1.349207 0.0 0.0 0.0 \n", "2 0.714286 0.0 0.0 0.0 \n", "3 -0.555556 0.0 0.0 0.0 \n", "4 -0.793651 0.0 0.0 0.0 \n", "\n", " Samir Acceleration (m/s/s) Joao Pedro_vx Joao Pedro_vy Joao Pedro_speed \\\n", "0 0.0 NaN NaN NaN \n", "1 0.0 0.000250 -0.000133 0.000283 \n", "2 0.0 0.000383 -0.000050 0.000387 \n", "3 0.0 0.000433 -0.000100 0.000445 \n", "4 0.0 0.000450 -0.000050 0.000453 \n", "\n", " Joao Pedro Acceleration (m/s/s) Sissoko_vx Sissoko_vy Sissoko_speed \\\n", "0 -18.333348 NaN NaN NaN \n", "1 -27.301609 -0.000133 0.000100 0.000167 \n", "2 -24.325416 -0.000067 0.000067 0.000094 \n", "3 -18.571443 -0.000033 0.000067 0.000075 \n", "4 -14.285726 0.000000 0.000083 0.000083 \n", "\n", " Sissoko Acceleration (m/s/s) Kabasele_vx Kabasele_vy Kabasele_speed \\\n", "0 7.420641 NaN NaN NaN \n", "1 8.214292 0.000050 0.000033 0.000060 \n", "2 6.111116 0.000167 0.000117 0.000203 \n", "3 20.555572 0.000117 0.000117 0.000165 \n", "4 11.111120 0.000100 0.000100 0.000141 \n", "\n", " Kabasele Acceleration (m/s/s) Masina_vx Masina_vy Masina_speed \\\n", "0 -9.484135 NaN NaN NaN \n", "1 -1.666668 0.000000 0.000000 0.000000 \n", "2 -2.539685 -0.000017 0.000017 0.000024 \n", "3 1.428573 0.000017 -0.000017 0.000024 \n", "4 -7.817467 0.000017 -0.000017 0.000024 \n", "\n", " Masina Acceleration (m/s/s) Kalu_vx Kalu_vy Kalu_speed \\\n", "0 0.000000 NaN NaN NaN \n", "1 -8.531753 -0.000050 0.000150 0.000158 \n", "2 -10.674612 0.000000 0.000150 0.000150 \n", "3 -11.150803 0.000017 0.000217 0.000217 \n", "4 -10.158738 0.000017 0.000167 0.000167 \n", "\n", " Kalu Acceleration (m/s/s) Sema_vx Sema_vy Sema_speed \\\n", "0 -7.103180 NaN NaN NaN \n", "1 -7.539689 0.000000 0.0 0.000000 \n", "2 -9.404769 0.000000 0.0 0.000000 \n", "3 -6.269846 0.000017 0.0 0.000017 \n", "4 -11.626993 0.000000 0.0 0.000000 \n", "\n", " Sema Acceleration (m/s/s) \n", "0 0.0 \n", "1 0.0 \n", "2 0.0 \n", "3 0.0 \n", "4 0.0 " ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Display DataFrame - ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY\n", "df_training_attack_vs_defence_attack_superiority_vel.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "### 4.5. Create Physical Reports for Each Individual Training Session\n", "The speed zones are defined as:\n", "* Low-Speed Activities (LSA) (<14 km/h or <4 m/s);\n", "* Moderate-Speed Running (MSR) (14.4–19.8 km/h or 4-5.5 m/s);\n", "* High-Speed Running (HSR) (19.8–25.1 km/h or 5.5-6.972 m/s); and\n", "* Sprinting (≥25.2 km km/h or ≥6.972 m/s).\n", "\n", "For further information, see: [Application of Individualized Speed Zones to Quantify External Training Load in Professional Soccer](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7126260/) by Vincenzo Rago, João Brito, Pedro Figueiredo, Peter Krustrup, and António Rebelo." ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [], "source": [ "# Define a function to generate a bespoke physical summary of all the players for an individual training session\n", "def create_physical_report_per_training_session(df, date='2022-02-02', training_drill='NOT-DEFINED'):\n", " \n", " \"\"\"\n", " Define a function to generate a bespoke physical summary of all the players for an individual training session\n", " \"\"\"\n", " \n", " ## Read in exported CSV file if exists, if not, download the latest JSON data\n", " if not os.path.exists(os.path.join(data_dir_physical, 'engineered', 'Set 2', '5_physical_reports', f'{date}-{training_drill}-PHYSICAL-REPORT-ALL-PLAYERS.csv')):\n", " \n", " \n", " ### Start timer\n", " tic = datetime.datetime.now()\n", "\n", " \n", " ### Print time of engineering of tracking data started\n", " print(f'Creation of the physical report for the {training_drill} training drill started at: {tic}') \n", " \n", " \n", " ## Data Engineering\n", "\n", " ### \n", " lst_cols = list(df)\n", "\n", " ###\n", " lst_players = []\n", "\n", " ###\n", " for col in lst_cols:\n", " if '_x' in col:\n", " col = col.replace('_x', '')\n", " lst_players.append(col)\n", "\n", " ### Create DataFrame where each row is a player\n", " df_summary = pd.DataFrame(lst_players, columns=['Player'])\n", "\n", " \n", " \n", " ##\n", " df_summary['Date'] = date \n", " df_summary['Training Drill'] = training_drill\n", " \n", "\n", " \n", " ## Calculate minutes played for each player\n", "\n", " ### Create empty list for minutes\n", " lst_minutes = []\n", "\n", " ### Cycle through each player's jersey number in the team and look for the first and last time for each player\n", " for player in lst_players:\n", "\n", " #### Search for first and last frames that we have a position observation for each player (when a player is not on the pitch positions are NaN)\n", " column = f'{player}' + '_x' # use player x-position coordinate\n", " try:\n", " player_minutes = (df[column].last_valid_index() - df[column].first_valid_index() + 1) / 10 / 60 # convert to minutes\n", " except:\n", " player_minutes = 0\n", " lst_minutes.append(player_minutes)\n", "\n", " ### Create column for the minute played\n", " df_summary['Minutes Trained'] = lst_minutes\n", "\n", " ### Sort values by minutes played descending\n", " df_summary = df_summary.sort_values(['Minutes Trained'], ascending=False)\n", "\n", "\n", "\n", " ## Calculate total distance covered for each player\n", "\n", " ### Create empty list for distance\n", " lst_distance = []\n", "\n", " ### Cycle through each player and multiple their speed at any given instance by 10ms to get total distance and divide by 1,000 to get this in km\n", " for player in lst_players:\n", " column = f'{player}' + ' Speed (m/s)'\n", " df_player_distance = df[column].sum()/100./1000 # speed time. Convert to km (original logic)\n", " #df_player_distance = (df[column].sum() * 0.01) / 1000 # Distance = Speed * Time\n", " lst_distance.append(df_player_distance)\n", "\n", " ### Create column for the distance in km\n", " df_summary['Distance [km]'] = lst_distance\n", "\n", " \n", "\n", " ## Calculate total distance covered for each player for different types of movement\n", "\n", " ### Create empty lists for distances of different movements\n", " lst_lsa = []\n", " lst_msr = []\n", " lst_hsr = []\n", " lst_sprinting = []\n", "\n", " ### Cycle through each player's jersey number in the team and \n", " for player in lst_players:\n", " column = f'{player}' + ' Speed (m/s)'\n", " ### Low-Speed Activities (LSA) (<14 km/h or <4 m/s)\n", " player_distance = df.loc[df[column] < 4, column].sum()/100./1000\n", " #player_distance = df.loc[df[column] < 14.4, column].sum()/100./1000\n", " lst_lsa.append(player_distance)\n", " ### Moderate-Speed Running (MSR) (14.4–19.8 km/h or 4-5.5 m/s)\n", " player_distance = df.loc[(df[column] >= 4) & (df[column] < 5.5), column].sum()/100./1000\n", " #player_distance = df.loc[(df[column] >= 14.4) & (df[column] < 19.8), column].sum()/100./1000\n", " lst_msr.append(player_distance)\n", " ### High-Speed Running (HSR) (19.8–25.1 km/h or 5.5-6.972 m/s)\n", " player_distance = df.loc[(df[column] >= 5.5) & (df[column] < 6.972222), column].sum()/100./1000\n", " #player_distance = df.loc[(df[column] >= 19.8) & (df[column] < 25.1), column].sum()/100./1000\n", " lst_hsr.append(player_distance)\n", " ### Sprinting (≥25.2 km km/h or ≥6.972 m/s)\n", " player_distance = df.loc[df[column] >= 6.972222, column].sum()/100./1000\n", " #player_distance = df.loc[df[column] >= 25.2, column].sum()/100./1000\n", " lst_sprinting.append(player_distance)\n", "\n", " ### Assign each movement list to a column in the Summary DataFrame\n", " df_summary['Low-Speed Activities (LSA) [km]'] = lst_lsa\n", " df_summary['Moderate-Speed Running (MSR) [km]'] = lst_msr\n", " df_summary['High-Speed Running (HSR) [km]'] = lst_hsr\n", " df_summary['Sprinting [km]'] = lst_sprinting\n", "\n", " \n", " \n", " ## Reset index\n", " df_summary = df_summary.reset_index(drop=True)\n", "\n", " \n", " \n", " ## Determine the number of sustained sprints per match\n", "\n", " ### Create an empty list for the number of sprints\n", " nsprints = []\n", "\n", " ###\n", " #sprint_threshold = 25.2 # minimum speed to be defined as a sprint (km/h)\n", " sprint_threshold = 6.972222 # minimum speed to be defined as a sprint (m/s)\n", " sprint_window = 1 * 10\n", "\n", " ###\n", " for player in lst_players:\n", " column = f'{player}' + ' Speed (m/s)'\n", " # trick here is to convolve speed with a window of size 'sprint_window', and find number of occassions that sprint was sustained for at least one window length\n", " # diff helps us to identify when the window starts\n", " player_sprints = np.diff(1 * (np.convolve(1 * (df[column] >= sprint_threshold), np.ones(sprint_window), mode='same') >= sprint_window))\n", " nsprints.append(np.sum(player_sprints == 1 ))\n", "\n", " ### Add column for the number of sprints\n", " df_summary['No. Sprints'] = nsprints\n", "\n", "\n", " \n", " ## Estimate the top speed of each player\n", "\n", " ### Create empty dictionary to append maximum speeds\n", " dict_top_speeds = {}\n", "\n", " ### Iterate through the columns of the training DataFrame for the top speeds\n", " player_speed_columns = [i for i in df.columns if ' Speed (m/s)' in i]\n", "\n", " ### Iterate through all the rows of all the speed columns, to determine the maximum speed for each player\n", " for player in player_speed_columns:\n", " dict_top_speeds[player] = df[player].max()\n", "\n", " ### \n", " df_top_speeds = pd.DataFrame.from_dict(dict_top_speeds, orient='index', columns=['Top Speed [m/s]'])\n", "\n", " ### \n", " df_top_speeds = df_top_speeds.reset_index(drop=False)\n", "\n", " ### \n", " df_top_speeds = df_top_speeds.rename(columns={'index': 'Player'})\n", "\n", " ### \n", " df_top_speeds['Player'] = df_top_speeds['Player'].str.replace(' Speed (m/s)', '')\n", "\n", " ### \n", " df_top_speeds['Player'] = df_top_speeds['Player'].str.replace(' Speed \\(m/s\\)', '')\n", "\n", " ### Merge Top Speeds DataFrame to Summary DataFrame\n", " df_summary = pd.merge(df_summary, df_top_speeds, left_on=['Player'], right_on=['Player'], how='left')\n", " \n", " \n", " \n", " ## Estimate the top acceleration of each player\n", "\n", " ### Create empty dictionary to append maximum accelerations\n", " dict_top_accelerations = {}\n", "\n", " ### Iterate through the columns of the training DataFrame for the top accelerations\n", " player_acceleration_columns = [i for i in df.columns if ' Acceleration (m/s/s)' in i]\n", "\n", " ### Iterate through all the rows of all the acceleration columns, to determine the maximum acceleration for each player\n", " for player in player_acceleration_columns:\n", " dict_top_accelerations[player] = df[player].max()\n", "\n", " ### \n", " df_top_accelerations = pd.DataFrame.from_dict(dict_top_accelerations, orient='index', columns=['Top Acceleration [m/s/s]'])\n", "\n", " ### \n", " df_top_accelerations = df_top_accelerations.reset_index(drop=False)\n", "\n", " ### \n", " df_top_accelerations = df_top_accelerations.rename(columns={'index': 'Player'})\n", "\n", " ### \n", " df_top_accelerations['Player'] = df_top_accelerations['Player'].str.replace(' Acceleration (m/s/s)', '')\n", "\n", " ### \n", " df_top_accelerations['Player'] = df_top_accelerations['Player'].str.replace(' Acceleration \\(m/s/s\\)', '')\n", " \n", " ### Merge Top Speeds DataFrame to Summary DataFrame\n", " df_summary = pd.merge(df_summary, df_top_accelerations, left_on=['Player'], right_on=['Player'], how='left')\n", " \n", "\n", " ### Save DataFrame\n", "\n", " #### Define filename for each combined file to be saved\n", " save_filename = f'{date}-{training_drill}-PHYSICAL-REPORT-ALL-PLAYERS'.replace(' ', '-').replace('(', '').replace(')', '').replace(':', '').replace('.', '').replace('__', '_').upper()\n", "\n", " #### Define the filepath to save each combined file\n", " path = os.path.join(data_dir_physical, 'engineered', 'Set 2', '5_physical_reports')\n", "\n", " #### Save the combined file as a CSV\n", " df_summary.to_csv(path + f'/{save_filename}.csv', index=None, header=True)\n", " \n", " \n", " ### End timer\n", " toc = datetime.datetime.now()\n", " \n", " \n", " ### Print time of engineering of tracking data ended\n", " print(f'Creation of the physical report for the {training_drill} training drill ended at: {toc}')\n", "\n", "\n", " ### Calculate time take\n", " total_time = (toc-tic).total_seconds()\n", " print(f'Time taken to create the physical report for the {training_drill} training data is: {total_time:0.2f} seconds.')\n", " \n", " \n", " \n", " ## If CSV file already exists, read in previously saved DataFrame\n", " else:\n", " \n", " ### Print time reading of CSV files started\n", " print('Physical report already saved to local storage. Reading in file as a pandas DataFrame.')\n", " \n", " ### Read in raw DataFrame\n", " df_summary = pd.read_csv(os.path.join(data_dir_physical, 'engineered', 'Set 2', '5_physical_reports', f'{date}-{training_drill}-PHYSICAL-REPORT-ALL-PLAYERS.csv'))\n", " \n", " \n", " ## Return DataFrame\n", " return df_summary" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Creation of the physical report for the MATCH-MSG training drill started at: 2022-02-15 23:03:43.902718\n", "Creation of the physical report for the MATCH-MSG training drill ended at: 2022-02-15 23:03:44.007419\n", "Time taken to create the physical report for the MATCH-MSG training data is: 0.10 seconds.\n", "Creation of the physical report for the CROSSING-AND-FINISHING-HSR-SPR training drill started at: 2022-02-15 23:03:44.008334\n", "Creation of the physical report for the CROSSING-AND-FINISHING-HSR-SPR training drill ended at: 2022-02-15 23:03:44.080399\n", "Time taken to create the physical report for the CROSSING-AND-FINISHING-HSR-SPR training data is: 0.07 seconds.\n", "Creation of the physical report for the ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY training drill started at: 2022-02-15 23:03:44.080718\n", "Creation of the physical report for the ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY training drill ended at: 2022-02-15 23:03:44.179410\n", "Time taken to create the physical report for the ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY training data is: 0.10 seconds.\n", "Creation of the physical report for the FULL-SESSION-MODIFIED training drill started at: 2022-02-15 23:03:44.179681\n", "Creation of the physical report for the FULL-SESSION-MODIFIED training drill ended at: 2022-02-15 23:03:44.307543\n", "Time taken to create the physical report for the FULL-SESSION-MODIFIED training data is: 0.13 seconds.\n", "Creation of the physical report for the PASSING-DRILL-PHYSICAL training drill started at: 2022-02-15 23:03:44.307838\n", "Creation of the physical report for the PASSING-DRILL-PHYSICAL training drill ended at: 2022-02-15 23:03:44.385170\n", "Time taken to create the physical report for the PASSING-DRILL-PHYSICAL training data is: 0.08 seconds.\n", "Creation of the physical report for the WARM-UP-COORDINATION-AGILITY training drill started at: 2022-02-15 23:03:44.385754\n", "Creation of the physical report for the WARM-UP-COORDINATION-AGILITY training drill ended at: 2022-02-15 23:03:44.460877\n", "Time taken to create the physical report for the WARM-UP-COORDINATION-AGILITY training data is: 0.08 seconds.\n" ] } ], "source": [ "# Create physical reports for each player in each of the six training sessions\n", "df_training_match_msg_physical_report = create_physical_report_per_training_session(df_training_match_msg_vel, date='2022-02-02', training_drill='MATCH-MSG')\n", "df_training_crossing_and_finishing_hsr_spr_physical_report = create_physical_report_per_training_session(df_training_crossing_and_finishing_hsr_spr_vel, date='2022-02-02', training_drill='CROSSING-AND-FINISHING-HSR-SPR')\n", "df_training_attack_vs_defence_attack_superiority_physical_report = create_physical_report_per_training_session(df_training_attack_vs_defence_attack_superiority_vel, date='2022-02-02', training_drill='ATTACK-VS-DEFENCE-ATTACK-SUPERIORITY')\n", "df_training_full_session_modified_physical_report = create_physical_report_per_training_session(df_training_full_session_modified_vel, date='2022-02-02', training_drill='FULL-SESSION-MODIFIED')\n", "df_training_passing_drill_physical_physical_report = create_physical_report_per_training_session(df_training_passing_drill_physical_vel, date='2022-02-02', training_drill='PASSING-DRILL-PHYSICAL')\n", "df_training_warm_up_coordination_agility_physical_report = create_physical_report_per_training_session(df_training_warm_up_coordination_agility_vel, date='2022-02-02', training_drill='WARM-UP-COORDINATION-AGILITY')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "### 4.6. Create Single Physical Report for the Day of Interest" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [], "source": [ "# Define a function to generate a bespoke physical summary of all the players for an individual training session\n", "def create_physical_report_per_day(date):\n", " \n", " \"\"\"\n", " Define a function to generate a bespoke physical summary of all the players for an individual training session\n", " \"\"\"\n", " \n", " ## Read in exported CSV file if exists, if not, download the latest JSON data\n", " if not os.path.exists(os.path.join(data_dir_physical, 'engineered', 'Set 2', '5_physical_reports', f'{date}-ALL-TRAINING-SESSIONS-PHYSICAL-REPORT-ALL-PLAYERS.csv')):\n", " \n", " \n", " ### Start timer\n", " tic = datetime.datetime.now()\n", "\n", " \n", " ### Print time of engineering of tracking data started\n", " print(f'Creation a single training report for {date} started at: {tic}') \n", "\n", "\n", " ### List all files available\n", " lst_all_files = glob.glob(os.path.join(data_dir_physical, 'engineered', 'Set 2', '5_physical_reports', f'{date}*-PHYSICAL-REPORT-ALL-PLAYERS.csv'))\n", "\n", "\n", " ### Create an empty list to append individual DataFrames\n", " lst_files_to_append =[]\n", "\n", "\n", " ### Iterate through each file in list of all files\n", " for file in lst_all_files:\n", "\n", " ### Create temporary DataFrame with each file\n", " df_temp = pd.read_csv(file, index_col=None, header=0)\n", "\n", " ### Append each individual Define each individual file to the empty list (to be concatenated) \n", " lst_files_to_append.append(df_temp)\n", "\n", "\n", " ### Concatenate all the files\n", " df_day_training_report = pd.concat(lst_files_to_append, axis=0, ignore_index=True)\n", "\n", "\n", " ### Save DataFrame\n", "\n", " #### Define filename for each combined file to be saved\n", " save_filename = f'{date}-ALL-TRAINING-SESSIONS-PHYSICAL-REPORT-ALL-PLAYERS'.replace(' ', '-').replace('(', '').replace(')', '').replace(':', '').replace('.', '').replace('__', '_').upper()\n", "\n", " #### Define the filepath to save each combined file\n", " path = os.path.join(data_dir_physical, 'engineered', 'Set 2', '5_physical_reports')\n", "\n", " #### Save the combined file as a CSV\n", " df_day_training_report.to_csv(path + f'/{save_filename}.csv', index=None, header=True)\n", "\n", "\n", " ### Engineer the data\n", "\n", " #### \n", " df_day_training_report['Date'] = date\n", " \n", " \n", " ### End timer\n", " toc = datetime.datetime.now()\n", " \n", " \n", " ### Print time reading of CSV files end\n", " print(f'Creation a single training report for {date} ended at: {toc}')\n", "\n", "\n", " ### Calculate time take\n", " total_time = (toc-tic).total_seconds()\n", " print(f'Time taken create a single training report for {date} is: {total_time:0.2f} seconds.')\n", "\n", " \n", " \n", " ## If CSV file already exists, read in previously saved DataFrame\n", " else:\n", " \n", " ### Print time reading of CSV files started\n", " print('CSV file already saved to local storage. Reading in file as a pandas DataFrame.')\n", " \n", " ### Read in raw DataFrame\n", " df_day_training_report = pd.read_csv(os.path.join(data_dir_physical, 'engineered', 'Set 2', '5_physical_reports', f'{date}-ALL-TRAINING-SESSIONS-PHYSICAL-REPORT-ALL-PLAYERS.csv'))\n", "\n", " \n", " ## Return DataFrame\n", " return df_day_training_report" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Creation a single training report for 2022-02-02 started at: 2022-02-15 23:03:50.916918\n", "Creation a single training report for 2022-02-02 ended at: 2022-02-15 23:03:50.939939\n", "Time taken create a single training report for 2022-02-02 is: 0.02 seconds.\n" ] } ], "source": [ "df_training_report_02022022 = create_physical_report_per_day(date='2022-02-02')" ] }, { "cell_type": "code", "execution_count": 93, "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", "
PlayerDateTraining DrillMinutes TrainedDistance [km]Low-Speed Activities (LSA) [km]Moderate-Speed Running (MSR) [km]High-Speed Running (HSR) [km]Sprinting [km]No. SprintsTop Speed [m/s]Top Acceleration [m/s/s]
0Ngakia2022-02-02WARM-UP-COORDINATION-AGILITY5.3066670.0470110.0411500.0039050.0019560.006.7972286.011910
1Masina2022-02-02WARM-UP-COORDINATION-AGILITY5.3066670.0433650.0388720.0029480.0015450.006.4805615.611116
2Etebo2022-02-02WARM-UP-COORDINATION-AGILITY5.3066670.0449170.0405100.0029680.0014390.006.1416725.416671
3Samir2022-02-02WARM-UP-COORDINATION-AGILITY5.3066670.0441360.0404430.0027990.0008940.005.5972276.210322
4Kayembe2022-02-02WARM-UP-COORDINATION-AGILITY5.3066670.0426060.0398970.0025960.0001140.006.2916724.992067
5Kalu2022-02-02WARM-UP-COORDINATION-AGILITY5.3066670.0435080.0398360.0022410.0014320.005.8888944.976194
6Joao Pedro2022-02-02WARM-UP-COORDINATION-AGILITY5.3066670.0469320.0423580.0030360.0015380.006.9138945.519846
7Kabasele2022-02-02WARM-UP-COORDINATION-AGILITY5.3066670.0462640.0421530.0027500.0013610.006.4444505.480163
8Sierralta2022-02-02WARM-UP-COORDINATION-AGILITY5.3066670.0448850.0400960.0033650.0014240.005.8666716.813498
9King2022-02-02WARM-UP-COORDINATION-AGILITY5.3066670.0462010.0423880.0026120.0012020.006.0111164.309527
\n", "
" ], "text/plain": [ " Player Date Training Drill Minutes Trained \\\n", "0 Ngakia 2022-02-02 WARM-UP-COORDINATION-AGILITY 5.306667 \n", "1 Masina 2022-02-02 WARM-UP-COORDINATION-AGILITY 5.306667 \n", "2 Etebo 2022-02-02 WARM-UP-COORDINATION-AGILITY 5.306667 \n", "3 Samir 2022-02-02 WARM-UP-COORDINATION-AGILITY 5.306667 \n", "4 Kayembe 2022-02-02 WARM-UP-COORDINATION-AGILITY 5.306667 \n", "5 Kalu 2022-02-02 WARM-UP-COORDINATION-AGILITY 5.306667 \n", "6 Joao Pedro 2022-02-02 WARM-UP-COORDINATION-AGILITY 5.306667 \n", "7 Kabasele 2022-02-02 WARM-UP-COORDINATION-AGILITY 5.306667 \n", "8 Sierralta 2022-02-02 WARM-UP-COORDINATION-AGILITY 5.306667 \n", "9 King 2022-02-02 WARM-UP-COORDINATION-AGILITY 5.306667 \n", "\n", " Distance [km] Low-Speed Activities (LSA) [km] \\\n", "0 0.047011 0.041150 \n", "1 0.043365 0.038872 \n", "2 0.044917 0.040510 \n", "3 0.044136 0.040443 \n", "4 0.042606 0.039897 \n", "5 0.043508 0.039836 \n", "6 0.046932 0.042358 \n", "7 0.046264 0.042153 \n", "8 0.044885 0.040096 \n", "9 0.046201 0.042388 \n", "\n", " Moderate-Speed Running (MSR) [km] High-Speed Running (HSR) [km] \\\n", "0 0.003905 0.001956 \n", "1 0.002948 0.001545 \n", "2 0.002968 0.001439 \n", "3 0.002799 0.000894 \n", "4 0.002596 0.000114 \n", "5 0.002241 0.001432 \n", "6 0.003036 0.001538 \n", "7 0.002750 0.001361 \n", "8 0.003365 0.001424 \n", "9 0.002612 0.001202 \n", "\n", " Sprinting [km] No. Sprints Top Speed [m/s] Top Acceleration [m/s/s] \n", "0 0.0 0 6.797228 6.011910 \n", "1 0.0 0 6.480561 5.611116 \n", "2 0.0 0 6.141672 5.416671 \n", "3 0.0 0 5.597227 6.210322 \n", "4 0.0 0 6.291672 4.992067 \n", "5 0.0 0 5.888894 4.976194 \n", "6 0.0 0 6.913894 5.519846 \n", "7 0.0 0 6.444450 5.480163 \n", "8 0.0 0 5.866671 6.813498 \n", "9 0.0 0 6.011116 4.309527 " ] }, "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_training_report_02022022.head(10)" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(133, 12)" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_training_report_02022022.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "\n", "\n", "## 5. Summary\n", "This notebook engineer physical data using [pandas](http://pandas.pydata.org/) to create a series of training reports for players, determining metrics include distance covered, total sprints, top speeds, amoungst other breakdowns." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "\n", "\n", "## 6. Next Steps\n", "The next stage is to visualise this data in Tableau and analyse the findings, to be presented in a deck." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "\n", "\n", "## 7. References\n", "* [Application of Individualized Speed Zones to Quantify External Training Load in Professional Soccer](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7126260/) by Vincenzo Rago, João Brito, Pedro Figueiredo, Peter Krustrup, and António Rebelo.\n", "* [Laurie Shaw](https://twitter.com/EightyFivePoint)'s Metrica Sports Tracking data libraries, [`LaurieOnTracking`](https://github.com/Friends-of-Tracking-Data-FoTD/LaurieOnTracking)" ] }, { "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": "40px", "left": "1118px", "right": "20px", "top": "-7px", "width": "489px" }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "varInspector_section_display": "none", "window_display": true } }, "nbformat": 4, "nbformat_minor": 2 }