因此,我以前曾经问过有关此问题的问题,今天也得到了很好的答复。不幸的是,我使用这里提供的解决方案遇到了更大的问题。
我先前的问题可以在How can i replace outliers with the mean of previous and next neighbour?处找到。
所以基本上,问题是我有一个巨大的数据集(如果需要,我也可以上传),它显示了很多离群值,其中一些离所关注的数据高15个数量级。
通常,我只是过滤或删除它们,但我需要对数据集执行Allan偏差,这意味着我需要我的数据集中的原始x轴(时间)以获取正确的间隔时间缩放。
我的想法是使用替换循环,用其邻居的均值替换每个2sigma离群值。为此,我首先将数据集划分为间隔以获取更好的均值,这些均值作用于局部。
现在发生的是,我似乎有太多和太大的离群值,这基本上使我无法获得良好的均值(我的数据中1e + 25的离群值与1e + 09的离群值)。
这是我当前使用的代码:
def stddev_beat(beatname1, nameadevevac):
beatpath = os.path.abspath('...')
y = np.loadtxt('...' + beatname1 + '.csv', delimiter = ",", skiprows = 1)
n = 60
### split dataset into intervals ###
def divide_chunks(l, n):
for i in range(0, len(l), n):
yield l[i:i + n]
empty = []
x = list(divide_chunks(y,n))
l=x
for j in range(len(l)):
std = np.std(l[j][:,1])
mean = np.mean(l[j][:,1])
for i in range (len(l[j][:,1])):
if((l[j][i,1]<1e+10)&(l[j][i,1]>1e+07)):
pass
else:
if (i!=len(l[j][:,1])-1)&(i!=0):
l[j][i,1]=(l[j][i-1,1]+l[j][i+1,1])/2
else:
l[j][i,1] = mean
final = [[x,y] for x,y in l[j]]
empty.extend(final)
ready_x, ready_y = zip(*empty)
x = np.array(list(ready_x))
y = np.array(list(ready_y))
##############
plt.plot(x/3600, y)
plt.xlabel(r'time [h]')
plt.ylabel(r'beat frequency [Hz]')
plt.grid(True, which='both')
plt.show()
我知道里面有很多垃圾,但是我想获取我正在使用的原始代码。
我真的不知道是否有一个解决方案,而不是替换我的离群值或用一些手动值替换它们,但是也许有人遇到了类似的问题。
所以如果有人对如何解决这个问题有个想法,我将非常感激。
编辑:
可以使用此dropbox link找到数据。 This png显示关注数据的曲线图,而this png显示离群点的最大值。
所以我的上一个问题是代码基本上可以正常工作,但是与所关注的数据相比,我的离群值是如此之大,以至于我使用的均值+标准差异常无法正常工作。
在将数据集划分为间隔后,我可能会使用离散值作为上限/下限,但是我非常感谢为此提供的动态解决方案。