首页 > 编程语言 >基于python的足球比赛数据及可视化 python 足球预测

基于python的足球比赛数据及可视化 python 足球预测

时间:2024-10-23 16:47:05浏览次数:3  
标签:set python results teams 足球比赛 1930 可视化 team df

那么四年一度的世界杯即将要在卡塔尔开幕了,对于不少热爱足球运动的球迷来说,这可是十分难得的盛宴,而对于最后大力神杯的归属,相信很多人都满怀着期待,每个人心中都有不同的答案。

软件免费下载:

http://lcsjfx.com/SoccerPredictor/DownLoad

今天小编就通过Python数据分析以及机器学习等方式来预测一下谁能获得最后的冠军,当然最后预测出来的结果也仅仅只是作为一种参考,并不代表最后真实的结果。

数据集的准备
这里我们用到的数据集是来自kaggle的公开数据集,其中的一份数据集是2018年俄罗斯世界杯每小组各成员交手的记录,最后小编的预测基于该份数据集的基础之上,另外一份数据集则是从1870年开始到2022年截止,所有参赛球队的历史交手成绩汇总。那么我们首先导入要用到的模块以及导入数据集。

模块和数据集的导入
数据分析和可视化要用到的模块分别是pandas、matplotlib以及seaborn,而机器学习预测要用到的模块是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
1.
2.
3.
4.
5.
6.
7.
接着我们导入数据集

world_cup = pd.read_csv("World_Cup_2018_Dataset.csv")
results = pd.read_csv("results.csv")
1.
2.
我们可以通过head()方法来查看导入数据及的前几行,校验一下数据的导入是否成功,代码如下

world_cup.head()
1.
output

探索性数据分析和特征工程
接下来我们要做的便是探索性数据分析和特征工程了,来对数据集有一个大致的了解,同时生成一些针对最后的预测大有帮助的特征出来,例如我们针对比赛当中的比分来判断比赛是谁胜谁负,或者是平局,代码如下

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()
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
output

紧接着我们针对某个单独的国家,统计历史过往中所有比赛的胜负率情况,例如小编比较喜欢阿根廷队,就筛选出阿根廷队的历史战绩,代码如下

df = results[(results["home_team"] == "Argentina") | (results["away_team"] == "Argentina")]
argen = df.iloc[:]
argen.head()
1.
2.
3.
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()
1.
2.
3.
4.
5.
6.
output

我们将比赛的结果的统计可视化出来,其中我们就能清晰地看到阿根廷球队的胜负率的情况,代码如下

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()
1.
2.
3.
4.
5.
6.
7.
8.
output

俄罗斯世界杯的参赛队伍
我们先将目标锁定在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"]
1.
2.
3.
4.
然后我们筛选出来这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()
1.
2.
3.
4.
5.
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()
1.
2.
3.
4.
5.
6.
output

当然我们在最后进行预测的时候,会有一些无关紧要的特征掺杂其中,我们需要将其去掉,代码如下

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

我们需要将winning_team这一列的标签做一次转换,将赢得比赛的标签改为2,输掉比赛的标签改为0,而平局的标签改为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()
1.
2.
3.
4.
5.
output

紧接着,我们需要对这些离散类型的变量进行独热编码,用到的是pandas模块当中的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()
1.
2.
3.
4.
output

划分出训练集和测试集,调用的是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)
1.
2.
3.
4.
5.
6.
7.
逻辑回归算法
那小编这里调用的是非常简单的逻辑回归的算法,读者朋友后续也可以尝试其他的分类算法进一步的完善一下整个预测的流程与结果,代码如下

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))
1.
2.
3.
4.
5.
6.
7.
预测结果
那么最后便是将我们训练出来的模型去做一个预测了,我们先前的数据集当中有主队和客队之分,但是在世界杯的赛场上没有,这里我们就依据世界排名的先后顺序来划分一下,因此需要导入世界排名的数据集

# 导入新的数据集,各球队的世界排名
ranking = pd.read_csv('datasets/fifa_rankings.csv') 
# 2018年俄罗斯世界杯的对阵情况
fixtures = pd.read_csv('datasets/fixtures.csv')

pred_set = []
1.
2.
3.
4.
5.
6.
在数据集当中插入主队和客队排名的字段,代码如下

# 插入两个新的字段,主队和客队排名的字段
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()
1.
2.
3.
4.
5.
6.
7.
output

根据排名的高低来重新修正参赛球队是作为主队还是客队,代码如下

# 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()
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
output

还是和之前一样的,我们需要对这些离散类型的变量进行编码,这里就不做演示了,我们调用训练好的模型并且进行比赛结果的预测,代码如下

# 小组赛对决的预测 
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("")
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
output

上述预测的结果针对的是2018年俄罗斯世界杯小组赛的对阵情况,那么2022年卡塔尔世界杯小组赛的预测,我们只需要将fixture数据集更新一下即可

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

最后预测出来的结果如下所示


-----------------------------------
基于python的足球比赛数据及可视化 python 足球预测
https://blog.51cto.com/u_16099239/11733866

标签:set,python,results,teams,足球比赛,1930,可视化,team,df
From: https://blog.csdn.net/fbfbpred13362765/article/details/143188696

相关文章

  • 安工PTA自主智能体1-10题python
    7-1jmu-Java&Python-统计一段文字中的单词个数并按单词的字母顺序排序后输出a=input()b=[]whilea!="!!!!!":a=a.split()foriinrange(len(a)):b.append(a[i])a=input()b=list(set(b))b=sorted(b)print(len(b))iflen(b)<......
  • (分享源码)计算机毕业设计必看必学 上万套实战教程手把手教学JAVA、PHP,node.js,C++、pyth
    摘 要大数据时代下,数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求,利用互联网服务于其他行业,促进生产,已经是成为一种势不可挡的趋势。在网络小说的要求下,开发一款整体式结构的小说网站,将复杂的系统进行拆分,能够实现对需求的变化快速响应、系统稳定性的保......
  • 计算机毕业设计项目推荐,基于协同过滤算法的短视频推荐系统设计与实现30213(开题答辩+程
    摘 要现阶段,社会的发展和科技的进步,以及大数据时代下纷繁数据信息的融合,使得人们在生产及生活过程中,都将会接收到各种类型的数据信息,而通过计算机技术与网络技术,则能够将众多人们所不了解或不常用的信息,以简单的模式转化并传递给人们,使得人们的生产及生活质量得以显著提升......
  • 计算机毕业设计项目推荐:基于Web的社区人员管理系统的设计36303(开题答辩+程序定制+全套
    摘要科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中,应用软件的工作规则和开发步骤,采用ASP.NET技术建设社......
  • python 爱心代码
    今天看到一段python爱心代码,后面测试跑跑importrandomfrommathimportsin,cos,pi,logfromtkinterimport*CANVAS_WIDTH=640CANVAS_HEIGHT=480CANVAS_CENTER_X=CANVAS_WIDTH/2CANVAS_CENTER_Y=CANVAS_HEIGHT/2IMAGE_ENLARGE=11设置颜色HEART_COLO......
  • 使用Python ftplib库进行封装FTP自动下载
    fromftplibimportFTPfrombaseapi.loggerimportMyLoggerlogger=MyLogger.get_logger()classFTPUtils:ftp=FTP()ftp.set_pasv(False)def__init__(self,username,password,host,port=21):"""用于FTP站点初始化......
  • Python爬虫:API接口数据的“美食侦探”
    亲爱的代码美食家们,今天咱们不聊那些让人头秃的bug,也不谈那些让人眼花的架构图。咱们来聊聊那些在代码世界里寻找美食的“美食侦探”——Python爬虫。Python爬虫:API接口数据的“美食侦探”想象一下,你在代码的世界里,遇到了一个充满美食的餐厅——一个提供丰富数据的API接口。......
  • 基于Django+Python的宾馆管理系统设计与实现
    项目运行需要先安装Python的相关依赖:pymysql,Django==3.2.8,pillow使用pipinstall安装第一步:创建数据库第二步:执行SQL语句,.sql文件,运行该文件中的SQL语句第三步:修改源代码中的settings.py文件,改成自己的mysql数据库用户名和密码第四步:运行命令:pythonmanage.pyrunser......
  • Python的京东探险记:揭秘商品详情的快速通道
    在一个充满无限可能的数字世界里,Python,这位编程界的多面手,正准备踏上一场刺激的探险之旅:快速获取京东商品的详情数据。这不仅是一次技术的挑战,更是一次与时间赛跑的较量。!Python先生,这位机智的代码探险家,打开了他的笔记本电脑,准备开始这场冒险。他知道,要快速获取京东的商品详情......
  • 22年计挑赛Python组区域赛个人解答
    第一题:代码部分:生产问题A=100;B=150;List=[]a,b,c,d,e,f,g,h,i=map(int,input().split())list=[a,b,c,d,e,f,g,h,i]forminrange(min(g//a,h//b,i//c)+1):n=min((g-m*a)//e,(h-m*b)//f,(i-m*c)//f)w=A*m+B*nList.append(w);List.append(m);......