2017-09-19 6 views
0

J'essaie de supprimer des valeurs éloignées d'une liste en python. Je veux obtenir les valeurs d'index de chaque valeur aberrante d'une liste originale afin que je puisse la retirer d'une autre liste correspondante.Comment indexez-vous les outliers en python?

~~ ~~ Exemple simple

ma liste des valeurs aberrantes:

y = [1,2,3,4,500] #500 is the outlier; has a index of 4 

ma liste correspondante:

x= [1,2,3,4,5] #I want to remove 5, has the same index of 4 

MON RÉSULTAT/OBJECTIF:

y=[1,2,3,4] 

x=[1,2,3,4] 

Cette est mon code, et je veux pour atteindre la même chose avec klist et avglatlist

import numpy as np 

klist=['1','2','3','4','5','6','7','8','4000'] 
avglatlist=['1','2','3','4','5','6','7','8','9'] 


klist = np.array(klist).astype(np.float)  
klist=klist[(abs(klist - np.mean(klist))) < (2 * np.std(klist))] 

indices=[] 
for k in klist: 
    if (k-np.mean(klist))>((2*np.std(klist))): 
     i=klist.index(k) 
     indices.append(i) 

print('indices'+str(indices)) 

avglatlist = np.array(avglatlist).astype(np.float) 


for index in sorted(indices, reverse=True): 
    del avglatlist[index] 


print(len(klist)) 
print(len(avglatlist)) 
+1

Définir une valeur aberrante. Comment l'identifiez-vous? –

+0

si le nombre moins la moyenne est supérieur à 2 fois l'écart-type. J'ai du mal à le coder, pas à le définir. Je continue à obtenir des erreurs avec tous les moyens que j'essaie de le faire – Adam

Répondre

0

Vous êtes vraiment proche. Tout ce que vous devez faire est d'appliquer le même régime de filtrage à une version chiffrée de avglatlist. J'ai changé quelques noms de variables pour plus de clarté.

import numpy as np 

klist = ['1', '2', '3', '4', '5', '6', '7', '8', '4000'] 
avglatlist = ['1', '2', '3', '4', '5', '6', '7', '8', '9'] 


klist_np = np.array(klist).astype(np.float) 
avglatlist_np = np.array(avglatlist).astype(np.float)  

klist_filtered = klist_np[(abs(klist_np - np.mean(klist_np))) < (2 * np.std(klist_np))] 
avglatlist_filtered = avglatlist_np[(abs(klist_np - np.mean(klist_np))) < (2 * np.std(klist_np))] 
0

Comment obtenir les valeurs de l'indice de chaque valeur aberrante dans une liste?

Dites qu'une valeur aberrante est définie comme 2 écarts-types par rapport à une moyenne. Cela signifie que vous voudriez connaître les indices de valeurs dans une liste où zscores ont des valeurs absolues supérieures à 2.

J'utiliser np.where:

import numpy as np 
from scipy.stats import zscore 

klist = np.array([1, 2, 3, 4, 5, 6, 7, 8, 4000]) 
avglatlist = np.arange(1, klist.shape[0] + 1) 

indices = np.where(np.absolute(zscore(klist)) > 2)[0] 
indices_filter = [i for i,n in enumerate(klist) if i not in indices] 
print(avglatlist[indices_filter]) 

Si vous n'avez pas réellement besoin connaître les indices, utiliser un masque booléen à la place:

import numpy as np 
from scipy.stats import zscore 

klist = np.array([1, 2, 3, 4, 5, 6, 7, 8, 4000]) 
avglatlist = np.arange(1, klist.shape[0] + 1) 

mask = np.absolute(zscore(klist)) > 2 
print(avglatlist[~mask]) 

les deux solutions d'impression:

[1 2 3 4 5 6 7 8]