首页 > 解决方案 > 在时间序列数据中生成滚动窗口嵌入的最快方法是什么?

问题描述

我有兴趣将典型的时间序列数据集(一维)转换为一个矩阵,该矩阵由原始数据集的每个可能的顺序组合组成。我的步幅始终为 1(将来可能会更改),窗口大小应根据偏好更改,鼓励重叠,我的重点是日内数据,这意味着组合只能来自同一天,一次一天。

这是一个示例数据集

import pandas as pd
date_1 = pd.date_range('2015-02-24', periods=5, freq='1T')
date_2 = pd.date_range('2015-02-25', periods=5, freq='1T')
date = date_1.union(date_2)
values = range(len(date))

df = pd.DataFrame({'date': date, 'values': values})

给定窗口大小为 3,您是否知道任何快速、最好是 Pythonic 的方式来结束以下输出

0 1 2
1 2 3
2 3 4
5 6 7
6 7 8
7 8 9

我搞砸了,group_by但无法得出演示的结果。

标签: pandasdatetimetime-series

解决方案


将列分组然后valuesdate列表理解中迭代每个组并应用sliding_window_view转换,然后垂直堆叠与每个组对应的所有滑动视图

对于 numpy 版本 >=1.20

from numpy.lib.stride_tricks import sliding_window_view

grp = df['values'].groupby(df['date'].dt.floor('D'))
np.vstack([sliding_window_view(v, 3) for _, v in grp])

对于 numpy 版本 <1.20

def sliding_view(a, w):
    s = a.strides[0]
    shape = a.shape[0] - w + 1, w
    return np.lib.stride_tricks.as_strided(a, shape, (s, s))


grp = df['values'].groupby(df['date'].dt.floor('D'))
np.vstack([sliding_view(v.values, 3) for _, v in grp])

array([[0, 1, 2],
       [1, 2, 3],
       [2, 3, 4],
       [5, 6, 7],
       [6, 7, 8],
       [7, 8, 9]])

推荐阅读