Как получить p-значение и r Пирсона для списка столбцов в Pandas?

Я пытаюсь сделать мультииндексированную таблицу (матрицу) коэффициентов корреляции и p-значений. Я бы предпочел использовать тесты scipy.stats.

x = pd.DataFrame(
    list(
        zip(
            [1,2,3,4,5,6], [5, 7, 8, 4, 2, 8], [13, 16, 12, 11, 9, 10]
            )
            ),
            columns= ['a', 'b', 'c'] 
            )
 

# I've tried something like this
for i in range(len(x.columns)):
    r,p = pearsonr(x[x.columns[i]], x[x.columns[i+1]])
    print(f'{r}, {p}')

Очевидно, что for loop не сработает. Что я хочу получить в итоге:

а б с а р 1,0 -0,09 -0,8 п .00 0,87 0,06 б р -0,09 1 .42 п 0,87 .00 .41 с р -0,8 .42 1 п 0,06 .41 00

Я написал код для решения этой проблемы (с помощью этого сообщества) несколько лет назад, но он работал только для более старой версии spearmanr.

Любая помощь будет очень высоко ценится.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот один из способов сделать это с помощью методов scipy pearsonr и Pandas corr:

import pandas as pd
from scipy.stats import pearsonr

def pearsonr_pval(x, y):
    return pearsonr(x, y)[1]


df = (
    pd.concat(
        [
            x.corr(method = "pearson").reset_index().assign(value = "r"),
            x.corr(method=pearsonr_pval).reset_index().assign(value = "p"),
        ]
    )
    .groupby(["index", "value"])
    .agg(lambda x: list(x)[0])
).sort_index(ascending=[True, False])

df.index.names = ["", ""]

Затем:

print(df)
# Output
            a         b         c

a r  1.000000 -0.088273 -0.796421
  p  1.000000  0.867934  0.057948
b r -0.088273  1.000000  0.421184
  p  0.867934  1.000000  0.405583
c r -0.796421  0.421184  1.000000
  p  0.057948  0.405583  1.000000

Спасибо большое, я пытаюсь написать несколько функций, которые будут возвращать вывод python в стиле, более знакомом пользователям SPSS, чтобы помочь им изучить python, вы герой.

KevOMalley743 28.11.2022 14:06

Как мне отредактировать этот код, чтобы индекс находился в том же порядке, что и столбцы?

KevOMalley743 29.11.2022 14:28

Привет, добавление .reindex(labels=x.columns, level=0) после первого sort_index должно помочь. Ваше здоровье.

Laurent 29.11.2022 18:31

Другие вопросы по теме