本文目录导读:

我来设计一个量化防守反击效率的Python案例,包含多种计算模型。
防守反击效率量化模型
基础数据准备
import pandas as pd
import numpy as np
from datetime import datetime
# 创建防守反击事件数据
data = {
'match_id': ['M1', 'M1', 'M1', 'M2', 'M2', 'M2', 'M3', 'M3'],
'team': ['皇马', '皇马', '皇马', '利物浦', '利物浦', '利物浦', '拜仁', '拜仁'],
'timestamp': [10, 23, 45, 15, 38, 55, 20, 60], # 分钟
'start_position': [30, 25, 40, 35, 28, 45, 38, 32], # 抢断位置(本方半场0-50,对方半场50-100)
'duration': [8, 6, 10, 7, 5, 9, 6, 7], # 进攻持续时间(秒)
'passes': [3, 2, 4, 3, 2, 5, 2, 3], # 传球次数
'speed': [5.2, 6.1, 4.8, 5.8, 6.5, 4.2, 6.0, 5.5], # 推进速度 m/s
'end_position': [80, 75, 90, 85, 70, 95, 78, 88], # 最终位置
'outcome': ['goal', 'shot_on_target', 'shot_off_target', 'shot_on_target',
'tackle', 'goal', 'corner', 'shot_on_target'], # 结果
'xG': [0.35, 0.15, 0.08, 0.12, 0.02, 0.42, 0.05, 0.18] # 预期进球
}
df = pd.DataFrame(data)
print("基础数据:")
print(df.head())
基础效率指标计算
class CounterAttackAnalyzer:
def __init__(self, df):
self.df = df.copy()
self.result_point = {
'goal': 1.0, # 进球
'shot_on_target': 0.6, # 射正
'shot_off_target': 0.3, # 射偏
'corner': 0.2, # 角球
'tackle': 0.1 # 被抢断
}
def basic_efficiency(self):
"""基础效率指标"""
df = self.df.copy()
# 1. 成功率
df['success'] = df['outcome'].isin(['goal', 'shot_on_target']).astype(int)
# 2. 空间推进效率
df['space_gain'] = df['end_position'] - df['start_position']
# 3. 速度效率
df['speed_efficiency'] = df['speed'] / 6.0 # 规范化为最大值6m/s
# 4. 传球效率
df['pass_efficiency'] = df['passes'] / df['duration'] * 60 # 每分钟传球数
# 5. 单个指标得分
df['basic_score'] = (
df['success'] * 0.3 +
df['space_gain'] / 50 * 0.2 + # 标准化空间增益
df['speed_efficiency'] * 0.2 +
(df['pass_efficiency'] / 30) * 0.15 + # 标准化传球频率
df['xG'] * 2 * 0.15 # xG贡献
)
return df[['match_id', 'team', 'outcome', 'space_gain',
'speed_efficiency', 'pass_efficiency', 'basic_score']]
def visualization_score(self, df):
"""可视化/综合评分模型"""
df = df.copy()
# 威胁等级评定
df['threat_level'] = df['outcome'].map({
'goal': 5, 'shot_on_target': 4, 'shot_off_target': 3,
'corner': 2, 'tackle': 1
})
# 进攻速度等级
df['speed_level'] = pd.cut(df['speed'],
bins=[0, 4, 5, 6, 10],
labels=['慢', '中', '快', '极快'])
# 综合效率指数(0-100分)
score = (
df['threat_level'] * 15 + # 最大75分
(df['duration'] / 10) * 10 + # 持续进攻10分
df['space_gain'] / 50 * 10 + # 推进距离10分
df['xG'] * 0.5 * 5 # xG贡献5分
).clip(0, 100)
df['composite_score'] = score
return df[['match_id', 'team', 'outcome', 'composite_score']]
高级效率模型(包含多维度)
class AdvancedEfficiencyModel:
def __init__(self, df):
self.df = df.copy()
def calculate_efficiency_matrix(self):
"""计算效率矩阵"""
df = self.df.copy()
# 1. 时间效率
df['time_efficiency'] = self.calculate_time_efficiency(df)
# 2. 空间效率
df['space_efficiency'] = self.calculate_space_efficiency(df)
# 3. 技术效率
df['tech_efficiency'] = self.calculate_tech_efficiency(df)
# 4. 决策效率
df['decision_efficiency'] = self.calculate_decision_efficiency(df)
# 5. 综合效率指数
df['overall_efficiency'] = self.composite_index(df)
return df
def calculate_time_efficiency(self, df):
"""时间效率:每秒钟创造xG"""
return df['xG'] / (df['duration'] / 60) # 每分钟xG产出
def calculate_space_efficiency(self, df):
"""空间效率:每米推进创造的xG"""
space_gain = df['end_position'] - df['start_position']
return df['xG'] / (space_gain / 50) # 每次进攻推进50米创造的xG
def calculate_tech_efficiency(self, df):
"""技术效率:传球/控球的精准度"""
# 简化计算:传球创造xG的效率
return df['xG'] / (df['passes'] + 1) # 避免除零
def calculate_decision_efficiency(self, df):
"""决策效率:是否选择了最好的方案"""
# 对方半场的进攻成功率更高
position_factor = np.where(df['start_position'] > 50, 1.2, 0.8)
return df['xG'] * position_factor
def composite_index(self, df):
"""综合指数(0-100)"""
# 归一化处理
indices = [
df['time_efficiency'] / df['time_efficiency'].max(),
df['space_efficiency'] / df['space_efficiency'].max(),
df['tech_efficiency'] / df['tech_efficiency'].max(),
df['decision_efficiency'] / df['decision_efficiency'].max()
]
weights = [0.3, 0.3, 0.2, 0.2] # 权重分布
composite = sum(w * idx for w, idx in zip(weights, indices))
return (composite * 100).round(2)
团队/比赛维度分析
class TeamEfficiencyAnalyzer:
def __init__(self, df):
self.df = df.copy()
self.analyzer = AdvancedEfficiencyModel(df)
def team_summary(self):
"""团队整体效率分析"""
df_efficiency = self.analyzer.calculate_efficiency_matrix()
# 按队伍聚合
team_stats = df_efficiency.groupby('team').agg({
'xG': ['sum', 'mean'],
'overall_efficiency': ['mean', 'max'],
'space_efficiency': 'mean',
'time_efficiency': 'mean'
}).round(2)
# 扁平化列名
team_stats.columns = ['_'.join(col).strip() for col in team_stats.columns]
return team_stats
def match_comparison(self):
"""比赛对比分析"""
df_efficiency = self.analyzer.calculate_efficiency_matrix()
# 按比赛和队伍分组
match_comp = df_efficiency.groupby(['match_id', 'team']).agg({
'xG': 'sum',
'overall_efficiency': 'mean',
'outcome': lambda x: (x == 'goal').sum() # 反击进球数
}).rename(columns={'outcome': 'counter_goals'})
# 评估每场比赛的整体反击效率
match_comp['match_rating'] = (
match_comp['xG'] * 3 +
match_comp['overall_efficiency'] * 0.5 +
match_comp['counter_goals'] * 5
).round(2)
return match_comp
def efficiency_ranking(self):
"""效率排名"""
df_efficiency = self.analyzer.calculate_efficiency_matrix()
# 综合排名指标
ranking_criteria = {
'进球权重': 0.25,
'射正权重': 0.20,
'xG效率权重': 0.25,
'推进效率权重': 0.15,
'比赛胜率权重': 0.15
}
# 计算排名分数
df_efficiency['rank_score'] = (
df_efficiency['xG'] * 3 * ranking_criteria['xG效率权重'] +
df_efficiency['overall_efficiency'] * 0.5 * ranking_criteria['推进效率权重'] +
(df_efficiency['outcome'] == 'goal').astype(int) * ranking_criteria['进球权重'] * 10
)
# 按队伍排名
team_ranking = df_efficiency.groupby('team')['rank_score'].mean().sort_values(ascending=False)
return team_ranking
可视化分析
import matplotlib.pyplot as plt
import seaborn as sns
class EFFVisualizer:
def __init__(self, analyzer):
self.analyzer = analyzer
self.basic_model = CounterAttackAnalyzer(analyzer.df)
def plot_efficiency_dashboard(self):
"""效率仪表盘"""
df_basic = self.basic_model.basic_efficiency()
df_advanced = self.analyzer.calculate_efficiency_matrix()
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# 1. 基础效率分布
ax1 = axes[0, 0]
sns.barplot(data=df_basic, x='team', y='basic_score', ax=ax1,
hue='team', palette='viridis', legend=False)
ax1.set_title('基础反击效率得分')
ax1.set_ylabel('效率得分')
# 2. 综合效率指数对比
ax2 = axes[0, 1]
df_team = df_advanced.groupby('team')['overall_efficiency'].mean().reset_index()
sns.boxplot(data=df_advanced, x='team', y='xG', ax=ax2,
hue='team', palette='muted', legend=False)
ax2.set_title('反击预期进球分布')
ax2.set_ylabel('xG')
# 3. 效率矩阵热力图
ax3 = axes[1, 0]
efficiency_matrix = df_advanced.groupby('team')[['time_efficiency', 'space_efficiency',
'tech_efficiency', 'decision_efficiency']].mean()
sns.heatmap(efficiency_matrix, annot=True, cmap='YlOrRd',
fmt='.2f', ax=ax3, linewidths=0.5)
ax3.set_title('效率维度热力图')
# 4. 效率随时间变化
ax4 = axes[1, 1]
df_advanced['minute_range'] = pd.cut(df_advanced['timestamp'],
bins=[0, 15, 30, 45, 60, 75, 90],
labels=['0-15', '15-30', '30-45', '45-60', '60-75', '75-90'])
time_efficiency = df_advanced.groupby('minute_range')['overall_efficiency'].mean()
time_efficiency.plot(kind='line', marker='o', ax=ax4)
ax4.set_title('比赛时间段的效率变化')
ax4.set_xlabel('时间段(分钟)')
ax4.set_ylabel('平均效率')
plt.tight_layout()
plt.show()
实时分析类(可用于直播分析)
class RealTimeEfficiencyMonitor:
"""实时防守反击效率监控"""
def __init__(self):
self.history = []
self.weights = {
'speed': 0.3,
'accuracy': 0.3,
'threat': 0.4
}
def update_event(self, counter_attack_event):
"""更新反击事件"""
efficiency = self.calculate_event_efficiency(counter_attack_event)
event_data = {
'timestamp': datetime.now(),
**counter_attack_event,
'efficiency_score': efficiency
}
self.history.append(event_data)
return event_data
def calculate_event_efficiency(self, event):
"""计算单次反击事件效率"""
# 速度指标
speed_score = min(event['speed'] / 6.0, 1)
# 精度指标(基于传球成功率)
accuracy_score = event.get('pass_accuracy', 0.8) # 默认0.8
# 威胁指标
threat_mapping = {
'goal': 1.0,
'shot_on_target': 0.7,
'shot_off_target': 0.4,
'outside_box': 0.2,
'failed': 0.1
}
threat_score = threat_mapping.get(event['outcome'], 0.1)
# 加权计算
total_score = (
self.weights['speed'] * speed_score +
self.weights['accuracy'] * accuracy_score +
self.weights['threat'] * threat_score
)
return round(total_score * 100, 2)
def get_live_summary(self, minutes=5):
"""获取最近X分钟的实时效率"""
if not self.history:
return {'message': '暂无数据'}
recent = [h for h in self.history if
(datetime.now() - h['timestamp']).total_seconds()/60 <= minutes]
if recent:
avg_efficiency = np.mean([r['efficiency_score'] for r in recent])
return {
'counter_attacks': len(recent),
'average_efficiency': round(avg_efficiency, 2),
'top_efficiency': max(recent, key=lambda x: x['efficiency_score'])['efficiency_score']
}
else:
return {'message': '规定时间内无反击事件'}
使用示例
def main():
# 1. 加载数据
data = {
'match_id': ['M1', 'M1', 'M1', 'M2', 'M2', 'M2'],
'team': ['皇马', '皇马', '皇马', '利物浦', '利物浦', '利物浦'],
'timestamp': [10, 23, 45, 15, 38, 55],
'start_position': [30, 25, 40, 35, 28, 45],
'duration': [8, 6, 10, 7, 5, 9],
'passes': [3, 2, 4, 3, 2, 5],
'speed': [5.2, 6.1, 4.8, 5.8, 6.5, 4.2],
'end_position': [80, 75, 90, 85, 70, 95],
'outcome': ['goal', 'shot_on_target', 'shot_off_target', 'shot_on_target',
'tackle', 'goal'],
'xG': [0.35, 0.15, 0.08, 0.12, 0.02, 0.42]
}
df = pd.DataFrame(data)
# 2. 运行分析
basic_analyzer = CounterAttackAnalyzer(df)
basic_results = basic_analyzer.basic_efficiency()
print("基础效率分析:")
print(basic_results)
# 3. 高级分析
advanced = AdvancedEfficiencyModel(df)
eff_matrix = advanced.calculate_efficiency_matrix()
print("\n高级效率矩阵:")
print(eff_matrix[['team', 'time_efficiency', 'space_efficiency',
'tech_efficiency', 'decision_efficiency', 'overall_efficiency']])
# 4. 团队分析
team_analyzer = TeamEfficiencyAnalyzer(df)
team_results = team_analyzer.team_summary()
print("\n团队效率汇总:")
print(team_results)
# 5. 可视化
visualizer = EFFVisualizer(team_analyzer)
visualizer.plot_efficiency_dashboard()
# 6. 实时监控示例
monitor = RealTimeEfficiencyMonitor()
event = {
'speed': 5.5,
'pass_accuracy': 0.85,
'outcome': 'shot_on_target'
}
result = monitor.update_event(event)
print(f"\n实时反击效率: {result['efficiency_score']}")
print(monitor.get_live_summary(minutes=5))
if __name__ == "__main__":
main()
效率量化公式总结
计算公式: 效率值 = ∑(权重 × 对应指标)
主要指标权重分配:
| 指标 | 权重 | 衡量标准 |
|---|---|---|
| 进球贡献 | 35% | 进球=1,射正=0.6 |
| 推进速度 | 25% | 6m/s为最优 |
| 空间创造 | 20% | 从本方禁区到对方禁区 |
| 决策质量 | 20% | 是否选择最佳进攻路线 |
这个量化框架可以帮助教练和数据分析师:
- 客观评估每次防守反击的质量
- 比较不同队伍的反击效率
- 实时监控比赛的攻防转换效率
- 识别高效率反击的关键因素
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播