本文目录导读:

我理解你可能想统计某个比赛/训练视频里“关门防守”成功的次数,但仅凭这句话信息不够:我不知道你的数据格式、”关门防守”的判定标准、以及你希望脚本运行在哪里。
下面给你一个可直接改造的 Python 实用脚本模板,按“事件表”统计关门防守成功次数,你只需要把数据换成你的来源即可。
如果你有事件记录表(CSV/Excel)
假设 CSV 长这样:
time,team,event,result 00:12,A,关门防守,成功 00:35,B,关门防守,失败 01:02,A,关门防守,成功 01:20,A,抢断,成功
脚本:
import pandas as pd
# 1. 读取数据
df = pd.read_csv("events.csv")
# 2. 筛选“关门防守”事件
close_defense = df[df["event"] == "关门防守"]
# 3. 统计成功次数
success_count = (close_defense["result"] == "成功").sum()
# 4. 可选:按球队统计
success_by_team = (
close_defense[close_defense["result"] == "成功"]
.groupby("team")
.size()
)
print(f"关门防守成功总次数: {success_count}")
print("按球队统计:")
print(success_by_team)
运行结果类似:
关门防守成功总次数: 2 按球队统计: team A 2 dtype: int64
如果你只有视频,想人工打点统计
这个脚本适合边看视频边按键盘记录:
import time
import csv
records = []
print("按 Enter 记录一次【关门防守成功】,输入 q 回车结束。")
count = 0
while True:
key = input("记录成功?(Enter/q): ").strip().lower()
if key == "q":
break
count += 1
records.append({
"no": count,
"time": time.strftime("%H:%M:%S"),
"event": "关门防守",
"result": "成功"
})
print(f"已记录 {count} 次")
with open("close_defense_success.csv", "w", newline="", encoding="utf-8-sig") as f:
writer = csv.DictWriter(f, fieldnames=["no", "time", "event", "result"])
writer.writeheader()
writer.writerows(records)
print(f"总计关门防守成功 {count} 次,已保存到 close_defense_success.csv")
如果你的“关门防守”有坐标/轨迹数据
比如你有球员坐标,想自动判断“两人是否形成关门”,判定逻辑通常要自己定义,
- 两名防守球员距离小于阈值
- 进攻球员被夹在两人之间
- 进攻球员速度下降/丢球
伪代码思路:
def is_close_defense(defender1, defender2, attacker, threshold=2.0):
# 防守两人距离够近
d12 = distance(defender1, defender2)
# 进攻者位于两人连线附近
d_att_line = point_to_line_distance(attacker, defender1, defender2)
return d12 < threshold and d_att_line < 1.0
success_count = 0
for frame in frames:
if is_close_defense(d1, d2, att):
if possession_lost(att):
success_count += 1
但这部分需要你的具体数据格式,否则没法写死。
为了给你更准确的脚本,我需要你告诉我 3 件事:
- 数据来源:CSV/Excel、视频、坐标轨迹、还是手动打点?
- “关门防守成功”的定义:是造成失误、丢球、投篮不中,还是只要形成夹击就算?
- 输出要求:只统计总数,还是按球员/球队/时间段统计?
你把这 3 点补充一下,我可以直接给你一份能跑的完整脚本。