TimesFM(Time Series Foundation Model)时间序列预测的数据研究(3)

前一篇完成了 TimesFM 的运行

TimesFM(Time Series Foundation Model)安装(2)-CSDN博客文章浏览阅读520次,点赞13次,收藏24次。决定在 小红帽ubuntu UBUNTU安装 timesFM在 ide.cloud.tencent.com 的环境上进行安装 环境 慎选环境,确保>16G安装Conda 3.10 python重要步骤 安装 pyenv and poetry确认已经完成安装这里安装完需要设置环境变量,如果不能看到 version 版本时Add `export PATH="/root/.local/bin:$PATH"` to your shell configuratiohttps://blog.csdn.net/chenchihwen/article/details/144386472?sharetype=blogdetail&sharerId=144386472&sharerefer=PC&sharesource=chenchihwen&spm=1011.2480.3001.8118

这篇针对里面运行的数据进行分析

根据代码 数据是来自  exp, exp 是来自引用 的 .utils.py

这是 utilis.py 的代码

是从Nixtla来的 尼克斯塔与时间序列预测 

 """Forked from https://github.com/Nixtla/nixtla/blob/main/experiments/amazon-chronos/src/utils.py."""

# Copyright 2024 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License."""Forked from https://github.com/Nixtla/nixtla/blob/main/experiments/amazon-chronos/src/utils.py."""from functools import partial
from itertools import repeat
import multiprocessing
import os
from pathlib import Path
from typing import Listfrom gluonts.dataset import Dataset
from gluonts.dataset.repository.datasets import (dataset_names as gluonts_datasets,get_dataset,
)
from gluonts.time_feature.seasonality import get_seasonality
import numpy as np
import pandas as pd
from utilsforecast.evaluation import evaluate
from utilsforecast.losses import mae, mase, smapedef parallel_transform(inp):ts, last_n = inp[0], inp[1]return ExperimentHandler._transform_gluonts_instance_to_df(ts, last_n=last_n)def quantile_loss(df: pd.DataFrame,models: list,q: float = 0.5,id_col: str = "unique_id",target_col: str = "y",
) -> pd.DataFrame:delta_y = df[models].sub(df[target_col], axis=0)res = (np.maximum(q * delta_y, (q - 1) * delta_y).groupby(df[id_col], observed=True).mean())res.index.name = id_colres = res.reset_index()return resclass ExperimentHandler:def __init__(self,dataset: str,quantiles: List[float] = list(np.arange(1, 10) / 10.0),results_dir: str = "./results",models_dir: str = "./models",):if dataset not in gluonts_datasets:raise Exception(f"dataset {dataset} not found in gluonts "f"available datasets: {', '.join(gluonts_datasets)}")self.dataset = datasetself.quantiles = quantilesself.level = self._transform_quantiles_to_levels(quantiles)self.results_dir = results_dirself.models_dir = models_dir# defining datasetsself._maybe_download_m3_or_m5_file(self.dataset)gluonts_dataset = get_dataset(self.dataset)self.horizon = gluonts_dataset.metadata.prediction_lengthif self.horizon is None:raise Exception(f"horizon not found for dataset {self.dataset} ""experiment cannot be run")self.freq = gluonts_dataset.metadata.freq# get_seasonality() returns 1 for freq='D', override this to 7. This significantly improves the accuracy of# statistical models on datasets like m5/nn5_daily. The models like AutoARIMA/AutoETS can still set# seasonality=1 internally on datasets like weather by choosing non-seasonal models during model selection.if self.freq == "D":self.seasonality = 7else:self.seasonality = get_seasonality(self.freq)self.gluonts_train_dataset = gluonts_dataset.trainself.gluonts_test_dataset = gluonts_dataset.testself._create_dir_if_not_exists(self.results_dir)try:multiprocessing.set_start_method("spawn")except RuntimeError:print("Multiprocessing context has already been set.")@staticmethoddef _maybe_download_m3_or_m5_file(dataset: str):if dataset[:2] == "m3":m3_file = Path.home() / ".gluonts" / "datasets" / "M3C.xls"if not m3_file.exists():from datasetsforecast.m3 import M3from datasetsforecast.utils import download_filedownload_file(m3_file.parent, M3.source_url)elif dataset == "m5":m5_raw_dir = Path.home() / ".gluonts" / "m5"if not m5_raw_dir.exists():import zipfilefrom datasetsforecast.m5 import M5from datasetsforecast.utils import download_filedownload_file(m5_raw_dir, M5.source_url)with zipfile.ZipFile(m5_raw_dir / "m5.zip", "r") as zip_ref:zip_ref.extractall(m5_raw_dir)@staticmethoddef _transform_quantiles_to_levels(quantiles: List[float]) -> List[int]:level = [int(100 - 200 * q) for q in quantiles if q < 0.5]  # in this case mean=mediainlevel = sorted(list(set(level)))return level@staticmethoddef _create_dir_if_not_exists(directory: str):Path(directory).mkdir(parents=True, exist_ok=True)@staticmethoddef _transform_gluonts_instance_to_df(ts: dict,last_n: int | None = None,) -> pd.DataFrame:start_period = ts["start"]start_ds, freq = start_period.to_timestamp(), start_period.freqtarget = ts["target"]ds = pd.date_range(start=start_ds, freq=freq, periods=len(target))if last_n is not None:target = target[-last_n:]ds = ds[-last_n:]ts_df = pd.DataFrame({"unique_id": ts["item_id"], "ds": ds, "y": target})return ts_df@staticmethoddef _transform_gluonts_dataset_to_df(gluonts_dataset: Dataset,last_n: int | None = None,) -> pd.DataFrame:with multiprocessing.Pool(os.cpu_count()) as pool:  # Create a process poolresults = pool.map(parallel_transform, zip(gluonts_dataset, repeat(last_n)))df = pd.concat(results)df = df.reset_index(drop=True)return df@propertydef train_df(self) -> pd.DataFrame:train_df = self._transform_gluonts_dataset_to_df(self.gluonts_train_dataset)return train_df@propertydef test_df(self) -> pd.DataFrame:test_df = self._transform_gluonts_dataset_to_df(self.gluonts_test_dataset,last_n=self.horizon,)# Make sure that only the first backtest window is used for evaluation on `traffic` / `exchange_rate` datasetsreturn test_df.groupby("unique_id", sort=False).head(self.horizon)def save_dataframe(self, df: pd.DataFrame, file_name: str):df.to_csv(f"{self.results_dir}/{file_name}", index=False)def save_results(self, fcst_df: pd.DataFrame, total_time: float, model_name: str):self.save_dataframe(fcst_df,f"{model_name}-{self.dataset}-fcst.csv",)time_df = pd.DataFrame({"time": [total_time], "model": model_name})self.save_dataframe(time_df,f"{model_name}-{self.dataset}-time.csv",)def fcst_from_level_to_quantiles(self,fcst_df: pd.DataFrame,model_name: str,) -> pd.DataFrame:fcst_df = fcst_df.copy()cols = ["unique_id", "ds", model_name]for q in self.quantiles:if q == 0.5:col = f"{model_name}"else:lv = int(100 - 200 * q)hi_or_lo = "lo" if lv > 0 else "hi"lv = abs(lv)col = f"{model_name}-{hi_or_lo}-{lv}"q_col = f"{model_name}-q-{q}"fcst_df[q_col] = fcst_df[col].valuescols.append(q_col)return fcst_df[cols]def evaluate_models(self, models: List[str]) -> pd.DataFrame:fcsts_df = []times_df = []for model in models:fcst_method_df = pd.read_csv(f"{self.results_dir}/{model}-{self.dataset}-fcst.csv").set_index(["unique_id", "ds"])fcsts_df.append(fcst_method_df)time_method_df = pd.read_csv(f"{self.results_dir}/{model}-{self.dataset}-time.csv")times_df.append(time_method_df)fcsts_df = pd.concat(fcsts_df, axis=1).reset_index()fcsts_df["ds"] = pd.to_datetime(fcsts_df["ds"])times_df = pd.concat(times_df)return self.evaluate_from_predictions(models=models, fcsts_df=fcsts_df, times_df=times_df)def evaluate_from_predictions(self, models: List[str], fcsts_df: pd.DataFrame, times_df: pd.DataFrame) -> pd.DataFrame:test_df = self.test_dftrain_df = self.train_dftest_df = test_df.merge(fcsts_df, how="left")assert test_df.isna().sum().sum() == 0, "merge contains nas"# point evaluationpoint_fcsts_cols = ["unique_id", "ds", "y"] + modelstest_df["unique_id"] = test_df["unique_id"].astype(str)train_df["unique_id"] = train_df["unique_id"].astype(str)mase_seas = partial(mase, seasonality=self.seasonality)eval_df = evaluate(test_df[point_fcsts_cols],train_df=train_df,metrics=[smape, mase_seas, mae],)# probabilistic evaluationeval_prob_df = []for q in self.quantiles:prob_cols = [f"{model}-q-{q}" for model in models]eval_q_df = quantile_loss(test_df, models=prob_cols, q=q)eval_q_df[prob_cols] = eval_q_df[prob_cols] * self.horizoneval_q_df = eval_q_df.rename(columns=dict(zip(prob_cols, models)))eval_q_df["metric"] = f"quantile-loss-{q}"eval_prob_df.append(eval_q_df)eval_prob_df = pd.concat(eval_prob_df)eval_prob_df = eval_prob_df.groupby("metric").sum().reset_index()total_y = test_df["y"].sum()eval_prob_df[models] = eval_prob_df[models] / total_yeval_prob_df["metric"] = "scaled_crps"eval_df = pd.concat([eval_df, eval_prob_df]).reset_index(drop=True)eval_df = eval_df.groupby("metric").mean(numeric_only=True).reset_index()eval_df = eval_df.melt(id_vars="metric", value_name="value", var_name="model")times_df.insert(0, "metric", "time")times_df = times_df.rename(columns={"time": "value"})eval_df = pd.concat([eval_df, times_df])eval_df.insert(0, "dataset", self.dataset)eval_df = eval_df.sort_values(["dataset", "metric", "model"])eval_df = eval_df.reset_index(drop=True)return eval_dfif __name__ == "__main__":multiprocessing.set_start_method("spawn")

以 toursim 月预测来分析

相关数据可以查看我上传的资源

TimesFM 预测数据来源 TimesFM(时间序列基础模型)是由谷歌研究开发的一种预训练时间序列基础模型icon-default.png?t=O83Ahttps://download.csdn.net/download/chenchihwen/90124776?spm=1001.2014.3001.5503这里已经将最原始的的 json 转换成 excel 格式

我们来看training 原始的  [data.json.gz] 内容如下:

通过 tourism_monthly 的 metadata.json 

{"freq": "M", "target": null, "feat_static_cat": [{"name": "feat_static_cat_0", "cardinality": "366"}], "feat_static_real": [], "feat_dynamic_real": [], "feat_dynamic_cat": [], "prediction_length": 24}
代码转译后 excel 如下,

T1 标签最后的 training 资料 是1992/7/31

 

我们来看下预测的结果,与实际数据的比较,还行

unique_iddsyunique_iddstimesfm
T11992/8/316611.1T11992/8/315975.3
T11992/9/304150.2T11992/9/304250.7
T11992/10/312841.0T11992/10/312843.6
T11992/11/301813.4T11992/11/302144.1
T11992/12/312261.1T11992/12/312206.6
T11993/1/311873.6T11993/1/311862.6
T11993/2/281772.8T11993/2/281961.5
T11993/3/312049.6T11993/3/312007.9
T11993/4/302932.3T11993/4/302531.2
T11993/5/313113.3T11993/5/312908.7
T11993/6/303461.5T11993/6/303474.2
T11993/7/316265.7T11993/7/315924.7
T11993/8/316857.8T11993/8/316098.7
T11993/9/304346.1T11993/9/304134.4
T11993/10/313154.7T11993/10/312737.1
T11993/11/302142.2T11993/11/301909.0
T11993/12/312375.7T11993/12/312115.6
T11994/1/311981.1T11994/1/311823.7
T11994/2/281959.9T11994/2/281850.2
T11994/3/312466.3T11994/3/311935.1
T11994/4/302851.7T11994/4/302440.0
T11994/5/313671.8T11994/5/312753.3
T11994/6/303806.8T11994/6/303497.1
T11994/7/316995.0T11994/7/315773.2

实际跑出的预计数是长得这个样子, 会有 timesfm-q-0.1 :  timesfm-q-0.9

是因为代码中设置了

在Python代码中,尤其是涉及到时间序列分析、预测等相关场景(从你之前提供的看起来和时间序列相关的代码链接推测),`quantiles` 通常有以下一些常见用途:

### 概率预测与不确定性量化方面

1. **表示预测区间**:在很多预测任务中,模型给出的不只是一个单一的预测值(比如预测某个时间点的数值),而是一个预测区间来体现不确定性。`quantiles` 可以用来定义这些区间的边界,例如,常见的会使用 0.05、0.5、0.95 等不同分位数对应的数值来表示预测区间的下限、中位数、上限。像如果预测某商品未来销量,通过计算不同 `quantiles` 的值,能知道销量大概率(比如 90% 的置信区间,对应 0.05 和 0.95 分位数)会落在哪个范围,以及最有可能的中间值(0.5 分位数即中位数)是多少。

2. **评估预测的不确定性**:在评估预测模型好坏时,除了看预测值与实际值的偏差(比如均方误差等指标衡量准确性),还需要考量预测的不确定性是否合理。通过比较模型输出的 `quantiles` 对应的预测区间和实际观测值落在该区间的比例等情况,可以判断模型对不确定性的把握能力。例如,如果模型声称某个 `quantiles` 对应的区间有 90% 的概率包含真实值,但实际多次验证下来真实值只有 50% 的情况落在该区间,那就说明模型对不确定性的估计可能不太准确。

timesfm forecast 是取中位数 也就是  timesfm-q-0.5

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【潜意识Java】深入理解 Java 面向对象编程(OOP)

目录 什么是面向对象编程&#xff08;OOP&#xff09;&#xff1f; 1. 封装&#xff08;Encapsulation&#xff09; Java 中的封装 2. 继承&#xff08;Inheritance&#xff09; Java 中的继承 3. 多态&#xff08;Polymorphism&#xff09; Java 中的多态 4. 抽象&…

三、汇总统计

1.SUM、COUNT、AVERAGE 注意&#xff1a;count函数是计算区域中包含数字的单元格的个数&#xff0c;以上案例中两个空白单元格和一个中文列标题都是没有计算在内的。 平均函数AVERAGE也是按照17进行求平均值的。所以在使用平均值的函数时候&#xff0c;可以根据实际情况看是…

EXCEL的各种图形,统计图形

目录 0 EXCEL的各种图形&#xff0c;统计图形 1 统计图形 / 直方图 / 其实叫 频度图 hist最合适(用原始数据直接作图) 1.1 什么是频度图 1.2 如何创建频度图&#xff0c;一般是只选中1列数据&#xff08;1个数组&#xff09; 1.3 如何修改频度图的宽度 1.4 hist图的一个特…

基于Llamaindex的网页内容爬取实战

目的 本文不关注如何解析网页 html 元素和各种 python 爬虫技术&#xff0c;仅作为一种网页数据的预处理手段进行研究。Llamaindex 也并不是爬虫技术的集大成者&#xff0c;使用它是为了后续的存查一体化。 安装依赖 pip install llama-index-readers-web # pip install llam…

debian12学习笔记

前置条件 基于debian12官网的qcow2格式文件进行操作 安装ssh 登录虚拟机后安装ssh服务端 apt install openssh-server配置国内源 新增/etc/apt/sources.list.d/tsinghua.list 使用清华大学的源 https://www.cnblogs.com/shanhubei/p/18104430 deb https://mirrors.tuna.t…

鲲鹏麒麟安装Kafka-v1.1.1

因项目需要在鲲鹏麒麟服务器上安装Kafka v1.1.1&#xff0c;因此这里将安装配置过程记录下来。 环境说明 # 查看系统相关详细信息 [roottest kafka_2.12-1.1.1]# uname -a Linux test.novalocal 4.19.148 #1 SMP Mon Oct 5 22:04:46 EDT 2020 aarch64 aarch64 aarch64 GNU/Li…

UE5编辑器下将RenderTarget输出为UTexture并保存

在使用UE5开发项目时&#xff0c;RenderTarget是一种非常强大的工具&#xff0c;常用于生成实时纹理效果、后处理和调试。而将RenderTarget的内容转换为UTexture并储存&#xff0c;是许多编辑器内的需求都需要的功能。 1.材质球输出至Texture 首先创建一个Actor类&#xff0c…

电容Q值、损耗角、应用

电容发热的主要原因&#xff1a;纹波电压 当电容两端施加纹波电压时&#xff0c;电容承受的是变化的电压&#xff0c;由于电容内部存在寄生电阻&#xff08;ESR&#xff09;和寄生电感&#xff08;ESL&#xff09;.因此电容会有能量损耗&#xff0c;从而产生热量&#xff0c;这…

go-zero(十三)使用MapReduce并发

go zero 使用MapReduce并发 一、MapReduce 介绍 MapReduce 是一种用于并行计算的编程模型&#xff0c;特别适合在大规模数据处理场景中简化逻辑代码。 官方文档&#xff1a; https://go-zero.dev/docs/components/mr 1. MapReduce 的核心概念 在 MapReduce 中&#xff0c;主…

入门pytorch-Transformer

前言 虽然Transformer是2017年由Google推出&#xff0c;如果按照读论文只读近两年的思路看&#xff0c;那它无疑是过时的&#xff0c;但可惜的是&#xff0c;目前很多论文的核心依然是Transformer&#xff0c;或者由其进行改进的&#xff0c;故本文使用pytorch来搭建一下Trans…

利用代理IP爬取Zillow房产数据用于数据分析

引言 最近数据分析的热度在编程社区不断攀升&#xff0c;有很多小伙伴都开始学习或从事数据采集相关的工作。然而&#xff0c;网站数据已经成为网站的核心资产&#xff0c;许多网站都会设置一系列很复杂的防范措施&#xff0c;阻止外部人员随意采集其数据。为了解决这个问题&a…

精品基于Python实现的微信小程序校园导航系统-微信小程序

[含文档PPT源码等] [包运行成功永久免费答疑辅导] 《django微信小程序校园导航系统》该项目采用技术Python的django框架、mysql数据库 &#xff0c;项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、核心代码介绍视频等 软件开发环境及开发工具&#xf…

动手学深度学习-线性神经网络-7softmax回归的简洁实现

目录 初始化模型参数 重新审视Softmax的实现 优化算法 训练 小结 在 线性回归的实现中&#xff0c; 我们发现通过深度学习框架的高级API能够使实现 线性回归变得更加容易。 同样&#xff0c;通过深度学习框架的高级API也能更方便地实现softmax回归模型。 本节如在上一节…

09篇--图片的水印添加(掩膜的运用)

如何添加水印&#xff1f; 添加水印其实可以理解为将一张图片中的某个物体或者图案提取出来&#xff0c;然后叠加到另一张图片上。具体的操作思想是通过将原始图片转换成灰度图&#xff0c;并进行二值化处理&#xff0c;去除背景部分&#xff0c;得到一个类似掩膜的图像。然后…

封装数组去重的方法

前言 之前在工作中我一直在用lodash这个方法库&#xff0c;前段时间又接触了更现代化的方法库radash&#xff0c;这两个方法库可以说是各有优劣&#xff0c;lodash中有很实用的cloneDeep&#xff0c;radash中则有tryit、all等异步方法&#xff0c;它们都无法做到完全代替对方。…

前端成长之路:CSS复合选择器

复合选择器 在CSS中&#xff0c;可以根据选择器的类型将选择器分为基础选择器和复合选择器。 基础选择器就是前面提到过的类选择器、id选择器、标签选择器等&#xff1b;而复合选择器就是在基础选择器的基础之上&#xff0c;将基本选择器进行组合形成的。 复合选择器是由两个及…

在数字孪生开发领域threejs现在的最新版本已经更新到多少了?

在数字孪生开发领域three.js现在的最新版本已经更新到多少了&#xff1f; 在数字孪生开发领域&#xff0c;three.js作为一款强大的JavaScript 3D库&#xff0c;广泛应用于Web3D可视化、智慧城市、智慧园区、数字孪生等多个领域。随着技术的不断进步和需求的日益增长&#xff0…

HTML入门级学习笔记1【超详细】

目录 一、计算机基础知识 2.1 文件和文件夹管理 2.2 特殊按键和快捷键 2.3 打字速度 二、互联网的原理 3.1 上网就是请求数据 3.2 服务器 3.3 浏览器 3.4 HTTP 三、HTML初步认识 4.1 认识什么是纯文本文件txt 4.2 HTML是负责描述文档语义的语言 四、Sublime 五、HTML骨架和基本…

【网络】传输层协议UDP/TCP网络层IP数据链路层MACNAT详解

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;计算机网络原理_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.传输层协议 UDP 1.1 传输层 1.2 端口号 1.3 UDP 协议 1.3.1 UDP 协议端格式 1.3.2 UDP 的特点 1.3.3 面向数据报 1…

计算机网络技术基础:3.计算机网络的拓扑结构

网络拓扑结构是指用传输媒体互连各种设备的物理布局&#xff0c;即用什么方式把网络中的计算机等设备连接起来。将工作站、服务站等网络设备抽象为点&#xff0c;称为“节点”&#xff1b;将通信线路抽象为线&#xff0c;称为“链路”。由节点和链路构成的抽象结构就是网络拓扑…