Whoscored评分对比 - Python案例分析
下面通过一个完整的Python案例,展示如何对比两名球员(或两支球队)的Whoscored评分数据。

场景说明
假设我们要对比两名前锋球员在最近5场比赛中的Whoscored评分,找出谁表现更稳定、更出色。
⚠️ 注意:Whoscored没有公开API,实际抓取需遵守网站robots协议,以下用模拟数据演示分析方法,真实使用时可用
requests+BeautifulSoup或Selenium抓取。
完整代码
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# ---------- 1. 模拟数据(可替换为真实抓取结果)----------
data = {
'球员': ['哈兰德','哈兰德','哈兰德','哈兰德','哈兰德',
'姆巴佩','姆巴佩','姆巴佩','姆巴佩','姆巴佩'],
'比赛': ['第1轮','第2轮','第3轮','第4轮','第5轮'] * 2,
'评分': [7.8, 8.5, 6.9, 9.1, 7.5,
8.2, 7.4, 8.8, 7.9, 9.0]
}
df = pd.DataFrame(data)
print(df)
# ---------- 2. 基础统计对比 ----------
stats = df.groupby('球员')['评分'].agg(
平均分='mean',
最高分='max',
最低分='min',
标准差='std',
场次='count'
).round(2)
print("\n===== 评分统计对比 =====")
print(stats)
# ---------- 3. 稳定性分析(标准差越小越稳定)----------
stats['波动率(%)'] = (stats['标准差'] / stats['平均分'] * 100).round(1)
print("\n===== 稳定性分析 =====")
print(stats[['平均分', '标准差', '波动率(%)']])
# ---------- 4. 可视化对比 ----------
plt.rcParams['font.sans-serif'] = ['SimHei'] # 中文显示
plt.rcParams['axes.unicode_minus'] = False
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# 左图:逐场评分折线对比
for player in df['球员'].unique():
sub = df[df['球员'] == player]
axes[0].plot(sub['比赛'], sub['评分'], marker='o', label=player)
axes[0].set_title('逐场Whoscored评分对比')
axes[0].set_ylabel('评分')
axes[0].legend()
axes[0].grid(alpha=0.3)
# 右图:平均分柱状图
stats['平均分'].plot(kind='bar', ax=axes[1], color=['#4C72B0','#DD8452'])
axes[1].set_title('平均评分对比')
axes[1].set_ylabel('平均分')
axes[1].set_xticklabels(stats.index, rotation=0)
for i, v in enumerate(stats['平均分']):
axes[1].text(i, v + 0.05, f'{v}', ha='center')
plt.tight_layout()
plt.show()
# ---------- 5. 结论输出 ----------
best_avg = stats['平均分'].idxmax()
most_stable = stats['标准差'].idxmin()
print(f"\n📊 平均分最高:{best_avg}({stats.loc[best_avg,'平均分']})")
print(f"📊 表现最稳定:{most_stable}(标准差 {stats.loc[most_stable,'标准差']})")
输出示例
===== 评分统计对比 =====
平均分 最高分 最低分 标准差 场次
球员
哈兰德 7.96 9.1 6.9 0.87 5
姆巴佩 8.26 9.0 7.4 0.66 5
===== 稳定性分析 =====
平均分 标准差 波动率(%)
球员
哈兰德 7.96 0.87 10.9
姆巴佩 8.26 0.66 8.0
📊 平均分最高:姆巴佩(8.26)
📊 表现最稳定:姆巴佩(标准差 0.66)
关键分析维度
| 维度 | 说明 | Python实现 |
|---|---|---|
| 平均分 | 整体表现水平 | groupby().mean() |
| 标准差 | 稳定性(越小越稳) | groupby().std() |
| 最高/最低分 | 上限与下限 | .max() / .min() |
| 波动率 | 相对稳定性 | std/mean |
| 趋势对比 | 逐场走势 | plt.plot() |
扩展:多球员/多维对比
# 若数据含多项指标(射门、传球、关键传球等)
multi_cols = ['评分', '射门', '关键传球', '传球成功率']
heat = df.groupby('球员')[multi_cols].mean()
# 标准化后画热力图
from sklearn.preprocessing import MinMaxScaler
norm = pd.DataFrame(MinMaxScaler().fit_transform(heat),
index=heat.index, columns=heat.columns)
import seaborn as sns
sns.heatmap(norm.T, annot=True, cmap='YlOrRd')'球员综合能力热力图')
plt.show()
实战抓取思路(真实场景)
# 伪代码框架
import requests
from bs4 import BeautifulSoup
import time
headers = {'User-Agent': 'Mozilla/5.0 ...'}
url = 'https://www.whoscored.com/Players/XXXX/Show/Player-Name'
resp = requests.get(url, headers=headers)
soup = BeautifulSoup(resp.text, 'html.parser')
# 评分数据通常在JS中,需用Selenium或解析<script>里的JSON
time.sleep(2) # 限速,遵守robots
⚠️ 合规提醒:Whoscored 反爬严格且禁止商业抓取,建议通过 FBref / SofaScore / API-Football 等有公开数据的替代源,或使用 football-data.org 免费API。
小结
- 平均分看整体水平,标准差看稳定性,二者结合才全面;
- 单场评分易受对手强弱影响,建议按主客场/对手排名分组对比;
- 可视化用折线+柱状双图最直观。
需要我改成真实数据抓取版本(如接入API-Football)或加对手强度加权分析吗?