Фрейм данных Pandas для нескольких матриц смежности

#python #pandas

#python #pandas

Вопрос:

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

Вот упрощенная версия моих данных:

 df = pd.DataFrame({'Location' : [1]*7   [2]*7,
                   'Postcode' : ['XXX XXX']*7   ['YYY YYY']*7,
                   'Date' : ['03-12-2021', '04-12-2021', '05-12-2021', '06-12-2021', '07-12-2021',
                             '08-12-2021', '09-12-2021', '03-12-2021', '04-12-2021', '05-12-2021',
                             '06-12-2021', '07-12-2021', '08-12-2021', '09-12-2021'],
                   'Var 1' : [6.9, 10.2, 9.2, 7.6, 9.8, 8.6, 10.6, 9.9, 9.4, 9, 9.4, 9.1, 8, 9.9],
                   'Var 2' : [14.5, 6.2, 9.7, 12.7, 14.8, 12, 12.2, 12.3, 14.2, 13.8, 11.7, 17.8,
                              10.7, 12.3]})
df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)


    Location Postcode       Date  Var 1  Var 2
0          1  XXX XXX 2021-12-03    6.9   14.5
1          1  XXX XXX 2021-12-04   10.2    6.2
2          1  XXX XXX 2021-12-05    9.2    9.7
3          1  XXX XXX 2021-12-06    7.6   12.7
4          1  XXX XXX 2021-12-07    9.8   14.8
5          1  XXX XXX 2021-12-08    8.6   12.0
6          1  XXX XXX 2021-12-09   10.6   12.2
7          2  YYY YYY 2021-12-03    9.9   12.3
8          2  YYY YYY 2021-12-04    9.4   14.2
9          2  YYY YYY 2021-12-05    9.0   13.8
10         2  YYY YYY 2021-12-06    9.4   11.7
11         2  YYY YYY 2021-12-07    9.1   17.8
12         2  YYY YYY 2021-12-08    8.0   10.7
13         2  YYY YYY 2021-12-09    9.9   12.3
 

Результат, который я хочу создать, — это то, что каждая переменная будет находиться через 1, 2, 3 и т.д. Дней от переменной даты, поэтому это будет выглядеть так:

введите описание изображения здесь

Но я понятия не имею, как и с чего начать. Моя единственная мысль — это несколько циклов for, но на самом деле у меня есть сотни местоположений и 10 переменных для 14 дат каждая, так что это большой набор данных, и это было бы очень неэффективно. Я чувствую, что должна быть функция или более простой способ добиться этого.

Ответ №1:

Создайте DatetimIndex и затем DataFrameGroupBy.shift используйте суффикс DataFrame.add_suffix withadd с {i:02} помощью for 01, 02..10, 11 для правильной сортировки имен столбцов на последнем шаге:

 df = df.set_index('Date')

for i in range(1,7):
    df = df.join(df.groupby('Location')[['Var 1', 'Var 2']].shift(freq=f'-{i}d')
                   .add_suffix(f'  Day {i:02}'), on=['Location','Date'])
    
df = df.set_index(['Location','Postcode'], append=True).sort_index(axis=1)