利用滑动窗口法来制作时序数据集

撰写背景

  面向数据分析的小白,水平有限,错误难免,欢迎指正。

什么是数据滑窗

  进行机器学习时,一般都要涉及到划分训练集和测试集的步骤。特别地,在做数据预测时,一般把预测的依据(也就是历史数据)称作X,把需要预测的数据称为y。即首先把原始数据划分为train_X, train_y这两个训练数据集和test_X, test_y这两个测试数据集。

  对于时间序列数据的预测,往往是建立由好几个历史数据预测下一时刻的未来数据,这时候为了充分利用全部数据,应该对原始数据集进行滑窗操作,如下图所示。

  这里展示的是多个特征的时间序列,其中每一行数据均属于同一时刻。假设,我们要以H( humidity)、PT(pressure)、PE(power)三个特征为预测依据,取当前和上三个时刻共四个时刻的已知数据对下一时刻的PE(功率)进行预测,那么对于X数据集的滑窗就应该如上图所示,而对y数据集的滑窗应该如下图所示。

  下面给出滑窗实例。

代码实现

  滑窗函数

def sliding_window(DataSet, X_width, y_width, gap = 1, multi_vector = None, X_data = True):
    '''
    DataSet has to be as a DataFrame
    '''
    if X_data:
        if multi_vector:
            a,b = DataSet.shape
        else:
            a = DataSet.shape[0]
            b = 1
        c = (a-X_width-y_width-a%gap)/gap
        X = np.reshape(DataSet.iloc[0:X_width,:].values,(1,X_width,b))
        for i in range(len(DataSet) - X_width - y_width):
            i += 1
            if i > c:
                break
            j = i * gap
            tmp = DataSet.iloc[j:j + X_width,:].values
            tmp = np.reshape(tmp,(1,X_width,b))
            X = np.concatenate([X,tmp],0)
        return X
    else:
        if multi_vector:
            print('y_data-error:expect 1D ,given %dD'%DataSet.shape[1])
            return;
        else:
            a = DataSet.shape[0]
        c = (a-X_width-y_width-a%gap)/gap
        y = np.reshape(DataSet.iloc[X_width:X_width + y_width,0].values,(1,y_width))
        for i in range(len(DataSet) - X_width - y_width):
            i += 1
            if i > c:
                break
            j = i * gap + X_width
            tmp = DataSet.iloc[j:j + y_width,:].values
            tmp = np.reshape(tmp,(1,y_width))
            y = np.concatenate([y,tmp])
        return y

单特征时间序列

  单特征时间序列是指仅有一个特征的一维时间序列,如股票收盘价、风电场风速数据、日营业额等。对单特征时间序列滑窗操作如下:

#DataSet训练数据集
#X_width使用的历史数据长度
#y_width要预测的数据长度
#X_data是否是X数据集
train_X = sliding_window(DataSet, X_width, y_width)
train_y = sliding_window(DataSet, X_width, y_width, X_data = None)

  假设训练数据集是一个100*1的序列,使用24个数据预测未来的1个数据,那么滑窗操作就将原数据做了这样的变换:

多特征时间序列

  多特征时间序列指时间序列的特征不止一个,如上文所举的H、PT、PE三特征序列。这种数据一般使用在待预测的数据跟多个特征相关性较高的场合中,如气象数据嵌入的风速预测、股市数据嵌入的收盘价格预测等。进行多特征时间序列滑窗操作如下:

#DataSet训练数据集
#X_width使用的历史数据长度
#y_width要预测的数据长度
#multi_vector是否为多特征
#X_data是否是X数据集
train_X = sliding_window(DataSet, X_width, y_width, multi_vector = True)
test_y = sliding_window(DataSet, X_width, y_width, multi_vector = True, X_data = None)

  假设训练数据集是一个100*3的序列,使用24个数据预测未来的1个数据,那么滑窗操作就将原数据做了这样的变换:

注意事项

  DataSet必须是DataFrame格式。
  y数据集只能是一维。

总结

到此这篇关于时间序列预测中的数据滑窗操作(python实现)的文章就介绍完毕。

转载自:时间序列预测中的数据滑窗操作实例(python实现)

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,可以参考以下代码实现: ```python import torch from torch.utils.data import Dataset class TimeSeriesDataset(Dataset): def __init__(self, data, window_size=30): self.data = data self.window_size = window_size def __len__(self): return len(self.data) - self.window_size def __getitem__(self, idx): window = torch.tensor(self.data[idx:idx+self.window_size], dtype=torch.float) target = torch.tensor(self.data[idx+self.window_size], dtype=torch.float) return window, target ``` 这里定义了一个`TimeSeriesDataset`类,其中`data`为原始时序数据,`window_size`为滑动窗口的大小。在`__init__`函数中,我们将`data`和`window_size`保存为该类的属性。在`__len__`函数中,返回了数据集的长度,即滑动窗口划分后的样本数量。在`__getitem__`函数中,根据传入的索引`idx`,从原始数据集中取出大小为`window_size`的窗口数据,并将窗口数据作为输入,将窗口后一个数据作为输出(即要预测的目标值)。最后将窗口和目标值转换为`torch`张量并返回。 接下来可以通过以下代码来创建数据集并进行打印测试: ```python data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] dataset = TimeSeriesDataset(data, window_size=3) for i in range(len(dataset)): window, target = dataset[i] print(window, target) ``` 输出结果为: ``` tensor([1., 2., 3.]) tensor(4.) tensor([2., 3., 4.]) tensor(5.) tensor([3., 4., 5.]) tensor(6.) tensor([4., 5., 6.]) tensor(7.) tensor([5., 6., 7.]) tensor(8.) tensor([6., 7., 8.]) tensor(9.) tensor([7., 8., 9.]) tensor(10.) ``` 可以看到,数据集已经成功地被划分成了多个滑动窗口,并且每个滑动窗口的输入和输出都被正确地返回了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值