Процентиль Python недавнего значения против окна предыдущих значений - PullRequest
0 голосов
/ 27 июня 2018

Извинения Я нуб, смотрящий на переход от R!

Пример воспроизводимых данных;

df = pd.DataFrame(1.26 + np.random.rand(size)/100.0,
                  index=pd.date_range('20160101 09:00:00',
                                      periods=size,
                                      freq='60s'),
                  columns=['ATR20'])

Я хотел бы взять значение в столбце ATR20 и вычислить его текущий процентиль по отношению к скользящему окну предыдущих значений n столбца ATR20.

Вот насколько я получил:

for n in range(1,len(df)):
print(sum(df.ATR20[n:n+20] > df.ATR20))

Что дает следующую ошибку:

ValueError: Can only compare identically-labeled Series objects

Я уверен, что есть более простой способ сделать это с более точным синтаксисом, но мои поиски не нашли ничего достаточно близкого.

Спасибо.

1 Ответ

0 голосов
/ 27 июня 2018

Я думаю, что это получит то, что вы ищете. Я использовал ваш пример только с 10 элементами в кадре данных и скользящим окном из 3 элементов, просто чтобы он был короче при вставке сюда.

size = 10
df = pd.DataFrame(1.26 + np.random.rand(size)/100.0,
                  index=pd.date_range('20160101 09:00:00',
                                      periods=size,
                                      freq='60s'),
                  columns=['ATR20'])

#                         ATR20
# 2016-01-01 09:00:00  1.262522
# 2016-01-01 09:01:00  1.265116
# 2016-01-01 09:02:00  1.265051
# 2016-01-01 09:03:00  1.261109
# 2016-01-01 09:04:00  1.262699
# 2016-01-01 09:05:00  1.266710
# 2016-01-01 09:06:00  1.260186
# 2016-01-01 09:07:00  1.268001
# 2016-01-01 09:08:00  1.263227
# 2016-01-01 09:09:00  1.261331

Вы можете использовать df.rolling вместе с apply, чтобы применить функцию к скользящему окну. Я думаю, что расчет, который я использовал здесь, более или менее то, что вы ищете:

window = 3
df.rolling(window).apply(lambda x: sum([x[-1] > i for i in x]) / (window - 1))

#                         ATR20
# 2016-01-01 09:00:00       NaN
# 2016-01-01 09:01:00       NaN
# 2016-01-01 09:02:00  0.263665
# 2016-01-01 09:03:00  0.000000
# 2016-01-01 09:04:00  0.263932
# 2016-01-01 09:05:00  0.527632
# 2016-01-01 09:06:00  0.000000
# 2016-01-01 09:07:00  0.527024
# 2016-01-01 09:08:00  0.263754
# 2016-01-01 09:09:00  0.000000
...