【问题标题】:Detecting outliers in a Pandas dataframe using a rolling standard deviation使用滚动标准差检测 Pandas 数据框中的异常值
【发布时间】:2018-03-29 12:09:19
【问题描述】:

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

有一列以赫兹为单位表示频率,另一列表示相应的幅度。

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

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 倍)。因此,我无法使用仅导出高于 3 个标准差的值的函数,因为我只会从前 50 Hz 中提取“峰值”异常值。

有没有办法可以在我的数据框中导出高于滚动平均值的 3 个滚动标准差的异常值?

【问题讨论】:

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

标签: python pandas dataframe standard-deviation outliers


【解决方案1】:

这可能最好用一个简单的例子来说明。基本上,您是将现有数据与滚动平均值加上三个标准差的新列进行比较,也是滚动的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 2018-12-03
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    相关资源
    最近更新 更多