2017-05-31 3 views
1

Mon code détecte les valeurs aberrantes dans une série chronologique. Ce que je veux faire est de remplacer les valeurs aberrantes dans la première colonne de données avec la valeur précédente qui n'est pas une valeur aberrante.Remplacer une valeur dans une colonne de données Panda par la précédente

Ce code détecte seulement les valeurs aberrantes, ce qui crée une matrice booléenne où:

  • True signifie qu'une valeur dans la trame de données est une valeur aberrante
  • False signifie qu'une valeur dans la trame de données ne sont pas une valeur aberrante
series = read_csv('horario_completo.csv', header=None, squeeze=True) 
df=pd.DataFrame(series) 
from pandas import rolling_median 

consumos=df.iloc[:,0] 
df['rolling_median'] = rolling_median(consumos, window=48, center=True).fillna(method='bfill').fillna(method='ffill') 
threshold =50 
difference = np.abs(consumos - df['rolling_median']) 
outlier = difference > threshold 

Jusqu'à présent, tout fonctionne.

La prochaine étape que j'ai pensé est de créer un masque pour remplacer les valeurs True avec la valeur précédente de la même colonne (si cela était possible, ce serait beaucoup plus rapide que de faire une boucle).

Je vais essayer de l'expliquer avec un petit exemple:

C'est ce que j'ai:

index consumo 

    0  54 
    1  67 
    2  98 


index outlier 

    0 False 
    1 False 
    2 True 

Et c'est ce que je veux faire:

index consumo 

    0  54 
    1  67 
    2  67 

I pense que je devrais créer un masque comme celui-ci:

df.mask(outlier, df.columns=[[0]][i-1],axis=1) 

obviosly ce n'est pas le moyen de l'écrire. C'est juste une explication sur comment je pense que cela pourrait être fait (je parle de [i-1]).

Répondre

1

Il vous semble besoin shift:

consumo = consumo.mask(outlier, consumo.shift()) 
print (consumo) 
0 54.0 
1 67.0 
2 67.0 
Name: consumo, dtype: float64 

Dernière si toutes les valeurs sont ints ajouter astype:

consumo = consumo.mask(outlier, consumo.shift()).astype(int) 
print (consumo) 
0 54 
1 67 
2 67 
Name: consumo, dtype: int32 
+0

Je ne savais pas sur l'existence de décalage(). C'est vraiment très utile. Et votre réponse est claire et fonctionne très bien. Merci beaucoup. – Jvr

+0

Glad peut aider, belle journée! – jezrael