本文介绍了去除时间序列中的峰值和台阶之类的跳跃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在野外有相当多的传感器可以测量水压。在过去,这些传感器的高度已经改变了好几次,造成了时间序列中的跳跃。因为这些时间序列是连续的,并且我有一个手动测量,所以从技术上讲我应该能够删除跳转(手动这很容易,但是测量太多了,所以我需要用python进行测量)。
我已尝试使用过滤中值删除跳转,但没有真正起作用。
我的代码:
# filter out noise in signal (peaks)
minimumPeak = 0.03 # filter peaks larger than 0.03m
filtered_value = np.array(im.median_filter(data['value'], 5))
noise = np.array((filtered_value-data['value']).abs() > minimumPeak)
data.loc[noise, 'value'] = filtered_value[noise]
数据是包含两列的 pandas 数据框:"DateTime"和"Value"。
我也尝试过手动执行此操作,并在一个简单的情况下使其正常工作,但在任何其他情况下都不能很好地工作。你知道我该怎么用过滤把跳跃发出去吗?
下图显示了一个示例(黄色表示跳跃,红色表示手动测量(此测量很可能不是本例中的开始))
推荐答案
您的数据中有尖锐的峰值和阶跃。我猜你想
- 删除峰值并替换为一些平均值
- 通过累计更改剩余数据值的偏移量来删除步骤
这与您在your last comment中所说的一致。请注意,这将改变(移动)您的大部分数据!
认识到峰和台阶的宽度在您的数据中都是一个像素,这一点很重要。此外,您可以相当独立地处理这两种效果。我建议先移除峰值,然后再移除台阶。
通过计算上一个数据值和下一个数据值的绝对差值,然后取两者中的最小值来删除峰值,即如果您的数据系列是
/li>y(i)
COMPUTEp(i)=min(abs(y(i)-y(i-1)), abs(y(i+1)-y(i)))
。所有高于阈值的值都是峰值。取它们并将数据值替换为上一个和下一个像素的平均值,如。现在删除这些步骤,再次查找连续值的绝对差异(如comment by AreTor中所建议的),
s(i)=abs(y(i)-y(i-1))
并查找高于某个阈值的值。这些位置是阶梯位置。创建一个相同大小的零值偏移量数组,然后插入数据点的差值(不带绝对值),然后形成累计和并从原始数据中减去结果以删除步骤。
这篇关于去除时间序列中的峰值和台阶之类的跳跃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!