用邻居的平均值替换我的数据集的异常值

时间:2019-05-21 19:13:24

标签: python numpy matplotlib

因此,我以前曾经问过有关此问题的问题,今天也得到了很好的答复。不幸的是,我使用这里提供的解决方案遇到了更大的问题。

我先前的问题可以在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显示离群点的最大值。

所以我的上一个问题是代码基本上可以正常工作,但是与所关注的数据相比,我的离群值是如此之大,以至于我使用的均值+标准差异常无法正常工作。

在将数据集划分为间隔后,我可能会使用离散值作为上限/下限,但是我非常感谢为此提供的动态解决方案。

0 个答案:

没有答案