Как сгенерировать лаговую переменную для несбалансированной панели в Pandas кадре данных? - PullRequest
1 голос
/ 12 июля 2020

Для несбалансированных панельных данных мне трудно сгенерировать лаговую переменную, особенно длина лага больше 2. Например, у меня есть набор данных, который представляет собой несбалансированные панельные данные. Задача состоит в том, чтобы сгенерировать двухмесячную переменную с задержкой. двухмесячное наблюдение, то есть дата 1990-6-1 соответствует 1990-4-1. Мои коды не могут это понять.

   id       date  value  lag2value
0   1 1990-01-01    1.0        NaN
1   1 1990-02-01    2.0        NaN
2   1 1990-03-01    3.0        1.0
3   2 1989-12-01    3.0        NaN
4   2 1990-01-01    3.0        NaN
5   2 1990-02-01    4.0        3.0
6   2 1990-03-01    5.5        3.0
7   2 1990-04-01    5.0        4.0
8   2 1990-06-01    6.0        NaN

Одно из возможных решений - создать полную таблицу дат, которая представляет собой сбалансированный набор данных панели, и объединить с ней текущую таблицу. Однако, если рабочие данные велики, работа над всей таблицей занимает много времени.

Я хочу знать какое-нибудь изящное решение проблемы? Заранее спасибо.

1 Ответ

1 голос
/ 12 июля 2020

Используйте:

val = df.set_index('date').groupby('id').resample('MS').asfreq()['value']
val  = val.groupby(level=0).shift(2) 
df['lag2val'] = df.set_index(['id', 'date']).index.map(val)

Подробности:

ШАГ A: Используйте DataFrame.groupby на id и используйте groupby.resample, чтобы пересчитать сгруппированный кадр с ежемесячной начальной частотой.

print(val)
id  date      
1   1990-01-01    1.0
    1990-02-01    2.0
    1990-03-01    3.0
2   1989-12-01    3.0
    1990-01-01    3.0
    1990-02-01    4.0
    1990-03-01    5.5
    1990-04-01    5.0
    1990-05-01    NaN
    1990-06-01    6.0
Name: value, dtype: float64

ШАГ B: Используйте Series.groupby на level=0 для группировки ряды val и shift 2 периода вниз, чтобы создать запаздывающую серию 2 месяцев val.

print(val)
id  date      
1   1990-01-01    NaN
    1990-02-01    NaN
    1990-03-01    1.0
2   1989-12-01    NaN
    1990-01-01    NaN
    1990-02-01    3.0
    1990-03-01    3.0
    1990-04-01    4.0
    1990-05-01    5.5
    1990-06-01    5.0
Name: value, dtype: float64

ШАГ C: Наконец, используйте set_index вместе с Series.map для сопоставления новой отсроченной серии val с исходным фреймом данных df.

print(df)
   id       date  value  lag2val
0   1 1990-01-01    1.0      NaN
1   1 1990-02-01    2.0      NaN
2   1 1990-03-01    3.0      1.0
3   2 1989-12-01    3.0      NaN
4   2 1990-01-01    3.0      NaN
5   2 1990-02-01    4.0      3.0
6   2 1990-03-01    5.5      3.0
7   2 1990-04-01    5.0      4.0
8   2 1990-06-01    6.0      5.0
...