Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Standardized constructor signature with dimensions as positional args #1946

Merged
merged 8 commits into from
Oct 8, 2017
4 changes: 2 additions & 2 deletions doc/Tutorials/Columnar_Data.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -377,7 +377,7 @@
"outputs": [],
"source": [
"obs_hmap = hv.HoloMap({i: hv.Image(np.random.randn(10, 10), bounds=(0,0,3,3))\n",
" for i in range(3)}, key_dimensions=['Observation'])\n",
" for i in range(3)}, kdims=['Observation'])\n",
"obs_hmap"
]
},
Expand Down Expand Up @@ -415,7 +415,7 @@
"extents = (0,0,3,3)\n",
"error_hmap = hv.HoloMap({(i, j): hv.Image(j*np.random.randn(3, 3), bounds=extents)\n",
" for i, j in product(range(3), np.linspace(0, 1, 3))},\n",
" key_dimensions=['Observation', 'noise'])\n",
" kdims=['Observation', 'noise'])\n",
"noise_layout = error_hmap.layout('noise')\n",
"noise_layout"
]
Expand Down
4 changes: 2 additions & 2 deletions doc/Tutorials/Sampling_Data.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@
"outputs": [],
"source": [
"obs_hmap = hv.HoloMap({i: hv.Image(np.random.randn(10, 10), bounds=extents)\n",
" for i in range(3)}, key_dimensions=['Observation'])"
" for i in range(3)}, kdims=['Observation'])"
]
},
{
Expand Down Expand Up @@ -384,7 +384,7 @@
"extents = (0, 0, 2, 10)\n",
"curve = hv.HoloMap({(i) : hv.Curve(zip(xs, np.sin(xs)*i))\n",
" for i in np.linspace(0.5, 1.5, 3)},\n",
" key_dimensions=['Observation'])\n",
" kdims=['Observation'])\n",
"all_samples = curve.table().to.points()\n",
"sampled = curve.sample([0, 2, 4, 6, 8])\n",
"sampling = all_samples * sampled.to.points(extents=extents).opts(style=dict(color='r'))\n",
Expand Down
12 changes: 6 additions & 6 deletions examples/topics/simulation/sri_model.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@
" raise Exception(\"Enable visualize option to get compute network visulizations.\")\n",
"\n",
" # Declare HoloMap for network animation and counts array\n",
" network_hmap = hv.HoloMap(key_dimensions=['Time'])\n",
" network_hmap = hv.HoloMap(kdims=['Time'])\n",
" sird = np.zeros((steps, 5))\n",
" \n",
" # Declare dimensions and labels\n",
Expand All @@ -247,10 +247,10 @@
" \n",
" path_data = [list(el[()]) for el in paths]\n",
" # Create network path and node Elements\n",
" network_paths = hv.Path(path_data, key_dimensions=spatial_dims)\n",
" network_paths = hv.Path(path_data, kdims=spatial_dims)\n",
" network_nodes = hv.Points(np.hstack([points, state_array]),\n",
" key_dimensions=spatial_dims,\n",
" value_dimensions=['State'])\n",
" kdims=spatial_dims,\n",
" vdims=['State'])\n",
" \n",
" # Create overlay and accumulate in network HoloMap\n",
" network_hmap[i] = (network_paths * network_nodes * nlabel).relabel(group='Network', label='SRI')\n",
Expand All @@ -265,7 +265,7 @@
" \n",
" # Animate VLine on top of Curves\n",
" distribution = hv.HoloMap({i: (curves * hv.VLine(i)).relabel(group='Counts', label='SRI')\n",
" for i in range(steps)}, key_dimensions=['Time'])\n",
" for i in range(steps)}, kdims=['Time'])\n",
" \n",
" return network_hmap + distribution"
]
Expand Down Expand Up @@ -536,7 +536,7 @@
"outputs": [],
"source": [
"exp2_dims = ['Connections', 'pVaccinated']\n",
"hmap = hv.HoloMap(key_dimensions=exp2_dims)\n",
"hmap = hv.HoloMap(kdims=exp2_dims)\n",
"vacc_rates = np.linspace(0, 1, 21)\n",
"mean_conns = [2**i for i in range(7)]\n",
"for v, c in itertools.product(vacc_rates, mean_conns):\n",
Expand Down
4 changes: 2 additions & 2 deletions examples/user_guide/07-Tabular_Datasets.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -384,7 +384,7 @@
"outputs": [],
"source": [
"obs_hmap = hv.HoloMap({i: hv.Image(np.random.randn(10, 10), bounds=(0,0,3,3))\n",
" for i in range(3)}, key_dimensions=['Observation'])\n",
" for i in range(3)}, kdims=['Observation'])\n",
"obs_hmap"
]
},
Expand Down Expand Up @@ -424,7 +424,7 @@
"extents = (0,0,3,3)\n",
"error_hmap = hv.HoloMap({(i, j): hv.Image(j*np.random.randn(3, 3), bounds=extents)\n",
" for i, j in product(range(3), np.linspace(0, 1, 3))},\n",
" key_dimensions=['Observation', 'noise'])\n",
" kdims=['Observation', 'noise'])\n",
"noise_layout = error_hmap.layout('noise')\n",
"noise_layout"
]
Expand Down
4 changes: 2 additions & 2 deletions examples/user_guide/09-Indexing_and_Selecting_Data.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -426,7 +426,7 @@
"outputs": [],
"source": [
"obs_hmap = hv.HoloMap({i: hv.Image(np.random.randn(10, 10), bounds=extents)\n",
" for i in range(3)}, key_dimensions=['Observation'])"
" for i in range(3)}, kdims=['Observation'])"
]
},
{
Expand Down Expand Up @@ -490,7 +490,7 @@
"extents = (0, 0, 2, 10)\n",
"curve = hv.HoloMap({(i) : hv.Curve(zip(xs, np.sin(xs)*i))\n",
" for i in np.linspace(0.5, 1.5, 3)},\n",
" key_dimensions=['Observation'])\n",
" kdims=['Observation'])\n",
"all_samples = curve.table().to.points()\n",
"sampled = curve.sample([0, 2, 4, 6, 8])\n",
"sampling = all_samples * sampled.to.points(extents=extents).opts(style=dict(color='r'))\n",
Expand Down
23 changes: 14 additions & 9 deletions holoviews/core/data/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import param

from ..dimension import redim
from ..util import dimension_range
from ..util import dimension_range, basestring
from .interface import Interface, iloc, ndloc
from .array import ArrayInterface
from .dictionary import DictInterface
Expand Down Expand Up @@ -170,19 +170,24 @@ class Dataset(Element):
_vdim_reductions = {}
_kdim_reductions = {}

def __init__(self, data, **kwargs):
def __init__(self, data, kdims=None, vdims=None, **kwargs):
if isinstance(data, Element):
pvals = util.get_param_values(data)
kwargs.update([(l, pvals[l]) for l in ['group', 'label']
if l in pvals and l not in kwargs])

kdims, vdims = None, None
if 'kdims' in kwargs:
kdims = [kd if isinstance(kd, Dimension) else Dimension(kd)
for kd in kwargs['kdims']]
if 'vdims' in kwargs:
vdims = [kd if isinstance(kd, Dimension) else Dimension(kd)
for kd in kwargs['vdims']]
for group, dims in [('kdims', kdims), ('vdims', vdims)]:
if dims is None:
continue
elif isinstance(dims, (tuple, basestring, Dimension)):
dims = [dims]
elif not isinstance(dims, list):
raise ValueError("%s must be a Dimension or list of dimensions, "
"specified as tuples, string or Dimension instances, "
"not %s." % (group, dims))
kwargs[group] = [d if isinstance(d, Dimension) else Dimension(d)
for d in dims]
kdims, vdims = kwargs.get('kdims'), kwargs.get('vdims')

initialized = Interface.initialize(type(self), data, kdims, vdims,
datatype=kwargs.get('datatype'))
Expand Down
4 changes: 4 additions & 0 deletions holoviews/core/data/multipath.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ class MultiInterface(Interface):
def init(cls, eltype, data, kdims, vdims):
new_data = []
dims = {'kdims': eltype.kdims, 'vdims': eltype.vdims}
if kdims is not None:
dims['kdims'] = kdims
if vdims is not None:
dims['vdims'] = vdims
if not isinstance(data, list):
raise ValueError('MultiInterface data must be a list tabular data types.')
prev_interface, prev_dims = None, None
Expand Down
47 changes: 18 additions & 29 deletions holoviews/core/dimension.py
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,9 @@ def __init__(self, spec, **params):

all_params = dict(existing_params, **params)
if isinstance(spec, tuple):
if not all(isinstance(s, basestring) for s in spec) or len(spec) != 2:
raise ValueError("Dimensions specified as a tuple must be a tuple "
"consisting of the name and label not: %s" % spec)
name, label = spec
all_params['name'] = name
all_params['label'] = label
Expand Down Expand Up @@ -783,35 +786,21 @@ class to be associated with dimensions. The contents associated
_dim_aliases = dict(key_dimensions='kdims', value_dimensions='vdims',
constant_dimensions='cdims', deep_dimensions='ddims')


# Long-name aliases

@property
def key_dimensions(self): return self.kdims

@property
def value_dimensions(self): return self.vdims

@property
def constant_dimensions(self): return self.cdims

@property
def deep_dimensions(self): return self.ddims

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suppose we haven't used them in a long time so they should be ok to remove now.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You would think that, turns out Columnar_Data still had a reference:

  3 error_hmap = hv.HoloMap({(i, j): hv.Image(j*np.random.randn(3, 3), bounds=extents)
  4                          for i, j in product(range(3), np.linspace(0, 1, 3))},
  5                         key_dimensions=['Observation', 'noise'])

def __init__(self, data, **params):
for group in self._dim_groups+list(self._dim_aliases.keys()):
if group in ['deep_dimensions', 'ddims']: continue
if group in params:
if group in self._dim_aliases:
params[self._dim_aliases[group]] = params.pop(group)
group = self._dim_aliases[group]
if group == 'cdims':
dimensions = {d if isinstance(d, Dimension) else Dimension(d): val
for d, val in params.pop(group).items()}
else:
dimensions = [d if isinstance(d, Dimension) else Dimension(d)
for d in params.pop(group)]
params[group] = dimensions
def __init__(self, data, kdims=None, vdims=None, **params):
for group, dims in [('kdims', kdims), ('vdims', vdims)]:
if dims is None:
continue
elif isinstance(dims, (tuple, basestring, Dimension)):
dims = [dims]
elif not isinstance(dims, list):
raise ValueError("%s must be a Dimension or list of dimensions, "
"specified as tuples, string or Dimension instances, "
"not %s." % (group, dims))
params[group] = [d if isinstance(d, Dimension) else Dimension(d)
for d in dims]
if 'cdims' in params:
params['cdims'] = {d if isinstance(d, Dimension) else Dimension(d): val
for d, val in params['cdims'].items()}
super(Dimensioned, self).__init__(data, **params)
self.ndims = len(self.kdims)
cdims = [(d.name, val) for d, val in self.cdims.items()]
Expand Down
2 changes: 1 addition & 1 deletion holoviews/core/element.py
Original file line number Diff line number Diff line change
Expand Up @@ -390,7 +390,7 @@ def _add_dimensions(self, item, dims, constant_keys):
elif isinstance(item, self._nest_order[self.merge_type]):
if len(dim_vals):
dimensions, key = zip(*dim_vals)
new_item = self.merge_type({key: item}, kdims=dimensions,
new_item = self.merge_type({key: item}, kdims=list(dimensions),
cdims=constant_keys)
else:
new_item = item
Expand Down
19 changes: 3 additions & 16 deletions holoviews/core/layout.py
Original file line number Diff line number Diff line change
Expand Up @@ -280,10 +280,11 @@ class NdLayout(UniformNdMapping):

data_type = (ViewableElement, AdjointLayout, UniformNdMapping)

def __init__(self, initial_items=None, **params):
def __init__(self, initial_items=None, kdims=None, **params):
self._max_cols = 4
self._style = None
super(NdLayout, self).__init__(initial_items=initial_items, **params)
super(NdLayout, self).__init__(initial_items=initial_items, kdims=kdims,
**params)


@property
Expand Down Expand Up @@ -380,20 +381,6 @@ def __init__(self, items=None, identifier=None, parent=None, **kwargs):
Dimensioned.__init__(self, self.data, **params)


@classmethod
def collate(cls, data, kdims=None, key_dimensions=None):
kdims = key_dimensions if (kdims is None) else kdims
if kdims is None:
raise Exception("Please specify the key dimensions.")

collate_deprecation.warning("Layout.collate will be deprecated after version 1.3.0."
"\nUse HoloMap.collate instead (see HoloViews homepage for example usage)")
from .element import Collator
layouts = {k:(v if isinstance(v, Layout) else Layout.from_values([v]))
for k,v in data.items()}
return Collator(layouts, kdims=kdims)()


@classmethod
def from_values(cls, vals):
"""
Expand Down
10 changes: 6 additions & 4 deletions holoviews/core/ndmapping.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,11 +95,13 @@ class MultiDimensionalMapping(Dimensioned):
_deep_indexable = False
_check_items = True

def __init__(self, initial_items=None, **params):
def __init__(self, initial_items=None, kdims=None, **params):
if isinstance(initial_items, MultiDimensionalMapping):
params = dict(util.get_param_values(initial_items),
**dict({'sort': self.sort}, **params))
super(MultiDimensionalMapping, self).__init__(OrderedDict(), **params)
if kdims is not None:
params['kdims'] = kdims
super(MultiDimensionalMapping, self).__init__(OrderedDict(), **dict(params))
if type(initial_items) is dict and not self.sort:
raise ValueError('If sort=False the data must define a fixed '
'ordering, please supply a list of items or '
Expand Down Expand Up @@ -733,11 +735,11 @@ class UniformNdMapping(NdMapping):
_deep_indexable = True
_auxiliary_component = False

def __init__(self, initial_items=None, group=None, label=None, **params):
def __init__(self, initial_items=None, kdims=None, group=None, label=None, **params):
self._type = None
self._group_check, self.group = None, group
self._label_check, self.label = None, label
super(UniformNdMapping, self).__init__(initial_items, **params)
super(UniformNdMapping, self).__init__(initial_items, kdims=kdims, **params)


def clone(self, data=None, shared_data=True, new_type=None, *args, **overrides):
Expand Down
4 changes: 2 additions & 2 deletions holoviews/core/overlay.py
Original file line number Diff line number Diff line change
Expand Up @@ -245,8 +245,8 @@ class NdOverlay(UniformNdMapping, CompositeOverlay, Overlayable):

_deep_indexable = True

def __init__(self, overlays=None, **params):
super(NdOverlay, self).__init__(overlays, **params)
def __init__(self, overlays=None, kdims=None, **params):
super(NdOverlay, self).__init__(overlays, kdims=kdims, **params)


__all__ = list(set([_k for _k, _v in locals().items()
Expand Down
4 changes: 2 additions & 2 deletions holoviews/core/spaces.py
Original file line number Diff line number Diff line change
Expand Up @@ -1341,8 +1341,8 @@ class GridSpace(UniformNdMapping):

kdims = param.List(default=[Dimension("X"), Dimension("Y")], bounds=(1,2))

def __init__(self, initial_items=None, **params):
super(GridSpace, self).__init__(initial_items, **params)
def __init__(self, initial_items=None, kdims=None, **params):
super(GridSpace, self).__init__(initial_items, kdims=kdims, **params)
if self.ndims > 2:
raise Exception('Grids can have no more than two dimensions.')

Expand Down
10 changes: 7 additions & 3 deletions holoviews/element/chart.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,10 @@ class Histogram(Element2D):
vdims = param.List(default=[Dimension('Frequency')], bounds=(1,1))

def __init__(self, values, edges=None, **params):
if edges is not None:
self.warning("Histogram edges should be supplied as a tuple "
"along with the values, passing the edges will "
"be deprecated in holoviews 2.0.")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Something to mention in the next changelog/release notes. It will be good to get histogram working consistently with everything else.

self.values, self.edges, settings = self._process_data(values, edges)
settings.update(params)
super(Histogram, self).__init__((self.values, self.edges), **settings)
Expand Down Expand Up @@ -340,10 +344,10 @@ class VectorField(Points):
_null_value = np.array([[], [], [], []]).T # For when data is None
_min_dims = 3 # Minimum number of columns

def __init__(self, data, **params):
if isinstance(data, list) and all(isinstance(d, np.ndarray) for d in data):
def __init__(self, data, kdims=None, vdims=None, **params):
if isinstance(data, list) and data and all(isinstance(d, np.ndarray) for d in data):
data = np.column_stack([d.flat if d.ndim > 1 else d for d in data])
super(VectorField, self).__init__(data, **params)
super(VectorField, self).__init__(data, kdims=kdims, vdims=vdims, **params)



Expand Down
4 changes: 2 additions & 2 deletions holoviews/element/chart3d.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@ class Surface(Image, Element3D):

group = param.String(default='Surface', constant=True)

def __init__(self, data, extents=None, **params):
def __init__(self, data, kdims=None, vdims=None, extents=None, **params):
extents = extents if extents else (None, None, None, None, None, None)
Image.__init__(self, data, extents=extents, **params)
Image.__init__(self, data, kdims=kdims, vdims=vdims, extents=extents, **params)



Expand Down
4 changes: 2 additions & 2 deletions holoviews/element/graphs.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ class Graph(Dataset, Element2D):
kdims = param.List(default=[Dimension('start'), Dimension('end')],
bounds=(2, 2))

def __init__(self, data, **params):
def __init__(self, data, kdims=None, vdims=None, **params):
if isinstance(data, tuple):
data = data + (None,)* (3-len(data))
edges, nodes, edgepaths = data
Expand All @@ -122,7 +122,7 @@ def __init__(self, data, **params):
edgepaths = EdgePaths(edgepaths)
self._nodes = nodes
self._edgepaths = edgepaths
super(Graph, self).__init__(edges, **params)
super(Graph, self).__init__(edges, kdims=kdims, vdims=vdims, **params)
if self._nodes is None and node_info:
nodes = self.nodes.clone(datatype=['pandas', 'dictionary'])
for d in node_info.dimensions():
Expand Down
Loading