我有一个用于快速傅立叶变换信号的数据帧。
一列表示以 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
问题是,当频率增加到 50 000 Hz 时,我的信号会下降几个数量级(最多小 10 000 倍)。因此,我无法使用仅导出高于 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
Here .where https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.where.html回报
与形状相同的物体self
其对应的条目是
从self
where cond
为 True,否则来自other
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)