Python:查找列表中的异常值

fin*_*hen 4 python list range

我有一个包含随机数量的整数和/或浮点数的列表。我想要实现的是找到我的数字中的异常(希望使用正确的词语来解释这一点)。例如:

list = [1, 3, 2, 14, 108, 2, 1, 8, 97, 1, 4, 3, 5]
Run Code Online (Sandbox Code Playgroud)
  • 我的整数值中有 90% 到 99% 介于 1 到 20 之间
  • 有时有些值要高得多,比如说大约 100 或 1.000 甚至更高

我的问题是,这些值可能一直不同。也许常规范围在 1.000 到 1.200 之间,例外情况在 50 万范围内。

有没有一个函数可以过滤掉这些特殊数字?

Ehs*_*san 7

假设您的清单是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)