Python: найти выбросы в списке - PullRequest
1 голос
/ 08 июля 2020

У меня есть список со случайным количеством целых чисел и / или чисел с плавающей запятой. Я пытаюсь найти исключения внутри своих чисел (в надежде использовать правильные слова для объяснения этого). Например:

list = [1, 3, 2, 14, 108, 2, 1, 8, 97, 1, 4, 3, 5]
  • от 90 до 99% моих целочисленных значений от 1 до 20
  • иногда есть значения, которые намного выше, скажем где-то около 100 или 1.000 или даже больше

Моя проблема в том, что эти значения могут все время отличаться. Может быть, обычный диапазон находится где-то между 1.000 и 1200, а исключения находятся в диапазоне полумиллиона.

Есть ли функция для фильтрации этих специальных чисел?

Ответы [ 3 ]

0 голосов
/ 08 июля 2020

Вы можете использовать встроенный 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]
0 голосов
/ 08 июля 2020

Предполагая, что ваш список 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()
    

    output:

    [ 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]
    
0 голосов
/ 08 июля 2020

Итак, вот метод, как заблокировать этих отклоняющихся

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...