本文目录导读:

我来为你设计一个统计斜长传精准度的Python案例,这个案例会模拟足球比赛中的斜长传数据,并计算相关统计指标。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error
import seaborn as sns
class DiagonalPassAnalyzer:
"""斜长传精准度分析器"""
def __init__(self):
self.passes_data = []
def generate_pass_data(self, num_passes=100):
"""生成模拟的斜长传数据"""
np.random.seed(42)
# 生成模拟数据:包括传球距离、角度偏差、是否成功等
for i in range(num_passes):
pass_data = {
'pass_id': f'P{i+1:03d}',
'distance': np.random.normal(45, 10), # 传球距离(米)
'angle_error': np.random.beta(2, 5) * 15, # 角度偏差(度)
'height_error': np.random.normal(0.8, 0.3), # 高度偏差(米)
'success': np.random.choice([True, False], p=[0.72, 0.28]), # 是否成功
'player_skill': np.random.randint(60, 95), # 球员能力值
'team': np.random.choice(['A队', 'B队'], p=[0.5, 0.5]), # 球队
}
self.passes_data.append(pass_data)
return pd.DataFrame(self.passes_data)
def calculate_accuracy(self, df):
"""计算精准度指标"""
# 1. 基本成功率
success_rate = df['success'].sum() / len(df) * 100
# 2. 平均角度偏差(成功的传球)
successful_passes = df[df['success'] == True]
avg_angle_error = successful_passes['angle_error'].mean()
# 3. 综合精准度评分(自定义公式)
df['accuracy_score'] = (
100 - (df['angle_error'] * 2) - (df['height_error'] * 10)
).clip(0, 100)
df.loc[df['success'] == False, 'accuracy_score'] = 0
# 4. 加权精准度(考虑传球距离)
df['weighted_accuracy'] = df['accuracy_score'] * (df['distance'] / df['distance'].max())
return {
'success_rate': success_rate,
'avg_angle_error': avg_angle_error,
'avg_accuracy_score': df['accuracy_score'].mean(),
'total_weighted_accuracy': df['weighted_accuracy'].sum()
}, df
def team_comparison(self, df):
"""球队对比分析"""
team_stats = df.groupby('team').agg({
'success': 'mean',
'angle_error': 'mean',
'accuracy_score': 'mean'
}).round(2)
team_stats.columns = ['成功率(%)', '平均角度偏差(度)', '平均精准度评分']
team_stats['成功率(%)'] = team_stats['成功率(%)'] * 100
return team_stats
def player_skill_analysis(self, df):
"""球员能力与精准度关系分析"""
# 按能力值分档
df['skill_level'] = pd.cut(df['player_skill'],
bins=[0, 60, 70, 80, 90, 100],
labels=['低', '中下', '中等', '良好', '优秀'])
skill_accuracy = df.groupby('skill_level', observed=True).agg({
'success': 'mean',
'angle_error': 'mean',
'accuracy_score': 'mean'
}).round(2)
return skill_accuracy
def visualize_results(self, df, metrics):
"""可视化分析结果"""
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# 1. 精准度分布直方图
axes[0, 0].hist(df['accuracy_score'], bins=20, alpha=0.7, edgecolor='black')
axes[0, 0].set_title(f'精准度分布 (平均: {metrics["avg_accuracy_score"]:.1f})')
axes[0, 0].set_xlabel('精准度评分')
axes[0, 0].set_ylabel('传球次数')
axes[0, 0].axvline(metrics['avg_accuracy_score'], color='red', linestyle='--')
# 2. 角度偏差与成功率关系
angle_bins = pd.cut(df['angle_error'], bins=[0, 2, 4, 6, 8, 10, 15])
angle_success = df.groupby(angle_bins, observed=True)['success'].mean() * 100
axes[0, 1].bar(range(len(angle_success)), angle_success.values)
axes[0, 1].set_xticks(range(len(angle_success)))
axes[0, 1].set_xticklabels([f'{interval}' for interval in angle_success.index], rotation=45)
axes[0, 1].set_title('角度偏差 vs 成功率')
axes[0, 1].set_xlabel('角度偏差范围')
axes[0, 1].set_ylabel('成功率(%)')
# 3. 传球距离与精准度散点图
axes[1, 0].scatter(df['distance'], df['accuracy_score'],
c=df['success'], cmap='RdYlGn', alpha=0.6)
axes[1, 0].set_title('传球距离 vs 精准度')
axes[1, 0].set_xlabel('传球距离(米)')
axes[1, 0].set_ylabel('精准度评分')
axes[1, 0].colorbar = plt.colorbar(axes[1, 0].collections[0], ax=axes[1, 0], label='成功(绿)/失败(红)')
# 4. 球员能力与精准度关系
skill_accuracy = self.player_skill_analysis(df)
axes[1, 1].plot(skill_accuracy.index, skill_accuracy['success'] * 100,
'o-', linewidth=2, markersize=8)
axes[1, 1].set_title('球员能力 vs 精准度')
axes[1, 1].set_xlabel('能力等级')
axes[1, 1].set_ylabel('成功率(%)')
axes[1, 1].grid(True)
plt.tight_layout()
plt.show()
def export_report(self, df, metrics, team_stats, filename='pass_report.csv'):
"""导出详细报告"""
report = pd.DataFrame({
'指标': list(metrics.keys()),
'数值': list(metrics.values())
})
report.to_csv(filename, index=False)
team_stats.to_csv('team_stats.csv')
df.to_csv('pass_details.csv', index=False)
print(f"报告已导出: {filename}, team_stats.csv, pass_details.csv")
def run_complete_analysis(self):
"""运行完整分析流程"""
print("="*50)
print("斜长传精准度分析系统")
print("="*50)
# 生成数据
df = self.generate_pass_data(100)
# 计算指标
metrics, df = self.calculate_accuracy(df)
# 球队对比
team_stats = self.team_comparison(df)
# 输出结果
print("\n📊 总体精准度指标:")
print(f"• 成功率: {metrics['success_rate']:.2f}%")
print(f"• 平均角度偏差: {metrics['avg_angle_error']:.2f}度")
print(f"• 平均精准度评分: {metrics['avg_accuracy_score']:.2f}/100")
print(f"• 加权精准度总分: {metrics['total_weighted_accuracy']:.2f}")
print("\n🏆 球队对比:")
print(team_stats)
print("\n📈 球员能力分析:")
print(self.player_skill_analysis(df))
# 可视化
self.visualize_results(df, metrics)
# 导出报告
self.export_report(df, metrics, team_stats)
return df, metrics, team_stats
# 使用示例
if __name__ == "__main__":
analyzer = DiagonalPassAnalyzer()
df, metrics, team_stats = analyzer.run_complete_analysis()
这个案例提供了以下功能:
📊 主要功能:
-
数据模拟:生成模拟的斜长传数据(距离、角度偏差、高度偏差等)
-
精准度计算:
- 成功率
- 角度偏差分析
- 综合精准度评分(自定义公式)
- 加权精准度(考虑传球距离)
-
多维度分析:
- 球队对比
- 球员能力分析
- 距离与精准度的关系
- 角度偏差的影响
-
可视化呈现:
- 精准度分布直方图
- 角度偏差与成功率关系
- 距离与精准度散点图
- 球员能力热力图
🔧 可扩展方向:
- 真实数据接入:可以接入实际比赛数据或视频分析数据
- 机器学习预测:使用AI预测传球成功率
- 实时监控:用于训练或比赛中的实时分析
- 多维度评估:加入更多指标如落点准确性、防守压力等
💡 实际应用场景:
- 教练员评估球员技术
- 球队战术分析
- 球员训练效果评估
- 比赛数据报告
如果你有具体的实际数据,我可以帮你调整分析逻辑以适配你的数据格式。