Python 统计赛季累计数据对比案例
下面我用一个完整的案例来演示如何用 Python 统计和对比球员/球队的赛季累计数据。

完整案例代码
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# ========== 1. 构造模拟数据 ==========
data = {
'球员': ['詹姆斯', '库里', '杜兰特', '字母哥', '东契奇',
'詹姆斯', '库里', '杜兰特', '字母哥', '东契奇'],
'赛季': ['2022-23', '2022-23', '2022-23', '2022-23', '2022-23',
'2023-24', '2023-24', '2023-24', '2023-24', '2023-24'],
'场次': [55, 56, 47, 63, 66, 71, 74, 75, 73, 70],
'得分': [1590, 1645, 1335, 1972, 2138, 1822, 1956, 2032, 2222, 2370],
'助攻': [385, 347, 255, 341, 529, 589, 379, 373, 476, 686],
'篮板': [445, 265, 315, 741, 569, 518, 328, 498, 814, 647]
}
df = pd.DataFrame(data)
# ========== 2. 计算场均数据 ==========
df['场均得分'] = (df['得分'] / df['场次']).round(1)
df['场均助攻'] = (df['助攻'] / df['场次']).round(1)
df['场均篮板'] = (df['篮板'] / df['场次']).round(1)
print("=" * 60)
print("各球员赛季数据明细:")
print(df.to_string(index=False))
# ========== 3. 赛季对比:按球员透视 ==========
pivot_score = df.pivot(index='球员', columns='赛季', values='得分')
pivot_score['增长'] = pivot_score['2023-24'] - pivot_score['2022-23']
pivot_score['增长率%'] = ((pivot_score['增长'] / pivot_score['2022-23']) * 100).round(1)
print("\n" + "=" * 60)
print("赛季累计得分对比:")
print(pivot_score.sort_values('增长', ascending=False))
# ========== 4. 可视化对比 ==========
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# 图1:各球员两个赛季得分对比
players = pivot_score.index.tolist()
x = np.arange(len(players))
width = 0.35
axes[0].bar(x - width/2, pivot_score['2022-23'], width, label='2022-23', color='#4A90E2')
axes[0].bar(x + width/2, pivot_score['2023-24'], width, label='2023-24', color='#E94B3C')
axes[0].set_xticks(x)
axes[0].set_xticklabels(players, rotation=30)
axes[0].set_ylabel('累计得分')
axes[0].set_title('球员赛季累计得分对比')
axes[0].legend()
axes[0].grid(axis='y', alpha=0.3)
# 图2:场均得分对比
pivot_avg = df.pivot(index='球员', columns='赛季', values='场均得分')
pivot_avg.plot(kind='barh', ax=axes[1], color=['#4A90E2', '#E94B3C'])
axes[1].set_title('球员场均得分对比')
axes[1].set_xlabel('场均得分')
axes[1].legend(title='赛季')
plt.tight_layout()
plt.savefig('season_compare.png', dpi=100)
plt.show()
输出结果示例
============================================================
各球员赛季数据明细:
球员 赛季 场次 得分 助攻 篮板 场均得分 场均助攻 场均篮板
詹姆斯 2022-23 55 1590 385 445 28.9 7.0 8.1
...
============================================================
赛季累计得分对比:
赛季 2022-23 2023-24 增长 增长率%
球员
东契奇 2138 2370 232 10.9
...
核心知识点解析
数据对比常用方法
| 方法 | 用途 | 代码 |
|---|---|---|
pivot() |
长表转宽表 | df.pivot(index, columns, values) |
groupby() |
分组聚合 | df.groupby('球员').sum() |
diff() |
差值对比 | df.diff(axis=1) |
pct_change() |
增长率 | df.pct_change(axis=1) |
更优雅的对比写法
# 直接计算所有指标的增长率
metrics = ['得分', '助攻', '篮板']
for m in metrics:
pivot = df.pivot(index='球员', columns='赛季', values=m)
pivot['增长率'] = pivot.pct_change(axis=1).iloc[:, -1].round(3)
print(f"\n【{m}】赛季对比:")
print(pivot)
赛季汇总对比(联赛整体)
# 按赛季汇总整个联赛
season_summary = df.groupby('赛季').agg({
'得分': ['sum', 'mean', 'max'],
'助攻': 'sum',
'篮板': 'sum'
}).round(1)
print(season_summary)
进阶:多赛季趋势对比
如果有多个赛季数据,可以画折线趋势图:
# 假设 df 有 2020-21 到 2023-24 多个赛季
fig, ax = plt.subplots(figsize=(10, 6))
for player in df['球员'].unique():
player_data = df[df['球员'] == player]
ax.plot(player_data['赛季'], player_data['场均得分'],
marker='o', label=player, linewidth=2)
ax.set_xlabel('赛季')
ax.set_ylabel('场均得分')
ax.set_title('球员场均得分赛季趋势')
ax.legend()
ax.grid(alpha=0.3)
plt.show()
实战建议
- 数据源:可从 Basketball-Reference 或 NBA 官方 API 获取真实数据
- 对比维度:累计数据看总量,场均数据看效率,命中率看质量
- 可视化重点:
- 双赛季对比 → 柱状图(分组)
- 多赛季趋势 → 折线图
- 多指标对比 → 雷达图或热力图
需要我针对某个具体场景(如 NBA 真实数据抓取、足球联赛对比、多指标雷达图)再展开吗?