Как рассчитать скользящий 52-недельный максимум с пропущенными датами и группировкой по тикеру компании (сложный фрейм данных)?

#python #pandas #dataframe #stock

Вопрос:

У меня есть большой набор данных с ежедневными ценами акций и кодами компаний. Мне нужно вычислить 52-недельный максимум для каждой акции в каждый момент времени на основе предыдущих 52 недель. Проблема в том, что некоторые компании не обязательно располагают данными между некоторыми периодами, и поэтому, если я использую фиксированный размер окна для скользящего максимума, результаты неверны. Сначала я попробовал это:

     df['52wh'] = df["PRC"].groupby(df['id']).shift(1).rolling(253).max()
 

Однако это не работает, так как в нем учитываются не даты, а только предыдущие 253 записи.
Я также попробовал это:

 df['date'] = pd.to_datetime(df['date'])
df['52wh'] = df.set_index('date').groupby('id').rolling(window=365, freq='D', min_periods=1).max()['PRC']
 

Но это дает мне эту ошибку:
Ошибка значения: не удается обработать неуникальный мультииндекс!

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

Вот пример того, как выглядит фрейм данных

           date        id    PRC
0       2010-01-09  10158   11.87
1       2010-01-10  10158   12.30
2       2010-01-11  10158   12.37
3       2010-01-12  10158   12.89
4       2010-02-08  10158   10.13
...        ...       ...     ...
495711  2018-12-12  93188   14.48
495712  2018-12-13  93188   14.48
495713  2018-12-14  93188   14.48
495714  2018-12-17  93188   14.48
495715  2018-12-18  93188   NaN
 

Кто-нибудь может помочь? Заранее спасибо, ребята! 🙂

Комментарии:

1. Можете ли вы попробовать разделить свои данные на каждую акцию, а затем применить скользящий фильтр? Я предполагаю, что есть некоторые акции с одним и тем же днем, которые создают не уникальные индексы, когда вы устанавливаете идентификатор на дату. Кроме того, пожалуйста, укажите некоторые примеры данных в своем вопросе

2. Да, действительно, даты повторяются для каждой акции, так как я смотрю на них в течение определенного периода времени. Я добавил пример к вопросу. Это пример из меньшего набора данных, но фактический файл данных содержит более 1000 запасов, поэтому разделение данных на отдельные запасы было бы неэффективным, верно?

3. является ли «ИДЕНТИФИКАТОР» уникальным идентификатором акции?

4. да, это уникальный идентификатор