판다의 큰 상관 행렬에서 가장 높은 상관 관계 쌍을 나열하시겠습니까?
판다와의 상관 행렬에서 최상위 상관관계를 어떻게 찾습니까?R(Python 또는 R의 대규모 데이터 세트에서 높은 상관 관계 쌍을 얻는 효율적인 방법이 아니라 상관 관계를 순서 목록으로 표시)으로 표시하는 방법에 대해 많은 답변이 있지만 판다와 어떻게 하는지 궁금합니다.저의 경우 매트릭스가 4460x4460이기 때문에 시각적으로 할 수 없습니다.
사용할 수 있습니다.DataFrame.values
데이터의 Numpy 배열을 가져오고 다음과 같은 NumPy 함수를 사용합니다.argsort()
가장 많은 상관 쌍을 얻을 수 있습니다.
하지만 만약 당신이 판다에서 이것을 하고 싶다면, 당신은 할 수 있습니다.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
@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
중복 변수 쌍이 없는 소수의 선 솔루션:
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(bool))
.stack()
.sort_values(ascending=False))
#first element of sol series is the pair with the biggest correlation
그런 다음 변수 쌍(팬더)의 이름을 통해 반복할 수 있습니다.시리즈 다중 인덱스) 및 그 값은 다음과 같습니다.
for index, value in sol.items():
# do some staff
@HYRY와 @arun의 답변의 일부 기능을 결합하여 데이터 프레임의 상위 상관 관계를 인쇄할 수 있습니다.df
다음을 사용하여 한 줄로:
df.corr().unstack().sort_values().drop_duplicates()
참고: 한 가지 단점은 하나의 변수가 아닌 1.0개의 상관관계가 있는 경우,drop_duplicates()
추가하면 제거됩니다.
저는 애디슨 클링케의 글이 가장 단순해서 마음에 들었지만 필터링과 차트 작성을 위해 보이치에흐 모슈친스크의 제안을 사용했지만 절대값을 피하기 위해 필터를 확장했기 때문에 큰 상관 행렬이 주어지면 필터링하고 차트를 작성한 다음 평평하게 만듭니다.
생성, 필터링 및 차트화
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()
기능.
결국 저는 작은 함수를 만들어 상관 행렬을 만들고 필터링한 다음 평평하게 만들었습니다.아이디어로서, 비대칭 상한 및 하한 등과 같이 쉽게 확장할 수 있습니다.
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)
후속 조치
결국, 나는 기능을 개선했습니다.
# Returns correlation matrix
def corrFilter(x: pd.DataFrame, bound: float):
xCorr = x.corr()
xFiltered = xCorr[((xCorr >= bound) | (xCorr <= -bound)) & (xCorr !=1.000)]
return xFiltered
# flattens correlation matrix with bounds
def corrFilterFlattened(x: pd.DataFrame, bound: float):
xFiltered = corrFilter(x, bound)
xFlattened = xFiltered.unstack().sort_values().drop_duplicates()
return xFlattened
# Returns correlation for a variable from flattened correlation matrix
def filterForLabels(df: pd.DataFrame, label):
try:
sideLeft = df[label,]
except:
sideLeft = pd.DataFrame()
try:
sideRight = df[:,label]
except:
sideRight = pd.DataFrame()
if sideLeft.empty and sideRight.empty:
return pd.DataFrame()
elif sideLeft.empty:
concat = sideRight.to_frame()
concat.rename(columns={0:'Corr'},inplace=True)
return concat
elif sideRight.empty:
concat = sideLeft.to_frame()
concat.rename(columns={0:'Corr'},inplace=True)
return concat
else:
concat = pd.concat([sideLeft,sideRight], axis=1)
concat["Corr"] = concat[0].fillna(0) + concat[1].fillna(0)
concat.drop(columns=[0,1], inplace=True)
return concat
아래 코드를 사용하여 내림차순으로 상관 관계를 확인합니다.
# See the correlations in descending order
corr = df.corr() # df is the pandas dataframe
c1 = corr.abs().unstack()
c1.sort_values(ascending = False)
당신은 당신의 데이터를 대체함으로써 이 간단한 코드에 따라 그래픽으로 할 수 있습니다.
corr = df.corr()
kot = corr[corr>=.9]
plt.figure(figsize=(12,8))
sns.heatmap(kot, cmap="Greens")
위의 대부분의 답변을 짧은 스니펫으로 결합:
def top_entries(df):
mat = df.corr().abs()
# Remove duplicate and identity entries
mat.loc[:,:] = np.tril(mat.values, k=-1)
mat = mat[mat>0]
# Unstack, sort ascending, and reset the index, so features are in columns
# instead of indexes (allowing e.g. a pretty print in Jupyter).
# Also rename these it for good measure.
return (mat.unstack()
.sort_values(ascending=False)
.reset_index()
.rename(columns={
"level_0": "feature_a",
"level_1": "feature_b",
0: "correlation"
}))
여기 좋은 답변이 많습니다.제가 찾은 가장 쉬운 방법은 위의 몇 가지 대답을 조합하는 것이었습니다.
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()
다음 기능이 효과를 발휘해야 합니다.이 구현
- 자체 상관 관계 제거
- 중복 제거
- 상위 N개의 상관 관계가 가장 높은 피쳐를 선택할 수 있습니다.
또한 중복 데이터와 자체 상관 관계를 모두 유지할 수 있도록 구성할 수 있습니다.원하는 만큼 피쳐 쌍을 보고할 수도 있습니다.
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
사용하다itertools.combinations
로부터 모든 은 판다 의 상관관계 행렬 판터모고상를계관얻는것상행계다렬니입관관의자신은다관부로한유든▁to다..corr()
'.sort_values'를 사용하기 위해 목록 목록을 생성하고 데이터 프레임에 다시 입력합니다. 설정ascending = True
위에 관계를 은 맨 상 관 를 하 는 시 표 방 법 계 위 관 에 가 장 낮 은 ▁to
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)
싶지 않았습니다.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])
가 있는 피쳐를 관 관 계 가 삭 려 면 있 니 수 습 매 할 통 핑 해 피 를 쳐 필 하 된 제 링 를 쳐 피 있 는 ▁through ▁incorr_cols
홀수 제곱(또는 짝수 제곱)을 배열하고 제거합니다.
저는 여기서 몇 가지 해결책을 시도해 보았지만, 실제로는 저만의 해결책을 생각해 냈습니다.다음 번에 유용하게 사용할 수 있기를 바라며, 여기에 공유합니다.
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)
이것은 @MiFi의 개선된 코드입니다.이 하나는 음수 값을 제외하지 않고 abs 단위로 정렬합니다.
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)
단순한 것이 좋습니다.
from collections import defaultdict
res = defaultdict(dict)
corr = returns.corr().replace(1, -1)
names = list(corr)
for name in names:
idx = corr[name].argmax()
max_pairwise_name = names[idx]
res[name][max_pairwise_name] = corr.loc[max_pairwisename, name]
이제 res에는 각 쌍에 대한 최대 쌍별 상관 관계가 포함됩니다.
언급URL : https://stackoverflow.com/questions/17778394/list-highest-correlation-pairs-from-a-large-correlation-matrix-in-pandas
'source' 카테고리의 다른 글
파이썬에서 코드 행 사이에 걸리는 시간을 측정하는 방법은 무엇입니까? (0) | 2023.07.20 |
---|---|
auth.User.groups: (필드).E304) 'User.groups'의 역방향 접근자가 'UserManage.groups'의 역방향 접근자와 충돌함 (0) | 2023.07.20 |
보조 그룹에만 연결된 경우 Oracle이 로컬 파일을 읽을 수 있습니까? (0) | 2023.07.20 |
이전 커밋을 체크아웃하고 새 커밋으로 만듭니다. (0) | 2023.07.15 |
형식 스크립트의 문자열 보간, '자리 표시자'를 변수로 바꾸기 (0) | 2023.07.15 |