создавать элементы задержки на основе нескольких столбцов - PullRequest
1 голос
/ 09 октября 2019

У меня есть набор данных временного ряда. Мне нужно извлечь особенности лага. я использую код ниже, но получил все NAN

df.groupby(['week','id1','id2','id3'],as_index=False)['value'].shift(1)

вход

week,id1,id2,id3,value
1,101,123,001,45
1,102,231,004,89
1,203,435,099,65
2,101,123,001,48
2,102,231,004,75
2,203,435,099,90

выход

week,id1,id2,id3,value,t-1
1,101,123,001,45,NAN
1,102,231,004,89,NAN
1,203,435,099,65,NAN
2,101,123,001,48,45
2,102,231,004,75,89
2,203,435,099,90,65

1 Ответ

1 голос
/ 09 октября 2019

Вы хотите перейти на следующую неделю, поэтому удалите 'week' из группировки:

df['t-1'] = df.groupby(['id1','id2','id3'],as_index=False)['value'].shift()
#    week  id1  id2  id3  value   t-1
#0     1  101  123    1     45   NaN
#1     1  102  231    4     89   NaN
#2     1  203  435   99     65   NaN
#3     2  101  123    1     48  45.0
#4     2  102  231    4     75  89.0
#5     2  203  435   99     90  65.0

Это ошибка, которая может пропустить недели. В этом случае мы можем объединиться после изменения недели, что гарантирует, что это предыдущая неделя, независимо от пропущенных недель.

df2 = df.assign(week=df.week+1).rename(columns={'value': 't-1'})
df = df.merge(df2, on=['week', 'id1', 'id2', 'id3'], how='left')

Еще один способ перенести и переименовать множество столбцов - использовать аргумент suffixes в слиянии. Это переименует все перекрывающиеся столбцы (не являющиеся ключами) в правильном фрейме данных.

df.merge(df.assign(week=df.week+1),         # Manally lag
         on=['week', 'id1', 'id2', 'id3'], 
         how='left',
         suffixes=['', '_lagged']           # Right df columns -> _lagged
         )
#   week  id1  id2  id3  value  value_lagged
#0     1  101  123    1     45           NaN
#1     1  102  231    4     89           NaN
#2     1  203  435   99     65           NaN
#3     2  101  123    1     48          45.0
#4     2  102  231    4     75          89.0
#5     2  203  435   99     90          65.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...