这个python案例显示心率波动反映强度?

wen python案例 2

用 Python 可视化心率波动反映运动强度

下面这个案例演示:通过心率时间序列的波动幅度,来判断运动强度,核心思路是——心率越高、波动越大,通常意味着强度越高。

这个python案例显示心率波动反映强度?

完整代码示例

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import find_peaks
# 1. 模拟一段运动心率数据(单位:bpm)
np.random.seed(42)
duration = 300           # 300 秒
t = np.arange(duration)
# 模拟不同阶段:
# 0-60s 热身、60-180s 中高强度、180-240s 冲刺、240-300s 恢复
hr = np.zeros(duration)
hr[:60]   = 90  + 3*np.sin(t[:60]/5)     + np.random.randn(60)*1.5
hr[60:180]= 140 + 6*np.sin(t[60:180]/4)  + np.random.randn(120)*2.5
hr[180:240]= 175 + 10*np.sin(t[180:240]/3)+ np.random.randn(60)*4
hr[240:]  = 110 + 4*np.sin(t[240:]/6)    + np.random.randn(60)*2
# 2. 滑动窗口计算波动指标(标准差 + 峰峰值)
win = 15
rolling_std = np.array([hr[i:i+win].std() for i in range(duration-win+1)])
rolling_pp  = np.array([hr[i:i+win].ptp() for i in range(duration-win+1)])
mid_t = t[win//2 : duration-win//2+1][:len(rolling_std)]
# 3. 绘图
fig, axes = plt.subplots(2, 1, figsize=(11, 7), sharex=True)
axes[0].plot(t, hr, color='crimson', lw=1.5)
axes[0].axhline(hr.mean(), ls='--', color='gray', label=f'平均 {hr.mean():.0f} bpm')
axes[0].set_ylabel('心率 (bpm)')
axes[0].set_title('心率原始曲线:平台越高 → 强度越大')
axes[0].legend(); axes[0].grid(alpha=.3)
axes[1].plot(mid_t, rolling_std, color='navy', label='滑动标准差')
axes[1].plot(mid_t, rolling_pp,  color='orange', label='滑动峰峰值')
axes[1].set_xlabel('时间 (s)')
axes[1].set_ylabel('波动幅度')
axes[1].set_title('心率波动指标:波动越大 → 强度越高')
axes[1].legend(); axes[1].grid(alpha=.3)
plt.tight_layout()
plt.show()
# 4. 量化每个阶段的强度
stages = {'热身':(0,60),'中高强度':(60,180),'冲刺':(180,240),'恢复':(240,300)}
print(f"{'阶段':<8}{'均值':>8}{'标准差':>10}{'峰峰值':>10}")
for name,(a,b) in stages.items():
    seg = hr[a:b]
    print(f"{name:<8}{seg.mean():>8.1f}{seg.std():>10.2f}{seg.ptp():>10.1f}")

输出结果(示意)

阶段           均值      标准差      峰峰值
热身          90.0       2.34       9.0
中高强度      140.0      4.51      18.0
冲刺          175.0      6.32      28.0
恢复          110.0      3.10      12.0

为什么能反映强度?

指标 含义 与强度的关系
均值 整体心率水平 越高→心肺负荷越大
标准差 心率短时波动幅度 越大→交感神经越活跃,强度越高
峰峰值 窗口内最高-最低 越大→瞬时强度变化越剧烈

关键点说明

  1. 滑动窗口是关键:用 rolling_std 和 rolling_pp 把"波动"变成可量化的曲线,避免只看全局。
  2. scipy.signal.find_peaks(代码中已导入)可进一步用于检测心率尖峰个数 —— 冲刺阶段峰更多。
  3. 真实场景:可接入智能手表/心率带导出的 CSV,替换掉模拟的 hr 数组即可。
  4. HRV(心率变异性) 是更专业的指标:用相邻 R-R 间期的标准差衡量,越低说明强度越高、越疲劳。

心率均值反映"整体强度水平",心率波动(标准差/峰峰值)反映"强度的剧烈程度" —— 二者结合,就能用一条心率曲线判断运动阶段和强度变化。

需要我把它改成读取真实 CSV 数据的版本,或者加入 HRV 分析吗?

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