用Python计算时间序列网格的ACF

2024-04-24 13:48:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用python计算时间序列网格的ACF。statsmodels.acf只接受1D时间序列,所以举例来说使用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与大于1D时间序列的任何事物断绝关系,或者给出不想要的答案。你知道吗

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

使用以下示例:

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函数应该很容易进行矢量化。你知道吗


Tags: timenp时间序列矢量化lonlatxo