删除时间序列中的峰值和步骤等跳跃

时间:2017-01-25 17:23:34

标签: python signal-processing

我在现场有很多测量水压的传感器。在过去,这些传感器的高度已经改变了很多次,在时间序列中产生了跳跃。由于这些时间序列是连续的并且我有一个手动测量,我应该在技术上能够移除跳跃(手动这很容易,但是测量太多所以我需要在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'。

我还试图手动完成这项工作,并在一个简单的案例中使用它,但在任何其他情况下都不是很好。知道如何过滤掉跳跃吗?

下图中显示了一个示例(黄色表示跳跃,红色表示手动测量(很可能此测量不在开头,因为在此示例中))

Time series with jumps

2 个答案:

答案 0 :(得分:2)

您的数据中有尖锐的峰值和步骤。我想你想要

  • 删除峰值并替换为某些平均值
  • 通过累积更改剩余数据值的偏移来删除步骤

这与你在your last comment中所说的一致。请注意,这将改变(转移)数据的大部分内容!

识别数据的宽度,峰值和步长是数据中的一个像素,这一点非常重要。你也可以独立处理这两种效果。

我建议首先删除峰值,然后删除步骤。

  1. 通过计算前一个和下一个数据值的绝对差值来移除峰值,然后取两者的最小值,即如果您的数据系列为y(i)计算p(i)=min(abs(y(i)-y(i-1)), abs(y(i+1)-y(i)))。高于阈值的所有值都是峰值。取出它们并用前一个和下一个像素的平均值替换数据值,如。

  2. 现在再次删除这些步骤,方法是查找连续值的绝对差异(如comment by AreTor中所述),s(i)=abs(y(i)-y(i-1))并查找高于特定阈值的值。这些位置是步骤位置。创建一个相同大小的零值偏移数组,然后插入数据点的差异(没有绝对值),然后形成累积和,并从原始数据中减去结果,以删除步骤。

    < / LI>

    请注意,这会删除上升和下降的峰值和步数。如果您只想删除一种,请不要采用绝对值。

答案 1 :(得分:0)

你可以这样试试:

import numpy as np
import matplotlib.pyplot as plt
import h5py
%matplotlib inline

# I'm not sure that you need all of this packedges

filepath = 'measurment.hdf5'

with h5py.File(filepath, 'r') as hdf:
    data_y = hdf['y'][:]
    data_x = hdf['x'][:]

data = data_y

delta_max = 1 # maximum difference in y between two points
delta = 0 # running correction value
data_cor = [] # corrected array
data_cor.append(data[0:1]) # we append two first points

for i in range(len(data_x)-2): # two first points are allready appended
    i += 2
    delta_i = data[i] - data[i-1]
    if np.abs(delta_i) > delta_max:
        delta += (delta_i - (data_cor[i-1] - data_cor[i-2]))
        data_cor.append(data[i]-delta)
    else:
        data_cor.append(data[i]-delta)

plt.plot(data_x, data_cor)