python案例统计低位防守解围次数多少?

wen python案例 3

Python 案例:统计低位防守解围次数

下面我用足球比赛数据统计为例,演示如何统计低位防守(Deep Defense)中的解围(Clearance)次数。

python案例统计低位防守解围次数多少?

场景说明

  • 低位防守:球队退防到本方半场(防守三区 = 球场后 1/3 区域)
  • 解围:防守球员把球大脚踢出危险区域的动作
  • 目标:统计球员在低位防守时的解围次数

完整代码

import pandas as pd
# ========== 1. 模拟比赛事件数据 ==========
data = {
    "player":     ["张三", "李四", "王五", "赵六", "张三", "李四", "王五", "赵六", "张三", "王五"],
    "action":     ["解围", "解围", "解围", "解围", "拦截", "解围", "解围", "犯规", "解围", "解围"],
    # 事件发生的 x 坐标(0~100,0=本方球门,100=对方球门)
    "x":          [15, 25, 30, 10, 20, 18, 28, 40, 12, 22],
    # 事件发生的 y 坐标(0~100)
    "y":          [50, 30, 60, 45, 55, 35, 65, 50, 40, 55],
}
df = pd.DataFrame(data)
# ========== 2. 定义低位防守区域 ==========
# 本方半场后 1/3:x < 33.3(防守三区)
LOW_DEFENSE_THRESHOLD = 100 / 3  # ≈ 33.33
# ========== 3. 筛选低位防守的解围 ==========
low_defense_clearance = df[
    (df["action"] == "解围") & 
    (df["x"] < LOW_DEFENSE_THRESHOLD)
]
# ========== 4. 按球员统计次数 ==========
count_by_player = (
    low_defense_clearance
    .groupby("player")
    .size()
    .reset_index(name="低位解围次数")
    .sort_values("低位解围次数", ascending=False)
)
# ========== 5. 输出结果 ==========
print("=== 低位防守解围明细 ===")
print(low_defense_clearance[["player", "x", "y"]])
print("\n=== 各球员低位防守解围次数 ===")
print(count_by_player)
print(f"\n总次数:{len(low_defense_clearance)}")

运行结果

=== 低位防守解围明细 ===
  player   x   y
0    张三  15  50
1    李四  25  30
2    王五  30  60
3    赵六  10  45
5    李四  18  35
6    王五  28  65
8    张三  12  40
9    王五  22  55
=== 各球员低位防守解围次数 ===
  player  低位解围次数
    王五        3
    张三        2
    李四        2
    赵六        1
总次数:8

关键点解析

步骤 说明
定义区域 用 x < 33.3 判断是否在低位防守区域(防守三区)
双条件筛选 同时满足 action == "解围"x < 阈值
groupby 统计 按球员分组用 .size() 计数
排序 按次数降序,找出解围最多的球员

进阶:按比赛/球队统计

如果是多场比赛数据,可以这样聚合:

# 假设 df 中有 match_id 和 team 列
result = (
    df[df["action"] == "解围"]
    .query("x < @LOW_DEFENSE_THRESHOLD")
    .groupby(["match_id", "team", "player"])
    .size()
    .reset_index(name="低位解围次数")
)

可视化(可选)

import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]  # 显示中文
plt.bar(count_by_player["player"], count_by_player["低位解围次数"])
plt.xlabel("球员")
plt.ylabel("低位防守解围次数")"各球员低位防守解围统计")
plt.show()

核心公式

低位防守解围 = action == "解围" AND x < 球场长度 / 3

你可以把 x 阈值换成自定义的防守区域(x < 40 表示更宽的防守范围),适配不同战术定义,需要我根据真实数据(如 StatsBomb、Opta 格式)改写吗?

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