【问题标题】:pandas rolling_quantile bug?熊猫滚动分位数错误?
【发布时间】:2017-12-02 00:53:53
【问题描述】:

我最近遇到了一个关于 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 函数,它将“随机”生成 10^-7 ~ 10^-8 尺度的长(按行)pandas.DataFrames 的错误

python环境:

  • python 3.4.2
  • cython 0.21.1
  • numpy 1.8.2
  • scipy 0.14.0
  • 熊猫 0.15.1
  • statsmodels 0.6.0

【问题讨论】:

  • 我投票结束这个问题,因为这是一个熊猫错误,所以应该在 github 上提交:github.com/pydata/pandas/issues
  • 一开始我不确定这是否是一个错误。由于没有人可以在这里回答,我在 github 上提交了一个新问题。还是谢谢
  • 不会伤害到 xpost :),我承认我没有看得太仔细(稍后再看)

标签: python numpy pandas statsmodels


【解决方案1】:

正如here 所述,问题似乎在于rolling_quantile() 函数(现在在pandas 0.18 中是rolling().quantile())没有插值,它只是使用最近的点。

一种解决方法是在滚动后应用 numpy percentile 函数:

a.rolling(row).apply(func=np.percentile, args=(25,)).tail(1)

给出正确的插值结果。

【讨论】:

    【解决方案2】:

    这已在 pandas 0.21.0 中得到修复。我刚试过。顺便说一句,0.20.3 还没有修复它。修复在这里:https://github.com/pandas-dev/pandas/pull/16247

    【讨论】:

      猜你喜欢
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      • 2018-08-08
      • 2018-09-30
      • 2018-07-30
      • 2020-04-23
      • 2014-09-26
      相关资源
      最近更新 更多