使用 Python 為 2022 年世界盃的每支國家隊尋找夢之隊、最佳陣型和理想的首發陣容
2022年FIFA世界盃已經開始,我們可以從這場比賽的資料中得到很多啟示。
諸如 2022 年世界盃夢之隊、每個國家隊的最佳 26 人陣容以及他們理想的首發陣容之類的東西都可以使用 Python 獲得。
但我們不僅會這樣做!我們還將新增一些資料視覺化,使這種分析更易於理解,甚至使用 Python 繪製具有理想陣容的足球場圖表。
目錄
1。
資料集概述
2。
將資料集 FIFA 22 調整為 2022 年世界盃
3。
用於此分析的指標
4。
2022 年世界盃夢之隊
5。
每個國家隊中評分最高的球員
6
。每個國家隊的最佳 26 人陣容
7。
最佳首發 XI 和陣型
-
西班牙:最佳首發 XI (4–2–3–1)
-
葡萄牙:最佳首發 XI (4–2–3–1)
-
英格蘭:最佳首發 XI (4–4–2)
-
巴西:最佳首發 XI (4–3–3)
-
法國:最佳首發 XI (4–2–3–1)
-
阿根廷:最佳首發 XI (4–3–3)
-
德國:最佳首發 XI (4–2–3–1)
資料集概覽
我們將用於此分析的資料來自 FIFA 22 遊戲,其中包含有關世界上大多數足球運動員的資訊。
將pandas匯入為pd將seaborn匯入為sns將matplotlib。pyplot匯入為plt sns。set_style( ‘darkgrid’ ) df = pd。read_csv( ‘players_22。csv’ , low_memory= False )
此資料集包含 100 多列,但對於此分析,我們將僅使用其中的幾列。
df = df[[‘short_name’, ‘age’, ‘nationality_name’, ‘overall’, ‘potential’,‘short_name’ , ‘age’ , ‘nationality_name’ , ‘overall’ , ‘potential’ , ‘club_name’ , ‘value_eur’ , ‘wage_eur’ , ‘player_positions’ ]]
需要記住的是,該
player_positions
列有多個位置,因此我們應該只選擇一個用於此分析。此外,我們必須刪除 NaN 資料。
# selecting only one positiondf[‘player_positions’] = df[‘player_positions’]。str。split(‘,’, expand=True)[0]# dropping nandf。dropna(inplace=True)
這是
df
資料框在這一點上的樣子。
將資料集 FIFA 22 調整為 2022 年世界盃
現在我們要使資料集 FIFA 22 適應 2022 年世界盃。這意味著我們將只考慮那些有資格參加比賽的國家和那些被國家隊徵召的球員。
# dropping injured playersplayers_missing_worldcup = [‘K。 Benzema’, ‘S。 Mané’, ‘S。 Agüero’, ‘Sergio Ramos’, ‘P。 Pogba’, ‘M。 Reus’, ‘Diogo Jota’, ‘A。 Harit’, ‘N。 Kanté’, ‘G。 Lo Celso’, ‘Piqué’]drop_index = df[df[‘short_name’]。isin(players_missing_worldcup)]。indexdf。drop(drop_index, axis=0, inplace=True)# filtering only national teams in the world cupteams_worldcup = [ ‘Qatar’, ‘Brazil’, ‘Belgium’, ‘France’, ‘Argentina’, ‘England’, ‘Spain’, ‘Portugal’, ‘Mexico’, ‘Netherlands’, ‘Denmark’, ‘Germany’, ‘Uruguay’, ‘Switzerland’, ‘United States’, ‘Croatia’, ‘Senegal’, ‘Iran’, ‘Japan’, ‘Morocco’, ‘Serbia’, ‘Poland’, ‘South Korea’, ‘Tunisia’, ‘Cameroon’, ‘Canada’, ‘Ecuador’, ‘Saudi Arabia’, ‘Ghana’, ‘Wales’, ‘Costa Rica’, ‘Australia’]df = df[df[‘nationality_name’]。isin(teams_worldcup)]
用於此分析的指標
對於此分析,我們將使用每位球員的 FIFA 評分。評級由
overall
列表示。
讓我們對資料框進行排序
overall
(如果多個玩家的評分相同,我們也將按
potential
和
value_eur
列排序)
df。sort_values(by=[‘overall’, ‘potential’, ‘value_eur’], ascending=False, inplace=True) ‘overall’ , ‘potential’ , ‘value_eur’ ], ascending= False , inplace= True )
這是資料框現在的樣子。
現在,讓我們看看 2022 年世界盃所有球員的評分(即總體評分)是如何分配的。
import numpy as np fig, ax = plt。subplots(figsize=( 12 , 5 ), tight_layout= True ) sns。histplot(df, x= ‘overall’ , binwidth= 1 ) bins = np。arange(df[ ‘overall ’ ]。 min (), df[ ‘總體’ ]。 max (), 1 ) plt。xticks(bins) plt。show()
似乎大多數球員的評分為 65 和 67。對於我們的夢之隊,我們將只考慮每個位置評分最高的球員。
2022 年世界盃夢之隊
獲得夢之隊的一個簡單方法是刪除
player_positions
列中的每個重複項(
df
按總體排序,因此“非重複項”將是評分最高的球員)
df。drop_duplicates(‘player_positions’) ‘player_positions’ )
如果我們只選擇、、 和列
short_name
,我們將得到下面代表我們夢之隊的資料框。
overallclub_nameplayer_positions
現在我們有了每個位置的最佳球員,我們可以使用Python工具來製作足球場的圖表並選擇我們想要的任何球員(你只需要在指令碼底部編輯球員的名字)
這是我的夢之隊。
每個國家隊中得分最高的球員
現在讓我們建立一個數據框
df_best_players
,顯示每個國家隊的最佳球員。我們將提取該
nationality_name
列的前 3 個字母以瞭解每個玩家的來源。
df_best_players = df。copy() df_best_players = df_best_players。drop_duplicates(‘nationality_name’)。reset_index(drop=True) ‘nationality_name’ )。reset_index(drop= True ) country_short = df_best_players[ ‘nationality_name’ ]。 str 。extract( ‘(^\w{3})’ , expand= False )。 str 。upper() df_best_players[ ‘name_nationality’ ] = df_best_players[ ‘short_name’ ] + ‘ (’ + country_short + ‘)’
讓我們製作一個條形圖來視覺化資料框
df_best_players
。
fig, ax = plt。subplots(figsize=(10, 6), tight_layout=True) 10 , 6 ), tight_layout= True ) sns。barplot(df_best_players, x= ‘overall’ , y= ‘name_nationality’ , palette=sns 。color_palette( ‘pastel’ ), width= 0。5 ) plt。show()
每個國家隊的最佳26人陣容
讓我們建立一個函式,返回每個國家隊可能的最佳陣容。為此,我們將為每個國家隊的每個位置選出最好的 2 名球員。一旦我們有了最好的陣容,我們就會按
player_positions
,
overall
和對它進行排序
potential
。
def best_squad(nationality): df_best_squad = df。copy() df_best_squad = df_best_squad。groupby([‘nationality_name’, ‘player_positions’])。head(2) df_best_squad = df_best_squad[df_best_squad[‘nationality_name’]==nationality]。sort_values([‘player_positions’, ‘overall’, ‘potential’], ascending=False) return df_best_squad
讓我們看看巴西隊的最佳陣容是什麼
best_squad(‘Brazil’)‘Brazil’)
如您所見,我們有超過 26 名球員,因為我們為每個位置選擇 2 名球員,並且大約有 15 個位置。你可以做一些調整,從這個資料框中只選擇 26 名球員。
現在讓我們看看每個國家隊的平均評分是多少。然後我們將它降序排列
average_overall
。
average_overall = [best_squad(team)[‘overall’]。mean() for teams_worldcup] ‘overall’ ]。mean() for teams_worldcup ] df_average_overall = pd。DataFrame({ ‘Teams’ : teams_worldcup, ‘AVG_Overall’ : average_overall}) df_average_overall = df_average_overall。dropna() df_average_overall = df_average_overall。sort_values( ‘AVG_Overall’ , ascending =False) df_average_overall
以下是平均水平最高的 10 支國家隊。
讓我們用條形圖將其視覺化。
fig, ax = plt。subplots(figsize=(12, 5), tight_layout=True)12, 5), tight_layout=True)sns。barplot(df_average_overall[:10], x=‘Teams’, y=‘AVG_Overall’, palette=sns。color_palette(‘pastel’))plt。show()
最佳首發陣容
現在我們已經為每支國家隊配備了最好的 26 人陣容,我們可以看看什麼是最好的首發陣容和陣型。
這是我想出的所有陣型(如果你願意,你可以新增更多)
dict_formation = { ‘4-3-3’: [‘GK’, ‘RB’, ‘CB’, ‘CB’, ‘LB’, ‘CDM’, ‘CM’, ‘CAM’, ‘RW’, ‘ST ’, ‘LW’], ‘4-3-3’ : [ ‘GK’ , ‘RB’ , ‘CB’ , ‘CB’ , ‘LW ’ , ‘CDM’ , ‘CM’ , ‘CAM’ , ‘RW ’ , ‘ST’ , ‘LW’ ], ‘4-4-2’ : [ ‘GK’ , ‘RB’ , ‘CB’ , ‘CB’, ‘LB’ , ‘RM’ , ‘CM’ , ‘CM’ , ‘LM’ , ‘ST’, ‘ST’ ], ‘4-2-3-1’ : [ ‘GK’ , ‘RB’ , ‘CB’ , ‘CB’ , ‘LB’ , ‘CDM’ , ‘CDM’ , ‘CAM’ , ‘ CAM’ , ‘CAM’ , ‘ST’ ], }
現在我們建立一個
best_lineup
函式,根據我們想要的陣型返回最佳首發 XI。
def best_lineup(nationality, lineup):best_lineup(nationality, lineup): lineup_count = [lineup。count(i) for i in lineup] df_lineup = pd。DataFrame({‘position’: lineup, ‘count’: lineup_count}) positions_non_repeated = df_lineup[df_lineup[‘count’] <= 1][‘position’]。values positions_repeated = df_lineup[df_lineup[‘count’] > 1][‘position’]。values df_squad = best_squad(nationality) df_lineup = pd。concat([ df_squad[df_squad[‘player_positions’]。isin(positions_non_repeated)]。drop_duplicates(‘player_positions’, keep=‘first’), df_squad[df_squad[‘player_positions’]。isin(positions_repeated)]] ) return df_lineup[[‘short_name’, ‘overall’, ‘club_name’, ‘player_positions’]]
最後我們迴圈遍歷世界盃前7名的球隊,返回平均評分最高的陣型。
for index, row in df_average_overall[:7]。iterrows(): max_average = None for key, values in dict_formation。items(): average = best_lineup(row[‘Teams’], values)[‘overall’]。mean() if max_average is None or average>max_average: max_average = average formation = key print(row[‘Teams’], formation, max_average)
偉大的!現在我們為每支國家隊準備了最佳陣型。
Spain 4-2-3-1 85。1Portugal 4-2-3-1 84。9England 4-4-2 84。45454545454545Brazil 4-3-3 84。81818181818181France 4-2-3-1 83。9Argentina 4-3-3 83。54545454545455Germany 4-2-3-1 84。1
讓我們找出西班牙、葡萄牙、英格蘭、巴西、法國、阿根廷和德國的最佳首發陣容。
1。 西班牙:最佳首發 XI (4–2–3–1)
est_lineup(‘Spain’, dict_formation[‘4-2-3-1’])‘Spain’, dict_formation[‘4-2-3-1’])
2。 葡萄牙:最佳首發陣容 (4–2–3–1)
best_lineup(‘Portugal’, dict_formation[‘4-2-3-1’])‘Portugal’, dict_formation[‘4-2-3-1’])
3。 英格蘭:最佳首發陣容 (4–4–2)
best_lineup(‘England’, dict_formation[‘4-4-2’])‘England’, dict_formation[‘4-4-2’])
4。 巴西:最佳首發陣容 (4–3–3)
best_lineup(‘Brazil’, dict_formation[‘4-3-3’])‘Brazil’, dict_formation[‘4-3-3’])
5。 法國:最佳首發 XI (4–2–3–1)
best_lineup(‘France’, dict_formation[‘4-2-3-1’]) ‘France’ , dict_formation[ ‘4-2-3-1’ ])
6。 阿根廷:最佳首發陣容 (4–3–3)
best_lineup(‘Argentina’, dict_formation[‘4-3-3’])‘Argentina’, dict_formation[‘4-3-3’])
7。 德國:最佳首發 XI (4–2–3–1)
best_lineup(‘Germany’, dict_formation[‘4-2-3-1’])‘Germany’, dict_formation[‘4-2-3-1’])
結束了!