如何将已计算局部极值的数据集处理为平滑阶梯曲线?
实现思路说明
第一步 修正极值预处理逻辑
你之前将极值列空值填充为0的操作会干扰阶梯值的连续填充,首先调整原代码去掉填充0的步骤,保留极值位置为原值、非极值位置为NaN的状态,原参考代码调整后如下:
import numpy as np from scipy.signal import argrelextrema n=10 df['min'] = df.iloc[argrelextrema(df.data.values, np.less_equal, order=n)[0]]['data'] df['max'] = df.iloc[argrelextrema(df.data.values, np.greater_equal, order=n)[0]]['data'] # 删掉原来的fillna(0)操作,保留空值标识非极值位置 df['min_max'] = df['min'].combine_first(df['max']) # 直接合并两列,非极值位置为NaN
第二步 生成有序极值序列
从min_max列中提取所有非空的极值点,连同对应的索引位置按升序排列,得到按顺序排列的有效极值列表:
- 过滤掉索引重合的重复极值点(同位置同时识别为最大最小值的小概率场景,可按业务规则保留其中一个)
第三步 生成阶梯曲线值
创建新的阶梯值列,按如下规则填充:
- 第一个有效极值点之前的所有行,统一赋值为第一个极值的值(也可按需替换为序列初始值、初始段均值等)
- 遍历有序极值列表,相邻两个极值点之间的所有行,统一赋值为前一个极值点的值
- 最后一个有效极值点之后的所有行,统一赋值为最后一个极值的值
假极值频繁跳变问题处理
可以按需组合使用以下过滤规则,减少噪声导致的无意义跳变:
- 差值过滤:设置最小波动阈值,相邻两个极值的差值小于阈值时,丢弃后一个极值点,不纳入阶梯序列
- 间隔过滤:设置最小间隔阈值,相邻两个极值的索引间隔小于阈值时,合并两个极值,仅保留更极端(更大/更小)的那个
- 极值强度校验:调整
argrelextrema的order参数,或者新增校验逻辑,仅保留比前后N个点的差值超过阈值的极值点,过滤假极值
内容的提问来源于stack exchange,提问作者user13079994
相关产品推荐
相关产品推荐

