本文目录导读:

要统计“脚后跟传球成功”的次数,你需要先定义什么是“脚后跟传球成功”,在足球数据分析中,这通常需要事件数据,比如传球事件中包含“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}")
核心思路是:
- 定位传球类型:找到表示“脚后跟”的字段(如
pass_type,technique,body_part)。 - 定位成功标志:找到表示成功的字段(如
outcome,is_success)。 - 同时满足两个条件时计数。
你需要根据自己实际数据的字段名来调整代码中的列名或键名。