Python案例统计脚后跟传球成功几次?

wen python案例 2

本文目录导读:

Python案例统计脚后跟传球成功几次?

  1. 场景假设
  2. 代码实现
  3. 更通用的函数写法(适用于JSON/API数据)
  4. 如果数据来自真实API(如StatsBomb)

要统计“脚后跟传球成功”的次数,你需要先定义什么是“脚后跟传球成功”,在足球数据分析中,这通常需要事件数据,比如传球事件中包含“heel”或“backheel”的标签,并结合“successful”或“completed”的状态。

以下是一个通用的Python案例,演示如何从一个假设的数据集中统计脚后跟传球成功的次数。

场景假设

假设你有一个包含足球比赛事件数据的CSV文件或DataFrame,结构如下:

event_type pass_type body_part outcome player
pass through right_foot success 梅西
pass backheel heel success 内马尔
pass backheel heel fail 姆巴佩
pass backheel heel success 梅西
shot normal left_foot goal 哈兰德

在这个例子中,pass_type == 'backheel'outcome == 'success' 就是一次成功的脚后跟传球。

代码实现

import pandas as pd
# 1. 创建示例数据 (模拟从CSV或API获取的数据)
data = {
    'event_type': ['pass', 'pass', 'pass', 'pass', 'shot'],
    'pass_type': ['through', 'backheel', 'backheel', 'backheel', 'normal'],
    'body_part': ['right_foot', 'heel', 'heel', 'heel', 'left_foot'],
    'outcome': ['success', 'success', 'fail', 'success', 'goal'],
    'player': ['Messi', 'Neymar', 'Mbappe', 'Messi', 'Haaland']
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("-" * 30)
# 2. 筛选出脚后跟传球且成功的事件
heel_passes_success = df[
    (df['pass_type'] == 'backheel') &  # 传球类型是脚后跟
    (df['outcome'] == 'success')        # 传球结果是成功
]
print("筛选出的脚后跟传球成功事件:")
print(heel_passes_success)
print("-" * 30)
# 3. 统计次数
count_success = len(heel_passes_success)  # 或者使用 heel_passes_success.shape[0]
print(f"脚后跟传球成功次数: {count_success}")
# 4. 如果需要按球员统计
print("\n按球员统计脚后跟传球成功次数:")
print(heel_passes_success['player'].value_counts())

输出结果:

原始数据:
  event_type pass_type   body_part  outcome  player
0       pass   through  right_foot  success   Messi
1       pass   backheel        heel  success  Neymar
2       pass   backheel        heel     fail  Mbappe
3       pass   backheel        heel  success   Messi
4       shot    normal   left_foot     goal  Haaland
------------------------------
筛选出的脚后跟传球成功事件:
  event_type pass_type body_part  outcome  player
1       pass   backheel      heel  success  Neymar
3       pass   backheel      heel  success   Messi
------------------------------
脚后跟传球成功次数: 2
按球员统计脚后跟传球成功次数:
Messi     1
Neymar    1
Name: count, dtype: int64

更通用的函数写法(适用于JSON/API数据)

如果你的数据是嵌套的(比如来自StatsBomb或Opta的JSON),可以这样写一个函数:

def count_successful_backheel_passes(events: list[dict]) -> int:
    """
    统计事件列表中成功的脚后跟传球次数
    Args:
        events: 比赛事件列表,每个元素是一个字典
    Returns:
        成功脚后跟传球的次数
    """
    count = 0
    for event in events:
        # 检查是否是传球事件
        if event.get('type') == 'pass':
            # 检查是否是脚后跟传球(通常有pass_type或technique字段)
            pass_type = event.get('pass', {}).get('type', '')
            # 假设字段名为'body_part', 'technique'或'pass_type'
            technique = event.get('technique', '')
            body_part = event.get('body_part', '')
            is_backheel = (
                pass_type == 'backheel' or
                technique == 'backheel' or
                body_part == 'heel'
            )
            if is_backheel:
                outcome = event.get('outcome', '')
                # 假设 success 为 True 或字符串 'success'
                if outcome in ['success', True]:
                    count += 1
    return count
# 示例用法
example_events = [
    {'type': 'pass', 'pass': {'type': 'through'}, 'outcome': 'success'},
    {'type': 'pass', 'technique': 'backheel', 'outcome': 'success'},
    {'type': 'pass', 'body_part': 'heel', 'outcome': 'fail'},
    {'type': 'pass', 'technique': 'backheel', 'outcome': 'success'},
]
print(f"脚后跟传球成功次数: {count_successful_backheel_passes(example_events)}")  # 输出: 2

如果数据来自真实API(如StatsBomb)

StatsBomb的公开数据中,脚后跟传球通常通过 pass_technique 字段判断:

import json
# 假设 loaded 是加载的StatsBomb格式数据
with open('path_to_match_data.json', 'r') as f:
    match_data = json.load(f)
successful_backheel_count = 0
for event in match_data:
    if (event.get('type', {}).get('name') == 'Pass' and
        event.get('pass', {}).get('technique', {}).get('name') == 'Backheel' and
        event.get('pass', {}).get('outcome', {}).get('name') == 'Complete'):  # 或 'Successful'
        successful_backheel_count += 1
print(f"StatsBomb数据中脚后跟传球成功次数: {successful_backheel_count}")

核心思路是:

  1. 定位传球类型:找到表示“脚后跟”的字段(如 pass_type, technique, body_part)。
  2. 定位成功标志:找到表示成功的字段(如 outcome, is_success)。
  3. 同时满足两个条件时计数。

你需要根据自己实际数据的字段名来调整代码中的列名或键名。

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