Skip to content

DataArray.resample().apply() fails to apply custom function #6953

Open
@st-bender

Description

@st-bender

What happened?

Hi,
I try to apply a custom function to aggregate a resampled object via .apply().
Maybe it is a documentation issue? But I couldn't find it.

For example calculating the median by passing np.median fails with an error as shown in the log below.

What did you expect to happen?

I would expect the median or any other custom function to be calculated for the resampled data.
It seems to work with pure pandas.

Minimal Complete Verifiable Example

import numpy as np
import pandas as pd
import xarray as xr

idx = pd.date_range("2000-01-01", "2000-12-31")
data = xr.DataArray(np.random.randn(len(idx)), coords={"index": idx})

data.resample(index="M").apply(np.median)

MVCE confirmation

  • Minimal example — the example is as focused as reasonably possible to demonstrate the underlying issue in xarray.
  • Complete example — the example is self-contained, including all data and the text of any traceback.
  • Verifiable example — the example copy & pastes into an IPython prompt or Binder notebook, returning the result.
  • New issue — a search of GitHub Issues suggests this is not a duplicate.

Relevant log output

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Input In [425], in <cell line: 3>()
      1 idx = pd.date_range("2000-01-01", "2000-12-31")
      2 data = pd.Series(np.random.randn(len(idx)), index=idx).to_xarray()
----> 3 data.resample(index="M", label="left", loffset="15d").apply(np.median)

File ~/Work/miniconda3/envs/20211123_py39/lib/python3.9/site-packages/xarray/core/resample.py:279, in DataArrayResample.apply(self, func, args, shortcut, **kwargs)
    267 """
    268 Backward compatible implementation of ``map``
    269 
   (...)
    272 DataArrayResample.map
    273 """
    274 warnings.warn(
    275     "Resample.apply may be deprecated in the future. Using Resample.map is encouraged",
    276     PendingDeprecationWarning,
    277     stacklevel=2,
    278 )
--> 279 return self.map(func=func, shortcut=shortcut, args=args, **kwargs)

File ~/Work/miniconda3/envs/20211123_py39/lib/python3.9/site-packages/xarray/core/resample.py:253, in DataArrayResample.map(self, func, args, shortcut, **kwargs)
    210 """Apply a function to each array in the group and concatenate them
    211 together into a new array.
    212 
   (...)
    249     The result of splitting, applying and combining this array.
    250 """
    251 # TODO: the argument order for Resample doesn't match that for its parent,
    252 # GroupBy
--> 253 combined = super().map(func, shortcut=shortcut, args=args, **kwargs)
    255 # If the aggregation function didn't drop the original resampling
    256 # dimension, then we need to do so before we can rename the proxy
    257 # dimension we used.
    258 if self._dim in combined.coords:

File ~/Work/miniconda3/envs/20211123_py39/lib/python3.9/site-packages/xarray/core/groupby.py:1095, in DataArrayGroupByBase.map(self, func, args, shortcut, **kwargs)
   1093 grouped = self._iter_grouped_shortcut() if shortcut else self._iter_grouped()
   1094 applied = (maybe_wrap_array(arr, func(arr, *args, **kwargs)) for arr in grouped)
-> 1095 return self._combine(applied, shortcut=shortcut)

File ~/Work/miniconda3/envs/20211123_py39/lib/python3.9/site-packages/xarray/core/groupby.py:1115, in DataArrayGroupByBase._combine(self, applied, shortcut)
   1113 """Recombine the applied objects like the original."""
   1114 applied_example, applied = peek_at(applied)
-> 1115 coord, dim, positions = self._infer_concat_args(applied_example)
   1116 if shortcut:
   1117     combined = self._concat_shortcut(applied, dim, positions)

File ~/Work/miniconda3/envs/20211123_py39/lib/python3.9/site-packages/xarray/core/groupby.py:559, in GroupBy._infer_concat_args(self, applied_example)
    558 def _infer_concat_args(self, applied_example):
--> 559     if self._group_dim in applied_example.dims:
    560         coord = self._group
    561         positions = self._group_indices

AttributeError: 'numpy.float64' object has no attribute 'dims'

Anything else we need to know?

No response

Environment

INSTALLED VERSIONS

commit: None
python: 3.9.13 | packaged by conda-forge | (main, May 27 2022, 16:56:21)
[GCC 10.3.0]
python-bits: 64
OS: Linux
OS-release: 4.4.0-210-generic
machine: x86_64
processor: x86_64
byteorder: little
LC_ALL: None
LANG: C
LOCALE: ('en_GB', 'UTF-8')
libhdf5: 1.12.2
libnetcdf: 4.8.1

xarray: 2022.6.0
pandas: 1.4.3
numpy: 1.23.2
scipy: 1.9.0
netCDF4: 1.6.0
pydap: installed
h5netcdf: None
h5py: 3.7.0
Nio: None
zarr: 2.12.0
cftime: 1.6.1
nc_time_axis: None
PseudoNetCDF: None
rasterio: None
cfgrib: None
iris: None
bottleneck: None
dask: 2022.6.1
distributed: 2022.6.1
matplotlib: 3.5.3
cartopy: 0.20.3
seaborn: None
numbagg: None
fsspec: 2022.7.1
cupy: None
pint: None
sparse: None
flox: None
numpy_groupies: None
setuptools: 65.2.0
pip: 22.2.2
conda: 4.14.0
pytest: 7.1.2
IPython: 8.4.0
sphinx: 5.1.1

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions