是否有 stats.zscore 的替代方法来检测数据框中少于 10 行的异常值?

Is there an alternative to stats.zscore to detect outliers in dataframe with less than 10 rows?

我正在尝试找到一种方法,将设计用于处理大型数据帧的算法应用于非常小的数据帧,因为这个想法是从无线传感器动态接收每一行数据,它应该适用于数据帧只有 2 或 3 行。

我遇到的一个问题是,我在算法中使用的异常值检测方法似乎不适用于行数少于 10 的数据帧。

我使用的数据来自一个包含三列的 .xlsx 文件:"ID"、"Temperature" 和 "Date"。 我应用于我的算法的异常值测试是中位数绝对偏差:

dfn=df[(np.abs(stats.zscore(df['Temperature']))<4)]

我尝试对9行数据使用该算法得到的错误信息如下:

/home/.../scipy/stats/stats.py:2419: RuntimeWarning: invalid value encountered in true_divide
 return (a - mns) / sstd
Metodo3in.py:20: RuntimeWarning: invalid value encountered in less

然后代码仍然执行,但我得到:

Empty DataFrame
Columns: [ID,Temperature,Date]
Index:[]

问题

如有任何帮助,我们将不胜感激!

stats.zscore 适用于任何长度大于 1 的输入数据。当所有温度都相等时,就会出现您的问题。在这种情况下,zscore 的结果全是 np.nan,这导致结果数据帧为空,因为与 nan 的任何比较都会产生 False:

stats.zscore([1,1]), np.abs(stats.zscore([1,1])<4)
#(array([nan, nan]), array([False, False]))
stats.zscore([1,2]), np.abs(stats.zscore([1,2])<4)
#(array([-1.,  1.]), array([ True,  True]))

所以你需要一个额外的条件"all values are equal" or'ed with "abs(zscore)<4"。系列的 "or" 运算符是一个按位 "or" (|),它没有快捷方式,即即使第一个操作数已经是 True,第二个操作数总是被计算。这会导致警告(但结果是正确的,因为如果第一个条件已经 True,则第二个条件无关紧要)。要抑制此警告,您需要捕获并忽略它:

import warnings
with warnings.catch_warnings():
    warnings.simplefilter('ignore')
    dfn = df[df.Temperature.eq(df.Temperature[0]).all() | (np.abs(stats.zscore(df['Temperature']))<4)]