2017-05-31 98 views
1

我的代码检测时间序列中的异常值。我想要做的是将第一个数据帧列中的异常值替换为以前的值,这不是异常值。用前一个替换pandas dataframe列中的值

此代码只是检测离群值,创建布尔阵列,其中:

  • True意味着,在数据帧的值是异常值
  • False意味着,在数据帧的值不是异常值
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 

到目前为止,一切正常。

我已经想好了下一个步骤是创建一个面具与同列的前值来取代True值(如果这是可能的,这将是比让一个循环更快)。

我会试着用一个小例子来解释它:

这是我有:

index consumo 

    0  54 
    1  67 
    2  98 


index outlier 

    0 False 
    1 False 
    2 True 

而这正是我想做的事:

index consumo 

    0  54 
    1  67 
    2  67 

我认为我应该创建一个这样的面具:

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

显然这不是写它的方法。这只是一个解释,我认为它可以完成(我正在谈论[i-1])。

回答

1

看来你需要shift

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

最后,如果所有值都ints添加astype

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

我不知道转移的存在,并()。这真的很有用。你的答案很清楚,效果很好。非常感谢你。 – Jvr

+0

很高兴可以帮助,美好的一天! – jezrael

相关问题