2015-10-08 3 views
3

У меня есть dataframe, который индексируется по дате и имеет четыре столбца, все целые числа.np.subtract.outer() возвращает больше измерений, чем я ожидаю

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

  A B C D 
1/1/2013 7 -1 1 2 

Я хотел бы сделать 2d массив, который выглядит следующим образом:

 A B C D 
     7 -1 1 2 
A 7 0 8 6 5 
B -1 -8 0 -2 -3 
C 1 -6 2 0 -1 
D 2 -5 3 1 0 

где значения данных являются комбинации различий между значениями столбцов,.

Тогда я хотел бы сделать этот 2d массив для каждой даты в оригинальном dataframe

Я пытался сделать это «pythonically/панда-Ly» без грубых петель и вещей.

Я сделал простейший случай - оригинальный dataframe имеет только один ряд данных:

ddf is type <class 'pandas.core.frame.DataFrame'>, shape (1, 4) 
      A B C D 
2013-01-02 7 -1 1 2 

кормлю, что DDF в

def makeRelativeChangeDF(deltaDF): 
    """return array wit all the combinations of differences between columns""" 
    return np.subtract.outer(deltaDF, deltaDF) 

Это возвращает:

rcdf is type <class 'pandas.core.frame.DataFrame'>, shape (1, 4) 
[[[[ 0. 8. 6. 5.]] 

    [[-8. 0. -2. -3.]] 

    [[-6. 2. 0. -1.]] 

    [[-5. 3. 1. 0.]]]] 

Не уверен, почему это дает странную форму (1,4). Я ожидал (4,4). И, глядя на распечатку rcdf, я вижу, что он сильно обернут множеством массивов. Наверное, я неправильно использую внешнюю функцию. Я хотел бы сделать это правильно, чем использовать уродливые перетаскивающие хаки, чтобы вытащить (исправить) данные, но переупаковать их в правильной форме.

ответ

1

Вы можете преобразовать 2D ввода dataframe в серии 1D, выбрав первую строку с .iloc[0], а затем использовать np.subtract.outer(), как так -

np.subtract.outer(deltaDF.iloc[0],deltaDF.iloc[0]) 

Кажется, вы также можете использовать broadcasting -

deltaDF.iloc[0][:,None] - deltaDF.iloc[0][None,:] 

Образец пробы -

In [107]: type(deltaDF) 
Out[107]: pandas.core.frame.DataFrame 

In [108]: np.subtract.outer(deltaDF.iloc[0],deltaDF.iloc[0]) 
Out[108]: 
array([[ 0, 8, 6, 5], 
     [-8, 0, -2, -3], 
     [-6, 2, 0, -1], 
     [-5, 3, 1, 0]]) 

In [109]: deltaDF.iloc[0][:,None] - deltaDF.iloc[0][None,:] 
Out[109]: 
array([[ 0, 8, 6, 5], 
     [-8, 0, -2, -3], 
     [-6, 2, 0, -1], 
     [-5, 3, 1, 0]]) 
+0

Спасибо. Смешающая проблема заключается в том, что «массив» - это фактически строка из DataFrame. ravel() работает только с np.array, поэтому мне нужно выяснить, как пройти через фреймворк данных и обрабатывать каждую индексированную строку как np.array для этого. (Задал отдельный вопрос по этой проблеме) – user3556757

+0

@ user3556757 Проверьте, пожалуйста, редактирование. – Divakar

Смежные вопросы