社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

最强观战指南 | Python分析热门夺冠球队(附源代码)

数据派THU • 5 年前 • 386 次点击  

来源:Python数据之道

本文约2000字,建议阅读5分钟。

本文用 Python 为你分析俄罗斯世界杯32强的实力情况,并大胆预测本届世界杯的夺冠热门球队。


2018年,火热的世界杯即将拉开序幕。在比赛开始之前,我们不妨用 Python 来对参赛队伍的实力情况进行分析,并大胆的预测下本届世界杯的夺冠热门球队。


后台回复“源代码”,获取本文源代码~


通过数据分析,可以发现很多有趣的结果,比如:


  • 找出哪些队伍是首次进入世界杯的黑马队伍

  • 找出2018年32强中之前已经进入过世界杯,但在世界杯上没有赢得过一场比赛的队伍


当然,我们本次的主要任务是要通过数据分析来预测2018年世界杯的夺冠热门队伍。


本次分析的数据来源于 Kaggle, 包含从 1872 年到今年的数据,包括世界杯比赛、世界杯预选赛、亚洲杯、欧洲杯、国家之间的友谊赛等比赛,一共大约 40000 场比赛的情况。


本次的环境为


  • window 7 系统

  • python 3.6

  • Jupyter Notebook

  • pandas version 0.22.0


先来看看数据的情况:

  1. import pandas as pd

  2. import matplotlib.pyplot as plt


  3. %matplotlib inline

  4. plt.style.use('ggplot')


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

  6. df.head()


该数据集包含的数据列的信息如下:


  • 日期

  • 主队名称

  • 客队名称

  • 主队进球数 (不含点球)

  • 客队进球数 (不含点球)

  • 比赛的类型

  • 比赛所在城市

  • 比赛所在国家

  • 是否中立


结果如下:



1. 获取所有世界杯比赛的数据(不含预选赛)


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

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

  3. df_FIFA.head()


结果如下:



数据做一个初步整理

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

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

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

  4. df_FIFA['win_team'] = ''

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


创建一个新的列数据,包含获胜队伍的信息

  1. # The first method to get the winners


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

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

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


  5. df_FIFA.head()


  6. # The second method to get the winners


  7. def find_win_team(df):

  8.    winners = []

  9.    for i, row in df.iterrows():

  10.        if row['home_score'] > row['away_score']:

  11.            winners.append(row['home_team'])

  12.        elif row['home_score'] < row['away_score']:

  13.            winners.append(row['away_team'])

  14.        else:

  15.            winners.append('Draw')

  16.    return winners


  17. df_FIFA['winner'] = find_win_team(df_FIFA)

  18. df_FIFA.head()


结果如下:



2.  获取世界杯所有比赛的前20强数据情况


2.1 获取世界杯所有比赛获胜场数最多的前20强数据


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

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

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


用pandas可视化如下:


柱状图


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



水平柱状图

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

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



饼图


  1. s_percentage = s/s.sum()

  2. s_percentage

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

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



分析结论1:

从赢球场数来看,巴西、德国、意大利、阿根廷四支球队实力最强。


通过上面的分析,我们还可以来查看部分国家的获胜情况


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

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

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

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

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


运行结果分别是 ‘NA’,4,1,5,‘NA’。


从结果来看,中国队,在世界杯比赛上(不含预选赛)还没有赢过。当然,本次世界杯的黑马-埃及队,之前两度进入世界杯上,但也没有赢过~~


上面分析的是赢球场数的情况,下面我们来看下进球总数情况。


2.2 各个国家队进球总数量情况


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

  2. column_update = ['team', 'score']

  3. df_score_home.columns = column_update

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

  5. df_score_away.columns = column_update

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

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

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

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

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



分析结论2:

从进球总数量来看,德国、巴西、阿根廷、意大利四支球队实力最强。


上面分析的是自1872年以来的所有球队的数据情况,下面,我们重点来分析下2018年世界杯32强的数据情况。


3. 2018年世界杯32强分析


2018年世界杯的分组情况如下:


  • 第一组:俄罗斯、德国、巴西、葡萄牙、阿根廷、比利时、波兰、法国

  • 第二组:西班牙、秘鲁、瑞士、英格兰、哥伦比亚、墨西哥、乌拉圭、克罗地亚

  • 第三组:丹麦、冰岛、哥斯达黎加、瑞典、突尼斯、埃及、塞内加尔、伊朗

  • 第四组:塞尔维亚、尼日利亚、澳大利亚、日本、摩洛哥、巴拿马、韩国、沙特阿拉伯


获取32强的所有数据


首先,判断是否有队伍首次打入世界杯。


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

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

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

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

  5. for item in team_list:

  6.    if item not in s_score.index:

  7.        print(item)


  8. out:

  9. Iceland

  10. Panama


通过上述分析可知,冰岛队和巴拿马队是首次打入世界杯的。


由于冰岛队和巴拿马队是首次进入世界杯,所以这里的32强数据,事实上是没有这两支队伍的历史数据的。


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


3.1 自1872年以来,32强数据情况


赢球场数情况


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

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

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

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

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



进球数据情况

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

  2. column_update = ['team', 'score']

  3. df_score_home_32.columns = column_update

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

  5. df_score_away_32.columns = column_update

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

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

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

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

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



分析结论3:

自1872年以来,32强之间的世界杯比赛,从赢球场数和进球数量来看,德国、巴西、阿根廷三支球队实力最强。


自1872年到现在,已经有100多年,时间跨度较大,有些国家已发生重大变化,后续分别分析自1978年(近10届)以及2002年(近4届)以来的比赛情况。


程序代码是类似的,这里只显示可视化的结果。


3.2 自1978年以来,32强数据情况


赢球场数情况



进球数据情况




分析结论4:

自1978年以来,32强之间的世界杯比赛,从赢球场数来看,阿根廷、德国、巴西三支球队实力最强。从进球数量来看,前3强也是这三支球队,但德国队的数据优势更明显。


3.3 自2002年以来,32强数据情况


赢球场数情况



进球数据情况



分析结论5:

自2002年以来,32强之间的世界杯比赛,从赢球场数和进球数量来看,德国、阿根廷、巴西三支球队实力最强。其中,德国队的数据优势更明显。


4. 综合结论


2018年世界杯的32支队伍,根据以往的世界杯比赛数据来看,预测前三强为 德国、阿根廷和巴西,其中德国队应该是夺冠的最大热门。


特别说明:以上数据分析,纯属个人学习用,预测结果与实际情况可能偏差很大,不能用于其他用途。


本文是一次比较综合的项目实战,希望可以给大家带来一些启发。


作者:Lemonbit  
个人公众号:Python数据之道
个人博客:liyangbit.com


后台回复“源代码”,获取本文源代码~



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/nOaXAOCQZJ
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/13586
 
386 次点击