我试图用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进行矢量化的瓶颈——如果我能使互相关工作,其余的acf
和acovf
函数应该很容易进行矢量化。你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐