我有一个相关矩阵,其中我使用np.fill_diagonal用1填充对角线,然后使用np.triu取上三角形。 但是对于相关矩阵,我使用的是dataframe.corr,它为超过5000的列数给出了存储错误。 因此,我先创建一个dask数据框,然后使用corr来计算相关矩阵。
但是,我不能以对角线复制fill_diagonal和np.triu。 有人可以帮我吗?
下面是示例数据和预期输出的快照。我还放置了当前使用的python代码以实现预期的输出。我的目标是尽快进行这些操作,以避免大数据框(500万条记录和5800+列)的内存错误并计算结果。 该代码是一个较大的功能的一部分,该功能可以从数据中删除多共线变量,并且可以快速复制。
input
h_id cu_id tax rev_m1 io_m1
0 0 0 0 0
0 0 0 1 0
0 0 1 0 -1
-1 1 0 0 1
1 0 0 0 -1
0 0 0 0 0
0 0 0 0 -1
1 0 0 -1 0
-1 1 0 0 0
0 0 0 0 -1
python code to acheive the desired output:
column_names = data.columns
#Create covariance matrix
correlation_matrix = data.corr()
print('*'*10 + "\nDone creating correlation matrix of standardized X.")
print(datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S'))
#Save the Covariance Matrix to a CSV
df_correlation_matrix = pd.DataFrame(correlation_matrix, columns = column_names, index = column_names)
np.fill_diagonal(df_correlation_matrix.values, 1)
# Writing values from upper triangle of the correlation matrix to new data frame
df1 = df_correlation_matrix.where(np.triu(np.ones(df_correlation_matrix.shape)).astype(bool)).stack().reset_index()
df1.columns = ['Variable1','Variable2','Value']
df1.drop(df1[df1.Variable1 == df1.Variable2].index, inplace=True)
Expected output:
Variable1 Variable2 Value
h_id cu_id -0.79
h_id tax 0.0
h_id rev_m1 -0.35
h_id io_m1 -0.49
cu_id tax -0.16
cu_id rev_m1 0.0
cu_id io_m1 0.62
tax rev_m1 0.0
tax io_m1 -0.36
rev_m1 io_m1 0.0