Pyformer: 内嵌局部机理的时序预测模型

news2025/7/10 5:29:03

====================== 待续 ========================

代码粗解

data_lorder.py文件中,定义了几个用于处理不同数据集的类,这里只关注Dataset_ETT_hour类。Dataset_ETT_hour类用来加载、处理ETTH数据集,主要包含以下4个方法:__read_data__def __getitem__(self, index)__len__(self)inverse_transform

1. __read_data__()

对ETTh的数据处理主要有以下几个步骤:
(1) 将ETTh1.csv中数据读取加载到一个DataFrame对象中

import pandas
root_path = 'D:\Contributions\J21_PINN\PYFORMER\dataset'
data_path = 'ETTh1.csv'
df_raw = pd.read_csv(os.path.join(root_path, data_path))

加载的数据如下图所示,共有8列数据,第1列是时间戳,后7列是特征数据,其中最后一列OT是油液的温度,也是要预测的量。
在这里插入图片描述
df_raw打印出来,可以看出,当原始数据加载进DataFrame类对象后,对自动给数据加行号Index,默认是从1开始的自然数编号。
在这里插入图片描述
(2). 取列的label,同时对列切片,切片范围:第1列到最后一列

cols_data = df_raw.columns[1:] # 从1切片,即去掉"date"列
print("The label of each coloumn is: ", cols_data)
df_data = df_raw[cols_data] #取cols_data列

执行上述代码后,date列被扔掉,df_data内容如下图所示
在这里插入图片描述
(3). 构造时间模型
先确定边界,边界主要用于确定train,test,和val数据的切片范围,例如本例中,border1s=[0, 8256, 11136], border2s=[8640, 11520, 14400],对于train数据,切片范围0:8640,对于test,切片范围8256:11520,对于val数据,切片范围11136:14400

border1s = [0, 12 * 30 * 24 - seq_len, 12 * 30 * 24 + 4 * 30 * 24 - seq_len] #border1s数组[0, 8256, 11136]
border2s = [12 * 30 * 24, 12 * 30 * 24 + 4 * 30 * 24, 12 * 30 * 24 + 8 * 30 * 24]  #border2s数组[8640, 11520, 14400]
border1 = border1s[self.set_type]  #
border2 = border2s[self.set_type]

df_raw中取出date列,并对其切片,切片范围:border1:border2,数值与初始化类对象时传入的flag实参有关,具体的:if flag=train,self.set_type=0, if flag=test,self.set_type=1, if flag=val,self.set_type=2

df_stamp = df_raw[['date']][border1:border2]

处理成日期格式,pd.to_datetime函数详见官网,它支持多种类型的输入,并且依据输入类型的不同,输出类型也不同。下面这行代码中,df_stamp.date类型为SeriesSeries类对象的属性和方法,详见官网

df_stamp['date'] = pd.to_datetime(df_stamp.date)

在这里插入图片描述
df_stamp增加monthdayweekdayhour列,并且从date中提取相应数据

df_stamp['month'] = df_stamp.date.apply(lambda row: row.month, 1)
df_stamp['day'] = df_stamp.date.apply(lambda  row: row.day, 1)
df_stamp['weekday'] = df_stamp.date.apply(lambda  row: row.weekday(), 1)
df_stamp['hour'] = df_stamp.date.apply(lambda  row: row.hour, 1)

执行上述代码后,df_stamp变为下图
在这里插入图片描述
丢弃date列,DataFrame.drop函数中的axis参数:axis=0 或者axis=index,则丢弃行,axis=1或者axis=column,丢弃列,默认axis=0

data_stamp = df_stamp.drop(['date'], axis=1) 

执行上述代码后,data_stamp变为
在这里插入图片描述
DataFrame类型的data_stamp变为numpy.ndarray类型,执行下面代码后,data_stamp就变为了形状为(3264,5)的二维张量,类型为numpy.ndarray,如下图所示

data_stamp = data_stamp.values

在这里插入图片描述
(4). 最后返回处理过的数据
__read_data__()函数中,返回data_x, data_y, data_stamp,这是已经按照初始化类对象时传入的参数flag进行切片以后的数据。

# 此时,data_x, data_y已按照flag的值,对data进行了切片处理
        self.data_x = data[border1:border2]
        self.data_y = data[border1:border2]
        self.data_stamp = data_stamp

2 __getitem__()

__getitem__()进行说明

    def __getitem__(self, index):
        # 随机取得标签,起点
        s_begin = index
        # 训练区间:终点(起点+回视窗口)
        s_end = s_begin + self.seq_len
        # 有标签区间 + 无标签区间(预测时间步长):终点-先验序列窗口
        r_begin = s_end - self.label_len
        # 终点 + 预测序列长度
        r_end = r_begin + self.label_len + self.pred_len

        # 取训练数据,seq_x = [起点,起点+回视窗口]
        seq_x = self.data_x[s_begin:s_end]
        # seq_y = [终点-先验序列窗口,终点+预测序列长度]
        seq_y = self.data_y[r_begin:r_end]
        # 取训练数据对应时间特征,取对应时间戳
        seq_x_mark = self.data_stamp[s_begin:s_end]
        # 取有标签区间+无标签区间(预测时间步长)对应时间戳
        seq_y_mark = self.data_stamp[r_begin:r_end]

        return seq_x, seq_y, seq_x_mark, seq_y_mark

从时间序列模型SCINet搬运过来一幅图,帮助理解上述代码的含义
在这里插入图片描述
到现在为止,我们已经构建好了Dataset_ETT_hour类,下面来简单测试一下这个类,看看输出的处理后的数据长什么样子。首先指定类初始化的几个参数,例如root_path,其他几个参数flag, target, sclae都有默认值,如果不需要改,可以省略。

root_path = 'D:\Contributions\J21_PINN\PYFORMER\dataset'
ETTh_data = Dataset_ETT_hour(root_path=root_path, flag='train', target='OT', scale=True)  #实例化
index = 0
seq_x, seq_y, seq_x_mark, seq_y_mark = ETTh_data.__getitem__(index=index)
print(seq_x)
print("seq_x.shape = ", seq_x.shape)
print(seq_y)
print("seq_y.shape = ", seq_y.shape)

我们设定index=0,那么s_begin等几个参数的值如下
在这里插入图片描述
seq_x及其shape如下,对照原始的.csv文档,发现并没有seq_x中的这些数据,原因是因为初始化Dataset_ETT_hour类时,指定了scale=True,所以这里输出的数据,是标准化以后的数据。如果scale=False,那么输出的数据就是原始数据。Target取了默认OT列,所以seq_x,seq_y仅是温度这一列数据。
seq_x, seq_x_mark, seq_y,seq_y_mark打印出来,可以看出,seq_x_markseq_x对应的时间戳
在这里插入图片描述
在这里插入图片描述

命令行参数库argparse用法

插播一个关于命令行参数库argparse的用法,详见B站上一个16分钟的视频,测试代码如下

"""运行下面的代码,请在terminal中:
1. cd到pyformer路径下,例如 cd D:\Contributions\J21_PINN\PYFORMER\pyformer
2. 输入 python test.py mul --a=3 --b=5 --verbose
"""
# 1. 如何读取命令行中传递进来的参数
# sys.argv获取命令行中所有参数
# format: script的路径,其他参数...
# 2, 专门处理命令行的Library: argparse
#  - 添加optional argument参数,有add_argument("--a", type = int, help = "xxx")
#     -默认是可选的,意味着可以不用填写
#  - 添加positional argument位置参数
#     -默认是不可选的,必须填写,否则报错
#  - 添加flags,标记,开关那种形式actional参数
#     比如说,添加一个参数,是否需要打印信息,--verbose
import sys
import argparse
# 1. 先创建解释器
parser = argparse.ArgumentParser()
# 同样实现乘法操作 output = a * b
# 添加a参数
parser.add_argument("method", type = str, help="Method") # method是位置参数,不可选,必须指定,否则报错
parser.add_argument("--a", type = int, default=5, help = "operator A") # a是可选参数,可以不指定,可以给默认值
parser.add_argument("--b", type = int, default=6, help = "operator B") # b是可选参数,可以不指定,可以给默认值
parser.add_argument("--verbose", action="store_true", default = 0, help = "Print Message") # 开关类参数
args = parser.parse_args()
print(args)
print(args.a*args.b)

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

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

相关文章

Mybaits-Plus学习5 代码生成器

引入代码生成器依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.1</version> </dependency> <dependency><groupId>org.freemarker</groupId…

旅游卡app软件开发解决方案

旅游业的不断发展&#xff0c;旅游卡作为一种便捷的旅游方式越来越受到人们的青睐。旅游卡可以帮助游客节省旅游开支&#xff0c;同时也能让游客更好地规划自己的旅游行程。针对这种情况&#xff0c;开发一款旅游卡app软件是非常必要的。本文将介绍旅游卡app软件开发的解决方案…

mysql 视图

视图&#xff0c;是虚拟存在的表&#xff0c;视图中的数据在数据库中实际不存在&#xff0c;视图只保存查询SQL的逻辑&#xff0c;不保存查询结果 建表sql DROP TABLE IF EXISTS w_dict; CREATE TABLE w_dict (id int(0) NOT NULL AUTO_INCREMENT,label varchar(255) CHARACT…

rsync+intofy实时同步部署(上行、下行)

目录 一&#xff1a;rsync 远程同步 二&#xff1a;配置rsync源服务器 1、安装rsync 2、建立/etc/rsyncd.conf 配置文件 3、 为备份账户创建数据文件 4、 保证所有用户对源目录/var/www/html 都有读取权限 5、 启动 rsync 服务程序 6、关闭 rsync 服务 三&#xff1a; 发起…

华为OD机试(B卷)

华为OD机试&#xff08;B卷&#xff09; 有幸接到了华为OD的机试邀请&#xff0c;三道算法题。比较幸运的是&#xff0c;最后一题&#xff0c;也相对来说不算太难&#xff0c;没有抽到动态规划&#xff0c;还是花了大约90分钟&#xff0c;三道题都通过了&#xff0c;最终拿到了…

获得多线程的方法几种、callable接口与runnable接口的区别、callable接口使用

1、获得多线程的方法几种&#xff1f; &#xff08;1&#xff09;传统的是继承thread类和实现runnable接口&#xff0c;java5以后又有实现callable接口和java的线程池获得。 &#xff08;2&#xff09;函数式接口&#xff1a; 这是一个函数式接口&#xff0c;因此可以用作l…

【bug传奇】12个bug个个成经典,最后一个毁了一个帝国

1、世界第一个bug--万“虫”之母 1947年9月9日&#xff0c;葛丽丝霍普&#xff08;Grace Hopper&#xff09;发现了第一个电脑上的bug。当在Mark II计算机上工作时&#xff0c;整个团队都搞不清楚为什么电脑不能正常运作了。经挖掘真相为&#xff1a; 第一代的计算机是由许多庞…

Python:plt画图隐藏刻度

plt.tick_params(axisboth, whichboth, bottomFalse, leftFalse, labelbottomFalse, labelleftFalse)

软件测试流程扫盲:V/W/H模型,测试左移测试右移

一、软件测试模型 &#xff08;一&#xff09;V模型 V模型是瀑布模型的一种改进V模型标明了测试过程中的不同阶段 1.V模型每个测试阶段的测试内容 单元测试&#xff1a;类、函数 集成测试&#xff1a;接口 系统测试&#xff1a;前期测功能有没有满足需求&#xff0c;后期满…

数据可视化分析,近5年电视机全球出货量和中国产量

随着科技的不断进步&#xff0c;电视机已经不再只是用来看电视节目的设备&#xff0c;而是成为了家庭娱乐的中心&#xff0c;提供了令人难以置信的视觉体验。随着4K和8K技术的引入&#xff0c;我们能够欣赏到前所未有的清晰度和细节还原能力。无论是观看电影、体育比赛还是玩游…

哈工大计算机网课程络网络层协议详解之:Internet网络路由协议详解(RIP、OSPF)

文章目录 RIP协议RIP链路失效、恢复问题RIP路由表的处理 OSPF协议分层的OSPF主干路由器 之前我们也介绍了&#xff0c;作为我们现在广泛使用的Internet网络来说&#xff0c;采用的路由策略是层次化路由策略。 即将不同区域、组织的网络划分成一个个自治系统&#xff0c;在自治系…

Android Studio实现内容丰富的安卓志愿者平台

如需源码可以添加q-------3290510686&#xff0c;也有演示视频演示具体功能&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动。 项目编号122 1.开发环境 android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看公告 3.…

LUT查找表

目录 1、查找表原理 2、LUT查找表函数 1、查找表原理 2、LUT查找表函数 #include <iostream> #include <fstream> #include <opencv2/opencv.hpp>using namespace std; using namespace cv;int main() {//LUT查找表第一层uchar lutFirst[256];for (int i 0…

MySQL - 第14节 - MySQL使用C语言连接

1.引入库 要使用C语言连接MySQL&#xff0c;需要使用MySQL官网提供的库。 1.1.下载库文件 下载库文件&#xff1a; 首先&#xff0c;进入MySQL官网&#xff0c;选择DEVELOPER ZONE&#xff08;开发人员专区&#xff09;&#xff0c;然后点击MySQL Downloads。如下&#xff1a; …

MySQL学习基础篇(四)---运算符

MySQL学习基础篇(四)—运算符 1 算数运算符 1.1加法与减法运算符 结论&#xff1a; 一个整数类型的值对整数进行加法和减法操作&#xff0c;结果还是一个整数&#xff1b;一个整数类型的值对浮点数进行加法和减法操作&#xff0c;结果是一个浮点数&#xff1b;加法和减法的优先…

Hive详解

一 Hive基本概念 1 Hive简介 学习目标 - 了解什么是Hive - 了解为什么使用Hive1.1 什么是 Hive Hive 由 Facebook 实现并开源&#xff0c;是基于 Hadoop 的一个数据仓库工具&#xff0c;可以将结构化的数据映射为一张数据库表 &#xff0c;并提供 HQL(Hive SQL)查询功能&…

华为云CodeArts Check:带你掌握代码检查技巧,优化代码质量!

HDC期间可参与华为开发者大会Check新人抽奖活动&#xff0c;活动链接在文末。福利多多&#xff0c;快来参与&#xff01; 本文作为华为云CodeArts Check代码检查服务的开箱操作指导文档&#xff0c;会分为如下五个维度进行介绍&#xff1a;产品介绍、前期准备、开通CodeArts软件…

ModaHub魔搭社区:向量数据库Milvus Lite 的优势和安装教程

想要体验开源向量数据库MIlvus&#xff0c;缺少专业的工程师团队作为支撑&#xff1f;Milvus 安装环境受限&#xff1f; 别担心&#xff0c;轻量版 Milvus 来啦&#xff01; 有用户反馈刚开始接触 Milvus 或者想要在 Notebook 中进行快速实验时&#xff0c;安装或部署 Milvus …

泛娱乐出海赛道火热,茄子科技如何赋能企业出海破局?

全球疫情的反复影响了用户的生活、工作习惯&#xff0c;更多泛娱乐的用户习惯向“线上化”迁移。当前&#xff0c;随着技术的迭代和行业走向成熟&#xff0c;泛娱乐出海在产品、技术和市场方面也出现了全新的发展趋势。然而&#xff0c;泛娱乐出海者们想要在海外市场去开疆拓域…

【项目部署】NGINX原生部署前端

如有拼错的单词感谢提醒~ 一.准备工作 为了方便文件的管理&#xff0c;我们先在服务器上创建一个专门存放项目的目录。 # 1.查看当前所在目录 pwd # 1.1 可以切换到根目录管理 cd /root # 2.创建一个专门存放项目的文件夹 mkdir services # 3.可以查看我们创建的文件夹 ls # …