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?
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:
Una vez que hayas creado el gráfico, puedes utilizar la biblioteca matplotlib.pyplot para trazar el gráfico.