многомерная прокатная агрегация xarray - PullRequest
0 голосов
/ 06 ноября 2019

Учитывая многомерный xarray DataArray, я хотел бы выполнить многомерное скользящее агрегирование. Например, если у меня есть DataArray, представляющий собой mxnxk, я хотел бы иметь возможность свернуть данные вдоль оси m и агрегировать измерение n или k.

У меня есть подход, который дает мнеправильный ответ, но, кажется, не в масштабе вообще. Если размеры моего окна малы, это выполнимо, но в случае массива данных 5000 x 2000 x 10 прокатка вдоль измерения длины 5000 с длинным окном взрывает память при моем текущем подходе.

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

drange = pd.date_range(start='2000-01-01', freq='D', periods=5000)
x = ['x%i' % i for i in range(1, 3001)]
y = ['y%i' % i for i in range(1,11)]
raw_dat = np.random.randn(len(drange), len(x), len(y))
da = xr.DataArray(raw_dat, coords={'time': drange, 'x': x, 'y': y}, dims=['time', 'x', 'y'])

new_da = da.rolling(time=20).construct('window_dim')
final_da = new_da.stack(combo=['x', 'window_dim']).std('combo')


Я также попробовал приведенное ниже, он дает тот же результат, но также не хватает памяти при большом окне прокрутки.

new_da = da.rolling(time=20).construct('window_dim')
final_da = new_da.std(['x', 'window_dim'])

Приведенный выше код работает, и на моем компьютере для выполнения стека требуется примерно 35 секунди агрегация, но по мере увеличения размера окна, использование памяти взрывается. Мне интересно, есть ли более умный способ сделать этот тип агрегации.

...