Source code for huracanpy._subset
import numpy as np
import xarray as xr
__all__ = ["trackswhere", "sel_id"]
[docs]
def sel_id(tracks, track_ids, track_id):
"""Select a track or tracks from a dataset of tracks by ID
Parameters
----------
tracks : xarray.Dataset
track_ids : xarray.DataArray
The track_ids corresponding to the tracks Dataset
track_id : Any
The track ID or IDs to match in track_ids.
Returns
-------
xarray.Dataset
"""
if track_ids.ndim != 1:
raise ValueError("track_ids must be 1d")
if np.isscalar(track_id):
track_id = [track_id]
dim = track_ids.dims[0]
idx = np.where(np.isin(track_ids, track_id))[0]
return tracks.isel(**{dim: idx})
[docs]
def trackswhere(tracks, track_ids, condition):
"""Subset tracks that verify a condition.
e.g select all tracks that are solely in the Northern hemisphere:
>>> tracks_subset = huracanpy.trackswhere(
>>> tracks, tracks.track_id, lambda x: (x.lat > 0).all()
>>> )
e.g. select all tracks that are category 2 at least once in their lifetime:
>>> track_subset = huracanpy.trackswhere(
tracks, tracks.track_id, lambda track: track.pressure_category.max() >= 2
)
Parameters
----------
tracks : xarray.Dataset
track_ids : xarray.DataArray
The track_ids corresponding to the tracks Dataset
condition : callable
A function that takes an `xarray.Dataset` of an individual track and returns
True or False
Returns
-------
xarray.Dataset
A dataset with the subset of tracks from the input that match the given criteria
"""
if track_ids.ndim != 1:
raise ValueError("track_ids must be 1d")
track_groups = [
track for track_id, track in tracks.groupby(track_ids) if condition(track)
]
return xr.concat(track_groups, dim=track_ids.dims[0])