实用脚本统计任意球直接得分几次?

wen 实用脚本 1

足球任意球直接得分统计脚本

下面是一个实用的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 字段最准确;否则需结合事件描述判断
人墙/折射 若折射入网,多数统计仍算直接进球,但有些平台会标记不同
乌龙球 任意球造成对方乌龙通常不算直接得分

需要我帮你?

请告诉我:

  1. 你手头的数据格式(CSV列名 / Opta / StatsBomb / 手工Excel)
  2. 是否要区分联赛/杯赛/国家队
  3. 输出格式(球员榜、球队榜、还是逐场明细)

我可以针对你的实际数据定制脚本。

上一篇实用脚本如何识别战术被摸透的风险?

下一篇当前分类已是最新一篇

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

友情链接攻略窝 · 礼包窝 · 配置窝 · 换算窝 · 算法窝 · 查文窝 · 手册窝 · 问答窝 · 全文搜 · 手册库
相关站点礼包窝 · 查文窝