2017-11-03 4 views
0

いくつかの信号がバックグラウンドレベルを下回っているかどうかを判断するとき、私はパンダは真/偽行のIDmaxをローリングしていますか?

sig bg is_below 
5 3 False 
5 3 False 
5 3 False 
2 3 True # "False positive" 
4 3 False 
4 3 False 
0 3 True # Signal is dead and not returning from this point onwards 
0 3 True 
0 3 True 
0 3 True 
0 3 True 

例えばので、真/偽の列にスコアを維持しています。しかし、私が示してきたように、ノイズが時々「偽陽性」を生成することができ、データをスムーズにしても、小さなデータが過度に広がることなく、大きなスパイクが除去されるわけではありません。私は適切な数学的方法があると確信していますが、おそらくそれは仕事と計算効率の面で過度なものになるでしょう。

代わりに、最初のTrueのインデックスを確認するには、Trueが表示されます。 3回連続して?

答えて

1

さて、True/Falseは1/0と同様に簡単に解釈できるため、ローリングメジアン(例: [0, 0, 1, 1, 1]の中央値は、行の3 Trueを返す最小ウィンドウであるよう

scipy.signal.medfilt(df["is_below"], kernel_size = 5).argmax() 

は、[False, False, True, True, True]に遭遇する最初の時間の指標を返します。

さらに良い方法があるかどうかはわかりませんが、自分のtimeseriesに100ポイントのデータポイントがあることを考えれば、返されたargmaxインデックスはアプリケーションにとって十分正確です。

1

あなたのデータはパンダのデータフレームである場合(dfと呼ばれると言う)は、行と前の2つの行がdf.is_belowに真のある唯一の各行でTrueあるブール変数bを作成することによってそれを行うことができます。ここで

b = ((df.is_below == True) & (df.is_below.shift(-1) == True) & (df.is_below.shift(-2) == True)) 

は、df.is_below.shift(-1)バック1によって全体のデータフレームをシフトので、私たちは前の行を見ている(と同様にshift(-2)のために前の行の前の行を見て)。以下

全コード:

import pandas as pd 

# Create dataframe 
df = pd.DataFrame() 
sig = [5, 5, 5, 2, 4, 4, 0, 0, 0, 0, 0] 
df['sig'] = sig 
df['bg'] = [3] * len(sig) 
df['is_below'] = df.sig < df.bg 

# Find index of first consecutive three True in df.is_below 
b = ((df.is_below == True) & (df.is_below.shift(-1) == True) & (df.is_below.shift(-2) == True)) 
idx = df.index[b][0] # first index where three Trues are in a row