我想使用某些用户定义的函数从Pandas数据框中删除异常值。我在Stackoverflow中提出的同一个问题有一些答案,但不同之处在于我拥有的数据集是循环数据。因此,使用Pandas内置函数mean()
,std()
是不合适的。例如,在循环数据中,355
和5
的值仅相差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
在极坐标图中绘制数据时也可以确认。
我写了两个函数mean_angle
和variance_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
是一个异常值。
我们非常感谢您的帮助。
答案 0 :(得分:0)
进行离群值检测的一种方法是计算数据的均值和标准差,然后除去均值A * std之外的点(在该点上,您将A调整为对数据合理的值)。
因此,您可以使用函数来计算数据框的均值和方差,然后再次传递该数据框以去除均值A * std之外的数据点。