Je veux détecter et stocker les valeurs aberrantes à partir d'une liste et c'est ce que je fais

Code:

def outliers(y,thresh=3.5):
    
    m = np.median(y)
    abs_dev = np.abs(y - m)
    left_mad = np.median(abs_dev[y <= m])
    right_mad = np.median(abs_dev[y >= m])
    y_mad = left_mad * np.ones(len(y))
    y_mad[y > m] = right_mad
    modified_z_score = 0.6745 * abs_dev / y_mad
    modified_z_score[y == m] = 0
    return modified_z_score > thresh

bids = [5000,5500,4500,1000,15000,5200,4900]

z = outliers(bids)
bidd = np.array(bids)
out_liers = bidd[z]

Cela donne des résultats comme:

out_liers = array([ 1000, 15000])

Y a-t-il une meilleure façon de le faire, où je n'obtiens pas les résultats dans un tableau mais dans une liste? S'il vous plaît, quelqu'un peut-il m'expliquer pourquoi nous avons utilisé

seuil = 3,5

modified_z_score = 0,6745 * abs_dev / y_mad

2
Rahul Sharma 19 mars 2019 à 13:54

2 réponses

Meilleure réponse

Cela marche:

def outliers_modified_z_score(ys, threshold=3.5):
    ys_arr = np.array(ys)
    median_y = np.median(ys_arr)
    median_absolute_deviation_y = np.median(np.abs(ys_arr - median_y))
    modified_z_scores = 0.6745 * (ys_arr - median_y) / median_absolute_deviation_y
    return (ys_arr[np.abs(modified_z_scores) > threshold]).tolist()
1
J. Kwon 19 mars 2019 à 11:09

C'est parce que vous utilisez la fonction numpy. Le type par défaut utilisé est numpy.ndarray, ce qui accélère les calculs. Dans le cas où vous avez juste besoin d'une liste comme argument de sortie, utilisez la méthode tolist().

z = outliers(bids)
bidd = np.array(bids)
out_liers = bidd[z].tolist()
1
iamv 19 mars 2019 à 11:05