2017-09-19 2 views
0

Ich versuche Ausreißer aus einer Liste in Python zu entfernen. Ich möchte die Indexwerte jedes Ausreißers aus einer ursprünglichen Liste abrufen, damit ich sie aus einer (anderen) entsprechenden Liste entfernen kann.Wie indizieren Sie Ausreißer in Python?

~~ Einfaches Beispiel ~~

meiner Liste mit Ausreißern:

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

meine entsprechenden Liste:

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

mein Ergebnis/Ziel:

y=[1,2,3,4] 

x=[1,2,3,4] 

Diese ist mein Code, und ich will um dasselbe mit klist und avglatlist zu erreichen

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

Definieren Sie einen Ausreißer. Wie identifizieren Sie es? –

+0

wenn die Anzahl abzüglich des Mittelwerts größer als das 2fache der Standardabweichung ist. Ich habe Probleme damit, es zu programmieren, es nicht zu definieren. Ich bekomme Fehler mit jeder Art, wie ich es versuche – Adam

Antwort

0

Sie sind wirklich nah dran. Alles, was Sie tun müssen, ist, das gleiche Filterschema auf eine numplige Version von avglatlist anzuwenden. Ich habe ein paar Variablennamen aus Gründen der Übersichtlichkeit geändert.

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

Wie in einer Liste der Indexwerte der einzelnen Ausreißer bekommen?

Angenommen, ein Ausreißer ist definiert als 2 Standardabweichungen von einem Mittelwert. Das heißt, Sie wollen würden die Indizes des Wertes in einer Liste wissen, wo zscores absolute Werte größer als 2

würde ich np.where verwenden:

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]) 

Wenn Sie nicht wirklich brauchen, um kennen die Indizes verwenden, um eine boolean Maske statt:

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]) 

Beide Lösungen Druck:

[1 2 3 4 5 6 7 8]