次のようなデータセットがあります (1D python リスト):
[0,0,0,0,4,5,6,6,4,0,0,0,0,0,0,2,0,0,0,6,4,5,6,0,0,0,0,0]
前のウィンドウに基づいて、バリエーションのカットオフ ポイントを見つけようとしています。
次の出力を探しています:
[4, 9, 19, 23]
ウィンドウが少なくとも 3 である必要があると仮定すると、変動は少なくとも 3 つの連続する要素とデータ内のノイズに対して発生する必要があります。
- 少なくとも 2 つの要素でウィンドウを埋める
- 標準偏差を計算し、stddev 内にある後続のすべてのポイントをそのウィンドウに追加します。新しいポイントを追加するたびに再計算します。
- ポイントが stddev の外側にある場合 (ここでは例として、4 の最初の出現)、次のポイントも stddev の外側にあることを確認し (5 の最初の出現)、そうであれば、最初の逸脱ポイント ( 4はこちら)。そうでない場合は、現在のウィンドウに追加し続けます。
- 新しい「逸脱」値は、比較対象のウィンドウになり、繰り返します。
これを行うためのより良い方法、または組み込みの numpy 関数はありますか?
ありがとう。
編集
@qwwqwwq によって提案された解決策はうまく機能しますが、別の小さな制約があります。リストの値が同じ重みを持っていないことに気付きました。この新しいデータセットを仮定すると:
[(10, 0), (20, 0), (15, 0), (20, 0), (8, 4), (10, 5), (15, 6), (15, 6), (10, 4), (5, 0),(5, 0), (20, 0), (10, 0), (8, 0),(5, 0), (10, 2), (5, 0), (5, 0), (5,0), (10,6) ,(5, 4), (5,5), (10, 6), (10, 0),(10,0) ,(10,0) ,(10,0) ,(10,0)]
- pos 0 は秒単位の期間です
- pos 1 は私の値です
- ピークを考慮する最小時間は 30 秒です
widths = np.array([2]
最小時間に置き換えるにはどうすればよいですか?
を取りslope_down_begin_points
、最も近いものslope_down_begin_points
を確認し、2 つの間のポイントの持続時間の合計が > 最小時間であるかどうかを確認できます。私は にあまり詳しくありませんsignal
。うまくいけば、もっと良いものがありますか?
編集 2
これを行うもう 1 つの単純で素朴な方法は、>0 の値をグループ化し、[0] と [-1] の値をエッジとして切り出すことです。
for k, g in groupby(x, key=lambda v: v[1] == 0):
print k,g
group = list(g)
# only consider if long enough
if sum([z[0] for z in group]) > some_minumum_time:
# do stuff