# 计算机与人工智能学院 计算机2203班 张俊鑫
# 0122210870531
# 完成日期2023-11-16
from PIL import Image
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from wordcloud import WordCloud
from sklearn import linear_model
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.preprocessing import PolynomialFeatures
import warnings
warnings.filterwarnings('ignore')
file_name = './data/result.csv'
# seaborn 绘图初始化
def sns_init():
sns.set(style='darkgrid') # 设置背景
sns.set(font='SimHei') # 设置字体,以正确显示中文
# 数据的读取以及数据的预览
def read_and_review(file_name):
data = pd.read_csv(file_name, delimiter=',',encoding='gbk') # 利用read_csv函数读取数据
print(data.head()) #预览
print(data.isnull().sum(), '\n') # 查看是否有空缺值
print(data.shape) # 打印列表的形状
print(data.dtypes) # 检查数据的数据类型是否正确
return data
# 数据处理-解决各个赛季球星名字翻译出现更迭的问题
# 由于球星翻译更迭属少数个例,直接针对特定属性修改
# 例如:对于多次入选射手榜的B席,还有赛季翻译为全称贝尔纳多席尔瓦,在此以该球员其他属性为索引统一改为B席
# 经观察:出现该情况的球员有:孙兴慜,B席,B费
def data_update(data):
data.loc[(data['队伍名称']=='热刺')&(data['位置']=='前锋')&(data['国家']=='韩国')&(data['球衣号']=='7号'),['球员姓名']]='孙兴慜'
data.loc[(data['队伍名称'] == '曼城') & (data['位置'] == '中场') & (data['国家'] == '葡萄牙')&(data['球衣号']=='20号'), ['球员姓名']] = 'B席'
data.loc[(data['队伍名称'] == '曼联') & (data['位置'] == '中场') & (data['国家'] == '葡萄牙')&(data['球衣号']=='8号'), ['球员姓名']] = 'B费'
return data
# 绘制2018-2022五个已结束赛季球员进球数散点图
def draw_picture1(data):
data=data.loc[data['年份'] < 2023]
sns_init()
plt.figure(figsize=(9, 5)) # 设置图形大小
sns.catplot(x="年份",y="总进球数",data=data)
plt.title("2018-2022球员进球散点图")
plt.savefig('img/picture1.png')
plt.show()
# 绘制2018-2022五个已结束赛季球员进球数箱型图
def draw_picture2(data):
data = data.loc[data['年份'] < 2023]
sns_init()
plt.figure(figsize=(9, 5)) # 设置图形大小
sns.catplot(x="年份", y="总进球数", kind="box", data=data)
plt.title("2018-2022球员进球箱型图图")
plt.savefig('img/picture2.png')
plt.show()
# 获取关于俱乐部进球的关系二维列表
def data_temp(data):
dict1 = dict() # 定义俱乐部与进球数字典
for i in range(1,len(data)-50):
dict1[data[i][1]] = 0
for i in range(1, len(data) - 50):
dict1[data[i][1]] += int(data[i][3])
list1 = []
for i in dict1:
list2 = []
list2.append(i)
list2.append(dict1[i])
list1.append(list2)
return list1
# 绘制2018-2022五个已结束赛季各俱乐部总进球柱形图
def draw_picture3(data):
sns_init()
plt.figure(figsize=(8, 4)) # 设置图形大小
sns.barplot(x='俱乐部', y='总进球数', data=data,palette='hls')
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.title('2018-2022五个赛季各俱乐部总进球柱形图')
plt.xlabel('俱乐部')
plt.ylabel('总进球数')
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.savefig("img/picture3.png")
plt.show()
# 绘制2018-2022五个已结束赛季各俱乐部总进球饼图
def draw_picture4(data,program):
sns_init()
plt.figure(figsize=(8, 8))
sum_ = data['总进球数'].sum()
plt.axes(aspect=1)
prog_name = []
for i in range(len(data)):
prog_name.append(data.iloc[i,0])
rank = []
for i in range(len(data)):
rank.append(float((data.iloc[i,1]/sum_)*100))
exp = [0] * len(prog_name)
num = prog_name.index(program)
exp[num] = 0.1
plt.pie(rank, explode=exp, labels=prog_name, labeldistance=1.1,
autopct='%2.1f%%', shadow=True, startangle=90,
pctdistance=0.8)
plt.legend(loc='lower right', bbox_to_anchor=(1.3, 0))
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.title('2018-2022五个赛季各俱乐部总进球柱形图')
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.savefig("img/picture4.png")
plt.show()
# 获取各国家入选2018-2022每年射手榜前50的人数,分析各国家足球实力
def data_temp2(data):
dict1 = dict() # 定义俱乐部与进球数字典
for i in range(1, len(data) - 50):
dict1[data[i][7]] = 0
for i in range(1, len(data) - 50):
dict1[data[i][7]] += 1
list1 = []
for i in dict1:
list2 = []
list2.append(i)
list2.append(dict1[i])
list1.append(list2)
return list1
# 选取国家及其入选射手榜人次绘制柱形图
def draw_picture5(data):
sns_init()
plt.figure(figsize=(10, 4))
sns.barplot(x='国家', y='入选射手榜人次', data=data,palette='hls')
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.title('2018-2022五个赛季各国家入选英超射手榜人次柱形图')
plt.xlabel('国家')
plt.ylabel('入选射手榜人次')
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.savefig("img/picture5.png")
plt.show()
# 选取人数排名前10的国家绘制饼图
def draw_picture6(data,nation):
data = data.iloc[0:10,:]
sns_init()
plt.figure(figsize=(8, 8))
sum_ = data['入选射手榜人次'].sum()
plt.axes(aspect=1)
prog_name = []
for i in range(len(data)):
prog_name.append(data.iloc[i, 0])
rank = [] # 百分比的列表
for i in range(len(data)):
rank.append(float((data.iloc[i, 1] / sum_) * 100))
exp = [0] * len(prog_name)
num = prog_name.index(nation)
exp[num] = 0.1 # 数据突出显示
plt.pie(rank, explode=exp, labels=prog_name, labeldistance=1.1,
autopct='%2.1f%%', shadow=True, startangle=90,
pctdistance=0.8)
plt.legend(loc='lower right', bbox_to_anchor=(1.3, 0))
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.title('2018-2022五个赛季入选射手榜人次前十国家柱形图')
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.savefig("img/picture6.png")
plt.show()
# 获取2018-2022五赛季均入选射手榜的英超球员信息
# 获取球员入选次数二维列表
def data_temp3(data):
dict1 = dict() # 定义俱乐部与进球数字典
for i in range(1, len(data) - 50):
dict1[data[i][2]] = 0
for i in range(1, len(data) - 50):
dict1[data[i][2]] += 1
list1 = []
for i in dict1:
list2 = []
list2.append(i)
list2.append(dict1[i])
list1.append(list2)
return list1
# 获取五个赛季均入选的球员名单列表
def get_list(list_temp):
list2 = []
for i in list_temp:
if(i[1]==5):
list2.append(i[0])
return list2
# 绘制这些球员进球数折线图
def draw_picture7(data,list_temp):
data = data.loc[data['年份'] < 2023]
sns_init()
list3 = []
for i in list_temp:
df_temp = data.loc[data['球员姓名']==i]
# print(df_temp)
list3.append(df_temp)
plt.figure(figsize=(8, 4)) # 设置图形大小
for i in list3:
sns.lineplot(x='年份', y='总进球数', data=i, label=i['球员姓名'].iloc[0], marker='o') # 绘制第一个连载中的折线
plt.rcParams['font.sans-serif'] = [