每个时间步长以多个值滚动的熊猫

时间:2019-06-13 21:19:52

标签: python pandas dataframe time rolling-computation

我正在尝试使用python进行异常检测,其滚动窗口值为8天,以计算两个指标(err_precent和fail precent)的四分位间距。 examples provided似乎每个时间戳/索引只有一个值,在我的情况下,我有很多。

我的数据如下:


        customerID   err_precent   fail_precent
end_date            
2019-05-02  29616   0.857143    1.000000
2019-05-02  277023  1.000000    1.000000
2019-05-02  150560  1.000000    1.000000
2019-05-02  88778   1.000000    1.000000
... ... ... ...
2019-06-10  67311   1.000000    1.000000
2019-06-10  128116  1.000000    1.000000
2019-06-10  264288  0.935484    1.000000
2019-06-10  199984  0.941176    1.000000
2019-06-10  444105  0.952381    0.857143
2019-06-10  388703  0.894737    0.947368
2019-06-10  138986  1.000000    1.00000

在数据列上滚动之后,我可以看到每天都有很多值。问题是:我是否可以每8天使用所有值来计算一个分位数,而不是像下面那样为每个客户分配分位数?


         err_precent    fail_precent
end_date        
2019-05-02  0.857143    1.000000
2019-05-03  0.900000    0.880000
2019-05-04  0.900000    0.880000
...
2019-06-10  0.857143    0.941176
df.index = pd.to_datetime(df.end_date, format='%m/%d/%Y')
df[dataColumn].rolling('8D', min_periods =1 ).quantile(.25, interpolation = 'lower')

不希望的结果,如您所见,每天返回许多分位数。


          err_precent   fail_precent
end_date        
2019-05-02  0.857143    1.000000
2019-05-02  0.857143    1.000000
2019-05-02  0.857143    1.000000
2019-05-02  0.857143    1.000000
2019-05-02  1.000000    1.000000
2019-05-02  0.941176    1.000000
2019-05-02  0.941176    1.000000
2019-05-02  0.857143    0.941176
2019-05-02  0.923077    1.000
... ... ...
2019-06-10  0.900000    0.880000
2019-06-10  0.900000    0.880000
2019-06-10  0.900000    0.880000
2019-06-10  0.900000    0.880000
2019-06-10  0.900000    0.880000
2019-06-10  0.900000    0.880000
2019-06-10  0.900000    0.880000
2019-06-10  0.900000    0.880000

1 个答案:

答案 0 :(得分:0)

我通过重采样找到了解决此问题的方法,首先通过重采样计算每天的分位数,然后对前8天进行滚动平均。

lb = df[dataColumn].resample("1d").quantile(.25).fillna(0).rolling(window=8).mean()