Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 删除时间序列中的跳跃(如峰值和步长)_Python_Signal Processing - Fatal编程技术网

Python 删除时间序列中的跳跃(如峰值和步长)

Python 删除时间序列中的跳跃(如峰值和步长),python,signal-processing,Python,Signal Processing,我有相当多的传感器在现场测量水压。在过去,这些传感器的高度已经改变了好几次,在时间序列中产生了跳跃。由于这些时间序列是连续的,并且我有一个手动测量,所以从技术上讲,我应该能够删除跳转(手动操作很容易,但是测量太多了,所以我需要用python来完成) 我试着用中值滤波器去除跳跃,但这并不奏效 我的代码: # filter out noise in signal (peaks) minimumPeak = 0.03 # filter peaks larger than 0.03m

我有相当多的传感器在现场测量水压。在过去,这些传感器的高度已经改变了好几次,在时间序列中产生了跳跃。由于这些时间序列是连续的,并且我有一个手动测量,所以从技术上讲,我应该能够删除跳转(手动操作很容易,但是测量太多了,所以我需要用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]
数据是包含两列的dataframe:“datetime”和“value”

我也尝试过手动操作,并在一个简单的情况下运行,但在其他任何情况下都不太好。你知道我该如何过滤掉这些跳跃吗

下图显示了一个示例(黄色表示跳跃,红色表示手动测量(很可能该测量不是在本示例中的开始))


您的数据中有尖峰和台阶。我想你想

  • 去除峰值并用一些平均值替换
  • 通过累计更改剩余数据值的偏移量来删除这些步骤
这与你在报告中所说的一致。请注意,这将改变(转移)你的大部分数据

必须认识到,峰值和步长的宽度都是数据中的一个像素。此外,您还可以非常独立地处理这两种效果

我建议先去掉峰,然后去掉台阶

  • 通过计算上一个数据值和下一个数据值的绝对差值来消除峰值,然后取两者的最小值,即如果您的数据系列是
    y(i)
    compute
    p(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(峰值/跳变)。我这样做,一个峰接一个峰向两端,这将导致一个平滑的线再次。我把它用于一个简单的案例,但不知怎么的,它无法用于更困难的案例。