Python 删除时间序列中的跳跃(如峰值和步长)
我有相当多的传感器在现场测量水压。在过去,这些传感器的高度已经改变了好几次,在时间序列中产生了跳跃。由于这些时间序列是连续的,并且我有一个手动测量,所以从技术上讲,我应该能够删除跳转(手动操作很容易,但是测量太多了,所以我需要用python来完成) 我试着用中值滤波器去除跳跃,但这并不奏效 我的代码:Python 删除时间序列中的跳跃(如峰值和步长),python,signal-processing,Python,Signal Processing,我有相当多的传感器在现场测量水压。在过去,这些传感器的高度已经改变了好几次,在时间序列中产生了跳跃。由于这些时间序列是连续的,并且我有一个手动测量,所以从技术上讲,我应该能够删除跳转(手动操作很容易,但是测量太多了,所以我需要用python来完成) 我试着用中值滤波器去除跳跃,但这并不奏效 我的代码: # filter out noise in signal (peaks) minimumPeak = 0.03 # filter peaks larger than 0.03m
# 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]
数据是包含两列的dataframe:“datetime”和“value”
我也尝试过手动操作,并在一个简单的情况下运行,但在其他任何情况下都不太好。你知道我该如何过滤掉这些跳跃吗
下图显示了一个示例(黄色表示跳跃,红色表示手动测量(很可能该测量不是在本示例中的开始))
您的数据中有尖峰和台阶。我想你想
- 去除峰值并用一些平均值替换
- 通过累计更改剩余数据值的偏移量来删除这些步骤
y(i)
computep(i)=min(abs(y(i)-y(i-1)),abs(y(i+1)-y(i))
。高于阈值的所有值都是峰值。取它们并用上一个和下一个像素的平均值替换数据值s(i)=abs(y(i)-y(i-1))
再次删除这些步骤,并查找高于特定阈值的值。这些位置是步进位置。创建一个大小相同的零值偏移数组,然后插入数据点的差值(不含绝对值),然后形成累积和,并从原始数据中减去结果以删除步骤请注意,这将消除上升和下降的峰值和台阶。如果您只想删除一种类型,请不要使用绝对值。您可以这样尝试:
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)
似乎你的跳跃与非常高的值变化有关。为什么不检查两个连续值之间的差值模块是否超过某个阈值?有两种不同类型的跳跃:尖峰和阶梯。我不明白你想对这些步骤做什么,例如最后一次突出显示的跳转。删除步骤后,数据应该是什么样子?你是想通过偏移数据来删除步骤,还是希望以某种方式对其进行过滤?@Michael,当OP在解释为什么要“删除跳跃”时,将他的时间序列数据描述为“连续的”我认为可以公平地说OP希望在跳跃过程中插入值。换句话说,OP希望这些跳转被替换为给定函数行为在跳转起点左侧和跳转终点右侧合理呈现的值。感谢您的响应。阿雷托和弗拉迪斯劳·马丁都是正确的。数据应该是连续的,为了解决这个问题,我寻找导数高于某个值(dh/dt>maxValue)。在这些位置,我从该位置及其后面的所有值中减去该dh(峰值/跳变)。我这样做,一个峰接一个峰向两端,这将导致一个平滑的线再次。我把它用于一个简单的案例,但不知怎么的,它无法用于更困难的案例。