本文目录导读:

要制作一个“人盯人防守成功率”的实用脚本,首先需要明确数据来源和判定逻辑。
在真实篮球/足球比赛中,“人盯人防守成功”通常定义为:防守者在场上对位期间,进攻者未得分、未助攻、未造成犯规,且防守者完成了抢断、盖帽或迫使对方失误/投篮不中。
由于无法直接接入实时比赛数据(如NBA API),下面提供一个基于Python的可模拟数据脚本,它适用于教练分析赛后录像数据或游戏数据复盘。
你可以输入防守者、进攻者的每次交锋结果,脚本会自动计算成功率。
Python 命令行脚本(最实用,可扩展)
这个脚本会创建一个数据结构来记录每次单防回合,并统计成功率、场均失分等关键指标。
# -*- coding: utf-8 -*-
"""
人盯人防守成功率分析脚本
功能:记录对位回合,计算防守效率指标
适用于:篮球/足球个人防守数据复盘
"""
import pandas as pd
from datetime import datetime
class DefenderStats:
def __init__(self, defender_name):
self.defender = defender_name
self.defensive_actions = [] # 存储每个防守回合
def add_action(self, opponent, outcome, points_allowed=0, is_shot_attempt=True):
"""
记录一个防守对位回合
参数:
opponent: 进攻球员名称
outcome: 防守结果 (关键判定)
'STOP' -> 防守成功 (抢断、盖帽、迫使失误、投篮打铁+防守篮板)
'SCORE' -> 防守失败 (对手得分)
'FOUL' -> 防守失败 (犯规,且对方罚球得分)
'ASSIST' -> 防守失败 (对手助攻队友得分,且该防守者是主要对位人)
points_allowed: 本次防守失分 (0, 2, 3, 1)
is_shot_attempt: 是否是一次投篮/上篮对抗
"""
action = {
'time': datetime.now().strftime("%H:%M:%S"),
'opponent': opponent,
'outcome': outcome,
'points_allowed': points_allowed,
'is_shot_attempt': is_shot_attempt
}
self.defensive_actions.append(action)
def calculate_success_rate(self):
"""
计算防守成功率
公式: 成功回合数 / 总防守回合数
"""
if not self.defensive_actions:
return 0.0, 0
total_actions = len(self.defensive_actions)
# 防守成功判定:仅当 outcome 为 'STOP'
successful_stops = sum(1 for a in self.defensive_actions if a['outcome'] == 'STOP')
# 额外指标:被投篮命中率(防投篮时)
shot_actions = [a for a in self.defensive_actions if a['is_shot_attempt']]
if shot_actions:
fg_made = sum(1 for a in shot_actions if a['outcome'] == 'SCORE')
fg_pct = fg_made / len(shot_actions)
else:
fg_pct = 0.0
# 每次防守失分
total_points = sum(a['points_allowed'] for a in self.defensive_actions)
success_rate = (successful_stops / total_actions) * 100
return {
'success_rate': round(success_rate, 1),
'total_possessions': total_actions,
'stops': successful_stops,
'opp_fg_pct': round(fg_pct, 3),
'points_allowed_per_poss': round(total_points / total_actions, 2)
}
def print_report(self):
stats = self.calculate_success_rate()
print(f"\n=== 防守报告: {self.defender} ===")
print(f"总对位回合: {stats['total_possessions']}")
print(f"防守成功次数: {stats['stops']}")
print(f"人盯人防守成功率: {stats['success_rate']}%")
print(f"对手投篮命中率: {stats['opp_fg_pct']:.1%}")
print(f"每回合失分: {stats['points_allowed_per_poss']}")
print("-" * 30)
# ========== 使用示例 (模拟一场比赛数据) ==========
if __name__ == "__main__":
# 创建防守球员 ( 卡鲁索)
caruso = DefenderStats("Caruso")
# 模拟进攻回合数据: (对手, 结果, 失分, 是否投篮)
# 'STOP' = 防守成功 | 'SCORE' = 对手命中 | 'FOUL' = 犯规
data = [
("Mitchell", 'STOP', 0, True), # 成功防下投篮
("Mitchell", 'SCORE', 2, True), # 被投进2分
("Sexton", 'STOP', 0, True), # 抢断
("Markkanen", 'FOUL', 2, True), # 犯规送罚球(算失分)
("Mitchell", 'STOP', 0, True), # 迫使打铁
("Sexton", 'SCORE', 3, True), # 被投进3分
("Markkanen", 'STOP', 0, False), # 防下无球跑位
]
for opp, out, pts, shot in data:
caruso.add_action(opp, out, pts, shot)
# 输出报告
caruso.print_report()
Excel 表格公式版(适合不懂代码的教练)
如果你只需要一个手动录入表格,可以用 Excel 或 腾讯文档:
- 建立列:
回合编号|防守人|进攻人|结果(下拉选择:成功/失败/犯规) |失分|投篮否 - 计算公式:
- 成功率 =
COUNTIF(D:D,"成功") / COUNTA(D:D) - 限制对手命中率 =
SUMPRODUCT((E:E>0)*1) / SUMPRODUCT((F:F="是")*1)
- 成功率 =
命令行一键统计(极简版)
如果你在录像分析时使用 obs 或 录屏软件,只想快速打点,可以用这个精简版:
# 极简:在终端直接输入结果,输入 q 退出
stop_count = 0
fail_count = 0
while True:
result = input("输入结果 (s=成功防下, f=被得分, q=退出): ").strip().lower()
if result == 'q':
break
elif result == 's':
stop_count += 1
elif result == 'f':
fail_count += 1
else:
print("无效输入,请输入 s/f")
total = stop_count + fail_count
if total > 0:
rate = (stop_count / total) * 100
print(f"\n终结统计: 总回合 {total}, 成功 {stop_count}, 失败 {fail_count}")
print(f"人盯人防守成功率: {rate:.1f}%")
else:
print("无数据")
如何定义“成功”?—— 这是核心
在脚本中,STOP(成功)是根据现代篮球防守数据(Defensive Dashboard)定义的,它包含以下四种情况之一:
- 直接抢断或盖帽,且球权发生转换。
- 迫使对手投篮不中,并且防守方控制住篮板。
- 迫使对手失误(进攻犯规、走步、传球出界),但过程中防守者没有犯规。
- 对手在严密防守下投篮不中(无论是否投篮,只要没进且没造成罚球,就算成功)。
注意:如果犯规了,即便对手投篮不进,也算作防守失败,因为给了对方罚球机会。
如何使用并扩展?
- 替换数据:将
data数组内的模拟数据替换为你实际比赛中的对位记录。 - 增强维度:可以添加
position(防守位置)、pick_and_roll(挡拆)等字段,分析不同场景下的防守效率。 - 可视化:可以用
matplotlib画出雷达图,对比不同球员的防守成功率。
如果你有具体的数据文件(如 CSV 或数据库导出),把文件格式贴出来,我可以帮你把脚本改成直接读取文件的版本。