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 2005¶
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_2005"))
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
['COI0501',
'COI0502',
'COI0503',
'COI0504',
'COI0505',
'COI0506',
'COI0507',
'COI0508',
'COI0509',
'COI0510',
'COI0511',
'COI0512',
'COI0513',
'COI0514',
'COI0515',
'COI0516',
'COI0517',
'COI0518',
'COI0519',
'COI0520',
'COI0521',
'COI0522',
'COI0523',
'COI0524']
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
COI0503
<xarray.Dataset> Size: 5MB
Dimensions: (t: 9855, depth: 12)
Coordinates:
* t (t) datetime64[ns] 79kB 2005-05-18T22:36:00 ... 2005-06-29
* depth (depth) float64 96B 3.23 6.25 9.24 12.25 ... 30.24 33.25 36.24
longitude float64 8B -151.4
latitude float64 8B 60.72
Data variables:
b (t, depth) float64 946kB 12.0 11.0 10.0 9.0 ... 4.0 3.0 2.0 1.0
d (t, depth) float64 946kB 19.0 13.0 13.0 ... 181.0 178.0 178.0
s (t, depth) float64 946kB 0.486 0.841 0.854 ... 2.112 2.012 1.894
u (t, depth) float64 946kB 0.1582 0.1892 0.1921 ... 0.07022 0.0661
v (t, depth) float64 946kB 0.4595 0.8194 0.8321 ... -2.011 -1.893Plot 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_3226/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']"