Python中的时间序列延迟嵌入

3
我有一个NumPy数组作为时间序列数据。我想生成类似于以下的时间延迟嵌入数据:
时间序列如下:
    [[   1.           37.17]
     [   2.           36.99]
     [   3.           36.84]
     [   4.           37.57]
     [   5.           37.49]
     [   6.           37.45]
     [   7.           37.82]
     [   8.           37.95]
     [   9.           37.36]
     [   10.          37.84]
     [   11.           37.85]
     [   12.           37.12]]

假设我的窗口大小(w)= 4,间隔(g)= 2。我们会选择每3个点,直到我们得到的点 = 窗口大小,以形成一个“w”维点。对于下一个“w”维点,我们将系列向右移动1位,并为移动后的系列重复相同的过程。这将为我们提供几个“w”维点,最终将存储在2D numpy数组中。当我们无法形成“w”维点时停止,即当我们到达系列的末尾时。
然后,该系列的时间延迟嵌入应该是:
    [[ 37.17  37.57  37.82 37.84]
     [ 37.99  36.49  36.95 37.85]
     [ 37.84  37.45  36.36 37.12]]

我们将在这个特定的点停止,因为对于第四维中的下一个点,我们将用完第四个点。我有大约1600个点的长时间序列,并且我希望参数w和g是可变的。该函数将取'w'和'g'以及时间序列作为给定,并输出时间延迟嵌入。
1个回答

4

该想法是生成重新索引矩阵。

A = np.array([ 37.17,  36.99,  36.84,  37.57,  37.49,  37.45, 
               37.82,  37.95,  37.36,  37.84,  37.85,  37.12])
w = 4
g = 2

使用wg进行时间延迟嵌入

A[(np.arange(w)*(g+1))+ np.arange(np.max(a.shape[0] - (w-1)*(g+1), 0)).reshape(-1,1)]

输出:

array([[ 37.17,  37.57,  37.82,  37.84],
       [ 36.99,  37.49,  37.95,  37.85],
       [ 36.84,  37.45,  37.36,  37.12]])

如果A是一个矩阵[index, value],那么将值列索引A[n...) ,1]相加。 更新1
# incorrect step count calculation was replaced by a.shape[0]-(w-1)*(g+1)

更新2

# added max to avoid errors on impossible values of g and w

请查看有关所使用函数的文档:np.arangenp.reshape广播规则索引


好的,这是不可能的值,第一行最后一个项目将具有索引为897。我可以通过检查%)来解决它。 - ilia timofeev
@avani-sharma 我添加了 max 来避免在 g 和 w 不可能的值上出现错误。 - ilia timofeev
是的,完全正确!!我已经检查过了 :) 这是不可能的。那么我应该减小我的窗口大小。 - Avani Sharma
1
索引从零开始。 因此,第一步中 w 大小的窗口将是 [0,g+1,2*(g+1),..,(w-1)*(g+1)],移动后它变成矩阵 [[0,..,(w-1)*(g+1)], [1,..,1+(w-1)*(g+1)], ..[n,..,n+(w-1)*(g+1)]],其中 n 是行数减去最大窗口移位 rows - (w-1)*(g+1)。第一行是 (g+1)*[0,1,..w-1],我们通过添加向量(列)[[0,1,..,n]] 将其填充到矩阵中。 通过向行添加列,我们调用了 numpy 广播机制。 它“生成”重复的列和行两个矩阵,然后将它们相加。 - ilia timofeev
谢谢 :)!! 解释得很好。我使用了你的解决方案 :)!! - Avani Sharma
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接