it-swarm.asia

قائمة أعلى أزواج من مصفوفة

كيف يمكنك العثور على أعلى الارتباطات في مصفوفة الارتباط مع Pandas؟ هناك العديد من الإجابات حول كيفية القيام بذلك باستخدام R ( إظهار الارتباطات كقائمة مرتبة ، وليس كمصفوفة كبيرة أو طريقة فعالة للحصول على أزواج مترابطة للغاية من مجموعة كبيرة من البيانات في Python أو R ) ، لكنني أتساءل كيف أفعل ذلك مع الباندا؟ في حالتي المصفوفة 4460 × 4460 ، لذلك لا يمكن أن تفعل ذلك بصريا.

52
Kyle Brandt

يمكنك استخدام DataFrame.values للحصول على مجموعة numpy من البيانات ثم استخدام وظائف NumPy مثل argsort() للحصول على أكثر الأزواج ارتباطًا.

ولكن إذا كنت تريد القيام بذلك في الباندا ، فيمكنك unstack و order 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.sort_values(kind="quicksort")

print so[-4470:-4460]

هنا هو الإخراج:

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
64
HYRY

@ HYRY الجواب هو الكمال. ما عليك سوى الاعتماد على هذه الإجابة عن طريق إضافة المزيد من المنطق لتجنب الارتباطات المكررة والنفسية والفرز الصحيح:

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))

وهذا يعطي الإخراج التالي:

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
26
arun

حل خطوط قليلة دون أزواج زائدة من المتغيرات:

corr_matrix = df.corr().abs()

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

من خلال الجمع بين بعض ميزات @ HYRY وإجابات @ arun ، يمكنك طباعة الارتباطات العليا لملف البيانات df في سطر واحد باستخدام:

df.corr().unstack().sort_values().drop_duplicates()

ملاحظة: الجانب السلبي هو إذا كان لديك 1.0 ارتباطات ليست متغير واحد لنفسها ، فإن الوظيفة drop_duplicates() ستزيلها

7
Addison Klinke

استخدم itertools.combinations للحصول على جميع الارتباطات الفريدة من مصفوفة الارتباط الخاصة بـ pandas .corr() ، وقم بإنشاء قائمة من القوائم وأعدها مرة أخرى إلى DataFrame لاستخدام '.sort_values'. اضبط ascending = True لعرض أدنى الارتباطات في الأعلى

corrank يأخذ DataFrame كوسيطة لأنه يتطلب .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)
2
Frederik Meinertsen

استخدم الكود أدناه لعرض الارتباطات بالترتيب التنازلي.

# See the correlations in descending order

corr = df.corr() # df is the pandas dataframe
c1 = corr.abs().unstack()
c1.sort_values(ascending = False)
2
prashanth

الكثير من الإجابات الجيدة هنا. أسهل طريقة وجدت هي مزيج من بعض الإجابات أعلاه.

corr = corr.where(np.triu(np.ones(corr.shape), k=1).astype(np.bool))
corr = corr.unstack().transpose()\
    .sort_values(by='column', ascending=False)\
    .dropna()
1
Rich Wandell