python — как мне выполнить приведенную ниже задачу для временных рядов pandas

#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 предназначен для реверсирования списка, чтобы он мог вычислять квантили даты после заданной даты.