2017-01-25 4 views
1

私は、水圧を測定するセンサーが非常に数多くあります。過去には、これらのセンサーの高さがかなり変わってきており、時系列表示でジャンプが発生していました。これらの時系列は連続的で手動測定があるので、私は技術的にジャンプを取り除くことができるはずです(手でこれは簡単ですが、あまりにも多くの測定値があるので私はそれを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] 

データは、2つの列を含むパンダのデータフレームです。

私はまたこれを手動でやろうとしましたが、単純なケースではうまくいっていますが、それ以外はうまく機能しません。どのように私はジャンプをフィルターにかけるだろうか?例は下図に示されている

Time series with jumpsを(ジャンプを示す黄色、(この例にあるように、この測定は開始されていないことを非常によく可能)、手で測定を赤)

+0

。 2つの連続した値の差のモジュールが特定のしきい値を克服するかどうかをチェックしないでください。 – AreTor

+3

ジャンプには2つの異なるタイプがあります:ピークとシャープなピーク。私はあなたが最後に強調表示されたジャンプなどのステップについて何をしたいのか理解していません。ステップが削除された後、データはどのように見えるでしょうか? – Michael

+0

データをオフセットすることで手順を削除したいのですか、何らかの方法でフィルタを適用すると思いますか? –

答えて

1

データには鋭いピークと段差があります。私は、残りのデータ値のオフセット

を変更するとあなたが言ったことと一致していその累積によってステップを削除

  • 平均値でピークを削除し、いくつかによって置き換えるあなたは

    • にしたいと思いますyour last comment。これはデータの大きな部分を変更(シフト)することに注意してください。

      ピークとステップの両方の幅がデータの1ピクセルであることを認識することが重要です。また、両方のエフェクトをかなり独立して扱うこともできます。

      まず、ピークを除去し、ステップを削除することをお勧めします。

      1. データ系列がy(i)計算p(i)=min(abs(y(i)-y(i-1)), abs(y(i+1)-y(i)))、すなわち場合、その後、両方の最小値を取る前に、次のデータ値の絶対差を計算することによりピークを削除します。しきい値を超えるすべての値はピークです。それらを取り、データ値を前のピクセルと次のピクセルの平均と置き換えます。

      2. ここで、(comment by AreTorに示唆されているように)連続する値の絶対差を調べて、特定のしきい値を超える値を探します。位置はステップ位置です。同じサイズのゼロ値オフセット配列を作成し、データポイントの差異(絶対値なし)を挿入し、累積合計を作成し、元のデータから結果を差し引いてステップを削除します。

      これは、下降するだけでなく上昇するピークとステップを削除することに注意してください。 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) 
    
    関連する問題