एक नेटवर्क के भीतर संबंधों का निर्माण

Aug 17 2020

मैं स्तंभ A में संख्याओं और B में उनके संबंधित मूल्यों के बीच संबंधों का प्रतिनिधित्व करने की कोशिश कर रहा हूं

A            B
Home     [Kitchen, Home, Towel]
Donald   [US, 02 , Donald, Trump]
Trump    [Trump,Family, Cat, Dog]
Dog      [Dog,Cat,Paws]

कॉलम A में संख्याएँ और B में संख्याएँ एक ग्राफ़ में नोड हैं। मैं बी से ए या एक दूसरे में तत्वों को जोड़ना चाहूंगा। उदाहरण के लिए:

  • घर में ए खुद के साथ जुड़ा हुआ है; अगर मैं B कॉलम के भीतर देखता हूं (मान पहली पंक्ति में दिखाई देता है), Home in B रसोई और तौलिया से जुड़ा हुआ है (लिंक लिंक);
  • डोनाल्ड खुद के साथ जुड़ा हुआ है क्योंकि डोनाल्ड केवल बी में है; हालांकि, बी में डोनाल्ड यूएस, 02 और ट्रम्प (इनग्लो लिंक) के साथ भी जुड़ा हुआ है;
  • ट्रम्प का डोनाल्ड और इनग्लो लिंक (परिवार, बिल्ली और कुत्ता) के साथ एक निवर्तमान लिंक है;
  • डॉग का ट्रम्प और इनगोइंग लिंक (कैट एंड पाव्स) के साथ आउटगोइंग लिंक है।

नियम निम्नलिखित होना चाहिए:

  • यदि A का एक शब्द B में दूसरी पंक्ति में है, तो एक निवर्तमान लिंक बनाएं;
  • B के प्रत्येक शब्द के लिए A में शब्द का एक जोड़ लिंक बनाना है, यदि A में शब्द भी B में शामिल है।

मुझे अपना कोड कैसे समायोजित करना चाहिए?

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()

जवाब

2 AzimMazinani Aug 17 2020 at 16:26

अपनी तालिका को पंडों में बदलना dataframeऔर फिर उसकी पंक्तियों के माध्यम से लूपिंग करना आप इस तरह संबंधित किनारों को जोड़ सकते हैं:

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')

जिसने मुझे निम्नलिखित ग्राफ दिया:

आशा है कि यह वही है जो आप चाहते थे!