python案例怎么看两队的主客场战绩差异?

wen python案例 2

Python 分析两队主客场战绩差异

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

python案例怎么看两队的主客场战绩差异?

数据结构准备

假设我们有比赛记录数据(可来自爬虫、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.org API、soccerdata 库
  • CBA:可爬取虎扑/官方数据
  • 格式统一:把 home_team / away_team / home_score / away_score 四个字段整理成上面的 df 结构,即可直接套用本文函数。

注意事项

  1. 样本量:主场/客场场次少时胜率波动大,建议 ≥10 场再下结论。
  2. 主客场重复性:一队在同一对手主客各打一次时,可做"配对比对"。
  3. 加权近期比赛:用 ewm() 对近期比赛加权,更能反映当前状态:
home.sort_values('date').assign(w=lambda x: x['win'].astype(int)) \
    .set_index('date')['w'].ewm(span=5).mean().iloc[-1]

需要我把它改造成读取你实际 CSV 文件、或加入让分/大小分分析的版本吗?告诉我数据来源和字段,我可以直接给你可运行的脚本。

抱歉,评论功能暂时关闭!