holoviz / holoviz/hvplot

`datashade=True` doesn't work with `cuDF`

Open
#1,270 0 comments 0 reactions 0 assignees View on GitHub
interface: cuDF
Dominant language
Python
Stars
1.4k
Forks
124
Avg merge
1d 18h
Merged PRs (30d)
1

Description

.#### ALL software version info
cudf=23.12.01
datashader=0.16.0
holoviews=1.18.1
hvplot=0.9.2

#### Description of expected behavior and the observed behavior
Cannot use the `datashade=True` flag in `.hvplot` when using `cuDF`.

#### Complete, minimal, self-contained example code that reproduces the issue

```
import cudf
import hvplot.cudf

# works without `datashade=True`
cudf.DataFrame({'a': [0, 1, 2], 'b': [3,4,3]}).hvplot(datashade=True)

```

#### Stack traceback and/or browser JavaScript console output

WARNING:param.dynamic_operation: Callable raised "TypeError("cannot concatenate object of type ''; only Series and DataFrame objs are valid")".
Invoked as dynamic_operation(height=300, scale=1.0, width=700, x_range=None, y_range=None)
WARNING:param.dynamic_operation: Callable raised "TypeError("cannot concatenate object of type ''; only Series and DataFrame objs are valid")".
Invoked as dynamic_operation(height=300, scale=1.0, width=700, x_range=None, y_range=None)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/IPython/core/formatters.py:974, in MimeBundleFormatter.__call__(self, obj, include, exclude)
971 method = get_real_method(obj, self.print_method)
973 if method is not None:
--> 974 return method(include=include, exclude=exclude)
975 return None
976 else:

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/core/dimension.py:1286, in Dimensioned._repr_mimebundle_(self, include, exclude)
1279 def _repr_mimebundle_(self, include=None, exclude=None):
1280 """
1281 Resolves the class hierarchy for the class rendering the
1282 object using any display hooks registered on Store.display
1283 hooks. The output of all registered display_hooks is then
1284 combined and returned.
1285 """
-> 1286 return Store.render(self)

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/core/options.py:1428, in Store.render(cls, obj)
1426 data, metadata = {}, {}
1427 for hook in hooks:
-> 1428 ret = hook(obj)
1429 if ret is None:
1430 continue

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/ipython/display_hooks.py:287, in pprint_display(obj)
285 if not ip.display_formatter.formatters['text/plain'].pprint:
286 return None
--> 287 return display(obj, raw_output=True)

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/ipython/display_hooks.py:261, in display(obj, raw_output, **kwargs)
259 elif isinstance(obj, (HoloMap, DynamicMap)):
260 with option_state(obj):
--> 261 output = map_display(obj)
262 elif isinstance(obj, Plot):
263 output = render(obj)

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/ipython/display_hooks.py:149, in display_hook..wrapped(element)
147 try:
148 max_frames = OutputSettings.options['max_frames']
--> 149 mimebundle = fn(element, max_frames=max_frames)
150 if mimebundle is None:
151 return {}, {}

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/ipython/display_hooks.py:209, in map_display(vmap, max_frames)
206 max_frame_warning(max_frames)
207 return None
--> 209 return render(vmap)

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/ipython/display_hooks.py:76, in render(obj, **kwargs)
73 if renderer.fig == 'pdf':
74 renderer = renderer.instance(fig='png')
---> 76 return renderer.components(obj, **kwargs)

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/plotting/renderer.py:396, in Renderer.components(self, obj, fmt, comm, **kwargs)
393 embed = (not (dynamic or streams or self.widget_mode == 'live') or config.embed)
395 if embed or config.comms == 'default':
--> 396 return self._render_panel(plot, embed, comm)
397 return self._render_ipywidget(plot)

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/plotting/renderer.py:403, in Renderer._render_panel(self, plot, embed, comm)
401 doc = Document()
402 with config.set(embed=embed):
--> 403 model = plot.layout._render_model(doc, comm)
404 if embed:
405 return render_model(model, comm)

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/panel/viewable.py:748, in Viewable._render_model(self, doc, comm)
746 if comm is None:
747 comm = state._comm_manager.get_server_comm()
--> 748 model = self.get_root(doc, comm)
750 if self._design and self._design.theme.bokeh_theme:
751 doc.theme = self._design.theme.bokeh_theme

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/panel/layout/base.py:311, in Panel.get_root(self, doc, comm, preprocess)
307 def get_root(
308 self, doc: Optional[Document] = None, comm: Optional[Comm] = None,
309 preprocess: bool = True
310 ) -> Model:
--> 311 root = super().get_root(doc, comm, preprocess)
312 # ALERT: Find a better way to handle this
313 if hasattr(root, 'styles') and 'overflow-x' in root.styles:

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/panel/viewable.py:666, in Renderable.get_root(self, doc, comm, preprocess)
664 wrapper = self._design._wrapper(self)
665 if wrapper is self:
--> 666 root = self._get_model(doc, comm=comm)
667 if preprocess:
668 self._preprocess(root)

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/panel/layout/base.py:177, in Panel._get_model(self, doc, root, parent, comm)
175 root = root or model
176 self._models[root.ref['id']] = (model, parent)
--> 177 objects, _ = self._get_objects(model, [], doc, root, comm)
178 props = self._get_properties(doc)
179 props[self._property_mapping['objects']] = objects

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/panel/layout/base.py:159, in Panel._get_objects(self, model, old_objects, doc, root, comm)
157 else:
158 try:
--> 159 child = pane._get_model(doc, root, model, comm)
160 except RerenderError as e:
161 if e.layout is not None and e.layout is not self:

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/panel/pane/holoviews.py:423, in HoloViews._get_model(self, doc, root, parent, comm)
421 plot = self.object
422 else:
--> 423 plot = self._render(doc, comm, root)
425 plot.pane = self
426 backend = plot.renderer.backend

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/panel/pane/holoviews.py:518, in HoloViews._render(self, doc, comm, root)
515 if comm:
516 kwargs['comm'] = comm
--> 518 return renderer.get_plot(self.object, **kwargs)

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/plotting/bokeh/renderer.py:68, in BokehRenderer.get_plot(self_or_cls, obj, doc, renderer, **kwargs)
61 @bothmethod
62 def get_plot(self_or_cls, obj, doc=None, renderer=None, **kwargs):
63 """
64 Given a HoloViews Viewable return a corresponding plot instance.
65 Allows supplying a document attach the plot to, useful when
66 combining the bokeh model with another plot.
67 """
---> 68 plot = super().get_plot(obj, doc, renderer, **kwargs)
69 if plot.document is None:
70 plot.document = Document() if self_or_cls.notebook_context else curdoc()

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/plotting/renderer.py:217, in Renderer.get_plot(self_or_cls, obj, doc, renderer, comm, **kwargs)
214 raise SkipRendering(msg.format(dims=dims))
216 # Initialize DynamicMaps with first data item
--> 217 initialize_dynamic(obj)
219 if not renderer:
220 renderer = self_or_cls

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/plotting/util.py:270, in initialize_dynamic(obj)
268 continue
269 if not len(dmap):
--> 270 dmap[dmap._initial_key()]

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/core/spaces.py:1216, in DynamicMap.__getitem__(self, key)
1214 # Not a cross product and nothing cached so compute element.
1215 if cache is not None: return cache
-> 1216 val = self._execute_callback(*tuple_key)
1217 if data_slice:
1218 val = self._dataslice(val, data_slice)

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/core/spaces.py:983, in DynamicMap._execute_callback(self, *args)
980 kwargs['_memoization_hash_'] = hash_items
982 with dynamicmap_memoization(self.callback, self.streams):
--> 983 retval = self.callback(*args, **kwargs)
984 return self._style(retval)

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/core/spaces.py:581, in Callable.__call__(self, *args, **kwargs)
578 args, kwargs = (), dict(pos_kwargs, **kwargs)
580 try:
--> 581 ret = self.callable(*args, **kwargs)
582 except KeyError:
583 # KeyError is caught separately because it is used to signal
584 # invalid keys on DynamicMap and should not warn
585 raise

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/util/__init__.py:1033, in Dynamic._dynamic_operation..dynamic_operation(*key, **kwargs)
1032 def dynamic_operation(*key, **kwargs):
-> 1033 key, obj = resolve(key, kwargs)
1034 return apply(obj, *key, **kwargs)

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/util/__init__.py:1022, in Dynamic._dynamic_operation..resolve(key, kwargs)
1020 elif isinstance(map_obj, DynamicMap) and map_obj._posarg_keys and not key:
1021 key = tuple(kwargs[k] for k in map_obj._posarg_keys)
-> 1022 return key, map_obj[key]

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/core/spaces.py:1216, in DynamicMap.__getitem__(self, key)
1214 # Not a cross product and nothing cached so compute element.
1215 if cache is not None: return cache
-> 1216 val = self._execute_callback(*tuple_key)
1217 if data_slice:
1218 val = self._dataslice(val, data_slice)

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/core/spaces.py:983, in DynamicMap._execute_callback(self, *args)
980 kwargs['_memoization_hash_'] = hash_items
982 with dynamicmap_memoization(self.callback, self.streams):
--> 983 retval = self.callback(*args, **kwargs)
984 return self._style(retval)

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/core/spaces.py:581, in Callable.__call__(self, *args, **kwargs)
578 args, kwargs = (), dict(pos_kwargs, **kwargs)
580 try:
--> 581 ret = self.callable(*args, **kwargs)
582 except KeyError:
583 # KeyError is caught separately because it is used to signal
584 # invalid keys on DynamicMap and should not warn
585 raise

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/util/__init__.py:1034, in Dynamic._dynamic_operation..dynamic_operation(*key, **kwargs)
1032 def dynamic_operation(*key, **kwargs):
1033 key, obj = resolve(key, kwargs)
-> 1034 return apply(obj, *key, **kwargs)

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/util/__init__.py:1026, in Dynamic._dynamic_operation..apply(element, *key, **kwargs)
1024 def apply(element, *key, **kwargs):
1025 kwargs = dict(util.resolve_dependent_kwargs(self.p.kwargs), **kwargs)
-> 1026 processed = self._process(element, key, kwargs)
1027 if (self.p.link_dataset and isinstance(element, Dataset) and
1028 isinstance(processed, Dataset) and processed._dataset is None):
1029 processed._dataset = element.dataset

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/util/__init__.py:1008, in Dynamic._process(self, element, key, kwargs)
1006 elif isinstance(self.p.operation, Operation):
1007 kwargs = {k: v for k, v in kwargs.items() if k in self.p.operation.param}
-> 1008 return self.p.operation.process_element(element, key, **kwargs)
1009 else:
1010 return self.p.operation(element, **kwargs)

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/core/operation.py:194, in Operation.process_element(self, element, key, **params)
191 else:
192 self.p = param.ParamOverrides(self, params,
193 allow_extra_keywords=self._allow_extra_keywords)
--> 194 return self._apply(element, key)

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/core/operation.py:141, in Operation._apply(self, element, key)
139 if not in_method:
140 element._in_method = True
--> 141 ret = self._process(element, key)
142 if hasattr(element, '_in_method') and not in_method:
143 element._in_method = in_method

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/operation/datashader.py:1525, in datashade._process(self, element, key)
1524 def _process(self, element, key=None):
-> 1525 agg = rasterize._process(self, element, key)
1526 shaded = shade._process(self, agg, key)
1527 return shaded

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/operation/datashader.py:1504, in rasterize._process(self, element, key)
1501 op = transform.instance(**{k:v for k,v in extended_kws.items()
1502 if k in transform.param})
1503 op._precomputed = self._precomputed
-> 1504 element = element.map(op, predicate)
1505 self._precomputed = op._precomputed
1507 unused_params = list(all_supplied_kws - all_allowed_kws)

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/core/dimension.py:694, in LabelledData.map(self, map_fn, specs, clone)
692 if new_val is not None:
693 deep_mapped[k] = new_val
--> 694 if applies: deep_mapped = map_fn(deep_mapped)
695 return deep_mapped
696 else:

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/core/operation.py:214, in Operation.__call__(self, element, **kwargs)
210 return element.clone([(k, self._apply(el, key=k))
211 for k, el in element.items()])
212 elif ((self._per_element and isinstance(element, Element)) or
213 (not self._per_element and isinstance(element, ViewableElement))):
--> 214 return self._apply(element)
215 elif 'streams' not in kwargs:
216 kwargs['streams'] = self.p.streams

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/core/operation.py:141, in Operation._apply(self, element, key)
139 if not in_method:
140 element._in_method = True
--> 141 ret = self._process(element, key)
142 if hasattr(element, '_in_method') and not in_method:
143 element._in_method = in_method

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/operation/datashader.py:358, in aggregate._process(self, element, key)
356 x, y, data, glyph = self._precomputed[element._plot_id]
357 else:
--> 358 x, y, data, glyph = self.get_agg_data(element, category)
360 if self.p.precompute:
361 self._precomputed[element._plot_id] = x, y, data, glyph

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/holoviews/operation/datashader.py:313, in aggregate.get_agg_data(cls, obj, category)
311 else:
312 paths = [p.compute() if isinstance(p, dd.DataFrame) else p for p in paths]
--> 313 df = pd.concat(paths)
314 else:
315 df = paths[0] if paths else pd.DataFrame([], columns=[x.name, y.name])

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/pandas/util/_decorators.py:331, in deprecate_nonkeyword_arguments..decorate..wrapper(*args, **kwargs)
325 if len(args) > num_allow_args:
326 warnings.warn(
327 msg.format(arguments=_format_argument_list(allow_args)),
328 FutureWarning,
329 stacklevel=find_stack_level(),
330 )
--> 331 return func(*args, **kwargs)

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/pandas/core/reshape/concat.py:368, in concat(objs, axis, join, ignore_index, keys, levels, names, verify_integrity, sort, copy)
146 @deprecate_nonkeyword_arguments(version=None, allowed_args=["objs"])
147 def concat(
148 objs: Iterable[NDFrame] | Mapping[HashableT, NDFrame],
(...)
157 copy: bool = True,
158 ) -> DataFrame | Series:
159 """
160 Concatenate pandas objects along a particular axis.
161
(...)
366 1 3 4
367 """
--> 368 op = _Concatenator(
369 objs,
370 axis=axis,
371 ignore_index=ignore_index,
372 join=join,
373 keys=keys,
374 levels=levels,
375 names=names,
376 verify_integrity=verify_integrity,
377 copy=copy,
378 sort=sort,
379 )
381 return op.get_result()

File ~/mambaforge-pypy3/envs/venv/lib/python3.10/site-packages/pandas/core/reshape/concat.py:458, in _Concatenator.__init__(self, objs, axis, join, keys, levels, names, ignore_index, verify_integrity, copy, sort)
453 if not isinstance(obj, (ABCSeries, ABCDataFrame)):
454 msg = (
455 f"cannot concatenate object of type '{type(obj)}'; "
456 "only Series and DataFrame objs are valid"
457 )
--> 458 raise TypeError(msg)
460 ndims.add(obj.ndim)
462 # get the sample
463 # want the highest ndim that we have, and must be non-empty
464 # unless all objs are empty

TypeError: cannot concatenate object of type ''; only Series and DataFrame objs are valid

#### Screenshots or screencasts of the bug in action

- [ ] I may be interested in making a pull request to address this

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.