我有一个用于快速傅立叶变换的信号的DataFrame。

频率的一列以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


问题是,随着频率增加到50000Hz,我的信号下降几个数量级(最多减小10000倍)。因此,我无法使用仅输出3个标准偏差以上的值的函数,因为我只会从前50 Hz处拾取“峰值”离群值。

有没有一种方法可以导出数据框中高于滚动平均值的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

关于python - 使用滚动标准偏差检测Pandas数据框中的异常值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46796265/

10-12 23:33