如何识别含噪声时序数据中低数值低噪声时段的起止索引
可以通过「数值阈值+波动阈值」的双条件滑动窗口判定来提取目标时段,具体实现如下:
- 首先设定两个判定规则:
- 滑动窗口内的数值均值低于提前设定的数值阈值,筛选出低数值区间
- 滑动窗口内的数值标准差低于提前设定的波动阈值,筛选出低噪声区间
- 对所有符合条件的连续位置做合并,即可得到目标时段的起止索引
完整实现代码:
import numpy as np import pandas as pd # 测试用输入数据 arr = np.array([8,9,7,3,6,3,2,1,2,3,1,2,3,2,2,3,2,2,5,7,8,9,15,20,21]) # 滑动窗口大小,可根据实际噪声情况调整,这里取3适配1分钟间隔的采样 window_size = 3 # 数值阈值:低于该值判定为低数值,可根据实际业务场景调整 mean_threshold = 4 # 波动阈值:低于该值判定为低噪声,可根据实际数据噪声水平调整 std_threshold = 2 # 计算滑动窗口的均值和标准差 series = pd.Series(arr) rolling_mean = series.rolling(window=window_size, center=True).mean() rolling_std = series.rolling(window=window_size, center=True).std() # 标记符合双条件的位置 valid_mask = (rolling_mean < mean_threshold) & (rolling_std < std_threshold) # 提取连续符合条件的区间起止索引 valid_index = np.where(valid_mask)[0] if len(valid_index) == 0: print("未找到符合条件的时段") else: # 定位连续区间的断点 breaks = np.diff(valid_index) > 1 start_indices = np.insert(valid_index[1:][breaks], 0, valid_index[0]) end_indices = np.append(valid_index[:-1][breaks], valid_index[-1]) # 输出结果 for idx, (start, end) in enumerate(zip(start_indices, end_indices)): print(f"低数值低噪声时段{idx+1}:起始索引{start},结束索引{end}")
针对你提供的测试数据,运行后输出结果为:低数值低噪声时段1:起始索引6,结束索引17
如果是实际的全天分钟级数据,只需要调整三个参数(窗口大小、数值阈值、波动阈值)适配你的数据特征即可。
内容的提问来源于stack exchange,提问作者ManInMoon
相关产品推荐
相关产品推荐

