【问题标题】:What's the fastest way to produce rolling window embeddings in time series data?在时间序列数据中生成滚动窗口嵌入的最快方法是什么?
【发布时间】:2021-08-11 08:20:24
【问题描述】:

我有兴趣将典型的时间序列数据集(一维)转换为由原始数据集的所有可能顺序组合组成的矩阵。我的步幅始终为 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,但无法得出演示结果。

【问题讨论】:

    标签: pandas datetime time-series


    【解决方案1】:

    values 列分组到date 上,然后在列表理解中遍历每个组并应用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]])
    

    【讨论】:

    • 感谢您的快速响应,如何同时测量每个循环的时间?
    • @civy 你可以对代码块运行timeit 分析
    • 奇怪,我收到 ImportError: cannot import name 'sliding_window_view' from 'numpy.lib.stride_tricks'
    • @civy sliding_window_view 在 numpy 版本 1.20 中添加。如果您的系统上安装了 numpy 版本 1.20,我提供了一个替代解决方案
    猜你喜欢
    • 2019-05-31
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    相关资源
    最近更新 更多