Python:在列表中查找异常值

时间:2020-07-08 19:13:08

标签: python list range

我的列表中有随机数量的整数和/或浮点数。我要实现的目标是在我的数字中找到例外(希望使用正确的词来解释这一点)。例如:

list = [1, 3, 2, 14, 108, 2, 1, 8, 97, 1, 4, 3, 5]
  • 我90%到99%的整数在1到20之间
  • 有时有些值要高得多,比方说大约100或1.000甚至更高

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

是否有过滤这些特殊数字的功能?

3 个答案:

答案 0 :(得分:0)

您可以使用内置的filter()方法:

lst1 = [1, 3, 2, 14, 108, 2, 1, 8, 97, 1, 4, 3, 5]

lst2 = list(filter(lambda x: x > 5,lst1))

print(lst2)

输出:

[14, 108, 8, 97]

答案 1 :(得分:0)

假设您的列表为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()
    

    输出:

    [ 3  2 14  2  8  4  3  5]
    
  • 如果不确定百分位数截止点,并希望 删除异常值:

    您可以通过调整以下参数中的参数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))
    

    输出:

    [1, 3, 2, 14, 2, 1, 8, 1, 4, 3, 5]
    

答案 2 :(得分:-1)

所以这是一种方法来阻止那些偏离的人

import math
_list = [1, 3, 2, 14, 108, 2, 1, 8, 97, 1, 4, 3, 5]
def consts(_list):
    mu = 0
    for i in _list:
        mu += i
    mu = mu/len(_list)
    sigma = 0
    for i in _list:
        sigma += math.pow(i-mu,2)
    sigma = math.sqrt(sigma/len(_list))
    return sigma, mu

def frequence(x, sigma, mu):
    return (1/(sigma*math.sqrt(2*math.pi)))*math.exp(-(1/2)*math.pow(((x-mu)/sigma),2))

sigma, mu = consts(_list)

new_list = []
for i in range(len(_list)):
    if frequence(_list[i], sigma, mu) > 0.01:
        new_list.append(i)
print(new_list)