我有一个数据集(50列,100行)。 还有50个变量名,0,1,2 ... 49个50列。 我必须找到较少的相关变量,比如相关< 0.7。 我尝试如下:
import os, glob, time, numpy as np, pandas as pd
data = np.random.randint(1,99,size=(100, 50))
dataframe = pd.DataFrame(data)
print (dataframe.shape)
codes = np.arange(50).astype(str)
dataframe.columns = codes
corr = dataframe.corr()
corr = corr.unstack().sort_values()
print (corr)
corr = corr.values
indices = np.where(corr < 0.7)
print (indices)
res = codes[indices[0]].tolist() + codes[indices[1]].tolist()
print (len(res))
res = list(set(res))
print (len(res))
结果是50(所有变量!),这是意料之外的。 怎么解决这个问题,伙计们?
答案 0 :(得分:0)
正如评论中所提到的,你的问题有点含糊不清。首先,有可能没有列对相关。其次,拆散没有意义,因为您创建了一个不能直接在2D阵列上使用的索引数组。第三,这应该是第一,但我对此视而不见 - 正如@AmiTavory所提到的那样,#34;关联名称&#34;没有意义。
关联过程本身有效,如以下示例所示:
import numpy as np
import pandas as pd
A = np.arange(100).reshape(25, 4)
#random order in column 2, i.e. a low correlation to the first columns
np.random.shuffle(A[:,2])
#flip column 3 to create a negative correlation with the first columns
A[:,3] = np.flipud(A[:,3])
#column 1 is unchanged, therefore positively correlated to column 0
df = pd.DataFrame(A)
print(df)
#establish a correlation matrix
corr = df.corr()
#retrieve index of pairs below a certain value
#use only the upper triangle with np.triu to filter for symmetric solutions
#use np.abs to take also negative correlation into account
res = np.argwhere(np.triu(np.abs(corr.values) <0.7))
print(res)
输出:
[[0 2]
[1 2]
[2 3]]
正如预期的那样,第2列是唯一一个与任何其他列无关的词,意思是所有其他列彼此相关。