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

Moored ADCP (NOAA): ADCP survey Cook Inlet, multiple years

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_coi_other"))

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
['COI0206',
 'COI0207',
 'COI0213',
 'COI0301',
 'COI0302',
 'COI0303',
 'COI0306',
 'COI0307',
 'COI0418',
 'COI0419',
 'COI0420',
 'COI0421',
 'COI0422',
 'COI0801',
 'COI0802',
 'COI1201',
 'COI1202',
 'COI1203',
 'COI1204',
 'COI1205',
 'COI1207',
 'COI1208',
 'COI1209',
 'COI1210']

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
COI0213
<xarray.Dataset> Size: 3MB
Dimensions:    (t: 7682, depth: 11)
Coordinates:
  * t          (t) datetime64[ns] 61kB 2002-07-12T23:54:00 ... 2002-08-14
  * depth      (depth) float64 88B 4.66 5.67 6.68 7.65 ... 12.65 13.66 14.66
    longitude  float64 8B -150.2
    latitude   float64 8B 61.19
Data variables:
    b          (t, depth) float64 676kB 11.0 10.0 9.0 8.0 ... 4.0 3.0 2.0 1.0
    d          (t, depth) float64 676kB 263.0 265.0 265.0 ... 268.0 270.0 270.0
    s          (t, depth) float64 676kB 0.688 0.701 0.68 ... 0.927 0.907 0.868
    u          (t, depth) float64 676kB -0.6829 -0.6983 ... -0.907 -0.868
    v          (t, depth) float64 676kB -0.08385 -0.0611 ... -1.594e-16

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/stable/lib/python3.11/site-packages/xarray/core/dataset.py in ?(self, name)
   1229             variable = self._variables[name]
   1230         except KeyError:
-> 1231             _, name, variable = _get_virtual_variable(self._variables, name, self.sizes)
   1232 

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/stable/lib/python3.11/site-packages/xarray/core/dataset.py:1336, in Dataset.__getitem__(self, key)
   1335 try:
-> 1336     return self._construct_dataarray(key)
   1337 except KeyError as e:

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

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