Eu tenho o seguinte quadro de dados de pandas Top15
:
Crio uma coluna que estima o número de documentos citáveis por pessoa:
Top15['PopEst'] = Top15['Energy Supply'] / Top15['Energy Supply per Capita']
Top15['Citable docs per Capita'] = Top15['Citable documents'] / Top15['PopEst']
Quero conhecer a correlação entre o número de documentos citáveis per capita e o suprimento de energia per capita. Então, eu uso o .corr()
método (correlação de Pearson):
data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
correlation = data.corr(method='pearson')
Quero retornar um único número, mas o resultado é:
python
pandas
correlation
tong zhu
fonte
fonte
.corr
diretamente ao seu quadro de dados, ele retornará todas as correlações aos pares; é por isso que você observa 1s na diagonal de sua matriz (cada coluna está perfeitamente correlacionada com ela mesma). Veja minha edição abaixo.Respostas:
Sem dados reais, é difícil responder à pergunta, mas acho que você está procurando algo parecido com isto:
Isso calcula a correlação entre suas duas colunas
'Citable docs per Capita'
e'Energy Supply per Capita'
.Para dar um exemplo:
Então
dá
1
como esperado.Agora, se você alterar um valor, por exemplo
o comando
retorna
que ainda está próximo de 1, como esperado.
Se você aplicar
.corr
diretamente ao seu quadro de dados, ele retornará todas as correlações aos pares entre suas colunas ; é por isso que você observa1s
na diagonal de sua matriz (cada coluna está perfeitamente correlacionada consigo mesma).retornará, portanto,
No gráfico que você mostra, apenas o canto superior esquerdo da matriz de correlação é representado (presumo).
Pode haver casos em que você obtém
NaN
s em sua solução - verifique este post como exemplo.Se você deseja filtrar entradas acima / abaixo de um determinado limite, pode verificar esta pergunta . Se você deseja plotar um mapa de calor dos coeficientes de correlação, pode verificar esta resposta e, se encontrar o problema com rótulos de eixo sobrepostos, verifique a seguinte postagem .
fonte
df.loc[1, :].corr(df.loc[2, :])
, também funcionará bem. Para toda a trama de dados, você pode simplesmente transpor:df.T.corr()
.1
no seu caso em vez de0.99586
?Eu tive o mesmo problema. Parecia
Citable Documents per Person
um float e o python o ignora de alguma forma por padrão. Todas as outras colunas do meu dataframe estavam em formatos numpy, então resolvi convertendo o columnt paranp.float64
Lembre-se de que é exatamente a coluna que você calculou
fonte
Minha solução seria depois da conversão de dados para o tipo numérico:
fonte
Se você deseja as correlações entre todos os pares de colunas, pode fazer algo assim:
fonte
Quando você chama isso:
Como a função DataFrame.corr () executa correlações entre pares, você tem quatro pares de duas variáveis. Então, basicamente, você está obtendo valores diagonais como correlação automática (correlação consigo mesma, dois valores desde que você tem duas variáveis) e outros dois valores como correlações cruzadas entre um e outro e vice-versa.
Execute a correlação entre duas séries para obter um único valor:
ou, se você deseja um único valor da mesma função (corr do DataFrame):
Espero que isto ajude.
fonte
Funciona assim:
fonte
Resolvi esse problema alterando o tipo de dados. Se você vir 'Fornecimento de energia per capita' é um tipo numérico, enquanto 'Documentos citáveis per capita' é um tipo de objeto. Eu converti a coluna para flutuar usando astype. Eu tive o mesmo problema com algumas funções np:
count_nonzero
esum
trabalhou enquantomean
estd
não o fez.fonte
alterar 'Documentos citáveis per capita' para numérico antes que a correlação resolva o problema.
fonte