Python时间序列:基于滚动窗口提取特征

数据挖掘 Python 时间序列 特征提取 特征工程
2022-03-04 21:20:42

我有一个很长的单变量时间序列,在使用它执行一些机器学习模型之前,我想在滚动窗口的基础上从时间序列中提取尽可能多的特征。

举个简单的例子,对于 size 的窗口10,我想计算数据集中第一个t=0:9点的平均值和标准偏差等统计数据,并让这两个结果占据某个新特征表中的一行,然后在该表将在点上计算平均值和标准偏差t=1:10,依此类推,直到数据结束。

在 Python 中有没有一种有效的方法来做到这一点?

1个回答

是的,在 Python 中有一些简单的方法可以做到这一点。我最喜欢的是将数据放入 Pandas DataFrame 中,它有一个名为的便捷方法rolling,可以在给定的帧大小中循环遍历您的数据,并在该块上计算您喜欢的任何内容。

让我给你看一个例子——假设我们从以下列数据开始:

In [1]: import pandas as pd                                                     
In [2]: import numpy as np
In [3]: df = pd.DataFrame({"A": np.random.randint(0, 100, (20,)),
                           "B": np.random.randn(20)})

查看前 10 行:

In [4]: df.head(10)
Out[4]: 
     A         B
0   63 -0.003947
1   55  0.442597
2    6  0.684125
3   17  0.968987
4   33 -0.018640
5   50 -0.579558
6   71  0.563125
7   31  1.417384
8    8  0.607813
9   36  0.186146

我们可以计算每列的滚动平均值并将其保存回数据帧,如下所示:

In [6]: df[["rolling_a", "rolling_b"]] = df.rolling(5).mean()
In [7]: df.head(10)
In [9]: df
Out[9]: 
     A         B  rolling_a  rolling_b
0   63 -0.003947        NaN        NaN
1   55  0.442597        NaN        NaN
2    6  0.684125        NaN        NaN
3   17  0.968987        NaN        NaN
4   33 -0.018640       34.8   0.414624
5   50 -0.579558       32.2   0.299502
6   71  0.563125       35.4   0.323608
7   31  1.417384       40.4   0.470260
8    8  0.607813       38.6   0.398025
9   36  0.186146       39.2   0.438982

您可能会注意到前 4 行包含NaN值(不是数字)。这是因为该rolling()方法将使该mean()方法在小于 5 的窗口大小(在我们的示例中)工作。rolling()您可以尝试使用该方法的许多选项。

您可以对大型数据框的单列执行相同的操作,如下所示:

>>> df["rolling_some_column_name"] = df.some_column_name.rolling(5).mean()

您还可以将几乎任何功能应用于滚动框架 - 不仅仅是mean().