#python #pandas
Вопрос:
Это мой df временных рядов гипотетической акции (созданной случайным образом) и соответствующих доходов
np.random.seed(1)
df = pd.DataFrame(np.random.randint(200,800,100),index=pd.date_range('2015-01-01',periods=100,freq='D'),columns=['stock'])
df['rtns'] = df.stock.pct_change()
df.dropna(inplace=True)
Мне нужно, чтобы на определенную дату, скажем, 2/1/2015, если мы смотрим вперед на 22 дня (3/1/2015 : 24/1/2015), из этого распределения мне нужны процентили (5-й, 10-й, 25th….as показано на снимке ниже). Просто для уточнения процентилей, которые должны быть рассчитаны по доходности (а не по ценам акций). Как мудрый, я хочу одного и того же для всех свиданий. Как нам это сделать?
Отредактированный —
Я прикрепил вывод на пару дней. Я не уверен,что эквивалентно python для np.процентиля([массив], 0,05), т. е. для 5-го процентиля. Я использовал процентиль функции exccel([массив],0,05) для заполнения выходных данных.
Комментарии:
1. Можете ли вы включить ввод и вывод в воспроизводимый формат ?
Ответ №1:
Другой способ:
for pct in [0.05, 0.1, 0.25, 0.5, 0.75, 0.95]:
df[f"{int(pct*100)}th percentile"] = df['rtns'].rolling(22).quantile(pct).shift(-22)
>>> df.head()
stock rtns ... 75th percentile 95th percentile
2015-01-02 435 0.835443 ... 0.251163 0.685605
2015-01-03 272 -0.374713 ... 0.263344 0.736752
2015-01-04 344 0.264706 ... 0.251163 0.736752
2015-01-05 329 -0.043605 ... 0.270500 1.347892
2015-01-06 783 1.379939 ... 0.270500 0.736752
Ответ №2:
Простым решением может быть:
df[::-1]["rtns"].shift(1).rolling(22).quantile(0.25)[::-1]
::-1
предназначен для реверсирования списка, чтобы он мог вычислять квантили даты после заданной даты.