Python pandas: скользящая сумма не дает суммы за 12 месяцев - PullRequest
0 голосов
/ 04 августа 2020

У меня есть фрейм данных, который выглядит так:

df

ID      RY    Month INCIDENT_NO
AB10    2019    7   3
AB10    2019    12  3
AB1286  2011    5   2
AB1286  2012    1   2
AB1286  2014    4   1

Я пытаюсь создать скользящую сумму INCIDENT_NO за 12 месяцев на основе идентификатора. Я пишу следующий код:

df.groupby('ID').rolling(12,on='RY').INCIDENT_NO.sum()

Он дает следующий результат:

  ID         RY  
    AB10      2019     NaN
              2019     NaN
    AB1286    2011     NaN
              2012     NaN
              2014     NaN
                      ... 
    WS7       2020    30.0
    WS8       2016     NaN
    WS9       2014     NaN
              2018     NaN
              2019     NaN

Однако он не дал желаемого результата. Например, в ID AB10 2019 RY появляется дважды, он должен появиться один раз. Может ли кто-нибудь указать мне, где я сделал ошибку? Более того, я хочу показать скользящую сумму за каждый год (даже если данных нет). Например, идентификатор ws9 не содержит данных за 2020 год, он должен показывать нулевую сумму.

Любая помощь будет очень признательна.

Ответы [ 3 ]

1 голос
/ 04 августа 2020

Я думаю, вы должны сначала убедиться, что данные находятся в правильном порядке возрастания для каждого месяца по каждому идентификатору, сгруппировав «ID», «RY» и «месяц» (каждая строка представляет каждый месяц), а затем просто добавьте скользящую (12)

df.groupby(['ID', 'RY', 'month']).rolling(12).sum()
1 голос
/ 04 августа 2020

Если в ваших данных отсутствуют годы и месяцы, вы можете выполнить reindex данные и создать pivot_table.

df = df.groupby(["ID", "RY", "Month"])['INCIDENT_NO'].sum().reset_index()
idx = pd.MultiIndex.from_product([df['ID'].unique(),
                              range(df['RY'].min(), df['RY'].max()+1),
                              range(df['Month'].min(), df['Month'].max()+1)],
                             names=['ID', 'RY', 'Month'])
(df.set_index(["ID", "RY", "Month"]).reindex(idx).sort_index().fillna(0).reset_index()
 .pivot_table(index='ID', values='INCIDENT_NO', columns='RY', aggfunc='sum'))
Out[205]: 
RY      2011  2012  2013  2014  2015  2016  2017  2018  2019
ID                                                          
AB10     0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   6.0
AB1286   2.0   2.0   0.0   1.0   0.0   0.0   0.0   0.0   0.0
1 голос
/ 04 августа 2020

Думаю вам нужны groupby и sum:

df.groupby(['ID','RY'], as_index=False)['INCIDENT_NO'].sum().fillna(0, downcast='infer')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...