とりあえず書いてみました。
個人的には、大規模なデータでループを回すのは極力避けたいため、三角行列化やFilter処理などは DataFrame上で行い、df.stack()
やdf.melt()
などを使ってDataFrameから直接エッジリストを生成するのが良いかと思います。
以下サンプルです。
このデータで0.10以下をフィルターすると・・・なのですが。
Python
1import pandas as pd
2import numpy as np
3import networkx as nx
4import matplotlib.pyplot as plt
5
6df = pd.DataFrame(
7 [[1. ,0.00165727,0.31542317,0.29266571,0.01082075],
8 [0.00165727,1. ,0.16202656,0.03057694,0.15787778],
9 [0.31542317,0.16202656,1. ,0.01456645,0.02475163],
10 [0.29266571,0.03057694,0.01456645,1 ,0.04057993],
11 [0.01082075,0.15787778,0.02475163,0.04057993,1. ]])
12
13# エッジの名前を定義(適当)
14edge_name = ['A','B','C','D','E']
15df.index = df.columns = edge_name
16
17# 相関係数DFより右上の三角行列およびに 0.1以下のデータをマスク
18tmp_df = df.mask(np.triu(np.ones(df.shape)).astype(bool) | (df < 0.1))
19# エッジリストを生成
20edge_lists = tmp_df.stack().reset_index().apply(tuple, axis=1).values
21
22G = nx.Graph()
23G.add_weighted_edges_from(edge_lists)
24pos = nx.circular_layout(G)
25# weight に応じてラインの太さを調整(適当)
26line_width = [d['weight']*20 for u,v,d in G.edges(data=True)]
27nx.draw_networkx(G, pos=pos, node_size=800, node_color='gray', width=line_width)
28
29plt.show()
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/06 05:21