本文目录导读:

- 先明确统计规则
- 如果你有结构化事件数据
- 如果你只有文字记录
- 如果你用 football-data.org / API-Football / Opta
- 最实用的 SQL 版本
- 建议你的脚本至少输出这些结果
- 最容易出错的地方
可以,下面给你一个实用脚本模板,用来统计足球比赛里“任意球直接得分”的次数。
核心思路是:先定义什么叫任意球直接得分,再用事件数据过滤统计。
先明确统计规则
“任意球直接得分”通常指:
- 判罚任意球后
- 主罚球员直接射门得分
- 中间没有其他球员触球
- 不是传中后队友头球/射门得分
- 不是折射后得分(有些统计把折射也算,需提前定义)
所以脚本里至少要判断:
- 事件类型是任意球
- 事件结果是进球
- 进球方式为直接射门
- 中间无其他触球
- 可选:排除折射、排除点球、排除间接任意球
如果你有结构化事件数据
CSV / Excel,字段类似:
| match_id | event_type | team | player | minute | outcome | assist | touch_after_fk | is_direct |
|---|---|---|---|---|---|---|---|---|
| 1 | free_kick | A | 张三 | 35 | goal | no | yes |
Python 脚本
import pandas as pd
# 读取数据
df = pd.read_csv("match_events.csv")
# 筛选任意球直接得分
direct_fk_goals = df[
(df["event_type"] == "free_kick") &
(df["outcome"] == "goal") &
(df["is_direct"] == "yes") &
(df["touch_after_fk"] == "no")
]
# 统计总次数
total = len(direct_fk_goals)
print("任意球直接得分总次数:", total)
# 按球员统计
by_player = direct_fk_goals.groupby("player").size().sort_values(ascending=False)
print("\n按球员统计:")
print(by_player)
# 按球队统计
by_team = direct_fk_goals.groupby("team").size().sort_values(ascending=False)
print("\n按球队统计:")
print(by_team)
# 按比赛统计
by_match = direct_fk_goals.groupby("match_id").size()
print("\n按比赛统计:")
print(by_match)
如果你只有文字记录
比如比赛战报:
第35分钟,张三主罚任意球直接破门。 第67分钟,李四任意球传中,王五头球得分。 第80分钟,赵六任意球射门被人墙挡出,随后补射得分。
Python 脚本:关键词匹配
import re
text = """
第35分钟,张三主罚任意球直接破门。
第67分钟,李四任意球传中,王五头球得分。
第80分钟,赵六任意球射门被人墙挡出,随后补射得分。
第90分钟,陈七任意球直接得分。
"""
# 匹配“任意球直接得分/破门/进球”
pattern = r"任意球[^。!?\n]{0,10}(直接)?(破门|得分|进球)"
matches = re.findall(pattern, text)
# 更严格:必须出现“直接”
strict_pattern = r"任意球[^。!?\n]{0,10}直接[^。!?\n]{0,6}(破门|得分|进球)"
strict_matches = re.findall(strict_pattern, text)
print("宽松匹配次数:", len(matches))
print("严格匹配次数:", len(strict_matches))
但这个方式适合快速粗筛,不如事件数据准确。
如果你用 football-data.org / API-Football / Opta
不同数据源字段不同。
一般要查:
type:Free Kickdetail:Direct Free Kickresult:Goal
API-Football 风格:
import requests
API_KEY = "你的API_KEY"
url = "https://v3.football.api-sports.io/events"
params = {"fixture": 123456}
headers = {
"x-apisports-key": API_KEY
}
resp = requests.get(url, headers=headers, params=params)
data = resp.json()
count = 0
for event in data["response"]:
if (
event["type"] == "Goal" and
event["detail"] == "Free Kick" and
event["comments"] is None
):
count += 1
print("任意球直接得分次数:", count)
注意:不同 API 的 detail 可能叫:
Direct Free KickFree KickNormal Goal
所以最好先打印几条事件看看字段。
最实用的 SQL 版本
如果数据在数据库:
SELECT COUNT(*) AS direct_fk_goals FROM match_events WHERE event_type = 'free_kick' AND outcome = 'goal' AND is_direct = 1 AND touch_after_fk = 0;
按球员:
SELECT player, COUNT(*) AS goals FROM match_events WHERE event_type = 'free_kick' AND outcome = 'goal' AND is_direct = 1 AND touch_after_fk = 0 GROUP BY player ORDER BY goals DESC;
建议你的脚本至少输出这些结果
总任意球直接得分次数 按球队统计 按球员统计 按比赛统计 每场平均次数 占比:任意球直接得分 / 全部进球
total_goals = len(df[df["outcome"] == "goal"])
ratio = total / total_goals * 100
print(f"占全部进球比例:{ratio:.2f}%")
最容易出错的地方
- 把任意球助攻/传中后得分算进去
- 把折射进球算成直接得分
- 把间接任意球算进去
- 把点球算进去
- 文字战报里“任意球破门”不一定等于直接得分
所以最推荐:
用事件数据里的
Direct Free Kick Goal字段统计。
如果没有,就用“任意球 + 进球 + 无其他触球 + 直接射门”过滤。
如果你愿意,我可以直接帮你写一个完整版脚本。
你只需要告诉我:
- 你的数据格式是什么?CSV、Excel、JSON、API、还是文字战报?
- 字段有哪些?
- 你要统计整个赛季、某支球队、还是某球员?
我可以给你一版能直接跑的代码。