欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python模拟2018世界杯夺冠之路,统计了四强预测以及夺冠率!

程序员文章站 2022-07-07 20:57:02
万众瞩目的2018世界杯即将在俄罗斯拉开战幕。四年一次的足球盛宴,更是每一个球迷翘首以盼的狂欢节日,球迷们痴迷的呐喊,激动至晕厥的欢呼仿佛已经随着2018世界杯的临近在我们耳边响起。 毫无疑问,谁将捧起世界杯是我们最关心的问题,小编作为一名“资深”球迷自然得发挥下自己的专长,用python模拟201 ......

万众瞩目的2018世界杯即将在俄罗斯拉开战幕。四年一次的足球盛宴,更是每一个球迷翘首以盼的狂欢节日,球迷们痴迷的呐喊,激动至晕厥的欢呼仿佛已经随着2018世界杯的临近在我们耳边响起。

Python模拟2018世界杯夺冠之路,统计了四强预测以及夺冠率!

毫无疑问,谁将捧起世界杯是我们最关心的问题,小编作为一名“资深”球迷自然得发挥下自己的专长,用python模拟2018世界杯,先给大家解解渴。

前言

世界杯即将开打,一切都是未知数,不过整个赛程已定,我们可以完全按照赛程模拟全部64场比赛比分10000次,得出A~H组各自的出线形势、每支队伍进四强的概率、以及最终的夺冠概率。

接下来我们将要运用离散概率分布中的泊松分布来对本次世界杯进行预测,一共分为四个步骤:

1. 数据采集(用python实现网络爬虫,进行抓取资源);

2. 计算球队进球、失球均值,构建算法模型;

3. 模拟10000次世界杯赛事,进行分析;

4. 统计出线概率、夺冠概率、四强概率;

Python模拟2018世界杯夺冠之路,统计了四强预测以及夺冠率!

 

 数据采集

 

寻找有利资源和所要采集的网站,准备开始数据采集。这次采集以球探网为例:

首先找到32个国家各自的网站链接;然后分别进入32个链接,采集各自的比赛记录数据;

解析网站,构造大体思路,创建网络爬虫实施采集。由于该网站是静态网站,所以就很容易的对网站的采集,在采集的过程中,我们首先找到,每个国家球队的链接,建立国家球队链接和国家球队名,然后进行采集给定国家队页面的所有历史比赛的数据。

在寻找国家链接的时候请注意链接的准确性,球探网每一个球队都有一个独立的链接,比如巴西的id是778,链接地址就为:http://zq.win007.com/cn/team/CTeamSche/778.html,如果对链接的不放心,可以先将链接复制到浏览器中,看是否能够找到网页。

Python模拟2018世界杯夺冠之路,统计了四强预测以及夺冠率!

 

以下为数据采集详细代码:

 

  1 from __future__ importprint_function, division
  2 
  3 from selenium import webdriver
  4 
  5 import pandas as pd
  6 
  7 class Spider(object):
  8 
  9 def __init__(self):
 10 
 11 self.driver = webdriver.Chrome()
 12 
 13 self.driver.implicitly_wait(30)
 14 
 15 self.verificationErrors = []
 16 
 17 self.accept_next_alert = True
 18 
 19 def get_all_team_data(self):
 20 
 21 # 先通过世界杯主页获取所有32只队的ID(构成球队URL)Python学习交流群:125240963,群内每天分享干货,包括最新的python企业案例学习资料和零基础入门教程,欢迎各位小伙伴入群学习交流
22 23 self.get_team_ids() 24 25 # 循环采集每一支队的比赛数据 26 27 data = [] 28 29 for i, [team_id, team_name] inenumerate(self.team_list): 30 31 print(i, team_id, team_name) 32 33 df =self.get_team_data(team_id, team_name) 34 35 data.append(df) 36 37 output = pd.concat(data) 38 39 output.reset_index(drop=True,inplace=True) 40 41 output.to_csv('data_2018WorldCup.csv',index=False, encoding='utf-8') 42 43 self.driver.close() 44 45 def get_team_ids(self): 46 47 main_url ='http://zq.win007.com/cn/CupMatch/75.html' 48 49 self.driver.get(main_url) 50 51 teams=self.driver.find_elements_by_xpath("//td[@style='background-color:#fff;text-align:left;']") 52 53 data = [] 54 55 for team in teams: 56 57 team_id= 58 59 int(team.find_element_by_xpath(".//a").get_attribute('href').split('/')[-1].split('.')[0]) 60 61 team_name =team.find_element_by_xpath(".//a").text 62 63 print(team_id, team_name) 64 65 data.append([team_id,team_name]) 66 67 self.team_list = data 68 69 #self.team_list =pd.DataFrame(data, columns=['team_name', 'team_id']) 70 71 #self.team_list.to_excel('国家队ID.xlsx', index=False) 72 73 def get_team_data(self, team_id,team_name): 74 75 """获取一个国家队的比赛数据。TODO:没有实现翻页Python学习交流群:125240963,群内每天分享干货,包括最新的python企业案例学习资料和零基础入门教程,欢迎各位小伙伴入群学习交流""" 76 77 url ='http://zq.win007.com/cn/team/CTeamSche/%d.html'%team_id 78 79 self.driver.get(url) 80 81 table=self.driver.find_element_by_xpath("//div[@id='Tech_schedule'and@class='data']") 82 83 matches =table.find_elements_by_xpath(".//tr") 84 85 print(len(matches)) 86 87 # 抓取比赛数据,并保存成DataFrame 88 89 data = [] 90 91 for i, match inenumerate(matches): 92 93 if i == 0: 94 95 headers =match.find_elements_by_xpath(".//th") 96 97 h1, h2, h3, h4, h5 =headers[0].text, headers[1].text, headers[2].text, headers[3].text,headers[4].text 98 99 print(h1, h2, h3, h4, h5) 100 101 continue 102 103 try: 104 105 info =match.find_elements_by_xpath(".//td") 106 107 cup =str(info[0].text.encode('utf-8')) 108 109 match_time =str(info[1].text.encode('utf-8')) 110 111 home_team =str(info[2].text.encode('utf-8')) 112 113 fts = info[3].text 114 115 #print('-', cup, '-') 116 117 fs_A,fs_B=int(fts.split('-')[0]),int(fts.split('-')[1]) 118 119 away_team = str(info[4].text.encode('utf-8')) 120 121 print(cup, match_time,home_team, away_team, fs_A, fs_B) 122 123 data.append([cup,match_time, home_team, away_team, fs_A, fs_B, team_name]) 124 125 except: 126 127 break 128 129 df = pd.DataFrame(data, columns=['赛事', '时间', '主队', '客队', '主队进球', '客队进球', '国家队名']) 130 131 return df 132 133 if __name__ == "__main__": 134 135 spider = Spider() 136 137 # 第一步:抓2018世界杯球队的ID。第二部:循环抓取每一支队的比赛数据。 138 139 spider.get_all_team_data()