我有一个很长的单变量时间序列,在使用它执行一些机器学习模型之前,我想在滚动窗口的基础上从时间序列中提取尽可能多的特征。
举个简单的例子,对于 size 的窗口10,我想计算数据集中第一个t=0:9点的平均值和标准偏差等统计数据,并让这两个结果占据某个新特征表中的一行,然后在该表将在点上计算平均值和标准偏差t=1:10,依此类推,直到数据结束。
在 Python 中有没有一种有效的方法来做到这一点?
我有一个很长的单变量时间序列,在使用它执行一些机器学习模型之前,我想在滚动窗口的基础上从时间序列中提取尽可能多的特征。
举个简单的例子,对于 size 的窗口10,我想计算数据集中第一个t=0:9点的平均值和标准偏差等统计数据,并让这两个结果占据某个新特征表中的一行,然后在该表将在点上计算平均值和标准偏差t=1:10,依此类推,直到数据结束。
在 Python 中有没有一种有效的方法来做到这一点?
是的,在 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().