Xây dựng quan hệ điều khoản trong một mạng lưới
Aug 17 2020
Tôi đang cố gắng biểu diễn mối quan hệ giữa các số trong cột A và các giá trị tương ứng của chúng trong B.
A B
Home [Kitchen, Home, Towel]
Donald [US, 02 , Donald, Trump]
Trump [Trump,Family, Cat, Dog]
Dog [Dog,Cat,Paws]
Các số ở cột A và số ở B là các nút trong biểu đồ. Tôi muốn kết nối các phần tử trong B với A hoặc với nhau. Ví dụ:
- Trang chủ trong A được liên kết với chính nó; nếu tôi nhìn trong cột B (giá trị chỉ xuất hiện ở hàng đầu tiên), Nhà ở B được kết nối với Nhà bếp và Khăn (liên kết có sẵn);
- Donald được liên kết với chính nó trong vì Donald chỉ ở B; tuy nhiên, Donald ở B cũng được kết nối với US, 02 và Trump (liên kết đang hoạt động);
- Trump có một liên kết đi với Donald và các liên kết trong (Gia đình, Mèo và Chó);
- Dog có một liên kết đi với Trump và liên kết nhập (Cat and Paws).
Quy tắc phải như sau:
- nếu một từ trong A nằm trong một hàng khác trong B, thì hãy tạo một liên kết đi;
- đối với mỗi từ trong B tạo một liên kết nhập với từ trong A, nếu từ trong A cũng được bao gồm trong B.
Tôi nên điều chỉnh mã của mình như thế nào?
file = file.assign(B=file.B.map(list)).explode('B')
G = nx.DiGraph()
nx.add_path(G, file['A'])
nx.add_path(G, file['B'])
nx.draw_networkx(G)
plt.show()
Trả lời
2 AzimMazinani Aug 17 2020 at 16:26
Chuyển đổi bảng của bạn thành gấu trúc dataframevà sau đó lặp qua các hàng của nó, bạn có thể thêm các cạnh tương ứng như sau:
import networkx as nx
import pandas as pd
from pyvis.network import Network
df = pd.DataFrame(
[
['Home', ['Kitchen', 'Home', 'Towel']],
['Donald', ['US', '02' , 'Donald', 'Trump']],
['Trump', ['Trump','Family', 'Cat', 'Dog']],
['Dog', ['Dog', 'Cat' , 'Paws']]
],
columns=['A', 'B']
)
G = nx.DiGraph()
for i, j in enumerate(df['A']):
for index, row in df.iterrows():
if i != index:
if j in row['B']:
G.add_edge(row['A'], j)
else:
for n in row['B']:
if j != n:
G.add_edge(j, n)
if G.in_degree(j) == 0:
G.add_edge(j , j)
N = Network(directed=True) # using pyvis to show self loops as well
for n, attrs in G.nodes.data():
N.add_node(n)
for e in G.edges.data():
N.add_edge(e[0], e[1])
N.write_html('graph.html')
Cho tôi biểu đồ sau:
Hy vọng đây là những gì bạn muốn!