2017-10-17 44 views
0

我有一个用于快速傅立叶变换信号的DataFrame。使用滚动标准偏差检测Pandas数据框中的离群值

有一列频率为Hz,另一列为相应的幅度。

我读过几年前发布的一篇文章,您可以使用简单的布尔函数来排除或仅包含最终数据框中高于或低于几个标准偏差的异常值。

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 

的问题是,我的信号下降几个数量级(最多小10 000倍),其频率的增加可达50 000Hz。因此,我无法使用仅输出高于3个标准差的值的函数,因为我只会从前50赫兹中挑选出“峰值”异常值。

有没有一种方法可以在我的数据框中导出超出滚动平均值的3个滚动标准偏差的异常值?

+0

所以我想在导出之前将所有过滤的值(大于我的平均值+ 3SD)添加到我的数据框中的另一列中。现在他们只显示为真或假,从'N1 ['Peaks'] =(N1 ['Cell 1-1']> N1 ['Filter'])'有没有办法得到数字呢?单元格1-1和过滤器只是我的数据和过滤器的值。 – Jack

回答

0

这可能是一个很好的例子。基本上,您将现有数据与滚动平均值加上三个标准偏差的新列进行比较,滚动平均值也是如此。

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是正确的,否则是从other