Процентиль Python недавнего значения против окна предыдущих значений
Извинения Я нуб, глядя на переход от 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 ответ
Я думаю, что это получит то, что вы ищете. Я использовал ваш пример только с 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