Я хочу создать график моих сложных данных с иерархической взаимосвязью.Для простоты я создал небольшие выборочные данные своей проблемы.
Примерные данные
DS PNL Type Load
DS-1 PNL-101 Normal Power Room 1, Room 2, Room 3
DS-1 PNL-102 Normal Power Room 4, Room 5
DS-1 PNL-103 Emergency Room 6, Room 7
DS-1 PNL-104 Emergency Room 8
DS-2 PNL-201 Emergency Office 1, Office 2
DS-2 PNL-202 Normal Power Office 3, Workshop
DS-2 PNL-203 Light Corridors
DS-3 PNL-301 Normal Power Equipment 1, Equipment 2
DS-4 None Normal Power Road
Данные в формате Excel, которые я импортировал как pandas dataframe.Я хочу создать график так, чтобы он отображал «PNL», подключенный к «DS», и «Load», подключенный к каждому «PNL».Мне нужно разделить столбец «Загрузить» по разделителю «,», чтобы получить отдельные нагрузки, например, Комната 1, Комната 2, Комната 3 для DS-1 - PNL-101.
Я пробовал приведенный ниже код, которыйделает работу в некоторой степени.Он создает график, но проблема в том, что каждый PNL связан с каждой нагрузкой (что неверно).
Например, если я хочу построить график для всех экземпляров, которые содержат DS-2, ожидаемыйГрафик должен, например, DS-2, связанный с PNL-202, PNL-202 и PNL-203 (чего я достиг).Аналогично, PNL-201 должен соединяться только с Office 1 и Office 2. PNL-202 должен быть подключен к Office 3 и Workshop.PNL-203 должен соединяться только с Коридором.
import numpy as np
import pandas as pd
import matplotlib as plt
import networkx as nx
#import pygraphviz as pgv
from graphviz import Graph, Digraph
import graphviz # https://www.graphviz.org/doc/info/shapes.html
df = pd.read_excel('data.xlsx')
g = Graph(format='png')
def show_impact(item):
'''
Input: The partial string to search in the dataframe df.
All the rows which contains the string "item", are extracted to
form another dataframe df0.
Output: Plot the graph of the extracted small dataframe.
'''
# Search all rows that contains the string "item".
s = df.stack() # convert entire data frame into a series of values
df0 = df.iloc[s[s.str.contains(item,na=False)].index.get_level_values(0)]
# Load column to list of individual locations
loc = df0['Load'].str.split(',',expand=True).values.tolist()
# Draw Nodes First
for i, row in df0.iterrows():
for j, col in enumerate(df0):
# Draw DS Nodes
g.node(str(row['DS']), style='filled', shape='rect', color='#FF5733')
# Draw PNL nodes
g.node(str(row['PNL']), style='filled', shape='rect', color='#FFC300')
# Draw Load nodes
for k in loc:
for l in k:
g.node(str(l), style='filled', shape='rect', color='#C0C0C0')
# Edges (DS-PNL)
for i, row in df0.iterrows():
g.edge(str(row['DS']), str(row['PNL']), color='red', label='')
# Edges (PNL-Loads)
for i, row in df0.iterrows():
for k in loc:
for l in k:
g.edge(str(row['PNL']), str(l), color='red', label='')
g.view()
show_impact('DS-2')