Python — Скользящий средний расчет без учета текущего значения даты и за предыдущие n дней. Кроме того, всегда распределяйте веса на «n», но не одинаково

#python #pandas #dataframe #scipy #rolling-computation

Вопрос:

У меня есть фрейм данных с несколькими столбцами уникальных идентификаторов, одним столбцом даты(30 дней), одним столбцом значений, я хочу, чтобы скользящее среднее значение в каждой строке столбца значений учитывало предыдущие 7 дней в качестве базового.

 df = 
date      col1 col2 val
2021-03-20  a1  a2  10
2021-03-21  a1  b2  20
2021-03-22  a1  c2  30
2021-03-23  a1  c2  40
2021-03-24  a1  d2  50
2021-03-25  a1  e2  60
2021-03-26  a1  f2  70
2021-03-28  a1  g2  80
2021-03-29  a1  g2  90
2021-03-30  a1  h2  100

 

Понимание данных :
Выше приведена только структура df. У меня есть данные за 30 дней. Здесь я показываю минимальные данные за 10 дней, всего 1 категория в col1 и 10 категорий в col2. В реальном времени у меня есть более 10 категорий в col1 и более 700 категорий в col2. Комбинация col1,col2,val фиксируется в течение 30 дней.

Расчет выполнен на python для достижения скользящего среднего:

 df = pd.read_sql("""SELECT STATEMENT""", con = conn,index_col="date",parse_dates=["date"])
df['val'] = pd.to_numeric(df['val'])
df = df.sort_index()
df_7d_mean = pd.DataFrame(df.groupby(["col1","col2"]).rolling('7D',min_periods = 1).val.mean())
df_7d_mean = df_7d_mean.rename(columns={"val":"val_rolling_7_days"})
df_7d_mean.reset_index()
result_df = pd.merge(df,df_7d_mean,on = ['date','col1','col2']).sort_values(by=['col1','col2','date'])
 

Проблемы, с которыми сталкиваются:

  1. Скользящее среднее значение за 7 дней рассчитывается также с учетом текущей даты, чего не должно произойти в моем случае..как я могу этого добиться?
  2. Также, когда он ищет среднее значение за предыдущие 7 дней для этой комбинации, если из 7 дней присутствуют только данные за 5 дней..скользящее среднее рассчитывается путем равного распределения весов, т. е. значений/5..но среднее значение должно быть распределено, разделив его только на 7.. независимо от того, сколько дней данные были найдены ранее(из 7) для этой комбинации..как я могу этого добиться?