Я пытаюсь сделать мультииндексированную таблицу (матрицу) коэффициентов корреляции и 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
не сработает. Что я хочу получить в итоге:
Я написал код для решения этой проблемы (с помощью этого сообщества) несколько лет назад, но он работал только для более старой версии spearmanr
.
Любая помощь будет очень высоко ценится.
Вот один из способов сделать это с помощью методов 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
Как мне отредактировать этот код, чтобы индекс находился в том же порядке, что и столбцы?
Привет, добавление .reindex(labels=x.columns, level=0)
после первого sort_index
должно помочь. Ваше здоровье.
Спасибо большое, я пытаюсь написать несколько функций, которые будут возвращать вывод python в стиле, более знакомом пользователям SPSS, чтобы помочь им изучить python, вы герой.