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 1

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.

Stations “KOD0914”, “KOD0915”, “KOD0916”, “KOD0917”, “KOD0918”, “KOD0919”, “KOD0920” are not included because they are just outside or along the model domain boundary.

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

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
['KOD0901',
 'KOD0902',
 'KOD0903',
 'KOD0904',
 'KOD0905',
 'KOD0906',
 'KOD0907',
 'KOD0910',
 'KOD0911',
 'KOD0912',
 'KOD0913',
 'KOD0921',
 'KOD0922',
 'KOD0923',
 'KOD0924',
 'KOD0925']

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
KOD0903
<xarray.Dataset> Size: 7MB
Dimensions:    (t: 19898, depth: 9)
Coordinates:
  * t          (t) datetime64[ns] 159kB 2009-05-29T03:36:00 ... 2009-08-20T01...
  * depth      (depth) float64 72B 1.95 2.93 3.93 4.94 5.94 6.95 7.92 8.93 9.94
    longitude  float64 8B -152.4
    latitude   float64 8B 57.79
Data variables:
    b          (t, depth) float64 1MB 9.0 8.0 7.0 6.0 5.0 ... 4.0 3.0 2.0 1.0
    d          (t, depth) float64 1MB 235.0 229.0 228.0 ... 229.0 226.0 223.0
    s          (t, depth) float64 1MB 0.115 0.138 0.122 ... 0.453 0.424 0.384
    u          (t, depth) float64 1MB -0.0942 -0.1041 ... -0.305 -0.2619
    v          (t, depth) float64 1MB -0.06596 -0.09054 ... -0.2945 -0.2808

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_3291/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']"