我有一个包含随机数量的整数和/或浮点数的列表。我想要实现的是找到我的数字中的异常(希望使用正确的词语来解释这一点)。例如:
list = [1, 3, 2, 14, 108, 2, 1, 8, 97, 1, 4, 3, 5]
Run Code Online (Sandbox Code Playgroud)
我的问题是,这些值可能一直不同。也许常规范围在 1.000 到 1.200 之间,例外情况在 50 万范围内。
有没有一个函数可以过滤掉这些特殊数字?
假设您的清单是l:
如果您知道要过滤某个百分位数/分位数,您可以使用:
这会删除底部 10% 和顶部 90%。当然,您可以将其中任何一个更改为您想要的截止值(例如,您可以删除底部过滤器并仅过滤示例中的前 90%):
import numpy as np
l = np.array(l)
l = l[(l>np.quantile(l,0.1)) & (l<np.quantile(l,0.9))].tolist()
Run Code Online (Sandbox Code Playgroud)
输出:
[ 3 2 14 2 8 4 3 5]
Run Code Online (Sandbox Code Playgroud)
如果您不确定百分位截止值并希望删除异常值:
m您可以通过调整函数调用中的参数来调整异常值的截止值。它越大,去除的异常值就越少。与其他异常值去除技术相比,该函数似乎对各种类型的异常值更加稳健。
import numpy as np
l = np.array(l)
def reject_outliers(data, m=6.):
d = np.abs(data - np.median(data))
mdev = np.median(d)
s = d / (mdev if mdev else 1.)
return data[s < m].tolist()
print(reject_outliers(l))
Run Code Online (Sandbox Code Playgroud)
输出:
[1, 3, 2, 14, 2, 1, 8, 1, 4, 3, 5]
Run Code Online (Sandbox Code Playgroud)