Как создать переменные скользящего окна, не пропуская месяцы при использовании multiIndex? - PullRequest
0 голосов
/ 02 июля 2018

В настоящее время у меня есть df с multi_dex для location_key & year_month. Я хочу создать сумму, используя скользящее окно на 3 месяца.

(pd.DataFrame(df.groupby(['LOCATION_KEY','YEAR_MONTH'])['SALES'].count()).sort_index()).groupby(level=(0)).apply(lambda x: x.rolling(window=3).sum())

Окно работает должным образом, проблема в том, что в месяцы, когда продаж не было, вместо подсчета пустого месяца вместо него учитывается другой месяц.

например. в данных ниже, 2016-03 Продажи - это сумма 2016-03, 2016-01, 2015-12, в отличие от того, что я хотел бы: 2016-03, 2016-02, 2016-01.

LOCATION_KE YEAR_MONTH SALES A 2015-10 NaN 2015-11 NaN 2015-12 200 2016-01 220 2016-03 180 B 2015-04 NaN 2015-05 NaN 2015-06 119 2015-07 120

1 Ответ

0 голосов
/ 03 июля 2018

По сути, вы должны настроить свой индекс так, как вы хотите, чтобы в скользящем окне обрабатывались нули.

df
  LOCATION_KE YEAR_MONTH  SALES
0           A 2015-10-01    NaN
1           A 2015-11-01    NaN
2           A 2015-12-01  200.0
3           A 2016-01-01  220.0
4           A 2016-03-01  180.0
5           B 2015-04-01    NaN
6           B 2015-05-01    NaN
7           B 2015-06-01  119.0
8           B 2015-07-01  120.0

df['SALES'] = df['SALES'].fillna(0)

df.index = [df["LOCATION_KE"], df["YEAR_MONTH"]]

df
                       LOCATION_KE YEAR_MONTH  SALES
LOCATION_KE YEAR_MONTH
A           2015-10-01           A 2015-10-01    0.0
            2015-11-01           A 2015-11-01    0.0
            2015-12-01           A 2015-12-01  200.0
            2016-01-01           A 2016-01-01  220.0
            2016-03-01           A 2016-03-01  180.0
B           2015-04-01           B 2015-04-01    0.0
            2015-05-01           B 2015-05-01    0.0
            2015-06-01           B 2015-06-01  119.0
            2015-07-01           B 2015-07-01  120.0


df = df.reindex(pd.MultiIndex.from_product([df['LOCATION_KE'], 
                                            pd.date_range("20150101", periods=24, freq='MS')],
                                           names=['location', 'month']))



df['SALES'].fillna(0).reset_index(level=0).groupby('location').rolling(3).sum().fillna(0)
                    location  SALES
location month
A        2015-01-01        A    0.0
         2015-02-01        A    0.0
         2015-03-01        A    0.0
         2015-04-01        A    0.0
         2015-05-01        A    0.0
         2015-06-01        A    0.0
         2015-07-01        A    0.0
         2015-08-01        A    0.0
         2015-09-01        A    0.0
         2015-10-01        A    0.0
         2015-11-01        A    0.0
         2015-12-01        A  200.0
         2016-01-01        A  420.0
         2016-02-01        A  420.0
         2016-03-01        A  400.0
         2016-04-01        A  180.0
         2016-05-01        A  180.0
         2016-06-01        A    0.0
         2016-07-01        A    0.0
         2016-08-01        A    0.0
         2016-09-01        A    0.0
         2016-10-01        A    0.0
         2016-11-01        A    0.0
         2016-12-01        A    0.0
         2015-01-01        A    0.0
         2015-02-01        A    0.0
         2015-03-01        A    0.0
         2015-04-01        A    0.0
         2015-05-01        A    0.0
         2015-06-01        A    0.0
...                      ...    ...
B        2016-07-01        B    0.0
         2016-08-01        B    0.0
         2016-09-01        B    0.0
         2016-10-01        B    0.0
         2016-11-01        B    0.0
         2016-12-01        B    0.0
         2015-01-01        B    0.0
         2015-02-01        B    0.0
         2015-03-01        B    0.0
         2015-04-01        B    0.0
         2015-05-01        B    0.0
         2015-06-01        B  119.0
         2015-07-01        B  239.0
         2015-08-01        B  239.0
         2015-09-01        B  120.0
         2015-10-01        B    0.0
         2015-11-01        B    0.0
         2015-12-01        B    0.0
         2016-01-01        B    0.0
         2016-02-01        B    0.0
         2016-03-01        B    0.0
         2016-04-01        B    0.0
         2016-05-01        B    0.0
         2016-06-01        B    0.0
         2016-07-01        B    0.0
         2016-08-01        B    0.0
         2016-09-01        B    0.0
         2016-10-01        B    0.0
         2016-11-01        B    0.0
         2016-12-01        B    0.0

Я думаю, что если у вас есть обновленные панды, вы можете не указывать reset_index.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...