使用WNTR生成数据完成LSTM预测时间数据数据集的准备工作

我们在预测用水量、节点压力的数据时,不仅仅只针对原始的时间序列数据,还要考虑特定时间点的特性。

根据专业知识,对用水压力进行预测。
1.用户用水的周期性,由于工作生活的高度规律性,大部分用户是白天上班,用水高峰在早上起床的洗漱、下班回家做饭、晚间洗漱等三个较为固定的时间段。呈现出三个波峰,晚间凌晨低谷的用水曲线。
2.并且还随着温度,区域人口的增长等有一种趋势的叠加状态。

于是,我们按照往日数据进行预测的时候,不能仅仅考虑预测时间点当日的用水因素,还应该考虑在较长的时间段内的用水趋势变化。

在以往的博文中,我们已经得到了用水的长期数据,我们现在将用正常的历史数据来预测新的用水时间序列。
考虑多种因素,我们现在实现一个例子。即想要预测t时刻的结点压力,输入的input包括:

1.t时间点之前的7个检测间隔点(我们的检测间隔为15min,即输入是t-15 * 1min,t-15 * 2min,t-15 * 3min,t-15 * 4min,t-15 * 5min,t-15 *6min,t-15 * 7min)

2.t时间之前7天的数据(即t-24h * 1, t-24h * 2 , t-24h * 3 , t-24h * 4 , t-24h * 5 ,t-24h * 6 , t-24h * 7)

LSTM的输入是(seq,batch,vec),在batch_first=TRUE的情况下是(batch,seq,vec)
现在的思路是两个因素的input都作为特征,即(batch,14,1)14个特征,每个特征都是1dim,还有一个想法是(batch,2,7)即模仿word embedding的方法,把输入的7个特征编码成一个(1,7)的矩阵,一共输入两个特征。在输入的构造方面代码如下:

提取第一个因素十分简单,直接在原始时间序列上做滑动窗口就可以,但是第二个因素(相同时刻的不同天数)匹配则较为困难。
在这里插入图片描述
图中是我们所生成的压力数据,我们想要预测时间序列数据的问题。数据集构造思路如下:
利用滑动窗口来进行数据集的处理

首先我们读入数据,打印前4天的压力数据,观察我们的合成数据的随机性和趋势性。

import torch
import torch.nn as nn
from torch.utils.data import Dataset,DataLoader
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os
from sklearn.preprocessing import MinMaxScaler

time_series = pd.read_csv('../wntr-data/pressure data.csv')

node5_15min = time_series.loc[:,'5']
print(len(node5_15min))

plt.figure(figsize=(80,80),dpi=80)
plt.plot(node5_15min[:385])
plt.show()

在这里插入图片描述
总体上来说,用水数据呈现趋势性和随机性的叠加,前期工作基本完成。

紧接着我们把数据先转换成浮点数,然后划分测试集和训练集。因为lstm对长时间的序列预测效果不佳,我们先确定一个小的测试集,即16个测试集。
而且由于时间序列的一维流动性,后发生的事情对于无法预测,所以截取最后的16个数据作为测试集,训练集无法用它来确定参数。

#把数据转换成浮点数
all_data = node5_15min.values.astype(float)

#选择输入的波形
test_data_size = 16
train_data = all_data[:-test_data_size]
test_data = all_data[-test_data_size:]

接着对数据进行归一化,并且转换为tensor:

scaler = MinMaxScaler(feature_range=(0, 1))
train_data_normalized = scaler.fit_transform(train_data .reshape(-1, 1))

train_data = torch.FloatTensor(train_data).view(-1)

接下来就是滑动窗口的构建了,我们一共要构建两个滑动窗口,一个是原始时间序列的7个特征,一个是特定时间点的前7个特征,并且标签也要注意,是滑动原始时间的后一个数据:
首先我们构造的train_seq必须从第二周的第一天开始,因为从第一周开始无法满足我们输入特定时间点t前7天的数据,即index从( 4 *24 *7 = 672)开始滑动。
在这里插入图片描述
观察数据表,确实672是第八天0时0分的index,第二个输入滑动窗口的间隔是24h,即index=96的滑动窗口,第二个输入要根据标签来确定取的值,标签是我们预测的点t,输入t - 96 * 1 , t - 96 *2, t - 96 *3, t - 96 *4, t - 96 *5…

train_window = 7
def create_inout_sequences(input_data, tw):
    inout_seq = []
    L = len(input_data)
    for i in range(672,L-tw):
        #取第一个输入,原始时间序列,长度为7
        train_seq1 = input_data[i:i+tw]
        #取第二个输入,96为间隔的每周时间序列
        train_seq2 = input_data[i+tw-96*7:i+tw:96]
        #都是一维的,直接拼接作为特征
        train_seq = torch.cat([train_seq1,train_seq2])
        train_label = input_data[i+tw:i+tw+1]
        inout_seq.append((train_seq ,train_label))
    return inout_seq
#生成的列表为[(预测原始时间序列和每周特定时间序列,预测点数据)...]一共有len(data)-672-7个元组,放在一个大列表中

此时数据大致处理完成,打印数据参考,满足要求,数据集准备工作完成

train_inout_seq = create_inout_sequences(train_data, train_window)
# print(train_inout_seq[:5])
"C:\Users\wen EX\condaex\anaconda3\python.exe" "C:/Users/wen EX/Desktop/WNTR-LSTM/wntr-code/code4 mult-input.py"
[(tensor([35.8321, 36.8570, 37.5125, 37.3537, 37.8492, 38.3162, 38.3173, 30.3044,
        38.6189, 38.7828, 38.5629, 38.1039, 38.5417, 38.8577]), tensor([38.9340])), (tensor([36.8570, 37.5125, 37.3537, 37.8492, 38.3162, 38.3173, 38.9340, 39.0749,
        38.9334, 39.3633, 39.0442, 38.9170, 38.9609, 38.4541]), tensor([38.6713])), (tensor([37.5125, 37.3537, 37.8492, 38.3162, 38.3173, 38.9340, 38.6713, 38.9070,
        39.1177, 39.3185, 39.1820, 39.3828, 39.1280, 39.1558]), tensor([38.8149])), (tensor([37.3537, 37.8492, 38.3162, 38.3173, 38.9340, 38.6713, 38.8149, 38.9949,
        38.5396, 38.8517, 39.4354, 38.8209, 39.3927, 38.0821]), tensor([39.2132])), (tensor([37.8492, 38.3162, 38.3173, 38.9340, 38.6713, 38.8149, 39.2132, 38.5467,
        39.6541, 38.2299, 38.7341, 39.0546, 39.0883, 38.8185]), tensor([39.0699]))]
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值