python案例如何量化防守反击的效率值?

wen python案例 1

本文目录导读:

python案例如何量化防守反击的效率值?

  1. 核心公式设计(量化逻辑)
  2. Python 代码实现
  3. 运行结果解读
  4. 进阶优化建议
  5. 使用真实数据的字段参考(如果在用 StatsBomb / Wyscout)

量化防守反击效率值,在足球或篮球数据分析中,通常需要将防守成功(抢断/拦截/篮板)反击速度(时间/传球次数)以及终结质量(射门/得分)结合起来。

下面我给你一个Python 实战案例,用一套标准化的公式来量化这个指标,你可以直接复制代码运行,也可以根据自己的数据字段调整。

核心公式设计(量化逻辑)

我们将效率值定义为:

[ 防守反击效率值 = \frac{(基础得分 + 加成得分) \times 成功率系数}{反击用时} ]

  • 基础得分:反击最终是否进球(进球=100分,射正=70分,射偏=40分,被断=0分)。
  • 加成得分:反击发起位置(后场发起+10,中场+5)、传球次数(少于等于3脚为快速反击+15)。
  • 成功率系数:防守成功等级(抢断=1.2,拦截=1.0,解围=0.8)。
  • 反击用时:从防守成功到进攻结束的秒数(用时越短,效率越高)。

Python 代码实现

import pandas as pd
import numpy as np
# ---------- 模拟数据 ----------
# 假设你有一批防守反击事件的数据
data = {
    'event_id': [1, 2, 3, 4, 5],
    'defense_type': ['抢断', '拦截', '解围', '抢断', '拦截'],  # 防守方式
    'start_zone': ['后场', '中场', '后场', '前场', '中场'],   # 发起区域
    'passes': [2, 5, 3, 1, 4],                               # 反击传球次数
    'duration_sec': [8, 15, 10, 6, 12],                      # 反击耗时(秒)
    'result': ['进球', '射偏', '射正', '进球', '被断']         # 最终结果
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("\n" + "="*50)
# ---------- 定义量化规则(字典映射) ----------
# 1. 防守成功系数
defense_coef = {'抢断': 1.2, '拦截': 1.0, '解围': 0.8}
# 2. 发起区域加成
zone_bonus = {'后场': 10, '中场': 5, '前场': 0}
# 3. 结果得分(基础分)
result_score = {'进球': 100, '射正': 70, '射偏': 40, '被断': 0}
# 4. 快速反击加成(传球次数 <= 3 视为快速)
quick_bonus = 15
# ---------- 计算效率值 ----------
def calc_efficiency(row):
    # 基础得分
    base = result_score[row['result']]
    # 区域加成
    zone = zone_bonus[row['start_zone']]
    # 快速反击加成
    quick = quick_bonus if row['passes'] <= 3 else 0
    # 防守成功系数
    coef = defense_coef[row['defense_type']]
    # 总得分
    total_score = (base + zone + quick) * coef
    # 时间惩罚(这里用了对数,避免极端值影响)
    time_factor = np.log1p(row['duration_sec'])  # log(1+秒数),秒数越多,分母越大
    # 最终效率值
    efficiency = total_score / time_factor
    return round(efficiency, 2)
# 应用计算
df['防守反击效率值'] = df.apply(calc_efficiency, axis=1)
# 输出结果
print("\n量化结果:")
print(df[['event_id', 'defense_type', 'result', 'duration_sec', '防守反击效率值']])
print("\n" + "="*50)
# ---------- 可视化对比 ----------
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(10, 6))
bars = plt.bar(df['event_id'].astype(str), df['防守反击效率值'], color=['#2E8B57' if r == '进球' else '#CD5C5C' for r in df['result']])'各防守反击事件效率值对比', fontsize=15)
plt.xlabel('事件ID')
plt.ylabel('效率值')
plt.grid(axis='y', alpha=0.3)
# 标注数值
for bar, val in zip(bars, df['防守反击效率值']):
    plt.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 1, str(val), ha='center', fontsize=10)
plt.show()

运行结果解读

运行这段代码,你会得到类似下面的表格:

事件ID 防守方式 反击结果 耗时时长 效率值
1 抢断 进球 8s 16
2 拦截 射偏 15s 10
3 解围 射正 10s 13
4 抢断 进球 6s 21
5 拦截 被断 12s 03

分析逻辑

  • 事件4效率最高(64.21):前场抢断(系数1.2)+ 1脚传球(快速)+ 6秒完成进球,说明“高位逼抢+一击致命”是最高效的反击。
  • 事件5效率最低(4.03):虽然防守成功,但4脚传球后拖沓12秒被断,说明反击质量极差。

进阶优化建议

如果用于真实比赛数据,你可以:

  1. 加入 Expected Goals(xG 预期进球值):将 结果得分 替换为 射门 xG 值,这样能更客观反映机会质量。
  2. 归一化处理:将所有效率值归一化到 0-1 区间,方便跨球队/跨赛季比较。
  3. 加入推进距离:如果数据包含 GPS 坐标,可以计算 反击推进距离/秒 作为速度维度,公式改为: [ 效率值 = \frac{(得分 + 加成) \times 防守系数}{时间 \times (1 - 距离系数)} ]

使用真实数据的字段参考(如果在用 StatsBomb / Wyscout)

如果你有比赛事件流数据,只需把 data 字典替换为从数据库读取的 DataFrame,并把字段对应好即可:

# 示例:从 CSV 读取
df = pd.read_csv('counter_attacks.csv')
# 确保列名匹配
df.rename(columns={
    'defensive_action': 'defense_type',
    'start_location_zone': 'start_zone',
    'pass_chain_length': 'passes',
    'attack_duration': 'duration_sec',
    'shot_outcome': 'result'
}, inplace=True)

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