为Python中的时间序列网格计算ACF

时间:2019-01-09 23:51:41

标签: python numpy python-xarray

我正在尝试使用python计算时间序列网格的ACF。 statsmodels.acf仅接受一维时间序列,因此例如使用xr.apply_ufunc并不是可行的解决方案。 (请注意,我在这里使用xarray作为首选包,因为我处理的是大型的多维标签数据集)

我认为从头开始编写ACF并将其矢量化将是最简单的。将statsmodels.acf缩小为我需要去的骨架:

from numpy import correlate as npc
from scipy.signal import correlate as spc

def acf(x, nlags=40):
    """
    ds : xarray DataArray with gridded time series
         e.g., dims ('time', 'lat', 'lon')
    nlags : number of lags to compute ACF out to 
    """
    avf = acovf(x)
    acf = avf[:nlags + 1] / avf[0]
    return acf

def acovf(x):
    xo = x - x.mean('time')
    n = x['time'].size
    lag_len = n - 1
    d = n * np.ones(2 * n - 1)
    acov = npc(xo, xo, 'full')[n - 1:] / d[n - 1:]
    return acov

当前在npc行处中断。 np.correlate以及scipy.signal.correlate的中断大于一维时间序列,或者给出了不希望的答案。

最直接的方法:如何在网格上向量化多个时间序列的离散线性互相关?

使用示例:

x = xr.DataArray(np.random.rand(10,2,3), dims=['time', 'lat', 'lon'])

如果我运行npc(x, x, 'full'),则会收到错误消息:

ValueError: object too deep for desired array

如果运行spc(x, x),我将得到一个(19,3,5)数组,其中不包含准确的输出。我的输出应为(N * 2-1,lat,lon),其中N是时间采样数。

这个问题似乎是矢量化ACF的瓶颈-如果我可以使互相关工作,那么acfacovf函数的其余部分应该简单地进行矢量化。 / p>

0 个答案:

没有答案