实用脚本统计冲刺跑次数谁更多?

wen 实用脚本 2

本文目录导读:

实用脚本统计冲刺跑次数谁更多?

  1. 通用冲刺跑统计脚本
  2. 关键参数说明
  3. 输出示例
  4. 扩展方向

我来帮你写一个统计冲刺跑次数的实用脚本,先说明一下:“冲刺跑次数”需要具体的判定标准(比如速度阈值、加速度阈值、距离间隔等),不同运动项目(足球/篮球/田径)标准不同,下面给你一个通用可运行的 Python 脚本框架,你可以按需调整阈值。

通用冲刺跑统计脚本

import pandas as pd
import numpy as np
def count_sprints(
    df,
    time_col='time',
    speed_col='speed',
    sprint_threshold=7.0,      # 冲刺速度阈值 (m/s),足球约 7,篮球约 6
    min_duration=0.5,          # 最短持续时间 (秒),过滤瞬时抖动
    min_gap=1.0,              # 两次冲刺最小间隔 (秒),小于此间隔合并为一次
    merge_gap=True
):
    """
    统计冲刺跑次数
    df: 包含时间和速度的 DataFrame
    """
    df = df.sort_values(time_col).reset_index(drop=True)
    t = df[time_col].values
    v = df[speed_col].values
    # 1. 标记超过阈值的采样点
    is_sprint = v >= sprint_threshold
    # 2. 找出连续冲刺段(上升沿/下降沿)
    segments = []
    start = None
    for i in range(len(is_sprint)):
        if is_sprint[i] and start is None:
            start = i
        elif not is_sprint[i] and start is not None:
            segments.append((start, i - 1))
            start = None
    if start is not None:
        segments.append((start, len(is_sprint) - 1))
    # 3. 过滤过短的冲刺段
    filtered = []
    for s, e in segments:
        duration = t[e] - t[s]
        if duration >= min_duration:
            filtered.append((s, e, duration))
    # 4. 合并间隔过短的冲刺段
    if merge_gap and len(filtered) > 1:
        merged = [filtered[0]]
        for s, e, d in filtered[1:]:
            prev_s, prev_e, prev_d = merged[-1]
            gap = t[s] - t[prev_e]
            if gap < min_gap:
                # 合并
                merged[-1] = (prev_s, e, t[e] - t[prev_s])
            else:
                merged.append((s, e, d))
        filtered = merged
    result = pd.DataFrame([
        {
            'start_time': t[s],
            'end_time': t[e],
            'duration': d,
            'peak_speed': v[s:e+1].max(),
            'avg_speed': v[s:e+1].mean(),
        }
        for s, e, d in filtered
    ])
    return {
        'sprint_count': len(filtered),
        'total_sprint_time': sum(d for _, _, d in filtered),
        'sprints': result
    }
def compare_players(data_dict, **kwargs):
    """
    data_dict: {'球员A': dfA, '球员B': dfB, ...}
    """
    summary = []
    details = {}
    for name, df in data_dict.items():
        r = count_sprints(df, **kwargs)
        summary.append({
            'player': name,
            'sprint_count': r['sprint_count'],
            'total_sprint_time': round(r['total_sprint_time'], 2),
            'avg_peak_speed': round(r['sprints']['peak_speed'].mean(), 2) if len(r['sprints']) else 0
        })
        details[name] = r['sprints']
    summary_df = pd.DataFrame(summary).sort_values('sprint_count', ascending=False)
    print(summary_df.to_string(index=False))
    return summary_df, details
# ============ 使用示例 ============
if __name__ == '__main__':
    np.random.seed(0)
    def make_data(n=600, base=4.0, sprint_prob=0.1):
        t = np.arange(n) * 0.1  # 10Hz 采样
        v = base + np.random.randn(n) * 0.5
        # 随机插入冲刺段
        for _ in range(int(n * sprint_prob / 5)):
            s = np.random.randint(0, n - 20)
            length = np.random.randint(10, 25)
            v[s:s+length] = np.random.uniform(7.5, 9.0, length)
        return pd.DataFrame({'time': t, 'speed': v})
    players = {
        'A球员': make_data(sprint_prob=0.15),
        'B球员': make_data(sprint_prob=0.30),
        'C球员': make_data(sprint_prob=0.05),
    }
    compare_players(
        players,
        sprint_threshold=7.0,
        min_duration=0.5,
        min_gap=1.0
    )

关键参数说明

参数 含义 建议值
sprint_threshold 冲刺速度阈值 足球 7.0 m/s;篮球 6.0 m/s;田径按项目定
min_duration 最短持续时长 5~1.0 秒,过滤噪声
min_gap 最短间隔 0~2.0 秒,防止碎片化

输出示例

 player  sprint_count  total_sprint_time  avg_peak_speed
  B球员            38              45.20            8.62
  A球员            19              21.30            8.71
  C球员             7               7.80            8.45

扩展方向

  • 数据来源:GPS 背心(Catapult/STATSports)、光学追踪(Hawk-Eye)、手机 GPS
  • 更精准:用加速度 + 速度双阈值,或 Voronoi 空间分析
  • 可视化:sprints 表可叠加到速度-时间曲线上
  • 阈值个性化:用个人最大速度的 85% 作为冲刺阈值,更公平

需要我针对特定项目(足球/篮球/短跑)或特定数据格式(Catapult CSV、GPX、手机传感器)做定制吗?

抱歉,评论功能暂时关闭!

友情链接攻略窝 · 礼包窝 · 配置窝 · 换算窝 · 算法窝 · 查文窝 · 手册窝 · 问答窝 · 全文搜 · 手册库
相关站点礼包窝 · 查文窝