【RNN从入门到实战】GRU入门到实战

df = pd.read_csv(“sh.csv”, index_col=0, encoding=‘utf-8’)

df.fillna(0, inplace=True)

df.replace(to_replace=“None”, value=0)

del df[“股票代码”]

del df[“名称”]

df.index = list(map(lambda x: datetime.datetime.strptime(x, “%Y-%m-%d”).date(), df.index))

df_column = df[column].copy()

df_column_train, df_column_test = df_column[:train_end], df_column[train_end - n:]

df_generate_from_df_column_train = generate_df_affect_by_n_days(df_column_train, n, index=index)

print(df_generate_from_df_column_train)

if all_too:

return df_generate_from_df_column_train, df_column, df.index.tolist()

return df_generate_from_df_column_train

构建模型


模型见RNN类,采用GRU+全连接。隐藏层设置64,GRU的输出是64维的,所以设置全连接也是64。

TrainSet是数据读取类,将输出数据的最后一列做标签,前面的列做输入,类的写法是Pytorch的固定模式。

class RNN(nn.Module):

def init(self, input_size):

super(RNN, self).init()

self.rnn = nn.GRU(

input_size=input_size,

hidden_size=64,

num_layers=1,

batch_first=True,

)

self.out = nn.Sequential(

nn.Linear(64, 1),

)

self.hidden = None

def forward(self, x):

r_out, self.hidden = self.rnn(x) # None 表示 hidden state 会用全0的 state

out = self.out(r_out)

return out

class TrainSet(Dataset):

def init(self, data):

定义好 image 的路径

self.data, self.label = data[:, :-1].float(), data[:, -1].float()

def getitem(self, index):

return self.data[index], self.label[index]

def len(self):

return len(self.data)

训练与测试


n为模型中的n

LR是模型的学习率

EPOCH是多次循环

train_end这个在之前的数据集中有提到。(注意是负数)

n = 30

LR = 0.0001

EPOCH = 100

train_end = -500

loss选用mse

预测的数据选择“收盘价”

n = 10

LR = 0.0001

EPOCH = 100

train_end = -500

数据集建立

df, df_all, df_index = readData(‘收盘价’, n=n, train_end=train_end)

df_all = np.array(df_all.tolist())

plt.plot(df_index, df_all, label=‘real-data’)

df_numpy = np.array(df)

df_numpy_mean = np.mean(df_numpy)

df_numpy_std = np.std(df_numpy)

df_numpy = (df_numpy - df_numpy_mean) / df_numpy_std

df_tensor = torch.Tensor(df_numpy)

trainset = TrainSet(df_tensor)

trainloader = DataLoader(trainset, batch_size=16, shuffle=True)

rnn = RNN(n)

optimizer = torch.optim.Adam(rnn.parameters(), lr=LR) # optimize all cnn parameters

loss_func = nn.MSELoss()

for step in range(EPOCH):

for tx, ty in trainloader:

output = rnn(torch.unsqueeze(tx, dim=0))

loss = loss_func(torch.squeeze(output), ty)

optimizer.zero_grad() # clear gradients for this training step

loss.backward() # back propagation, compute gradients

optimizer.step()

print(step, loss)

if step % 10:

torch.save(rnn, ‘rnn.pkl’)

torch.save(rnn, ‘rnn.pkl’)

generate_data_train = []

generate_data_test = []

test_index = len(df_all) + train_end

df_all_normal = (df_all - df_numpy_mean) / df_numpy_std

df_all_normal_tensor = torch.Tensor(df_all_normal)

for i in range(n, len(df_all)):

x = df_all_normal_tensor[i - n:i]

x = torch.unsqueeze(torch.unsqueeze(x, dim=0), dim=0)

y = rnn(x)

if i < test_index:

generate_data_train.append(torch.squeeze(y).detach().numpy() * df_numpy_std + df_numpy_mean)

else:

generate_data_test.append(torch.squeeze(y).detach().numpy() * df_numpy_std + df_numpy_mean)

plt.plot(df_index[n:train_end], generate_data_train, label=‘generate_train’)

plt.plot(df_index[train_end:], generate_data_test, label=‘generate_test’)

plt.legend()

plt.show()

plt.cla()

plt.plot(df_index[train_end:-400], df_all[train_end:-400], label=‘real-data’)

plt.plot(df_index[train_end:-400], generate_data_test[:-400], label=‘generate_test’)

plt.legend()

plt.show()

在这里插入图片描述

在这里插入图片描述

总结


本实例数据集使用上证的收盘价,构建时序数据集,使用GRU对数据预测,从结果上来看,走势有一定的滞后性,由于只是用了价格预测价格,还是太简单了,可以考虑加入更多的特征去优化这一算法。

完整代码


import pandas as pd

import matplotlib.pyplot as plt

import datetime

import torch

import torch.nn as nn

import numpy as np

from torch.utils.data import Dataset, DataLoader

import os

os.environ[‘KMP_DUPLICATE_LIB_OK’] = ‘TRUE’

def generate_df_affect_by_n_days(series, n, index=False):

if len(series) <= n:

raise Exception(“The Length of series is %d, while affect by (n=%d).” % (len(series), n))

df = pd.DataFrame()

for i in range(n):

df[‘c%d’ % i] = series.tolist()[i:-(n - i)]

df[‘y’] = series.tolist()[n:]

if index:

df.index = series.index[n:]

return df

def readData(column=‘收盘价’, n=30, all_too=True, index=False, train_end=-300):

df = pd.read_csv(“sh.csv”, index_col=0, encoding=‘utf-8’)

df.fillna(0, inplace=True)

df.replace(to_replace=“None”, value=0)

del df[“股票代码”]

del df[“名称”]

df.index = list(map(lambda x: datetime.datetime.strptime(x, “%Y-%m-%d”).date(), df.index))

df_column = df[column].copy()

df_column_train, df_column_test = df_column[:train_end], df_column[train_end - n:]

df_generate_from_df_column_train = generate_df_affect_by_n_days(df_column_train, n, index=index)

print(df_generate_from_df_column_train)

if all_too:

return df_generate_from_df_column_train, df_column, df.index.tolist()

return df_generate_from_df_column_train

class RNN(nn.Module):

def init(self, input_size):

super(RNN, self).init()

self.rnn = nn.GRU(

input_size=input_size,

hidden_size=64,

num_layers=1,

batch_first=True,

)

self.out = nn.Sequential(

nn.Linear(64, 1),

)

self.hidden = None

def forward(self, x):

r_out, self.hidden = self.rnn(x) # None 表示 hidden state 会用全0的 state

out = self.out(r_out)

return out

class TrainSet(Dataset):

def init(self, data):

定义好 image 的路径

self.data, self.label = data[:, :-1].float(), data[:, -1].float()

def getitem(self, index):

return self.data[index], self.label[index]

def len(self):

return len(self.data)

n = 10

LR = 0.0001

EPOCH = 100

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
img

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
[外链图片转存中…(img-MQA5xMZh-1711971277864)]

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值