Многоиндексный DataFrame для последовательности матриц смежности (Numpy 3D Array) - PullRequest
0 голосов
/ 31 марта 2019

Я хотел бы преобразовать многоиндексный фрейм данных в последовательность матриц смежности или массив Numpy 3d, индексированный по временным координатам.

Вот фрейм данных:

Boxes = {'Date': ['2016-01-01 00:00:00', '2016-01-01 00:00:00', 
        '2016-01-01 00:00:00', '2016-01-01 12:00:00', '2016-01-01 12:00:00', 
        '2016-01-01 12:00:00', '2016-01-01 17:54:00', '2016-01-01 22:44:00'],
         'From': ['Green','Green','Green','Blue','Blue','Red','Red','Red'],
         'To': ['Rectangle','Rectangle','Square','Rectangle','Square','Square','Square','Rectangle'],
         'Qty': ['12', '3', '43', '125', '34', '76', '9', '222' ]}

df = pd.DataFrame(Boxes, columns= ['Date', 'From', 'To', 'Qty'])

Я могу создать многоиндексный фрейм данных с помощью

dups = df.pivot_table(index=['Date'], columns = ['From', 'To'], values = ['Qty'], aggfunc=np.sum).fillna(0)

Каков наилучший способ преобразовать этот многоиндексный фрейм данных в последовательность матриц смежности, которые индексируются компонентом времени?или, чтобы создать массив массивов 3d следующим образом:

[[[ 0.   0.   0.   15.  43.]
  [ 0.   0.   0.   0.   0.]
  [ 0.   0.   0.   0.   0.]
  [ 0.   0.   0.   0.   0.]
  [ 0.   0.   0.   0.   0.]]

 [[ 0.   0.   0.   0.    0.]
  [ 0.   0.   0.   125.  34.]
  [ 0.   0.   0.   0.    76.]
  [ 0.   0.   0.   0.    0.]
  [ 0.   0.   0.   0.    0.]]

 [[ 0.   0.   0.   0.    0.]
  [ 0.   0.   0.   0.    0.]
  [ 0.   0.   0.   0.    9.]
  [ 0.   0.   0.   0.    0.]
  [ 0.   0.   0.   0.    0.]]

 [[ 0.   0.   0.   0.      0.]
  [ 0.   0.   0.   0.      0.]
  [ 0.   0.   0.   222.    0.]
  [ 0.   0.   0.   0.      0.]
  [ 0.   0.   0.   0.      0.]]]

Поскольку эти матрицы будут разреженными, может быть более эффективным будет список смежности.Спасибо!

1 Ответ

0 голосов
/ 31 марта 2019

Поскольку вы не предоставили ожидаемый результат, я могу предложить только способ преобразования в массив 3 d

d1 = len(dups.columns.get_level_values(1).unique())
d2 = len(dups.columns.get_level_values(2).unique())
a = dups.values.reshape((len(dups), d1, d2))
a.shape
Out[450]: (4, 3, 2)
...