У меня есть 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, я вижу, что он сильно обернут множеством массивов. Наверное, я неправильно использую внешнюю функцию. Я хотел бы сделать это правильно, чем использовать уродливые перетаскивающие хаки, чтобы вытащить (исправить) данные, но переупаковать их в правильной форме.
Спасибо. Смешающая проблема заключается в том, что «массив» - это фактически строка из DataFrame. ravel() работает только с np.array, поэтому мне нужно выяснить, как пройти через фреймворк данных и обрабатывать каждую индексированную строку как np.array для этого. (Задал отдельный вопрос по этой проблеме) – user3556757
@ user3556757 Проверьте, пожалуйста, редактирование. – Divakar