Как рассчитать движущуюся сумму в python дат, если в данных не существует каждой даты?

#python #rolling-sum

Вопрос:

Я пытаюсь рассчитать скользящую сумму в Python на основе выходных дней, однако у меня нет всех дат, перечисленных в моем фрейме данных. В приведенном ниже примере общая сумма должна учитывать тот факт, что дата 2021-01-03 отсутствует в структуре данных

 import pandas as pd

df = pd.DataFrame({'date':['2021-01-01', '2021-01-02', '2021-01-04', '2021-01-05'],
                   'value':[1, 1, 1, 1]})

df_correct = pd.DataFrame({'date':['2021-01-01', '2021-01-02', '2021-01-04', '2021-01-05'],
                           'value':[1, 1, 1, 1],
                           '2_day_cum_sum':[1, 2, 1, 2]})

print(df_correct)
 

Я знаю, как рассчитать скользящую сумму, используя функцию скользящей от панд, но я не знаю, как учесть пропущенную дату. Мое текущее видение состоит в том, чтобы создать фрейм данных, содержащий все комбинации даты и других переменных (не в этом базовом примере), а затем объединить активный набор данных с ним, чтобы я мог эффективно использовать функцию прокрутки из pandas. Тем не менее, я чувствую, что существует лучший подход. Есть какие-нибудь мысли?

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

1. Возможно, вы могли бы интерполировать значения? Хотя я не уверен, как это повлияет на ваши результаты.

Ответ №1:

Я знаю, что вы упомянули о функции прокатки, но не уверены, знаете ли вы, что можете указать окно даты в функции прокатки.. Давайте попробуем:

 # ensure date is in right format
df['date'] = pd.to_datetime(df.date)

# set date as index
df = df.set_index('date')

# rolling sum with 2 days as window
df['2_day_cum_sum'] = df['value'].rolling('2d').sum()

# reset index
df = df.reset_index()
 

Я могу получить ваш ожидаемый результат, и я думаю, что этого достаточно для вашего использования, если только вы не хотите ввести другое значение, когда дата отсутствует — например, установите значение 5, если дата отсутствует. Если это так, то нам понадобится другое решение