数据分析与预测代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import torch


plt.rcParams['font.sans-serif'] = ['SimHei']    #定义使其正常显示中文字体黑体
plt.rcParams['axes.unicode_minus'] = False      #用来正常显示表示负号
# 导入数据
filename = 'RMB_EU.xltx'
df = pd.read_excel(filename, encoding='utf-8')
### 提取测试数据
data = df.loc[:,['时间','高']][:] # 提取时间与最大值两列
data
# # 最大最小归一化方法
data['高'] = (data['高']-data['高'].min())/(data['高'].max()-data['高'].min())
def create_dataset(dataset, len_x=7, len_y=7):
    data_X, data_Y, data_Z = [], [], []
    for i in range(len(dataset) - (len_x + len_y) + 1):
        a = dataset[i:(i + len_x)]
        data_X.append(a)
        b = dataset[(i + len_x):(i+len_x+len_y)]
        data_Y.append(b)
    for i in range(len(dataset)-(len_x+len_y)+1, len(dataset)-len_x+1):
        a = dataset[i:(i + len_x)]
        data_Z.append(a)
    return np.array(data_X), np.array(data_Y), np.array(data_Z)
# 构建数据集
X, Y, Z = create_dataset(data['高'], 30, 30)
train_size = int(len(X) * 0.7)
test_size = len(X) - train_size

train_X = X[:train_size]
train_Y = Y[:train_size]
test_X = X[train_size:]
test_Y = Y[train_size:]
train_X.shape,train_Y.shape,test_X.shape,test_Y.shape, Z.shape
# 设置数据形状
train_X = train_X.reshape(-1, 1, 30)
train_Y = train_Y.reshape(-1, 1, 30)
test_X = test_X.reshape(-1, 1, 30)
# test_Y = test_Y.reshape(-1, 1, 7)

pred_Z = Z.reshape(-1, 1, 30)

# 转换为 Tensor 类型
train_X = torch.from_numpy(train_X)
train_Y = torch.from_numpy(train_Y)
test_X = torch.from_numpy(test_X)
# test_Y = torch.from_numpy(test_Y)

pred_Z = torch.from_numpy(pred_Z)

# 使用 cuda 
train_X = train_X.cuda()
train_Y = train_Y.cuda()
test_X = test_X.cuda()
# test_Y = test_Y.cuda()

pred_Z = pred_Z.cuda()
from torch import nn
from torch.autograd import Variable
rnn = nn.LSTM(30,30,2).cuda()
rnn = rnn.double() # 数据类型问题
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(rnn.parameters(), lr=1e-2)
# 开始训练
for e in range(50):
    var_X = Variable(train_X)
    var_Y = Variable(train_Y)
    # 前向传播
    out,(h, c) = rnn(var_X)
    loss = criterion(out, var_Y)
    # 反向传播
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    
    print('Epoch: {}, Loss: {:.5f}'.format(e + 1, loss.data[0]))
model = rnn.eval() # 转换成测试模式
var_data = Variable(test_X)
pred_test,(th, tc) = model(var_data) # 测试集的预测结果
pred_test = pred_test.reshape(-1, 30)
pred_test = pred_test.cpu()
pred_test = pred_test.detach().numpy()
pred_test
# 画出实际结果和预测的结果
plt.figure(figsize=(12,8))
plt.plot(data['时间'][train_size:-59],pred_test[:,6], 'r', label='train')
# plt.plot(data['时间'][train_size:-29],pred_t, 'r', label='prediction')
plt.plot(data['时间'][train_size:-59],test_Y[:,6], 'b', label='real')
plt.plot(data['时间'][-30:], pred_1, 'g', label='prediction')
plt.legend(loc='best')
# 预测结果
pred,(_,_) = model(pred_Z)
pred = pred.cpu()
pred = pred.detach().numpy()
pred = pred.reshape(-1, 30)
pred_1 = np.mean(pred, axis=1)
pred_1.shape
plt.plot(data['时间'][-30:], pred_1, '-g', label='new')

  

猜你喜欢

转载自www.cnblogs.com/kriswang/p/12121753.html