Pandas корреляция только на одном столбце, содержащем массивы np - PullRequest
1 голос
/ 16 января 2020

Я работаю с кадром данных со столбцом, содержащим 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])

Это работает, но я хочу знать, есть ли еще Pythoni c способ сделать это, возможно, используя 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 Ответ

1 голос
/ 16 января 2020

Массивы, которые вы хотите коррелировать, отображаются в отдельных ячейках 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()
...