本文目录导读:

“综合实用脚本,高速跑动距离对比”这个需求,通常出现在体育数据分析(如足球、篮球)、游戏角色测试或运动训练场景中,由于你没有提供具体的数据格式和运行环境,我为你准备了一个通用性极强的 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)做定制修改吗? 你可以贴出你的数据列名,我帮你改好。