es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Creando gráficos utilizando networkX

Estoy intentando hacer un gráfico para estos datos usando el siguiente código:

import networkx as nx
import csv
import matplotlib.pyplot as plt

graph = nx.Graph()
filename = "tubedata.csv"

with open(filename) as tubedata:
    startingstation = [row[0] for row in csv.reader(tube_data, delimiter=',')]

with open(filename) as tubedata:
    endingstation = [row1 for row in csv.reader(tube_data, delimiter=',')]

with open(filename) as tubedata:
    averagetimetaken = [row[3] for row in csv.reader(tubedata, delimiter=',')]

with open(filename) as tubedata:
    for line in tubedata:
        graph.addedge(startingstation, endingstation, weight=averagetime_taken)

Sin embargo, sigo recibiendo el siguiente error:


TypeError Traceback (most recent call last) /tmp/ipykernel101/53822893.py in <module> 17 with open(filename) as tubedata: 18 for line in tubedata: ---> 19 graph.addedge(startingstation, endingstation, weight=averagetimetaken) /opt/conda/lib/python3.9/site-packages/networkx/classes/graph.py in addedge(self, uofedge, vofedge, **attr) 870 u, v = uofedge, vofedge 871 # add nodes --> 872 if u not in self.node: 873 self.adj[u] = self.adjlistinnerdictfactory() 874 self.node[u] = self.nodeattrdictfactory() TypeError: unhashable type: 'list' He buscado el error y entiendo que necesito pasar una estructura de datos que sea inmutable. Cambié el código al siguiente: Python with open(filename) as tubedata: startingstation = (row[0] for row in csv.reader(tube_data, delimiter=',')) with open(filename) as tubedata: endingstation = (row1 for row in csv.reader(tube_data, delimiter=',')) with open(filename) as tubedata: averagetimetaken = (row[3] for row in csv.reader(tubedata, delimiter=',')) with open(filename) as tubedata: for line in tubedata: graph.addedge(startingstation, endingstation, weight=averagetime_taken)

Esto resuelve el error anterior pero produce un gráfico con solo dos nodos y 1 borde. ¿Cómo puedo capturar todos los datos como un gráfico?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que estás intentando crear un gráfico a partir de los datos del archivo CSV. El error que estás obteniendo se debe a que estás intentando utilizar una lista como nodo en el gráfico, lo cual no está permitido. Necesitas utilizar una estructura de datos inmutable, como una tupla, en su lugar.

    Puedes utilizar la función csv.reader para leer los datos del archivo CSV y almacenarlos en una lista de tuplas. Luego puedes iterar a través de la lista y añadir cada tupla como un borde en el gráfico. También puedes añadir el atributo de peso a cada borde.

    Por ejemplo:

    import networkx as nx
    import csv
    import matplotlib.pyplot as plt
    
    graph = nx.Graph()
    filename = "tubedata.csv"
    
    with open(filename) as tubedata:
        data = [tuple(row) for row in csv.reader(tubedata, delimiter=',')]
    
    for row in data:
        graph.add_edge(row[0], row[1], weight=row[3])
    

    Una vez que hayas creado el gráfico, puedes utilizar la biblioteca matplotlib.pyplot para trazar el gráfico.

Comments are closed.