Files
fantabeto/.ipynb_checkpoints/1_scraping_fbref-checkpoint.ipynb
T
Giuseppe Musicco 1492328958 Code updated for Serie A 2023/2024
- Reorganization of data folders
- Code adapted for the new Serie A season, also considering only a small number of league games has been played
- Stats from other leagues are considered for players at their first Serie A season (rookies), for now without any adaptation based on league difficulty
- Minor fixes
2023-09-09 19:31:52 +02:00

2969 lines
123 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "markdown",
"id": "d065632b",
"metadata": {},
"source": [
"Scraping from http://fbref.com\n",
"\n",
"Data:\n",
"- outfield players stats\n",
"- goalkeepers stats\n",
"- team stats (of and against)\n",
"\n",
"Original code by parth1902:\n",
"https://github.com/parth1902/Scrape-FBref-data"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "3b8d2e7f",
"metadata": {},
"outputs": [],
"source": [
"import requests\n",
"from bs4 import BeautifulSoup\n",
"import pandas as pd\n",
"import numpy as np\n",
"import re\n",
"import sys, getopt\n",
"import csv\n"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "ab920c85",
"metadata": {},
"outputs": [],
"source": [
"#standard(stats)\n",
"stats = [\"player\",\"nationality\",\"position\",\"team\",\"age\",\"birth_year\",\"games\",\"games_starts\",\"minutes\",\"goals\",\"assists\",\"pens_made\",\"pens_att\",\"cards_yellow\",\"cards_red\",\"goals_per90\",\"assists_per90\",\"goals_assists_per90\",\"goals_pens_per90\",\"goals_assists_pens_per90\",\"xg\",\"npxg\",\"xa\",\"xg_per90\",\"xa_per90\",\"xg_xa_per90\",\"npxg_per90\",\"npxg_xa_per90\"]\n",
"stats3 = [\"players_used\",\"possession\",\"games\",\"games_starts\",\"minutes\",\"goals\",\"assists\",\"pens_made\",\"pens_att\",\"cards_yellow\",\"cards_red\",\"goals_per90\",\"assists_per90\",\"goals_assists_per90\",\"goals_pens_per90\",\"goals_assists_pens_per90\",\"xg\",\"npxg\",\"xa\",\"xg_per90\",\"xa_per90\",\"xg_xa_per90\",\"npxg_per90\",\"npxg_xa_per90\"] \n",
"#goalkeeping(keepers)\n",
"keepers = [\"player\",\"nationality\",\"position\",\"team\",\"age\",\"birth_year\",\"gk_games\",\"gk_games_starts\",\"gk_minutes\",\"gk_goals_against\",\"gk_goals_against_per90\",\"gk_shots_on_target_against\",\"gk_saves\",\"gk_save_pct\",\"gk_wins\",\"gk_ties\",\"gk_losses\",\"gk_clean_sheets\",\"gk_clean_sheets_pct\",\"gk_pens_att\",\"gk_pens_allowed\",\"gk_pens_saved\",\"gk_pens_missed\"]\n",
"keepers3 = [\"players_used\",\"gk_games\",\"gk_games_starts\",\"gk_minutes\",\"gk_goals_against\",\"gk_goals_against_per90\",\"gk_shots_on_target_against\",\"gk_saves\",\"gk_save_pct\",\"gk_wins\",\"gk_ties\",\"gk_losses\",\"gk_clean_sheets\",\"gk_clean_sheets_pct\",\"gk_pens_att\",\"gk_pens_allowed\",\"gk_pens_saved\",\"gk_pens_missed\"]\n",
"#advance goalkeeping(keepersadv)\n",
"keepersadv = [\"player\",\"nationality\",\"position\",\"team\",\"age\",\"birth_year\",\"minutes_90s\",\"gk_goals_against\",\"gk_pens_allowed\",\"gk_free_kick_goals_against\",\"gk_corner_kick_goals_against\",\"gk_own_goals_against\",\"gk_psxg\",\"gk_psnpxg_per_shot_on_target_against\",\"gk_psxg_net\",\"gk_psxg_net_per90\",\"gk_passes_completed_launched\",\"gk_passes_launched\",\"gk_passes_pct_launched\",\"gk_passes\",\"gk_passes_throws\",\"gk_pct_passes_launched\",\"gk_passes_length_avg\",\"gk_goal_kicks\",\"gk_pct_goal_kicks_launched\",\"gk_goal_kick_length_avg\",\"gk_crosses\",\"gk_crosses_stopped\",\"gk_crosses_stopped_pct\",\"gk_def_actions_outside_pen_area\",\"gk_def_actions_outside_pen_area_per90\",\"gk_avg_distance_def_actions\"]\n",
"keepersadv2 = [\"minutes_90s\",\"gk_goals_against\",\"gk_pens_allowed\",\"gk_free_kick_goals_against\",\"gk_corner_kick_goals_against\",\"gk_own_goals_against\",\"gk_psxg\",\"gk_psnpxg_per_shot_on_target_against\",\"gk_psxg_net\",\"gk_psxg_net_per90\",\"gk_passes_completed_launched\",\"gk_passes_launched\",\"gk_passes_pct_launched\",\"gk_passes\",\"gk_passes_throws\",\"gk_pct_passes_launched\",\"gk_passes_length_avg\",\"gk_goal_kicks\",\"gk_pct_goal_kicks_launched\",\"gk_goal_kick_length_avg\",\"gk_crosses\",\"gk_crosses_stopped\",\"gk_crosses_stopped_pct\",\"gk_def_actions_outside_pen_area\",\"gk_def_actions_outside_pen_area_per90\",\"gk_avg_distance_def_actions\"]\n",
"#shooting(shooting)\n",
"shooting = [\"player\",\"nationality\",\"position\",\"team\",\"age\",\"birth_year\",\"minutes_90s\",\"goals\",\"pens_made\",\"pens_att\",\"shots_total\",\"shots_on_target\",\"shots_free_kicks\",\"shots_on_target_pct\",\"shots_total_per90\",\"shots_on_target_per90\",\"goals_per_shot\",\"goals_per_shot_on_target\",\"xg\",\"npxg\",\"npxg_per_shot\",\"xg_net\",\"npxg_net\"]\n",
"shooting2 = [\"minutes_90s\",\"goals\",\"pens_made\",\"pens_att\",\"shots_total\",\"shots_on_target\",\"shots_free_kicks\",\"shots_on_target_pct\",\"shots_total_per90\",\"shots_on_target_per90\",\"goals_per_shot\",\"goals_per_shot_on_target\",\"xg\",\"npxg\",\"npxg_per_shot\",\"xg_net\",\"npxg_net\"]\n",
"shooting3 = [\"goals\",\"pens_made\",\"pens_att\",\"shots_total\",\"shots_on_target\",\"shots_free_kicks\",\"shots_on_target_pct\",\"shots_total_per90\",\"shots_on_target_per90\",\"goals_per_shot\",\"goals_per_shot_on_target\",\"xg\",\"npxg\",\"npxg_per_shot\",\"xg_net\",\"npxg_net\"]\n",
"#passing(passing)\n",
"passing = [\"player\",\"nationality\",\"position\",\"team\",\"age\",\"birth_year\",\"minutes_90s\",\"passes_completed\",\"passes\",\"passes_pct\",\"passes_total_distance\",\"passes_progressive_distance\",\"passes_completed_short\",\"passes_short\",\"passes_pct_short\",\"passes_completed_medium\",\"passes_medium\",\"passes_pct_medium\",\"passes_completed_long\",\"passes_long\",\"passes_pct_long\",\"assists\",\"xa\",\"xa_net\",\"assisted_shots\",\"passes_into_final_third\",\"passes_into_penalty_area\",\"crosses_into_penalty_area\",\"progressive_passes\"]\n",
"passing2 = [\"passes_completed\",\"passes\",\"passes_pct\",\"passes_total_distance\",\"passes_progressive_distance\",\"passes_completed_short\",\"passes_short\",\"passes_pct_short\",\"passes_completed_medium\",\"passes_medium\",\"passes_pct_medium\",\"passes_completed_long\",\"passes_long\",\"passes_pct_long\",\"assists\",\"xa\",\"xa_net\",\"assisted_shots\",\"passes_into_final_third\",\"passes_into_penalty_area\",\"crosses_into_penalty_area\",\"progressive_passes\"]\n",
"#passtypes(passing_types)\n",
"passing_types = [\"player\",\"nationality\",\"position\",\"team\",\"age\",\"birth_year\",\"minutes_90s\",\"passes\",\"passes_live\",\"passes_dead\",\"passes_free_kicks\",\"through_balls\",\"passes_pressure\",\"passes_switches\",\"crosses\",\"corner_kicks\",\"corner_kicks_in\",\"corner_kicks_out\",\"corner_kicks_straight\",\"passes_ground\",\"passes_low\",\"passes_high\",\"passes_left_foot\",\"passes_right_foot\",\"passes_head\",\"throw_ins\",\"passes_other_body\",\"passes_completed\",\"passes_offsides\",\"passes_oob\",\"passes_intercepted\",\"passes_blocked\"]\n",
"passing_types2 = [\"passes\",\"passes_live\",\"passes_dead\",\"passes_free_kicks\",\"through_balls\",\"passes_pressure\",\"passes_switches\",\"crosses\",\"corner_kicks\",\"corner_kicks_in\",\"corner_kicks_out\",\"corner_kicks_straight\",\"passes_ground\",\"passes_low\",\"passes_high\",\"passes_left_foot\",\"passes_right_foot\",\"passes_head\",\"throw_ins\",\"passes_other_body\",\"passes_completed\",\"passes_offsides\",\"passes_oob\",\"passes_intercepted\",\"passes_blocked\"]\n",
"#goal and shot creation(gca)\n",
"gca = [\"player\",\"nationality\",\"position\",\"team\",\"age\",\"birth_year\",\"minutes_90s\",\"sca\",\"sca_per90\",\"sca_passes_live\",\"sca_passes_dead\",\"sca_dribbles\",\"sca_shots\",\"sca_fouled\",\"gca\",\"gca_per90\",\"gca_passes_live\",\"gca_passes_dead\",\"gca_dribbles\",\"gca_shots\",\"gca_fouled\",\"gca_defense\"]\n",
"gca2 = [\"sca\",\"sca_per90\",\"sca_passes_live\",\"sca_passes_dead\",\"sca_dribbles\",\"sca_shots\",\"sca_fouled\",\"gca\",\"gca_per90\",\"gca_passes_live\",\"gca_passes_dead\",\"gca_dribbles\",\"gca_shots\",\"gca_fouled\",\"gca_defense\"]\n",
"#defensive actions(defense)\n",
"defense = [\"player\",\"nationality\",\"position\",\"team\",\"age\",\"birth_year\",\"minutes_90s\",\"tackles\",\"tackles_won\",\"tackles_def_3rd\",\"tackles_mid_3rd\",\"tackles_att_3rd\",\"dribble_tackles\",\"dribbles_vs\",\"dribble_tackles_pct\",\"dribbled_past\",\"pressures\",\"pressure_regains\",\"pressure_regain_pct\",\"pressures_def_3rd\",\"pressures_mid_3rd\",\"pressures_att_3rd\",\"blocks\",\"blocked_shots\",\"blocked_shots_saves\",\"blocked_passes\",\"interceptions\",\"clearances\",\"errors\"]\n",
"defense2 = [\"tackles\",\"tackles_won\",\"tackles_def_3rd\",\"tackles_mid_3rd\",\"tackles_att_3rd\",\"dribble_tackles\",\"dribbles_vs\",\"dribble_tackles_pct\",\"dribbled_past\",\"pressures\",\"pressure_regains\",\"pressure_regain_pct\",\"pressures_def_3rd\",\"pressures_mid_3rd\",\"pressures_att_3rd\",\"blocks\",\"blocked_shots\",\"blocked_shots_saves\",\"blocked_passes\",\"interceptions\",\"clearances\",\"errors\"]\n",
"#possession(possession)\n",
"possession = [\"player\",\"nationality\",\"position\",\"team\",\"age\",\"birth_year\",\"minutes_90s\",\"touches\",\"touches_def_pen_area\",\"touches_def_3rd\",\"touches_mid_3rd\",\"touches_att_3rd\",\"touches_att_pen_area\",\"touches_live_ball\",\"dribbles_completed\",\"dribbles\",\"dribbles_completed_pct\",\"players_dribbled_past\",\"nutmegs\",\"carries\",\"carry_distance\",\"carry_progressive_distance\",\"progressive_carries\",\"carries_into_final_third\",\"carries_into_penalty_area\",\"pass_targets\",\"passes_received\",\"passes_received_pct\",\"miscontrols\",\"dispossessed\"]\n",
"possession2 = [\"touches\",\"touches_def_pen_area\",\"touches_def_3rd\",\"touches_mid_3rd\",\"touches_att_3rd\",\"touches_att_pen_area\",\"touches_live_ball\",\"dribbles_completed\",\"dribbles\",\"dribbles_completed_pct\",\"players_dribbled_past\",\"nutmegs\",\"carries\",\"carry_distance\",\"carry_progressive_distance\",\"progressive_carries\",\"carries_into_final_third\",\"carries_into_penalty_area\",\"pass_targets\",\"passes_received\",\"passes_received_pct\",\"miscontrols\",\"dispossessed\"]\n",
"#playingtime(playingtime)\n",
"playingtime = [\"player\",\"nationality\",\"position\",\"team\",\"age\",\"birth_year\",\"minutes_90s\",\"games\",\"minutes\",\"minutes_per_game\",\"minutes_pct\",\"games_starts\",\"minutes_per_start\",\"games_subs\",\"minutes_per_sub\",\"unused_subs\",\"points_per_match\",\"on_goals_for\",\"on_goals_against\",\"plus_minus\",\"plus_minus_per90\",\"plus_minus_wowy\",\"on_xg_for\",\"on_xg_against\",\"xg_plus_minus\",\"xg_plus_minus_per90\",\"xg_plus_minus_wowy\"]\n",
"playingtime2 = [\"games\",\"minutes\",\"minutes_per_game\",\"minutes_pct\",\"games_starts\",\"minutes_per_start\",\"games_subs\",\"minutes_per_sub\",\"unused_subs\",\"points_per_match\",\"on_goals_for\",\"on_goals_against\",\"plus_minus\",\"plus_minus_per90\",\"plus_minus_wowy\",\"on_xg_for\",\"on_xg_against\",\"xg_plus_minus\",\"xg_plus_minus_per90\",\"xg_plus_minus_wowy\"]\n",
"#miscallaneous(misc)\n",
"misc = [\"player\",\"nationality\",\"position\",\"team\",\"age\",\"birth_year\",\"minutes_90s\",\"cards_yellow\",\"cards_red\",\"cards_yellow_red\",\"fouls\",\"fouled\",\"offsides\",\"crosses\",\"interceptions\",\"tackles_won\",\"pens_won\",\"pens_conceded\",\"own_goals\",\"ball_recoveries\",\"aerials_won\",\"aerials_lost\",\"aerials_won_pct\"]\n",
"misc2 = [\"cards_yellow\",\"cards_red\",\"cards_yellow_red\",\"fouls\",\"fouled\",\"offsides\",\"crosses\",\"interceptions\",\"tackles_won\",\"pens_won\",\"pens_conceded\",\"own_goals\",\"ball_recoveries\",\"aerials_won\",\"aerials_lost\",\"aerials_won_pct\"]\n",
"\n",
"def get_tables(url,text):\n",
" headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}\n",
"\n",
" res = requests.get(url, headers = headers)\n",
" ## The next two lines get around the issue with comments breaking the parsing.\n",
" comm = re.compile(\"<!--|-->\")\n",
" soup = BeautifulSoup(comm.sub(\"\",res.text),'lxml')\n",
" all_tables = soup.findAll(\"tbody\")\n",
" \n",
" team_table = all_tables[0]\n",
" team_vs_table = all_tables[1]\n",
" player_table = all_tables[2]\n",
" if text == 'for':\n",
" return player_table, team_table\n",
" if text == 'vs':\n",
" return player_table, team_vs_table\n",
"\n",
"def get_frame(features, player_table):\n",
" pre_df_player = dict()\n",
" features_wanted_player = features\n",
" rows_player = player_table.find_all('tr')\n",
" for row in rows_player:\n",
" if(row.find('th',{\"scope\":\"row\"}) != None):\n",
" \n",
" for f in features_wanted_player:\n",
" cell = row.find(\"td\",{\"data-stat\": f})\n",
" if(cell == None):\n",
" continue\n",
" a = cell.text.strip().encode()\n",
" text=a.decode(\"utf-8\")\n",
" if(text == ''):\n",
" text = '0'\n",
" if((f!='player')&(f!='nationality')&(f!='position')&(f!='squad')&(f!='age')&(f!='birth_year')&(f!='team')):\n",
" text = float(text.replace(',','')) \n",
" if f in pre_df_player:\n",
" pre_df_player[f].append(text)\n",
" else:\n",
" pre_df_player[f] = [text]\n",
" df_player = pd.DataFrame.from_dict(pre_df_player)\n",
" return df_player\n",
"\n",
"def get_frame_team(features, team_table):\n",
" pre_df_squad = dict()\n",
" #Note: features does not contain squad name, it requires special treatment\n",
" features_wanted_squad = features\n",
" rows_squad = team_table.find_all('tr')\n",
" for row in rows_squad:\n",
" if(row.find('th',{\"scope\":\"row\"}) != None):\n",
" name = row.find('th',{\"data-stat\":\"team\"}).text.strip().encode().decode(\"utf-8\")\n",
" if 'team' in pre_df_squad:\n",
" pre_df_squad['team'].append(name)\n",
" else:\n",
" pre_df_squad['team'] = [name]\n",
" for f in features_wanted_squad:\n",
" cell = row.find(\"td\",{\"data-stat\": f})\n",
" if(cell == None):\n",
" continue\n",
" a = cell.text.strip().encode()\n",
" text=a.decode(\"utf-8\")\n",
" if(text == ''):\n",
" text = '0'\n",
" if((f!='player')&(f!='nationality')&(f!='position')&(f!='squad')&(f!='age')&(f!='birth_year')&(f!='team')):\n",
" text = float(text.replace(',',''))\n",
" if f in pre_df_squad:\n",
" pre_df_squad[f].append(text)\n",
" else:\n",
" pre_df_squad[f] = [text]\n",
" df_squad = pd.DataFrame.from_dict(pre_df_squad)\n",
" return df_squad\n",
"\n",
"def get_frame_team_2(features, team_table):\n",
" pre_df_squad = dict()\n",
" #Note: features does not contain squad name, it requires special treatment\n",
" features_wanted_squad = features\n",
" rows_squad = team_table.find_all('tr')\n",
" for row in rows_squad:\n",
" if(row.find('th',{\"scope\":\"row\"}) != None):\n",
" name = row.find('th',{\"data-stat\":\"squad\"}).text.strip().encode().decode(\"utf-8\")\n",
" if 'squad' in pre_df_squad:\n",
" pre_df_squad['squad'].append(name)\n",
" else:\n",
" pre_df_squad['squad'] = [name]\n",
" for f in features_wanted_squad:\n",
" cell = row.find(\"td\",{\"data-stat\": f})\n",
" a = cell.text.strip().encode()\n",
" text=a.decode(\"utf-8\")\n",
" if(text == ''):\n",
" text = '0'\n",
" if((f!='player')&(f!='nationality')&(f!='position')&(f!='squad')&(f!='age')&(f!='birth_year')&(f!='team')):\n",
" text = float(text.replace(',',''))\n",
" print(f)\n",
" if f in pre_df_squad:\n",
" pre_df_squad[f].append(text)\n",
" else:\n",
" pre_df_squad[f] = [text]\n",
" df_squad = pd.DataFrame.from_dict(pre_df_squad)\n",
" return df_squad\n",
"\n",
"def frame_for_category(category,top,end,features):\n",
" url = (top + category + end)\n",
" player_table, team_table = get_tables(url,'for')\n",
" df_player = get_frame(features, player_table)\n",
" return df_player\n",
"\n",
"def frame_for_category_team(category,top,end,features,text):\n",
" url = (top + category + end)\n",
" player_table, team_table = get_tables(url,text)\n",
" df_team = get_frame_team(features, team_table)\n",
" return df_team\n",
"\n",
"\n",
"\n",
"\n",
"#Function to get the player data for outfield player, includes all categories - standard stats, shooting\n",
"#passing, passing types, goal and shot creation, defensive actions, possession, and miscallaneous\n",
"def get_outfield_data(top, end):\n",
" df1 = frame_for_category('stats',top,end,stats)\n",
" df2 = frame_for_category('shooting',top,end,shooting2)\n",
" df3 = frame_for_category('passing',top,end,passing2)\n",
" df4 = frame_for_category('passing_types',top,end,passing_types2)\n",
" df5 = frame_for_category('gca',top,end,gca2)\n",
" df6 = frame_for_category('defense',top,end,defense2)\n",
" df7 = frame_for_category('possession',top,end,possession2)\n",
" df8 = frame_for_category('misc',top,end,misc2)\n",
" df = pd.concat([df1, df2, df3, df4, df5, df6, df7, df8], axis=1)\n",
" df = df.loc[:,~df.columns.duplicated()]\n",
" return df\n",
"\n",
"\n",
"#Function to get keeping and advance goalkeeping data\n",
"def get_keeper_data(top,end):\n",
" df1 = frame_for_category('keepers',top,end,keepers)\n",
" df2 = frame_for_category('keepersadv',top,end,keepersadv2)\n",
" df = pd.concat([df1, df2], axis=1)\n",
" df = df.loc[:,~df.columns.duplicated()]\n",
" return df\n",
"\n",
"\n",
"\n",
"#Function to get team-wise data accross all categories as mentioned above\n",
"def get_team_data(top,end,text):\n",
" df1 = frame_for_category_team('stats',top,end,stats3,text)\n",
" df2 = frame_for_category_team('keepers',top,end,keepers3,text)\n",
" df3 = frame_for_category_team('keepersadv',top,end,keepersadv2,text)\n",
" df4 = frame_for_category_team('shooting',top,end,shooting3,text)\n",
" df5 = frame_for_category_team('passing',top,end,passing2,text)\n",
" df6 = frame_for_category_team('passing_types',top,end,passing_types2,text)\n",
" df7 = frame_for_category_team('gca',top,end,gca2,text)\n",
" df8 = frame_for_category_team('defense',top,end,defense2,text)\n",
" df9 = frame_for_category_team('possession',top,end,possession2,text)\n",
" df10 = frame_for_category_team('misc',top,end,misc2,text)\n",
" df = pd.concat([df1, df2, df3, df4, df5, df6, df7, df8, df9, df10], axis=1)\n",
" df = df.loc[:,~df.columns.duplicated()]\n",
" return df"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "9141a9ec",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>player</th>\n",
" <th>nationality</th>\n",
" <th>position</th>\n",
" <th>team</th>\n",
" <th>age</th>\n",
" <th>birth_year</th>\n",
" <th>games</th>\n",
" <th>games_starts</th>\n",
" <th>minutes</th>\n",
" <th>goals</th>\n",
" <th>...</th>\n",
" <th>fouls</th>\n",
" <th>fouled</th>\n",
" <th>offsides</th>\n",
" <th>pens_won</th>\n",
" <th>pens_conceded</th>\n",
" <th>own_goals</th>\n",
" <th>ball_recoveries</th>\n",
" <th>aerials_won</th>\n",
" <th>aerials_lost</th>\n",
" <th>aerials_won_pct</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Michel Aebischer</td>\n",
" <td>ch SUI</td>\n",
" <td>MF</td>\n",
" <td>Bologna</td>\n",
" <td>26-246</td>\n",
" <td>1997</td>\n",
" <td>3.0</td>\n",
" <td>3.0</td>\n",
" <td>257.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>4.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>19.0</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>66.7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Luis Alberto</td>\n",
" <td>es ESP</td>\n",
" <td>MF</td>\n",
" <td>Lazio</td>\n",
" <td>30-346</td>\n",
" <td>1992</td>\n",
" <td>3.0</td>\n",
" <td>3.0</td>\n",
" <td>270.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>2.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>18.0</td>\n",
" <td>2.0</td>\n",
" <td>3.0</td>\n",
" <td>40.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Pontus Almqvist</td>\n",
" <td>se SWE</td>\n",
" <td>FW</td>\n",
" <td>Lecce</td>\n",
" <td>24-061</td>\n",
" <td>1999</td>\n",
" <td>3.0</td>\n",
" <td>3.0</td>\n",
" <td>270.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>2.0</td>\n",
" <td>3.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>10.0</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Lorenzo Amatucci</td>\n",
" <td>it ITA</td>\n",
" <td>MF</td>\n",
" <td>Fiorentina</td>\n",
" <td>19-216</td>\n",
" <td>2004</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>16.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Bruno Amione</td>\n",
" <td>ar ARG</td>\n",
" <td>MF</td>\n",
" <td>Hellas Verona</td>\n",
" <td>21-249</td>\n",
" <td>2002</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>394</th>\n",
" <td>Joshua Zirkzee</td>\n",
" <td>nl NED</td>\n",
" <td>FW</td>\n",
" <td>Bologna</td>\n",
" <td>22-110</td>\n",
" <td>2001</td>\n",
" <td>3.0</td>\n",
" <td>3.0</td>\n",
" <td>266.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>10.0</td>\n",
" <td>6.0</td>\n",
" <td>2.0</td>\n",
" <td>75.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>395</th>\n",
" <td>Zito</td>\n",
" <td>ao ANG</td>\n",
" <td>FW</td>\n",
" <td>Cagliari</td>\n",
" <td>21-184</td>\n",
" <td>2002</td>\n",
" <td>3.0</td>\n",
" <td>2.0</td>\n",
" <td>207.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>2.0</td>\n",
" <td>6.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>1.0</td>\n",
" <td>4.0</td>\n",
" <td>20.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>396</th>\n",
" <td>Nadir Zortea</td>\n",
" <td>it ITA</td>\n",
" <td>DF</td>\n",
" <td>Atalanta</td>\n",
" <td>24-082</td>\n",
" <td>1999</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>64.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>397</th>\n",
" <td>Milan Đurić</td>\n",
" <td>ba BIH</td>\n",
" <td>FW,MF</td>\n",
" <td>Hellas Verona</td>\n",
" <td>33-110</td>\n",
" <td>1990</td>\n",
" <td>3.0</td>\n",
" <td>1.0</td>\n",
" <td>123.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>6.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>16.0</td>\n",
" <td>10.0</td>\n",
" <td>61.5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>398</th>\n",
" <td>Mateusz Łęgowski</td>\n",
" <td>pl POL</td>\n",
" <td>MF,DF</td>\n",
" <td>Salernitana</td>\n",
" <td>20-223</td>\n",
" <td>2003</td>\n",
" <td>3.0</td>\n",
" <td>1.0</td>\n",
" <td>95.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>3.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>10.0</td>\n",
" <td>2.0</td>\n",
" <td>3.0</td>\n",
" <td>40.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>399 rows × 115 columns</p>\n",
"</div>"
],
"text/plain": [
" player nationality position team age birth_year \\\n",
"0 Michel Aebischer ch SUI MF Bologna 26-246 1997 \n",
"1 Luis Alberto es ESP MF Lazio 30-346 1992 \n",
"2 Pontus Almqvist se SWE FW Lecce 24-061 1999 \n",
"3 Lorenzo Amatucci it ITA MF Fiorentina 19-216 2004 \n",
"4 Bruno Amione ar ARG MF Hellas Verona 21-249 2002 \n",
".. ... ... ... ... ... ... \n",
"394 Joshua Zirkzee nl NED FW Bologna 22-110 2001 \n",
"395 Zito ao ANG FW Cagliari 21-184 2002 \n",
"396 Nadir Zortea it ITA DF Atalanta 24-082 1999 \n",
"397 Milan Đurić ba BIH FW,MF Hellas Verona 33-110 1990 \n",
"398 Mateusz Łęgowski pl POL MF,DF Salernitana 20-223 2003 \n",
"\n",
" games games_starts minutes goals ... fouls fouled offsides \\\n",
"0 3.0 3.0 257.0 0.0 ... 4.0 3.0 0.0 \n",
"1 3.0 3.0 270.0 1.0 ... 2.0 3.0 0.0 \n",
"2 3.0 3.0 270.0 1.0 ... 2.0 3.0 1.0 \n",
"3 1.0 0.0 16.0 0.0 ... 1.0 0.0 0.0 \n",
"4 1.0 0.0 2.0 0.0 ... 1.0 0.0 0.0 \n",
".. ... ... ... ... ... ... ... ... \n",
"394 3.0 3.0 266.0 1.0 ... 2.0 0.0 1.0 \n",
"395 3.0 2.0 207.0 1.0 ... 2.0 6.0 2.0 \n",
"396 2.0 0.0 64.0 1.0 ... 1.0 0.0 0.0 \n",
"397 3.0 1.0 123.0 0.0 ... 6.0 1.0 1.0 \n",
"398 3.0 1.0 95.0 0.0 ... 3.0 2.0 0.0 \n",
"\n",
" pens_won pens_conceded own_goals ball_recoveries aerials_won \\\n",
"0 0.0 0.0 0.0 19.0 2.0 \n",
"1 0.0 0.0 0.0 18.0 2.0 \n",
"2 0.0 0.0 0.0 10.0 0.0 \n",
"3 0.0 0.0 0.0 1.0 0.0 \n",
"4 0.0 0.0 0.0 0.0 0.0 \n",
".. ... ... ... ... ... \n",
"394 0.0 0.0 0.0 10.0 6.0 \n",
"395 0.0 0.0 0.0 4.0 1.0 \n",
"396 0.0 0.0 0.0 4.0 0.0 \n",
"397 0.0 0.0 0.0 4.0 16.0 \n",
"398 0.0 0.0 0.0 10.0 2.0 \n",
"\n",
" aerials_lost aerials_won_pct \n",
"0 1.0 66.7 \n",
"1 3.0 40.0 \n",
"2 2.0 0.0 \n",
"3 1.0 0.0 \n",
"4 0.0 0.0 \n",
".. ... ... \n",
"394 2.0 75.0 \n",
"395 4.0 20.0 \n",
"396 1.0 0.0 \n",
"397 10.0 61.5 \n",
"398 3.0 40.0 \n",
"\n",
"[399 rows x 115 columns]"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_outfield = get_outfield_data('https://fbref.com/en/comps/11/','/Serie-A-Stats')\n",
"\n",
"df_outfield.to_csv('fbref_data/outfield_players.csv', index=False)\n",
"\n",
"df_outfield"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "9a30e27c",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>player</th>\n",
" <th>nationality</th>\n",
" <th>position</th>\n",
" <th>team</th>\n",
" <th>age</th>\n",
" <th>birth_year</th>\n",
" <th>gk_games</th>\n",
" <th>gk_games_starts</th>\n",
" <th>gk_minutes</th>\n",
" <th>gk_goals_against</th>\n",
" <th>...</th>\n",
" <th>gk_passes_length_avg</th>\n",
" <th>gk_goal_kicks</th>\n",
" <th>gk_pct_goal_kicks_launched</th>\n",
" <th>gk_goal_kick_length_avg</th>\n",
" <th>gk_crosses</th>\n",
" <th>gk_crosses_stopped</th>\n",
" <th>gk_crosses_stopped_pct</th>\n",
" <th>gk_def_actions_outside_pen_area</th>\n",
" <th>gk_def_actions_outside_pen_area_per90</th>\n",
" <th>gk_avg_distance_def_actions</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Etrit Berisha</td>\n",
" <td>al ALB</td>\n",
" <td>GK</td>\n",
" <td>Empoli</td>\n",
" <td>34-183</td>\n",
" <td>1989</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>90.0</td>\n",
" <td>2.0</td>\n",
" <td>...</td>\n",
" <td>29.7</td>\n",
" <td>7.0</td>\n",
" <td>28.6</td>\n",
" <td>28.0</td>\n",
" <td>17.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" <td>2.00</td>\n",
" <td>16.6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Elia Caprile</td>\n",
" <td>it ITA</td>\n",
" <td>GK</td>\n",
" <td>Empoli</td>\n",
" <td>22-015</td>\n",
" <td>2001</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>90.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>42.6</td>\n",
" <td>4.0</td>\n",
" <td>50.0</td>\n",
" <td>50.3</td>\n",
" <td>10.0</td>\n",
" <td>2.0</td>\n",
" <td>20.0</td>\n",
" <td>2.0</td>\n",
" <td>2.00</td>\n",
" <td>12.4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Michele Cerofolini</td>\n",
" <td>it ITA</td>\n",
" <td>GK</td>\n",
" <td>Frosinone</td>\n",
" <td>24-248</td>\n",
" <td>1999</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>90.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>38.3</td>\n",
" <td>5.0</td>\n",
" <td>60.0</td>\n",
" <td>45.8</td>\n",
" <td>18.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.00</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Oliver Christensen</td>\n",
" <td>dk DEN</td>\n",
" <td>GK</td>\n",
" <td>Fiorentina</td>\n",
" <td>24-171</td>\n",
" <td>1999</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>180.0</td>\n",
" <td>6.0</td>\n",
" <td>...</td>\n",
" <td>33.2</td>\n",
" <td>8.0</td>\n",
" <td>62.5</td>\n",
" <td>49.4</td>\n",
" <td>15.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>3.0</td>\n",
" <td>1.50</td>\n",
" <td>22.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Andrea Consigli</td>\n",
" <td>it ITA</td>\n",
" <td>GK</td>\n",
" <td>Sassuolo</td>\n",
" <td>36-225</td>\n",
" <td>1987</td>\n",
" <td>3.0</td>\n",
" <td>3.0</td>\n",
" <td>270.0</td>\n",
" <td>5.0</td>\n",
" <td>...</td>\n",
" <td>37.1</td>\n",
" <td>34.0</td>\n",
" <td>26.5</td>\n",
" <td>28.1</td>\n",
" <td>46.0</td>\n",
" <td>2.0</td>\n",
" <td>4.3</td>\n",
" <td>3.0</td>\n",
" <td>1.00</td>\n",
" <td>14.5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Michele Di Gregorio</td>\n",
" <td>it ITA</td>\n",
" <td>GK</td>\n",
" <td>Monza</td>\n",
" <td>26-044</td>\n",
" <td>1997</td>\n",
" <td>3.0</td>\n",
" <td>3.0</td>\n",
" <td>270.0</td>\n",
" <td>5.0</td>\n",
" <td>...</td>\n",
" <td>28.7</td>\n",
" <td>22.0</td>\n",
" <td>40.9</td>\n",
" <td>40.3</td>\n",
" <td>45.0</td>\n",
" <td>2.0</td>\n",
" <td>4.4</td>\n",
" <td>2.0</td>\n",
" <td>0.67</td>\n",
" <td>11.7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>Wladimiro Falcone</td>\n",
" <td>it ITA</td>\n",
" <td>GK</td>\n",
" <td>Lecce</td>\n",
" <td>28-150</td>\n",
" <td>1995</td>\n",
" <td>3.0</td>\n",
" <td>3.0</td>\n",
" <td>270.0</td>\n",
" <td>3.0</td>\n",
" <td>...</td>\n",
" <td>35.0</td>\n",
" <td>24.0</td>\n",
" <td>62.5</td>\n",
" <td>42.3</td>\n",
" <td>32.0</td>\n",
" <td>2.0</td>\n",
" <td>6.3</td>\n",
" <td>1.0</td>\n",
" <td>0.33</td>\n",
" <td>9.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Mike Maignan</td>\n",
" <td>fr FRA</td>\n",
" <td>GK</td>\n",
" <td>Milan</td>\n",
" <td>28-068</td>\n",
" <td>1995</td>\n",
" <td>3.0</td>\n",
" <td>3.0</td>\n",
" <td>270.0</td>\n",
" <td>2.0</td>\n",
" <td>...</td>\n",
" <td>30.5</td>\n",
" <td>20.0</td>\n",
" <td>65.0</td>\n",
" <td>49.3</td>\n",
" <td>43.0</td>\n",
" <td>12.0</td>\n",
" <td>27.9</td>\n",
" <td>3.0</td>\n",
" <td>1.00</td>\n",
" <td>10.3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>Josep Martinez</td>\n",
" <td>es ESP</td>\n",
" <td>GK</td>\n",
" <td>Genoa</td>\n",
" <td>25-105</td>\n",
" <td>1998</td>\n",
" <td>3.0</td>\n",
" <td>3.0</td>\n",
" <td>270.0</td>\n",
" <td>5.0</td>\n",
" <td>...</td>\n",
" <td>40.1</td>\n",
" <td>14.0</td>\n",
" <td>92.9</td>\n",
" <td>62.2</td>\n",
" <td>64.0</td>\n",
" <td>8.0</td>\n",
" <td>12.5</td>\n",
" <td>2.0</td>\n",
" <td>0.67</td>\n",
" <td>9.7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>Alex Meret</td>\n",
" <td>it ITA</td>\n",
" <td>GK</td>\n",
" <td>Napoli</td>\n",
" <td>26-171</td>\n",
" <td>1997</td>\n",
" <td>3.0</td>\n",
" <td>3.0</td>\n",
" <td>270.0</td>\n",
" <td>3.0</td>\n",
" <td>...</td>\n",
" <td>24.4</td>\n",
" <td>8.0</td>\n",
" <td>0.0</td>\n",
" <td>21.4</td>\n",
" <td>15.0</td>\n",
" <td>1.0</td>\n",
" <td>6.7</td>\n",
" <td>5.0</td>\n",
" <td>1.67</td>\n",
" <td>18.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>Vanja Milinković-Savić</td>\n",
" <td>rs SRB</td>\n",
" <td>GK</td>\n",
" <td>Torino</td>\n",
" <td>26-201</td>\n",
" <td>1997</td>\n",
" <td>3.0</td>\n",
" <td>3.0</td>\n",
" <td>270.0</td>\n",
" <td>4.0</td>\n",
" <td>...</td>\n",
" <td>34.1</td>\n",
" <td>29.0</td>\n",
" <td>69.0</td>\n",
" <td>58.9</td>\n",
" <td>23.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.33</td>\n",
" <td>14.2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>Lorenzo Montipò</td>\n",
" <td>it ITA</td>\n",
" <td>GK</td>\n",
" <td>Hellas Verona</td>\n",
" <td>27-201</td>\n",
" <td>1996</td>\n",
" <td>3.0</td>\n",
" <td>3.0</td>\n",
" <td>270.0</td>\n",
" <td>4.0</td>\n",
" <td>...</td>\n",
" <td>43.0</td>\n",
" <td>28.0</td>\n",
" <td>85.7</td>\n",
" <td>61.0</td>\n",
" <td>44.0</td>\n",
" <td>1.0</td>\n",
" <td>2.3</td>\n",
" <td>8.0</td>\n",
" <td>2.67</td>\n",
" <td>20.9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>Juan Musso</td>\n",
" <td>ar ARG</td>\n",
" <td>GK</td>\n",
" <td>Atalanta</td>\n",
" <td>29-126</td>\n",
" <td>1994</td>\n",
" <td>3.0</td>\n",
" <td>3.0</td>\n",
" <td>270.0</td>\n",
" <td>2.0</td>\n",
" <td>...</td>\n",
" <td>29.3</td>\n",
" <td>18.0</td>\n",
" <td>55.6</td>\n",
" <td>46.1</td>\n",
" <td>28.0</td>\n",
" <td>2.0</td>\n",
" <td>7.1</td>\n",
" <td>8.0</td>\n",
" <td>2.67</td>\n",
" <td>22.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>Guillermo Ochoa</td>\n",
" <td>mx MEX</td>\n",
" <td>GK</td>\n",
" <td>Salernitana</td>\n",
" <td>38-058</td>\n",
" <td>1985</td>\n",
" <td>3.0</td>\n",
" <td>3.0</td>\n",
" <td>270.0</td>\n",
" <td>5.0</td>\n",
" <td>...</td>\n",
" <td>38.7</td>\n",
" <td>31.0</td>\n",
" <td>61.3</td>\n",
" <td>46.3</td>\n",
" <td>51.0</td>\n",
" <td>3.0</td>\n",
" <td>5.9</td>\n",
" <td>1.0</td>\n",
" <td>0.33</td>\n",
" <td>8.3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>Rui Patrício</td>\n",
" <td>pt POR</td>\n",
" <td>GK</td>\n",
" <td>Roma</td>\n",
" <td>35-206</td>\n",
" <td>1988</td>\n",
" <td>3.0</td>\n",
" <td>3.0</td>\n",
" <td>270.0</td>\n",
" <td>6.0</td>\n",
" <td>...</td>\n",
" <td>29.7</td>\n",
" <td>12.0</td>\n",
" <td>16.7</td>\n",
" <td>24.5</td>\n",
" <td>15.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" <td>0.67</td>\n",
" <td>16.2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>Mattia Perin</td>\n",
" <td>it ITA</td>\n",
" <td>GK</td>\n",
" <td>Juventus</td>\n",
" <td>30-303</td>\n",
" <td>1992</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>180.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>29.1</td>\n",
" <td>11.0</td>\n",
" <td>9.1</td>\n",
" <td>18.9</td>\n",
" <td>26.0</td>\n",
" <td>2.0</td>\n",
" <td>7.7</td>\n",
" <td>2.0</td>\n",
" <td>1.00</td>\n",
" <td>15.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>Samuele Perisan</td>\n",
" <td>it ITA</td>\n",
" <td>GK</td>\n",
" <td>Empoli</td>\n",
" <td>26-019</td>\n",
" <td>1997</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>90.0</td>\n",
" <td>2.0</td>\n",
" <td>...</td>\n",
" <td>26.3</td>\n",
" <td>12.0</td>\n",
" <td>16.7</td>\n",
" <td>29.6</td>\n",
" <td>18.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>1.00</td>\n",
" <td>21.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>Ivan Provedel</td>\n",
" <td>it ITA</td>\n",
" <td>GK</td>\n",
" <td>Lazio</td>\n",
" <td>29-176</td>\n",
" <td>1994</td>\n",
" <td>3.0</td>\n",
" <td>3.0</td>\n",
" <td>270.0</td>\n",
" <td>4.0</td>\n",
" <td>...</td>\n",
" <td>26.1</td>\n",
" <td>11.0</td>\n",
" <td>27.3</td>\n",
" <td>31.6</td>\n",
" <td>39.0</td>\n",
" <td>2.0</td>\n",
" <td>5.1</td>\n",
" <td>6.0</td>\n",
" <td>2.00</td>\n",
" <td>16.3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>Boris Radunović</td>\n",
" <td>rs SRB</td>\n",
" <td>GK</td>\n",
" <td>Cagliari</td>\n",
" <td>27-106</td>\n",
" <td>1996</td>\n",
" <td>3.0</td>\n",
" <td>3.0</td>\n",
" <td>270.0</td>\n",
" <td>4.0</td>\n",
" <td>...</td>\n",
" <td>39.4</td>\n",
" <td>28.0</td>\n",
" <td>71.4</td>\n",
" <td>52.8</td>\n",
" <td>49.0</td>\n",
" <td>2.0</td>\n",
" <td>4.1</td>\n",
" <td>2.0</td>\n",
" <td>0.67</td>\n",
" <td>11.9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>Marco Silvestri</td>\n",
" <td>it ITA</td>\n",
" <td>GK</td>\n",
" <td>Udinese</td>\n",
" <td>32-191</td>\n",
" <td>1991</td>\n",
" <td>3.0</td>\n",
" <td>3.0</td>\n",
" <td>270.0</td>\n",
" <td>4.0</td>\n",
" <td>...</td>\n",
" <td>31.4</td>\n",
" <td>21.0</td>\n",
" <td>38.1</td>\n",
" <td>39.5</td>\n",
" <td>33.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" <td>0.67</td>\n",
" <td>13.4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>Łukasz Skorupski</td>\n",
" <td>pl POL</td>\n",
" <td>GK</td>\n",
" <td>Bologna</td>\n",
" <td>32-127</td>\n",
" <td>1991</td>\n",
" <td>3.0</td>\n",
" <td>3.0</td>\n",
" <td>270.0</td>\n",
" <td>4.0</td>\n",
" <td>...</td>\n",
" <td>33.0</td>\n",
" <td>19.0</td>\n",
" <td>36.8</td>\n",
" <td>37.0</td>\n",
" <td>45.0</td>\n",
" <td>2.0</td>\n",
" <td>4.4</td>\n",
" <td>2.0</td>\n",
" <td>0.67</td>\n",
" <td>11.3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>Yann Sommer</td>\n",
" <td>ch SUI</td>\n",
" <td>GK</td>\n",
" <td>Inter</td>\n",
" <td>34-266</td>\n",
" <td>1988</td>\n",
" <td>3.0</td>\n",
" <td>3.0</td>\n",
" <td>270.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>31.4</td>\n",
" <td>21.0</td>\n",
" <td>23.8</td>\n",
" <td>31.0</td>\n",
" <td>35.0</td>\n",
" <td>1.0</td>\n",
" <td>2.9</td>\n",
" <td>0.0</td>\n",
" <td>0.00</td>\n",
" <td>6.8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>Wojciech Szczęsny</td>\n",
" <td>pl POL</td>\n",
" <td>GK</td>\n",
" <td>Juventus</td>\n",
" <td>33-144</td>\n",
" <td>1990</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>90.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>31.6</td>\n",
" <td>3.0</td>\n",
" <td>66.7</td>\n",
" <td>53.3</td>\n",
" <td>16.0</td>\n",
" <td>1.0</td>\n",
" <td>6.3</td>\n",
" <td>0.0</td>\n",
" <td>0.00</td>\n",
" <td>10.8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>Pietro Terracciano</td>\n",
" <td>it ITA</td>\n",
" <td>GK</td>\n",
" <td>Fiorentina</td>\n",
" <td>33-185</td>\n",
" <td>1990</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>90.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>30.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>23.3</td>\n",
" <td>11.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.00</td>\n",
" <td>13.3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>Stefano Turati</td>\n",
" <td>it ITA</td>\n",
" <td>GK</td>\n",
" <td>Frosinone</td>\n",
" <td>22-004</td>\n",
" <td>2001</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>180.0</td>\n",
" <td>3.0</td>\n",
" <td>...</td>\n",
" <td>27.1</td>\n",
" <td>10.0</td>\n",
" <td>50.0</td>\n",
" <td>40.7</td>\n",
" <td>25.0</td>\n",
" <td>2.0</td>\n",
" <td>8.0</td>\n",
" <td>2.0</td>\n",
" <td>1.00</td>\n",
" <td>11.8</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>25 rows × 47 columns</p>\n",
"</div>"
],
"text/plain": [
" player nationality position team age \\\n",
"0 Etrit Berisha al ALB GK Empoli 34-183 \n",
"1 Elia Caprile it ITA GK Empoli 22-015 \n",
"2 Michele Cerofolini it ITA GK Frosinone 24-248 \n",
"3 Oliver Christensen dk DEN GK Fiorentina 24-171 \n",
"4 Andrea Consigli it ITA GK Sassuolo 36-225 \n",
"5 Michele Di Gregorio it ITA GK Monza 26-044 \n",
"6 Wladimiro Falcone it ITA GK Lecce 28-150 \n",
"7 Mike Maignan fr FRA GK Milan 28-068 \n",
"8 Josep Martinez es ESP GK Genoa 25-105 \n",
"9 Alex Meret it ITA GK Napoli 26-171 \n",
"10 Vanja Milinković-Savić rs SRB GK Torino 26-201 \n",
"11 Lorenzo Montipò it ITA GK Hellas Verona 27-201 \n",
"12 Juan Musso ar ARG GK Atalanta 29-126 \n",
"13 Guillermo Ochoa mx MEX GK Salernitana 38-058 \n",
"14 Rui Patrício pt POR GK Roma 35-206 \n",
"15 Mattia Perin it ITA GK Juventus 30-303 \n",
"16 Samuele Perisan it ITA GK Empoli 26-019 \n",
"17 Ivan Provedel it ITA GK Lazio 29-176 \n",
"18 Boris Radunović rs SRB GK Cagliari 27-106 \n",
"19 Marco Silvestri it ITA GK Udinese 32-191 \n",
"20 Łukasz Skorupski pl POL GK Bologna 32-127 \n",
"21 Yann Sommer ch SUI GK Inter 34-266 \n",
"22 Wojciech Szczęsny pl POL GK Juventus 33-144 \n",
"23 Pietro Terracciano it ITA GK Fiorentina 33-185 \n",
"24 Stefano Turati it ITA GK Frosinone 22-004 \n",
"\n",
" birth_year gk_games gk_games_starts gk_minutes gk_goals_against ... \\\n",
"0 1989 1.0 1.0 90.0 2.0 ... \n",
"1 2001 1.0 1.0 90.0 1.0 ... \n",
"2 1999 1.0 1.0 90.0 1.0 ... \n",
"3 1999 2.0 2.0 180.0 6.0 ... \n",
"4 1987 3.0 3.0 270.0 5.0 ... \n",
"5 1997 3.0 3.0 270.0 5.0 ... \n",
"6 1995 3.0 3.0 270.0 3.0 ... \n",
"7 1995 3.0 3.0 270.0 2.0 ... \n",
"8 1998 3.0 3.0 270.0 5.0 ... \n",
"9 1997 3.0 3.0 270.0 3.0 ... \n",
"10 1997 3.0 3.0 270.0 4.0 ... \n",
"11 1996 3.0 3.0 270.0 4.0 ... \n",
"12 1994 3.0 3.0 270.0 2.0 ... \n",
"13 1985 3.0 3.0 270.0 5.0 ... \n",
"14 1988 3.0 3.0 270.0 6.0 ... \n",
"15 1992 2.0 2.0 180.0 1.0 ... \n",
"16 1997 1.0 1.0 90.0 2.0 ... \n",
"17 1994 3.0 3.0 270.0 4.0 ... \n",
"18 1996 3.0 3.0 270.0 4.0 ... \n",
"19 1991 3.0 3.0 270.0 4.0 ... \n",
"20 1991 3.0 3.0 270.0 4.0 ... \n",
"21 1988 3.0 3.0 270.0 0.0 ... \n",
"22 1990 1.0 1.0 90.0 0.0 ... \n",
"23 1990 1.0 1.0 90.0 1.0 ... \n",
"24 2001 2.0 2.0 180.0 3.0 ... \n",
"\n",
" gk_passes_length_avg gk_goal_kicks gk_pct_goal_kicks_launched \\\n",
"0 29.7 7.0 28.6 \n",
"1 42.6 4.0 50.0 \n",
"2 38.3 5.0 60.0 \n",
"3 33.2 8.0 62.5 \n",
"4 37.1 34.0 26.5 \n",
"5 28.7 22.0 40.9 \n",
"6 35.0 24.0 62.5 \n",
"7 30.5 20.0 65.0 \n",
"8 40.1 14.0 92.9 \n",
"9 24.4 8.0 0.0 \n",
"10 34.1 29.0 69.0 \n",
"11 43.0 28.0 85.7 \n",
"12 29.3 18.0 55.6 \n",
"13 38.7 31.0 61.3 \n",
"14 29.7 12.0 16.7 \n",
"15 29.1 11.0 9.1 \n",
"16 26.3 12.0 16.7 \n",
"17 26.1 11.0 27.3 \n",
"18 39.4 28.0 71.4 \n",
"19 31.4 21.0 38.1 \n",
"20 33.0 19.0 36.8 \n",
"21 31.4 21.0 23.8 \n",
"22 31.6 3.0 66.7 \n",
"23 30.0 4.0 0.0 \n",
"24 27.1 10.0 50.0 \n",
"\n",
" gk_goal_kick_length_avg gk_crosses gk_crosses_stopped \\\n",
"0 28.0 17.0 0.0 \n",
"1 50.3 10.0 2.0 \n",
"2 45.8 18.0 0.0 \n",
"3 49.4 15.0 0.0 \n",
"4 28.1 46.0 2.0 \n",
"5 40.3 45.0 2.0 \n",
"6 42.3 32.0 2.0 \n",
"7 49.3 43.0 12.0 \n",
"8 62.2 64.0 8.0 \n",
"9 21.4 15.0 1.0 \n",
"10 58.9 23.0 0.0 \n",
"11 61.0 44.0 1.0 \n",
"12 46.1 28.0 2.0 \n",
"13 46.3 51.0 3.0 \n",
"14 24.5 15.0 0.0 \n",
"15 18.9 26.0 2.0 \n",
"16 29.6 18.0 0.0 \n",
"17 31.6 39.0 2.0 \n",
"18 52.8 49.0 2.0 \n",
"19 39.5 33.0 0.0 \n",
"20 37.0 45.0 2.0 \n",
"21 31.0 35.0 1.0 \n",
"22 53.3 16.0 1.0 \n",
"23 23.3 11.0 0.0 \n",
"24 40.7 25.0 2.0 \n",
"\n",
" gk_crosses_stopped_pct gk_def_actions_outside_pen_area \\\n",
"0 0.0 2.0 \n",
"1 20.0 2.0 \n",
"2 0.0 0.0 \n",
"3 0.0 3.0 \n",
"4 4.3 3.0 \n",
"5 4.4 2.0 \n",
"6 6.3 1.0 \n",
"7 27.9 3.0 \n",
"8 12.5 2.0 \n",
"9 6.7 5.0 \n",
"10 0.0 1.0 \n",
"11 2.3 8.0 \n",
"12 7.1 8.0 \n",
"13 5.9 1.0 \n",
"14 0.0 2.0 \n",
"15 7.7 2.0 \n",
"16 0.0 1.0 \n",
"17 5.1 6.0 \n",
"18 4.1 2.0 \n",
"19 0.0 2.0 \n",
"20 4.4 2.0 \n",
"21 2.9 0.0 \n",
"22 6.3 0.0 \n",
"23 0.0 0.0 \n",
"24 8.0 2.0 \n",
"\n",
" gk_def_actions_outside_pen_area_per90 gk_avg_distance_def_actions \n",
"0 2.00 16.6 \n",
"1 2.00 12.4 \n",
"2 0.00 0.0 \n",
"3 1.50 22.0 \n",
"4 1.00 14.5 \n",
"5 0.67 11.7 \n",
"6 0.33 9.0 \n",
"7 1.00 10.3 \n",
"8 0.67 9.7 \n",
"9 1.67 18.1 \n",
"10 0.33 14.2 \n",
"11 2.67 20.9 \n",
"12 2.67 22.0 \n",
"13 0.33 8.3 \n",
"14 0.67 16.2 \n",
"15 1.00 15.0 \n",
"16 1.00 21.0 \n",
"17 2.00 16.3 \n",
"18 0.67 11.9 \n",
"19 0.67 13.4 \n",
"20 0.67 11.3 \n",
"21 0.00 6.8 \n",
"22 0.00 10.8 \n",
"23 0.00 13.3 \n",
"24 1.00 11.8 \n",
"\n",
"[25 rows x 47 columns]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_keeper = get_keeper_data('https://fbref.com/en/comps/11/','/Serie-A-Stats')\n",
"\n",
"df_keeper.to_csv('fbref_data/keepers_players.csv', index=False)\n",
"\n",
"df_keeper"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "b9924851",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>team</th>\n",
" <th>players_used</th>\n",
" <th>possession</th>\n",
" <th>games</th>\n",
" <th>games_starts</th>\n",
" <th>minutes</th>\n",
" <th>goals</th>\n",
" <th>assists</th>\n",
" <th>pens_made</th>\n",
" <th>pens_att</th>\n",
" <th>...</th>\n",
" <th>fouls</th>\n",
" <th>fouled</th>\n",
" <th>offsides</th>\n",
" <th>pens_won</th>\n",
" <th>pens_conceded</th>\n",
" <th>own_goals</th>\n",
" <th>ball_recoveries</th>\n",
" <th>aerials_won</th>\n",
" <th>aerials_lost</th>\n",
" <th>aerials_won_pct</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Atalanta</td>\n",
" <td>20.0</td>\n",
" <td>51.7</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>6.0</td>\n",
" <td>6.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>34.0</td>\n",
" <td>27.0</td>\n",
" <td>7.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>172.0</td>\n",
" <td>42.0</td>\n",
" <td>44.0</td>\n",
" <td>48.8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Bologna</td>\n",
" <td>20.0</td>\n",
" <td>55.3</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>3.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>32.0</td>\n",
" <td>25.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>153.0</td>\n",
" <td>29.0</td>\n",
" <td>23.0</td>\n",
" <td>55.8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Cagliari</td>\n",
" <td>19.0</td>\n",
" <td>35.0</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>34.0</td>\n",
" <td>25.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>190.0</td>\n",
" <td>37.0</td>\n",
" <td>44.0</td>\n",
" <td>45.7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Empoli</td>\n",
" <td>26.0</td>\n",
" <td>48.0</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>38.0</td>\n",
" <td>44.0</td>\n",
" <td>5.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>131.0</td>\n",
" <td>30.0</td>\n",
" <td>42.0</td>\n",
" <td>41.7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Fiorentina</td>\n",
" <td>21.0</td>\n",
" <td>62.3</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>6.0</td>\n",
" <td>5.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>41.0</td>\n",
" <td>38.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>141.0</td>\n",
" <td>32.0</td>\n",
" <td>38.0</td>\n",
" <td>45.7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Frosinone</td>\n",
" <td>21.0</td>\n",
" <td>46.0</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>3.0</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>33.0</td>\n",
" <td>40.0</td>\n",
" <td>6.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>154.0</td>\n",
" <td>42.0</td>\n",
" <td>46.0</td>\n",
" <td>47.7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>Genoa</td>\n",
" <td>18.0</td>\n",
" <td>33.0</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>37.0</td>\n",
" <td>29.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>128.0</td>\n",
" <td>44.0</td>\n",
" <td>32.0</td>\n",
" <td>57.9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Hellas Verona</td>\n",
" <td>19.0</td>\n",
" <td>44.7</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>4.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>48.0</td>\n",
" <td>36.0</td>\n",
" <td>7.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>157.0</td>\n",
" <td>71.0</td>\n",
" <td>54.0</td>\n",
" <td>56.8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>Inter</td>\n",
" <td>18.0</td>\n",
" <td>51.3</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>8.0</td>\n",
" <td>7.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>31.0</td>\n",
" <td>33.0</td>\n",
" <td>3.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>156.0</td>\n",
" <td>36.0</td>\n",
" <td>24.0</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>Juventus</td>\n",
" <td>21.0</td>\n",
" <td>53.0</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>6.0</td>\n",
" <td>4.0</td>\n",
" <td>1.0</td>\n",
" <td>2.0</td>\n",
" <td>...</td>\n",
" <td>38.0</td>\n",
" <td>35.0</td>\n",
" <td>9.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>140.0</td>\n",
" <td>26.0</td>\n",
" <td>22.0</td>\n",
" <td>54.2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>Lazio</td>\n",
" <td>19.0</td>\n",
" <td>53.3</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>3.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>34.0</td>\n",
" <td>33.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>149.0</td>\n",
" <td>26.0</td>\n",
" <td>39.0</td>\n",
" <td>40.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>Lecce</td>\n",
" <td>18.0</td>\n",
" <td>45.0</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>6.0</td>\n",
" <td>5.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>44.0</td>\n",
" <td>45.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>148.0</td>\n",
" <td>46.0</td>\n",
" <td>33.0</td>\n",
" <td>58.2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>Milan</td>\n",
" <td>18.0</td>\n",
" <td>54.0</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>8.0</td>\n",
" <td>5.0</td>\n",
" <td>3.0</td>\n",
" <td>3.0</td>\n",
" <td>...</td>\n",
" <td>32.0</td>\n",
" <td>39.0</td>\n",
" <td>4.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>134.0</td>\n",
" <td>27.0</td>\n",
" <td>34.0</td>\n",
" <td>44.3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>Monza</td>\n",
" <td>21.0</td>\n",
" <td>55.3</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>36.0</td>\n",
" <td>25.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>122.0</td>\n",
" <td>27.0</td>\n",
" <td>37.0</td>\n",
" <td>42.2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>Napoli</td>\n",
" <td>18.0</td>\n",
" <td>60.3</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>6.0</td>\n",
" <td>3.0</td>\n",
" <td>1.0</td>\n",
" <td>2.0</td>\n",
" <td>...</td>\n",
" <td>34.0</td>\n",
" <td>27.0</td>\n",
" <td>11.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>156.0</td>\n",
" <td>33.0</td>\n",
" <td>19.0</td>\n",
" <td>63.5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>Roma</td>\n",
" <td>21.0</td>\n",
" <td>58.3</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>4.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>38.0</td>\n",
" <td>41.0</td>\n",
" <td>5.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>145.0</td>\n",
" <td>64.0</td>\n",
" <td>45.0</td>\n",
" <td>58.7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>Salernitana</td>\n",
" <td>21.0</td>\n",
" <td>50.0</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>3.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>36.0</td>\n",
" <td>47.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>127.0</td>\n",
" <td>37.0</td>\n",
" <td>68.0</td>\n",
" <td>35.2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>Sassuolo</td>\n",
" <td>22.0</td>\n",
" <td>43.0</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>3.0</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>27.0</td>\n",
" <td>33.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>127.0</td>\n",
" <td>30.0</td>\n",
" <td>40.0</td>\n",
" <td>42.9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>Torino</td>\n",
" <td>20.0</td>\n",
" <td>53.7</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>37.0</td>\n",
" <td>31.0</td>\n",
" <td>8.0</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>141.0</td>\n",
" <td>41.0</td>\n",
" <td>46.0</td>\n",
" <td>47.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>Udinese</td>\n",
" <td>18.0</td>\n",
" <td>46.7</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>45.0</td>\n",
" <td>30.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>148.0</td>\n",
" <td>48.0</td>\n",
" <td>38.0</td>\n",
" <td>55.8</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>20 rows × 152 columns</p>\n",
"</div>"
],
"text/plain": [
" team players_used possession games games_starts minutes \\\n",
"0 Atalanta 20.0 51.7 3.0 33.0 270.0 \n",
"1 Bologna 20.0 55.3 3.0 33.0 270.0 \n",
"2 Cagliari 19.0 35.0 3.0 33.0 270.0 \n",
"3 Empoli 26.0 48.0 3.0 33.0 270.0 \n",
"4 Fiorentina 21.0 62.3 3.0 33.0 270.0 \n",
"5 Frosinone 21.0 46.0 3.0 33.0 270.0 \n",
"6 Genoa 18.0 33.0 3.0 33.0 270.0 \n",
"7 Hellas Verona 19.0 44.7 3.0 33.0 270.0 \n",
"8 Inter 18.0 51.3 3.0 33.0 270.0 \n",
"9 Juventus 21.0 53.0 3.0 33.0 270.0 \n",
"10 Lazio 19.0 53.3 3.0 33.0 270.0 \n",
"11 Lecce 18.0 45.0 3.0 33.0 270.0 \n",
"12 Milan 18.0 54.0 3.0 33.0 270.0 \n",
"13 Monza 21.0 55.3 3.0 33.0 270.0 \n",
"14 Napoli 18.0 60.3 3.0 33.0 270.0 \n",
"15 Roma 21.0 58.3 3.0 33.0 270.0 \n",
"16 Salernitana 21.0 50.0 3.0 33.0 270.0 \n",
"17 Sassuolo 22.0 43.0 3.0 33.0 270.0 \n",
"18 Torino 20.0 53.7 3.0 33.0 270.0 \n",
"19 Udinese 18.0 46.7 3.0 33.0 270.0 \n",
"\n",
" goals assists pens_made pens_att ... fouls fouled offsides \\\n",
"0 6.0 6.0 0.0 0.0 ... 34.0 27.0 7.0 \n",
"1 3.0 2.0 0.0 1.0 ... 32.0 25.0 3.0 \n",
"2 1.0 1.0 0.0 0.0 ... 34.0 25.0 4.0 \n",
"3 0.0 0.0 0.0 0.0 ... 38.0 44.0 5.0 \n",
"4 6.0 5.0 0.0 0.0 ... 41.0 38.0 4.0 \n",
"5 3.0 2.0 1.0 1.0 ... 33.0 40.0 6.0 \n",
"6 2.0 1.0 0.0 0.0 ... 37.0 29.0 4.0 \n",
"7 4.0 2.0 0.0 0.0 ... 48.0 36.0 7.0 \n",
"8 8.0 7.0 1.0 1.0 ... 31.0 33.0 3.0 \n",
"9 6.0 4.0 1.0 2.0 ... 38.0 35.0 9.0 \n",
"10 3.0 3.0 0.0 0.0 ... 34.0 33.0 4.0 \n",
"11 6.0 5.0 1.0 1.0 ... 44.0 45.0 3.0 \n",
"12 8.0 5.0 3.0 3.0 ... 32.0 39.0 4.0 \n",
"13 2.0 2.0 0.0 0.0 ... 36.0 25.0 4.0 \n",
"14 6.0 3.0 1.0 2.0 ... 34.0 27.0 11.0 \n",
"15 4.0 3.0 0.0 0.0 ... 38.0 41.0 5.0 \n",
"16 3.0 3.0 0.0 0.0 ... 36.0 47.0 3.0 \n",
"17 3.0 2.0 1.0 1.0 ... 27.0 33.0 1.0 \n",
"18 2.0 2.0 0.0 0.0 ... 37.0 31.0 8.0 \n",
"19 1.0 1.0 0.0 0.0 ... 45.0 30.0 4.0 \n",
"\n",
" pens_won pens_conceded own_goals ball_recoveries aerials_won \\\n",
"0 0.0 0.0 0.0 172.0 42.0 \n",
"1 0.0 0.0 0.0 153.0 29.0 \n",
"2 0.0 1.0 0.0 190.0 37.0 \n",
"3 0.0 1.0 0.0 131.0 30.0 \n",
"4 0.0 1.0 0.0 141.0 32.0 \n",
"5 1.0 0.0 0.0 154.0 42.0 \n",
"6 0.0 0.0 0.0 128.0 44.0 \n",
"7 0.0 1.0 0.0 157.0 71.0 \n",
"8 1.0 0.0 0.0 156.0 36.0 \n",
"9 1.0 0.0 0.0 140.0 26.0 \n",
"10 0.0 0.0 0.0 149.0 26.0 \n",
"11 0.0 0.0 0.0 148.0 46.0 \n",
"12 2.0 0.0 0.0 134.0 27.0 \n",
"13 0.0 0.0 0.0 122.0 27.0 \n",
"14 1.0 1.0 0.0 156.0 33.0 \n",
"15 0.0 1.0 0.0 145.0 64.0 \n",
"16 0.0 1.0 0.0 127.0 37.0 \n",
"17 1.0 2.0 0.0 127.0 30.0 \n",
"18 0.0 2.0 0.0 141.0 41.0 \n",
"19 0.0 1.0 0.0 148.0 48.0 \n",
"\n",
" aerials_lost aerials_won_pct \n",
"0 44.0 48.8 \n",
"1 23.0 55.8 \n",
"2 44.0 45.7 \n",
"3 42.0 41.7 \n",
"4 38.0 45.7 \n",
"5 46.0 47.7 \n",
"6 32.0 57.9 \n",
"7 54.0 56.8 \n",
"8 24.0 60.0 \n",
"9 22.0 54.2 \n",
"10 39.0 40.0 \n",
"11 33.0 58.2 \n",
"12 34.0 44.3 \n",
"13 37.0 42.2 \n",
"14 19.0 63.5 \n",
"15 45.0 58.7 \n",
"16 68.0 35.2 \n",
"17 40.0 42.9 \n",
"18 46.0 47.1 \n",
"19 38.0 55.8 \n",
"\n",
"[20 rows x 152 columns]"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_team = get_team_data('https://fbref.com/en/comps/11/','/Serie-A-Stats', 'for')\n",
"\n",
"df_team.to_csv('fbref_data/teams.csv', index=False)\n",
"\n",
"df_team"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "5868ec4a",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>team</th>\n",
" <th>players_used</th>\n",
" <th>possession</th>\n",
" <th>games</th>\n",
" <th>games_starts</th>\n",
" <th>minutes</th>\n",
" <th>goals</th>\n",
" <th>assists</th>\n",
" <th>pens_made</th>\n",
" <th>pens_att</th>\n",
" <th>...</th>\n",
" <th>fouls</th>\n",
" <th>fouled</th>\n",
" <th>offsides</th>\n",
" <th>pens_won</th>\n",
" <th>pens_conceded</th>\n",
" <th>own_goals</th>\n",
" <th>ball_recoveries</th>\n",
" <th>aerials_won</th>\n",
" <th>aerials_lost</th>\n",
" <th>aerials_won_pct</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>vs Atalanta</td>\n",
" <td>20.0</td>\n",
" <td>48.3</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>28.0</td>\n",
" <td>33.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>157.0</td>\n",
" <td>44.0</td>\n",
" <td>42.0</td>\n",
" <td>51.2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>vs Bologna</td>\n",
" <td>20.0</td>\n",
" <td>44.7</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>4.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>32.0</td>\n",
" <td>30.0</td>\n",
" <td>7.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>157.0</td>\n",
" <td>23.0</td>\n",
" <td>29.0</td>\n",
" <td>44.2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>vs Cagliari</td>\n",
" <td>19.0</td>\n",
" <td>65.0</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>4.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>27.0</td>\n",
" <td>29.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>165.0</td>\n",
" <td>44.0</td>\n",
" <td>37.0</td>\n",
" <td>54.3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>vs Empoli</td>\n",
" <td>26.0</td>\n",
" <td>52.0</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>5.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>45.0</td>\n",
" <td>38.0</td>\n",
" <td>6.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>152.0</td>\n",
" <td>42.0</td>\n",
" <td>30.0</td>\n",
" <td>58.3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>vs Fiorentina</td>\n",
" <td>21.0</td>\n",
" <td>37.7</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>7.0</td>\n",
" <td>6.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>42.0</td>\n",
" <td>36.0</td>\n",
" <td>3.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>142.0</td>\n",
" <td>38.0</td>\n",
" <td>32.0</td>\n",
" <td>54.3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>vs Frosinone</td>\n",
" <td>21.0</td>\n",
" <td>54.0</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>4.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>41.0</td>\n",
" <td>31.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>168.0</td>\n",
" <td>46.0</td>\n",
" <td>42.0</td>\n",
" <td>52.3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>vs Genoa</td>\n",
" <td>18.0</td>\n",
" <td>67.0</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>5.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>35.0</td>\n",
" <td>31.0</td>\n",
" <td>6.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>148.0</td>\n",
" <td>32.0</td>\n",
" <td>44.0</td>\n",
" <td>42.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>vs Hellas Verona</td>\n",
" <td>19.0</td>\n",
" <td>55.3</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>4.0</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>37.0</td>\n",
" <td>47.0</td>\n",
" <td>6.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>138.0</td>\n",
" <td>54.0</td>\n",
" <td>71.0</td>\n",
" <td>43.2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>vs Inter</td>\n",
" <td>18.0</td>\n",
" <td>48.7</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>34.0</td>\n",
" <td>30.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>128.0</td>\n",
" <td>24.0</td>\n",
" <td>36.0</td>\n",
" <td>40.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>vs Juventus</td>\n",
" <td>21.0</td>\n",
" <td>47.0</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>39.0</td>\n",
" <td>36.0</td>\n",
" <td>5.0</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>134.0</td>\n",
" <td>22.0</td>\n",
" <td>26.0</td>\n",
" <td>45.8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>vs Lazio</td>\n",
" <td>19.0</td>\n",
" <td>46.7</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>4.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>36.0</td>\n",
" <td>31.0</td>\n",
" <td>6.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>155.0</td>\n",
" <td>39.0</td>\n",
" <td>26.0</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>vs Lecce</td>\n",
" <td>18.0</td>\n",
" <td>55.0</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>3.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>47.0</td>\n",
" <td>43.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>150.0</td>\n",
" <td>33.0</td>\n",
" <td>46.0</td>\n",
" <td>41.8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>vs Milan</td>\n",
" <td>18.0</td>\n",
" <td>46.0</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>40.0</td>\n",
" <td>31.0</td>\n",
" <td>5.0</td>\n",
" <td>0.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>145.0</td>\n",
" <td>34.0</td>\n",
" <td>27.0</td>\n",
" <td>55.7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>vs Monza</td>\n",
" <td>21.0</td>\n",
" <td>44.7</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>5.0</td>\n",
" <td>5.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>26.0</td>\n",
" <td>35.0</td>\n",
" <td>6.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>144.0</td>\n",
" <td>37.0</td>\n",
" <td>27.0</td>\n",
" <td>57.8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>vs Napoli</td>\n",
" <td>18.0</td>\n",
" <td>39.7</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>3.0</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>33.0</td>\n",
" <td>33.0</td>\n",
" <td>6.0</td>\n",
" <td>1.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>124.0</td>\n",
" <td>19.0</td>\n",
" <td>33.0</td>\n",
" <td>36.5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>vs Roma</td>\n",
" <td>21.0</td>\n",
" <td>41.7</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>6.0</td>\n",
" <td>4.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>41.0</td>\n",
" <td>36.0</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>114.0</td>\n",
" <td>45.0</td>\n",
" <td>64.0</td>\n",
" <td>41.3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>vs Salernitana</td>\n",
" <td>21.0</td>\n",
" <td>50.0</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>5.0</td>\n",
" <td>4.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>48.0</td>\n",
" <td>34.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>151.0</td>\n",
" <td>68.0</td>\n",
" <td>37.0</td>\n",
" <td>64.8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>vs Sassuolo</td>\n",
" <td>22.0</td>\n",
" <td>57.0</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>5.0</td>\n",
" <td>4.0</td>\n",
" <td>1.0</td>\n",
" <td>2.0</td>\n",
" <td>...</td>\n",
" <td>35.0</td>\n",
" <td>25.0</td>\n",
" <td>10.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>159.0</td>\n",
" <td>40.0</td>\n",
" <td>30.0</td>\n",
" <td>57.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>vs Torino</td>\n",
" <td>20.0</td>\n",
" <td>46.3</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>4.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>...</td>\n",
" <td>32.0</td>\n",
" <td>33.0</td>\n",
" <td>5.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>151.0</td>\n",
" <td>46.0</td>\n",
" <td>41.0</td>\n",
" <td>52.9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>vs Udinese</td>\n",
" <td>18.0</td>\n",
" <td>53.3</td>\n",
" <td>3.0</td>\n",
" <td>33.0</td>\n",
" <td>270.0</td>\n",
" <td>4.0</td>\n",
" <td>3.0</td>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>31.0</td>\n",
" <td>41.0</td>\n",
" <td>7.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>137.0</td>\n",
" <td>38.0</td>\n",
" <td>48.0</td>\n",
" <td>44.2</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>20 rows × 152 columns</p>\n",
"</div>"
],
"text/plain": [
" team players_used possession games games_starts minutes \\\n",
"0 vs Atalanta 20.0 48.3 3.0 33.0 270.0 \n",
"1 vs Bologna 20.0 44.7 3.0 33.0 270.0 \n",
"2 vs Cagliari 19.0 65.0 3.0 33.0 270.0 \n",
"3 vs Empoli 26.0 52.0 3.0 33.0 270.0 \n",
"4 vs Fiorentina 21.0 37.7 3.0 33.0 270.0 \n",
"5 vs Frosinone 21.0 54.0 3.0 33.0 270.0 \n",
"6 vs Genoa 18.0 67.0 3.0 33.0 270.0 \n",
"7 vs Hellas Verona 19.0 55.3 3.0 33.0 270.0 \n",
"8 vs Inter 18.0 48.7 3.0 33.0 270.0 \n",
"9 vs Juventus 21.0 47.0 3.0 33.0 270.0 \n",
"10 vs Lazio 19.0 46.7 3.0 33.0 270.0 \n",
"11 vs Lecce 18.0 55.0 3.0 33.0 270.0 \n",
"12 vs Milan 18.0 46.0 3.0 33.0 270.0 \n",
"13 vs Monza 21.0 44.7 3.0 33.0 270.0 \n",
"14 vs Napoli 18.0 39.7 3.0 33.0 270.0 \n",
"15 vs Roma 21.0 41.7 3.0 33.0 270.0 \n",
"16 vs Salernitana 21.0 50.0 3.0 33.0 270.0 \n",
"17 vs Sassuolo 22.0 57.0 3.0 33.0 270.0 \n",
"18 vs Torino 20.0 46.3 3.0 33.0 270.0 \n",
"19 vs Udinese 18.0 53.3 3.0 33.0 270.0 \n",
"\n",
" goals assists pens_made pens_att ... fouls fouled offsides \\\n",
"0 2.0 2.0 0.0 0.0 ... 28.0 33.0 2.0 \n",
"1 4.0 4.0 0.0 0.0 ... 32.0 30.0 7.0 \n",
"2 4.0 3.0 0.0 1.0 ... 27.0 29.0 4.0 \n",
"3 5.0 3.0 0.0 1.0 ... 45.0 38.0 6.0 \n",
"4 7.0 6.0 1.0 1.0 ... 42.0 36.0 3.0 \n",
"5 4.0 3.0 0.0 0.0 ... 41.0 31.0 4.0 \n",
"6 5.0 4.0 0.0 0.0 ... 35.0 31.0 6.0 \n",
"7 4.0 2.0 1.0 1.0 ... 37.0 47.0 6.0 \n",
"8 0.0 0.0 0.0 0.0 ... 34.0 30.0 3.0 \n",
"9 1.0 1.0 0.0 0.0 ... 39.0 36.0 5.0 \n",
"10 4.0 2.0 0.0 0.0 ... 36.0 31.0 6.0 \n",
"11 3.0 3.0 0.0 0.0 ... 47.0 43.0 4.0 \n",
"12 2.0 2.0 0.0 0.0 ... 40.0 31.0 5.0 \n",
"13 5.0 5.0 0.0 0.0 ... 26.0 35.0 6.0 \n",
"14 3.0 2.0 1.0 1.0 ... 33.0 33.0 6.0 \n",
"15 6.0 4.0 1.0 1.0 ... 41.0 36.0 2.0 \n",
"16 5.0 4.0 1.0 1.0 ... 48.0 34.0 2.0 \n",
"17 5.0 4.0 1.0 2.0 ... 35.0 25.0 10.0 \n",
"18 4.0 2.0 2.0 2.0 ... 32.0 33.0 5.0 \n",
"19 4.0 3.0 1.0 1.0 ... 31.0 41.0 7.0 \n",
"\n",
" pens_won pens_conceded own_goals ball_recoveries aerials_won \\\n",
"0 0.0 0.0 0.0 157.0 44.0 \n",
"1 0.0 1.0 0.0 157.0 23.0 \n",
"2 0.0 0.0 0.0 165.0 44.0 \n",
"3 1.0 0.0 0.0 152.0 42.0 \n",
"4 1.0 0.0 0.0 142.0 38.0 \n",
"5 0.0 1.0 0.0 168.0 46.0 \n",
"6 0.0 0.0 0.0 148.0 32.0 \n",
"7 1.0 0.0 0.0 138.0 54.0 \n",
"8 0.0 1.0 0.0 128.0 24.0 \n",
"9 0.0 2.0 0.0 134.0 22.0 \n",
"10 0.0 0.0 0.0 155.0 39.0 \n",
"11 0.0 1.0 0.0 150.0 33.0 \n",
"12 0.0 3.0 0.0 145.0 34.0 \n",
"13 0.0 0.0 0.0 144.0 37.0 \n",
"14 1.0 2.0 0.0 124.0 19.0 \n",
"15 1.0 0.0 0.0 114.0 45.0 \n",
"16 0.0 0.0 0.0 151.0 68.0 \n",
"17 1.0 1.0 0.0 159.0 40.0 \n",
"18 1.0 0.0 0.0 151.0 46.0 \n",
"19 0.0 0.0 0.0 137.0 38.0 \n",
"\n",
" aerials_lost aerials_won_pct \n",
"0 42.0 51.2 \n",
"1 29.0 44.2 \n",
"2 37.0 54.3 \n",
"3 30.0 58.3 \n",
"4 32.0 54.3 \n",
"5 42.0 52.3 \n",
"6 44.0 42.1 \n",
"7 71.0 43.2 \n",
"8 36.0 40.0 \n",
"9 26.0 45.8 \n",
"10 26.0 60.0 \n",
"11 46.0 41.8 \n",
"12 27.0 55.7 \n",
"13 27.0 57.8 \n",
"14 33.0 36.5 \n",
"15 64.0 41.3 \n",
"16 37.0 64.8 \n",
"17 30.0 57.1 \n",
"18 41.0 52.9 \n",
"19 48.0 44.2 \n",
"\n",
"[20 rows x 152 columns]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_vsteam = get_team_data('https://fbref.com/en/comps/11/','/Serie-A-Stats', 'vs')\n",
"\n",
"df_vsteam.to_csv('fbref_data/teams_vs.csv', index=False)\n",
"\n",
"df_vsteam"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "11e51337",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Outfield player columns\n",
"['player' 'nationality' 'position' 'team' 'age' 'birth_year' 'games'\n",
" 'games_starts' 'minutes' 'goals' 'assists' 'pens_made' 'pens_att'\n",
" 'cards_yellow' 'cards_red' 'goals_per90' 'assists_per90'\n",
" 'goals_assists_per90' 'goals_pens_per90' 'goals_assists_pens_per90' 'xg'\n",
" 'npxg' 'xg_per90' 'npxg_per90' 'minutes_90s' 'shots_on_target'\n",
" 'shots_free_kicks' 'shots_on_target_pct' 'shots_on_target_per90'\n",
" 'goals_per_shot' 'goals_per_shot_on_target' 'npxg_per_shot' 'xg_net'\n",
" 'npxg_net' 'passes_completed' 'passes' 'passes_pct'\n",
" 'passes_total_distance' 'passes_progressive_distance'\n",
" 'passes_completed_short' 'passes_short' 'passes_pct_short'\n",
" 'passes_completed_medium' 'passes_medium' 'passes_pct_medium'\n",
" 'passes_completed_long' 'passes_long' 'passes_pct_long' 'assisted_shots'\n",
" 'passes_into_final_third' 'passes_into_penalty_area'\n",
" 'crosses_into_penalty_area' 'progressive_passes' 'passes_live'\n",
" 'passes_dead' 'passes_free_kicks' 'through_balls' 'passes_switches'\n",
" 'crosses' 'corner_kicks' 'corner_kicks_in' 'corner_kicks_out'\n",
" 'corner_kicks_straight' 'throw_ins' 'passes_offsides' 'passes_blocked'\n",
" 'sca' 'sca_per90' 'sca_passes_live' 'sca_passes_dead' 'sca_shots'\n",
" 'sca_fouled' 'gca' 'gca_per90' 'gca_passes_live' 'gca_passes_dead'\n",
" 'gca_shots' 'gca_fouled' 'gca_defense' 'tackles' 'tackles_won'\n",
" 'tackles_def_3rd' 'tackles_mid_3rd' 'tackles_att_3rd' 'blocks'\n",
" 'blocked_shots' 'blocked_passes' 'interceptions' 'clearances' 'errors'\n",
" 'touches' 'touches_def_pen_area' 'touches_def_3rd' 'touches_mid_3rd'\n",
" 'touches_att_3rd' 'touches_att_pen_area' 'touches_live_ball' 'carries'\n",
" 'progressive_carries' 'carries_into_final_third'\n",
" 'carries_into_penalty_area' 'passes_received' 'miscontrols'\n",
" 'dispossessed' 'cards_yellow_red' 'fouls' 'fouled' 'offsides' 'pens_won'\n",
" 'pens_conceded' 'own_goals' 'ball_recoveries' 'aerials_won'\n",
" 'aerials_lost' 'aerials_won_pct']\n",
"Keeper player columns\n",
"['player' 'nationality' 'position' 'team' 'age' 'birth_year' 'gk_games'\n",
" 'gk_games_starts' 'gk_minutes' 'gk_goals_against'\n",
" 'gk_goals_against_per90' 'gk_shots_on_target_against' 'gk_saves'\n",
" 'gk_save_pct' 'gk_wins' 'gk_ties' 'gk_losses' 'gk_clean_sheets'\n",
" 'gk_clean_sheets_pct' 'gk_pens_att' 'gk_pens_allowed' 'gk_pens_saved'\n",
" 'gk_pens_missed' 'minutes_90s' 'gk_free_kick_goals_against'\n",
" 'gk_corner_kick_goals_against' 'gk_own_goals_against' 'gk_psxg'\n",
" 'gk_psnpxg_per_shot_on_target_against' 'gk_psxg_net' 'gk_psxg_net_per90'\n",
" 'gk_passes_completed_launched' 'gk_passes_launched'\n",
" 'gk_passes_pct_launched' 'gk_passes' 'gk_passes_throws'\n",
" 'gk_pct_passes_launched' 'gk_passes_length_avg' 'gk_goal_kicks'\n",
" 'gk_pct_goal_kicks_launched' 'gk_goal_kick_length_avg' 'gk_crosses'\n",
" 'gk_crosses_stopped' 'gk_crosses_stopped_pct'\n",
" 'gk_def_actions_outside_pen_area' 'gk_def_actions_outside_pen_area_per90'\n",
" 'gk_avg_distance_def_actions']\n",
"Team columns\n",
"['team' 'players_used' 'possession' 'games' 'games_starts' 'minutes'\n",
" 'goals' 'assists' 'pens_made' 'pens_att' 'cards_yellow' 'cards_red'\n",
" 'goals_per90' 'assists_per90' 'goals_assists_per90' 'goals_pens_per90'\n",
" 'goals_assists_pens_per90' 'xg' 'npxg' 'xg_per90' 'npxg_per90' 'gk_games'\n",
" 'gk_games_starts' 'gk_minutes' 'gk_goals_against'\n",
" 'gk_goals_against_per90' 'gk_shots_on_target_against' 'gk_saves'\n",
" 'gk_save_pct' 'gk_wins' 'gk_ties' 'gk_losses' 'gk_clean_sheets'\n",
" 'gk_clean_sheets_pct' 'gk_pens_att' 'gk_pens_allowed' 'gk_pens_saved'\n",
" 'gk_pens_missed' 'minutes_90s' 'gk_free_kick_goals_against'\n",
" 'gk_corner_kick_goals_against' 'gk_own_goals_against' 'gk_psxg'\n",
" 'gk_psnpxg_per_shot_on_target_against' 'gk_psxg_net' 'gk_psxg_net_per90'\n",
" 'gk_passes_completed_launched' 'gk_passes_launched'\n",
" 'gk_passes_pct_launched' 'gk_passes' 'gk_passes_throws'\n",
" 'gk_pct_passes_launched' 'gk_passes_length_avg' 'gk_goal_kicks'\n",
" 'gk_pct_goal_kicks_launched' 'gk_goal_kick_length_avg' 'gk_crosses'\n",
" 'gk_crosses_stopped' 'gk_crosses_stopped_pct'\n",
" 'gk_def_actions_outside_pen_area' 'gk_def_actions_outside_pen_area_per90'\n",
" 'gk_avg_distance_def_actions' 'shots_on_target' 'shots_free_kicks'\n",
" 'shots_on_target_pct' 'shots_on_target_per90' 'goals_per_shot'\n",
" 'goals_per_shot_on_target' 'npxg_per_shot' 'xg_net' 'npxg_net'\n",
" 'passes_completed' 'passes' 'passes_pct' 'passes_total_distance'\n",
" 'passes_progressive_distance' 'passes_completed_short' 'passes_short'\n",
" 'passes_pct_short' 'passes_completed_medium' 'passes_medium'\n",
" 'passes_pct_medium' 'passes_completed_long' 'passes_long'\n",
" 'passes_pct_long' 'assisted_shots' 'passes_into_final_third'\n",
" 'passes_into_penalty_area' 'crosses_into_penalty_area'\n",
" 'progressive_passes' 'passes_live' 'passes_dead' 'passes_free_kicks'\n",
" 'through_balls' 'passes_switches' 'crosses' 'corner_kicks'\n",
" 'corner_kicks_in' 'corner_kicks_out' 'corner_kicks_straight' 'throw_ins'\n",
" 'passes_offsides' 'passes_blocked' 'sca' 'sca_per90' 'sca_passes_live'\n",
" 'sca_passes_dead' 'sca_shots' 'sca_fouled' 'gca' 'gca_per90'\n",
" 'gca_passes_live' 'gca_passes_dead' 'gca_shots' 'gca_fouled'\n",
" 'gca_defense' 'tackles' 'tackles_won' 'tackles_def_3rd' 'tackles_mid_3rd'\n",
" 'tackles_att_3rd' 'blocks' 'blocked_shots' 'blocked_passes'\n",
" 'interceptions' 'clearances' 'errors' 'touches' 'touches_def_pen_area'\n",
" 'touches_def_3rd' 'touches_mid_3rd' 'touches_att_3rd'\n",
" 'touches_att_pen_area' 'touches_live_ball' 'carries'\n",
" 'progressive_carries' 'carries_into_final_third'\n",
" 'carries_into_penalty_area' 'passes_received' 'miscontrols'\n",
" 'dispossessed' 'cards_yellow_red' 'fouls' 'fouled' 'offsides' 'pens_won'\n",
" 'pens_conceded' 'own_goals' 'ball_recoveries' 'aerials_won'\n",
" 'aerials_lost' 'aerials_won_pct']\n",
"Vs Team columns\n",
"['team' 'players_used' 'possession' 'games' 'games_starts' 'minutes'\n",
" 'goals' 'assists' 'pens_made' 'pens_att' 'cards_yellow' 'cards_red'\n",
" 'goals_per90' 'assists_per90' 'goals_assists_per90' 'goals_pens_per90'\n",
" 'goals_assists_pens_per90' 'xg' 'npxg' 'xg_per90' 'npxg_per90' 'gk_games'\n",
" 'gk_games_starts' 'gk_minutes' 'gk_goals_against'\n",
" 'gk_goals_against_per90' 'gk_shots_on_target_against' 'gk_saves'\n",
" 'gk_save_pct' 'gk_wins' 'gk_ties' 'gk_losses' 'gk_clean_sheets'\n",
" 'gk_clean_sheets_pct' 'gk_pens_att' 'gk_pens_allowed' 'gk_pens_saved'\n",
" 'gk_pens_missed' 'minutes_90s' 'gk_free_kick_goals_against'\n",
" 'gk_corner_kick_goals_against' 'gk_own_goals_against' 'gk_psxg'\n",
" 'gk_psnpxg_per_shot_on_target_against' 'gk_psxg_net' 'gk_psxg_net_per90'\n",
" 'gk_passes_completed_launched' 'gk_passes_launched'\n",
" 'gk_passes_pct_launched' 'gk_passes' 'gk_passes_throws'\n",
" 'gk_pct_passes_launched' 'gk_passes_length_avg' 'gk_goal_kicks'\n",
" 'gk_pct_goal_kicks_launched' 'gk_goal_kick_length_avg' 'gk_crosses'\n",
" 'gk_crosses_stopped' 'gk_crosses_stopped_pct'\n",
" 'gk_def_actions_outside_pen_area' 'gk_def_actions_outside_pen_area_per90'\n",
" 'gk_avg_distance_def_actions' 'shots_on_target' 'shots_free_kicks'\n",
" 'shots_on_target_pct' 'shots_on_target_per90' 'goals_per_shot'\n",
" 'goals_per_shot_on_target' 'npxg_per_shot' 'xg_net' 'npxg_net'\n",
" 'passes_completed' 'passes' 'passes_pct' 'passes_total_distance'\n",
" 'passes_progressive_distance' 'passes_completed_short' 'passes_short'\n",
" 'passes_pct_short' 'passes_completed_medium' 'passes_medium'\n",
" 'passes_pct_medium' 'passes_completed_long' 'passes_long'\n",
" 'passes_pct_long' 'assisted_shots' 'passes_into_final_third'\n",
" 'passes_into_penalty_area' 'crosses_into_penalty_area'\n",
" 'progressive_passes' 'passes_live' 'passes_dead' 'passes_free_kicks'\n",
" 'through_balls' 'passes_switches' 'crosses' 'corner_kicks'\n",
" 'corner_kicks_in' 'corner_kicks_out' 'corner_kicks_straight' 'throw_ins'\n",
" 'passes_offsides' 'passes_blocked' 'sca' 'sca_per90' 'sca_passes_live'\n",
" 'sca_passes_dead' 'sca_shots' 'sca_fouled' 'gca' 'gca_per90'\n",
" 'gca_passes_live' 'gca_passes_dead' 'gca_shots' 'gca_fouled'\n",
" 'gca_defense' 'tackles' 'tackles_won' 'tackles_def_3rd' 'tackles_mid_3rd'\n",
" 'tackles_att_3rd' 'blocks' 'blocked_shots' 'blocked_passes'\n",
" 'interceptions' 'clearances' 'errors' 'touches' 'touches_def_pen_area'\n",
" 'touches_def_3rd' 'touches_mid_3rd' 'touches_att_3rd'\n",
" 'touches_att_pen_area' 'touches_live_ball' 'carries'\n",
" 'progressive_carries' 'carries_into_final_third'\n",
" 'carries_into_penalty_area' 'passes_received' 'miscontrols'\n",
" 'dispossessed' 'cards_yellow_red' 'fouls' 'fouled' 'offsides' 'pens_won'\n",
" 'pens_conceded' 'own_goals' 'ball_recoveries' 'aerials_won'\n",
" 'aerials_lost' 'aerials_won_pct']\n"
]
}
],
"source": [
"print('Outfield player columns')\n",
"print(df_outfield.columns.values)\n",
"\n",
"print('Keeper player columns')\n",
"print(df_keeper.columns.values)\n",
"\n",
"print('Team columns')\n",
"print(df_team.columns.values)\n",
"\n",
"print('Vs Team columns')\n",
"print(df_team.columns.values)"
]
},
{
"cell_type": "markdown",
"id": "e4f13ae2",
"metadata": {},
"source": [
"Scrape data for past seasons. \n",
"\n",
"Do not repeat if data is already present."
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "22ad9be5",
"metadata": {},
"outputs": [],
"source": [
"old_season = ['2020-2021', '2021-2022', '2022-2023']\n",
"#old_season = ['2022-2023']\n",
"\n",
"for s in old_season:\n",
" comp = 'https://fbref.com/en/comps/11/' + s + '/'\n",
" statstr = '/' + s + '-Serie-A-Stats'\n",
" \n",
" season_short = s[2:4] + s[7:9]\n",
" \n",
" df_outfield = get_outfield_data(comp, statstr)\n",
" df_outfield.to_csv('fbref_data/season' + season_short + '/outfield_players.csv', index=False)\n",
"\n",
" df_keeper = get_keeper_data(comp, statstr)\n",
" df_keeper.to_csv('fbref_data/season' + season_short + '/keepers_players.csv', index=False)\n",
"\n",
" df_team = get_team_data(comp, statstr, 'for')\n",
" df_team.to_csv('fbref_data/season' + season_short + '/teams.csv', index=False)\n",
"\n",
" df_vsteam = get_team_data(comp, statstr, 'vs')\n",
" df_vsteam.to_csv('fbref_data/season' + season_short + '/teams_vs.csv', index=False)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d37abd7f",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.13"
}
},
"nbformat": 4,
"nbformat_minor": 5
}