【发布时间】:2019-03-14 08:50:42
【问题描述】:
我有一个带有一些异常值的图(错误的测量值):
基础数据还是不错的。我只想删除与“当前平均值”相差太远的所有内容。我尝试使用pd.rolling().mean(),但没有令人满意的结果:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
data = np.genfromtxt('shard_height_plot.csv', delimiter = ',')
df = pd.DataFrame(data)
df.set_index(0, inplace = True)
df2 = df.rolling(20).mean()
plt.plot(df)
plt.plot(df2)
plt.show()
我试图在网上搜索一个好的解决方案,但找不到。删除数据点应该不难,跳过屋顶,不是吗?
编辑: 数据文件可以在这里下载:https://ufile.io/pviuc
编辑2:
我通过改进数据集创建解决了异常值过多的问题。
它的核心:
if abs(D - D_List[-2]) > 30:
D = D_List[-2]
D_List.pop()
D_List.append(D)
基本上,它的作用是检查值的变化是否大于 30,如果是,则删除最后一个值并用倒数第二个替换 is。不是很壮观,但正是我需要的。我使用了其中一个答案,因为它更漂亮。非常感谢你们。
【问题讨论】:
-
什么将一个点定义为“离当前平均值太远”?
-
你有数据可以下载吗?
-
滚动平均值不是您想要的。平均值会受到异常值的影响,从图中可以看出,窗口大小可以改变特征的位置,如峰。您希望对数据进行更多过滤。中值过滤器似乎可以很好地工作。
-
我添加了数据集的下载链接。离得太远可能意味着与数据集中最后一个值的差异大于 10。
-
我同意中值过滤器会更好。您也可以尝试使用低通滤波器。
标签: python pandas numpy matplotlib