The following examples gives an error.
If you compute()
dataframe it will work.
If it is non datashaded, it will work.
def generate_df(size):
d = {
'dates' : pd.date_range('1980-01-01', periods=size, freq='1T'),
'unique_id' : np.arange(0, size),
'ints' : np.random.randint(0, size, size=size),
'floats' : np.random.randn(size),
'bools' : np.random.choice([0, 1], size=size),
'int_nans' : np.random.choice([0, 1, np.nan], size=size),
'float_nans' : np.random.choice([0.0, 1.0, np.nan], size=size),
'constant' : 1,
'fake_categorical' : np.random.choice([10, 20, 30, 40, 50], size=size) ,
'categorical_binary' : np.random.choice(['a', 'b'], size=size),
'categorical_nans' : np.random.choice(['a', 'b', 'c', 'd', 'e', 'f', 'g'], size=size),
'signal1' : np.random.normal(0, 0.3, size=size).cumsum() + 50,
'signal2' : np.random.normal(0, 0.3, size=size).cumsum() + 50
}
df = pd.DataFrame(d)
df['hardbools'] = df['bools'] == 1
df['categorical_nans'] = df['categorical_nans'].replace('c', np.nan)
df['categorical_binary'] = df['categorical_binary'].astype('category')
df['unique_id'] = df['unique_id'].astype(str)
df.index = df.dates
df.index.name = 'dates'
df = df.drop('dates', axis=1)
return df
def generate_dask_df(size, npartitions=16):
return dd.from_pandas(generate_df(size), npartitions=npartitions)
import holoplot.dask
import holoplot.pandas
plt = df.holoplot(y='signal1', by="categorical_binary",
title='yo', datashade=True,
)
plt
KeyError Traceback (most recent call last)
~/jungle/local/lib/python3.5/site-packages/ipython-6.3.1-py3.5.egg/IPython/core/formatters.py in __call__(self, obj, include, exclude)
968
969 if method is not None:
--> 970 return method(include=include, exclude=exclude)
971 return None
972 else:
~/area51/holoviews/holoviews/core/dimension.py in _repr_mimebundle_(self, include, exclude)
1229 combined and returned.
1230 """
-> 1231 return Store.render(self)
1232
1233
~/area51/holoviews/holoviews/core/options.py in render(cls, obj)
1287 data, metadata = {}, {}
1288 for hook in hooks:
-> 1289 ret = hook(obj)
1290 if ret is None:
1291 continue
~/area51/holoviews/holoviews/ipython/display_hooks.py in pprint_display(obj)
270 if not ip.display_formatter.formatters['text/plain'].pprint:
271 return None
--> 272 return display(obj, raw_output=True)
273
274
~/area51/holoviews/holoviews/ipython/display_hooks.py in display(obj, raw_output, **kwargs)
246 elif isinstance(obj, (HoloMap, DynamicMap)):
247 with option_state(obj):
--> 248 output = map_display(obj)
249 elif isinstance(obj, Plot):
250 output = render(obj)
~/area51/holoviews/holoviews/ipython/display_hooks.py in wrapped(element)
140 try:
141 max_frames = OutputSettings.options['max_frames']
--> 142 mimebundle = fn(element, max_frames=max_frames)
143 if mimebundle is None:
144 return {}, {}
~/area51/holoviews/holoviews/ipython/display_hooks.py in map_display(vmap, max_frames)
200 return None
201
--> 202 return render(vmap)
203
204
~/area51/holoviews/holoviews/ipython/display_hooks.py in render(obj, **kwargs)
63 renderer = renderer.instance(fig='png')
64
---> 65 return renderer.components(obj, **kwargs)
66
67
~/area51/holoviews/holoviews/plotting/bokeh/renderer.py in components(self, obj, fmt, comm, **kwargs)
260 # Bokeh has to handle comms directly in <0.12.15
261 comm = False if bokeh_version < '0.12.15' else comm
--> 262 return super(BokehRenderer, self).components(obj,fmt, comm, **kwargs)
263
264
~/area51/holoviews/holoviews/plotting/renderer.py in components(self, obj, fmt, comm, **kwargs)
327 plot = obj
328 else:
--> 329 plot, fmt = self._validate(obj, fmt)
330
331 widget_id = None
~/area51/holoviews/holoviews/plotting/renderer.py in _validate(self, obj, fmt, **kwargs)
226 if isinstance(obj, tuple(self.widgets.values())):
227 return obj, 'html'
--> 228 plot = self.get_plot(obj, renderer=self, **kwargs)
229
230 fig_formats = self.mode_formats['fig'][self.mode]
~/area51/holoviews/holoviews/plotting/bokeh/renderer.py in get_plot(self_or_cls, obj, doc, renderer)
153 curdoc().theme = self_or_cls.theme
154 doc.theme = self_or_cls.theme
--> 155 plot = super(BokehRenderer, self_or_cls).get_plot(obj, renderer)
156 plot.document = doc
157 return plot
~/area51/holoviews/holoviews/plotting/renderer.py in get_plot(self_or_cls, obj, renderer)
193
194 # Initialize DynamicMaps with first data item
--> 195 initialize_dynamic(obj)
196
197 if not isinstance(obj, Plot):
~/area51/holoviews/holoviews/plotting/util.py in initialize_dynamic(obj)
242 continue
243 if not len(dmap):
--> 244 dmap[dmap._initial_key()]
245
246
~/area51/holoviews/holoviews/core/spaces.py in __getitem__(self, key)
1130 # Not a cross product and nothing cached so compute element.
1131 if cache is not None: return cache
-> 1132 val = self._execute_callback(*tuple_key)
1133 if data_slice:
1134 val = self._dataslice(val, data_slice)
~/area51/holoviews/holoviews/core/spaces.py in _execute_callback(self, *args)
909
910 with dynamicmap_memoization(self.callback, self.streams):
--> 911 retval = self.callback(*args, **kwargs)
912 return self._style(retval)
913
~/area51/holoviews/holoviews/core/spaces.py in __call__(self, *args, **kwargs)
570
571 try:
--> 572 ret = self.callable(*args, **kwargs)
573 except KeyError:
574 # KeyError is caught separately because it is used to signal
~/area51/holoviews/holoviews/util/__init__.py in dynamic_operation(*key, **kwargs)
435 def dynamic_operation(*key, **kwargs):
436 self.p.kwargs.update(kwargs)
--> 437 return self._process(map_obj[key], key)
438 if isinstance(self.p.operation, Operation):
439 return OperationCallable(dynamic_operation, inputs=[map_obj],
~/area51/holoviews/holoviews/core/spaces.py in __getitem__(self, key)
1130 # Not a cross product and nothing cached so compute element.
1131 if cache is not None: return cache
-> 1132 val = self._execute_callback(*tuple_key)
1133 if data_slice:
1134 val = self._dataslice(val, data_slice)
~/area51/holoviews/holoviews/core/spaces.py in _execute_callback(self, *args)
909
910 with dynamicmap_memoization(self.callback, self.streams):
--> 911 retval = self.callback(*args, **kwargs)
912 return self._style(retval)
913
~/area51/holoviews/holoviews/core/spaces.py in __call__(self, *args, **kwargs)
570
571 try:
--> 572 ret = self.callable(*args, **kwargs)
573 except KeyError:
574 # KeyError is caught separately because it is used to signal
~/area51/holoviews/holoviews/util/__init__.py in dynamic_operation(*key, **kwargs)
431 self.p.kwargs.update(kwargs)
432 obj = map_obj[key] if isinstance(map_obj, HoloMap) else map_obj
--> 433 return self._process(obj, key)
434 else:
435 def dynamic_operation(*key, **kwargs):
~/area51/holoviews/holoviews/util/__init__.py in _process(self, element, key)
417 kwargs = {k: v for k, v in self.p.kwargs.items()
418 if k in self.p.operation.params()}
--> 419 return self.p.operation.process_element(element, key, **kwargs)
420 else:
421 return self.p.operation(element, **self.p.kwargs)
~/area51/holoviews/holoviews/core/operation.py in process_element(self, element, key, **params)
141 """
142 self.p = param.ParamOverrides(self, params)
--> 143 return self._apply(element, key)
144
145
~/area51/holoviews/holoviews/core/operation.py in _apply(self, element, key)
119 for hook in self._preprocess_hooks:
120 kwargs.update(hook(self, element))
--> 121 ret = self._process(element, key)
122 for hook in self._postprocess_hooks:
123 ret = hook(self, ret, **kwargs)
~/area51/holoviews/holoviews/operation/datashader.py in _process(self, element, key)
912
913 def _process(self, element, key=None):
--> 914 agg = rasterize._process(self, element, key)
915 shaded = shade._process(self, agg, key)
916 return shaded
~/area51/holoviews/holoviews/operation/datashader.py in _process(self, element, key)
743 op = transform.instance(**op_params)
744 op._precomputed = self._precomputed
--> 745 element = element.map(op, predicate)
746 self._precomputed = op._precomputed
747 return element
~/area51/holoviews/holoviews/core/dimension.py in map(self, map_fn, specs, clone)
689 if new_val is not None:
690 deep_mapped[k] = new_val
--> 691 if applies: deep_mapped = map_fn(deep_mapped)
692 return deep_mapped
693 else:
~/area51/holoviews/holoviews/core/operation.py in __call__(self, element, **params)
161 operation=self, kwargs=params)
162 elif isinstance(element, ViewableElement):
--> 163 processed = self._apply(element)
164 elif isinstance(element, DynamicMap):
165 if any((not d.values) for d in element.kdims):
~/area51/holoviews/holoviews/core/operation.py in _apply(self, element, key)
119 for hook in self._preprocess_hooks:
120 kwargs.update(hook(self, element))
--> 121 ret = self._process(element, key)
122 for hook in self._postprocess_hooks:
123 ret = hook(self, ret, **kwargs)
~/area51/holoviews/holoviews/operation/datashader.py in _process(self, element, key)
413 ((isinstance(agg_fn, (ds.count, ds.sum, ds.mean)) and agg_fn.column not in element.kdims) or
414 (isinstance(agg_fn, ds.count_cat) and agg_fn.column in element.kdims))):
--> 415 return self._aggregate_ndoverlay(element, agg_fn)
416
417 if element._plot_id in self._precomputed:
~/area51/holoviews/holoviews/operation/datashader.py in _aggregate_ndoverlay(self, element, agg_fn)
360 grouped = element.groupby([agg_fn.column], container_type=NdOverlay,
361 group_type=NdOverlay)
--> 362 return grouped.clone({k: agg_fn1(v) for k, v in grouped.items()})
363
364 # Create aggregate instance for sum, count operations, breaking mean
~/area51/holoviews/holoviews/operation/datashader.py in <dictcomp>(.0)
360 grouped = element.groupby([agg_fn.column], container_type=NdOverlay,
361 group_type=NdOverlay)
--> 362 return grouped.clone({k: agg_fn1(v) for k, v in grouped.items()})
363
364 # Create aggregate instance for sum, count operations, breaking mean
~/area51/holoviews/holoviews/core/operation.py in __call__(self, element, **params)
161 operation=self, kwargs=params)
162 elif isinstance(element, ViewableElement):
--> 163 processed = self._apply(element)
164 elif isinstance(element, DynamicMap):
165 if any((not d.values) for d in element.kdims):
~/area51/holoviews/holoviews/core/operation.py in _apply(self, element, key)
119 for hook in self._preprocess_hooks:
120 kwargs.update(hook(self, element))
--> 121 ret = self._process(element, key)
122 for hook in self._postprocess_hooks:
123 ret = hook(self, ret, **kwargs)
~/area51/holoviews/holoviews/operation/datashader.py in _process(self, element, key)
450
451 dfdata = PandasInterface.as_dframe(data)
--> 452 agg = getattr(cvs, glyph)(dfdata, x.name, y.name, agg_fn)
453 if 'x_axis' in agg.coords and 'y_axis' in agg.coords:
454 agg = agg.rename({'x_axis': x, 'y_axis': y})
~/jungle/local/lib/python3.5/site-packages/datashader/core.py in line(self, source, x, y, agg)
185 if agg is None:
186 agg = any_rdn()
--> 187 return bypixel(source, self, Line(x, y), agg)
188
189 # TODO re 'untested', below: Consider replacing with e.g. a 3x3
~/jungle/local/lib/python3.5/site-packages/datashader/core.py in bypixel(source, canvas, glyph, agg)
535 agg.validate(schema)
536 canvas.validate()
--> 537 return bypixel.pipeline(source, schema, canvas, glyph, agg)
538
539
~/jungle/local/lib/python3.5/site-packages/datashader/utils.py in __call__(self, head, *rest, **kwargs)
56 typ = type(head)
57 if typ in lk:
---> 58 return lk[typ](head, *rest, **kwargs)
59 for cls in getmro(typ)[1:]:
60 if cls in lk:
~/jungle/local/lib/python3.5/site-packages/datashader/dask.py in dask_pipeline(df, schema, canvas, glyph, summary)
19 dsk, name = glyph_dispatch(glyph, df, schema, canvas, summary)
20
---> 21 get = _globals['get'] or getattr(df, '__dask_scheduler__', None) or df._default_get
22 keys = getattr(df, '__dask_keys__', None) or df._keys
23 optimize = getattr(df, '__dask_optimize__', None) or df._optimize
KeyError: 'get'
~/jungle/local/lib/python3.5/site-packages/ipython-6.3.1-py3.5.egg/IPython/core/formatters.py in __call__(self, obj, include, exclude)
968
969 if method is not None:
--> 970 return method(include=include, exclude=exclude)
971 return None
972 else:
~/area51/holoviews/holoviews/core/dimension.py in _repr_mimebundle_(self, include, exclude)
1229 combined and returned.
1230 """
-> 1231 return Store.render(self)
1232
1233
~/area51/holoviews/holoviews/core/options.py in render(cls, obj)
1287 data, metadata = {}, {}
1288 for hook in hooks:
-> 1289 ret = hook(obj)
1290 if ret is None:
1291 continue
~/area51/holoviews/holoviews/ipython/display_hooks.py in pprint_display(obj)
270 if not ip.display_formatter.formatters['text/plain'].pprint:
271 return None
--> 272 return display(obj, raw_output=True)
273
274
~/area51/holoviews/holoviews/ipython/display_hooks.py in display(obj, raw_output, **kwargs)
246 elif isinstance(obj, (HoloMap, DynamicMap)):
247 with option_state(obj):
--> 248 output = map_display(obj)
249 elif isinstance(obj, Plot):
250 output = render(obj)
~/area51/holoviews/holoviews/ipython/display_hooks.py in wrapped(element)
140 try:
141 max_frames = OutputSettings.options['max_frames']
--> 142 mimebundle = fn(element, max_frames=max_frames)
143 if mimebundle is None:
144 return {}, {}
~/area51/holoviews/holoviews/ipython/display_hooks.py in map_display(vmap, max_frames)
200 return None
201
--> 202 return render(vmap)
203
204
~/area51/holoviews/holoviews/ipython/display_hooks.py in render(obj, **kwargs)
63 renderer = renderer.instance(fig='png')
64
---> 65 return renderer.components(obj, **kwargs)
66
67
~/area51/holoviews/holoviews/plotting/bokeh/renderer.py in components(self, obj, fmt, comm, **kwargs)
260 # Bokeh has to handle comms directly in <0.12.15
261 comm = False if bokeh_version < '0.12.15' else comm
--> 262 return super(BokehRenderer, self).components(obj,fmt, comm, **kwargs)
263
264
~/area51/holoviews/holoviews/plotting/renderer.py in components(self, obj, fmt, comm, **kwargs)
327 plot = obj
328 else:
--> 329 plot, fmt = self._validate(obj, fmt)
330
331 widget_id = None
~/area51/holoviews/holoviews/plotting/renderer.py in _validate(self, obj, fmt, **kwargs)
226 if isinstance(obj, tuple(self.widgets.values())):
227 return obj, 'html'
--> 228 plot = self.get_plot(obj, renderer=self, **kwargs)
229
230 fig_formats = self.mode_formats['fig'][self.mode]
~/area51/holoviews/holoviews/plotting/bokeh/renderer.py in get_plot(self_or_cls, obj, doc, renderer)
153 curdoc().theme = self_or_cls.theme
154 doc.theme = self_or_cls.theme
--> 155 plot = super(BokehRenderer, self_or_cls).get_plot(obj, renderer)
156 plot.document = doc
157 return plot
~/area51/holoviews/holoviews/plotting/renderer.py in get_plot(self_or_cls, obj, renderer)
209 plot_opts = self_or_cls.plot_options(obj, self_or_cls.size)
210 plot = self_or_cls.plotting_class(obj)(obj, renderer=renderer,
--> 211 **plot_opts)
212 defaults = [kd.default for kd in plot.dimensions]
213 init_key = tuple(v if d is None else d for v, d in
~/area51/holoviews/holoviews/plotting/plot.py in __init__(self, overlay, ranges, batched, keys, group_counter, **params)
889 self.group_counter = Counter() if group_counter is None else group_counter
890 self.zoffset = 0
--> 891 self.subplots = self._create_subplots(ranges)
892 self.traverse(lambda x: setattr(x, 'comm', self.comm))
893 self.top_level = keys is None
~/area51/holoviews/holoviews/plotting/plot.py in _create_subplots(self, ranges)
939 if isinstance(self.hmap, DynamicMap):
940 dmap_streams = [get_nested_streams(layer) for layer in
--> 941 split_dmap_overlay(self.hmap)]
942 else:
943 dmap_streams = [None]*len(keys)
~/area51/holoviews/holoviews/plotting/util.py in split_dmap_overlay(obj, depth)
217 if obj.callback.inputs and is_dynamic_overlay(obj):
218 for inp in obj.callback.inputs:
--> 219 layers += split_dmap_overlay(inp, depth+1)
220 else:
221 for v in obj.last.values():
~/area51/holoviews/holoviews/plotting/util.py in split_dmap_overlay(obj, depth)
217 if obj.callback.inputs and is_dynamic_overlay(obj):
218 for inp in obj.callback.inputs:
--> 219 layers += split_dmap_overlay(inp, depth+1)
220 else:
221 for v in obj.last.values():
~/area51/holoviews/holoviews/plotting/util.py in split_dmap_overlay(obj, depth)
217 if obj.callback.inputs and is_dynamic_overlay(obj):
218 for inp in obj.callback.inputs:
--> 219 layers += split_dmap_overlay(inp, depth+1)
220 else:
221 for v in obj.last.values():
~/area51/holoviews/holoviews/plotting/util.py in split_dmap_overlay(obj, depth)
211 layers = []
212 if isinstance(obj, DynamicMap):
--> 213 if issubclass(obj.type, NdOverlay) and not depth:
214 for v in obj.last.values():
215 layers.append(obj)
TypeError: issubclass() arg 1 must be a class