如何检测传感器数据上升趋势并处理数值溢出问题
带回绕的传感器时序数据上升趋势检测
传感器数据达到最大值(如255)后会回绕归零,常规趋势检测会误判这种回绕为下降,我们可以通过数据转换消除回绕影响,再用常规方法判断上升趋势。
核心思路
当相邻两个数据的差值为负且绝对值超过溢出阈值的一半(255/2≈127)时,判定为发生了回绕,给后续数据加上溢出阈值+1(即256)的偏移量,将回绕后的数值转换为连续递增的虚拟值,再基于转换后的数据检测趋势。
实现步骤
1. 预处理数据,消除回绕影响
遍历原始时序数据,维护一个偏移量:
- 初始偏移量为0
- 若当前值与前一个原始值的差为负,且差值的绝对值 > 溢出阈值/2,说明发生回绕,偏移量 += 溢出阈值+1
- 当前值的虚拟值 = 原始值 + 偏移量
2. 检测上升趋势
对转换后的虚拟值序列,可通过两种简单方法判断:
- 统计相邻虚拟值的差值为正的比例(若比例接近1,说明整体上升)
- 用线性回归计算斜率(斜率为正则呈上升趋势)
代码实现(Python)
def process_overflow_data(raw_data, overflow_threshold=255): offset = 0 processed = [] prev_raw = raw_data[0] processed.append(prev_raw + offset) for curr_raw in raw_data[1:]: diff = curr_raw - prev_raw if diff < 0 and abs(diff) > overflow_threshold / 2: offset += overflow_threshold + 1 processed.append(curr_raw + offset) prev_raw = curr_raw return processed def is_upward_trend(processed_data): # 统计正差值比例,比例超过0.8则判定为上升趋势(可按需调整阈值) positive_diff_count = 0 total = len(processed_data) - 1 for i in range(total): if processed_data[i+1] > processed_data[i]: positive_diff_count += 1 return positive_diff_count / total > 0.8 # 测试示例数据 data1 = [191, 198, 204, 217, 230, 241, 255, 17, 32, 67, 90, 117] processed1 = process_overflow_data(data1) print(f"示例1处理后数据: {processed1}") print(f"示例1是否上升趋势: {is_upward_trend(processed1)}") data2 = [113, 182, 201, 9, 74, 91, 148, 182, 231, 41, 72, 100] processed2 = process_overflow_data(data2) print(f"示例2处理后数据: {processed2}") print(f"示例2是否上升趋势: {is_upward_trend(processed2)}")
结果说明
- 示例1处理后数据:
[191, 198, 204, 217, 230, 241, 255, 273, 288, 323, 346, 373],所有相邻差值均为正,判定为上升趋势。 - 示例2处理后数据:
[113, 182, 201, 265, 330, 347, 404, 438, 487, 553, 584, 612],所有相邻差值均为正,判定为上升趋势。
内容的提问来源于stack exchange,提问作者Jokubas11
相关产品推荐
相关产品推荐

