实用脚本统计头球争顶成功率如何?

wen 实用脚本 2

本文目录导读:

实用脚本统计头球争顶成功率如何?

  1. 核心定义
  2. Python 统计脚本
  3. 进阶:按区域/场景细分
  4. 数据源建议
  5. 注意事项

统计头球争顶成功率,需要先明确几个关键定义,因为不同数据商的口径差异很大。

核心定义

头球争顶成功率 = 争顶成功次数 ÷ 争顶总次数 × 100%

关键分歧点:

口径 说明
争顶总次数 是否包含"未接触球"的空中对抗?
争顶成功 是把球顶给队友,还是仅仅"先碰到球"?
场景范围 是否只统计有对抗的争顶,还是包含无对抗头球?

主流数据商(Opta、Wyscout、StatsBomb)通常采用:有身体接触的空中对抗中,先触球且球权归属有利的一方为成功。


Python 统计脚本

假设你有一份事件数据(JSON/CSV),字段包含 player、duel_type、outcome:

import pandas as pd
def aerial_duel_success(df, player_col='player', 
                        type_col='duel_type', 
                        outcome_col='outcome',
                        aerial_keyword='Aerial'):
    """
    统计球员头球争顶成功率
    df: 事件数据,每行一次争顶
    outcome: 'won' / 'lost' / 'neutral'
    """
    # 1. 筛选头球争顶事件
    aerial = df[df[type_col].str.contains(aerial_keyword, case=False, na=False)].copy()
    # 2. 排除中立结果(可选)
    aerial = aerial[aerial[outcome_col].isin(['won', 'lost'])]
    # 3. 分组统计
    stats = aerial.groupby(player_col)[outcome_col].agg(
        total='count',
        won=lambda x: (x == 'won').sum()
    )
    stats['success_rate'] = (stats['won'] / stats['total'] * 100).round(1)
    return stats.sort_values('success_rate', ascending=False)
# 使用示例
# df = pd.read_csv('events.csv')
# result = aerial_duel_success(df)
# print(result)

输出示例:

              total  won  success_rate
Van Dijk         45   34          75.6
Haaland          38   22          57.9
...

进阶:按区域/场景细分

def aerial_by_zone(df, zone_col='pitch_zone'):
    """按场地区域统计争顶成功率"""
    aerial = df[df['duel_type'].str.contains('Aerial', na=False)]
    pivot = aerial.pivot_table(
        index='player',
        columns=zone_col,
        values='outcome',
        aggfunc=lambda x: (x=='won').mean()*100
    ).round(1)
    return pivot

常见分区:防守三区 / 中场三区 / 进攻三区,或按"本方禁区 / 中场 / 对方禁区"。


数据源建议

数据源 特点
FBref 免费,有"Aerial duels won %"直接字段
Understat 免费,但头球数据较粗
StatsBomb Open Data 免费,事件级,可自定义口径
Wyscout 付费,分类最细
Opta/SofaScore API 付费/半开放

FBref 抓取示例:

import pandas as pd
url = "https://fbref.com/en/comps/9/Premier-League-Stats"
# 用 pandas.read_html 抓取,注意加 headers 避免被拒
tables = pd.read_html(url)
# 通常第 N 张表包含 "Aerials Won" 列

注意事项

  1. 位置偏差:中后卫和门将争顶次数远高于边锋,直接比较成功率不公平,建议分位置对比。
  2. 样本量:少于 20 次争顶的成功率波动极大,应加最小样本过滤。
  3. 对手强度:可加权对手平均身高/争顶能力。
  4. "成功"定义:把球顶出边线算成功还是失败?不同数据商不同,跨源比较要谨慎。

如果你能告诉我:数据格式(JSON/CSV/API)、数据源、具体字段名,我可以写出直接可跑的完整脚本。

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