Векторизовать код в больших пандах Dataframe, где каждая строка должна рассматриваться как пустой массив - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть большой пандх Dataframe, который по сути имеет структуру, подобную следующей:

df = pd.DataFrame(np.random.randint(0,100,size=(20, 20)), columns=list('ABCDEFGHIJKLMNOPQRST'))

Каждая из «строк» ​​представляет собой массив чисел.Например:

row_one = df.iloc[0, :].values
row_two = df.iloc[1, :].values
....

Я хотел бы рассчитать коэффициент корреляции (np.corrcoef) между всеми комбинациями строк, например:

np.corrcoef(row_one, row_one)[0][1]
np.corrcoef(row_one, row_two)[0][1]
np.corrcoef(row_one, row_three)[0][1]
....
np.corrcoef(row_two, row_one)[0][1]
np.corrcoef(row_one, row_two)[0][1]
np.corrcoef(row_one, row_three)[0][1]
...

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Самый простой способ сделать это - использовать встроенный метод панды .corr().Однако обратите внимание, что он вычисляет его по столбцам по умолчанию:

Вычисляет попарную корреляцию столбцов, исключая значения NA / NULL

Таким образом, вы можете сделать:

df.T.corr()

Вы можете проверить любую парную корреляцию, выполнив:

row_one = df.iloc[0, :].values
row_two = df.iloc[1, :].values
np.corrcoef(row_one,row_two)

В качестве простого примера:

df = pd.DataFrame(np.random.randint(0,10,size=(3, 3)), columns=list('ABC'))

  0         1         2
0  1.000000 -0.479317 -0.921551
1 -0.479317  1.000000  0.782467
2 -0.921551  0.782467  1.000000

Проверка строк 0 и 1, напримерВы можете видеть, что результат тот же:

row_one = df.iloc[0, :].values
row_two = df.iloc[1, :].values
np.corrcoef(row_one,row_two)

array([[ 1.        , -0.47931716],
       [-0.47931716,  1.        ]])
0 голосов
/ 30 декабря 2018

У Панд уже есть метод для этого: corr.Он работает со столбцами, поэтому вам просто нужно транспонировать ваш фрейм данных.

corr_matrix = df.T.corr()

Он сгенерирует матрицу корреляции, в которой вы сможете найти коэффициент корреляции между наборами данных.Таким образом, коэффициент для 4-го и 7-го набора данных равен corr_matrix.iloc[3, 6] (или corr_matrix.iloc[6, 3], поскольку он симметричен).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...