tutorial functions documentacion python pandas

functions - python pandas download windows



¿Enumera los pares de correlación más altos de una matriz de correlación grande en pandas? (4)

¿Cómo se encuentran las principales correlaciones en una matriz de correlación con Pandas? Hay muchas respuestas sobre cómo hacer esto con R ( Mostrar las correlaciones como una lista ordenada, no como una matriz grande o una forma eficiente de obtener pares altamente correlacionados de grandes conjuntos de datos en Python o R ), pero me pregunto cómo hacerlo con pandas? En mi caso, la matriz es 4460x4460, por lo que no puedo hacerlo visualmente.


Puede usar los DataFrame.values de DataFrame.values obtener una matriz numpy de los datos y luego usar las funciones de NumPy como argsort() para obtener los pares más correlacionados.

Pero si quieres hacer esto en pandas, puedes unstack y order el DataFrame:

import pandas as pd import numpy as np shape = (50, 4460) data = np.random.normal(size=shape) data[:, 1000] += data[:, 2000] df = pd.DataFrame(data) c = df.corr().abs() s = c.unstack() so = s.order(kind="quicksort") print so[-4470:-4460]

Aquí está el resultado:

2192 1522 0.636198 1522 2192 0.636198 3677 2027 0.641817 2027 3677 0.641817 242 130 0.646760 130 242 0.646760 1171 2733 0.670048 2733 1171 0.670048 1000 2000 0.742340 2000 1000 0.742340 dtype: float64


La respuesta de @ HYRY es perfecta. Simplemente aprovechando esa respuesta, agregue un poco más de lógica para evitar duplicados y autocorrelaciones y una clasificación adecuada:

import pandas as pd d = {''x1'': [1, 4, 4, 5, 6], ''x2'': [0, 0, 8, 2, 4], ''x3'': [2, 8, 8, 10, 12], ''x4'': [-1, -4, -4, -4, -5]} df = pd.DataFrame(data = d) print("Data Frame") print(df) print() print("Correlation Matrix") print(df.corr()) print() def get_redundant_pairs(df): ''''''Get diagonal and lower triangular pairs of correlation matrix'''''' pairs_to_drop = set() cols = df.columns for i in range(0, df.shape[1]): for j in range(0, i+1): pairs_to_drop.add((cols[i], cols[j])) return pairs_to_drop def get_top_abs_correlations(df, n=5): au_corr = df.corr().abs().unstack() labels_to_drop = get_redundant_pairs(df) au_corr = au_corr.drop(labels=labels_to_drop).sort_values(ascending=False) return au_corr[0:n] print("Top Absolute Correlations") print(get_top_abs_correlations(df, 3))

Eso da el siguiente resultado:

Data Frame x1 x2 x3 x4 0 1 0 2 -1 1 4 0 8 -4 2 4 8 8 -4 3 5 2 10 -4 4 6 4 12 -5 Correlation Matrix x1 x2 x3 x4 x1 1.000000 0.399298 1.000000 -0.969248 x2 0.399298 1.000000 0.399298 -0.472866 x3 1.000000 0.399298 1.000000 -0.969248 x4 -0.969248 -0.472866 -0.969248 1.000000 Top Absolute Correlations x1 x3 1.000000 x3 x4 0.969248 x1 x4 0.969248 dtype: float64


La solución de pocas líneas sin pares redundantes de variables:

corr_matrix = df.corr().abs() #the matrix is symmetric so we need to extract upper triangle matrix without diagonal (k = 1) os = (corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(np.bool)) .stack() .order(ascending=False)) #first element of os series is the pair with the bigest correlation


Utilice itertools.combinations para obtener todas las correlaciones únicas de la propia matriz de correlación de pandas .corr() , genere listas de listas y vuelva a alimentarlas en un DataFrame para poder usar ''.sort_values''. Establecer ascending = True para mostrar las correlaciones más bajas en la parte superior

corrank toma un DataFrame como argumento porque requiere .corr() .

def corrank(X): import itertools df = pd.DataFrame([[(i,j),X.corr().loc[i,j]] for i,j in list(itertools.combinations(X.corr(), 2))],columns=[''pairs'',''corr'']) print(df.sort_values(by=''corr'',ascending=False)) corrank(X) # prints a descending list of correlation pair (Max on top)