Python的Darts庫實現(xiàn)時間序列預(yù)測
在人工智能和數(shù)據(jù)分析領(lǐng)域,時間序列預(yù)測 是一個極其重要的分支,它貫穿了金融、能源、醫(yī)療、交通、零售等多個行業(yè)。從預(yù)測股票價格、能源消耗,到銷售量、疾病傳播趨勢,時間序列建模已成為數(shù)據(jù)科學(xué)家必須掌握的核心技能。
而在 Python 生態(tài)中,有一個優(yōu)雅且功能強(qiáng)大的時間序列預(yù)測庫正在迅速流行起來,它就是——Darts。
本文將深入解析 Darts 庫的設(shè)計理念、核心組件、使用方法和典型應(yīng)用案例,幫助你快速掌握這一工具并將其用于實際項目中。
目錄
- 什么是 Darts?
- 安裝與基本配置
- 時間序列數(shù)據(jù)結(jié)構(gòu)與預(yù)處理
- 多種模型接口:ARIMA、Prophet、RNN、Transformer 等
- 模型訓(xùn)練與評估
- 多變量、多步預(yù)測與反向驗證
- 實戰(zhàn)案例:預(yù)測電力消耗曲線
- 與其他時間序列工具對比
- 優(yōu)勢與局限性
- 總結(jié)與展望
一、什么是 Darts?
Darts 是一個 Python 時間序列分析和預(yù)測庫,由 Unit8 公司開發(fā),目標(biāo)是提供一個統(tǒng)一、簡單的接口來使用包括經(jīng)典統(tǒng)計模型、機(jī)器學(xué)習(xí)模型和深度學(xué)習(xí)模型在內(nèi)的各種時間序列方法。
“從 ARIMA 到 Transformer,只用幾行代碼。”——這是 Darts 的宗旨。
核心功能包括:
- 單變量與多變量預(yù)測
- 單步與多步預(yù)測(Recursive, Direct, Mixed)
- 時間序列的平滑、差分、歸一化等預(yù)處理工具
- 集成多個主流模型(ARIMA、Prophet、LSTM、NBEATS、Transformer、XGBoost)
- 模型組合與集成
- 時間序列回測與評估
- 與 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ù)據(jù)結(jié)構(gòu)與預(yù)處理
在 Darts 中,核心數(shù)據(jù)結(jié)構(gòu)是 TimeSeries 對象,類似于 pandas DataFrame 但為時間序列優(yōu)化。
創(chuàng)建一個簡單序列:
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)計模型 | 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)練與評估
劃分訓(xùn)練集與測試集
train, val = series.split_before(0.8)
訓(xùn)練與預(yù)測
model = ExponentialSmoothing() model.fit(train) pred = model.predict(len(val))
評估結(jié)果
from darts.metrics import mape
error = mape(val, pred)
print(f"MAPE: {error:.2f}%")
還可以使用 RMSE、MASE、sMAPE 等指標(biāo)。
六、多變量、多步預(yù)測與回測
Darts 非常適合多變量預(yù)測和多步預(yù)測,適合多特征建模。
多變量輸入:
# 將多個 TimeSeries 合并為 multivariate series combined = TimeSeries.from_dataframe(df, time_col="Date", value_cols=["Temp", "Humidity", "PowerLoad"])
多步預(yù)測策略:
- Direct:為每一個未來時間點訓(xùn)練一個獨立模型;
- Recursive:一個模型遞歸預(yù)測;
- Mixed:結(jié)合兩者優(yōu)點。
Darts 的模型大部分支持這三種策略,自動處理長序列預(yù)測問題。
七、實戰(zhàn)案例:電力負(fù)荷預(yù)測
我們以電力系統(tǒng)的負(fù)荷曲線為例,預(yù)測未來一周的電力需求。
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)練集與測試集劃分
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ù)測與評估
forecast = model.predict(n=72) mape_score = mape(val[:72], forecast)
Step 5:可視化結(jié)果
series.plot(label="Actual") forecast.plot(label="Forecast")
結(jié)果曲線可以明顯看出模型預(yù)測能力強(qiáng),且具有平滑性。
八、與其他時間序列庫對比
| 特性 | Darts | Prophet | statsmodels | gluonts | sktime |
|---|---|---|---|---|---|
| 多模型統(tǒng)一接口 | ? | ? | ? | ? | ? |
| 多步預(yù)測支持 | ? | ? | ? | ? | ? |
| 深度學(xué)習(xí)支持 | ? | ? | ? | ? | ? |
| 多變量支持 | ? | 部分 | ? | ? | ? |
| 易用性 | ???? | ??? | ?? | ?? | ??? |
九、優(yōu)勢與局限性分析
? 優(yōu)勢:
- 統(tǒng)一 API:無論是 ARIMA 還是 LSTM,一套接口調(diào)用;
- 模型豐富:融合統(tǒng)計與深度模型,適配各種數(shù)據(jù);
- 可擴(kuò)展性強(qiáng):支持定制模型、集成多個模型;
- 支持 PyTorch 后端:深度模型訓(xùn)練快速;
- 強(qiáng)大的時間序列處理模塊:平滑、差分、補(bǔ)全、歸一化一步到位;
- 回測與模型選擇模塊完善:可以實現(xiàn)自動模型選擇。
? 局限性:
- 模型訓(xùn)練速度相較 scikit-learn 稍慢;
- 深度學(xué)習(xí)模型訓(xùn)練需 GPU 否則效率低;
- 在大規(guī)模部署場景下還需與其它工具配合(如 Apache Kafka);
- 學(xué)習(xí)曲線相對 Prophet、statsmodels 略高。
十、總結(jié)與展望
Darts 是當(dāng)前 Python 時間序列預(yù)測領(lǐng)域功能最全、結(jié)構(gòu)最優(yōu)雅的庫之一,適合數(shù)據(jù)科學(xué)家、研究人員與開發(fā)者快速構(gòu)建預(yù)測系統(tǒng)。
無論你是做傳統(tǒng)的財務(wù)指標(biāo)預(yù)測,還是深度學(xué)習(xí)驅(qū)動的能源需求預(yù)測,Darts 都提供了強(qiáng)大而靈活的工具鏈。隨著其社區(qū)持續(xù)擴(kuò)展,未來有望成為時間序列領(lǐng)域的“scikit-learn”。
到此這篇關(guān)于Python的Darts庫實現(xiàn)時間序列預(yù)測的文章就介紹到這了,更多相關(guān)Python Darts庫時間序列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python執(zhí)行shell并獲取結(jié)果的詳細(xì)示例
在Python中執(zhí)行Shell命令并獲取其結(jié)果,通常可以使用subprocess模塊,這個模塊允許我們啟動新的進(jìn)程,連接到它們的輸入/輸出/錯誤管道,并獲取它們的返回碼,下面是一個詳細(xì)的示例,展示了如何使用subprocess.run()函數(shù)來執(zhí)行Shell命令并獲取其輸出,需要的朋友可以參考下2024-07-07
Flask實現(xiàn)swagger在線文檔與接口測試流程詳解
Flask是一個使用Python編寫的輕量級Web應(yīng)用框架。其WSGI工具箱采用 Werkzeug,模板引擎則使用Jinja2。Flask使用 BSD 授權(quán)。Flask也被稱為“microframework”,因為它使用簡單的核心,用 extension 增加其他功能,本篇帶你用Flask實現(xiàn)swagger在線文檔與接口測試2022-07-07
python使用opencv resize圖像不進(jìn)行插值的操作
這篇文章主要介紹了python使用opencv resize圖像不進(jìn)行插值的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
Python增強(qiáng)賦值和共享引用注意事項小結(jié)
這篇文章主要給大家介紹了關(guān)于Python增強(qiáng)賦值和共享引用注意事項的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05

