Pandas скользящая сумма за одно окно календарного года?

#python #pandas #dataframe #rolling-computation

#python #pandas #фрейм данных #скользящее вычисление

Вопрос:

У меня есть ежедневный индекс данных pd.DataFrame, по которому я хотел бы вычислять скользящие суммы, используя один календарный год, но это приводит к ошибке ValueError: window must be an integer .

 import pandas as pd
from pandas.tseries.offsets import BDay

start_date = pd.to_datetime('2015-01-01').date()
end_date = pd.to_datetime('2019-12-31').date()

dfo = pd.DataFrame(data=0,
                   index=pd.date_range(start_date, end_date, freq=BDay()),
                   columns=['col1', 'col2'])
dfo.index = dfo.index.date

# ... fill in some data and then:

dfo = dfo.rolling('1Y').sum()
  

приводит к ошибке: ValueError: window must be an integer

Поскольку у меня есть ежедневные данные BD, я мог бы просто использовать окно размером 252, т.Е. Средние торговые дни для бизнеса в год, но для моего варианта использования было бы идеально использовать вместо этого календарный год.

Ответ №1:

Ваш индекс равен object dtype . Скользящее окно, использующее интервал времени, ожидает, что фрейм данных будет иметь datetimeindex . Вы можете просто преобразовать индекс, выполнив:

 dfo.index = pd.to_datetime(dfo.index)
  

И принимая скользящую сумму за год, используя:

 dfo.rolling('365D').sum()
  

Смотрите также https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#dateoffset-objects чтобы увидеть, какие строки частот можно использовать для указания временного окна перехода.