python編程比賽_用Python編程分析4W場球賽后,2018世界杯冠軍竟是…

比賽已經開始,我們不妨用 Python 來對參賽隊伍的實力情況進行分析,并大膽的預測下本屆世界杯的奪冠熱門球隊吧!

46c8043134b64dd4d2cc4a34b7c94455.png

通過數據分析,可以發現很多有趣的結果,比如:

找出哪些隊伍是首次進入世界杯的黑馬隊伍

找出2018年32強中之前已經進入過世界杯,但在世界杯上沒有贏得過一場比賽的隊伍

當然,我們本次的主要任務是要通過數據分析來預測2018年世界杯的奪冠熱門隊伍。

本次分析的數據來源于 Kaggle, 包含從 1872 年到今年的數據,包括世界杯比賽、世界杯預選賽、亞洲杯、歐洲杯、國家之間的友誼賽等比賽,一共大約 40000 場比賽的情況。

本次的環境為:

window 7 系統

python 3.6

Jupyter Notebook

pandas version 0.22.0

先來看看數據的情況:

importpandasaspd

importmatplotlib.pyplotasplt

%matplotlib inline

plt.style.use('ggplot')

df = pd.read_csv('results.csv')

df.head()

該數據集包含的數據列的信息如下:

日期

主隊名稱

客隊名稱

主隊進球數 (不含點球)

客隊進球數 (不含點球)

比賽的類型

比賽所在城市

比賽所在國家

是否中立

結果如下:

be5d64d438c598e76a9d94ace98cf364.png

1、 獲取所有世界杯比賽的數據

df_FIFA_all = df[df['tournament'].str.contains('FIFA', regex=True)]

df_FIFA = df_FIFA_all[df_FIFA_all['tournament']=='FIFA World Cup']

df_FIFA.head()

結果如下:

6756a02d567365b08ab9b403cf01601f.png

數據做一個初步整理

df_FIFA.loc[:,'date'] = pd.to_datetime(df_FIFA.loc[:,'date'])

df_FIFA['year'] = df_FIFA['date'].dt.year

df_FIFA['diff_score'] = df_FIFA['home_score']-df_FIFA['away_score']

df_FIFA['win_team'] =''

df_FIFA['diff_score'] = pd.to_numeric(df_FIFA['diff_score'])

創建一個新的列數據,包含獲勝隊伍的信息

# The first method to get the winners

df_FIFA.loc[df_FIFA['diff_score']>0,'win_team'] = df_FIFA.loc[df_FIFA['diff_score']>0,'home_team']

df_FIFA.loc[df_FIFA['diff_score']<0,'win_team'] = df_FIFA.loc[df_FIFA['diff_score']<0,'away_team']

df_FIFA.loc[df_FIFA['diff_score']==0,'win_team'] ='Draw'

df_FIFA.head()

# The second method to get the winners

deffind_win_team(df):

winners = []

fori, rowindf.iterrows():

ifrow['home_score'] > row['away_score']:

winners.append(row['home_team'])

elifrow['home_score'] < row['away_score']:

winners.append(row['away_team'])

else:

winners.append('Draw')

returnwinners

df_FIFA['winner'] = find_win_team(df_FIFA)

df_FIFA.head()

結果如下:

69d91416460fe9402969812300e9735e.png

2、 獲取世界杯所有比賽的前20強數據情況

2.1 獲取世界杯所有比賽獲勝場數最多的前20強數據

s = df_FIFA.groupby('win_team')['win_team'].count()

s.sort_values(ascending=False, inplace=True)

s.drop(labels=['Draw'], inplace=True)

用pandas可視化如下:

柱狀圖

s.head(20).plot(kind='bar', figsize=(10,6), title='Top 20 Winners of World Cup')

48a611518163e57c2962a4bdcbd68b34.png

水平柱狀圖

s.sort_values(ascending=True,inplace=True)

s.tail(20).plot(kind='barh', figsize=(10,6), title='Top 20 Winners of World Cup')

4b5112462ed10e316a4ab79cdb38b065.png

餅圖

s_percentage = s/s.sum()

s_percentage

s_percentage.tail(20).plot(kind='pie', figsize=(10,10), autopct='%.1f%%',

startangle=173, title='Top 20 Winners of World Cup', label='')

f522c4d3b2cf39768b8003485b1e372a.png

分析結論1:

從贏球場數來看,巴西、德國、意大利、阿根廷四支球隊實力最強。

通過上面的分析,我們還可以來查看部分國家的獲勝情況

s.get('China',default='NA')

s.get('Japan',default='NA')

s.get('Korea DPR',default='NA')

s.get('Korea Republic',default='NA')

s.get('Egypt',default='NA')

運行結果分別是 ‘NA’,4,1,5,‘NA’。

從結果來看,中國隊,在世界杯比賽上(不含預選賽)還沒有贏過。當然,本次世界杯的黑馬-埃及隊,之前兩度進入世界杯上,但也沒有贏過~~

上面分析的是贏球場數的情況,下面我們來看下進球總數情況。

2.2 各個國家隊進球總數量情況

df_score_home = df_FIFA[['home_team','home_score']]

column_update = ['team','score']

df_score_home.columns = column_update

df_score_away = df_FIFA[['away_team','away_score']]

df_score_away.columns = column_update

df_score = pd.concat([df_score_home,df_score_away], ignore_index=True)

s_score = df_score.groupby('team')['score'].sum()

s_score.sort_values(ascending=False, inplace=True)

s_score.sort_values(ascending=True, inplace=True)

s_score.tail(20).plot(kind='barh', figsize=(10,6), title='Top 20 in Total Scores of World Cup')

3bd67740d893d08183e55dd4eb56fcb2.png

分析結論2:

從進球總數量來看,德國、巴西、阿根廷、意大利四支球隊實力最強。

上面分析的是自1872年以來的所有球隊的數據情況,下面,我們重點來分析下2018年世界杯32強的數據情況。

3、2018年世界杯32強分析

2018年世界杯的分組情況如下:

第一組:俄羅斯、德國、巴西、葡萄牙、阿根廷、比利時、波蘭、法國

第二組:西班牙、秘魯、瑞士、英格蘭、哥倫比亞、墨西哥、烏拉圭、克羅地亞

第三組:丹麥、冰島、哥斯達黎加、瑞典、突尼斯、埃及、塞內加爾、伊朗

第四組:塞爾維亞、尼日利亞、澳大利亞、日本、摩洛哥、巴拿馬、韓國、沙特阿拉伯

獲取32強的所有數據

首先,判斷是否有隊伍首次打入世界杯。

team_list = ['Russia','Germany','Brazil','Portugal','Argentina','Belgium','Poland','France',

'Spain','Peru','Switzerland','England','Colombia','Mexico','Uruguay','Croatia',

'Denmark','Iceland','Costa Rica','Sweden','Tunisia','Egypt','Senegal','Iran',

'Serbia','Nigeria','Australia','Japan','Morocco','Panama','Korea Republic','Saudi Arabia']

foriteminteam_list:

ifitemnot ins_score.index:

print(item)

out:

Iceland

Panama

通過上述分析可知,冰島隊和巴拿馬隊是首次打入世界杯的。

由于冰島隊和巴拿馬隊是首次進入世界杯,所以這里的32強數據,事實上是沒有這兩支隊伍的歷史數據的。

df_top32 = df_FIFA[(df_FIFA['home_team'].isin(team_list))&(df_FIFA['away_team'].isin(team_list))]

3.1 自1872年以來,32強數據情況

贏球場數情況

s_32 = df_top32.groupby('win_team')['win_team'].count()

s_32.sort_values(ascending=False, inplace=True)

s_32.drop(labels=['Draw'], inplace=True)

s_32.sort_values(ascending=True,inplace=True)

s_32.plot(kind='barh', figsize=(8,12), title='Top 32 of World Cup since year 1872')

49d234c1bdce0319f4454e004ca3e608.png

進球數據情況

df_score_home_32 = df_top32[['home_team','home_score']]

column_update = ['team','score']

df_score_home_32.columns = column_update

df_score_away_32 = df_top32[['away_team','away_score']]

df_score_away_32.columns = column_update

df_score_32 = pd.concat([df_score_home_32,df_score_away_32], ignore_index=True)

s_score_32 = df_score_32.groupby('team')['score'].sum()

s_score_32.sort_values(ascending=False, inplace=True)

s_score_32.sort_values(ascending=True, inplace=True)

s_score_32.plot(kind='barh', figsize=(8,12), title='Top 32 in Total Scores of World Cup since year 1872')

e05f1c4ef5134d29f111e5fd24e2bb22.png

分析結論3:自1872年以來,32強之間的世界杯比賽,從贏球場數和進球數量來看,德國、巴西、阿根廷三支球隊實力最強。

自1872年到現在,已經有100多年,時間跨度較大,有些國家已發生重大變化,后續分別分析自1978年(近10屆)以及2002年(近4屆)以來的比賽情況。

程序代碼是類似的,這里只顯示可視化的結果。

3.2 自1978年以來,32強數據情況

贏球場數情況

91c9ec3450eae527446b07f13dd1e4f1.png

進球數據情況

087a749f9554d13e5e6aebe4bb956a08.png

分析結論4:自1978年以來,32強之間的世界杯比賽,從贏球場數來看,阿根廷、德國、巴西三支球隊實力最強。從進球數量來看,前3強也是這三支球隊,但德國隊的數據優勢更明顯。

3.3 自2002年以來,32強數據情況

贏球場數情況

dee998eb655e8fd63300fa064a99d425.png

進球數據情況

728abd1a563318d3c079afdfd02a7d73.png

分析結論5:自2002年以來,32強之間的世界杯比賽,從贏球場數和進球數量來看,德國、阿根廷、巴西三支球隊實力最強。其中,德國隊的數據優勢更明顯。

4、綜合結論

2018年世界杯的32支隊伍,根據以往的世界杯比賽數據來看,預測前三強為德國、阿根廷和巴西,其中德國隊應該是奪冠的最大熱門。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372800.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372800.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372800.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GlassFish 3.1.2充滿了MOXy(EclipseLink JAXB)

我非常高興地宣布&#xff0c; EclipseLink JAXB&#xff08;MOXy&#xff09;現在是GlassFish 3.1.2中的JAXB&#xff08; JSR-222 &#xff09;提供程序。 我要感謝EclipseLink和GlassFish提交者為實現這一目標付出的??辛勤工作。 在本文中&#xff0c;我將介紹如何利用MOX…

夢斷代碼閱讀筆記03

讀完《夢斷代碼(Dream In Code)》樣書&#xff0c;我感覺心情有點沉重&#xff0c;Chandler項目的結局&#xff0c;它失敗了&#xff0c;它成了眾多失敗軟件項目中的一個。這個結局讓那個我感受到軟件實在是太難了&#xff0c;我覺得當初選這個專業可能到最后只是一個碼農。但是…

Java訪問權限的范圍

二、下面用表格來展示四種修飾符的訪問權限范圍&#xff1a; 同一個類 同一個包 不同包的子類 不同包的非子類 public √ √ √ √ protected √ √ √ 默認(default) √ √ private √ 轉載于:https://www.cnblogs.com/jianxin-lilang/p/6…

JavaFX 2 GameTutorial第2部分

介紹 ?他的是一系列與一個JavaFX 2游戲教程博客條目的第二批。 如果您尚未閱讀第1部分&#xff0c;請參閱JavaFX 2游戲教程的簡介部分。 在第1部分中&#xff0c;我提到了游戲的某些方面以及原型飛船的簡單演示&#xff08;原型由簡單的形狀組成&#xff09;&#xff0c;該飛船…

sqlyog連接mysql教程_如何用SQLyog實現遠程連接MySQL

SQLyog客戶端&#xff0c;用root用戶遠程鏈接MySQL時&#xff0c;提示ldquo;訪問被拒絕rdquo;&#xff0c;在網上搜索了一下原因。原來是MySQL沒有授權其遠程鏈1&#xff0c;SQLyog客戶端&#xff0c;&#xff0c;用root用戶遠程鏈接MySQL時&#xff0c;提示“訪問被拒絕”&…

動態SQL+變量綁定:解決ORA-01704: 字符串文字太長的問題

最近在做一個ESB項目&#xff0c;有一個trigger里面執行動態SQL的時候報錯&#xff1a; ORA-01704: 字符串文字太長 經檢查發現SQL里面有個字段是clob類型&#xff0c;內容長度4009&#xff0c;在oracle里面&#xff0c; 一對引號內的字符長度如果超過4000&#xff0c;就會報OR…

JavaME:Google靜態地圖API

無論您是需要基于位置的應用程序的地圖還是只是出于娛樂目的&#xff0c;都可以使用有史以來最簡單的方法&#xff1a;Google Static Maps API。 在這篇文章中&#xff0c;我們將看到如何從緯度和經度獲得地圖作為圖像。 可以使用Location API獲得緯度和經度&#xff0c;我們將…

在ASP.NET中實現OAuth2.0(一)之了解OAuth

1、什么是OAuth2.0 是一個開放授權標準&#xff0c;允許用戶讓第三方應用訪問該用戶在某一個網站或平臺上的私密資源&#xff08;如照片、視頻、聯系人等&#xff09;&#xff0c;而無須將用戶名和密碼提供給第三方應用 2、OAuth2.0授權模式 授權碼模式&#xff08;authorizati…

mysql日期條件如何應用_MySQL如何使用時間作為判斷條件

背景&#xff1a;在開發過程中&#xff0c;我們經常需要根據時間作為判斷條件來查詢數據&#xff0c;例如&#xff1a;當月&#xff0c;當日&#xff0c;當前小時&#xff0c;幾天內......1. 當月我們只需要使用一個mysql的month(date)函數即可實現。(注意判斷年份)month(date)…

深入探討JS中的數組排序函數sort()和reverse()

最近在研究Javascript發現了其中一些比較靈異的事情。有點讓人感到無語比如&#xff1a; alert(typeof( NaN NaN));//結果為假。 alert(typeof( NaN ! NaN));//結果為真。 嘿嘿&#xff0c;當然這個不是這篇文章要討論的!!開始我們的正文 首先&#xff0c;我們來看一下JS中sor…

帶有謂詞的Java中的功能樣式-第1部分

您一直在聽到將要席卷全球的函數式編程&#xff0c;而您仍然堅持使用普通Java&#xff1f; 不用擔心&#xff0c;因為您已經可以在日常Java中添加一些功能樣式。 此外&#xff0c;它很有趣&#xff0c;可以節省許多代碼行并減少錯誤。 什么是謂詞&#xff1f; 實際上&#xff…

寶塔添加多占點_寶塔面板啟用WordPress多站點子域名、子目錄

其實在很早以前&#xff0c;陌小雨就聽說了 wordpress 的多站點功能&#xff0c;不過因為不清楚&#xff0c;所以懶得折騰&#xff0c;這不這幾天閑著蛋疼&#xff0c;好好研究了下這玩意&#xff0c;用起來的感覺還是相當不錯的&#xff0c;總結起來就是如果你準備開始用 word…

centos 6.5下安裝文件上傳下載服務

centos 6.5下安裝文件上傳下載服務 由于每次在CentOS中要下載一些配置文件到物理機&#xff0c;和上傳一些文件到服務器&#xff0c;導致來回的開啟ftp軟件有點麻煩&#xff0c;這里我們可以使用文件上傳下載服務&#xff0c;來解決上傳和下載的問題。 1.登錄服務器 2.執行命令…

Jenkins 入門系列--jenkins 介紹

第一章 Jenkins是什么&#xff1f; Jenkins 是一個可擴展的持續集成引擎。 主要用于&#xff1a; l 持續、自動地構建/測試軟件項目。 l 監控一些定時執行的任務。Jenkins擁有的特性包括&#xff1a; l 易于安裝-只要把jenkins.war部署到servlet容器&#xff0c;不需要數據庫支…

在方法參數上使用final關鍵字

經過一些自己的混淆&#xff0c;最終博客方法的具體含義&#xff08;最終聲明的方法參數&#xff09;將對此博客條目進行澄清。 至少可以將方法參數上的final關鍵字視為Java編譯器的指示符&#xff0c;表明該參數不能重新分配給另一個引用。 Java參數處理始終是“按值調用” &a…

PHP MySQLi 增刪改查

最近幾天&#xff0c;我們一直在學習利用MySQLi訪問數據庫并對其中的數據進行操作。今天給大家展現一個完整的例子&#xff0c;我們來制作一個新聞發布系統&#xff0c;利用MySQLi來操作數據庫&#xff0c;實現對新聞的添加、修改、刪除、查詢等基本功能。&#xff08;以下代碼…

20162303《程序設計與數據結構》第一周學習總結

學號 2016-2017-2 《程序設計與數據結構》第1周學習總結 教材學習內容總結 本周學習了基本的JAVA知識&#xff0c;雖然比較基礎&#xff0c;但是在實際過程中還是出現了許許多多的問題&#xff0c;代碼一遍遍的敲錯&#xff0c;又一遍遍的修改&#xff0c;剛開始甚至不會切換模…

Java EE與NoSQL的未來

自一段時間以來&#xff0c;我一直在關注NoSQL的近期發展勢頭&#xff0c;似乎這個流行語也引起了企業Java界的某種關注。 即EclipseLink 2.4開始支持MongoDB和Oracle NoSQL 。 將EclipseLink作為JPA參考實現&#xff0c;您可能想知道這對Java EE 7意味著什么。這里簡短說明&am…

【C/C++開發】C語言實現函數可變參數

函數原型: int printf(const char *format[,argument]...) 返 回 值: 成功則返回實際輸出的字符數&#xff0c;失敗返回-1. 函數說明: 在printf()函數中&#xff0c;format后面的參數個數不確定&#xff0c;且類型也不確定&#xff0c;這些參數都存放在棧內.調用…

java postgresql json_java – 將PostgreSQL JSON列映射到Hibernate值類...

See PgJDBC bug #265.PostgreSQL對數據類型轉換過于嚴格,非常嚴格.它不會隱式地將文本轉換為類似文本的值,例如xml和json.解決此問題的嚴格正確方法是編寫使用JDBC setObject方法的自定義Hibernate映射類型.這可能有點麻煩,所以你可能只想通過創建一個較弱的強制轉換來使Postgr…