我正在尝试使用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的瓶颈-如果我可以使互相关工作,那么acf
和acovf
函数的其余部分应该简单地进行矢量化。 / p>