本文目录导读:

要制作一个“显示人盯人防守成功率”的实用脚本,首先需要明确数据来源和计算逻辑。
由于篮球/足球等体育数据通常来自专业API(如Sportradar、Opta)或本地录制的CSV/Excel,我会给你一个模拟数据 + 高度可复用的Python脚本,你可以直接运行它,并将其核心逻辑移植到你的数据分析工具中。
脚本核心逻辑(计算公式)
人盯人防守成功率通常定义为: 成功率 = (成功防守回合数 / 总人盯人防守回合数) × 100%
- 成功防守回合:通常包括(迫使失误、盖帽、抢断、防守篮板转换、对手投篮不中且未抢到前场篮板)。
- 关键指标:锁定“对位人”,记录每个回合的对位结果。
实用脚本(Python & Pandas)
import pandas as pd
import numpy as np
# ===================== 1. 模拟数据(假设你是教练,手动记录了数据) =====================
# 数据结构:每一行代表一次“防守对位事件”
data = {
'防守人': ['Alex', 'Alex', 'Alex', 'Alex', 'Ben', 'Ben', 'Ben', 'Charlie', 'Charlie', 'Charlie'],
'对位进攻人': ['Player_A', 'Player_B', 'Player_C', 'Player_A', 'Player_D', 'Player_A', 'Player_D', 'Player_E', 'Player_F', 'Player_E'],
'防守回合结果': ['成功', '失败', '成功', '成功', '失败', '成功', '成功', '成功', '失败', '成功'],
'防守类型': ['人盯人', '人盯人', '人盯人', '人盯人', '人盯人', '人盯人', '人盯人', '人盯人', '人盯人', '人盯人']
}
df = pd.DataFrame(data)
# ===================== 2. 计算总体及个人成功率 =====================
def calculate_success_rate(df):
# 确保筛选‘人盯人’防守
df_man = df[df['防守类型'] == '人盯人']
# 总体成功率
total_success = df_man[df_man['防守回合结果'] == '成功'].shape[0]
total_count = df_man.shape[0]
overall_rate = (total_success / total_count * 100) if total_count > 0 else 0
# 按队员分组统计
grouped = df_man.groupby('防守人').agg(
总防守次数=('防守回合结果', 'count'),
成功次数=('防守回合结果', lambda x: (x == '成功').sum())
).reset_index()
grouped['防守成功率'] = (grouped['成功次数'] / grouped['总防守次数'] * 100).round(1)
return overall_rate, grouped
overall_rate, player_stats = calculate_success_rate(df)
# ===================== 3. 输出结果(命令行显示+图形化) =====================
print("=" * 40)
print(f"🏀 总人盯人防守成功率: {overall_rate:.1f}%")
print("=" * 40)
print("📋 个人防守数据明细:")
print(player_stats.to_string(index=False))
# 如果安装了 matplotlib,可以画个柱状图(可选)
try:
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 支持中文
matplotlib.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(8, 4))
bars = plt.bar(player_stats['防守人'], player_stats['防守成功率'], color='#1f77b4')
plt.title('人盯人防守成功率对比')
plt.ylabel('成功率 (%)')
plt.ylim(0, 100)
for bar, rate in zip(bars, player_stats['防守成功率']):
plt.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 1, f'{rate}%', ha='center')
plt.tight_layout()
plt.show()
except ImportError:
print("\n(提示: 安装 matplotlib 可显示柱状图)")
如何把脚本用到“实战”数据?
如果你有专业的SportVU或Second Spectrum追踪数据,或者Synergy Sports的防守报告,你可以替换脚本中的 data 字典,改为读取CSV:
# 假设你的CSV包含列:防守人, 对位进攻人, 防守回合结果, 防守类型
df = pd.read_csv('防守数据.csv')
然后直接调用 calculate_success_rate(df) 即可。
脚本输出效果预览
执行上述代码后,终端会显示:
========================================
🏀 总人盯人防守成功率: 70.0%
========================================
📋 个人防守数据明细:
防守人 总防守次数 成功次数 防守成功率
0 Alex 4 3 75.0
1 Ben 3 2 66.7
2 Charlie 3 2 66.7
进阶扩展(高级玩法)
如果你拥有连续时间序列数据(比如每秒的球员坐标),你可以编写更高级的算法:
- 利用配对锁定:判断防守人是否在进攻人1.5米范围内。
- 成功判定:在防守人贴防的期间,进攻人投篮未命中、失误或24秒违例。
示例伪代码(使用追踪数据):
def is_man_to_man(defender_pos, offensive_pos, threshold=1.5):
distance = np.linalg.norm(defender_pos - offensive_pos)
return distance < threshold
# 遍历每个回合,统计时间占比
这只是一个基础框架,如果你有具体的数据文件格式(比如CSV列名)或特定运动规则,请告诉我,我可以帮你调整代码逻辑。