Итак, у меня есть следующий фрейм данных:
Period group ID
20130101 A 10
20130101 A 20
20130301 A 20
20140101 A 20
20140301 A 30
20140401 A 40
20130101 B 11
20130201 B 21
20130401 B 31
20140401 B 41
20140501 B 51
Мне нужно посчитать, сколько разных ID
существует на group
за последний год. Поэтому мой желаемый результат будет выглядеть следующим образом:
Period group num_ids_last_year
20130101 A 2 # ID 10 and 20 in the last year
20130301 A 2
20140101 A 2
20140301 A 2 # ID 30 enters, ID 10 leaves
20140401 A 3 # ID 40 enters
20130101 B 1
20130201 B 2
20130401 B 3
20140401 B 2 # ID 11 and 21 leave
20140501 B 2 # ID 31 leaves, ID 51 enters
Период в формате datetime. Я перепробовал много вещей в духе:
df.groupby(['group','Period'])['ID'].nunique() # Get number of IDs by group in a given period.
df.groupby(['group'])['ID'].nunique() # Get total number of IDs by group.
df.set_index('Period').groupby('group')['ID'].rolling(window=1, freq='Y').nunique()
Но последнее даже невозможно. Есть ли простой способ сделать это? Я думаю, может быть какая-то комбинация cumcount()
и pd.DateOffset
или, может быть, ge(df.Period - dt.timedelta(365)
, но я не могу найти ответ.
Спасибо.
Редактировать: добавили факт, что я могу найти более одного ID
в данном Period