Python的Darts庫實(shí)現(xiàn)時(shí)間序列預(yù)測(cè)
在人工智能和數(shù)據(jù)分析領(lǐng)域,時(shí)間序列預(yù)測(cè) 是一個(gè)極其重要的分支,它貫穿了金融、能源、醫(yī)療、交通、零售等多個(gè)行業(yè)。從預(yù)測(cè)股票價(jià)格、能源消耗,到銷售量、疾病傳播趨勢(shì),時(shí)間序列建模已成為數(shù)據(jù)科學(xué)家必須掌握的核心技能。
而在 Python 生態(tài)中,有一個(gè)優(yōu)雅且功能強(qiáng)大的時(shí)間序列預(yù)測(cè)庫正在迅速流行起來,它就是——Darts。
本文將深入解析 Darts 庫的設(shè)計(jì)理念、核心組件、使用方法和典型應(yīng)用案例,幫助你快速掌握這一工具并將其用于實(shí)際項(xiàng)目中。
目錄
- 什么是 Darts?
- 安裝與基本配置
- 時(shí)間序列數(shù)據(jù)結(jié)構(gòu)與預(yù)處理
- 多種模型接口:ARIMA、Prophet、RNN、Transformer 等
- 模型訓(xùn)練與評(píng)估
- 多變量、多步預(yù)測(cè)與反向驗(yàn)證
- 實(shí)戰(zhàn)案例:預(yù)測(cè)電力消耗曲線
- 與其他時(shí)間序列工具對(duì)比
- 優(yōu)勢(shì)與局限性
- 總結(jié)與展望
一、什么是 Darts?
Darts 是一個(gè) Python 時(shí)間序列分析和預(yù)測(cè)庫,由 Unit8 公司開發(fā),目標(biāo)是提供一個(gè)統(tǒng)一、簡(jiǎn)單的接口來使用包括經(jīng)典統(tǒng)計(jì)模型、機(jī)器學(xué)習(xí)模型和深度學(xué)習(xí)模型在內(nèi)的各種時(shí)間序列方法。
“從 ARIMA 到 Transformer,只用幾行代碼。”——這是 Darts 的宗旨。
核心功能包括:
- 單變量與多變量預(yù)測(cè)
- 單步與多步預(yù)測(cè)(Recursive, Direct, Mixed)
- 時(shí)間序列的平滑、差分、歸一化等預(yù)處理工具
- 集成多個(gè)主流模型(ARIMA、Prophet、LSTM、NBEATS、Transformer、XGBoost)
- 模型組合與集成
- 時(shí)間序列回測(cè)與評(píng)估
- 與 pandas/Numpy 深度集成,極易上手
二、安裝與基本配置
安裝 Darts
pip install u8darts[all] # 安裝所有依賴,包括深度學(xué)習(xí)模型
或者只安裝核心功能:
pip install u8darts
注意:建議使用 Python 3.8+ 環(huán)境,并提前安裝 PyTorch、lightgbm、xgboost 等依賴包。
導(dǎo)入基礎(chǔ)模塊
from darts import TimeSeries from darts.models import NBEATSModel, ExponentialSmoothing from darts.metrics import mape
三、時(shí)間序列數(shù)據(jù)結(jié)構(gòu)與預(yù)處理
在 Darts 中,核心數(shù)據(jù)結(jié)構(gòu)是 TimeSeries 對(duì)象,類似于 pandas DataFrame 但為時(shí)間序列優(yōu)化。
創(chuàng)建一個(gè)簡(jiǎn)單序列:
import pandas as pd
from darts import TimeSeries
df = pd.read_csv("air_passengers.csv", parse_dates=["Month"])
series = TimeSeries.from_dataframe(df, "Month", "#Passengers")
常見預(yù)處理操作:
# 插值填補(bǔ)缺失值 series = series.interpolate() # 平滑處理 smoothed = series.rolling(window=12) # 歸一化 from darts.dataprocessing.transformers import Scaler scaler = Scaler() normalized = scaler.fit_transform(series)
四、多種模型接口:從經(jīng)典到深度學(xué)習(xí)
Darts 內(nèi)置多種模型,統(tǒng)一 API:
| 模型類別 | 模型名稱 |
|---|---|
| 統(tǒng)計(jì)模型 | ARIMA, ExponentialSmoothing, Theta, KalmanFilter |
| ML 模型 | RegressionModel (支持 XGBoost, LightGBM) |
| DL 模型 | RNN, LSTM, NBEATS, Transformer, TCN, BlockRNN |
| 外部模型 | Prophet, TBATS |
示例:使用 ARIMA
from darts.models import ARIMA model = ARIMA() model.fit(series[:-36]) forecast = model.predict(36)
使用深度模型(如 N-BEATS)
model = NBEATSModel(input_chunk_length=36, output_chunk_length=12, n_epochs=100) model.fit(series[:-36]) forecast = model.predict(36)
五、模型訓(xùn)練與評(píng)估
劃分訓(xùn)練集與測(cè)試集
train, val = series.split_before(0.8)
訓(xùn)練與預(yù)測(cè)
model = ExponentialSmoothing() model.fit(train) pred = model.predict(len(val))
評(píng)估結(jié)果
from darts.metrics import mape
error = mape(val, pred)
print(f"MAPE: {error:.2f}%")
還可以使用 RMSE、MASE、sMAPE 等指標(biāo)。
六、多變量、多步預(yù)測(cè)與回測(cè)
Darts 非常適合多變量預(yù)測(cè)和多步預(yù)測(cè),適合多特征建模。
多變量輸入:
# 將多個(gè) TimeSeries 合并為 multivariate series combined = TimeSeries.from_dataframe(df, time_col="Date", value_cols=["Temp", "Humidity", "PowerLoad"])
多步預(yù)測(cè)策略:
- Direct:為每一個(gè)未來時(shí)間點(diǎn)訓(xùn)練一個(gè)獨(dú)立模型;
- Recursive:一個(gè)模型遞歸預(yù)測(cè);
- Mixed:結(jié)合兩者優(yōu)點(diǎn)。
Darts 的模型大部分支持這三種策略,自動(dòng)處理長(zhǎng)序列預(yù)測(cè)問題。
七、實(shí)戰(zhàn)案例:電力負(fù)荷預(yù)測(cè)
我們以電力系統(tǒng)的負(fù)荷曲線為例,預(yù)測(cè)未來一周的電力需求。
Step 1:加載數(shù)據(jù)
df = pd.read_csv("power_load.csv", parse_dates=["timestamp"])
series = TimeSeries.from_dataframe(df, "timestamp", "load_kw")
Step 2:訓(xùn)練集與測(cè)試集劃分
train, val = series.split_before(pd.Timestamp("2023-06-01"))
Step 3:建立模型并訓(xùn)練
model = TransformerModel(input_chunk_length=48, output_chunk_length=24, n_epochs=150) model.fit(train)
Step 4:預(yù)測(cè)與評(píng)估
forecast = model.predict(n=72) mape_score = mape(val[:72], forecast)
Step 5:可視化結(jié)果
series.plot(label="Actual") forecast.plot(label="Forecast")
結(jié)果曲線可以明顯看出模型預(yù)測(cè)能力強(qiáng),且具有平滑性。
八、與其他時(shí)間序列庫對(duì)比
| 特性 | Darts | Prophet | statsmodels | gluonts | sktime |
|---|---|---|---|---|---|
| 多模型統(tǒng)一接口 | ? | ? | ? | ? | ? |
| 多步預(yù)測(cè)支持 | ? | ? | ? | ? | ? |
| 深度學(xué)習(xí)支持 | ? | ? | ? | ? | ? |
| 多變量支持 | ? | 部分 | ? | ? | ? |
| 易用性 | ???? | ??? | ?? | ?? | ??? |
九、優(yōu)勢(shì)與局限性分析
? 優(yōu)勢(shì):
- 統(tǒng)一 API:無論是 ARIMA 還是 LSTM,一套接口調(diào)用;
- 模型豐富:融合統(tǒng)計(jì)與深度模型,適配各種數(shù)據(jù);
- 可擴(kuò)展性強(qiáng):支持定制模型、集成多個(gè)模型;
- 支持 PyTorch 后端:深度模型訓(xùn)練快速;
- 強(qiáng)大的時(shí)間序列處理模塊:平滑、差分、補(bǔ)全、歸一化一步到位;
- 回測(cè)與模型選擇模塊完善:可以實(shí)現(xiàn)自動(dòng)模型選擇。
? 局限性:
- 模型訓(xùn)練速度相較 scikit-learn 稍慢;
- 深度學(xué)習(xí)模型訓(xùn)練需 GPU 否則效率低;
- 在大規(guī)模部署場(chǎng)景下還需與其它工具配合(如 Apache Kafka);
- 學(xué)習(xí)曲線相對(duì) Prophet、statsmodels 略高。
十、總結(jié)與展望
Darts 是當(dāng)前 Python 時(shí)間序列預(yù)測(cè)領(lǐng)域功能最全、結(jié)構(gòu)最優(yōu)雅的庫之一,適合數(shù)據(jù)科學(xué)家、研究人員與開發(fā)者快速構(gòu)建預(yù)測(cè)系統(tǒng)。
無論你是做傳統(tǒng)的財(cái)務(wù)指標(biāo)預(yù)測(cè),還是深度學(xué)習(xí)驅(qū)動(dòng)的能源需求預(yù)測(cè),Darts 都提供了強(qiáng)大而靈活的工具鏈。隨著其社區(qū)持續(xù)擴(kuò)展,未來有望成為時(shí)間序列領(lǐng)域的“scikit-learn”。
到此這篇關(guān)于Python的Darts庫實(shí)現(xiàn)時(shí)間序列預(yù)測(cè)的文章就介紹到這了,更多相關(guān)Python Darts庫時(shí)間序列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python腳本將絕對(duì)url替換為相對(duì)url的教程
這篇文章主要介紹了使用Python腳本將絕對(duì)url替換為相對(duì)url的教程,腳本代碼非常簡(jiǎn)單,需要的朋友可以參考下2015-04-04
python執(zhí)行shell并獲取結(jié)果的詳細(xì)示例
在Python中執(zhí)行Shell命令并獲取其結(jié)果,通??梢允褂胹ubprocess模塊,這個(gè)模塊允許我們啟動(dòng)新的進(jìn)程,連接到它們的輸入/輸出/錯(cuò)誤管道,并獲取它們的返回碼,下面是一個(gè)詳細(xì)的示例,展示了如何使用subprocess.run()函數(shù)來執(zhí)行Shell命令并獲取其輸出,需要的朋友可以參考下2024-07-07
Flask實(shí)現(xiàn)swagger在線文檔與接口測(cè)試流程詳解
Flask是一個(gè)使用Python編寫的輕量級(jí)Web應(yīng)用框架。其WSGI工具箱采用 Werkzeug,模板引擎則使用Jinja2。Flask使用 BSD 授權(quán)。Flask也被稱為“microframework”,因?yàn)樗褂煤?jiǎn)單的核心,用 extension 增加其他功能,本篇帶你用Flask實(shí)現(xiàn)swagger在線文檔與接口測(cè)試2022-07-07
pytorch自動(dòng)求梯度autograd的實(shí)現(xiàn)
autograd是一個(gè)自動(dòng)微分引擎,它可以自動(dòng)計(jì)算張量的梯度,本文主要介紹了pytorch自動(dòng)求梯度autograd的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2025-04-04
基于Python實(shí)現(xiàn)圖片批量加水印的方法
我們經(jīng)常有有這樣的經(jīng)歷:辛辛苦苦制作的原創(chuàng)圖片、精心拍攝的作品、耗費(fèi)心血設(shè)計(jì)的宣傳圖,剛發(fā)布到網(wǎng)上,沒過多久,就發(fā)現(xiàn)被別人盜用維 權(quán)耗時(shí)耗力,讓人沮喪,今天,我們將深入Python圖片處理的世界,手把手教你如何基于Python實(shí)現(xiàn)圖片批量加水印,需要的朋友可以參考下2025-11-11
python使用opencv resize圖像不進(jìn)行插值的操作
這篇文章主要介紹了python使用opencv resize圖像不進(jìn)行插值的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07
Python增強(qiáng)賦值和共享引用注意事項(xiàng)小結(jié)
這篇文章主要給大家介紹了關(guān)于Python增強(qiáng)賦值和共享引用注意事項(xiàng)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
Python實(shí)現(xiàn)GUI計(jì)算器(附源碼)
這篇文章主要為大家詳細(xì)介紹了如何利用Python語言實(shí)現(xiàn)GUI計(jì)算器,可執(zhí)行復(fù)雜運(yùn)算,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2022-11-11

