pandas的滚动分位数有问题?

4
我最近在使用Pandas滚动函数时遇到了一个意外的问题。例如,rolling_quantile:
>> row = 10
>> col = 5
>> idx = pd.date_range(20100101,periods=row,freq='B')
>> a = pd.DataFrame(np.random.rand(row*col).reshape((row,-1)),index=idx)
>> a
                   0           1           2           3           4
2010-01-01  0.341434    0.497274    0.596341    0.259909    0.872207
2010-01-04  0.222653    0.056723    0.064019    0.936307    0.785647
2010-01-05  0.179067    0.647165    0.931266    0.557698    0.713282
2010-01-06  0.049766    0.259756    0.945736    0.380948    0.282667
2010-01-07  0.385036    0.517609    0.575958    0.050758    0.850735
2010-01-08  0.628169    0.510453    0.325973    0.263361    0.444959
2010-01-11  0.099133    0.976571    0.602235    0.181185    0.506316
2010-01-12  0.987344    0.902289    0.080000    0.254695    0.753325
2010-01-13  0.759198    0.014548    0.139858    0.822900    0.251972
2010-01-14  0.404149    0.349788    0.038714    0.280568    0.197865

>> a.quantile([0.25,0.5,0.75],axis=0)
               0           1           2           3           4
0.25    0.189963    0.282264    0.094964    0.255999    0.323240
0.50    0.363235    0.503864    0.450966    0.271964    0.609799
0.75    0.572164    0.614776    0.600761    0.513510    0.777567

>> np.percentile(a,[25,50,75],axis=0)
[array([ 0.18996316,  0.28226404,  0.09496441,  0.25599853,  0.32323997]),
 array([ 0.36323529,  0.50386356,  0.45096554,  0.27196429,  0.60979881]),
 array([ 0.57216415,  0.61477607,  0.6007611 ,  0.51351021,  0.7775667 ])]

>> pd.rolling_quantile(a,row,0.25).tail(1)
                   0           1       2           3           4
2010-01-14  0.179067    0.259756    0.08    0.254695    0.282667

看起来 pandas.DataFrame.quantile 成员函数与 numpy.percentile 函数是一致的。然而,pandas.rolling_quantile 函数返回不同的结果。将行数减少到5,问题就会消失(所有三种方法返回相同的结果)。有什么想法吗?
PS:我还测试了 rolling_std 函数,它会在长(逐行) pandas.DataFrame 中“随机”生成10^-7~10^-8级别的误差。
Python环境:
- python 3.4.2 - cython 0.21.1 - numpy 1.8.2 - scipy 0.14.0 - pandas 0.15.1 - statsmodels 0.6.0

我投票关闭此问题,因为这是一个pandas的bug,应该在github上提交:https://github.com/pydata/pandas/issues - Andy Hayden
一开始我不确定这是否是一个错误。由于没有人能在这里回答,我在 GitHub 上提交了一个新问题。无论如何,谢谢。 - leo
可以尝试转发一下,这不会有什么损失:),我承认我没仔细看(稍后会再看)。 - Andy Hayden
2个回答

2
正如这里所描述的那样,问题似乎在于rolling_quantile()函数(现在在pandas 0.18中是rolling().quantile())不进行插值,而是仅使用最近的点。
解决方法是在滚动后应用numpy百分位数函数:
a.rolling(row).apply(func=np.percentile, args=(25,)).tail(1)

这将提供正确的插值结果。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接