У меня есть следующий фрейм данных (данные временного ряда):
value category
a1 c1
a2 c1
a3 c1
a4 c1
a5 c1
a6 c1
a7 c1
a8 c1
a1 c2
a2 c2
a3 c2
a4 c2
a5 c2
a6 c2
a7 c2
a8 c2
Я хочу использовать скользящее окно, то есть с размером окна = 4 и шагом = 2, что означает окно содержит 4 строки, и мы перемещаем окно на 2 строки. ожидаемый результат должен быть таким:
window value category
[a1, a2, a3, a4] c1
[a3, a4, a5, a6] c1
[a5, a6, a7, a8] c1
[a1, a2, a3, a4] c2
[a3, a4, a5, a6] c2
[a5, a6, a7, a8] c2
Я пробовал с оконной функцией. Однако, насколько мне известно, окно будет перебирать все строки внутри моего Dataframe. Пример исходного кода:
# define the window spec with 4 rows following
windowSpec = Window.partitionBy(col("category").orderBy(col("value ")).rowsBetween(0, 3)
# get the window data
window_data = df.withColumn('window_data',collect_list(col("value")).over(windowSpec))
Таким образом, результат будет выглядеть следующим образом:
window_data category
[a1, a2, a3, a4] c1
[a2, a3, a4, a5] c1
[a3, a4, a5, a6] c1
[a4, a5, a6, a7] c1
...
Обновление: на самом деле, мы могли бы объединить все строки в окне для каждой строки в кадре данных , затем отфильтруйте только несколько строк в определенных c позициях. Но это кажется дорогостоящим, поскольку нам нужно сделать две итерации для всех строк в кадре данных, и нам нужно объединить те, которые мы проигнорируем позже. Интуитивно, я думаю, мы могли бы иметь более оптимизированный вариант.
Не могли бы вы, ребята, порекомендовать какие-либо методы, чтобы получить желаемый результат?
Заранее спасибо: -)