我正在努力从加速度计中过滤一些数据。我需要在 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

