足球任意球直接得分统计脚本
下面是一个实用的Python脚本,用于统计足球比赛中任意球直接得分的次数。

基于Opta风格事件数据的统计脚本
import pandas as pd
def count_direct_free_kick_goals(events_df, team=None, player=None):
"""
统计任意球直接得分次数
参数:
events_df: 事件数据DataFrame, 需包含列:
- match_id: 比赛ID
- team: 球队
- player: 球员
- event_type: 事件类型 (如 'Free Kick', 'Goal')
- sub_type: 子类型 (如 'Direct', 'Shot')
- outcome: 结果 (如 'Goal', 'Saved', 'Off Target')
- minute: 分钟
team: 筛选球队 (可选)
player: 筛选球员 (可选)
返回:
统计结果 DataFrame
"""
df = events_df.copy()
# 筛选任意球射门事件
fk = df[
(df['event_type'].str.contains('Free Kick', case=False, na=False)) &
(df['sub_type'].str.contains('Direct|Shot', case=False, na=False))
]
# 筛选直接进球
goals = fk[fk['outcome'].str.contains('Goal', case=False, na=False)]
# 按球队/球员筛选
if team:
goals = goals[goals['team'] == team]
if player:
goals = goals[goals['player'] == player]
# 统计
if player:
result = goals.groupby(['team', 'player']).size().reset_index(name='直接任意球进球数')
elif team:
result = goals.groupby(['team', 'player']).size().reset_index(name='直接任意球进球数')
else:
result = goals.groupby(['team', 'player']).size().reset_index(name='直接任意球进球数')
result = result.sort_values('直接任意球进球数', ascending=False)
return result
# ============ 使用示例 ============
if __name__ == "__main__":
# 模拟数据(实际可从StatsBomb/WhoScored/OPTA导出CSV)
data = {
'match_id': [1,1,1,2,2,2,3,3],
'team': ['A队','A队','B队','A队','B队','B队','A队','B队'],
'player': ['梅西','梅西','C罗','梅西','C罗','C罗','梅西','C罗'],
'event_type': ['Free Kick','Free Kick','Free Kick','Free Kick','Free Kick','Free Kick','Free Kick','Free Kick'],
'sub_type': ['Direct','Direct','Direct','Direct','Direct','Direct','Direct','Direct'],
'outcome': ['Goal','Saved','Goal','Goal','Off Target','Goal','Saved','Goal'],
'minute': [25,60,40,30,55,70,15,80]
}
df = pd.DataFrame(data)
print("=== 全队统计 ===")
print(count_direct_free_kick_goals(df))
print("\n=== 梅西的统计 ===")
print(count_direct_free_kick_goals(df, player='梅西'))
输出示例:
=== 全队统计 ===
team player 直接任意球进球数
0 A队 梅西 2
1 B队 C罗 3
=== 梅西的统计 ===
team player 直接任意球进球数
0 A队 梅西 2
从StatsBomb免费数据抓取(真实数据)
StatsBomb 提供免费公开数据,包含详细的任意球事件:
from statsbombpy import sb
import pandas as pd
def statsbomb_free_kick_goals(competition_id, season_id):
"""从StatsBomb统计某赛季任意球直接进球"""
matches = sb.matches(competition_id=competition_id, season_id=season_id)
all_goals = []
for match_id in matches['match_id']:
events = sb.events(match_id=match_id)
# 任意球直接射门得分
fk_goals = events[
(events['type'] == 'Shot') &
(events['shot_type'] == 'Free Kick') &
(events['shot_outcome'] == 'Goal')
]
if not fk_goals.empty:
for _, row in fk_goals.iterrows():
all_goals.append({
'match_id': match_id,
'team': row['team'],
'player': row['player'],
'minute': row['minute'],
})
df = pd.DataFrame(all_goals)
if df.empty:
return df
return df.groupby(['team', 'player']).size().reset_index(name='直接任意球进球')
# 示例:2022世界杯
# result = statsbomb_free_kick_goals(43, 106) # 43=世界杯, 106=2022
# print(result.sort_values('直接任意球进球', ascending=False))
安装依赖:
pip install statsbombpy pandas
命令行快速版(CSV输入)
# freekick_stats.py
import csv, sys
from collections import Counter
def main(csv_file):
goals = Counter()
with open(csv_file, encoding='utf-8') as f:
for row in csv.DictReader(f):
if ('free kick' in row['event_type'].lower()
and 'goal' in row['outcome'].lower()
and 'direct' in row.get('sub_type', 'direct').lower()):
goals[f"{row['team']} - {row['player']}"] += 1
print("===== 任意球直接得分统计 =====")
for k, v in goals.most_common():
print(f"{k}: {v} 次")
print(f"\n总计: {sum(goals.values())} 次")
if __name__ == "__main__":
main(sys.argv[1])
用法:
python freekick_stats.py events.csv
⚠️ 关键注意事项
| 要点 | 说明 |
|---|---|
| 区分"直接"与"间接" | 只需统计直接射门得分(Direct),排除传中后队友头球破门 |
| 排除点球 | 任意球 ≠ 点球,需过滤 Penalty 类型 |
| 数据来源 | Opta、StatsBomb、Wyscout 有 shot_type 字段最准确;否则需结合事件描述判断 |
| 人墙/折射 | 若折射入网,多数统计仍算直接进球,但有些平台会标记不同 |
| 乌龙球 | 任意球造成对方乌龙通常不算直接得分 |
需要我帮你?
请告诉我:
- 你手头的数据格式(CSV列名 / Opta / StatsBomb / 手工Excel)
- 是否要区分联赛/杯赛/国家队
- 输出格式(球员榜、球队榜、还是逐场明细)
我可以针对你的实际数据定制脚本。
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播