pydata / xarray

N-D labeled arrays and datasets in Python
https://xarray.dev
Apache License 2.0
3.54k stars 1.06k forks source link

[feature request] __iter__() for rolling-window on datasets #3452

Open Hoeze opened 4 years ago

Hoeze commented 4 years ago

Currently, rolling() on a dataset does not return an iterator:

MCVE Code Sample

arr = xr.DataArray(np.arange(0, 7.5, 0.5).reshape(3, 5),
    dims=('x', 'y'))

r = arr.to_dataset(name="test").rolling(y=3)
for label, arr_window in r:
    print(label)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-b1703cb71c1e> in <module>
      3 
      4 r = arr.to_dataset(name="test").rolling(y=3)
----> 5 for label, arr_window in r:
      6     print(label)

TypeError: 'DatasetRolling' object is not iterable

Output of xr.show_versions()

INSTALLED VERSIONS ------------------ commit: None python: 3.7.4 (default, Aug 13 2019, 20:35:49) [GCC 7.3.0] python-bits: 64 OS: Linux OS-release: 5.3.7-arch1-1-ARCH machine: x86_64 processor: byteorder: little LC_ALL: None LANG: de_DE.UTF-8 LOCALE: de_DE.UTF-8 libhdf5: 1.10.4 libnetcdf: None xarray: 0.13.0 pandas: 0.24.2 numpy: 1.16.4 scipy: 1.3.0 netCDF4: None pydap: None h5netcdf: 0.7.4 h5py: 2.9.0 Nio: None zarr: None cftime: None nc_time_axis: None PseudoNetCDF: None rasterio: None cfgrib: None iris: None bottleneck: None dask: 2.1.0 distributed: 2.1.0 matplotlib: 3.1.1 cartopy: None seaborn: 0.9.0 numbagg: None setuptools: 41.4.0 pip: 19.1.1 conda: None pytest: None IPython: 7.8.0 sphinx: None
dcherian commented 4 years ago

You should look at rolling.construct. It could be a lot more efficient than iterating.

Hoeze commented 4 years ago

Thanks for your suggestion @dcherian

You should look at rolling.construct. It could be a lot more efficient than iterating.

I think iterating over rolling.construct() should then be equally efficient compared to some rolling.__iter__() function?