import intake
import hvplot.pandas
import hvplot.xarray
import cook_inlet_catalogs as cic
import holoviews as hv

Moored ADCP (NOAA): ADCP survey Kodiak Island, Set 2

Moored NOAA ADCP surveys in Cook Inlet

ADCP data has been converted to eastward, northward velocities as well as along- and across-channel velocities, in the latter case using the NOAA-provided rotation angle for the rotation. The along- and across-channel velocities are additionally filtered to show the subtidal signal, which is what is plotted in the dataset page.

cat = intake.open_catalog(cic.utils.cat_path("adcp_moored_noaa_kod_2"))

Plot all datasets in catalog

dd, ddlabels = cic.utils.combine_datasets_for_map(cat)
dd.hvplot(**cat.metadata["map"]) * ddlabels.hvplot(**cat.metadata["maplabels"])

List available datasets in the catalog

dataset_ids = list(cat)
dataset_ids
['KOD0926',
 'KOD0927',
 'KOD0928',
 'KOD0929',
 'KOD0930',
 'KOD0931',
 'KOD0932',
 'KOD0933',
 'KOD0934',
 'KOD0935',
 'KOD0936',
 'KOD0937',
 'KOD0938',
 'KOD0939',
 'KOD0940',
 'KOD0941',
 'KOD0942',
 'KOD0943',
 'KOD0944']

Select one dataset to investigate

try:
    dataset_id = dataset_ids[2]
except:
    dataset_id = dataset_ids[0]
print(dataset_id)

dd = cat[dataset_id].read()
dd
KOD0928
<xarray.Dataset> Size: 10MB
Dimensions:    (t: 11007, depth: 22)
Coordinates:
  * t          (t) datetime64[ns] 88kB 2009-07-17T03:24:00 ... 2009-09-01
  * depth      (depth) float64 176B 5.64 7.65 9.66 11.64 ... 43.65 45.66 47.64
    longitude  float64 8B -153.2
    latitude   float64 8B 58.0
Data variables:
    b          (t, depth) float64 2MB 22.0 21.0 20.0 19.0 ... 4.0 3.0 2.0 1.0
    d          (t, depth) float64 2MB 99.0 84.0 76.0 81.0 ... 104.0 106.0 108.0
    s          (t, depth) float64 2MB 0.178 0.154 0.13 ... 0.197 0.176 0.136
    u          (t, depth) float64 2MB 0.1758 0.1532 0.1261 ... 0.1692 0.1293
    v          (t, depth) float64 2MB -0.02785 0.0161 ... -0.04851 -0.04203

Plot one dataset

keys = list(cat[dataset_id].metadata["plots"].keys())
print(keys)

plots = []
for key in keys:
    plot_kwargs = cat[dataset_id].metadata["plots"][key]
    if "clim" in plot_kwargs and isinstance(plot_kwargs["clim"], list):
        plot_kwargs["clim"] = tuple(plot_kwargs["clim"])
    if "dynamic" in plot_kwargs:
        plot_kwargs["dynamic"] = False
    plots.append(cat[dataset_id].ToHvPlot(**plot_kwargs).read())
hv.Layout(plots).cols(1)
['ualong', 'vacross']
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/latest/lib/python3.11/site-packages/xarray/core/dataset.py in ?(self, name)
   1230             variable = self._variables[name]
   1231         except KeyError:
-> 1232             _, name, variable = _get_virtual_variable(self._variables, name, self.sizes)
   1233 

KeyError: 'ualong_subtidal'

During handling of the above exception, another exception occurred:

KeyError                                  Traceback (most recent call last)
File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/latest/lib/python3.11/site-packages/xarray/core/dataset.py:1337, in Dataset.__getitem__(self, key)
   1336 try:
-> 1337     return self._construct_dataarray(key)
   1338 except KeyError as e:

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/latest/lib/python3.11/site-packages/xarray/core/dataset.py:1232, in Dataset._construct_dataarray(self, name)
   1231 except KeyError:
-> 1232     _, name, variable = _get_virtual_variable(self._variables, name, self.sizes)
   1234 needed_dims = set(variable.dims)

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/latest/lib/python3.11/site-packages/xarray/core/dataset_utils.py:79, in _get_virtual_variable(variables, key, dim_sizes)
     78 if len(split_key) != 2:
---> 79     raise KeyError(key)
     81 ref_name, var_name = split_key

KeyError: 'ualong_subtidal'

The above exception was the direct cause of the following exception:

KeyError                                  Traceback (most recent call last)
/tmp/ipykernel_3314/1925617574.py in ?()
      7     if "clim" in plot_kwargs and isinstance(plot_kwargs["clim"], list):
      8         plot_kwargs["clim"] = tuple(plot_kwargs["clim"])
      9     if "dynamic" in plot_kwargs:
     10         plot_kwargs["dynamic"] = False
---> 11     plots.append(cat[dataset_id].ToHvPlot(**plot_kwargs).read())
     12 hv.Layout(plots).cols(1)

~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/latest/lib/python3.11/site-packages/intake/readers/readers.py in ?(self, *args, **kwargs)
    117         logger.debug("Reading %s", self)
    118         kw = self.kwargs.copy()
    119         kw.update(kwargs)
    120         args = kw.pop("args", ()) or args
--> 121         return self._read(*args, **kw)

~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/latest/lib/python3.11/site-packages/intake/readers/convert.py in ?(self, discover, **kwargs)
    625         data = None
    626         for i, step in enumerate(self.steps):
    627             kw = kwargs if i == len(self.steps) else {}
    628             if i:
--> 629                 data = self._read_stage_n(i, data=data, **kw)
    630             else:
    631                 data = self._read_stage_n(i, discover=discover, **kw)
    632         return data

~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/latest/lib/python3.11/site-packages/intake/readers/convert.py in ?(self, stage, discover, **kwargs)
    611         if isinstance(func, type) and issubclass(func, BaseReader):
    612             if discover:
    613                 return func(metadata=self.metadata).discover(*arg, **kw2)
    614             else:
--> 615                 return func(metadata=self.metadata).read(*arg, **kw2)
    616         elif isinstance(func, BaseReader):
    617             if discover:
    618                 return func.discover(*arg, **kw2)

~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/latest/lib/python3.11/site-packages/intake/readers/readers.py in ?(self, *args, **kwargs)
    117         logger.debug("Reading %s", self)
    118         kw = self.kwargs.copy()
    119         kw.update(kwargs)
    120         args = kw.pop("args", ()) or args
--> 121         return self._read(*args, **kw)

~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/latest/lib/python3.11/site-packages/intake/readers/convert.py in ?(self, data, *args, **kwargs)
     58             data = args[0]
     59             args = args[1:]
     60         if isinstance(data, BaseReader):
     61             data = data.read()
---> 62         return self.run(data, *args, **kwargs)

~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/latest/lib/python3.11/site-packages/intake/readers/convert.py in ?(self, data, explorer, **kw)
    188 
    189         if explorer:
    190             # this is actually a hvplot.ui:hvPlotExplorer and only allows tabular data
    191             return hvplot.explorer(data, **kw)
--> 192         return hvplot.hvPlot(data, **kw)()

~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/latest/lib/python3.11/site-packages/hvplot/plotting/core.py in ?(self, x, y, kind, **kwds)
     91             if panel_dict:
     92                 plot = self._get_converter(x, y, kind, **kwds)(kind, x, y)
     93                 return pn.panel(plot, **panel_dict)
     94 
---> 95         return self._get_converter(x, y, kind, **kwds)(kind, x, y)

~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/latest/lib/python3.11/site-packages/hvplot/plotting/core.py in ?(self, x, y, kind, **kwds)
     98         params = dict(self._metadata, **kwds)
     99         x = x or params.pop('x', None)
    100         y = y or params.pop('y', None)
    101         kind = kind or params.pop('kind', None)
--> 102         return HoloViewsConverter(self._data, x, y, kind=kind, **params)

~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/latest/lib/python3.11/site-packages/hvplot/converter.py in ?(self, data, x, y, kind, by, use_index, group_label, value_label, backlog, persist, use_dask, crs, fields, groupby, dynamic, grid, legend, legend_cols, legend_opts, rot, title, xlim, ylim, clim, robust, symmetric, logx, logy, loglog, hover, hover_cols, hover_formatters, hover_tooltips, subplots, label, invert, stacked, colorbar, cticks, datashade, rasterize, downsample, resample_when, row, col, debug, framewise, aggregator, selector, projection, global_extent, geo, precompute, flip_xaxis, flip_yaxis, dynspread, x_sampling, y_sampling, pixel_ratio, project, toolbar, autohide_toolbar, tools, attr_labels, coastline, tiles, tiles_opts, sort_date, check_symmetric_max, transforms, stream, cnorm, features, rescale_discrete_levels, autorange, subcoordinate_y, backend_opts, **kwds)
    931         self._redim = fields
    932         self.use_index = use_index
    933         self.value_label = value_label
    934         self.label = label
--> 935         self._process_data(
    936             kind,
    937             data,
    938             x,

~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/latest/lib/python3.11/site-packages/hvplot/converter.py in ?(self, kind, data, x, y, by, groupby, row, col, use_dask, persist, backlog, label, group_label, value_label, hover_cols, attr_labels, transforms, stream, robust, kwds)
   1459                     z = list(data.data_vars)[0]
   1460                 else:
   1461                     z = data.name or label or value_label
   1462             if gridded and isinstance(data, xr.Dataset) and not isinstance(z, list):
-> 1463                 data = data[z]
   1464             self.z = z
   1465 
   1466             ignore = (groupby or []) + (by or []) + grid

~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/latest/lib/python3.11/site-packages/xarray/core/dataset.py in ?(self, key)
   1346 
   1347                 # If someone attempts `ds['foo' , 'bar']` instead of `ds[['foo', 'bar']]`
   1348                 if isinstance(key, tuple):
   1349                     message += f"\nHint: use a list to select multiple variables, for example `ds[{list(key)}]`"
-> 1350                 raise KeyError(message) from e
   1351 
   1352         if utils.iterable_of_hashable(key):
   1353             return self._copy_listed(key)

KeyError: "No variable named 'ualong_subtidal'. Variables on the dataset include ['b', 'd', 's', 't', 'depth', 'longitude', 'latitude', 'u', 'v']"