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