这个实用脚本显示人盯人防守成功率?

wen 实用脚本 4

本文目录导读:

这个实用脚本显示人盯人防守成功率?

  1. 脚本核心逻辑(计算公式)
  2. 实用脚本(Python & Pandas)
  3. 如何把脚本用到“实战”数据?
  4. 脚本输出效果预览
  5. 进阶扩展(高级玩法)

要制作一个“显示人盯人防守成功率”的实用脚本,首先需要明确数据来源计算逻辑

由于篮球/足球等体育数据通常来自专业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 可显示柱状图)")

如何把脚本用到“实战”数据?

如果你有专业的SportVUSecond 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. 利用配对锁定:判断防守人是否在进攻人1.5米范围内。
  2. 成功判定:在防守人贴防的期间,进攻人投篮未命中、失误或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列名)或特定运动规则,请告诉我,我可以帮你调整代码逻辑。

抱歉,评论功能暂时关闭!