写一个python Flask销售预测系统,系统有一个suanfa.py文件,该文件的作用:先读取shuju.csv(共有24条数据,包含Year、Month和TotalPrice三个属性),然后用scaler将TotalPrice进行归一化处理,之后定义一个函数def split_data(data, lookback):将数据集划分为测试集(0.2)和训练集(0.8),data_raw = data.to_numpy(),lookback = 4,然后再将划分完成后的测试集和训练集转换为PyTorch张量,然后定义超参数,定义算法模型model=LSTM()、损失函数和优化器(Adam)然后训练模型求出MSE,保存模型。有一个predict.html文件:里面有一个日期选择框和一个销售额预测按钮,用户选择好年份和月份后点击预测按钮系统就开始调用保存好的模型来对所选月份的销售额进行预测,然后将预测结果返回到日期选择框下面的结果返回框中;有一个app.py文件:定义路径。用flask和bootstrap、LayUI写出完整详细代码

时间: 2023-06-27 18:06:57 浏览: 54
对于这个任务,我们需要完成以下几个步骤: 1. 编写算法脚本 suanfa.py,用于数据处理、模型训练和预测。 2. 编写 Flask 应用 app.py,用于处理用户请求并返回结果。 3. 编写 HTML 页面 predict.html,用于获取用户输入并向后端发送请求。 下面是详细的代码: suanfa.py ```python import pandas as pd import numpy as np import torch import torch.nn as nn from sklearn.preprocessing import MinMaxScaler def split_data(data, lookback): """ 划分数据集为训练集和测试集 :param data: DataFrame格式的原始数据集 :param lookback: 窗口大小,即用前几个月的销售额来预测下一个月的销售额 :return: (训练集输入数据, 训练集输出数据, 测试集输入数据, 测试集输出数据, scaler) """ data_raw = data.to_numpy() scaler = MinMaxScaler(feature_range=(-1, 1)) data_scaled = scaler.fit_transform(data_raw) result = [] for index in range(len(data_scaled) - lookback): result.append(data_scaled[index: index + lookback]) result = np.array(result) row = round(0.8 * result.shape[0]) train = result[:int(row), :] np.random.shuffle(train) x_train = train[:, :-1] y_train = train[:, -1][:, -1] x_test = result[int(row):, :-1] y_test = result[int(row):, -1][:, -1] x_train = torch.from_numpy(x_train).type(torch.Tensor) x_test = torch.from_numpy(x_test).type(torch.Tensor) y_train = torch.from_numpy(y_train).type(torch.Tensor) y_test = torch.from_numpy(y_test).type(torch.Tensor) return x_train, y_train, x_test, y_test, scaler class LSTM(nn.Module): def __init__(self, input_size=1, hidden_layer_size=100, output_size=1): super().__init__() self.hidden_layer_size = hidden_layer_size self.lstm = nn.LSTM(input_size, hidden_layer_size) self.linear = nn.Linear(hidden_layer_size, output_size) self.hidden_cell = (torch.zeros(1, 1, self.hidden_layer_size), torch.zeros(1, 1, self.hidden_layer_size)) def forward(self, input_seq): lstm_out, self.hidden_cell = self.lstm(input_seq.view(len(input_seq), 1, -1), self.hidden_cell) predictions = self.linear(lstm_out.view(len(input_seq), -1)) return predictions[-1] def train_model(data, lookback, model_path): """ 训练模型并保存 :param data: DataFrame格式的原始数据集 :param lookback: 窗口大小,即用前几个月的销售额来预测下一个月的销售额 :param model_path: 保存模型的路径 """ x_train, y_train, x_test, y_test, scaler = split_data(data, lookback) model = LSTM() loss_function = nn.MSELoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) epochs = 150 for i in range(epochs): for j in range(x_train.size()[0]): optimizer.zero_grad() model.hidden_cell = (torch.zeros(1, 1, model.hidden_layer_size), torch.zeros(1, 1, model.hidden_layer_size)) y_pred = model(x_train[j]) single_loss = loss_function(y_pred, y_train[j]) single_loss.backward() optimizer.step() if i % 25 == 1: print(f'epoch: {i:3} loss: {single_loss.item():10.8f}') torch.save(model.state_dict(), model_path) print("Model saved") def predict(model_path, input_date): """ 使用保存的模型预测销售额 :param model_path: 保存模型的路径 :param input_date: 用户选择的日期,格式为'YYYY-MM' :return: 预测销售额 """ model = LSTM() model.load_state_dict(torch.load(model_path)) model.eval() data = pd.read_csv('shuju.csv') data = data.set_index('Year-Month') # 将输入的日期转换为对应的行数 row_num = data.index.get_loc(input_date) x = data.iloc[row_num - 4:row_num + 1]['TotalPrice'].values x = scaler.transform(x.reshape(-1, 1)) x = torch.from_numpy(x).type(torch.Tensor) with torch.no_grad(): model.hidden = (torch.zeros(1, 1, model.hidden_layer_size), torch.zeros(1, 1, model.hidden_layer_size)) pred = model(x) pred = scaler.inverse_transform(pred.reshape(-1, 1)) return round(pred[0][0]) ``` app.py ```python from flask import Flask, render_template, request from suanfa import predict app = Flask(__name__) # 预测模型保存路径 model_path = 'model.pth' @app.route('/') def index(): return render_template('predict.html') @app.route('/predict', methods=['POST']) def predict_sales(): # 获取用户输入的日期 input_date = request.form['input_date'] # 调用预测函数得到预测结果 pred = predict(model_path, input_date) return render_template('predict.html', prediction=pred) ``` predict.html ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>销售额预测系统</title> <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"> <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap-theme.min.css"> <link rel="stylesheet" href="https://cdn.bootcss.com/layer/2.3/skin/default/layer.css"> <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script> <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> <script src="https://cdn.bootcss.com/layer/2.3/layer.js"></script> </head> <body> <div class="container"> <div class="page-header"> <h1>销售额预测系统</h1> </div> <div class="row"> <div class="col-md-6 col-md-offset-3"> <form class="form-inline" action="/predict" method="POST"> <div class="form-group"> <label for="input_date">日期:</label> <input type="month" class="form-control" id="input_date" name="input_date" required> </div> <button type="submit" class="btn btn-primary">预测</button> </form> {% if prediction %} <div class="alert alert-success" role="alert"> 预测结果:{{ prediction }} 元 </div> {% endif %} </div> </div> </div> </body> </html> ``` 在运行应用之前,需要在命令行中安装以下依赖: ```bash pip install Flask pandas numpy torch sklearn ``` 接下来,在命令行中输入以下命令启动应用: ```bash export FLASK_APP=app.py flask run ``` 然后在浏览器中访问 http://127.0.0.1:5000/ 即可使用销售额预测系统。

相关推荐

最新推荐

recommend-type

Python的Flask框架中@app.route的用法教程

主要介绍了Python的Flask框架中@app.route的用法教程,包括相关的正则表达式讲解,是Flask学习过程当中的基础知识,需要的朋友可以参考下
recommend-type

Python写的一个定时重跑获取数据库数据

本文给大家分享基于python写的一个定时重跑获取数据库数据的方法,非常不错,具有参考借鉴价值,需要的朋友参考下
recommend-type

【实践】Windows IIS部署python Flask网站.doc

Windows IIS部署python Flask网站,对安装过程中遇到的一些问题进行总结。
recommend-type

Python flask框架如何显示图像到web页面

主要介绍了Python flask框架如何显示图像到web页面,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
recommend-type

Pythonweb框架Flask中文手册2020.9最新版.PDF

声明:本资源仅供个人预览学习使用,不得用于任何商业用途,请在下载后24小内删除,如果喜欢,请购买正版,如果侵犯到你的权益,请联系CSDN删除F l a s k D o c u m e n t a t i o nR e l e a s e 1 ....
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用matlab绘制高斯色噪声情况下的频率估计CRLB,其中w(n)是零均值高斯色噪声,w(n)=0.8*w(n-1)+e(n),e(n)服从零均值方差为se的高斯分布

以下是用matlab绘制高斯色噪声情况下频率估计CRLB的代码: ```matlab % 参数设置 N = 100; % 信号长度 se = 0.5; % 噪声方差 w = zeros(N,1); % 高斯色噪声 w(1) = randn(1)*sqrt(se); for n = 2:N w(n) = 0.8*w(n-1) + randn(1)*sqrt(se); end % 计算频率估计CRLB fs = 1; % 采样频率 df = 0.01; % 频率分辨率 f = 0:df:fs/2; % 频率范围 M = length(f); CRLB = zeros(M,1); for
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。