3 回答

TA貢獻1796條經驗 獲得超4個贊
不確定,pure numpy因為您正在處理熊貓數據框。這是一個純粹的熊貓解決方案:
s = cm.pivot(*cm)
ret = s.add(s.T, fill_value=0).fillna(1)
輸出:
A B C
A 1.0 0.1 0.2
B 0.1 1.0 0.3
C 0.2 0.3 1.0
額外:反向(ret如上)
(ret.where(np.triu(np.ones(ret.shape, dtype=bool),1))
.stack()
.reset_index(name='corr')
)
輸出:
level_0 level_1 corr
0 A B 0.1
1 A C 0.2
2 B C 0.3
import networkx as nx
G = nx.from_pandas_edgelist(cm.rename(columns={'corr':'weight'}),
source='name1',
target='name2',
edge_attr ='weight')
G.edges(data=True)
# EdgeDataView([('A', 'B', {'weight': 0.1}), ('A', 'C', {'weight': 0.2}),
# ('B', 'C', {'weight': 0.3})])
adj = nx.to_pandas_adjacency(G)
# sets the diagonal to 1 (node can't be connected to itself)
adj[:] = adj.values + np.eye(adj.shape[0])
print(adj)
A B C
A 1.0 0.1 0.2
B 0.1 1.0 0.3
C 0.2 0.3 1.0

TA貢獻1827條經驗 獲得超8個贊
鑒于最后一列以適當的方式排序,我們可以使用以下代碼。
import pandas as pd
import numpy as np
# define data frame
data = pd.DataFrame({
'name1': ['A', 'A', 'B'],
'name2': ['B', 'C', 'C'],
'correlation': [0.1, 0.2, 0.3]})
# get correlation column and dimension
correlation = data['correlation'].values
dimension = correlation.shape[0]
# define empty matrix to fill and unit matrix
matrix_upper_triangular = np.zeros((dimension, dimension))
# fill upper triangular matrix with one half at diagonal
counter = 0
for (row, column), element in np.ndenumerate(matrix_upper_triangular):
# half of diagonal terms
if row == column:
matrix_upper_triangular[row, column] = 0.5
# upper triangular values
elif row < column:
matrix_upper_triangular[row, column] = correlation[counter]
counter = counter + 1
else:
pass
# add upper triangular + lower triangular matrix
correlation_matrix = matrix_upper_triangular
correlation_matrix += matrix_upper_triangular.transpose()
添加回答
舉報