xarray_einstats.stats.median_abs_deviation#
- xarray_einstats.stats.median_abs_deviation(da, dims=None, *, center=None, scale=1, nan_policy=None, **kwargs)[source]#
Wrap and extend
scipy.stats.median_abs_deviation
.Usage examples available at Intro to the stats module.
All parameters take the same values and types as the scipy counterpart with the exception of
scale
. Herescale
can also takeDataArray
values in which case, broadcasting is handled by xarray, as shown in the example.Examples
Use a
DataArray
asscale
.import xarray as xr from xarray_einstats import tutorial, stats ds = tutorial.generate_mcmc_like_dataset(3) s_da = xr.DataArray([1, 2, 1, 1], coords={"chain": ds.chain}) stats.median_abs_deviation(ds["mu"], dims="draw", scale=s_da)
<xarray.DataArray (chain: 4, team: 6)> 0.3468 0.4532 0.5054 0.876 0.6265 0.7342 ... 0.4382 0.5668 0.7103 0.2494 0.3485 Coordinates: * team (team) <U1 'a' 'b' 'c' 'd' 'e' 'f' * chain (chain) int64 0 1 2 3
Note that this doesn’t work with the scipy counterpart because
s_da
can’t be broadcasted with the output:from scipy import stats stats.median_abs_deviation(ds["mu"], axis=1, scale=s_da)
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) Input In [2], in <cell line: 2>() 1 from scipy import stats ----> 2 stats.median_abs_deviation(ds["mu"], axis=1, scale=s_da) File ~/checkouts/readthedocs.org/user_builds/xarray-einstats/envs/v0.3.0/lib/python3.9/site-packages/scipy/stats/_stats_py.py:3048, in median_abs_deviation(x, axis, center, scale, nan_policy) 3045 med = np.expand_dims(center(x, axis=axis), axis) 3046 mad = np.median(np.abs(x - med), axis=axis) -> 3048 return mad / scale File ~/checkouts/readthedocs.org/user_builds/xarray-einstats/envs/v0.3.0/lib/python3.9/site-packages/xarray/core/arithmetic.py:79, in SupportsArithmetic.__array_ufunc__(self, ufunc, method, *inputs, **kwargs) 70 raise NotImplementedError( 71 "xarray objects are not yet supported in the `out` argument " 72 "for ufuncs. As an alternative, consider explicitly " 73 "converting xarray objects to NumPy arrays (e.g., with " 74 "`.values`)." 75 ) 77 join = dataset_join = OPTIONS["arithmetic_join"] ---> 79 return apply_ufunc( 80 ufunc, 81 *inputs, 82 input_core_dims=((),) * ufunc.nin, 83 output_core_dims=((),) * ufunc.nout, 84 join=join, 85 dataset_join=dataset_join, 86 dataset_fill_value=np.nan, 87 kwargs=kwargs, 88 dask="allowed", 89 keep_attrs=_get_keep_attrs(default=True), 90 ) File ~/checkouts/readthedocs.org/user_builds/xarray-einstats/envs/v0.3.0/lib/python3.9/site-packages/xarray/core/computation.py:1159, in apply_ufunc(func, input_core_dims, output_core_dims, exclude_dims, vectorize, join, dataset_join, dataset_fill_value, keep_attrs, kwargs, dask, output_dtypes, output_sizes, meta, dask_gufunc_kwargs, *args) 1157 # feed DataArray apply_variable_ufunc through apply_dataarray_vfunc 1158 elif any(isinstance(a, DataArray) for a in args): -> 1159 return apply_dataarray_vfunc( 1160 variables_vfunc, 1161 *args, 1162 signature=signature, 1163 join=join, 1164 exclude_dims=exclude_dims, 1165 keep_attrs=keep_attrs, 1166 ) 1167 # feed Variables directly through apply_variable_ufunc 1168 elif any(isinstance(a, Variable) for a in args): File ~/checkouts/readthedocs.org/user_builds/xarray-einstats/envs/v0.3.0/lib/python3.9/site-packages/xarray/core/computation.py:286, in apply_dataarray_vfunc(func, signature, join, exclude_dims, keep_attrs, *args) 281 result_coords = build_output_coords( 282 args, signature, exclude_dims, combine_attrs=keep_attrs 283 ) 285 data_vars = [getattr(a, "variable", a) for a in args] --> 286 result_var = func(*data_vars) 288 if signature.num_outputs > 1: 289 out = tuple( 290 DataArray(variable, coords, name=name, fastpath=True) 291 for variable, coords in zip(result_var, result_coords) 292 ) File ~/checkouts/readthedocs.org/user_builds/xarray-einstats/envs/v0.3.0/lib/python3.9/site-packages/xarray/core/computation.py:727, in apply_variable_ufunc(func, signature, exclude_dims, dask, output_dtypes, vectorize, keep_attrs, dask_gufunc_kwargs, *args) 722 if vectorize: 723 func = _vectorize( 724 func, signature, output_dtypes=output_dtypes, exclude_dims=exclude_dims 725 ) --> 727 result_data = func(*input_data) 729 if signature.num_outputs == 1: 730 result_data = (result_data,) ValueError: operands could not be broadcast together with shapes (4,6) (4,)