Tengo el siguiente marco de datos de pandas Top15
:
Creo una columna que estima la cantidad de documentos citables por persona:
Top15['PopEst'] = Top15['Energy Supply'] / Top15['Energy Supply per Capita']
Top15['Citable docs per Capita'] = Top15['Citable documents'] / Top15['PopEst']
Quiero saber la correlación entre el número de documentos citables per cápita y el suministro de energía per cápita. Entonces utilizo el .corr()
método (correlación de Pearson):
data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
correlation = data.corr(method='pearson')
Quiero devolver un solo número, pero el resultado es:
python
pandas
correlation
tong zhu
fuente
fuente
.corr
directamente a su marco de datos, devolverá todas las correlaciones por pares; es por eso que luego observa 1s en la diagonal de su matriz (cada columna está perfectamente correlacionada consigo misma). Vea mi edición a continuación.Respuestas:
Sin datos reales, es difícil responder la pregunta, pero supongo que está buscando algo como esto:
Eso calcula la correlación entre sus dos columnas
'Citable docs per Capita'
y'Energy Supply per Capita'
.Para dar un ejemplo:
Luego
da
1
como se esperaba.Ahora, si cambia un valor, p. Ej.
El comando
devoluciones
que todavía está cerca de 1, como se esperaba.
Si aplica
.corr
directamente a su marco de datos, devolverá todas las correlaciones por pares entre sus columnas ; es por eso que luego observa1s
en la diagonal de su matriz (cada columna está perfectamente correlacionada consigo misma).por lo tanto volverá
En el gráfico que muestra, solo se representa la esquina superior izquierda de la matriz de correlación (supongo).
Puede haber casos en los que obtenga
NaN
s en su solución; consulte esta publicación para ver un ejemplo.Si desea filtrar las entradas por encima o por debajo de un cierto umbral, puede marcar esta pregunta . Si desea trazar un mapa de calor de los coeficientes de correlación, puede verificar esta respuesta y si luego se encuentra con el problema de las etiquetas de eje superpuestas, consulte la siguiente publicación .
fuente
df.loc[1, :].corr(df.loc[2, :])
, también funcionará bien. Para toda la trama de datos, puede simplemente transponer:df.T.corr()
.1
en su caso en lugar de0.99586
?Me encontré con el mismo problema. Parecía que
Citable Documents per Person
era un flotador y Python lo salta de alguna manera por defecto. Todas las otras columnas de mi marco de datos estaban en formatos numpy, así que lo resolví convirtiendo la columna anp.float64
Recuerde que es exactamente la columna que calculó usted mismo.
fuente
Mi solución sería después de convertir datos a tipo numérico:
fuente
Si desea las correlaciones entre todos los pares de columnas, puede hacer algo como esto:
fuente
Cuando llamas a esto:
Dado que la función DataFrame.corr () realiza correlaciones por pares, tiene cuatro pares de dos variables. Entonces, básicamente está obteniendo valores diagonales como autocorrelación (correlación consigo mismo, dos valores ya que tiene dos variables), y otros dos valores como correlaciones cruzadas de uno contra otro y viceversa.
Realice la correlación entre dos series para obtener un valor único:
o, si desea un solo valor de la misma función (corr. DataFrame):
Espero que esto ayude.
fuente
Funciona así:
fuente
Resolví este problema cambiando el tipo de datos. Si ve el 'Suministro de energía per cápita' es un tipo numérico, mientras que 'Documentos citables per cápita' es un tipo de objeto. Convertí la columna a flotar usando un tipo. Tuve el mismo problema con algunas funciones np:
count_nonzero
ysum
trabajé mientrasmean
ystd
no lo hice.fuente
cambiar 'Documentos citables per cápita' a numérico antes de la correlación resolverá el problema.
fuente