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

wen 实用脚本 1

本文目录导读:

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

  1. Python脚本:任意球直接得分统计
  2. 脚本说明

我来帮你写一个统计任意球直接得分的实用脚本,这个脚本可以分析比赛数据,统计任意球直接破门的情况。

Python脚本:任意球直接得分统计

import pandas as pd
import re
from collections import defaultdict
class FreeKickAnalyzer:
    def __init__(self):
        self.events = []
        self.free_kick_goals = []
    def load_data_from_csv(self, file_path):
        """从CSV文件加载比赛事件数据"""
        try:
            df = pd.read_csv(file_path)
            self.events = df.to_dict('records')
            print(f"成功加载 {len(self.events)} 条事件记录")
            return True
        except Exception as e:
            print(f"加载文件失败: {e}")
            return False
    def add_event(self, minute, event_type, team, player, description=""):
        """手动添加比赛事件"""
        self.events.append({
            'minute': minute,
            'event_type': event_type,
            'team': team,
            'player': player,
            'description': description
        })
    def is_direct_free_kick_goal(self, event):
        """判断是否为任意球直接得分"""
        if event.get('event_type', '').lower() not in ['goal', '进球']:
            return False
        desc = str(event.get('description', '')).lower()
        event_type = str(event.get('event_type', '')).lower()
        # 关键词匹配
        free_kick_keywords = ['任意球', 'free kick', 'freekick', '直接任意球', 'direct free kick']
        direct_keywords = ['直接', 'direct', '直接射门', '直接破门']
        # 方法1:描述中包含任意球关键词
        has_free_kick = any(kw in desc or kw in event_type for kw in free_kick_keywords)
        # 方法2:排除点球(点球不算任意球)
        is_penalty = any(kw in desc for kw in ['点球', 'penalty', 'penalty kick'])
        # 方法3:排除间接任意球
        is_indirect = any(kw in desc for kw in ['间接', 'indirect', '传球后'])
        if has_free_kick and not is_penalty and not is_indirect:
            # 如果有"直接"关键词,更确定
            if any(kw in desc for kw in direct_keywords):
                return True
            # 如果没有明确说明,但描述简单(如"任意球破门"),也认为是直接
            return True
        return False
    def analyze(self):
        """分析所有事件,统计任意球直接得分"""
        self.free_kick_goals = []
        for event in self.events:
            if self.is_direct_free_kick_goal(event):
                self.free_kick_goals.append(event)
        return self.free_kick_goals
    def get_statistics(self):
        """获取统计结果"""
        if not self.free_kick_goals:
            self.analyze()
        stats = {
            'total_free_kick_goals': len(self.free_kick_goals),
            'by_team': defaultdict(int),
            'by_player': defaultdict(int),
            'goals_list': []
        }
        for goal in self.free_kick_goals:
            team = goal.get('team', '未知')
            player = goal.get('player', '未知')
            minute = goal.get('minute', '?')
            stats['by_team'][team] += 1
            stats['by_player'][player] += 1
            stats['goals_list'].append({
                'minute': minute,
                'team': team,
                'player': player,
                'description': goal.get('description', '')
            })
        stats['by_team'] = dict(stats['by_team'])
        stats['by_player'] = dict(stats['by_player'])
        return stats
    def print_report(self):
        """打印统计报告"""
        stats = self.get_statistics()
        print("=" * 60)
        print("任意球直接得分统计报告")
        print("=" * 60)
        print(f"\n总任意球直接得分: {stats['total_free_kick_goals']} 个\n")
        if stats['total_free_kick_goals'] == 0:
            print("没有找到任意球直接得分的记录。")
            return
        print("-" * 60)
        print("按球队统计:")
        print("-" * 60)
        for team, count in sorted(stats['by_team'].items(), key=lambda x: -x[1]):
            print(f"  {team}: {count} 个")
        print("\n" + "-" * 60)
        print("按球员统计:")
        print("-" * 60)
        for player, count in sorted(stats['by_player'].items(), key=lambda x: -x[1]):
            print(f"  {player}: {count} 个")
        print("\n" + "-" * 60)
        print("详细记录:")
        print("-" * 60)
        for goal in stats['goals_list']:
            print(f"  {goal['minute']}' - {goal['team']} - {goal['player']}")
            if goal['description']:
                print(f"      {goal['description']}")
        print("\n" + "=" * 60)
# ==================== 使用示例 ====================
def demo():
    """演示脚本使用"""
    analyzer = FreeKickAnalyzer()
    # 示例数据(模拟一场比赛的事件)
    sample_events = [
        {'minute': 12, 'event_type': 'goal', 'team': '皇家马德里', 
         'player': 'C罗', 'description': '任意球直接破门,皮球直挂死角'},
        {'minute': 23, 'event_type': 'goal', 'team': '巴塞罗那', 
         'player': '梅西', 'description': '点球破门'},
        {'minute': 35, 'event_type': 'goal', 'team': '皇家马德里', 
         'player': '贝尔', 'description': '头球破门'},
        {'minute': 45, 'event_type': 'goal', 'team': '巴塞罗那', 
         'player': '苏亚雷斯', 'description': '任意球直接射门得分'},
        {'minute': 67, 'event_type': 'goal', 'team': '皇家马德里', 
         'player': 'C罗', 'description': '任意球直接得分,梅开二度'},
        {'minute': 78, 'event_type': 'goal', 'team': '巴塞罗那', 
         'player': '拉基蒂奇', 'description': '间接任意球配合后破门'},
        {'minute': 89, 'event_type': 'goal', 'team': '皇家马德里', 
         'player': '拉莫斯', 'description': '任意球直接头球攻门得分'},
    ]
    # 添加事件
    for event in sample_events:
        analyzer.add_event(**event)
    # 分析并打印报告
    analyzer.print_report()
    # 也可以获取原始数据用于其他用途
    stats = analyzer.get_statistics()
    print("\n原始统计数据 (可用于JSON导出):")
    print(f"总进球数: {stats['total_free_kick_goals']}")
    print(f"球队分布: {stats['by_team']}")
def load_from_csv_example():
    """从CSV加载数据的示例"""
    # CSV格式示例:
    # minute,event_type,team,player,description
    # 12,goal,皇马,C罗,任意球直接破门
    # 23,goal,巴萨,梅西,点球破门
    analyzer = FreeKickAnalyzer()
    # 假设CSV文件路径
    # analyzer.load_data_from_csv('match_events.csv')
    # analyzer.print_report()
    print("CSV格式要求:")
    print("列名: minute, event_type, team, player, description")
    print("event_type填写: goal 或其他类型")
    print("description中需包含'任意球'相关关键词")
if __name__ == "__main__":
    print("【演示模式】\n")
    demo()
    print("\n\n【CSV加载说明】")
    load_from_csv_example()

脚本说明

核心功能

  1. 自动识别任意球直接得分 - 通过关键词匹配(任意球、直接、free kick等)
  2. 排除误判 - 自动排除点球和间接任意球
  3. 多维度统计 - 按球队、球员分别统计
  4. 灵活输入 - 支持手动添加事件或从CSV读取

识别规则

情况 是否统计
任意球直接射门得分 ✅ 统计
任意球头球攻门得分 ✅ 统计
点球破门 ❌ 排除
间接任意球配合后破门 ❌ 排除

使用方法

方法1:直接运行演示

python freekick_stats.py

方法2:从CSV加载 准备CSV文件(列:minute, event_type, team, player, description),

analyzer = FreeKickAnalyzer()
analyzer.load_data_from_csv('your_match.csv')
analyzer.print_report()

方法3:集成到爬虫/API数据 把抓取到的比赛事件逐条用 add_event() 添加即可。

输出示例

============================================================
任意球直接得分统计报告
============================================================
总任意球直接得分: 3 个
------------------------------------------------------------
按球队统计:
------------------------------------------------------------
  皇家马德里: 2 个
  巴塞罗那: 1 个
------------------------------------------------------------
按球员统计:
------------------------------------------------------------
  C罗: 2 个
  苏亚雷斯: 1 个
------------------------------------------------------------
详细记录:
------------------------------------------------------------
  12' - 皇家马德里 - C罗
      任意球直接破门,皮球直挂死角
  45' - 巴塞罗那 - 苏亚雷斯
      任意球直接射门得分
  67' - 皇家马德里 - C罗
      任意球直接得分,梅开二度

扩展建议

  • 接入真实数据源:可对接 懂球帝FotMob 等网站的 API
  • 增加可视化:用 matplotlib 画出任意球得分分布图
  • 多场比赛统计:改成读入多个 CSV 文件循环处理

需要我帮你改成对接某个具体数据源(比如某个网站的爬虫)吗?

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