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.2808Plot 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']"