#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'])
Проблемы, с которыми сталкиваются:
- Скользящее среднее значение за 7 дней рассчитывается также с учетом текущей даты, чего не должно произойти в моем случае..как я могу этого добиться?
- Также, когда он ищет среднее значение за предыдущие 7 дней для этой комбинации, если из 7 дней присутствуют только данные за 5 дней..скользящее среднее рассчитывается путем равного распределения весов, т. е. значений/5..но среднее значение должно быть распределено, разделив его только на 7.. независимо от того, сколько дней данные были найдены ранее(из 7) для этой комбинации..как я могу этого добиться?