পান্ডাসের একটি বৃহত্তর সম্পর্কযুক্ত ম্যাট্রিক্স থেকে সর্বাধিক সম্পর্ক সম্পর্কিত জোড়গুলি তালিকাবদ্ধ করুন?


97

পান্ডাদের সাথে কোনও সম্পর্কযুক্ত ম্যাট্রিক্সের মধ্যে শীর্ষের সম্পর্কগুলি কীভাবে খুঁজে পাবেন? আর এর মাধ্যমে এটি কীভাবে করা যায় সে সম্পর্কে অনেক উত্তর রয়েছে ( পাইথন বা আর-তে বড় ডেটা সেট থেকে উচ্চতর সম্পর্কযুক্ত জোড় পাওয়ার জন্য কোনও বৃহত ম্যাট্রিক্স বা দক্ষ উপায় হিসাবে নয়, অর্ডারযুক্ত তালিকার হিসাবে পারস্পরিক সম্পর্কগুলি দেখান ), তবে আমি কীভাবে এটি করব তা ভাবছি পান্ডার সাথে? আমার ক্ষেত্রে ম্যাট্রিক্স 4460x4460, সুতরাং এটি চাক্ষুষভাবে করতে পারবেন না।

উত্তর:


93

আপনি DataFrame.valuesডেটাটির একটি অলরেডি অ্যারে ব্যবহার করতে পারেন এবং তারপরে argsort()সর্বাধিক সম্পর্কযুক্ত জোড় পেতে যেমন NumPy ফাংশন ব্যবহার করতে পারেন।

তবে আপনি যদি unstackপান্ডে এটি করতে চান তবে আপনি ডেটাফ্রেমে বাছাই করতে পারেন :

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

10
পান্ডাস ভি 0.17.0 এবং উচ্চতরর সাথে আপনার ক্রমের পরিবর্তে সাজ্ট_ভ্যালুগুলি ব্যবহার করা উচিত। আপনি অর্ডার পদ্ধতিটি ব্যবহার করার চেষ্টা করলে আপনি একটি ত্রুটি পাবেন।
ফ্রেন্ডম 1

46

@ 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

4
get_redundant_pairs (df) এর পরিবর্তে, আপনি "cor.loc [:,:] = np.tril (cor.values, k = -1)" এবং তারপরে "কর = কর [কর> 0]" ব্যবহার করতে পারেন
সারা

4
আমি লাইনের জন্য এরো পাচ্ছি au_corr = au_corr.drop(labels=labels_to_drop).sort_values(ascending=False):# -- partial selection or non-unique index
স্টলিং

41

ভেরিয়েবলের অপ্রয়োজনীয় জোড় ছাড়া কয়েকটি লাইন সমাধান:

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 biggest correlation

তারপরে আপনি ভেরিয়েবল পেয়ারের নামগুলি (যা পান্ডাস S সিরিজ মাল্টি-ইনডেক্সসমূহ) এবং এর মতো মানগুলির মাধ্যমে পুনরাবৃত্তি করতে পারেন:

for index, value in sol.items():
  # do some staff

4
সম্ভবত একটি খারাপ ধারণা ব্যবহার করতে osএকটি পরিবর্তনশীল নামের কারণ এটি মুখোশ osথেকে import osযদি কোডে প্রাপ্তিসাধ্য
দয়া

আপনার পরামর্শের জন্য ধন্যবাদ, আমি এই অপ্রয়োজনীয় ভার নাম পরিবর্তন করেছি।
MiFi

4
2018 হিসাবে আদেশের পরিবর্তে বাছাই_সামগ্রী (আরোহী = মিথ্যা) ব্যবহার করুন
সেরিফিনস

4
কিভাবে 'সল' লুপ করবেন ??
সিরজয়

4
@ সিরজয় আমি আপনার প্রশ্নের উত্তর উপরে রেখেছি
এমআইফাই

13

@ এইচআইআরওয়াই এবং @ অরুনের উত্তরগুলির কয়েকটি বৈশিষ্ট্যগুলির সংমিশ্রণটি dfব্যবহার করে আপনি একক লাইনে ডেটাফ্রেমের শীর্ষস্থানীয় সম্পর্কগুলি মুদ্রণ করতে পারেন :

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

নোট: এক downside হয় আপনি 1.0 সম্পর্কযুক্তরূপে যে আছে না নিজেই এক পরিবর্তনশীল, drop_duplicates()উপরন্তু তাদের সরিয়ে হবে


4
drop_duplicatesসমান যে সমস্ত পারস্পরিক সম্পর্ক বাতিল করবেন না ?
দয়া

@ শাদি হ্যাঁ, আপনি ঠিক বলেছেন। তবে, আমরা একমাত্র পারস্পরিক সম্পর্কগুলি সমানভাবে সমান হবে বলে ধরে নিয়েছি ১.০ এর সমঝোতা (অর্থাত্ নিজের সাথে একটি পরিবর্তনশীল)। সম্ভাবনা যে ভেরিয়েবল (অর্থাত দুই অনন্য বিদ্যমান জোড়া জন্য পারস্পরিক সম্পর্ক v1থেকে v2এবং v3থেকে v4) ঠিক একই হবে না
এডিসন Klinke

অবশ্যই আমার অনুকূল, সরলতা। আমার ব্যবহারে, আমি উচ্চ সংক্ষিপ্তসারগুলির জন্য প্রথমে ফিল্টার করেছি
জেমস আইগো

9

অবতরণ ক্রমের সাথে সম্পর্কিতগুলি দেখতে নীচের কোডটি ব্যবহার করুন।

# See the correlations in descending order

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

4
আপনার ২ য় লাইনটি হওয়া উচিত: c1 = কোর.abs ()। আনস্ট্যাক ()
জ্যাক ফ্লিটিং

বা প্রথম লাইনcorr = df.corr()
ভিজ্যুরডাতা

4

আপনি আপনার ডেটা স্থির করে এই সাধারণ কোড অনুসারে গ্রাফিক্যালি করতে পারেন।

corr = df.corr()

kot = corr[corr>=.9]
plt.figure(figsize=(12,8))
sns.heatmap(kot, cmap="Greens")

এখানে চিত্র বর্ণনা লিখুন


2

অনেক ভাল উত্তর এখানে। আমি খুঁজে পাওয়া সবচেয়ে সহজ উপায়টি উপরের কয়েকটি উত্তরের সংমিশ্রণ ছিল।

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

2

ব্যবহারের itertools.combinationsপান্ডাস থেকে সমস্ত অনন্য সম্পর্কযুক্তরূপে নিজের পারস্পরিক সম্পর্ক ম্যাট্রিক্স পেতে .corr(), তালিকা তালিকা তৈরী করা এবং ব্যবহার করার জন্য একটি DataFrame ফিরে এটি ভোজন '.sort_values'। ascending = Trueশীর্ষে সর্বনিম্ন সম্পর্কগুলি প্রদর্শন করতে সেট করুন

corrankএটি প্রয়োজন হিসাবে যুক্তি হিসাবে একটি ডেটা ফ্রেম নেয় .corr()

  def corrank(X: pandas.DataFrame):
        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)

4
যদিও এই কোড স্নিপেট একটি সমাধান সহ সমাধান হতে পারে, সত্যিই আপনার পোস্টের গুণমান উন্নত করতে সহায়তা করে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, এবং সেই লোকেরা আপনার কোড পরামর্শের কারণগুলি জানেন না।

1

আমি unstackএই সমস্যাটিকে অতিরিক্ত বা জটিল করতে চাইনি, যেহেতু আমি কেবল একটি বৈশিষ্ট্য নির্বাচন পর্বের অংশ হিসাবে কিছু উচ্চ সম্পর্কের বৈশিষ্ট্যগুলি ফেলে দিতে চেয়েছিলাম।

সুতরাং আমি নিম্নলিখিত সরলীকৃত সমাধান দিয়ে শেষ করেছি:

# map features to their absolute correlation values
corr = features.corr().abs()

# set equality (self correlation) as zero
corr[corr == 1] = 0

# of each feature, find the max correlation
# and sort the resulting array in ascending order
corr_cols = corr.max().sort_values(ascending=False)

# display the highly correlated features
display(corr_cols[corr_cols > 0.8])

এই ক্ষেত্রে, আপনি যদি সম্পর্কযুক্ত বৈশিষ্ট্যগুলি ছেড়ে দিতে চান তবে আপনি ফিল্টার করা corr_colsঅ্যারের মাধ্যমে ম্যাপ করতে এবং বিজোড়-সূচকযুক্ত (বা এমনকি সূচকযুক্ত) মুছে ফেলতে পারেন।


এটি কেবলমাত্র একটি সূচি দেয় (বৈশিষ্ট্য) এবং বৈশিষ্ট্য 1 বৈশিষ্ট্য 0.98 এর মতো কিছু নয়। পরিবর্তন লাইন corr_cols = corr.max().sort_values(ascending=False)থেকে corr_cols = corr.unstack()
aunsid

ঠিক আছে ওপি কোনও পারস্পরিক সম্পর্ককে নির্দিষ্ট করে নি। যেমনটি আমি উল্লেখ করেছি, আমি আনস্ট্যাক করতে চাইনি, তাই আমি কেবল একটি ভিন্ন পন্থা এনেছি। প্রতিটি পারস্পরিক সম্পর্ক জোড়া আমার প্রস্তাবিত কোডে 2 টি সারি দ্বারা প্রতিনিধিত্ব করে। তবে সহায়ক মন্তব্যের জন্য ধন্যবাদ!
falsarella

1

আমি অ্যাডিসন ক্লিনকের পোস্টকে সবচেয়ে বেশি পছন্দ করেছি, সবচেয়ে সরল হিসাবে, তবে ফিল্টারিং এবং চার্টিংয়ের জন্য ওয়াজিয়াচ মোসক্সিস্কের পরামর্শটি ব্যবহার করেছি, তবে পরম মানগুলি এড়ানোর জন্য ফিল্টারটি প্রসারিত করেছি, সুতরাং একটি বৃহত পারস্পরিক সম্পর্ক ম্যাট্রিক্স দেওয়া হয়েছে, এটি ফিল্টার করুন, এটি চার্ট করুন এবং তারপরে এটি সমতল করুন:

তৈরি, ফিল্টারড এবং চার্টেড

dfCorr = df.corr()
filteredDf = dfCorr[((dfCorr >= .5) | (dfCorr <= -.5)) & (dfCorr !=1.000)]
plt.figure(figsize=(30,10))
sn.heatmap(filteredDf, annot=True, cmap="Reds")
plt.show()

ফিল্টার করা তাপের মানচিত্র

ফাংশন

শেষ পর্যন্ত, আমি একটি ছোট ফাংশন তৈরি করেছি পারস্পরিক সম্পর্ক ম্যাট্রিক্স তৈরি করতে, এটি ফিল্টার করতে এবং তারপরে এটি সমতল করুন। একটি ধারণা হিসাবে, এটি সহজেই প্রসারিত হতে পারে, উদাহরণস্বরূপ, অ্যাসিম্যাট্রিক উপরের এবং নিম্ন সীমানা ইত্যাদি etc.

def corrFilter(x: pd.DataFrame, bound: float):
    xCorr = x.corr()
    xFiltered = xCorr[((xCorr >= bound) | (xCorr <= -bound)) & (xCorr !=1.000)]
    xFlattened = xFiltered.unstack().sort_values().drop_duplicates()
    return xFlattened

corrFilter(df, .7)

এখানে চিত্র বর্ণনা লিখুন


একেবারে শেষটা কীভাবে সরিয়ে ফেলব? HofstederPowerDx এবং Hofsteder PowerDx একই ভেরিয়েবল, তাই না?
লুক

ফাংশনগুলিতে কেউ .DPna () ব্যবহার করতে পারে। আমি এটি কেবল ভিএস কোডে চেষ্টা করে দেখেছি এবং এটি কাজ করে, যেখানে আমি প্রথম সমীকরণটি সংযোগ ম্যাট্রিক্স তৈরি করতে এবং ফিল্টার করতে এবং অন্যটিকে সমতল করার জন্য ব্যবহার করি। আপনি যদি এটি ব্যবহার করেন তবে আপনার .pdna () এবং ড্রপ ডুপ্লিকেট () উভয়েরই দরকার আছে কিনা তা দেখতে আপনি .ডাব্লুডুপ্লিকেটগুলি () মুছে ফেলার জন্য পরীক্ষা করতে পারেন।
জেমস আইগো

এই কোড এবং কিছু অন্যান্য উন্নতি অন্তর্ভুক্ত এমন একটি নোটবুক এখানে রয়েছে: github.com/JamesIgoe/GoogleFitAnalysis
জেমস আইগো

0

আমি এখানে কয়েকটি সমাধানের চেষ্টা করছিলাম কিন্তু তখন আমি আসলে আমার নিজের সাথে এলাম। আমি আশা করি এটি পরবর্তীটির জন্য কার্যকর হতে পারে তাই আমি এখানে এটি ভাগ করে নিই:

def sort_correlation_matrix(correlation_matrix):
    cor = correlation_matrix.abs()
    top_col = cor[cor.columns[0]][1:]
    top_col = top_col.sort_values(ascending=False)
    ordered_columns = [cor.columns[0]] + top_col.index.tolist()
    return correlation_matrix[ordered_columns].reindex(ordered_columns)

0

এটি @ মিফাই থেকে একটি উন্নত কোড। এটি একটি আদেশে কিন্তু নেতিবাচক মানগুলি বাদ দিয়ে নয়।

   def top_correlation (df,n):
    corr_matrix = df.corr()
    correlation = (corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(np.bool))
                 .stack()
                 .sort_values(ascending=False))
    correlation = pd.DataFrame(correlation).reset_index()
    correlation.columns=["Variable_1","Variable_2","Correlacion"]
    correlation = correlation.reindex(correlation.Correlacion.abs().sort_values(ascending=False).index).reset_index().drop(["index"],axis=1)
    return correlation.head(n)

top_correlation(ANYDATA,10)

0

নিম্নলিখিত ফাংশনটি কৌশলটি করা উচিত। এই বাস্তবায়ন

  • স্ব-সম্পর্কিততা অপসারণ করে
  • সদৃশ সরিয়ে দেয়
  • শীর্ষ এন সর্বোচ্চ সংযুক্ত বৈশিষ্ট্যগুলির নির্বাচন সক্ষম করে

এবং এটি কনফিগারযোগ্য যাতে আপনি উভয় স্ব সম্পর্কের পাশাপাশি ডুপ্লিকেট রাখতে পারেন। আপনি নিজের ইচ্ছামত আরও কয়েকটি বৈশিষ্ট্যযুক্ত জোড়াকে রিপোর্ট করতে পারেন।


def get_feature_correlation(df, top_n=None, corr_method='spearman',
                            remove_duplicates=True, remove_self_correlations=True):
    """
    Compute the feature correlation and sort feature pairs based on their correlation

    :param df: The dataframe with the predictor variables
    :type df: pandas.core.frame.DataFrame
    :param top_n: Top N feature pairs to be reported (if None, all of the pairs will be returned)
    :param corr_method: Correlation compuation method
    :type corr_method: str
    :param remove_duplicates: Indicates whether duplicate features must be removed
    :type remove_duplicates: bool
    :param remove_self_correlations: Indicates whether self correlations will be removed
    :type remove_self_correlations: bool

    :return: pandas.core.frame.DataFrame
    """
    corr_matrix_abs = df.corr(method=corr_method).abs()
    corr_matrix_abs_us = corr_matrix_abs.unstack()
    sorted_correlated_features = corr_matrix_abs_us \
        .sort_values(kind="quicksort", ascending=False) \
        .reset_index()

    # Remove comparisons of the same feature
    if remove_self_correlations:
        sorted_correlated_features = sorted_correlated_features[
            (sorted_correlated_features.level_0 != sorted_correlated_features.level_1)
        ]

    # Remove duplicates
    if remove_duplicates:
        sorted_correlated_features = sorted_correlated_features.iloc[:-2:2]

    # Create meaningful names for the columns
    sorted_correlated_features.columns = ['Feature 1', 'Feature 2', 'Correlation (abs)']

    if top_n:
        return sorted_correlated_features[:top_n]

    return sorted_correlated_features

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.