是否有 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 工作的最小数据行数是 10?
- 是否有任何替代方案可以应用于较小的数据帧?失去一些精度是一种选择。
如有任何帮助,我们将不胜感激!
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)]
我正在尝试找到一种方法,将设计用于处理大型数据帧的算法应用于非常小的数据帧,因为这个想法是从无线传感器动态接收每一行数据,它应该适用于数据帧只有 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 工作的最小数据行数是 10?
- 是否有任何替代方案可以应用于较小的数据帧?失去一些精度是一种选择。
如有任何帮助,我们将不胜感激!
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)]