You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Here is the code I currently use to get the weighted mean of an xarray.DataArray.
defweighted_mean(data_da, dim, weights):
r"""Computes the weighted mean. We can only do the actual weighted mean over the dimensions that ``data_da`` and ``weights`` share, so for dimensions in ``dim`` that aren't included in ``weights`` we must take the unweighted mean. This functions skips NaNs, i.e. Data points that are NaN have corresponding NaN weights. Args: data_da (xarray.DataArray): Data to compute a weighted mean for. dim (str | list[str]): dimension(s) of the dataarray to reduce over weights (xarray.DataArray): a 1-D dataarray the same length as the weighted dim, with dimension name equal to that of the weighted dim. Must be nonnegative. Returns: (xarray.DataArray): The mean over the given dimension. So it will contain all dimensions of the input that are not in ``dim``. Raises: (IndexError): If ``weights.dims`` is not a subset of ``dim``. (ValueError): If ``weights`` has values that are negative or infinite. """ifisinstance(dim, str):
dim= [dim]
else:
dim=list(dim)
ifnotset(weights.dims) <=set(dim):
dim_err_msg= (
"`weights.dims` must be a subset of `dim`. {} are dimensions in ""`weights`, but not in `dim`."
).format(set(weights.dims) -set(dim))
raiseIndexError(dim_err_msg)
else:
pass# `weights.dims` is a subset of `dim`if (weights<0).any() orxr.ufuncs.isinf(weights).any():
negative_weight_err_msg="Weight must be nonnegative and finite"raiseValueError(negative_weight_err_msg)
else:
pass# `weights` are nonnegativeweight_dims= [
weight_dimforweight_dimindimifweight_diminweights.dims
]
ifnp.isnan(data_da).any():
expanded_weights, _=xr.broadcast(weights, data_da)
weights_with_nans=expanded_weights.where(~np.isnan(data_da))
else:
weights_with_nans=weightsmean_da= ((data_da*weights_with_nans).sum(weight_dims, skipna=True)
/weights_with_nans.sum(weight_dims))
other_dims=list(set(dim) -set(weight_dims))
returnmean_da.mean(other_dims, skipna=True)
If no one is already working on this and if it seems useful, then I would be happy to work on this.
Thank you,
Martin
The text was updated successfully, but these errors were encountered:
Code Sample, a copy-pastable example if possible
Currently
xarray.DataArray.mean()
andxarray.Dataset.mean()
cannot calculate weighted means. I think it would be useful if it had a similar API tonumpy.average
: https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.average.htmlHere is the code I currently use to get the weighted mean of an
xarray.DataArray
.If no one is already working on this and if it seems useful, then I would be happy to work on this.
Thank you,
Martin
The text was updated successfully, but these errors were encountered: