我的数据来自存储在时间序列中的传感器。
当我绘制它们时,我得到:
这些数据应该是“连续的”,例如温度,而上升和下降的速度不会那么快。
在网络上搜索了类似的问题后-我认为“平滑曲线”给了我更相关的结果-我使用this answer中提供的代码对数据应用了“卷积”。
我获得:
这令人不满意,因为我猜有些数据点只是“错误”,应删除而不是取平均值。
手工操作非常容易,因为我们可以猜测曲线:
这里是the data,并编写了第二张图表的代码:
def smooth(y, box_pts):
import numpy as np
box = np.ones(box_pts)/box_pts
return np.convolve(y, box, mode='same')
def load_data(f):
from datetime import datetime as dt
with open(f, "rt") as fd:
X = []
Y = []
for line in fd.readlines():
(x,y)=line.strip().split(" ")
X.append(dt.fromtimestamp(int(x)))
Y.append(float(y))
return (X, Y)
import sys
(X,Y) = load_data(sys.argv[1])
from matplotlib.pyplot import plot, show
plot(X, Y,'b-')
plot(X, smooth(Y,19), 'g-', lw=2)
show()
我正在寻找一种可以删除“不良”值的算法,知道吗?
答案 0 :(得分:0)
警告这是一种快速而肮脏的方法,而不是基于统计数据。查看您的数据,“坏”点与其余数据相比有很大不同。因此,如果您查看10个数据点数据块中的数据并获取其标准偏差,则“不良”数据的std应当比良好数据的std高得多,从而将其标记为要删除。 numpy提供了一种计算std here的快速方法。
for i in range(len(Y)):
std = np.std([ Y[i+j] for j in range(-5,5,1) if i+j >=0 and i+j <len(Y)])
if std > 5:
#mark for removal (don't remove here or it will screw up loop)