实用脚本统计伤病停赛影响数据对比?

wen 实用脚本 2

伤病停赛影响数据对比脚本

下面提供一套实用的 Python 脚本,用于统计和对比球队在有伤病/停赛与无伤病/停赛情况下的表现差异,适用于足球、篮球等团队运动的数据分析。

实用脚本统计伤病停赛影响数据对比?


完整脚本

"""
伤病停赛影响数据对比分析
用法:
    python injury_impact.py --data matches.csv --output report.xlsx
数据要求(CSV列名):
    match_id, team, opponent, match_date, is_home,
    goals_for, goals_against, result(win/draw/loss),
    injured_players(缺阵人数), suspended_players(停赛人数),
    key_players_out(核心球员缺阵数)
"""
import pandas as pd
import numpy as np
import argparse
from scipy import stats
def load_data(path):
    df = pd.read_csv(path, parse_dates=["match_date"])
    # 计算总缺阵人数
    df["total_out"] = df["injured_players"].fillna(0) + df["suspended_players"].fillna(0)
    # 是否有缺阵
    df["has_absence"] = df["total_out"] > 0
    # 结果转分数
    result_map = {"win": 3, "draw": 1, "loss": 0}
    df["points"] = df["result"].str.lower().map(result_map)
    df["goal_diff"] = df["goals_for"] - df["goals_against"]
    return df
def compare_groups(df, team=None):
    """对比有/无缺阵两组的关键指标"""
    data = df[df["team"] == team] if team else df
    grouped = data.groupby("has_absence").agg(
        matches=("match_id", "count"),
        avg_points=("points", "mean"),
        avg_goals_for=("goals_for", "mean"),
        avg_goals_against=("goals_against", "mean"),
        avg_goal_diff=("goal_diff", "mean"),
        win_rate=("result", lambda x: (x.str.lower() == "win").mean()),
    ).round(3)
    return grouped
def significance_test(df, metric="points", team=None):
    """独立样本t检验:缺阵 vs 无缺阵"""
    data = df[df["team"] == team] if team else df
    a = data[data["has_absence"]][metric].dropna()
    b = data[~data["has_absence"]][metric].dropna()
    if len(a) < 2 or len(b) < 2:
        return None
    t, p = stats.ttest_ind(a, b, equal_var=False)
    return {"metric": metric, "mean_with_absence": a.mean(),
            "mean_no_absence": b.mean(), "t": t, "p_value": p,
            "significant": p < 0.05}
def absence_level_analysis(df, team=None):
    """按缺阵人数分档分析表现"""
    data = df[df["team"] == team] if team else df
    bins = [-1, 0, 2, 4, 100]
    labels = ["0人", "1-2人", "3-4人", "5人以上"]
    data = data.copy()
    data["absence_level"] = pd.cut(data["total_out"], bins=bins, labels=labels)
    return data.groupby("absence_level", observed=True).agg(
        matches=("match_id", "count"),
        avg_points=("points", "mean"),
        win_rate=("result", lambda x: (x.str.lower() == "win").mean()),
        avg_goal_diff=("goal_diff", "mean"),
    ).round(3)
def key_player_impact(df, team=None):
    """核心球员缺阵影响"""
    data = df[df["team"] == team] if team else df
    data = data.copy()
    data["key_out_flag"] = data["key_players_out"] > 0
    return data.groupby("key_out_flag").agg(
        matches=("match_id", "count"),
        avg_points=("points", "mean"),
        win_rate=("result", lambda x: (x.str.lower() == "win").mean()),
    ).round(3)
def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("--data", required=True, help="比赛数据CSV")
    ap.add_argument("--team", default=None, help="指定球队(可选)")
    ap.add_argument("--output", default="injury_report.xlsx")
    args = ap.parse_args()
    df = load_data(args.data)
    print("=" * 60)
    print("【总体:有/无缺阵指标对比】")
    print(compare_groups(df, args.team))
    print("\n【缺阵人数分档表现】")
    print(absence_level_analysis(df, args.team))
    print("\n【核心球员缺阵影响】")
    print(key_player_impact(df, args.team))
    print("\n【显著性检验】")
    for m in ["points", "goal_diff", "goals_for", "goals_against"]:
        r = significance_test(df, m, args.team)
        if r:
            print(f"{m}: 有缺阵 {r['mean_with_absence']:.2f} vs "
                  f"无缺阵 {r['mean_no_absence']:.2f}, "
                  f"p={r['p_value']:.4f} "
                  f"{'✔显著' if r['significant'] else '✘不显著'}")
    # 导出Excel
    with pd.ExcelWriter(args.output) as w:
        compare_groups(df, args.team).to_excel(w, sheet_name="总体对比")
        absence_level_analysis(df, args.team).to_excel(w, sheet_name="缺阵分档")
        key_player_impact(df, args.team).to_excel(w, sheet_name="核心缺阵")
    print(f"\n报告已导出:{args.output}")
if __name__ == "__main__":
    main()

示例数据(matches.csv)

match_id,team,opponent,match_date,is_home,goals_for,goals_against,result,injured_players,suspended_players,key_players_out
1,猛虎队,飞鹰队,2024-03-01,1,2,1,win,0,0,0
2,猛虎队,雄狮队,2024-03-08,0,0,2,loss,2,1,1
3,猛虎队,蓝鲸队,2024-03-15,1,3,0,win,0,0,0
4,猛虎队,猎豹队,2024-03-22,0,1,1,draw,3,0,2
5,猛虎队,飞鹰队,2024-03-29,1,1,0,win,1,0,0

运行:

python injury_impact.py --data matches.csv --team 猛虎队 --output 猛虎队伤病报告.xlsx

脚本核心功能

分析模块
总体对比 有/无缺阵时的场均积分、进失球、胜率、净胜球
缺阵分档 0人 / 1-2人 / 3-4人 / 5人以上 的分段表现
核心球员影响 核心缺阵 vs 无核心缺阵的差异
显著性检验 独立样本 t 检验,判断差异是否统计显著(p<0.05)

进阶建议

  1. 控制变量:主客场差异大时,可按 is_home 分层后再对比。
  2. 对手强度加权:加入对手排名列,用 opponent_strength 加权平均,避免强队/弱队干扰。
  3. 时间窗口:缺阵后 1-2 场可能有"磨合期",可单独统计复出前后表现。
  4. 可视化:可用 matplotlib 或 seaborn 画箱线图对比分组分布,更直观。

需要我补充主客场分层版本、加权对手强度或可视化图表的代码,可以直接告诉我。

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