数据来源于下面两个网站,Understat和Fbref。
链接:https://understat.com/
链接:https://fbref.com/en/
欧洲足球五大联赛,英超、意甲、西甲、德甲、法甲。
先看一下射门数据的可视化,本质上和篮球的出手点图差不多,都是散点图类型。
导入相关的Python库。
import requests
from bs4 import BeautifulSoup as soup
import json
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
从Understat网站爬取射门数据,使用BeautifulSoup、JSON和pandas解析和处理数据。
# 请求数据, C罗的ID为2371
url = 'https://understat.com/player/2371'
html = requests.get(url)
# 解析处理数据
parse_soup = soup(html.content, 'lxml')
scripts = parse_soup.find_all('script')
strings = scripts[3].string
ind_start = strings.index("('")+2
ind_end = strings.index("')")
json_data = strings[ind_start:ind_end]
json_data = json_data.encode('utf8').decode('unicode_escape')
data = json.loads(json_data)
print(data)
# 处理数据, 包含射门位置、预期进球、射门结果、赛季
x = []
y = []
xg = []
result = []
season = []
for i, _ in enumerate(data):
for key in data[i]:
if key == 'X':
x.append(data[i][key])
if key == 'Y':
y.append(data[i][key])
if key == 'xG':
xg.append(data[i][key])
if key == 'result':
result.append(data[i][key])
if key == 'season':
season.append(data[i][key])
columns = ['X', 'Y', 'xG', 'Result', 'Season']
df_understat = pd.DataFrame([x, y, xg, result, season], index=columns)
df_understat = df_understat.T
df_understat = df_understat.apply(pd.to_numeric, errors='ignore')
# 得到最终的结果
print(df_understat)
此处的ID,通过查询球员名字可知
查询中国球员武磊,点击访问,在地址栏处,可以看到球员ID。
得到数据如下。
包含射门位置(x、y)、xG(预期进球)、射门结果、赛季。
其中x、y的坐标值为0~1之间,不适合在Matplotlib显示,所以选择放大100倍。
df_understat['X'] = df_understat['X'].apply(lambda x: x*100)
df_understat['Y'] = df_understat['Y'].apply(lambda x: x*100)
print(df_understat)
得到结果如下。