本文目录导读:

要统计“脚后跟传球成功”的次数,你需要先定义什么是“脚后跟传球成功”,在足球数据分析中,这通常需要事件数据,比如传球事件中包含“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)。 - 同时满足两个条件时计数。
你需要根据自己实际数据的字段名来调整代码中的列名或键名。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播