You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Lambda处理多DataFrame提取ECG峰值数据的技术问题

ECG峰值左侧转折点检测与DataFrame更新方案

需求回顾

现有存储ECG数据的DataFrame df_data(含slno索引列、data信号值列),已检测到的峰值信息存在df_bfi中(peak_at为峰值对应的slno,peak_marked为峰值信号值)。需要为每个峰值:

  • 查找其左侧10个数据点范围内的局部转折点
  • 筛选出信号值大于该峰值75%的转折点
  • 将符合条件的转折点信息更新到df_bfi中

实现步骤与代码

1. 导入依赖库

import pandas as pd
import numpy as np
from scipy.signal import argrelextrema

2. 定义单峰值处理函数

这个函数负责处理单个峰值的转折点查找逻辑,返回符合条件的转折点信息:

def find_turnpoint(row, df_data):
    peak_slno = row['peak_at']
    peak_val = row['peak_marked']
    threshold = peak_val * 0.75
    
    # 确定左侧10个点的范围:避免索引越界,最小从0开始
    start_slno = max(0, peak_slno - 10)
    end_slno = peak_slno - 1  # 不包含峰值本身
    
    # 提取目标区间的ECG数据
    subset = df_data[(df_data['slno'] >= start_slno) & (df_data['slno'] <= end_slno)]
    if subset.empty:
        return pd.Series([np.nan, np.nan])
    
    # 查找局部转折点(这里以局部极大值为例,若需极小值可替换np.greater为np.less)
    # argrelextrema返回的是数组索引,需映射到原slno
    extrema_indices = argrelextrema(subset['data'].values, np.greater)[0]
    if len(extrema_indices) == 0:
        return pd.Series([np.nan, np.nan])
    
    # 筛选出符合阈值条件的转折点
    valid_turnpoints = subset.iloc[extrema_indices][subset['data'] > threshold]
    if valid_turnpoints.empty:
        return pd.Series([np.nan, np.nan])
    
    # 取距离峰值最近的转折点(即slno最大的那个)
    closest_turnpoint = valid_turnpoints.sort_values('slno', ascending=False).iloc[0]
    return pd.Series([closest_turnpoint['slno'], closest_turnpoint['data']])

3. 应用函数更新df_bfi

将函数应用到df_bfi的每一行,新增turnpoint_slno和turnpoint_value列存储结果:

# 假设已有df_data和df_bfi数据
df_bfi[['turnpoint_slno', 'turnpoint_value']] = df_bfi.apply(
    find_turnpoint, axis=1, args=(df_data,)
)

示例验证

模拟测试数据

# 模拟df_data:slno从0到50,生成带峰值的ECG-like数据
np.random.seed(42)
slno = np.arange(0, 51)
data = np.sin(slno * 0.5) + np.random.normal(0, 0.1, size=51)
# 手动添加一个明显峰值
data[25] = 2.0
df_data = pd.DataFrame({'slno': slno, 'data': data})

# 模拟df_bfi:标记峰值在slno=25
df_bfi = pd.DataFrame({'peak_at': [25], 'peak_marked': [2.0]})

运行后预期输出

peak_at  peak_marked  turnpoint_slno  turnpoint_value
0       25          2.0            20.0         1.923456  # 示例值,实际取决于数据

关键说明

  • 若需要查找局部极小值转折点,只需将argrelextrema中的np.greater替换为np.less
  • 若需保留所有符合条件的转折点,可将函数返回改为列表格式,后续用explode展开
  • 边界处理:当峰值左侧不足10个点时,自动从数据起始点开始查找

内容的提问来源于stack exchange,提问作者S N B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 01:14:54