ricklupton / floweaver

View flow data as Sankey diagrams
https://floweaver.readthedocs.io
MIT License
448 stars 89 forks source link

TypeError: 'method' object is not subscriptable #135

Open LeonHardwolscht opened 4 months ago

LeonHardwolscht commented 4 months ago

Hi, I just learnt about floweaver and started a small tutorial within my venv on Python 3.12.2 to get to know the package. However, when I run the code provided below, it raises me a TypeError.

This is my example code:

from floweaver import *
import pandas as pd

flows = pd.DataFrame([
    {'source': 'farm1', 'target': 'Mary', 'value': 3, 'type': 'apples'},
    {'source': 'farm1', 'target': 'James', 'value': 1, 'type': 'apples'},
    {'source': 'farm2', 'target': 'Fred', 'value': 4, 'type': 'apples'},
    {'source': 'farm2', 'target': 'Fred', 'value': 4, 'type': 'bananas'},
    {'source': 'farm2', 'target': 'Susan', 'value': 4, 'type': 'bananas'},
    {'source': 'farm3', 'target': 'Susan', 'value': 4, 'type': 'apples'},
    {'source': 'farm4', 'target': 'Susan', 'value': 4, 'type': 'bananas'},
    {'source': 'farm5', 'target': 'Susan', 'value': 4, 'type': 'bananas'},
    {'source': 'farm6', 'target': 'Susan', 'value': 4, 'type': 'bananas'},
], columns=['source', 'target', 'value', 'type'])

# Set the default size to fit the documentation better.
size = dict(width=570, height=300)

nodes = {
    'farms': ProcessGroup(['farm1', 'farm2', 'farm3',
                           'farm4', 'farm5', 'farm6']),
    'customers': ProcessGroup(['James', 'Mary', 'Fred', 'Susan']),
}
ordering = [
    ['farms'],       # put "farms" on the left...
    ['customers'],   # ... and "customers" on the right.
]
bundles = [
    Bundle('farms', 'customers'),
]
sdd = SankeyDefinition(nodes, bundles, ordering)
weave(sdd, flows).to_widget(**size)

raising the following error message:

TypeError                                 Traceback (most recent call last)
Cell In[6], [line 33]
     [29] bundles = [
     [30] Bundle('farms', 'customers'),
     [31] ]
     [32] sdd = SankeyDefinition(nodes, bundles, ordering)
---> [33] weave(sdd, flows).to_widget(**size)

File \.venv\Lib\site-packages\floweaver\weave.py:36, in weave(sankey_definition, dataset, measures, link_width, link_color, palette, add_elsewhere_waypoints)
     [33](file:/.venv/Lib/site-packages/floweaver/weave.py:33)     dataset = Dataset(dataset)
     [35](file:/.venv/Lib/site-packages/floweaver/weave.py:35) # Calculate the view graph (adding dummy nodes)
---> [36](file:/.venv/Lib/site-packages/floweaver/weave.py:36) GV = view_graph(sankey_definition)
     [38](file:/.venv/Lib/site-packages/floweaver/weave.py:38) # Add implicit to/from Elsewhere bundles to the view definition to ensure
     [39](file:/.venv/Lib/site-packages/floweaver/weave.py:39) # consistency.
     [40](file:/.venv/Lib/site-packages/floweaver/weave.py:40) new_waypoints, new_bundles = elsewhere_bundles(sankey_definition, add_elsewhere_waypoints)

File \.venv\Lib\site-packages\floweaver\view_graph.py:14, in view_graph(sankey_definition)
     [11](file:/.venv/Lib/site-packages/floweaver/view_graph.py:11)     G.add_node(k, node=node)
     [13](file:/.venv/Lib/site-packages/floweaver/view_graph.py:13) G.ordering = sankey_definition.ordering
---> [14](file:/.venv/Lib/site-packages/floweaver/view_graph.py:14) G = _add_bundles_to_graph(G, sankey_definition.bundles,
     [15](file:/.venv/Lib/site-packages/floweaver/view_graph.py:15)                           _bundle_order(sankey_definition))
     [17](file:/.venv/Lib/site-packages/floweaver/view_graph.py:17) return G

File \.venv\Lib\site-packages\floweaver\view_graph.py:32, in _add_bundles_to_graph(G, bundles, sort_key)
...
     [20](file:/.venv/Lib/site-packages/floweaver/layered_graph.py:20) def get_node(self, u):
     [21](file:/.venv/Lib/site-packages/floweaver/layered_graph.py:21)     """Get the ProcessGroup or Waypoint associated with `u`"""
---> [22](file:/.venv/Lib/site-packages/floweaver/layered_graph.py:22)     return self.nodes[u]['node']

TypeError: 'method' object is not subscriptable

I'm using floweaver 2.0.1 with numpy 1.26.4 pandas 2.2.1 networkx 3.3 attrs 23.2.0

Can you please help me to employ the package?

ricklupton commented 1 week ago

That's odd, I can't reproduce this problem here, and it sounds like all the packages are up to date.

The error sounds like https://stackoverflow.com/questions/46258466/why-g-nodes1key-has-error-typeerror-method-object-is-not-subscriptab

Is it possible you have an old version of networkx?