2017-06-14 1 views
3

Existe-t-il un moyen de vérifier la dépendance linéaire pour les colonnes dans une base de données pandas? Par exemple:Existe-t-il un moyen de vérifier les colonnes linéairement dépendantes dans une base de données?

columns = ['A','B', 'C'] 
df = pd.DataFrame(columns=columns) 
df.A = [0,2,3,4] 
df.B = df.A*2 
df.C = [8,3,5,4] 
print(df) 

    A B C 
0 0 0 8 
1 2 4 3 
2 3 6 5 
3 4 8 4 

est-il un moyen de montrer que la colonne B est une combinaison linéaire de A, mais C est une colonne indépendante? Mon but ultime est d'exécuter une régression poisson sur un ensemble de données, mais je continue d'obtenir une erreur LinAlgError: Singular matrix, ce qui signifie qu'il n'y a pas d'inverse de ma base de données et qu'elle contient donc des colonnes dépendantes.

Je voudrais trouver un moyen de vérifier chaque fonction et de vérifier qu'il n'y a pas de colonnes dépendantes.

+0

vous devriez être en mesure de réaliser ce que vous avez besoin avec 'numpy' et ce poste: https://stackoverflow.com/questions/28816627/how-to-find-linearly-independent-rows -à partir d'une matrice –

Répondre

3

Si vous avez SymPy vous pouvez utiliser le "reduced row echelon form" via sympy.matrix.rref:

>>> import sympy 
>>> reduced_form, inds = sympy.Matrix(df.values).rref() 
>>> reduced_form 
Matrix([ 
[1.0, 2.0, 0], 
[ 0, 0, 1.0], 
[ 0, 0, 0], 
[ 0, 0, 0]]) 

>>> inds 
[0, 2] 

Les colonnes de pivot (stockées sous forme inds) représentent les « numéros colonne » qui sont linéaires indépendants, et vous pouvez simplement « couper loin » les autres:

>>> df.iloc[:, inds] 
    A C 
0 0 8 
1 2 3 
2 3 5 
3 4 4