本文目录导读:

我来帮你写一个统计冲刺跑次数的实用脚本,先说明一下:“冲刺跑次数”需要具体的判定标准(比如速度阈值、加速度阈值、距离间隔等),不同运动项目(足球/篮球/田径)标准不同,下面给你一个通用可运行的 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、手机传感器)做定制吗?
版权声明: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直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播