如何过滤掉那些异常值

信息处理 Python 低通滤波器 scipy
2022-02-08 02:52:40

我正在努力从加速度计中过滤一些数据。我需要在 python 中(而不仅仅是在收集数据的设备上)来修复我拥有的数据,这样我就可以构建一些分类算法

我有以下来自加速度计的 ROLL 数据(第一张图)。我尝试了以下方法:

  • 使用 winsorize 变换异常值(第二张图)
  • 然后,使用巴特沃斯过滤器过滤数据(第三张图)

原始,转换和过滤

问题是 Winsorization 技术在这里不适合我的问题,它在顶部和底部为极值创建点,并在过滤后生成这些峰值。当这些异常值在给定的范围内时,它也没有考虑在内。

有人有解决方案来正确删除这些异常值吗?任何python函数?我很高兴完全删除那些异常值,而不是转换它们。以下是过滤后的梦想,预期输出:

理想世界

如果我关注 1 个异常值,我们可以看到以下内容(我的数据分布有点奇怪,我每隔几秒就有几秒钟): 放大时的数据

下面的jupyter笔记本

%pylab inline
warnings.filterwarnings("ignore",category=DeprecationWarning)
import pandas as pd, numpy as np        # Data manipulation 
import matplotlib.pyplot as plt
from scipy.stats.mstats import winsorize
import scipy.signal as signal

df=pd.DataFrame.from_csv("/tmp/file.csv")
df.reset_index(level=0, inplace=True)
df=df.iloc[2000:18000]

df_with_outliers_trimmed=df.copy()
df_with_outliers_trimmed["ROLL"]=winsorize(df_with_outliers_trimmed["ROLL"], limits=0.05)


df_filtered=df_with_outliers_trimmed.copy()
# design the Butterworth filter
N  = 1    # Filter order
Wn = 0.03 # Cutoff frequency
B, A = signal.butter(N, Wn, output='ba')
df_filtered["ROLL"] = signal.filtfilt(B,A, df_filtered["ROLL"])


x_axis='Date'
plt.rcParams["figure.figsize"] = (17,10)
fig1, (ax1,ax2,ax3) = plt.subplots(nrows=3, ncols=1)

xlim_start=min(df["Date"].iloc[0],df["Date"].iloc[0])
xlim_end=max(df["Date"].iloc[-1],df["Date"].iloc[-1])
# xlim_start=datetime.datetime(2018,7,3,12, 51)
# xlim_end=datetime.datetime(2018,7,3,12, 59)
xlim=[xlim_start,xlim_end]

ax1.plot(df[x_axis],df['ROLL'], 'r.')
ax1.set_ylabel("ROLL")
ax2.plot(df_with_outliers_trimmed[x_axis],df_with_outliers_trimmed['ROLL'], 'r.')
ax2.set_ylabel("ROLL with outliers trimmed")
ax3.plot(df_filtered[x_axis],df_filtered['ROLL'], 'r.')
ax3.set_ylabel("ROLL filtered")
ax1.set_xlim(xlim)
ax2.set_xlim(xlim)
ax3.set_xlim(xlim)

csv 文件: https ://file.io/yqf3ei

1个回答

您是否尝试过仅对数据进行中值过滤这就是我要尝试的第一步。Winsorizing 确实不适用于均值变化的数据集。

看起来python必须scipy.signal.medilt执行此操作。