ошибка pandas roll_quantile?

Недавно я столкнулся с неожиданной проблемой с функцией pandas rolling. 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

среда питона:

  • питон 3.4.2
  • китон 0.21.1
  • нумпи 1.8.2
  • scipy 0.14.0
  • панды 0.15.1
  • статистические модели 0.6.0

person leo    schedule 04.02.2015    source источник
comment
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что это ошибка панд, поэтому ее следует зарегистрировать на github: github.com/pydata/pandas/issues   -  person Andy Hayden    schedule 04.02.2015
comment
сначала я не был уверен, баг это или нет. так как никто не мог ответить здесь, я подал новую проблему в github. спасибо в любом случае   -  person leo    schedule 04.02.2015
comment
не помешает xpost :), каюсь, не внимательно смотрел (посмотрю позже)   -  person Andy Hayden    schedule 04.02.2015


Ответы (2)


Как описано здесь, проблема заключается в том, что функция rolling_quantile() (теперь в пандах 0.18 rolling().quantile()) не интерполирует, а просто использует ближайшую точку.

Обходной путь - применить функцию процентиля numpy после прокатки:

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

что дает правильные интерполированные результаты.

person queise    schedule 27.03.2016

Это было исправлено в pandas 0.21.0. Я только что попробовал. Кстати, в 0.20.3 это не исправлено. Исправление находится здесь: https://github.com/pandas-dev/pandas/pull/16247

person Roy    schedule 01.12.2017