利用时间序列预测电量,冷量和压缩空气量

news2024/11/24 22:43:22

利用时间序列预测电量,冷量和压缩空气量

  • 背景
  • 分析与思路
  • 代码
  • 结果
    • 一,电量预测
    • 二,冷量预测
    • 三,压缩空气预测
  • 调优
    • 一,电量预测(m=6)
    • 二,冷量预测
    • 三,压缩空气预测

背景

根据提供的数据,详见附件,用机器学习算法建立某工厂电量、冷量和压缩空气预测模型,并输出模型评价指标R2、RMSE、实际值与预测值对比图。(注:本次建模暂只针对用量本身,未提供其他特征变量。)

注:1、本次建模暂只针对用量本身(原始数据为表具读数,需进行计算),未提供其他特征变量,可采用时间序列方法;
2、电、冷和气原始数据内包括多个表具,其中电量由11个电表组成、冷量包括3个表具、气包括2个表具,请针对电量、冷量和压缩空气三类总用量进行建模。

分析与思路

1,由于原数据是每15分钟采集表具的,不同系统表具数目不一致,而且不同时间段的表具数目不一样,表具是随着业务一直在增加的,表具参数需要可设定;
2,由于是数据结构是不同表具不同时间点采集的,需要对原始表具读数进行计算;
3,由于原数据只提供 用量本身,未提供其他特征变量,采用时间序列方法;
4,预测的结果可以定义一个method用以评估预测结果的好坏;

代码

import time
import numpy as np
import pandas as pd
import pmdarima as pm
import matplotlib.pyplot as plt
from sklearn.metrics import r2_score, mean_squared_error,mean_absolute_error
import warnings
warnings.filterwarnings("ignore")
warnings.simplefilter('ignore', ValueError)
import logging
logging.basicConfig(filename = 'three_predict.log', format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", level=logging.DEBUG) #日志设置/app/logs/
start_time = time.time() #开始时间

class Three_Predict(object):
    def __init__(self, equipment_num, windows, n_periods):
        self.equipment_num = equipment_num #设备数
        self.windows = windows #滑动窗口
        self.n_periods = n_periods #预测期数
    
    def fetch_data(): #读取数据
        electric_data = pd.read_excel(r"D:\项目\上汽资产\算法笔试题目-上汽资产\算法笔试题目-上汽资产\预测数据集\electric.xlsx", parse_dates= [u'时间'])
        cold_data = pd.read_excel(r"D:\项目\上汽资产\算法笔试题目-上汽资产\算法笔试题目-上汽资产\预测数据集\cold.xlsx", parse_dates= [u'时间'])
        air_data = pd.read_excel(r"D:\项目\上汽资产\算法笔试题目-上汽资产\算法笔试题目-上汽资产\预测数据集\air.xlsx", parse_dates= [u'时间'])
        print(len(electric_data), len(cold_data), len(air_data)) #, len(cold_data), len(air_data)
        return electric_data

    def data_preprocess(data, equipment_num, windows, n_periods): #数据预处理
        print("设备数 = {}, 窗口数 = {}, 预测期数 = {}".format(equipment_num, windows, n_periods))
        data_total = data.groupby(by=[u'时间']).agg({u'计量表':[len], u'表读数': [np.sum]}) #聚合
        data_total.columns = [s2+'_'+s1 for s2, s1 in data_total.columns] 
        print(data_total)
        data_total = data_total.query("计量表_len>=@equipment_num") #排除掉电表未采集到数据的情况
        print(len(data_total))
        data_ts = data_total[u"表读数_sum"] #电量时序
        ts_rolling = data_ts.rolling(windows).mean() #阶截尾滑动平均
        ts_rolling_std = ts_rolling.std() #标准差
        # print("滑动平均:\n", ts_rolling, ts_rolling_std)
        upper = (lambda x, y: x>y+1.5*ts_rolling_std)(data_ts, ts_rolling)
        lower = (lambda x, y: x<y-1.5*ts_rolling_std)(data_ts, ts_rolling)
        ts_filter = data_ts.drop(labels = data_ts[upper].index) #去上异常值
        ts_filtered = ts_filter.drop(labels = data_ts[lower].index)#去下异常值
        print("过滤后序列\n", ts_filtered)
        y_train, y_test = ts_filtered[:-n_periods], ts_filtered[-n_periods:]
        print(y_train, y_test)
        return y_train, y_test

    def auto_arima(data, n_periods): #auto_arima预测
        model = pm.auto_arima(data,
                            m = 4,
                            seasonal = True,
                            trace = False,
                            error_action = 'ignore',  
                            suppress_warnings = True,
                            stepwise = True,
                            n_jobs= -1) #模型初始化
        print("optimum model:", model)
        y_pred = model.predict(n_periods) #预测未来n_periods期 
        y_pred = [np.round(i) for i in y_pred] #四舍五入取整
        return y_pred
    
    def metric(y_pred, y_test): #预测结果评估
        r2 = r2_score(y_test, y_pred)
        rmse = np.sqrt(mean_squared_error(y_test, y_pred))
        print("R2 = {}, RMSE = {}".format(r2, rmse))
        fig = plt.figure(figsize=(8,6))
        # ax = fig.add_subplot(1, 1, 1) 
        plt.rcParams['font.sans-serif']=['SimHei'] 
        plt.rcParams['axes.unicode_minus']=False 
        print("实际值", y_test)
        print("预测值", y_pred)
        print(list(range(len(y_pred))))
        plt.plot(y_pred, color="b", label="预测值")
        plt.plot(y_test, color="g", label="实际值")   
        plt.legend()
        plt.title("实际值与预测值对比图")
        plt.show()
        return r2, rmse


predict = Three_Predict(11, 4, 10)
data = Three_Predict.fetch_data()
y_train, y_test = Three_Predict.data_preprocess(data, predict.equipment_num,  predict.windows, predict.n_periods)
y_pred = Three_Predict.auto_arima(y_train, predict.n_periods)
Three_Predict.metric(y_pred, y_test.tolist())


end_time = time.time() #结束时间
cost_time = end_time - start_time
print("cost time: {}".format(cost_time))
logging.info("cost time: {}".format(cost_time))

结果

一,电量预测

结果
R2 = -2.5642672586491737, RMSE = 1841.0228407056768

实际值与预测值对比图

在这里插入图片描述

二,冷量预测

R2 = 1.0, RMSE = 0.0

实际值与预测值对比图
在这里插入图片描述

三,压缩空气预测

结果
R2 = -14.35457326271083, RMSE = 7931.339811154229
在这里插入图片描述

调优

利用时间序列建模,往往需要对参数p,d,q和周期性参数m进行调节,以达到最优,像这种工业用电,用水,用气往往具有淡旺季,一天或一周或一个月有高峰低谷的,会呈现周期性和一些趋势特点,这里重点对周期参数m进行调节

一,电量预测(m=6)

结果
R2 = 0.9306904090631372, RMSE = 256.7265081755291

实际值与预测值对比图

在这里插入图片描述

二,冷量预测

三,压缩空气预测

结果
R2 = -14.35457326271083, RMSE = 7931.339811154229
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/168300.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业开发项目【1】— — 流程、开发环境搭建模板

企业开发项目【1】— — 流程、开发环境搭建模板 以黑马的学成在线为例 1 项目背景 2 项目介绍 3 开发环境搭建 3.1 开发工具配置&#xff08;后端&#xff09; 3.1.1 Idea配置 环境编码 编译级别配置 project structure - 设置JDK版本和编译级别3. 自动导包设置 IDEA可以…

远距离车载高速网络通讯方案

一 车载网络的发展 随着电子、半导体和通讯等行业的快速发展&#xff0c;汽车智能化的诉求也愈发强烈。越来越多的传感器和处理器的应用推动了汽车的智能化和电气化&#xff0c;与此同时&#xff0c;也使得ECU&#xff08;电子控制单元&#xff09;的数量快速增加。随着自动驾…

基于“python+”潮汐、风驱动循环、风暴潮等海洋水动力模拟

ADCIRC是新一代海洋水动力计算模型&#xff0c;它采用了非结构三角形网格广义波动连续方程的设计&#xff0c;在提高计算精确度的同时还减小了计算时间。被广泛应用于&#xff1a;模拟潮汐和风驱动的循环、预测风暴潮和洪水和近岸海上作业等。 除此之外&#xff0c;ADCIRC也是我…

目前市场上比较好的oa办公系统企业管理软件有哪些?

行政小李拿着《疫情期间春节返乡填报单》在工位之间来回穿梭…… 财务小王把年终奖金和福利方法拿给老板签字…… 行政小李的和人事小赵回回都因为入职新人培训的事情扯皮…… 后勤小郑每次办公物资的整理都要做半天…… OA系统本就是为企业内部的员工沟通、工作效率提高、协作…

WebDAV之葫芦儿·派盘+BookxNote

BookxNote 支持WebDAV方式连接葫芦儿派盘。 BookxNote是全新设计的电子书阅读学习笔记软件,以不同的思维方式重塑我们的学习过程。一边阅读一边划重点,提供多种划重点笔记工具,包括直线、矩形、圆形、高亮文本,图片摘录。高亮的文本自动编辑为重点的批注内容,还可以对重点…

查看网站历史记录的2种办法,怎样查看网站历史记录?

有个想购买二手域名的朋友问小黑&#xff1a;如何查看网站历史记录&#xff1f;于是今天就分享查看网站历史记录的 2种办法&#xff1a;网站历史记录和快照。 如果你在下单之前想查一查域名以前做过些什么&#xff0c;有没有违禁记录&#xff0c;被惩罚过&#xff0c;被K过等等…

LeetCode082_82. 删除排序链表中的重复元素 II

LeetCode082_82. 删除排序链表中的重复元素 II 一、描述 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,3,4,4,5] 输出&#xff1a;…

CODESYS开发教程8-定时、触发和计数

今天继续我们的小白教程&#xff0c;老鸟就不要在这浪费时间了&#x1f60a;。 前面一期我们介绍了CODESYS的字符串及其操作。这一期主要介绍CODESYS的定时器及触发的相关功能块特性及用法&#xff0c;注意本文介绍的定时器、触发器和计数器均包含在CODESYS的Standard库中。 一…

c-note:字符串常量初始化存放位置

两行代码&#xff0c;分别以数组形式和指针形式&#xff0c;先说结论。 对于字面量"he"的存放位置&#xff1a; 1、数组形式&#xff0c;字面量直接存放进栈给temp处开辟的空间 2、指针形式&#xff0c;字面量"he"是一个常量&#xff0c;在编译之初便存在于…

如何在mac上使用idea做大数据开发

1 软件包下载jdk1.8 (jdk1.8.0_231)idea(包括2018,2019) (ideaIC-2019.3.3/ideaIC-2018.3.5)汉化包:汉化包.rarmaven3.6.3 (apache-maven-3.6)2 jdk的安装第一:把包直接放到自定义目录下第二:配置环境变量a) 打开终端 输入 sudo vi /etc/profile 或者 sudo vi .bash_profile解释…

联合证券|滴滴出行即日起恢复!A股嗨了!券商扛起领涨大旗

A股今天全线走高&#xff0c;沪指涨超1%克复3200点&#xff0c;深成指、创业板指盘中涨超2%&#xff1b;港股午后回落走低&#xff0c;恒生科技指数一度跌超2%。 详细来看&#xff0c;A股方面&#xff0c;两市股指盘中强势拉升&#xff0c;沪指涨超1%站稳3200点&#xff0c;深成…

『速查手册』MIME 多用途互联网邮件扩展

『速查手册』MIME 多用途互联网邮件扩展 文章目录『速查手册』MIME 多用途互联网邮件扩展一、多用途互联网邮件扩展 / 互联网媒体类型二、MIME 命名规则&#x1f60e;三、MIME 类型列表&#x1f349;1)、Type 类型形式2)、Application 应用文件3)、Text 文本4)、Video 视频文件…

elasticsearch(三)-- 理解ES的索引操作

一、前言 上一章我们主要学习了es的几个客户端&#xff0c;那么我们后面也主要通过kibana客户端、HighLevelClient高级客户端这两个来学习es. 这一章的学习我们主要是学习一些Elasticsearch的基础操作&#xff0c;主要是深入一些概念&#xff0c;比如索引的具体操作&#xff0…

三、WEB框架介绍以及设计模式

web框架介绍 什么是web框架 应该叫web应用框架(web application framework)&#xff0c;它是一种开发框架。 通俗点来讲&#xff0c;就是用来开发web应用的程序。 为什么要使用框架来开发 互联网行业流行一句话叫“不要重复造轮子”&#xff0c;特别是对于新手和应用层开发…

day22-JDK新特性

接口中的新特性 接口我们之前已经学过了&#xff0c;那么接口中内部主要就是封装了方法&#xff0c;包含抽象方法&#xff08;JDK 7及以前&#xff09;&#xff0c;默认方法和静态方法&#xff08;JDK 8&#xff09;&#xff0c;私有方法 &#xff08;JDK 9&#xff09;。 接口…

使用Navicat导入和导出sql语句

创建mysql数据库 创建数据库之前&#xff0c;肯定要先连接上数据库&#xff0c;如果不知道怎么使用navicat连接mysql数据库&#xff0c;可以参考之前的文章哦 https://blog.csdn.net/weixin_43860634/article/details/128716733 接下来进入正题 1、首先要双击test &#xff0…

命令注入与dvwa中的Command Injection

一、什么是命令注入&#xff1f;即 Command Injection&#xff0c;是指通过提交恶意构造的参数破坏命令语句结构&#xff0c;从而达到执行恶意命令的目的。此攻击与代码注入不同&#xff0c;因为代码注入允许攻击者添加自己的代码&#xff0c;然后由应用程序执行。 在命令注入中…

用队列实现栈

题目&#xff1a;225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09;准备工作这题明确说明了需要用队列来实现栈&#xff0c;介于C语言没有队列的库&#xff0c;所以在此之前我们需要用调用之前学的队列&#xff0c;详见队列typedef int QDataType;typedef struct Queu…

Ubuntu上安装 Hadoop 3详细过程(验证+填坑总结)

Ubuntu上安装 Hadoop 3 前提条件&#xff1a; Python 推荐3.8JDK 推荐1.8 解压安装 sudo tar -zxvf hadoop-3.3.0.tar.gz -C /usr/local cd /usr/local sudo mv hadoop-3.3.0 hadoop sudo chown -R hadoop ./hadoop 配置环境变量 vim ~/.bashrc # hadoop export H…

云原生安全系列 5:ETCD 安全加固

引言 etcd是一个强一致性的分布式键值存储&#xff0c;它提供了一种可靠的方式来存储需要被分布式系统或机器集群访问的数据。通过 raft 算法它能在网络分区期间优雅地处理领导者的选举&#xff0c;并能容忍机器故障&#xff0c;甚至在领导者节点上。除此之外&#xff0c; etc…