2017-10-17 10 views
0

高速フーリエ変換信号用のDataFrameがあります。ローリング標準偏差を使用してPandasデータフレームの異常値を検出する

周波数はHzで1列あり、対応する振幅で1列あります。

私は2,3年前に書かれたポストを読みました。単純なブール関数を使用して、いくつかの標準偏差よりも上または下の最終データフレーム内のアウトライアを除外することができます。

df = pd.DataFrame({'Data':np.random.normal(size=200)}) # example dataset of normally distributed data. 
df[~(np.abs(df.Data-df.Data.mean())>(3*df.Data.std()))] # or if you prefer the other way around 

問題は、周波数が50,000Hzまで増加すると、私の信号がいくつかの大きさ(最大10,000倍小さくなります)になります。したがって、私は最初の50Hzから "ピーク"の外れ値だけを取り上げるので、3標準偏差以上の値をエクスポートする関数は使用できません。

ローリング平均の3つのローリング標準偏差を超える外れ値をデータフレームにエクスポートする方法はありますか?

+0

私はエクスポートする前に、私のデータフレームの別の列に(平均+ 3SDより大きい)フィルタリングされたすべての値を追加しようとしています。 N1 ['Peaks'] =(N1 ['Cell 1-1']> N1 ['Filter']) '代わりに数字を得る方法はありますか? Cell 1-1とFilterの列は、自分のデータとフィルタの値です。 – Jack

答えて

0

これは、簡単な例を用いて最もよく説明されています。基本的には、既存のデータとローリング平均と3つの標準偏差である新しい列とを順番に比較しています。

import pandas as pd 
import numpy as np 
np.random.seed(123) 
df = pd.DataFrame({'Data':np.random.normal(size=200)}) 

# Create a few outliers (3 of them, at index locations 10, 55, 80) 
df.iloc[[10, 55, 80]] = 40.  

r = df.rolling(window=20) # Create a rolling object (no computation yet) 
mps = r.mean() + 3. * r.std() # Combine a mean and stdev on that object 

print(df[df.Data > mps.Data]) # Boolean filter 
#  Data 
# 55 40.0 
# 80 40.0 

他所のNaNと、だけ外れ値に新しい列フィルタを追加する

df['Peaks'] = df['Data'].where(df.Data > mps.Data, np.nan) 

print(df.iloc[50:60]) 
     Data Peaks 
50 -1.29409 NaN 
51 -1.03879 NaN 
52 1.74371 NaN 
53 -0.79806 NaN 
54 0.02968 NaN 
55 40.00000 40.0 
56 0.89071 NaN 
57 1.75489 NaN 
58 1.49564 NaN 
59 1.06939 NaN 

ここ.where戻り

同じ形状のオブジェクトself、その対応するエントリ あるとしてselfからcondがTrueの場合はotherです。