去除时间序列中的峰值和台阶之类的跳跃
问题描述
我在野外有相当多的传感器可以测量水压。在过去,这些传感器的高度已经改变了好几次,造成了时间序列中的跳跃。因为这些时间序列是连续的,并且我有一个手动测量,所以从技术上讲我应该能够删除跳转(手动这很容易,但是测量太多了,所以我需要用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))
并查找高于某个阈值的值。这些位置是阶梯位置。创建一个相同大小的零值偏移量数组,然后插入数据点的差值(不带绝对值),然后形成累计和并从原始数据中减去结果以删除步骤。
相关文章