从Pandas Dataframe(循环数据)中删除异常值

时间:2018-10-17 11:01:24

标签: python pandas numpy statistics

我想使用某些用户定义的函数从Pandas数据框中删除异常值。我在Stackoverflow中提出的同一个问题有一些答案,但不同之处在于我拥有的数据集是循环数据。因此,使用Pandas内置函数mean()std()是不合适的。例如,在循环数据中,3555的值仅相差10,而线性差给出350

我有数千个数据框,如下所示。我们清楚地看到Geophone 6是一个异常值。

  Geophone     azimuth  incidence      
0        1  194.765326  29.703151  
1        2  193.143982  23.380681  
2        3  199.327911  34.752212  
3        4  195.641010  49.186893  
4        5  193.479015  21.192982  
5        6    0.745142   3.410046 
6        7  192.380435  29.778807  
7        8  196.700814  19.750237  

在极坐标图中绘制数据时也可以确认。

enter image description here

我写了两个函数mean_anglevariance_angle,它们计算要应用于数据的圆均值和方差。方差给出一个介于0和1之间的值。当数据彼此接近时,方差值接近于0,反之亦然。

import numpy as np
def mean_angle(deg):


    deg = np.deg2rad(deg)

    S = np.array(deg)
    C = np.array(deg)
    S = S[np.isfinite(S)] #remove np.nan
    C = C[np.isfinite(C)]

    S = np.sum(np.sin(S))
    C = np.sum(np.cos(C))

    mu = np.arctan(S/C)  
    mu = np.rad2deg(mu)

    if S>0 and C>0:
        mu = mu 
    elif S>0 and C<0:
        mu = mu +180

    elif S<0 and C<0:
        mu = mu+180

    elif S<0 and C>0:
        mu = mu +360     
    return mu 


def variance_angle(deg):
    """
    deg: angles in degrees 
    """
    deg = np.deg2rad(deg)

    S = np.array(deg)
    C = np.array(deg)
    S = S[np.isfinite(S)] #remove np.nan
    C = C[np.isfinite(C)]

    length = C.size

    S = np.sum(np.sin(S))
    C = np.sum(np.cos(C))
    R = np.sqrt(S**2 + C**2)
    R_avg = R/length
    V = 1- R_avg

    return V

mean_azimuth = mean_angle(df.azimuth)
variance = variance_angle(df.azimuth)


print(mean_azimuth)
197.4122778774279
print(variance)
0.24614383460498535

但是,当从计算中排除第5行时,均值和方差分别变为195.06226604362286 , 0.0007544067627361928。差异从0.25变为几乎0

因此,我想找到一种方法来消除任何圆弧异常值/ s(azimuth),这会使用上述定义的函数使圆弧方差高。

在此示例中,incidence也是同一Geophone的离群值,但实际上与azimuth没有任何关系。还有其他数据,其中incidence在范围内,但是azimuth是一个异常值。

我们非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

进行离群值检测的一种方法是计算数据的均值和标准差,然后除去均值A * std之外的点(在该点上,您将A调整为对数据合理的值)。

因此,您可以使用函数来计算数据框的均值和方差,然后再次传递该数据框以去除均值A * std之外的数据点。