2018俄罗斯世界杯小组抽签出炉,几家欢喜几家愁。世界杯从来就不乏看点,东道主俄罗斯能走多远、德国能否卫冕、西班牙是否有望东山再起、两位球王谁更接近大力神杯...距世界杯开幕还有半年时间,一切都是未知数,不过整个赛程已定,我完全按照赛程模拟了所有64场比赛比分1000次,得出了A~H组各自的出线形势、每支队伍进四强的概率、以及最终的夺冠概率。一切结果,先卖个关子。

做这件事分四个步骤:爬数据

计算球队进球、失球均值,构建泊松模型

模拟1000次世界杯赛事

统计出线概率、夺冠概率、四强概率

爬数据

上一篇文章用Python分析本赛季英超争四形势提到从OPTA抓取数据,由于接口权限不对外公开,现在我改用公开的免费数据,方便大家自行抓取。这次所有比赛数据、赛程数据是我从球探网上抓的。利用selenium库,我将每只参赛国家队最近一年的比赛数据都抓取下来,保存成Pandas库的数据框。举个例子,这是葡萄牙国家队的页面,以及下面一张截图是抓下来存储的干净数据框。葡萄牙国家队葡萄牙国家队的Pandas数据框

计算球队进球、失球均值,构建泊松模型

泊松模型是模拟比赛的核心算法,理论在用Python分析本赛季英超争四形势文章中介绍过。针对国家队,我做了以下修改:若进球数

,强制

。这是因为热身赛双方实力差距过大,德国8:0马来西亚,这种差距在世界杯决赛圈几乎不存在。

亚洲球队与欧洲球队水平存在一个差异值,需要整体乘以一个系数。韩国场均进2球,相比德国场均1.5球,韩国的对手亚洲球队居多,德国打过欧洲杯对手实力不俗,韩国的场均2球必须打折扣。

得到计算结果,按进攻实力排序,欧洲豪强与南美双雄占据前列。(尾部的球队没有列出来)

模拟1000次世界杯赛事

先解决如何模拟一场比赛。淘汰赛与小组赛不同,如果打成平局必须进行点球大战,决出胜负。点球大战就设定各自50%概率晋级,下面这个simulate_match函数传入knockout参数为True时,就会激发这个机制,返回晋级的球队名。如果不是knockout,就是小组赛,就是输出模拟的比分。

import scipy as sp

import pandas as pd

# 读取球队进球率、失球率参数

team_strength = pd.read_csv('球队攻防参数.csv')

# 每一场球生成几次泊松随机数,次数越多随机因素越小

n_sim = 5

def simulate_match(team_A, team_B, knockout=False):

"""模拟一场比赛,返回主队进球数、客队进球数"""

# 获取比赛双方进球率、失球率

home_scoring_strength = (team_strength.loc[team_A, 'alpha'] + \

team_strength.loc[team_B, 'beta']) / 2

away_scoring_strength = (team_strength.loc[team_A, 'beta'] + \

team_strength.loc[team_B, 'alpha']) / 2

# 模拟n次比赛进球数取众数

fs_A = sp.stats.mode(poisson.rvs(home_scoring_strength, size=n_sim))[0][0]

fs_B = sp.stats.mode(poisson.rvs(away_scoring_strength, size=n_sim))[0][0]

print(team_A, fs_A, team_B, fs_B)

# 进入淘汰赛,若平局,点球大战晋级概率50%:50%

if knockout:

if fs_A == fs_B:

return [team_A, team_B][sp.random.randint(0, 2)]

elif fs_A > fs_B:

return team_A

else:

return team_B

return fs_A, fs_B

# 例如:

simulate_match('阿根廷', '尼日利亚', knockout=True)

>> 阿根廷

接下来是赛程,小组赛有6场每个组,8组共48场。按照赛程我手动写入列表里,比如A组的比赛按顺序,对战双方分别是这样:

# 小组每场比赛对阵双方:[主队, 客队]

fixture_A = \

[['俄罗斯', '沙特阿拉伯'],

['埃及', '乌拉圭'],

['俄罗斯', '埃及'],

['乌拉圭', '沙特阿拉伯'],

['沙特阿拉伯', '埃及'],

['俄罗斯', '乌拉圭']

]

然后建了一个类,每个组分别各自初始化自己的类,传入参数fixture就是上面创建的赛程,只需调用play函数就可以模拟该小组6场比赛比分。self.table是小组积分榜,保存下来每次模拟的小组头两名球队名,后面统计每支队在1000次模拟里出线的次数,即出线概率。

class Group:

"""模拟小组赛阶段,直接调用.play方法。"""

def __init__(self, group_teams, group_name, fixture):

self.group_teams = group_teams

self.group_name = group_name

self.table = pd.DataFrame(0, columns=['场次', '积分', '进球', '失球', '净胜球'], index=self.group_teams)

self.fixture = fixture

self.result = None

def play(self):

result = []

for [team_A, team_B] in self.fixture:

fs_A, fs_B = simulate_match(team_A, team_B)

self.table.loc[team_A, '场次'] += 1

self.table.loc[team_B, '场次'] += 1

self.table.loc[team_A, '进球'] += fs_A

self.table.loc[team_B, '进球'] += fs_B

self.table.loc[team_A, '失球'] += fs_B

self.table.loc[team_B, '失球'] += fs_A

if fs_A > fs_B:

self.table.loc[team_A, '积分'] += 3

elif fs_A == fs_B:

self.table.loc[team_A, '积分'] += 1

self.table.loc[team_B, '积分'] += 1

elif fs_A < fs_B:

self.table.loc[team_B, '积分'] += 1

else:

raise ValueError('比赛比分模拟有误!')

result.append([team_A, team_B, fs_A, fs_B])

self.result = pd.DataFrame(result, columns=['主队', '客队', '主队进球', '客队进球'])

self.table['净胜球'] = self.table['进球'] - self.table['失球']

self.table.sort_values(by=['积分', '净胜球', '进球'],

ascending=[False, False, False], inplace=True)

随后淘汰赛,16进8、8进4、半决赛和决赛。赛程球探网给出了,包括进入16强的对阵形势,每场由哪组第一对阵哪组第二都写清楚了,只要继续用上面模拟比赛的方式继续按照赛程模拟就行。

至此,我可以完整模拟一届世界杯的所有64场比赛的比分。最重要的,我记录下每组的出线球队、以及冠亚军、季军、殿军分别是哪个国家。接下来就可以轻松循环1000次,并进行统计。

统计出线概率、夺冠概率、四强概率

A~H组各自的出线概率我已经统计完成,东道主俄罗斯的FIFA世界排名已跌至65位,不过俄罗斯抽签抽到上上签,有望小组出线进入下一轮。(由于32球队太多,图片拆分4波展示。)A组B组出线形势C组D组出线形势E组F组出线形势G组H组出线形势

以下是夺冠概率、及打进四强的概率。列出了所有夺冠热门球队。

最后,韩国队在1000次模拟中11次进入四强,并有1次夺冠。这种小概率事件不禁让我想起2015/16赛季英超,以赛季前1赔5000逆天夺冠的莱斯特城。所以,足球是圆的,任何事情都有它的可能性存在,中国国足什么时候再进世界杯呢?

python模拟足球射门_用Python模拟2018世界杯夺冠之路相关推荐

  1. python模拟足球射门_使用PyQt5的动画功能实现足球射门效果

    QT作为一个全面的桌面应用程序开发包,其自然提供了对图像的动画支持.本篇文章中,就来简单地在PYQt5中使用Animation动画功能实现一个足球射门的动画效果. 本篇将会依次完成以下功能: 在GUI ...

  2. python模拟足球射门_[转载]博客园仿真足球竞赛平台Python版SDK

    为了方便喜欢Python的同学能使用Python开发自己的球队,所以编写了此SDK.这个SDK 基本上是参照C#版SDK改过来的,除了一些复杂的几何算法没有实现外,其他功能都已实现.喜欢的朋友可以自己 ...

  3. c语言程序设计足球,使用C语言计算与模拟足球射门.doc

    使用C语言计算与模拟足球射门[4] 1 引言 C语言是近年来在国内外得到迅速推广应用的一种计算机语言.C语言功能丰富.使用灵活方便.应用面广.目标程序效率高.可移植性好,既有高级语言的优点,又有低级语 ...

  4. c语言足球从100米下落,使用c语言计算与模拟足球射门.docx

    使用C语言计算与模拟足球射门 [4] 1引言 c语言是近年来在国内外得到迅速推广应用的一种计算机语言.c语言功能丰富.使用 灵活方便.应用面广.目标程序效率高.可移植性好,既有高级语言的优点,又有低级 ...

  5. 蒙特卡洛模拟预测股票_使用蒙特卡洛模拟来预测极端天气事件

    蒙特卡洛模拟预测股票 In a previous article, I outlined the limitations of conventional time series models such ...

  6. python模拟足球射门_Python玩个球,如何用PyQt5实现足球射门动画?

    QT作为一个全面的桌面应用程序开发包,其自然提供了对图像的动画支持.本篇文章中,就来简单地在PYQt5中使用Animation动画功能实现一个足球射门的动画效果. 本篇将会依次完成以下功能:在GUI界 ...

  7. python模拟足球比赛_python初体验 —— 模拟体育竞技

    python初体验 -->>> 模拟体育竞技 一.排球训练营 1. 简介: 模拟不同的两个队伍进行排球的模拟比赛. 2. 模拟原理: 通过输入各自的能力值(Ⅰ),模拟比赛的进行( P ...

  8. python类高级用法_十.python面向对象高级用法

    1.反射 1.1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的 ...

  9. python的opencv库_用于Python的Opencv可视化库安装,面向,OpenCV,视觉

    计算机视觉最重要的库莫过于OpenCV,ananconda功能很强大,但是也有比较重要的几个库,还没做成集成开发环境,需要自己安装. 在安装的过程中也走了许多弯路,因为安装的方法有许多许多,有些随着O ...

最新文章

  1. SQL Server 2005 学习笔记之触发器简介[转]
  2. Windows Server 2012 R2/2016 此工作站和主域间的信任关系失败
  3. A Self-Attention Setentence Embedding 阅读笔记
  4. ElementUI中el-upload传递额外参数为date类型时后台SpringBoot接收不到
  5. OpenGL shader interpolation 着色器插值的实例
  6. 用状态机STATE MACHINE实现有选择的文件转换
  7. jsp15公安海警学院值班管理系统(jsp+servlet+mysql)
  8. [RK3288][Android6.0] 音频输入接口Mic In和Line In
  9. python——爬虫豆瓣250
  10. linux 验证码 权限,LINUX 下验证码无法显示怎么办
  11. Orcad 16.6中批量修改网络名
  12. 【码农说码】手撕锟斤拷,彻底搞懂GB2312,GBK,Big5,ASCII,UTF-8,UTF-32的前世今生
  13. 普通话转换成方言的语音识别方法
  14. 电音(5)Bass类电音
  15. Docker buil提示https://registry-1.docker.io/v2/: read tcp 10.221->:443: read: connection reset by peer
  16. html手抄报怎么制作软件,如何用word制作一个精美的电子板报
  17. opencv图像处理学习(十五)——minMaxLoc函数
  18. 百度绿萝2.0上线后,新站该如何做SEO?
  19. mysql users 命令大全_mysql 命令大全
  20. ffmpeg--学习笔记1-下载安装

热门文章

  1. Javaweb实现员工信息管理系统
  2. WSL2 中 docker volume 的位置
  3. FFMPEG的像素格式
  4. Vivado使用技巧(17):时序异常 Timing Exception
  5. css3简单实现页面中出现雪花飘落效果
  6. 【OPENCV_系列电子PDF图书连载】计算机视觉从入门到精通完整学习路线专栏
  7. 算法设计与分析—分支限界法应用(头歌实验)
  8. 关于Axure的基本框架
  9. HTTP协议格式(请求格式、响应格式)
  10. SVN检出报错,SVN更新时忽略指定文件或文件夹