这个python案例显示人盯人防守成功率?

wen python案例 4

本文目录导读:

这个python案例显示人盯人防守成功率?

  1. 情况一:如果你有球员位置和攻防事件数据
  2. 情况二:如果你有真实比赛数据(比如像 SportVU 或 Synergy 的数据)
  3. 如果你已有具体数据,请贴出部分截图或字段说明

要判断“人盯人防守成功率”,通常需要结合防守方是否成功阻止了进攻方的得分机会,或者是否迫使对方失误、降低命中率等指标。

由于你提到“这个Python案例”,但我没有看到具体的代码或数据文件,我先提供一个通用的人盯人防守成功率计算模型的Python案例,你可以参考这个逻辑来适配你的数据。


如果你有球员位置和攻防事件数据

假设你想计算某次防守回合中,防守人是否成功防下了进攻(即对方投篮未中、失误或进攻时间耗尽)。

以下是一个简单的模拟案例

import random
# 模拟一场比赛中,防守方进行人盯人防守的回合数据
# 每个回合记录:
# 1. 进攻方是否投篮(True/False)
# 2. 如果投篮了,是否命中(True/False)
# 3. 防守方是否造成了进攻失误(True/False)
def simulate_defensive_possessions(num_possessions):
    """
    模拟 num_possessions 个防守回合
    返回一个列表,每个元素包含结果 ('成功', '失败', '犯规'等)
    """
    results = []
    for _ in range(num_possessions):
        # 假设每个回合有70%概率投篮,20%概率失误,10%概率被犯规
        action = random.choices(['shot', 'turnover', 'foul'], weights=[70, 20, 10])[0]
        if action == 'turnover':
            results.append('成功')  # 防守方造成失误
        elif action == 'foul':
            # 犯规通常算防守失败(可能送罚球)
            results.append('失败')
        else:  # 投篮
            # 命中率假设为 40%(防守强度大,命中率降低)
            made = random.random() < 0.40
            if made:
                results.append('失败')  # 对方得分
            else:
                results.append('成功')  # 对方未投中(防守篮板)
    return results
def calculate_success_rate(defensive_results):
    """
    计算防守成功率
    成功 ===> 防下对方进攻,包括:抢断、盖帽、篮板、造成对方失误、投失
    失败 ===> 对方得分或者获得罚球
    """
    total = len(defensive_results)
    if total == 0:
        return 0.0
    successful = defensive_results.count('成功')
    success_rate = successful / total * 100
    return success_rate
# 模拟一场比赛(80 个防守回合)
rounds = 80
defense_results = simulate_defensive_possessions(rounds)
# 计算防守成功率
rate = calculate_success_rate(defense_results)
print(f"总防守回合数: {rounds}")
print(f"成功防守回合数: {defense_results.count('成功')}")
print(f"失败防守回合数: {defense_results.count('失败')}")
print(f"\n人盯人防守成功率: {rate:.2f}%")

如果你有真实比赛数据(比如像 SportVU 或 Synergy 的数据)

人盯人防守的“成功”定义更严格,

  • 防守人限制对手得分:对方命中率低于某个阈值(如40%),或者防守者使进攻球员的投篮命中率比其赛季平均水平低 X%。
  • 防守成功回合:对手投篮不中且防守方拿到防守篮板,或者对手失误。
  • 犯规:通常算防守失败。

以下是根据具体事件流计算的更精细逻辑示例:

# 假设 df 是 DataFrame,每一行是一次攻防事件
# 包含列:event_type (投篮/失误/犯规/篮板), shot_made (True/False), defender_id 等
import pandas as pd
# 示例数据(你可能要替换成自己的数据)
data = [
    {'defender_id': 1, 'event': 'shot', 'made': False},
    {'defender_id': 1, 'event': 'shot', 'made': True},
    {'defender_id': 1, 'event': 'turnover', 'made': None},  # 失误算成功
    {'defender_id': 2, 'event': 'rebound_o', 'made': None},  # 进攻篮板? 该事件后进攻方仍掌握球权,不算防守成功回合结束
    {'defender_id': 2, 'event': 'rebound_d', 'made': None},  # 防守篮板,算成功
    {'defender_id': 2, 'event': 'foul', 'made': None},       # 犯规不算成功
]
df = pd.DataFrame(data)
def evaluate_defense(row):
    """根据事件判断该防守人是否成功"""
    if row['event'] == 'shot' and not row['made']:
        return '成功'   # 投篮不中
    elif row['event'] == 'turnover':
        return '成功'   # 进攻失误
    elif row['event'] == 'rebound_d':
        return '成功'   # 防守篮板,意味着进攻方投篮不中(或失误)
    else:
        return '失败'   # 投篮命中、进攻篮板、犯规等都算失败
df['result'] = df.apply(evaluate_defense, axis=1)
# 计算总成功率(注意排除非投篮和失误的neutral事件?这里简化为成功/失败)
success_count = df[df['result'] == '成功'].shape[0]
total_evaluated = df[df['result'].isin(['成功', '失败'])].shape[0]
if total_evaluated > 0:
    success_rate = (success_count / total_evaluated) * 100
else:
    success_rate = 0.0
print(f"防守成功率: {success_rate:.2f}%")
print("\n按防守人统计:")
print(df.groupby('defender_id')['result'].value_counts(normalize=True).unstack() * 100)

如果你已有具体数据,请贴出部分截图或字段说明

我可以帮你改写代码,让指标更符合你的业务场景(比如区分一对一单防守成协防破坏抢断率等)。

请问你是想分析NBA、CBA的比赛数据,还是模拟一场训练赛?数据集大概长什么样?

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