Как подготовить панельные данные к машинному обучению на Python? - PullRequest
1 голос
/ 08 октября 2019

У меня есть набор данных панели / временной ряд. Я хочу подготовить набор данных для прогнозирования машинного обучения в следующем году. Мои данные выглядят так:

ID,year,age,area,debt_ratio,gcp
654001,2013,49,East,0.14,0
654001,2014,50,East,0.17,0
654001,2015,51,East,0.23,1
654001,2016,52,East,0.18,0
112089,2013,39,West,0.13,0
112089,2014,40,West,0.15,0
112089,2015,41,West,0.18,1
112089,2016,42,West,0.21,1

То, что я хочу, выглядит примерно так:

ID,year,age,area,debt_ratio,gcp,gcp-1,gcp-2,gcp-3
654001,2013,49,East,0.14,0,NA,NA,NA
654001,2014,50,East,0.17,0,0,NA,NA
654001,2015,51,East,0.23,1,0,0,NA
654001,2016,52,East,0.18,0,1,0,0
112089,2013,39,West,0.13,0,NA,NA,NA
112089,2014,40,West,0.15,0,0,NA,NA
112089,2015,41,West,0.18,1,0,0,NA
112089,2016,42,West,0.21,1,1,0,0

Я пробовал функцию плавления Панд, но она не сработала. Я искал в Интернете и нашел этот пост, который является именно тем, что я хочу сделать, но это сделано в R:

https://stackoverflow.com/questions/19813077/prepare-time-series-for-machine-learning-long-to-wide-format

Кто-нибудь знает, как это сделать в Python Pandas? Любое предложение будет оценено!

1 Ответ

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

Использование DataFrameGroupBy.shift в цикле:

for i in range(1, 4):
    df[f'gcp-{i}'] = df.groupby('ID')['gcp'].shift(i)
print (df)
       ID  year  age  area  debt_ratio  gcp  gcp-1  gcp-2  gcp-3
0  654001  2013   49  East        0.14    0    NaN    NaN    NaN
1  654001  2014   50  East        0.17    0    0.0    NaN    NaN
2  654001  2015   51  East        0.23    1    0.0    0.0    NaN
3  654001  2016   52  East        0.18    0    1.0    0.0    0.0
4  112089  2013   39  West        0.13    0    NaN    NaN    NaN
5  112089  2014   40  West        0.15    0    0.0    NaN    NaN
6  112089  2015   41  West        0.18    1    0.0    0.0    NaN
7  112089  2016   42  West        0.21    1    1.0    0.0    0.0

Более динамичное решение - получить максимальное количество групп и перейти к range:

N = df['ID'].value_counts().max()

for i in range(1, N):
    df[f'gcp-{i}'] = df.groupby('ID')['gcp'].shift(i)
print (df)
       ID  year  age  area  debt_ratio  gcp  gcp-1  gcp-2  gcp-3
0  654001  2013   49  East        0.14    0    NaN    NaN    NaN
1  654001  2014   50  East        0.17    0    0.0    NaN    NaN
2  654001  2015   51  East        0.23    1    0.0    0.0    NaN
3  654001  2016   52  East        0.18    0    1.0    0.0    0.0
4  112089  2013   39  West        0.13    0    NaN    NaN    NaN
5  112089  2014   40  West        0.15    0    0.0    NaN    NaN
6  112089  2015   41  West        0.18    1    0.0    0.0    NaN
7  112089  2016   42  West        0.21    1    1.0    0.0    0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...