Я искал в интернете методы, которые могли бы создать скользящие окна , чтобы я мог обобщенным образом выполнить метод перекрестной проверки, известный как Walk Forward Analysis для временных рядов.
Однако я не нашел ни одного решения, которое бы включало гибкость с точки зрения 1) размера окна (это есть почти во всех методах, например, pandas
, скользящего или немногоразличное np.roll ) и 2) количество прокручиваемого окна, понимаемое как количество индексов, которые мы хотим перевернуть окно (т.е. не нашли ни одного, которое включает это).
У меня естьпытался оптимизировать и сделать краткий код, с помощью @ coldspeed в этого ответа (я не могу комментировать там, потому что не достиг нужной репутации; надеюсь, чтодоберитесь скоро!), но я не был в состоянии включить количество проката окна.
Мои мысли:
Я пробовал с np.roll
вместе с моим примером ниже, но безуспешно.
Я также попытался изменить приведенный ниже код, умножив значение ith
, но не смог уместить его в пределах понимания списка, которое я хотел бы сохранить.
3.Приведенный ниже пример отлично подходит для любого размера окна, НО, он только «катит» окно на один шаг вперед, и я хотел бы, чтобы его можно было обобщить на любой шаг.
Итак, ¿Есть ли способ, чтобы эти два параметра были доступны в рамках подхода к пониманию списка?или, ¿есть ли другой ресурс, который я не нашел, который облегчает это? Вся помощь очень ценится.Мой пример кода выглядит следующим образом:
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).
ИЛИ:
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 -> Однако это можно получить из приведенного вышес простой маской).
РЕДАКТИРОВАТЬ: Забыл упомянуть это также - Что-то может быть сделано, если вращающиеся объекты панд поддерживают iter мето.