python案例怎么看两队拦截抢断数据?

wen python案例 2

Python 分析两队拦截抢断数据案例

下面给你一个完整的案例,从数据准备 → 处理 → 可视化 → 分析结论,看完就能套用到你自己的数据上。

python案例怎么看两队拦截抢断数据?


准备数据

假设你有一份比赛技术统计 CSV(match_stats.csv),格式如下:

team,interceptions,tackles,possession,passes
曼城,8,15,65,720
利物浦,12,22,35,410

也可以用字典直接构造:

import pandas as pd
data = {
    "team": ["曼城", "利物浦"],
    "interceptions": [8, 12],   # 拦截
    "tackles": [15, 22],        # 抢断
    "possession": [65, 35],     # 控球率
    "passes": [720, 410]        # 传球数
}
df = pd.DataFrame(data)
print(df)

基础对比

直接对比数值

print(df[["team", "interceptions", "tackles"]])

计算"防守总贡献"

df["defense_total"] = df["interceptions"] + df["tackles"]
print(df[["team", "interceptions", "tackles", "defense_total"]])

找出谁更强

# 拦截最多的队
best_inter = df.loc[df["interceptions"].idxmax()]
print(f"拦截最多: {best_inter['team']} ({best_inter['interceptions']}次)")
# 抢断最多的队
best_tackle = df.loc[df["tackles"].idxmax()]
print(f"抢断最多: {best_tackle['team']} ({best_tackle['tackles']}次)")

深入分析:结合控球率看防守含义

关键思路:抢断/拦截多 ≠ 防守就一定强,还要看控球率

  • 控球率低的队,防守次数通常高(被动挨打)
  • 所以要用 "每 90 分钟对手控球时的防守频率" 来标准化
# 假设对手控球率 = 100 - 本方控球率
df["opp_possession"] = 100 - df["possession"]
# 防守强度:每分钟对手控球时的防守次数(简化算法)
df["defense_intensity"] = (df["interceptions"] + df["tackles"]) / df["opp_possession"]
print(df[["team", "possession", "opp_possession", "defense_intensity"]])

可视化对比

柱状图对比

import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]   # 中文显示
plt.rcParams["axes.unicode_minus"] = False
fig, ax = plt.subplots(figsize=(8, 5))
x = range(len(df))
width = 0.35
ax.bar([i - width/2 for i in x], df["interceptions"], width, label="拦截", color="#4C72B0")
ax.bar([i + width/2 for i in x], df["tackles"], width, label="抢断", color="#DD8452")
ax.set_xticks(x)
ax.set_xticklabels(df["team"])
ax.set_ylabel("次数")
ax.set_title("两队拦截 vs 抢断对比")
ax.legend()
plt.tight_layout()
plt.show()

雷达图(多维度对比)

import numpy as np
categories = ["拦截", "抢断", "传球", "控球率"]
N = len(categories)
angles = np.linspace(0, 2 * np.pi, N, endpoint=False).tolist()
angles += angles[:1]   # 闭合
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(polar=True))
for _, row in df.iterrows():
    values = [row["interceptions"], row["tackles"], row["passes"]/10, row["possession"]]
    values += values[:1]
    ax.plot(angles, values, label=row["team"])
    ax.fill(angles, values, alpha=0.15)
ax.set_xticks(angles[:-1])
ax.set_xticklabels(categories)
ax.set_title("球队综合能力雷达图")
ax.legend(loc="upper right")
plt.show()

多场数据(进阶)

如果你是本赛季多场数据,可以这样做:

# 假设 df 是每场比赛一行,含 team、interceptions、tackles
season = pd.read_csv("season_stats.csv")
# 按球队汇总平均
summary = season.groupby("team")[["interceptions", "tackles"]].agg(["mean", "sum"])
print(summary)
# 排序,找出本赛季防守最强的队
summary["avg_defense"] = summary[("interceptions", "mean")] + summary[("tackles", "mean")]
summary = summary.sort_values("avg_defense", ascending=False)
print(summary.head(10))

常见分析结论模板

观察
A 队抢断+拦截多,但控球率低 防守被动,被压着打
A 队抢断+拦截多,控球率也高 高强度逼抢 + 主动出击,攻防兼备
两队数据接近,但传球差很多 一队是"技术流",一队是"绞肉机"
抢断 > 拦截 更多正面对抗;拦截 > 抢断

如果你想拿真实数据

几个免费数据源:

  1. FBref — 网页表格,pandas.read_html(url) 可直接抓
  2. Understat — Python 库 understat 可直接拉
  3. StatsBomb Open Data — GitHub 开源,json 格式
  4. football-data.org — 有免费 API 额度

示例(FBref 抓取):

url = "https://fbref.com/en/comps/9/defense/Premier-League-Stats"
tables = pd.read_html(url)
df = tables[0]
print(df.head())

如果你能告诉我:

  • 数据是什么格式(CSV / Excel / API / 网页)?
  • 单场还是整赛季?
  • 想要什么输出(表格 / 图表 / 分析报告)?

我可以给你写一个直接能跑的完整脚本

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