Корреляция панд только на одном столбце, содержащем массивы np

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

Это мой код

lenght = len(df.Mean)
Mean = []   
for i in range(len(df.Mean)):
    Mean.append(df.Mean[i])

Correlation_p = np.zeros((lenght,lenght))
P_Value_p = np.zeros((lenght,lenght))

for i in range(lenght):
    for j in range(lenght):
        Correlation_p[i][j],P_Value_p[i][j] = stats.pearsonr(df.Mean[i],df.Mean[j])

Это работает, но я хочу знать, есть ли более питонный способ сделать это, возможно, с помощью df.corr() . Я пытался, но мне не удалось это сделать.

РЕДАКТИРОВАТЬ: вывод df.Mean.head()

0    [-0.2559348091247745, 0.02743063113723536, 0.3...
1    [-0.37025615099744325, -0.11299328141596175, 0...
2    [-1.0543681894876467, -0.8452798699354909, -0....
3    [-0.23527437766943646, -0.28657810260136585, -...
4    [0.45557980303095674, 0.6055674269814991, 0.74...
Name: Mean, dtype: object

Всего 1 ответ


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

df = pd.DataFrame({'x':[np.random.randint(0,5,10), np.random.randint(0,5,10), np.random.randint(0,5,10)]})

Вы можете превратить эти массивы в столбцы, используя это:

df = pd.DataFrame(np.array(df['x'].tolist()).transpose())

Адаптируйте параметры изменения формы в соответствии с вашими собственными размерами. Оттуда это было бы довольно просто.

Корреляционная матрица может быть создана:

df.corr()

Визуализация корреляционной матрицы:

import matplotlib.pyplot as plt
plt.matshow(df.corr())
plt.show()

Есть идеи?

10000