[{"data":1,"prerenderedAt":1191},["ShallowReactive",2],{"i-lucide:chevron-down":3,"i-lucide:arrow-right":8,"i-lucide:menu":10,"i-c-brand:datalayers":12,"i-simple-icons:github":16,"blog-time-series-forecasting-with-datalayers-and-timesfm25":18,"i-lucide:copy":1185,"i-lucide:arrow-left":1187,"i-lucide:hash":1189},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m6 9l6 6l6-6\"/>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14m-7-7l7 7l-7 7\"/>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":11},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 5h16M4 12h16M4 19h16\"/>",{"left":4,"top":4,"width":13,"height":14,"rotate":4,"vFlip":6,"hFlip":6,"body":15},52,48,"\u003Cg fill=\"none\">\u003Cpath d=\"M22.2964 48C21.6952 48 21.144 47.8497 20.5929 47.5491L1.70355 36.7766C0.651357 36.1754 0 35.0731 0 33.8205C0 32.5679 0.651357 31.4656 1.70355 30.8643L20.5929 20.0919C21.6451 19.4906 22.9478 19.4906 24 20.0919L42.8893 30.8643C43.9916 31.4656 44.5929 32.5679 44.5929 33.8205C44.5929 35.0731 43.9415 36.1754 42.8893 36.7766L24 47.5491C23.4489 47.8497 22.8977 48 22.2964 48ZM22.2964 22.8476C22.2463 22.8476 22.2463 22.8476 22.1962 22.8977L3.30689 33.6702C3.25678 33.6702 3.20668 33.7203 3.20668 33.8205C3.20668 33.9207 3.25678 33.9708 3.30689 33.9708L22.1962 44.7432C22.2463 44.7933 22.3466 44.7933 22.3967 44.7432L41.286 33.9708C41.3361 33.9708 41.3862 33.9207 41.3862 33.8205C41.3862 33.7203 41.3361 33.6702 41.286 33.6702L22.3967 22.8977C22.3466 22.8977 22.3466 22.8476 22.2964 22.8476Z\" fill=\"#37D3E9\"/>\n\u003Cpath d=\"M50.4551 25.5532L29.5616 37.4781C29.0104 37.7787 28.309 37.7787 27.7578 37.4781L6.86428 25.5532C5.66178 24.8518 5.66178 23.0981 6.86428 22.3967L27.7578 10.5219C28.309 10.2213 29.0104 10.2213 29.5616 10.5219L50.4551 22.4468C51.6576 23.1482 51.6576 24.9019 50.4551 25.5532Z\" fill=\"#523BDE\"/>\n\u003Cpath d=\"M22.2964 28.3591C21.6952 28.3591 21.144 28.2088 20.5929 27.9081L1.70355 17.1357C0.651357 16.5344 0 15.4321 0 14.1795C0 12.9269 0.651357 11.8246 1.70355 11.2234L20.5929 0.450939C21.6451 -0.150313 22.9478 -0.150313 24 0.450939L42.8893 11.2234C43.9916 11.8246 44.5929 12.9269 44.5929 14.1795C44.5929 15.4321 43.9415 16.5344 42.8893 17.1357L24 27.9081C23.4489 28.2088 22.8977 28.3591 22.2964 28.3591ZM22.2964 3.20668C22.2463 3.20668 22.2463 3.20668 22.1962 3.25678L3.30689 14.0292C3.25678 14.0292 3.20668 14.0793 3.20668 14.1795C3.20668 14.2797 3.25678 14.3299 3.30689 14.3299L22.1962 25.1023C22.2463 25.1524 22.3466 25.1524 22.3967 25.1023L41.286 14.3299C41.3361 14.3299 41.3862 14.2797 41.3862 14.1795C41.3862 14.0793 41.3361 14.0292 41.286 14.0292L22.3967 3.25678C22.3466 3.25678 22.3466 3.20668 22.2964 3.20668Z\" fill=\"#37D3E9\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":17},"\u003Cpath fill=\"currentColor\" d=\"M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"/>",{"id":19,"title":20,"author":21,"body":22,"date":1174,"description":1175,"extension":1176,"img":1177,"meta":1178,"navigation":298,"path":1179,"seo":1180,"stem":1181,"tags":1182,"__hash__":1184},"blog_zh/blog/time-series-forecasting-with-datalayers-and-timesfm25.md","工业时序数据预测：Datalayers × TimesFM 2.5 端到端实践","Datalayers Team",{"type":23,"value":24,"toc":1160},"minimark",[25,29,33,36,65,68,78,81,84,93,100,103,107,112,115,129,132,141,146,172,177,239,250,253,256,629,636,645,649,658,704,707,710,1102,1112,1121,1124,1131,1134,1137,1142,1145,1148,1156],[26,27,28],"h2",{"id":28},"概述",[30,31,32],"p",{},"随着工业物联网、智能制造的深度推进，企业对数据驱动决策的需求迎来爆发式增长，时序预测已成为生产运维、能耗管理、供应链优化等核心场景的关键能力，企业用户将 “平台能否提供开箱即用的行业智能算法与模型” 作为时序数据平台选型的核心指标。\n但在工业场景落地中，传统时序预测方案正面临多重难以突破的瓶颈：",[30,34,35],{},"但在工业场景落地中，传统时序预测方案正面临多重难以突破的瓶颈：",[37,38,39,47,53,59],"ul",{},[40,41,42,46],"li",{},[43,44,45],"strong",{},"高频海量数据处理压力陡增","：工业设备分钟级甚至亚秒级的振动、电流、压力、能耗等指标持续上传，数据维度与规模急剧膨胀，传统统计模型与机器学习方案的特征工程、模型维护成本指数级上升，极易出现异常漏报、预测误报。",[40,48,49,52],{},[43,50,51],{},"预测精度与前瞻性要求严苛","：非计划停机带来的巨大损失、双碳目标下的能耗刚性约束，都对预测的精准度、长周期预测能力提出了极高要求。",[40,54,55,58],{},[43,56,57],{},"异构数据适配成本高","：不同工厂、产线、设备的采样频率、字段规范、数据单位、缺失模式差异极大，传统方案需要大量手工对齐、数据补齐与定制化特征工程，落地周期长、复用性差。",[40,60,61,64],{},[43,62,63],{},"多场景模型运维复杂","：预测性维护、负荷预测、备件需求、质量趋势等场景往往需要独立建模，形成庞大的模型群，运维成本高、迭代效率低，同时难以满足工业场景 “数据不出域” 的安全合规要求。",[30,66,67],{},"基于此，时序数据库 + 预训练时序大模型的组合方案，成为破解上述痛点的最优解之一。本文将详细介绍 Google Research 开源的 TimesFM 2.5 时序基础模型，与 Datalayers 时序数据库的深度融合方案，提供可直接复现的端到端落地实践，帮助企业快速搭建低成本、高可用、泛化能力强的时序预测体系。",[30,69,70,77],{},[71,72,76],"a",{"href":73,"rel":74},"https://github.com/google-research/timesfm",[75],"nofollow","TimesFM2.5"," 是 Google 于2025年9月发布的 TimesFM(Time Series Foundation Model)系列模型最新版本 。这是一种表现优秀的时序预测模型，且经过了预训练，部署与使用十分简单。在工业领域也有良好的发挥。",[30,79,80],{},"本文通过 Datalayers + TimesFM2.5 的结合，实现时序数据预测。",[26,82,83],{"id":83},"模型表现",[30,85,86,87,92],{},"以下是基于 ",[71,88,91],{"href":89,"rel":90},"https://www.kaggle.com/datasets/saurabhshahane/electricity-load-forecasting",[75],"Electricity Load Forecasting"," 数据集，使用 TimesFM2.5，模型 context 长度 10240，预测 horizon 48 的结果：",[30,94,95],{},[96,97],"img",{"alt":98,"src":99},"forecasting","/img/blog/time-series-forecasting/forecasting-demo.png",[26,101,102],{"id":102},"端到端实践",[104,105,106],"h3",{"id":106},"环境要求",[37,108,109],{},[40,110,111],{},"python >= 3.10",[104,113,114],{"id":114},"需要的依赖库",[37,116,117,120,123,126],{},[40,118,119],{},"flightsql-dbapi 0.2.2（用于连接Datalayers）",[40,121,122],{},"pandas 2.3.3",[40,124,125],{},"matplotlib 3.10.8",[40,127,128],{},"kagglehub 1.0.0（用于获取数据集）",[104,130,131],{"id":131},"模型安装",[30,133,134,135,140],{},"具体安装步骤可以参考",[71,136,139],{"href":137,"rel":138},"https://github.com/google-research/timesfm/blob/master/README.md",[75],"TimesFM"," ，本文给出 conda 虚拟环境，python=3.10的模型安装过程。",[37,142,143],{},[40,144,145],{},"拉取模型源码",[147,148,153],"pre",{"className":149,"code":150,"language":151,"meta":152,"style":152},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git clone https://github.com/google-research/timesfm.git\n","shell","",[154,155,156],"code",{"__ignoreMap":152},[157,158,161,165,169],"span",{"class":159,"line":160},"line",1,[157,162,164],{"class":163},"sBMFI","git",[157,166,168],{"class":167},"sfazB"," clone",[157,170,171],{"class":167}," https://github.com/google-research/timesfm.git\n",[37,173,174],{},[40,175,176],{},"创建虚拟环境，并安装 TimesFM2.5",[147,178,180],{"className":149,"code":179,"language":151,"meta":152,"style":152},"conda create -n tsforecast python=3.10 pip -y\nconda activate tsforecast\npip install -e .[torch] # 本文以torch版本为例\n",[154,181,182,209,220],{"__ignoreMap":152},[157,183,184,187,190,193,196,199,203,206],{"class":159,"line":160},[157,185,186],{"class":163},"conda",[157,188,189],{"class":167}," create",[157,191,192],{"class":167}," -n",[157,194,195],{"class":167}," tsforecast",[157,197,198],{"class":167}," python=",[157,200,202],{"class":201},"sbssI","3.10",[157,204,205],{"class":167}," pip",[157,207,208],{"class":167}," -y\n",[157,210,212,214,217],{"class":159,"line":211},2,[157,213,186],{"class":163},[157,215,216],{"class":167}," activate",[157,218,219],{"class":167}," tsforecast\n",[157,221,223,226,229,232,235],{"class":159,"line":222},3,[157,224,225],{"class":163},"pip",[157,227,228],{"class":167}," install",[157,230,231],{"class":167}," -e",[157,233,234],{"class":167}," .[torch]",[157,236,238],{"class":237},"sHwdD"," # 本文以torch版本为例\n",[147,240,244],{"className":241,"code":242,"language":243,"meta":152,"style":152},"language-tip shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","TimesFM2.5 支持 covariate forecasting，使用前需要安装 xreg 相关的依赖。\n","tip",[154,245,246],{"__ignoreMap":152},[157,247,248],{"class":159,"line":160},[157,249,242],{},[104,251,252],{"id":252},"模型使用示例",[30,254,255],{},"以下是官方提供的一个直线和正弦曲线预测简单示例：",[147,257,261],{"className":258,"code":259,"language":260,"meta":152,"style":152},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import torch\nimport numpy as np\nimport timesfm\n\ntorch.set_float32_matmul_precision(\"high\")\n\nmodel = timesfm.TimesFM_2p5_200M_torch.from_pretrained(\"google/timesfm-2.5-200m-pytorch\")\n\nmodel.compile(\n    timesfm.ForecastConfig(\n        max_context=1024,\n        max_horizon=256,\n        normalize_inputs=True,\n        use_continuous_quantile_head=True,\n        force_flip_invariance=True,\n        infer_is_positive=True,\n        fix_quantile_crossing=True,\n    )\n)\npoint_forecast, quantile_forecast = model.forecast(\n    horizon=12,\n    inputs=[\n        np.linspace(0, 1, 100),\n        np.sin(np.linspace(0, 20, 67)),\n    ],  # Two dummy inputs\n)\npoint_forecast.shape  # (2, 12)\nquantile_forecast.shape  # (2, 12, 10): mean, then 10th to 90th quantiles.\n","python",[154,262,263,273,286,293,300,328,333,367,372,386,399,414,427,436,444,452,460,468,474,479,503,516,525,554,589,598,603,616],{"__ignoreMap":152},[157,264,265,269],{"class":159,"line":160},[157,266,268],{"class":267},"s7zQu","import",[157,270,272],{"class":271},"sTEyZ"," torch\n",[157,274,275,277,280,283],{"class":159,"line":211},[157,276,268],{"class":267},[157,278,279],{"class":271}," numpy ",[157,281,282],{"class":267},"as",[157,284,285],{"class":271}," np\n",[157,287,288,290],{"class":159,"line":222},[157,289,268],{"class":267},[157,291,292],{"class":271}," timesfm\n",[157,294,296],{"class":159,"line":295},4,[157,297,299],{"emptyLinePlaceholder":298},true,"\n",[157,301,303,306,310,314,317,320,323,325],{"class":159,"line":302},5,[157,304,305],{"class":271},"torch",[157,307,309],{"class":308},"sMK4o",".",[157,311,313],{"class":312},"s2Zo4","set_float32_matmul_precision",[157,315,316],{"class":308},"(",[157,318,319],{"class":308},"\"",[157,321,322],{"class":167},"high",[157,324,319],{"class":308},[157,326,327],{"class":308},")\n",[157,329,331],{"class":159,"line":330},6,[157,332,299],{"emptyLinePlaceholder":298},[157,334,336,339,342,345,347,351,353,356,358,360,363,365],{"class":159,"line":335},7,[157,337,338],{"class":271},"model ",[157,340,341],{"class":308},"=",[157,343,344],{"class":271}," timesfm",[157,346,309],{"class":308},[157,348,350],{"class":349},"swJcz","TimesFM_2p5_200M_torch",[157,352,309],{"class":308},[157,354,355],{"class":312},"from_pretrained",[157,357,316],{"class":308},[157,359,319],{"class":308},[157,361,362],{"class":167},"google/timesfm-2.5-200m-pytorch",[157,364,319],{"class":308},[157,366,327],{"class":308},[157,368,370],{"class":159,"line":369},8,[157,371,299],{"emptyLinePlaceholder":298},[157,373,375,378,380,383],{"class":159,"line":374},9,[157,376,377],{"class":271},"model",[157,379,309],{"class":308},[157,381,382],{"class":312},"compile",[157,384,385],{"class":308},"(\n",[157,387,389,392,394,397],{"class":159,"line":388},10,[157,390,391],{"class":312},"    timesfm",[157,393,309],{"class":308},[157,395,396],{"class":312},"ForecastConfig",[157,398,385],{"class":308},[157,400,402,406,408,411],{"class":159,"line":401},11,[157,403,405],{"class":404},"sHdIc","        max_context",[157,407,341],{"class":308},[157,409,410],{"class":201},"1024",[157,412,413],{"class":308},",\n",[157,415,417,420,422,425],{"class":159,"line":416},12,[157,418,419],{"class":404},"        max_horizon",[157,421,341],{"class":308},[157,423,424],{"class":201},"256",[157,426,413],{"class":308},[157,428,430,433],{"class":159,"line":429},13,[157,431,432],{"class":404},"        normalize_inputs",[157,434,435],{"class":308},"=True,\n",[157,437,439,442],{"class":159,"line":438},14,[157,440,441],{"class":404},"        use_continuous_quantile_head",[157,443,435],{"class":308},[157,445,447,450],{"class":159,"line":446},15,[157,448,449],{"class":404},"        force_flip_invariance",[157,451,435],{"class":308},[157,453,455,458],{"class":159,"line":454},16,[157,456,457],{"class":404},"        infer_is_positive",[157,459,435],{"class":308},[157,461,463,466],{"class":159,"line":462},17,[157,464,465],{"class":404},"        fix_quantile_crossing",[157,467,435],{"class":308},[157,469,471],{"class":159,"line":470},18,[157,472,473],{"class":308},"    )\n",[157,475,477],{"class":159,"line":476},19,[157,478,327],{"class":308},[157,480,482,485,488,491,493,496,498,501],{"class":159,"line":481},20,[157,483,484],{"class":271},"point_forecast",[157,486,487],{"class":308},",",[157,489,490],{"class":271}," quantile_forecast ",[157,492,341],{"class":308},[157,494,495],{"class":271}," model",[157,497,309],{"class":308},[157,499,500],{"class":312},"forecast",[157,502,385],{"class":308},[157,504,506,509,511,514],{"class":159,"line":505},21,[157,507,508],{"class":404},"    horizon",[157,510,341],{"class":308},[157,512,513],{"class":201},"12",[157,515,413],{"class":308},[157,517,519,522],{"class":159,"line":518},22,[157,520,521],{"class":404},"    inputs",[157,523,524],{"class":308},"=[\n",[157,526,528,531,533,536,538,541,543,546,548,551],{"class":159,"line":527},23,[157,529,530],{"class":312},"        np",[157,532,309],{"class":308},[157,534,535],{"class":312},"linspace",[157,537,316],{"class":308},[157,539,540],{"class":201},"0",[157,542,487],{"class":308},[157,544,545],{"class":201}," 1",[157,547,487],{"class":308},[157,549,550],{"class":201}," 100",[157,552,553],{"class":308},"),\n",[157,555,556,558,560,563,565,568,570,572,574,576,578,581,583,586],{"class":159,"line":5},[157,557,530],{"class":312},[157,559,309],{"class":308},[157,561,562],{"class":312},"sin",[157,564,316],{"class":308},[157,566,567],{"class":312},"np",[157,569,309],{"class":308},[157,571,535],{"class":312},[157,573,316],{"class":308},[157,575,540],{"class":201},[157,577,487],{"class":308},[157,579,580],{"class":201}," 20",[157,582,487],{"class":308},[157,584,585],{"class":201}," 67",[157,587,588],{"class":308},")),\n",[157,590,592,595],{"class":159,"line":591},25,[157,593,594],{"class":308},"    ],",[157,596,597],{"class":237},"  # Two dummy inputs\n",[157,599,601],{"class":159,"line":600},26,[157,602,327],{"class":308},[157,604,606,608,610,613],{"class":159,"line":605},27,[157,607,484],{"class":271},[157,609,309],{"class":308},[157,611,612],{"class":349},"shape",[157,614,615],{"class":237},"  # (2, 12)\n",[157,617,619,622,624,626],{"class":159,"line":618},28,[157,620,621],{"class":271},"quantile_forecast",[157,623,309],{"class":308},[157,625,612],{"class":349},[157,627,628],{"class":237},"  # (2, 12, 10): mean, then 10th to 90th quantiles.\n",[30,630,631,632],{},"forecast 是最常用的单变量预测入口，接收 horizon（预测窗口）和 inputs（预测的 batches 列表），返回形状(batch_size, horizon)的点预测 ndarray 和形状(batch_size, horizon, 10)的分位数预测 ndarray。具体 API Reference 可参考",[71,633,139],{"href":634,"rel":635},"https://github.com/google-research/timesfm/blob/master/timesfm-forecasting/references/api_reference.md",[75],[147,637,639],{"className":241,"code":638,"language":243,"meta":152,"style":152},"模型可以从 huggingface 下载或者使用本地模型权重，若使用本地模型权重，则需要将 from_pretrained 方法的模型id参数替换为本地模型权重所在目录，格式需要是 Unix 完全展开的路径格式（”~”和$开头的环境变量均无法解析）。\n",[154,640,641],{"__ignoreMap":152},[157,642,643],{"class":159,"line":160},[157,644,638],{},[104,646,648],{"id":647},"安装-datalayers","安装 Datalayers",[30,650,651,652,657],{},"此处使用 Docker 做为安装方式，更多安装方式见 ",[71,653,656],{"href":654,"rel":655},"https://docs.datalayers.cn/datalayers/latest/getting-started/ubuntu.html",[75],"Datalayers 文档","。",[147,659,661],{"className":149,"code":660,"language":151,"meta":152,"style":152},"docker run --name datalayers -d \\\n  -p 8360:8360 -p 8361:8361 \\\n  datalayers/datalayers:latest\n",[154,662,663,683,699],{"__ignoreMap":152},[157,664,665,668,671,674,677,680],{"class":159,"line":160},[157,666,667],{"class":163},"docker",[157,669,670],{"class":167}," run",[157,672,673],{"class":167}," --name",[157,675,676],{"class":167}," datalayers",[157,678,679],{"class":167}," -d",[157,681,682],{"class":271}," \\\n",[157,684,685,688,691,694,697],{"class":159,"line":211},[157,686,687],{"class":167},"  -p",[157,689,690],{"class":167}," 8360:8360",[157,692,693],{"class":167}," -p",[157,695,696],{"class":167}," 8361:8361",[157,698,682],{"class":271},[157,700,701],{"class":159,"line":222},[157,702,703],{"class":167},"  datalayers/datalayers:latest\n",[104,705,706],{"id":706},"数据准备",[30,708,709],{},"通过 dlsql 命令行工具在 Datalayers 中创建对应的 database 与 table, 如下：",[147,711,713],{"className":149,"code":712,"language":151,"meta":152,"style":152},"> create database test\nQuery OK, 0 rows affected. (0.001 sec)\n\n> use test\nDatabase changed to `test`\n\ntest > -- 在 dlsql cli 中执行\nCREATE TABLE test.electricity (\n  `datetime` TIMESTAMP(9) NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `Holiday_ID` INT32 NOT NULL,\n  `nat_demand` FLOAT32,\n  `T2M_toc` FLOAT32,\n  `QV2M_toc` FLOAT32,\n  `TQL_toc` FLOAT32,\n  `W2M_toc` FLOAT32,\n  `T2M_san` FLOAT32,\n  `QV2M_san` FLOAT32,\n  `TQL_san` FLOAT32,\n  `W2M_san` FLOAT32,\n  `T2M_dav` FLOAT32,\n  `QV2M_dav` FLOAT32,\n  `TQL_dav` FLOAT32,\n  `W2M_dav` FLOAT32,\n  `holiday` INT32,\n  `school` INT32,\n  TIMESTAMP KEY(`datetime`)\n)\nPARTITION BY HASH (`holiday`) PARTITIONS 1\nENGINE=TimeSeries\n\nQuery OK, 0 rows affected. (0.009 sec)\n",[154,714,715,723,748,752,759,779,783,805,819,836,854,866,877,888,899,910,921,932,943,954,965,976,987,998,1010,1021,1039,1043,1066,1077,1082],{"__ignoreMap":152},[157,716,717,720],{"class":159,"line":160},[157,718,719],{"class":308},">",[157,721,722],{"class":271}," create database test\n",[157,724,725,728,731,734,737,740,743,746],{"class":159,"line":211},[157,726,727],{"class":163},"Query",[157,729,730],{"class":167}," OK,",[157,732,733],{"class":201}," 0",[157,735,736],{"class":167}," rows",[157,738,739],{"class":167}," affected.",[157,741,742],{"class":271}," (0.001 ",[157,744,745],{"class":167},"sec",[157,747,327],{"class":271},[157,749,750],{"class":159,"line":222},[157,751,299],{"emptyLinePlaceholder":298},[157,753,754,756],{"class":159,"line":295},[157,755,719],{"class":308},[157,757,758],{"class":271}," use test\n",[157,760,761,764,767,770,773,776],{"class":159,"line":302},[157,762,763],{"class":163},"Database",[157,765,766],{"class":167}," changed",[157,768,769],{"class":167}," to",[157,771,772],{"class":308}," `",[157,774,775],{"class":312},"test",[157,777,778],{"class":308},"`\n",[157,780,781],{"class":159,"line":330},[157,782,299],{"emptyLinePlaceholder":298},[157,784,785,787,790,793,796,799,802],{"class":159,"line":335},[157,786,775],{"class":312},[157,788,789],{"class":308}," >",[157,791,792],{"class":167}," --",[157,794,795],{"class":167}," 在",[157,797,798],{"class":167}," dlsql",[157,800,801],{"class":167}," cli",[157,803,804],{"class":167}," 中执行\n",[157,806,807,810,813,816],{"class":159,"line":369},[157,808,809],{"class":163},"CREATE",[157,811,812],{"class":167}," TABLE",[157,814,815],{"class":167}," test.electricity",[157,817,818],{"class":271}," (\n",[157,820,821,824,827,830,833],{"class":159,"line":374},[157,822,823],{"class":308},"  `",[157,825,826],{"class":163},"datetime",[157,828,829],{"class":308},"`",[157,831,832],{"class":163}," TIMESTAMP(9",[157,834,835],{"class":271},") NOT NULL DEFAULT CURRENT_TIMESTAMP,\n",[157,837,838,840,843,845,848,851],{"class":159,"line":388},[157,839,823],{"class":308},[157,841,842],{"class":163},"Holiday_ID",[157,844,829],{"class":308},[157,846,847],{"class":163}," INT32",[157,849,850],{"class":167}," NOT",[157,852,853],{"class":167}," NULL,\n",[157,855,856,858,861,863],{"class":159,"line":401},[157,857,823],{"class":308},[157,859,860],{"class":163},"nat_demand",[157,862,829],{"class":308},[157,864,865],{"class":163}," FLOAT32,\n",[157,867,868,870,873,875],{"class":159,"line":416},[157,869,823],{"class":308},[157,871,872],{"class":163},"T2M_toc",[157,874,829],{"class":308},[157,876,865],{"class":163},[157,878,879,881,884,886],{"class":159,"line":429},[157,880,823],{"class":308},[157,882,883],{"class":163},"QV2M_toc",[157,885,829],{"class":308},[157,887,865],{"class":163},[157,889,890,892,895,897],{"class":159,"line":438},[157,891,823],{"class":308},[157,893,894],{"class":163},"TQL_toc",[157,896,829],{"class":308},[157,898,865],{"class":163},[157,900,901,903,906,908],{"class":159,"line":446},[157,902,823],{"class":308},[157,904,905],{"class":163},"W2M_toc",[157,907,829],{"class":308},[157,909,865],{"class":163},[157,911,912,914,917,919],{"class":159,"line":454},[157,913,823],{"class":308},[157,915,916],{"class":163},"T2M_san",[157,918,829],{"class":308},[157,920,865],{"class":163},[157,922,923,925,928,930],{"class":159,"line":462},[157,924,823],{"class":308},[157,926,927],{"class":163},"QV2M_san",[157,929,829],{"class":308},[157,931,865],{"class":163},[157,933,934,936,939,941],{"class":159,"line":470},[157,935,823],{"class":308},[157,937,938],{"class":163},"TQL_san",[157,940,829],{"class":308},[157,942,865],{"class":163},[157,944,945,947,950,952],{"class":159,"line":476},[157,946,823],{"class":308},[157,948,949],{"class":163},"W2M_san",[157,951,829],{"class":308},[157,953,865],{"class":163},[157,955,956,958,961,963],{"class":159,"line":481},[157,957,823],{"class":308},[157,959,960],{"class":163},"T2M_dav",[157,962,829],{"class":308},[157,964,865],{"class":163},[157,966,967,969,972,974],{"class":159,"line":505},[157,968,823],{"class":308},[157,970,971],{"class":163},"QV2M_dav",[157,973,829],{"class":308},[157,975,865],{"class":163},[157,977,978,980,983,985],{"class":159,"line":518},[157,979,823],{"class":308},[157,981,982],{"class":163},"TQL_dav",[157,984,829],{"class":308},[157,986,865],{"class":163},[157,988,989,991,994,996],{"class":159,"line":527},[157,990,823],{"class":308},[157,992,993],{"class":163},"W2M_dav",[157,995,829],{"class":308},[157,997,865],{"class":163},[157,999,1000,1002,1005,1007],{"class":159,"line":5},[157,1001,823],{"class":308},[157,1003,1004],{"class":163},"holiday",[157,1006,829],{"class":308},[157,1008,1009],{"class":163}," INT32,\n",[157,1011,1012,1014,1017,1019],{"class":159,"line":591},[157,1013,823],{"class":308},[157,1015,1016],{"class":163},"school",[157,1018,829],{"class":308},[157,1020,1009],{"class":163},[157,1022,1023,1026,1029,1031,1033,1035,1037],{"class":159,"line":600},[157,1024,1025],{"class":163},"  TIMESTAMP",[157,1027,1028],{"class":167}," KEY",[157,1030,316],{"class":308},[157,1032,829],{"class":308},[157,1034,826],{"class":163},[157,1036,829],{"class":308},[157,1038,327],{"class":308},[157,1040,1041],{"class":159,"line":605},[157,1042,327],{"class":271},[157,1044,1045,1048,1051,1054,1057,1059,1061,1063],{"class":159,"line":618},[157,1046,1047],{"class":163},"PARTITION",[157,1049,1050],{"class":167}," BY",[157,1052,1053],{"class":167}," HASH",[157,1055,1056],{"class":271}," (",[157,1058,829],{"class":308},[157,1060,1004],{"class":163},[157,1062,829],{"class":308},[157,1064,1065],{"class":271},") PARTITIONS 1\n",[157,1067,1069,1072,1074],{"class":159,"line":1068},29,[157,1070,1071],{"class":271},"ENGINE",[157,1073,341],{"class":308},[157,1075,1076],{"class":167},"TimeSeries\n",[157,1078,1080],{"class":159,"line":1079},30,[157,1081,299],{"emptyLinePlaceholder":298},[157,1083,1085,1087,1089,1091,1093,1095,1098,1100],{"class":159,"line":1084},31,[157,1086,727],{"class":163},[157,1088,730],{"class":167},[157,1090,733],{"class":201},[157,1092,736],{"class":167},[157,1094,739],{"class":167},[157,1096,1097],{"class":271}," (0.009 ",[157,1099,745],{"class":167},[157,1101,327],{"class":271},[30,1103,1104,1105,1107,1108,1111],{},"上述示例在 Datalayers 中创建了一个名为 ",[154,1106,775],{}," 的数据库，并创建了名为 electricity 的表，其中包含 nat_demand 的预测目标列。数据来源：",[71,1109,91],{"href":89,"rel":1110},[75]," 。",[30,1113,1114,1115,1120],{},"然后通过导入脚本 ",[71,1116,1119],{"href":1117,"rel":1118},"https://github.com/datalayers-io/tsforecast-demo/tree/master",[75],"tsforecast-demo"," ，将数据导入到 Datalayers 中。",[26,1122,1123],{"id":1123},"模型验证",[30,1125,1126,1127,657],{},"详细代码见",[71,1128,1119],{"href":1129,"rel":1130},"https://github.com/datalayers-io/tsforecast-demo/blob/master/example/visualization.py",[75],[30,1132,1133],{},"根据上述代码仓库说明，即可实现相关时序数据预测的验证。",[30,1135,1136],{},"效果如下：",[30,1138,1139],{},[96,1140],{"alt":98,"src":1141},"/img/blog/time-series-forecasting/forecasting.png",[26,1143,1144],{"id":1144},"总结",[30,1146,1147],{},"以上模型使用和连接 Datalayers 示例已经足够完成 Datalayers + TimesFM2.5 的最小结合。生产环境可结合已有的 Datalayers 部署，将工程化的预测服务无侵入地与 Datalayers 结合，以进行原型验证。",[30,1149,1150,1151,657],{},"本文所有代码位于 ",[71,1152,1155],{"href":1153,"rel":1154},"https://github.com/datalayers-io/tsforecast-demo",[75],"GitHub",[1157,1158,1159],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":152,"searchDepth":211,"depth":211,"links":1161},[1162,1163,1164,1172,1173],{"id":28,"depth":211,"text":28},{"id":83,"depth":211,"text":83},{"id":102,"depth":211,"text":102,"children":1165},[1166,1167,1168,1169,1170,1171],{"id":106,"depth":222,"text":106},{"id":114,"depth":222,"text":114},{"id":131,"depth":222,"text":131},{"id":252,"depth":222,"text":252},{"id":647,"depth":222,"text":648},{"id":706,"depth":222,"text":706},{"id":1123,"depth":211,"text":1123},{"id":1144,"depth":211,"text":1144},"2026-04-28","Datalayers、AI、时序数据预测、TimesFM","md","/img/blog/time-series-forecasting/cover.png",{},"/blog/time-series-forecasting-with-datalayers-and-timesfm25",{"title":20,"description":1175},"blog/time-series-forecasting-with-datalayers-and-timesfm25",[1183],"技术文章","NS8LxaY3ywCE7Y3Jf21Ss0lREi-2dKJ0Gq-0-0qu5_c",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1186},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1188},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m12 19l-7-7l7-7m7 7H5\"/>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1190},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 9h16M4 15h16M10 3L8 21m8-18l-2 18\"/>",1777544869521]