Skip to content

Commit

Permalink
Fixes and improvements for kde operation error, dimension and range h…
Browse files Browse the repository at this point in the history
…andling
  • Loading branch information
philippjfr committed Nov 7, 2017
1 parent 4b33029 commit 8ea96dd
Showing 1 changed file with 18 additions and 3 deletions.
21 changes: 18 additions & 3 deletions holoviews/operation/stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,18 +85,25 @@ def _process(self, element, key=None):
if self.p.dimension:
selected_dim = element.get_dimension(self.p.dimension)
else:
selected_dim = [d.name for d in element.vdims + element.kdims][0]
dimensions = element.vdims+element.kdims
if not dimensions:
raise ValueError("%s element does not declare any dimensions "
"to compute the kernel density estimate on." %
type(element).__name__)
selected_dim = dimensions[0]
vdim_name = '{}_density'.format(selected_dim.name)
vdim_label = '{} Density'.format(selected_dim.label)
vdims = [Dimension(vdim_nam, label=vdim_label)]
vdims = [Dimension(vdim_name, label=vdim_label)]

data = element.dimension_values(selected_dim)
bin_range = self.p.bin_range or element.range(selected_dim)
if bin_range == (0, 0) or any(not np.isfinite(r) for r in bin_range):
bin_range = (0, 1)
elif bin_range[0] == bin_range[1]:
bin_range = (bin_range[0]-0.5, bin_range[1]+0.5)

data = data[np.isfinite(data)]
if len(data):
if len(data) > 1:
kde = stats.gaussian_kde(data)
if self.p.bandwidth:
kde.set_bandwidth(self.p.bandwidth)
Expand Down Expand Up @@ -159,6 +166,9 @@ def _process(self, element, key=None):
except ImportError:
raise ImportError('%s operation requires SciPy to be installed.' % type(self).__name__)

if len(element.dimensions()) < 2:
raise ValueError("bivariate_kde can only be computed on elements "
"declaring at least two dimensions.")
xdim, ydim = element.dimensions()[:2]
params = {}
if isinstance(element, Bivariate):
Expand All @@ -174,8 +184,13 @@ def _process(self, element, key=None):
ymin, ymax = self.p.y_range or element.range(1)
if any(not np.isfinite(v) for v in (xmin, xmax)):
xmin, xmax = -0.5, 0.5
elif xmin == xmax:
xmin, xmax = xmin-0.5, xmax+0.5
if any(not np.isfinite(v) for v in (ymin, ymax)):
ymin, ymax = -0.5, 0.5
elif ymin == ymax:
ymin, ymax = ymin-0.5, ymax+0.5

if len(element) > 1:
kde = stats.gaussian_kde(data)
if self.p.bandwidth:
Expand Down

0 comments on commit 8ea96dd

Please sign in to comment.