html_url,issue_url,id,node_id,user,created_at,updated_at,author_association,body,reactions,performed_via_github_app,issue https://github.com/pydata/xarray/issues/2007#issuecomment-880141480,https://api.github.com/repos/pydata/xarray/issues/2007,880141480,MDEyOklzc3VlQ29tbWVudDg4MDE0MTQ4MA==,223250,2021-07-14T19:10:46Z,2021-07-14T19:10:46Z,CONTRIBUTOR,"I added support for `.rolling(..., pad=False)` in #5603. The basic implementation was simple, but getting it working for bottleneck/dask took a little more work. That fixes, e.g., #4743, but I don't think it's a complete fix for this issue.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,307783090 https://github.com/pydata/xarray/issues/2007#issuecomment-876579830,https://api.github.com/repos/pydata/xarray/issues/2007,876579830,MDEyOklzc3VlQ29tbWVudDg3NjU3OTgzMA==,2448579,2021-07-08T16:30:06Z,2021-07-08T16:30:06Z,MEMBER,Yes. I think we might want this anyway; for `rolling` without any padding at all.,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,307783090 https://github.com/pydata/xarray/issues/2007#issuecomment-876103462,https://api.github.com/repos/pydata/xarray/issues/2007,876103462,MDEyOklzc3VlQ29tbWVudDg3NjEwMzQ2Mg==,223250,2021-07-08T03:55:33Z,2021-07-08T03:55:33Z,CONTRIBUTOR,"> `.pad(...).rolling(..., pad=False)` For this API, it seems that the only thing that would need to be implemented would be adding a `pad` keyword argument to rolling, defaulting to `True`. Is that correct?","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,307783090 https://github.com/pydata/xarray/issues/2007#issuecomment-875980218,https://api.github.com/repos/pydata/xarray/issues/2007,875980218,MDEyOklzc3VlQ29tbWVudDg3NTk4MDIxOA==,2448579,2021-07-07T22:38:08Z,2021-07-07T22:38:08Z,MEMBER,"This should be easy now so we just need someone to try it out. This is where the padding happens so the kwarg needs to be passed all the way down to `Variable.rolling_window` https://github.com/pydata/xarray/blob/67d1955cc1d6941edd12a325090da7e4d029b84c/xarray/core/variable.py#L2132 What should the API be? `.rolling(..., pad_kwargs={...})` or just have `.pad(...).rolling(..., pad=False)` i.e. have the user `pad` beforehand? The only advantage to the first one AFAICT is that the user doesn't have to specify the window length (or padding length) twice. ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,307783090 https://github.com/pydata/xarray/issues/2007#issuecomment-875974272,https://api.github.com/repos/pydata/xarray/issues/2007,875974272,MDEyOklzc3VlQ29tbWVudDg3NTk3NDI3Mg==,6426942,2021-07-07T22:23:31Z,2021-07-07T22:24:11Z,NONE,"Hello! First of all, thanks so much for those of you who contribute to xarray, I've found it super useful as an n-dimensional extension of pandas! I was just wondering what the current state of this issue is? I'm running into exactly the issue described in https://github.com/pydata/xarray/issues/4743 which seems like a bug; that issue was closed as a dupe of this. Are we just waiting for someone to implement something here, or are there other blockers?","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,307783090 https://github.com/pydata/xarray/issues/2007#issuecomment-747376047,https://api.github.com/repos/pydata/xarray/issues/2007,747376047,MDEyOklzc3VlQ29tbWVudDc0NzM3NjA0Nw==,10194086,2020-12-17T11:14:33Z,2020-12-17T16:02:25Z,MEMBER,"I just need to find the **three warmest consecutive months** from a temperature dataset for my work, so I thought I add a complete example. First, create an example dataset with monthly temperature: ```python import xarray as xr import numpy as np import pandas as pd time = pd.date_range(""2000"", periods=12 * 30, freq=""M"") temp = np.sin((time.month - 5) / 6 * np.pi) + np.random.randn(*time.shape) * 0.3 da = xr.DataArray(temp, dims=[""time""], coords=dict(time=time)) print(da) ``` ```python array([-0.676731, -0.812742, -1.367547, ..., 0.186731, 0.237676, -0.343879]) Coordinates: * time (time) datetime64[ns] 2000-01-31 2000-02-29 ... 2029-12-31 ``` Currently we can achieve this like: ```python n_months = 3 monthly = da.groupby(""time.month"").mean() padded = monthly.pad(month=n_months, mode=""wrap"") rolled = padded.rolling(center=True, month=n_months).mean(skipna=False) sliced = rolled.isel(month=slice(3, -3)) central_month = sliced.idxmax() ``` Implementing `pad_mode` in `rolling` would allow to do: ```python monthly = da.groupby(""time.month"").mean() rolled = monthly.rolling(center=True, month=n_months, pad_mode=""wrap"").mean(skipna=False) central_month = rolled.idxmax() ``` ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,307783090 https://github.com/pydata/xarray/issues/2007#issuecomment-747500929,https://api.github.com/repos/pydata/xarray/issues/2007,747500929,MDEyOklzc3VlQ29tbWVudDc0NzUwMDkyOQ==,2448579,2020-12-17T15:16:06Z,2020-12-17T15:16:06Z,MEMBER,"I think we should do `pad_kwargs` so that `monthly.rolling(center-True, month=n_months, pad_kwargs=dict(mode=""constant"", constant_values=5)}` is possible.","{""total_count"": 1, ""+1"": 1, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,307783090 https://github.com/pydata/xarray/issues/2007#issuecomment-499603340,https://api.github.com/repos/pydata/xarray/issues/2007,499603340,MDEyOklzc3VlQ29tbWVudDQ5OTYwMzM0MA==,1217238,2019-06-06T18:01:54Z,2019-06-06T18:01:54Z,MEMBER,"I think you may need to do cropping afterwards, too, before taking the mean.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,307783090 https://github.com/pydata/xarray/issues/2007#issuecomment-499548285,https://api.github.com/repos/pydata/xarray/issues/2007,499548285,MDEyOklzc3VlQ29tbWVudDQ5OTU0ODI4NQ==,10194086,2019-06-06T15:36:58Z,2019-06-06T15:36:58Z,MEMBER,"I am coming back to @shoyer suggestion in #2011 - your idea would be to do first a `pad` and then a `rolling` operation as e.g.: ``` python import numpy as np import xarray as xr x = np.arange(1, 366) y = np.random.randn(365) ds = xr.DataArray(y, dims=dict(dayofyear=x)) ds.pad(dayofyear=15, mode='wrap').rolling(center=True, dayofyear=31).mean() ``` ","{""total_count"": 1, ""+1"": 1, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,307783090 https://github.com/pydata/xarray/issues/2007#issuecomment-392070454,https://api.github.com/repos/pydata/xarray/issues/2007,392070454,MDEyOklzc3VlQ29tbWVudDM5MjA3MDQ1NA==,17162724,2018-05-25T14:11:20Z,2018-05-25T14:11:20Z,CONTRIBUTOR,"I was going to suggest this feature so glad others are interested. In my use case I would like to smooth a daily climatology. My colleague uses matlab and uses https://www.mathworks.com/matlabcentral/fileexchange/52688-nan-tolerant-fast-smooth Using the `slice` solution as @mathause showed above, it would look something like (using code from http://xarray.pydata.org/en/stable/examples/weather-data.html#toy-weather-data) ``` import numpy as np import pandas as pd import xarray as xr times = pd.date_range('2000-01-01', '2010-12-31', name='time') annual_cycle = np.sin(2 * np.pi * (times.dayofyear.values / 366 - 0.28)) noise = 15 * np.random.rand(annual_cycle.size) data = 10 + (15 * annual_cycle) + noise da = xr.DataArray(data, coords=[times], dims='time') #da.plot() #Check variability at one day #da.groupby('time.dayofyear').std('time')[0] da_clim = da.groupby('time.dayofyear').mean('time') _da_clim = xr.concat([da_clim[-15:], da_clim, da_clim[:15]], 'dayofyear') da_clim_smooth = _da_clim.rolling(dayofyear=31, center=True).mean().dropna('dayofyear') #da_clim_smooth.plot() ``` ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,307783090 https://github.com/pydata/xarray/issues/2007#issuecomment-375850170,https://api.github.com/repos/pydata/xarray/issues/2007,375850170,MDEyOklzc3VlQ29tbWVudDM3NTg1MDE3MA==,5635139,2018-03-24T06:16:29Z,2018-03-24T06:16:29Z,MEMBER,"#2011 looks good - I didn't realize numpy already had `pad` Agree with your other comments. Thanks as ever @fujiisoup ","{""total_count"": 1, ""+1"": 1, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,307783090 https://github.com/pydata/xarray/issues/2007#issuecomment-375828864,https://api.github.com/repos/pydata/xarray/issues/2007,375828864,MDEyOklzc3VlQ29tbWVudDM3NTgyODg2NA==,6815844,2018-03-24T00:05:08Z,2018-03-24T00:05:08Z,MEMBER,"> I don't think the kwarg should be called fill_value - that traditionally has a specific meaning of ""the value to replace NaN with"". Agreed. [`dask.ghost`](http://dask.pydata.org/en/latest/array-ghost.html#boundaries) has `boundaries` keyword, for which we can choose between *periodic*, *reflect*, and any constant. I think this would be a good reference. Maybe we can deprecate `fill_value` keyword and replace it by `boundaries`? (I slightly regret that I choose `fill_value` keyword in `construct`). > How it's implemented - do you have a view here? Only a slight modification of `construct` machinery realizes this (see #2011). I think this option should be available only in `construct` method (not in the traditional rolling constructor) for the sake of simplicity (according to this [comment](https://github.com/pydata/xarray/issues/2010#issuecomment-375750884)).","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,307783090 https://github.com/pydata/xarray/issues/2007#issuecomment-375810316,https://api.github.com/repos/pydata/xarray/issues/2007,375810316,MDEyOklzc3VlQ29tbWVudDM3NTgxMDMxNg==,5635139,2018-03-23T22:03:24Z,2018-03-23T22:03:24Z,MEMBER,"@fujiisoup Yes for sure - I think it would be good. I think there are two salient questions: - Where this lives in the API: Should this be under `construct`? I don't think the kwarg should be called `fill_value` - that traditionally has a specific meaning of ""the value to replace `NaN` with"". I don't understand the `periodic` reference, but likely I'm missing something. Could be `wrap=True`, or `roll=True`? - How it's implemented - do you have a view here? Can you use the `construct` machinery? Or we make a new array and run `rolling` over it?","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,307783090 https://github.com/pydata/xarray/issues/2007#issuecomment-375681041,https://api.github.com/repos/pydata/xarray/issues/2007,375681041,MDEyOklzc3VlQ29tbWVudDM3NTY4MTA0MQ==,6815844,2018-03-23T14:22:57Z,2018-03-23T14:22:57Z,MEMBER,"@maxim-lian , do you agree to add this feature? Although the same behavior can be realized by adding head/tail values to the original array and truncate them after the computation, the `periodic` option would significantly simplify this.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,307783090 https://github.com/pydata/xarray/issues/2007#issuecomment-375484121,https://api.github.com/repos/pydata/xarray/issues/2007,375484121,MDEyOklzc3VlQ29tbWVudDM3NTQ4NDEyMQ==,5635139,2018-03-22T22:56:09Z,2018-03-22T22:56:09Z,MEMBER,"Though I'm not sure you need the `construct` machinery. IIUC you need to copy a window-sized amount of data from the front of the array onto the back. You could do that with construct-like machinery, which would save a copy - though not a large copy","{""total_count"": 1, ""+1"": 1, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,307783090 https://github.com/pydata/xarray/issues/2007#issuecomment-375476906,https://api.github.com/repos/pydata/xarray/issues/2007,375476906,MDEyOklzc3VlQ29tbWVudDM3NTQ3NjkwNg==,6815844,2018-03-22T22:22:26Z,2018-03-22T22:22:26Z,MEMBER,"I think the implementation would be not so difficult by supporting more flexible `fill_value` option in [`xr.DataArrayRolling.construct` method](http://xarray.pydata.org/en/stable/generated/xarray.core.rolling.DataArrayRolling.construct.html#xarray.core.rolling.DataArrayRolling.construct). Maybe `fill_value='periodic'` would be a possible API, ```python da.rolling(dayofyear=31).construct('window', fill_value='periodic').mean('window') ``` @mathause, any interest in contributing?","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,307783090 https://github.com/pydata/xarray/issues/2007#issuecomment-375455202,https://api.github.com/repos/pydata/xarray/issues/2007,375455202,MDEyOklzc3VlQ29tbWVudDM3NTQ1NTIwMg==,10194086,2018-03-22T20:57:59Z,2018-03-22T20:57:59Z,MEMBER,"I think what I want is like the `filter` [function in R](https://stat.ethz.ch/R-manual/R-devel/library/stats/html/filter.html) with `circular=True`. I found two possibilities but they are quite ""hand made"" and certainly not very efficient Solution with slicing: ``` python # take the last and first elements and append/ prepend them first = ds[:15] last = ds[-15:] extended = xr.concat([last, ds, first], 'dayofyear') # do the rolling on the extended ds and get rid of NaNs sol1 = extended.rolling(dayofyear=31, center=True).mean().dropna('dayofyear') ``` Solution with `roll`: ``` python roll1 = ds.roll(dayofyear=150).rolling(dayofyear=31, center=True).mean() roll2 = ds.rolling(dayofyear=31, center=True).mean() sol2 = xr.concat([roll1, roll2], dim='r').mean('r') ``` Call `rolling` on original and `roll`ed dataset, and put them together again.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,307783090 https://github.com/pydata/xarray/issues/2007#issuecomment-375445915,https://api.github.com/repos/pydata/xarray/issues/2007,375445915,MDEyOklzc3VlQ29tbWVudDM3NTQ0NTkxNQ==,10194086,2018-03-22T20:26:24Z,2018-03-22T20:27:59Z,MEMBER,"Probably a mix of both - I want to compute a moving average, but with periodic boundaries. `rolling` sets `window_length - 1` elements to nan. However I want to calculate these like so: running_mean_0 = xr.concat([ds[-15:], ds[:16]]).mean() running_mean_1 = xr.concat([ds[-14:], ds[:17]]).mean() and so on... ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,307783090 https://github.com/pydata/xarray/issues/2007#issuecomment-375441040,https://api.github.com/repos/pydata/xarray/issues/2007,375441040,MDEyOklzc3VlQ29tbWVudDM3NTQ0MTA0MA==,5635139,2018-03-22T20:09:54Z,2018-03-22T20:09:54Z,MEMBER,"> `ds.rolling(center=True, dayofyear=31).mean()` What do you mean by `rolling` here? As a reduce operation over a rolling window, like a moving average (`rolling` in xarray)? Or rolling around the end of a dataarray when shifting (`roll` in xarray)? Or a mix of both? Specifically, what's the `dayofyear=31` doing?","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,307783090 https://github.com/pydata/xarray/issues/2007#issuecomment-375431424,https://api.github.com/repos/pydata/xarray/issues/2007,375431424,MDEyOklzc3VlQ29tbWVudDM3NTQzMTQyNA==,1197350,2018-03-22T19:35:50Z,2018-03-22T19:35:50Z,MEMBER,"Very useful suggestion. > Also I cannot really think of an easy way to append the first elements to the end of the dataset and then calculate rolling. We already support a different type of ""rolling"" with periodicity http://xarray.pydata.org/en/latest/generated/xarray.DataArray.roll.html?highlight=roll and it is straightforward to apply roll operations at the variable level: https://github.com/pydata/xarray/blob/master/xarray/core/variable.py#L1007-L1026 I suspect this would not be too hard to implement. ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,307783090