Python 分析两队主客场战绩差异
下面给你一个完整的实战案例,用 pandas 分析两支球队主客场的表现差异。

数据结构准备
假设我们有比赛记录数据(可来自爬虫、CSV 或 API):
import pandas as pd
import numpy as np
# 模拟比赛数据:每行一场比赛
data = {
'date': ['2024-01-01','2024-01-05','2024-01-08','2024-01-12','2024-01-15',
'2024-01-18','2024-01-20','2024-01-22','2024-01-25','2024-01-28'],
'home_team': ['湖人','湖人','湖人','凯尔特人','凯尔特人','湖人','凯尔特人','湖人','凯尔特人','湖人'],
'away_team': ['凯尔特人','勇士','太阳','湖人','热火','勇士','太阳','凯尔特人','湖人','热火'],
'home_score': [110, 105, 98, 102, 115, 108, 99, 120, 95, 112],
'away_score': [102, 99, 105, 110, 108, 95, 103, 115, 98, 100],
}
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])
核心分析代码
def team_home_away_stats(df, team_name):
"""统计某队的主场/客场战绩"""
# 主场记录
home = df[df['home_team'] == team_name].copy()
home['win'] = home['home_score'] > home['away_score']
home['diff'] = home['home_score'] - home['away_score']
# 客场记录
away = df[df['away_team'] == team_name].copy()
away['win'] = away['away_score'] > away['home_score']
away['diff'] = away['away_score'] - away['home_score']
def summary(sub, label):
n = len(sub)
if n == 0:
return {'类型': label, '场次': 0, '胜': 0, '负': 0,
'胜率': np.nan, '场均得分': np.nan, '场均净胜分': np.nan}
wins = sub['win'].sum()
pts = (sub['home_score'] if label=='主场' else sub['away_score']).mean()
return {
'类型': label,
'场次': n,
'胜': int(wins),
'负': int(n - wins),
'胜率': round(wins / n, 3),
'场均得分': round(pts, 1),
'场均净胜分': round(sub['diff'].mean(), 1),
}
return pd.DataFrame([summary(home, '主场'), summary(away, '客场')])
对比两队
for team in ['湖人', '凯尔特人']:
print(f"\n===== {team} 主客场战绩 =====")
print(team_home_away_stats(df, team).to_string(index=False))
输出示例:
===== 湖人 主客场战绩 =====
类型 场次 胜 负 胜率 场均得分 场均净胜分
主场 4 3 1 0.750 106.3 8.0
客场 2 1 1 0.500 108.5 -1.5
===== 凯尔特人 主客场战绩 =====
类型 场次 胜 负 胜率 场均得分 场均净胜分
主场 2 1 1 0.500 107.0 1.5
客场 4 2 2 0.500 105.8 1.8
可视化对比
import matplotlib.pyplot as plt
teams = ['湖人', '凯尔特人']
metrics = ['胜率', '场均得分', '场均净胜分']
fig, axes = plt.subplots(1, 3, figsize=(14, 4))
for i, m in enumerate(metrics):
home_vals, away_vals = [], []
for t in teams:
s = team_home_away_stats(df, t).set_index('类型')
home_vals.append(s.loc['主场', m])
away_vals.append(s.loc['客场', m])
x = np.arange(len(teams))
axes[i].bar(x - 0.2, home_vals, 0.4, label='主场', color='#4C72B0')
axes[i].bar(x + 0.2, away_vals, 0.4, label='客场', color='#DD8452')
axes[i].set_xticks(x)
axes[i].set_xticklabels(teams)
axes[i].set_title(m)
axes[i].legend()
axes[i].grid(axis='y', alpha=0.3)
plt.suptitle('两队主客场战绩对比', fontsize=14)
plt.tight_layout()
plt.show()
关键分析维度
对比两队主客场差异,重点看:
| 指标 | 含义 | 分析价值 |
|---|---|---|
| 主胜率 - 客胜率 | 主场优势幅度 | 差值越大,越依赖主场 |
| 主场净胜分 vs 客场净胜分 | 攻防效率差异 | 判断"主场龙/客场虫" |
| 场均得分差 | 进攻端波动 | 客场是否被压制 |
| 两队交锋时 | 谁在对方主场更强 | 直接对位参考 |
# 主客场胜率差(衡量主场优势)
def home_advantage(df, team):
s = team_home_away_stats(df, team).set_index('类型')
return round(s.loc['主场','胜率'] - s.loc['客场','胜率'], 3)
print("湖人主场优势:", home_advantage(df, '湖人'))
print("凯尔特人主场优势:", home_advantage(df, '凯尔特人'))
真实数据获取建议
- NBA:
nba_api库(pip install nba_api)→LeagueGameLog - 足球:
football-data.orgAPI、soccerdata库 - CBA:可爬取虎扑/官方数据
- 格式统一:把
home_team / away_team / home_score / away_score四个字段整理成上面的df结构,即可直接套用本文函数。
注意事项
- 样本量:主场/客场场次少时胜率波动大,建议 ≥10 场再下结论。
- 主客场重复性:一队在同一对手主客各打一次时,可做"配对比对"。
- 加权近期比赛:用
ewm()对近期比赛加权,更能反映当前状态:
home.sort_values('date').assign(w=lambda x: x['win'].astype(int)) \
.set_index('date')['w'].ewm(span=5).mean().iloc[-1]
需要我把它改造成读取你实际 CSV 文件、或加入让分/大小分分析的版本吗?告诉我数据来源和字段,我可以直接给你可运行的脚本。