本文目录导读:

我来为你设计一个统计落叶球射门成功率的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系统化地分析落叶球射门数据,帮助你找出提高进球率的关键因素!
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播