本文目录导读:

我来帮你写一个统计任意球直接得分的实用脚本,这个脚本可以分析比赛数据,统计任意球直接破门的情况。
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()
脚本说明
核心功能
- 自动识别任意球直接得分 - 通过关键词匹配(任意球、直接、free kick等)
- 排除误判 - 自动排除点球和间接任意球
- 多维度统计 - 按球队、球员分别统计
- 灵活输入 - 支持手动添加事件或从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罗
任意球直接得分,梅开二度
扩展建议
需要我帮你改成对接某个具体数据源(比如某个网站的爬虫)吗?