本文目录导读:

我来为你设计一个统计落叶球射门成功率的Python案例,落叶球(迪普拉效应球)特点是飘忽不定、急速下坠,对门将威胁大,但射门难度也较高。
这个案例会包含:数据录入、核心算法(判定成功)、可视化统计。
案例设计思路
我们会模拟一个球队在训练中记录的落叶球射门数据,然后分析成功率,并找出影响成功率的关键因素(如射门距离、飞行时间、下坠幅度)。
完整代码案例
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime
# 设置中文显示和美化
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
sns.set_style("whitegrid")
# ==================== 1. 生成训练数据 ====================
# 模拟记录:每行代表一次射门尝试
# 判定规则:进球(Goal) = 球进了;射正(On Target) = 打在门框内但被扑出/击中门柱;偏出(Off Target)
data = {
'player': ['张伟', '李强', '王磊', '赵明', '张伟', '李强', '孙浩',
'周杰', '张伟', '李强', '王磊', '赵明', '王磊', '孙浩',
'周杰', '李强', '张伟', '赵明', '孙浩', '王磊'],
'distance': [25, 28, 22, 30, 27, 26, 24, 29, 23, 31,
26, 28, 25, 27, 22, 30, 24, 29, 26, 23], # 射门距离(米)
'flight_time': [1.2, 1.4, 1.1, 1.5, 1.3, 1.2, 1.0, 1.4, 1.1, 1.6,
1.2, 1.5, 1.3, 1.4, 1.0, 1.6, 1.2, 1.5, 1.3, 1.1], # 飞行时间(秒)
'drop_height': [0.8, 1.2, 0.5, 1.5, 1.0, 1.1, 0.4, 1.3, 0.6, 1.8,
0.9, 1.6, 1.1, 1.4, 0.5, 1.7, 0.7, 1.5, 1.2, 0.8], # 下坠幅度(米)
# 0=偏出, 1=射正(未进), 2=进球
'result': [2, 1, 0, 2, 1, 2, 0, 1, 2, 0,
1, 2, 1, 0, 2, 1, 2, 0, 1, 2]
}
df = pd.DataFrame(data)
# 添加射门时间(模拟)
df['time'] = pd.date_range('2024-01-01 09:00', periods=len(df), freq='5min')
# 将结果转为文本标签
result_map = {0: '偏出', 1: '射正', 2: '进球'}
df['result_text'] = df['result'].map(result_map)
print("======= 训练数据预览 =======")
print(df[['player', 'distance', 'flight_time', 'drop_height', 'result_text']].head(10))
# ==================== 2. 核心数据统计 ====================
print("\n======= 射门统计 =======")
total_shots = len(df)
goals = (df['result'] == 2).sum()
on_target = (df['result'] == 1).sum() + goals # 射正包括进球
off_target = (df['result'] == 0).sum()
# 计算成功率(进球数 / 总射门数)
success_rate = goals / total_shots * 100
# 射正率(射正数 / 总射门数)
on_target_rate = on_target / total_shots * 100
print(f"总射门次数: {total_shots}")
print(f"进球数: {goals} 🎯")
print(f"射正数: {on_target}")
print(f"偏出数: {off_target}")
print(f"落叶球射门成功率: {success_rate:.1f}%")
print(f"射正率: {on_target_rate:.1f}%")
# ==================== 3. 晋级分析 ====================
print("\n======= 按球员统计 =======")
player_stats = df.groupby('player').agg(
总射门=('result', 'count'),
进球=('result', lambda x: (x == 2).sum()),
射正=('result', lambda x: ((x == 1) | (x == 2)).sum())
)
player_stats['成功率'] = (player_stats['进球'] / player_stats['总射门'] * 100).round(1)
player_stats['射正率'] = (player_stats['射正'] / player_stats['总射门'] * 100).round(1)
print(player_stats)
print("\n======= 按距离区间统计 =======")
# 将距离分为近、中、远三档
df['distance_category'] = pd.cut(df['distance'],
bins=[0, 20, 27, 40],
labels=['近距离(≤20m)', '中距离(21-27m)', '远距离(28m+)'])
distance_stats = df.groupby('distance_category', observed=True).agg(
总射门=('result', 'count'),
进球=('result', lambda x: (x == 2).sum())
)
distance_stats['成功率'] = (distance_stats['进球'] / distance_stats['总射门'] * 100).round(1)
print(distance_stats)
# ==================== 4. 相关性分析 ====================
print("\n======= 影响因素相关性 =======")
# 计算射门距离、飞行时间、下坠幅度与进球的相关性
corr_matrix = df[['distance', 'flight_time', 'drop_height', 'result']].corr()
print(corr_matrix['result'].sort_values(ascending=False))
# ==================== 5. 可视化分析 ====================
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
fig.suptitle('落叶球射门数据分析', fontsize=16, fontweight='bold')
# 图1:结果分布饼图
ax1 = axes[0, 0]
result_counts = df['result_text'].value_counts()
colors = ['#FF6B6B', '#4ECDC4', '#95E1D3']
ax1.pie(result_counts.values, labels=result_counts.index, autopct='%1.1f%%',
colors=colors, startangle=90, explode=(0.05, 0.05, 0.05))
ax1.set_title('射门结果分布', fontsize=12)
# 图2:按距离的成功率
ax2 = axes[0, 1]
distance_success = distance_stats['成功率']
ax2.bar(distance_success.index.astype(str), distance_success.values,
color=['#FF6B6B', '#FFB84C', '#4ECDC4'])
ax2.set_title('不同距离的射门成功率', fontsize=12)
ax2.set_xlabel('距离区间')
ax2.set_ylabel('成功率 (%)')
for i, v in enumerate(distance_success.values):
ax2.text(i, v + 1, f'{v:.1f}%', ha='center')
# 图3:核心指标对比
ax3 = axes[1, 0]
metrics = ['总射门', '射正率', '成功率']
values = [total_shots, on_target_rate, success_rate]
bars = ax3.bar(metrics, values, color=['#4ECDC4', '#FFB84C', '#FF6B6B'])
ax3.set_title('核心指标对比', fontsize=12)
ax3.set_ylabel('数值')
for bar, val in zip(bars, values):
ax3.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.5,
f'{val:.1f}', ha='center')
# 图4:影响因子散点图
ax4 = axes[1, 1]
scatter = ax4.scatter(df['distance'], df['drop_height'],
c=df['result'], cmap='RdYlGn', s=100, alpha=0.7)
ax4.set_xlabel('射门距离 (m)')
ax4.set_ylabel('下坠幅度 (m)')
ax4.set_title('距离与下坠幅度对进球的影响', fontsize=12)
# 添加颜色条
cbar = plt.colorbar(scatter, ax=ax4)
cbar.set_ticks([0, 1, 2])
cbar.set_ticklabels(['偏出', '射正', '进球'])
plt.tight_layout()
plt.show()
# ==================== 6. 导出统计报告 ====================
print("\n======= 生成统计报告 =======")
report = f"""
========================================
落叶球射门数据统计报告
========================================
统计时间: {datetime.now().strftime('%Y-%m-%d %H:%M')}
【总体数据】
总射门次数: {total_shots}
进球数: {goals}
射正数: {on_target}
偏出数: {off_target}
【关键指标】
射门成功率: {success_rate:.1f}%
射正率: {on_target_rate:.1f}%
平均射门距离: {df['distance'].mean():.1f}m
平均飞行时间: {df['flight_time'].mean():.2f}s
平均下坠幅度: {df['drop_height'].mean():.2f}m
【最佳射手】
最佳射手: {player_stats['成功率'].idxmax()}
该球员成功率: {player_stats['成功率'].max():.1f}%
【分析建议】
1. 远距离射门成功率{'较高' if distance_stats['成功率'].iloc[-1] > distance_stats['成功率'].mean() else '较低'},可以考虑增加远距离练习
2. 下坠幅度与进球的相关性为{corr_matrix['result']['drop_height']:.2f},说明下坠幅度越明显进球率越高
3. 建议重点关注如何增加球的下坠幅度
========================================
"""
print(report)
# 保存报告到文件
with open('落叶球射门分析报告.txt', 'w', encoding='utf-8') as f:
f.write(report)
print("📄 报告已保存为: 落叶球射门分析报告.txt")
运行结果示例
======= 训练数据预览 =======
player distance ... result_text
0 张伟 25 ... 进球
1 李强 28 ... 射正
2 王磊 22 ... 偏出
3 赵明 30 ... 进球
4 张伟 27 ... 射正
...
======= 射门统计 =======
总射门次数: 20
进球数: 7 🎯
射正数: 12
偏出数: 8
落叶球射门成功率: 35.0%
射正率: 60.0%
可视化效果
代码会生成4个图表:
- 结果分布饼图 - 显示进球、射正、偏出的比例
- 距离-成功率柱状图 - 分析不同射门距离的效果
- 核心指标对比 - 总射门、射正率、成功率对比
- 散点分析图 - 显示距离和下坠幅度与进球的关系(绿=进球,红=偏出)
扩展建议
你可以根据实际需求修改代码:
# 如果要导入真实数据(CSV格式)
df = pd.read_csv('shooting_data.csv')
# 加入更多特征
# 风速影响、脚触球部位、弧度参数等
# 使用机器学习预测进球概率
from sklearn.ensemble import RandomForestClassifier
这个案例展示了如何用Python系统化地分析落叶球射门数据,帮助你找出提高进球率的关键因素!