我一直在网上搜索可以创建的方法滚动窗户这样我就可以以通用的方式对时间序列执行称为前向分析的交叉验证技术。
然而,我还没有找到任何在 1) 窗口大小方面具有灵活性的解决方案(几乎所有方法都有这个;例如,pandas
rolling https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rolling.html或者有点不同np.roll https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.roll.html)和2)窗口滚动数量,理解为我们想要滚动窗口的索引数量(即尚未找到任何包含此内容的索引)。
我一直在尝试优化并制作简洁的代码,在@冷速 in 这个答案 https://stackoverflow.com/questions/45645511/rolling-window-in-python(我无法在那里发表评论,因为我没有达到所需的声誉;希望很快就能到达那里!),但我无法合并窗口滚动数量。
我的想法:
我尝试过np.roll
连同我下面的例子,没有成功。
我还尝试修改下面的代码乘以ith
值,但我无法将其放入我想要维护的列表理解中。
3. 下面的示例适用于任何窗口大小,但是,它仅将窗口向前“滚动”一步,我希望它可以推广到任何步骤。
So, 有没有办法让这两个参数在列表理解方法中可用?或者,还有我没有找到的其他资源可以让这件事变得更容易吗?非常感谢所有的帮助。我的示例代码如下:
In [1]: import numpy as np
In [2]: arr = np.random.random((10,3))
In [3]: arr
Out[3]: array([[0.38020065, 0.22656515, 0.25926935],
[0.13446667, 0.04386083, 0.47210474],
[0.4374763 , 0.20024762, 0.50494097],
[0.49770835, 0.16381492, 0.6410294 ],
[0.9711233 , 0.2004874 , 0.71186102],
[0.61729025, 0.72601898, 0.18970222],
[0.99308981, 0.80017134, 0.64955358],
[0.46632326, 0.37341677, 0.49950571],
[0.45753235, 0.55642914, 0.31972887],
[0.4371343 , 0.08905587, 0.74511753]])
In [4]: inSamplePercentage = 0.4
In [5]: outSamplePercentage = 0.3 * inSamplePercentage
In [6]: windowSizeTrain = round(inSamplePercentage * arr.shape[0])
In [7]: windowSizeTest = round(outSamplePercentage * arr.shape[0])
In [8]: windowTrPlusTs = windowSizeTrain + windowSizeTest
In [9]: sliceListX = [arr[i: i + windowTrPlusTs] for i in range(len(arr) - (windowTrPlusTs-1))]
给定窗口长度为 5 且窗口滚动数量为 2,我可以指定如下内容:
Out [15]:
[array([[0.38020065, 0.22656515, 0.25926935],
[0.13446667, 0.04386083, 0.47210474],
[0.4374763 , 0.20024762, 0.50494097],
[0.49770835, 0.16381492, 0.6410294 ],
[0.9711233 , 0.2004874 , 0.71186102]]),
array([[0.4374763 , 0.20024762, 0.50494097],
[0.49770835, 0.16381492, 0.6410294 ],
[0.9711233 , 0.2004874 , 0.71186102],
[0.61729025, 0.72601898, 0.18970222],
[0.99308981, 0.80017134, 0.64955358]]),
array([[0.9711233 , 0.2004874 , 0.71186102],
[0.61729025, 0.72601898, 0.18970222],
[0.99308981, 0.80017134, 0.64955358],
[0.46632326, 0.37341677, 0.49950571],
[0.45753235, 0.55642914, 0.31972887]]),
array([[0.99308981, 0.80017134, 0.64955358],
[0.46632326, 0.37341677, 0.49950571],
[0.45753235, 0.55642914, 0.31972887],
[0.4371343 , 0.08905587, 0.74511753]])]
(这包含最后一个数组,尽管它的长度小于 5)。
OR:
Out [16]:
[array([[0.38020065, 0.22656515, 0.25926935],
[0.13446667, 0.04386083, 0.47210474],
[0.4374763 , 0.20024762, 0.50494097],
[0.49770835, 0.16381492, 0.6410294 ],
[0.9711233 , 0.2004874 , 0.71186102]]),
array([[0.4374763 , 0.20024762, 0.50494097],
[0.49770835, 0.16381492, 0.6410294 ],
[0.9711233 , 0.2004874 , 0.71186102],
[0.61729025, 0.72601898, 0.18970222],
[0.99308981, 0.80017134, 0.64955358]]),
array([[0.9711233 , 0.2004874 , 0.71186102],
[0.61729025, 0.72601898, 0.18970222],
[0.99308981, 0.80017134, 0.64955358],
[0.46632326, 0.37341677, 0.49950571],
[0.45753235, 0.55642914, 0.31972887]])]
(仅长度 == 5 的数组 -> 然而,这可以通过一个简单的掩码从上面的数组导出)。
编辑:忘记提及这也是 https://github.com/pandas-dev/pandas/issues/11704-- 如果 pandas 滚动对象支持,可以做一些事情iter metho.