我在现场有很多测量水压的传感器。在过去,这些传感器的高度已经改变了很多次,在时间序列中产生了跳跃。由于这些时间序列是连续的并且我有一个手动测量,我应该在技术上能够移除跳跃(手动这很容易,但是测量太多所以我需要在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'。
我还试图手动完成这项工作,并在一个简单的案例中使用它,但在任何其他情况下都不是很好。知道如何过滤掉跳跃吗?
下图中显示了一个示例(黄色表示跳跃,红色表示手动测量(很可能此测量不在开头,因为在此示例中))
答案 0 :(得分:2)
您的数据中有尖锐的峰值和步骤。我想你想要
这与你在your last comment中所说的一致。请注意,这将改变(转移)数据的大部分内容!
识别数据的宽度,峰值和步长是数据中的一个像素,这一点非常重要。你也可以独立处理这两种效果。
我建议首先删除峰值,然后删除步骤。
通过计算前一个和下一个数据值的绝对差值来移除峰值,然后取两者的最小值,即如果您的数据系列为y(i)
计算p(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))
并查找高于特定阈值的值。这些位置是步骤位置。创建一个相同大小的零值偏移数组,然后插入数据点的差异(没有绝对值),然后形成累积和,并从原始数据中减去结果,以删除步骤。
请注意,这会删除上升和下降的峰值和步数。如果您只想删除一种,请不要采用绝对值。
答案 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)