本文目录导读:

要判断“人盯人防守成功率”,通常需要结合防守方是否成功阻止了进攻方的得分机会,或者是否迫使对方失误、降低命中率等指标。
由于你提到“这个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的比赛数据,还是模拟一场训练赛?数据集大概长什么样?