使用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
相关产品推荐
相关产品推荐

