欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Python預(yù)測一下世界杯最后贏家

 更新時間:2022年11月23日 09:10:10   作者:俊欣  
四年一度的世界杯已經(jīng)開始了,對于不少熱愛足球運動的球迷來說,這可是十分難得的盛宴。今天小編就通過Python數(shù)據(jù)分析以及機器學(xué)習(xí)等方式來預(yù)測一下誰能獲得最后的冠軍,感興趣的可以了解一下

那么四年一度的世界杯即將要在卡塔爾開幕了,對于不少熱愛足球運動的球迷來說,這可是十分難得的盛宴,而對于最后大力神杯的歸屬,相信很多人都滿懷著期待,每個人心中都有不同的答案。

今天小編就通過Python數(shù)據(jù)分析以及機器學(xué)習(xí)等方式來預(yù)測一下誰能獲得最后的冠軍,當(dāng)然最后預(yù)測出來的結(jié)果也僅僅只是作為一種參考,并不代表最后真實的結(jié)果。

數(shù)據(jù)集的準(zhǔn)備

這里我們用到的數(shù)據(jù)集是來自kaggle的公開數(shù)據(jù)集,其中的一份數(shù)據(jù)集是2018年俄羅斯世界杯每小組各成員交手的記錄,最后小編的預(yù)測基于該份數(shù)據(jù)集的基礎(chǔ)之上,另外一份數(shù)據(jù)集則是從1870年開始到2022年截止,所有參賽球隊的歷史交手成績匯總。那么我們首先導(dǎo)入要用到的模塊以及導(dǎo)入數(shù)據(jù)集。

模塊和數(shù)據(jù)集的導(dǎo)入

數(shù)據(jù)分析和可視化要用到的模塊分別是pandas、matplotlib以及seaborn,而機器學(xué)習(xí)預(yù)測要用到的模塊是sklearn,代碼如下

import?pandas?as?pd?
import?numpy?as?np?
import?matplotlib.pyplot?as?plt?
import?seaborn?as?sns?
import?matplotlib.ticker?as?ticker?
from?sklearn.model_selection?import?train_test_split
from?sklearn.linear_model?import?LogisticRegression

接著我們導(dǎo)入數(shù)據(jù)集

world_cup?=?pd.read_csv("World_Cup_2018_Dataset.csv")
results?=?pd.read_csv("results.csv")

我們可以通過head()方法來查看導(dǎo)入數(shù)據(jù)及的前幾行,校驗一下數(shù)據(jù)的導(dǎo)入是否成功,代碼如下

world_cup.head()

output

探索性數(shù)據(jù)分析和特征工程

接下來我們要做的便是探索性數(shù)據(jù)分析和特征工程了,來對數(shù)據(jù)集有一個大致的了解,同時生成一些針對最后的預(yù)測大有幫助的特征出來,例如我們針對比賽當(dāng)中的比分來判斷比賽是誰勝誰負,或者是平局,代碼如下

winner?=?[]
for?i?in?range(len(results["home_team"])):
????if?results["home_score"][i]?>?results["away_score"][i]:
????????winner.append(results["home_team"][i])
????elif?results["home_score"][i]?<?results["away_score"][i]:
????????winner.append(results["away_team"][i])
????else:
????????winner.append("Draw")

results["winning_team"]?=?winner
results["goal_difference"]?=?np.absolute(results["home_score"]?-?results["away_score"])
results.head()

output

緊接著我們針對某個單獨的國家,統(tǒng)計歷史過往中所有比賽的勝負率情況,例如小編比較喜歡阿根廷隊,就篩選出阿根廷隊的歷史戰(zhàn)績,代碼如下

df?=?results[(results["home_team"]?==?"Argentina")?|?(results["away_team"]?==?"Argentina")]
argen?=?df.iloc[:]
argen.head()

output

那么同時我們也知道第一屆世界杯舉辦的時間是1930年在烏拉圭舉辦的,那么篩選出在1930年之后的所有比賽的成績,代碼如下

year?=?[]
for?row?in?argen['date']:
????year.append(int(row[:4]))
argen["match_year"]?=?year
argen_1930?=?argen[argen.match_year?>=?1930]
argen_1930.head()

output

我們將比賽的結(jié)果的統(tǒng)計可視化出來,其中我們就能清晰地看到阿根廷球隊的勝負率的情況,代碼如下

x?=?["Argentina","Loss","Draw"]
y?=?[474,?220,?173]
?
sns.barplot(x,?y)
plt.title("win?games?vs?loss?games")
plt.xlabel("win?vs?loss")
plt.ylabel("count")
plt.show()

output

俄羅斯世界杯的參賽隊伍

我們先將目標(biāo)鎖定在2018年俄羅斯世界杯的參賽隊伍上,總共是以下這幾支球隊

world_cup_russia?=?["Australia",?"Iran",?"Japan",?"Korea?Republic",?"Saudi?Arabia",?"Egypt",?"Morocco",
???????????????????"Nigeria",?"Senegal",?"Tunisia",?"Costa?Rica",?"Mexico",?"Panama",?"Argentina",?"Brazil",?
????????????????????"Colombia",?"Peru",?"Uruguay",?"Belgium",?"Croatia",?"Denmark",?"England",?"France",?
????????????????????"Germany",?"Iceland",?"Poland",?"Portugal",?"Russia",?"Serbia",?"Spain",?"Sweden",?"Switzerland"]

然后我們篩選出來這32支球隊的過往的比賽成績,代碼如下

df_team_home?=?results[results['home_team'].isin(world_cup_russia)]
df_team_away?=?results[results['away_team'].isin(world_cup_russia)]
df_teams?=?pd.concat((df_team_home,?df_team_away))
df_teams.drop_duplicates(inplace=True)
df_teams.tail()

output

我們著重看的是1930年之后的比賽記錄,那么我們再進行一次篩選,代碼如下

year?=?[]
for?row?in?df_teams["date"]:
????year.append(int(row[:4]))
df_teams["match_year"]?=?year
df_teams_1930?=?df_teams[df_teams.match_year?>=?1930]
df_teams_1930.head()

output

當(dāng)然我們在最后進行預(yù)測的時候,會有一些無關(guān)緊要的特征摻雜其中,我們需要將其去掉,代碼如下

df_teams_1930?=?df_teams.drop(['date',?'home_score',?'away_score',?'tournament',?'city',?'country',?'goal_difference',?'match_year'],?axis=1)
df_teams_1930.tail()

output

我們需要將winning_team這一列的標(biāo)簽做一次轉(zhuǎn)換,將贏得比賽的標(biāo)簽改為2,輸?shù)舯荣惖臉?biāo)簽改為0,而平局的標(biāo)簽改為1,代碼如下

df_teams_1930?=?df_teams_1930.reset_index(drop=True)
df_teams_1930.loc[df_teams_1930.winning_team?==?df_teams_1930.home_team,'winning_team']=2
df_teams_1930.loc[df_teams_1930.winning_team?==?'Draw',?'winning_team']=1
df_teams_1930.loc[df_teams_1930.winning_team?==?df_teams_1930.away_team,?'winning_team']=0
df_teams_1930.tail()

output

緊接著,我們需要對這些離散類型的變量進行獨熱編碼,用到的是pandas模塊當(dāng)中的get_dummies()方法,代碼如下

#?convert?home?team?and?away?team?from?categorical?variables?to?continous?inputs?
#?Get?dummy?variables
final?=?pd.get_dummies(df_teams_1930,?prefix=['home_team',?'away_team'],?columns=['home_team',?'away_team'])
final.head()

output

劃分出訓(xùn)練集和測試集,調(diào)用的是train_test_split()方法,代碼如下

#?Separate?X?and?y?sets
X?=?final.drop(['winning_team'],?axis=1)
y?=?final["winning_team"]
y?=?y.astype('int')

#?Separate?train?and?test?sets
X_train,?X_test,?y_train,?y_test?=?train_test_split(X,?y,?test_size=0.30,?random_state=42)

邏輯回歸算法

那小編這里調(diào)用的是非常簡單的邏輯回歸的算法,讀者朋友后續(xù)也可以嘗試其他的分類算法進一步的完善一下整個預(yù)測的流程與結(jié)果,代碼如下

logreg?=?LogisticRegression()
logreg.fit(X_train,?y_train)
score?=?logreg.score(X_train,?y_train)
score2?=?logreg.score(X_test,?y_test)

print("Training?set?accuracy:?",?'%.3f'%(score))
print("Test?set?accuracy:?",?'%.3f'%(score2))

預(yù)測結(jié)果

那么最后便是將我們訓(xùn)練出來的模型去做一個預(yù)測了,我們先前的數(shù)據(jù)集當(dāng)中有主隊和客隊之分,但是在世界杯的賽場上沒有,這里我們就依據(jù)世界排名的先后順序來劃分一下,因此需要導(dǎo)入世界排名的數(shù)據(jù)集

#?導(dǎo)入新的數(shù)據(jù)集,各球隊的世界排名
ranking?=?pd.read_csv('datasets/fifa_rankings.csv')?
#?2018年俄羅斯世界杯的對陣情況
fixtures?=?pd.read_csv('datasets/fixtures.csv')

pred_set?=?[]

在數(shù)據(jù)集當(dāng)中插入主隊和客隊排名的字段,代碼如下

#?插入兩個新的字段,主隊和客隊排名的字段
fixtures.insert(1,?'first_position',?fixtures['Home?Team'].map(ranking.set_index('Team')['Position']))
fixtures.insert(2,?'second_position',?fixtures['Away?Team'].map(ranking.set_index('Team')['Position']))

#?我們篩選出來在小組賽中的對陣情況
fixtures?=?fixtures.iloc[:48,?:]
fixtures.head()

output

根據(jù)排名的高低來重新修正參賽球隊是作為主隊還是客隊,代碼如下

#?Loop?to?add?teams?to?new?prediction?dataset?based?on?the?ranking?position?of?each?team
for?index,?row?in?fixtures.iterrows():
????if?row['first_position']?<?row['second_position']:
????????pred_set.append({'home_team':?row['Home?Team'],?'away_team':?row['Away?Team'],?'winning_team':?None})
????else:
????????pred_set.append({'home_team':?row['Away?Team'],?'away_team':?row['Home?Team'],?'winning_team':?None})
????????
pred_set?=?pd.DataFrame(pred_set)
backup_pred_set?=?pred_set

pred_set.head()

output

還是和之前一樣的,我們需要對這些離散類型的變量進行編碼,這里就不做演示了,我們調(diào)用訓(xùn)練好的模型并且進行比賽結(jié)果的預(yù)測,代碼如下

#?小組賽對決的預(yù)測?
predictions?=?logreg.predict(pred_set)
for?i?in?range(fixtures.shape[0]):
????print(backup_pred_set.iloc[i,?1]?+?"?and?"?+?backup_pred_set.iloc[i,?0])
????if?predictions[i]?==?2:
????????print("Winner:?"?+?backup_pred_set.iloc[i,?1])
????elif?predictions[i]?==?1:
????????print("Draw")
????elif?predictions[i]?==?0:
????????print("Winner:?"?+?backup_pred_set.iloc[i,?0])
????print('Probability?of?'?+?backup_pred_set.iloc[i,?1]?+?'?winning:?',?'%.3f'%(logreg.predict_proba(pred_set)[i][2]))
????print('Probability?of?Draw:?',?'%.3f'%(logreg.predict_proba(pred_set)[i][1]))
????print('Probability?of?'?+?backup_pred_set.iloc[i,?0]?+?'?winning:?',?'%.3f'%(logreg.predict_proba(pred_set)[i][0]))
????print("")

output

上述預(yù)測的結(jié)果針對的是2018年俄羅斯世界杯小組賽的對陣情況,那么2022年卡塔爾世界杯小組賽的預(yù)測,我們只需要將fixture數(shù)據(jù)集更新一下即可

fixtures?=?pd.read_csv("datasets/fifa-world-cup-2022.csv")
fixtures.head()

output

最后預(yù)測出來的結(jié)果如下所示

到此這篇關(guān)于基于Python預(yù)測一下世界杯最后贏家的文章就介紹到這了,更多相關(guān)Python預(yù)測世界杯贏家內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何使用python3獲取當(dāng)前路徑及os.path.dirname的使用

    如何使用python3獲取當(dāng)前路徑及os.path.dirname的使用

    這篇文章主要介紹了如何使用python3獲取當(dāng)前路徑及os.path.dirname的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Django 接收Post請求數(shù)據(jù),并保存到數(shù)據(jù)庫的實現(xiàn)方法

    Django 接收Post請求數(shù)據(jù),并保存到數(shù)據(jù)庫的實現(xiàn)方法

    今天小編就為大家分享一篇Django 接收Post請求數(shù)據(jù),并保存到數(shù)據(jù)庫的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python中np.random.randint()參數(shù)詳解及用法實例

    Python中np.random.randint()參數(shù)詳解及用法實例

    numpy.random.randint()函數(shù)不僅可以生成一維隨機數(shù)組,也可以生成多維度的隨機數(shù)組,下面這篇文章主要給大家介紹了關(guān)于Python中np.random.randint()參數(shù)詳解及用法的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • 解決Python找不到ssl模塊問題 No module named _ssl的方法

    解決Python找不到ssl模塊問題 No module named _ssl的方法

    這篇文章主要介紹了解決Python找不到ssl模塊問題 No module named _ssl的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04
  • python實現(xiàn)ID3決策樹算法

    python實現(xiàn)ID3決策樹算法

    這篇文章主要為大家詳細介紹了python實現(xiàn)ID3決策樹算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • pytorch如何定義新的自動求導(dǎo)函數(shù)

    pytorch如何定義新的自動求導(dǎo)函數(shù)

    這篇文章主要介紹了pytorch如何定義新的自動求導(dǎo)函數(shù)問題,具有很好的參考價值,希望對大家有所幫助。以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
    2022-12-12
  • python?pandas創(chuàng)建多層索引MultiIndex的6種方式

    python?pandas創(chuàng)建多層索引MultiIndex的6種方式

    這篇文章主要為大家介紹了python?pandas創(chuàng)建多層索引MultiIndex的6種方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Django rest framework如何自定義用戶表

    Django rest framework如何自定義用戶表

    Django 默認的用戶表很多時候這些基本字段不夠用,本文介紹在 DRF上使用自定義用戶表進行接口訪問控制的功能設(shè)計。感興趣的可以了解一下
    2021-06-06
  • 簡單了解python PEP的一些知識

    簡單了解python PEP的一些知識

    這篇文章主要介紹了簡單了解python PEP的一些知識,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • 詳解PyQt5中Thread多線程的使用

    詳解PyQt5中Thread多線程的使用

    QThread是Qt線程類中最核心的底層類,這篇文章主要為大家介紹了PyQt5中Thread多線程的具體使用,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-08-08

最新評論