本文目录导读:

“综合实用脚本,高速跑动距离对比”这个需求,通常出现在体育数据分析(如足球、篮球)、游戏角色测试或运动训练场景中,由于你没有提供具体的数据格式和运行环境,我为你准备了一个通用性极强的 Python 脚本框架。
这个脚本的核心功能是:
- 自动读取包含时间、速度、球员/角色ID的数据。
- 自定义高速阈值(大于 20 km/h 算作高速跑动)。
- 计算并对比不同对象(球员A vs 球员B,或 本场 vs 上场)的高速跑动距离。
- 可视化输出对比结果。
你可以直接复制并根据你的数据列名修改即可使用。
综合实用脚本:高速跑动距离对比
适用场景:足球/篮球球员GPS背心数据、游戏角色移动测试、跑步训练分析。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# ================= 配置区 =================
# 1. 高速跑动阈值 (单位:km/h),足球通常取 19.8 或 20,篮球可取 16。
HIGH_SPEED_THRESHOLD = 20.0
# 2. 采样间隔 (单位:秒),假设数据是每秒记录一次。
TIME_INTERVAL_SEC = 1.0
# 3. 数据文件路径 (CSV格式,需包含: 时间, 对象ID, 速度)
# 示例数据格式:
# timestamp, player_id, speed_kmh
# 0, A, 5.2
# 1, A, 21.5
# ...
DATA_FILE = 'gps_data.csv'
# ==========================================
def calculate_high_speed_distance(df, threshold, interval):
"""
计算每个对象的高速跑动距离
df: 包含 'player_id' 和 'speed_kmh' 的 DataFrame
threshold: 高速阈值 (km/h)
interval: 采样间隔 (秒)
"""
# 筛选出高速跑动的数据
high_speed_df = df[df['speed_kmh'] >= threshold].copy()
# 计算每一条高速记录对应的距离 (km) = 速度(km/h) * (时间间隔/3600)
high_speed_df['distance_km'] = high_speed_df['speed_kmh'] * (interval / 3600.0)
# 按对象分组求和
result = high_speed_df.groupby('player_id')['distance_km'].sum().reset_index()
result.columns = ['对象ID', '高速跑动距离(km)']
# 保留3位小数
result['高速跑动距离(km)'] = result['高速跑动距离(km)'].round(3)
return result
def generate_mock_data():
"""生成模拟数据用于演示,如果你有真实数据请忽略此函数"""
np.random.seed(42)
players = ['球员A', '球员B', '球员C']
data = []
for player in players:
for t in range(3600): # 模拟1小时,每秒一个点
# 模拟速度:大部分时间低速,偶尔冲刺
base_speed = np.random.normal(5, 2) # 平均5km/h
if np.random.random() > 0.9: # 10%的时间高速跑
base_speed = np.random.normal(22, 3)
base_speed = max(0, base_speed) # 速度不能为负
data.append({'timestamp': t, 'player_id': player, 'speed_kmh': base_speed})
return pd.DataFrame(data)
def plot_comparison(result_df):
"""绘制对比柱状图"""
plt.figure(figsize=(10, 6))
# 设置中文字体 (根据你的系统调整,Windows通常用SimHei,Mac用Arial Unicode MS)
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False
bars = plt.bar(result_df['对象ID'], result_df['高速跑动距离(km)'], color=['#FF6B6B', '#4ECDC4', '#45B7D1'])
# 在柱子上显示数值
for bar in bars:
yval = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2, yval + 0.01, f'{yval} km', ha='center', va='bottom', fontsize=12)
plt.title(f'高速跑动距离对比 (阈值: {HIGH_SPEED_THRESHOLD} km/h)', fontsize=16)
plt.xlabel('对象', fontsize=14)
plt.ylabel('高速跑动距离 (km)', fontsize=14)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()
def main():
print("正在加载数据...")
# 1. 加载数据 (如果没有文件,使用模拟数据)
try:
df = pd.read_csv(DATA_FILE)
print(f"成功读取文件: {DATA_FILE}")
except FileNotFoundError:
print(f"未找到 {DATA_FILE},正在生成模拟数据演示...")
df = generate_mock_data()
# 2. 计算高速跑动距离
print(f"正在计算高速跑动距离 (阈值 >= {HIGH_SPEED_THRESHOLD} km/h)...")
result = calculate_high_speed_distance(df, HIGH_SPEED_THRESHOLD, TIME_INTERVAL_SEC)
# 3. 打印结果
print("\n========== 高速跑动距离统计结果 ==========")
print(result.to_string(index=False))
print("==========================================")
# 4. 可视化对比
plot_comparison(result)
if __name__ == "__main__":
main()
如何适配你的真实数据?
如果你的数据不是 player_id 和 speed_kmh,请修改 main() 函数中的读取部分:
场景1:数据是宽表(每列是一个球员,值是速度)
# 原始数据: timestamp, 球员A, 球员B
# 需要先转换为长表
df = pd.read_csv('your_data.csv')
df = df.melt(id_vars=['timestamp'], var_name='player_id', value_name='speed_kmh')
场景2:数据是坐标(X, Y),需要先算速度 如果你的数据只有坐标,没有速度,可以在脚本前面加一步:
# 假设有 x, y 列
df['dist'] = np.sqrt(df.groupby('player_id')['x'].diff()**2 + df.groupby('player_id')['y'].diff()**2)
df['speed_kmh'] = df['dist'] / TIME_INTERVAL_SEC * 3.6 # 米/秒 -> km/h
场景3:对比的是“不同时间段”而非“不同人”
你可以把 player_id 替换为 period(如:上半场、下半场),逻辑完全一样。
进阶实用功能(可选添加)
如果你需要更专业的分析,可以在这个脚本基础上增加:
- 分档统计:不仅统计高速,还统计冲刺(>25 km/h)、中速跑。
- 区间对比:对比“比赛前15分钟” vs “比赛后15分钟”的高速跑动下降率。
- 输出Excel报告:使用
result.to_excel('report.xlsx')直接生成报告。
需要我帮你针对特定的数据格式(比如Catapult、StatSports导出的Excel)做定制修改吗? 你可以贴出你的数据列名,我帮你改好。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播