作者:雲朵君
來源:數據STUDIO
本文中,雲朵君 硬核總結了十多種時間序列數據分析和預測工具和python庫,在我們處理時間序列項目時,可以翻開本文,根據需要選擇合適的工具,將會事半功倍!
在處理時間序列項目時,數據科學家或 ML 工程師通常會使用特定的工具和庫。或者他們使用一些眾所周知的工具,而這些工具已被證明可以很好地適用與對應的時間序列項目。
如果能將這些工具匯總,在以後的項目中將會很受用。這篇文章是一個時間序列工具和包的備忘錄。其中一些是非常有名的,也有些可能是第一次聽說。不過沒關係, 先點贊加收藏,希望你以後會發現這篇文章很有用!
時間序列
時間序列是按時間順序索引的數據點序列。這是在連續時間點對同一變量的觀察。換句話說,它是在一段時間內觀察到的一組數據。具體可以參考該文章: 時間序列定義、均值、方差、自協方差及相關性 、 一文解讀時間序列基本概念
數據通常繪製為圖表上的一條線,x 軸為時間,y 軸為每個點的值。此外,時間序列有四個主要組成部分:
趨勢
季節性變化
周期性變化
隨機變化
趨勢
季節性變化
周期性變化
隨機變化
一般來說,時間序列經常被用於經濟學、數學、生物學、物理學、氣象學等許多領域。
時間序列項目示例 股票預測
股票市場預測是一個具有挑戰性和吸引力的話題,其主要目標是開發多種方法和策略來預測未來的股票價格。有很多不同的技術,從經典的算法和統計方法到複雜的神經網絡架構。共同點是它們都利用不同的時間序列來實現準確的預測。股市預測方法被業餘投資者、金融科技初創公司和大型對沖基金廣泛使用。
基本面分析著眼於公司的財務報表、管理和行業趨勢等因素。此外,它還考慮了一些宏觀經濟指標,例如通貨膨脹率、GDP、經濟狀況等。所有這些指標都是時間相關的,因此可以表示為時間序列。
與基本面分析相比, 技術分析使用交易量、價格變化和來自市場本身的其他信息的模式來預測股票未來的表現。投資者在做出投資決定之前了解這兩種方法很重要。
心電異常檢測
心電圖異常檢測是一種檢測心電圖異常的技術。心電圖是一項監測心臟電活動的測試。基本上,它是由心臟產生並表示為時間序列的電信號。
心電圖異常檢測是通過將心電圖的正常模式與異常模式進行比較來完成的。心電圖異常有多種類型,可分為以下幾類:
心率異常:這是指心率在正常範圍內的任何變化。這可能是由於心臟問題或如何刺激它。
心律異常:這是指節律與其正常模式的任何變化。這可能是由於脈衝通過心臟傳導的方式存在問題,或者它們通過心臟傳導的速度存在問題。
心率異常:這是指心率在正常範圍內的任何變化。這可能是由於心臟問題或如何刺激它。
心律異常:這是指節律與其正常模式的任何變化。這可能是由於脈衝通過心臟傳導的方式存在問題,或者它們通過心臟傳導的速度存在問題。
從學術研究到商用心電圖機,在這個主題上已經做了很多工作,並且有一些有希望的結果。最大的問題是系統應該具有很高的準確性,並且不應該有任何誤報或誤報。這是由於問題的性質和錯誤預測的後果。
時間序列項目的工具
時間序列在各個行業中的重要性,已經不用多說。接下來 看看用於時間序列項目的Python工具都有哪些。
數據準備和特徵工程工具
數據分析和可視化工具
時間序列預測工具
數據準備和特徵工程是數據科學管道中的兩個非常重要的步驟。數據準備通常是任何數據科學項目的第一步。這是將數據轉換為可用於分析和進一步處理的形式的過程。
特徵工程是從原始數據中提取特徵以使其對建模和預測更有用的過程。下面,我們將提到一些用於這些任務的最流行的工具。
Pandas 的時間序列處理
Pandas 是一個用於數據操作和分析的 Python 庫。它包括用於操作數值表和時間序列的數據結構和方法。此外,它還包含廣泛的功能和特性,可用於處理所有領域的時間序列數據。
它支持來自各種文件類型的數據輸入,包括 CSV、JSON、Parquet、SQL 資料庫表和查詢以及 Microsoft Excel。此外,Pandas 允許各種數據操作功能,例如合併、重塑、選擇以及數據清理和整理。
一些常用的時間序列特徵是:
- 日期範圍生成和頻率轉換
- 移動窗口統計
- 移動窗口線性回歸
- 日期轉換
- 滯後等等
NumPy 是一個 Python 庫,它增加了對巨大的多維數組和矩陣的支持,以及可以在這些數組上使用大量高級數學運算的函數。它的語法與 MATLAB 非常相似,包括一個高性能的多維數組對象以及處理這些數組的能力。
NumPy 的 datetime64 數據類型和數組可以非常方便地表示時間序列中的日期。使用 NumPy 還可以輕鬆地使用線性代數運算進行各種時間序列運算。
Datetime 的時間序列處理
Datetime 是一個 Python 模塊,它允許我們處理日期和時間。該模塊包含處理場景所需的方法和功能,例如:
- 日期和時間的表示
- 日期和時間的算術
- 日期和時間的比較
使用此工具處理時間序列很簡單。它允許用戶將日期和時間轉換為對象並對其進行操作。例如,只需要幾行代碼,就可以從一種 DateTime 格式轉換為另一種格式,添加到日期的天數、月數或年數,或者計算兩個時間對象之間的秒數差異。
Tsfresh 的時間序列處理
Tsfresh 是一個 Python 包。它會自動計算大量的時間序列特徵,稱為特徵。該軟體包將來自統計、時間序列分析、信號處理和非線性動力學的既定算法與強大的特徵選擇算法相結合,以提供系統的時間序列特徵提取。
Tsfresh 包包括一個過濾程序,以防止提取不相關的特徵。此過濾程序評估每個特徵對回歸或分類任務的解釋能力和重要性。
高級時間序列功能的一些示例是:
- 傅立葉變換組件
- 小波變換組件
- 偏自相關等
數據分析和可視化包是幫助數據分析師從他們的數據中創建圖形和圖表的工具。數據分析被定義為清理、轉換和建模數據的過程,以便發現對業務決策有用的信息。數據分析的目標是從數據中提取有用的信息並根據該信息做出決策。
數據的圖形表示稱為數據可視化。使用圖表和圖形等可視化元素的數據可視化工具提供了一種查看和理解數據趨勢和模式的簡便方法。
時間序列有大量的數據分析和可視化包,這裡總結了其中的一些常用的工具。
Matplotlib 的時間序列可視化
用於數據可視化的最流行的 Python 包可能是 Matplotlib。它用於創建靜態、動畫和交互式可視化。使用 Matplotlib 可以做一些事情,例如:
製作適合出版的地塊
創建可以放大、平移和更新的交互式圖形
改變視覺風格和布局
製作適合出版的地塊
創建可以放大、平移和更新的交互式圖形
改變視覺風格和布局
Plotly 時間序列可視化
Plotly 是一個交互式、開源和基於瀏覽器的 Python 和 R 圖形庫。它是一個高級的聲明性圖表庫,具有 30 多種圖表類型,包括科學圖表、3D 圖表、統計圖表、SVG 地圖、金融圖表等等。
除此之外,使用 Plotly 還可以繪製基於時間序列的交互式圖表,例如折線圖、甘特圖、散點圖等。
Statsmodels 時間序列可視化
Statsmodels 是一個 Python 包,它提供了用於估計各種統計模型以及運行統計測試和統計數據分析的類和函數。
它為時間序列分解及其可視化提供了一種非常方便的方法。使用這個包,可以輕鬆分解任何時間序列並分析其組成部分,例如趨勢、季節性組成部分以及殘差或噪聲。
statsmodels 庫在名為seasonal_decompose的函數中提供了簡單或經典分解方法的實現。它要求你指定模型是加法還是乘法。 seasonal_decompose 函數返回一個結果對象。結果對象以數組形式提供對趨勢和季節性系列的訪問。它還提供了對殘差的訪問,殘差是趨勢之後的時間序列,並且去除了季節性成分。
時間序列預測包
時間序列項目中最重要的部分可能是預測。預測是根據當前和過去的數據預測未來事件的過程。它基於這樣一種假設,即未來可以從過去實現。此外,它假設數據中有一些模式可用於預測接下來會發生什麼。
時間序列預測的方法有很多種,從簡單的線性回歸和基於 ARIMA 的方法開始,到複雜的多層神經網絡或集成模型。在這裡,我們將展示一些支持不同類型模型的包。
使用 Statsmodels 進行時間序列預測
Statsmodels 是我們在數據可視化工具一節中已經提到的一個包。但是,這是一個更相關的預測包。基本上,這個包提供了一系列統計模型和假設檢驗。
Statsmodels 包還包括用於時間序列分析的模型類和函數。自回歸移動平均模型 (ARMA) 和向量自回歸模型 (VAR) 是基本模型的示例。馬爾可夫切換動態回歸和自回歸是非線性模型的示例。它還包括時間序列描述性統計,例如自相關、偏自相關函數和周期圖,以及 ARMA 或相關過程的理論性質。
Statsmodels[8] 描述了如何使用 Statsmodels 包開始使用時間序列。
使用 Pmdarima 進行時間序列預測
Pmdarima 是一個統計庫,有助於使用基於 ARIMA 的方法對時間序列進行建模。除此之外,它還具有其他功能,例如:
- 一組平穩性和季節性的統計檢驗
- 各種內生和外生變壓器,包括 Box-Cox 和傅立葉變換
- 季節性時間序列、交叉驗證實用程序和其他工具的分解
也許這個庫最有用的工具是 Auto-Arima 模塊,它在提供的約束內搜索所有可能的 ARIMA 模型,並根據 AIC 或 BIC 值返回最佳模型。
這個包不是很常見,這裡給出一個簡單的例子:
上下滑動查看更多源碼
importpmdarima aspm
frompmdarima importmodel_selection
importmatplotlib.pyplot asplt
importnumpy asnp
# 加載數據並將其拆分為單獨的部分
data = pm.datasets.load_lynx
train, test = model_selection.train_test_split(data, train_size= 100)
# fit一些驗證(cv)樣本
arima = pm.auto_arima(train, start_p= 1, start_q= 1, d= 0, max_p= 5, max_q= 5,
out_of_sample_size= 10, suppress_warnings= True,
stepwise= True, error_action= 'ignore')
# 現在繪製測試集的結果和預測
preds, conf_int = arima.predict(n_periods=test.shape[ 0],
return_conf_int= True)
fig, axes = plt.subplots( 2, 1, figsize=( 12, 8))
x_axis = np.arange(train.shape[ 0] + preds.shape[ 0])
axes[ 0].plot(x_axis[:train.shape[ 0]], train, alpha= 0.75)
axes[ 0].scatter(x_axis[train.shape[ 0]:], preds, alpha= 0.4, marker= 'o')
axes[ 0].scatter(x_axis[train.shape[ 0]:], test, alpha= 0.4, marker= 'x')
axes[ 0].fill_between(x_axis[-preds.shape[ 0]:], conf_int[:, 0], conf_int[:, 1],
alpha= 0.1, color= 'b')
# 填寫在模型中"held out"樣本的部分
axes[ 0].set_title( "Train samples & forecasted test samples")
# 現在將實際樣本添加到模型中並創建NEW預測
arima.update(test)
new_preds, new_conf_int = arima.predict(n_periods= 10, return_conf_int= True)
new_x_axis = np.arange(data.shape[ 0] + 10)
axes[ 1].plot(new_x_axis[:data.shape[ 0]], data, alpha= 0.75)
axes[ 1].scatter(new_x_axis[data.shape[ 0]:], new_preds, alpha= 0.4, marker= 'o')
axes[ 1].fill_between(new_x_axis[-new_preds.shape[ 0]:],
new_conf_int[:, 0], new_conf_int[:, 1],
alpha= 0.1, color= 'g')
axes[ 1].set_title( "Added new observed values with new forecasts")
plt.show
使用 Sklearn 進行時間序列預測
Sklearn 或 Scikit-Learn 無疑是 Python 中最常用的機器學習包之一。它提供了各種分類、回歸和聚類方法,包括隨機森林、支持向量機、k-means 等。除此之外,它還提供了一些與降維、模型選擇、數據預處理等相關的實用程序。
除了各種模型之外,對於時間序列,還有一些有用的功能,例如管道、時間序列交叉驗證函數、用於測量結果的各種指標等。
使用 PyTorch 進行時間序列預測
PyTorch 是一個基於 Python 的深度學習庫,用於快速靈活的實驗。它最初由 Facebook 人工智慧研究團隊的研究人員和工程師開發,然後開源。Tesla Autopilot、Uber 的 Pyro 和 Hugging Face 的 Transformers 等深度學習軟體都建立在 PyTorch 之上。
使用 PyTorch,可以構建強大的循環神經網絡模型,例如 LSTM 和 GRU 以及預測時間序列。此外,還有一個具有最先進網絡架構的 PyTorch 預測包(PyTorch Forecasting )。它還包括一個時間序列數據集類,用於抽象處理變量轉換、缺失值、隨機子採樣、多個歷史長度和其他類似問題。
PyTorch Forecasting 旨在通過神經網絡簡化最先進的時間序列預測,以用於現實世界的案例和研究等。目標是為專業人士提供具有最大靈活性並為初學者提供合理默認值的高級 API。具體來說,該軟體包提供
一個時間序列數據集類,它抽象處理變量轉換、缺失值、隨機子採樣、多個歷史長度等。
一個基本模型類,它提供時間序列模型的基本訓練以及登錄張量板和通用可視化,例如實際與預測和依賴圖
用於時間序列預測的多個神經網絡架構,已針對實際部署進行了增強,並具有內置的解釋功能
多水平時間序列指標
Ranger 優化器用於更快的模型訓練
使用optuna進行超參數調整
PyTorch Forecasting 旨在通過神經網絡簡化最先進的時間序列預測,以用於現實世界的案例和研究等。目標是為專業人士提供具有最大靈活性並為初學者提供合理默認值的高級 API。具體來說,該軟體包提供
一個時間序列數據集類,它抽象處理變量轉換、缺失值、隨機子採樣、多個歷史長度等。
一個基本模型類,它提供時間序列模型的基本訓練以及登錄張量板和通用可視化,例如實際與預測和依賴圖
用於時間序列預測的多個神經網絡架構,已針對實際部署進行了增強,並具有內置的解釋功能
多水平時間序列指標
Ranger 優化器用於更快的模型訓練
使用optuna進行超參數調整
一個時間序列數據集類,它抽象處理變量轉換、缺失值、隨機子採樣、多個歷史長度等。
一個基本模型類,它提供時間序列模型的基本訓練以及登錄張量板和通用可視化,例如實際與預測和依賴圖
用於時間序列預測的多個神經網絡架構,已針對實際部署進行了增強,並具有內置的解釋功能
多水平時間序列指標
Ranger 優化器用於更快的模型訓練
使用optuna進行超參數調整
TensorFlow 是一個基於數據流圖的機器學習開源軟體庫。它最初由 Google Brain 團隊開發供內部使用,但後來作為開源項目發布。該軟體庫提供了一組高級數據流運算元,可以組合起來以自然的方式表達涉及多維數據數組、矩陣和高階張量的複雜計算。它還提供了一些較低級別的原語,例如用於構造自定義運算符或加速執行常見操作的內核。
Keras 是構建在 TensorFlow 之上的高級 API。使用 Keras 和 TensorFlow,可以構建用於時間序列預測的神經網絡模型。下面的教程解釋了使用天氣時間序列數據集的時間序列項目的一個示例:
使用 Sktime 進行時間序列預測
Sktime 是一個用於時間序列和機器學習的開源 Python 庫。它包括有效解決時間序列回歸、預測和分類任務所需的算法和轉換工具。創建 Sktime 是為了與 scikit-learn 一起工作,並且可以輕鬆地為相互關聯的時間序列任務調整算法以及構建復合模型。
總體而言,此包提供:
最先進的時間序列預測算法
時間序列的轉換,例如去趨勢或去季節化等
模型和轉換、模型調整實用程序和其他有用功能的管道
最先進的時間序列預測算法
時間序列的轉換,例如去趨勢或去季節化等
模型和轉換、模型調整實用程序和其他有用功能的管道
Prophet 是 Facebook 核心數據科學團隊發布的開源庫。簡而言之,它包含一個預測時間序列數據的程序,該程序基於一個加性模型,該模型將一些非線性趨勢與年度、每周和每日季節性以及假日效應相結合。它最適用於具有強烈季節性影響的時間序列和來自多個季節的歷史數據。它通常能夠處理缺失數據、趨勢變化和異常值。
使用 Pycaret 進行時間序列預測
PyCaret 是 Python 中的一個開源機器學習庫,可自動執行機器學習工作流。使用 PyCaret,可以用最少的工作和幾行代碼來構建和測試多個機器學習模型。一般用最少的代碼,不需要深入細節,就可以構建一個從 EDA 到部署的端到端機器學習項目。
這個庫有一些有用的時間序列模型,其中包括:
季節性樸素預測器
ARIMA
多項式趨勢預測器
Lasso Net 具有去季節化和去趨勢選項以及許多其他選項
季節性樸素預測器
ARIMA
多項式趨勢預測器
Lasso Net 具有去季節化和去趨勢選項以及許多其他選項
使用 AutoTS 進行時間序列預測
AutoTS 是 Python 的時間序列包,旨在自動化時間序列預測。它可用於為單變量和多變量時間序列找到最佳時間序列預測模型。此外,AutoTS 本身會從數據中清除任何缺失值或異常值。
近 20 個預定義模型(如 ARIMA、ETS、VECM)可用,並且使用遺傳算法,它可以為給定數據集進行預處理、找到最佳模型和模型集成。
使用 Darts 進行時間序列預測
Darts 是一個 Python 庫,允許對時間序列進行簡單的操作和預測。它包括範圍廣泛的模型,從經典的 ES 和 ARIMA 到 RNN 和transformers。所有模型都可以以與 scikit-learn 包中相同的方式使用。
該庫還允許輕鬆地對模型進行回測、組合來自多個模型的預測以及合併外部數據。它支持單變量和多變量模型。可以在此處找到所有可用模型的表以及幾個示例:
# TimeSeries從 Pandas DataFrame創建一個對象,並將其拆分為訓練/驗證系列:
importpandas aspd
importmatplotlib.pyplot asplt
fromdarts importTimeSeries
fromdarts.models importExponentialSmoothing
df = pd.read_csv( 'AirPassengers.csv', delimiter= ",")
series = TimeSeries.from_dataframe(df, 'Month', '#Passengers')
train, val = series[: -36], series[ -36:]
# 擬合指數平滑模型,並對驗證系列的持續時間進行(機率)預測:
model = ExponentialSmoothing
model.fit(train)
prediction = model.predict(len(val), num_samples= 1000)
# 繪製中位數、第 5 和第 95 個百分位數:
series.plot
prediction.plot(label= 'forecast', low_quantile= 0.05, high_quantile= 0.95)
plt.legend
使用 Kats 進行時間序列預測
Kats 是 Facebook 基礎設施數據科學團隊發布的一個包,旨在執行時間序列分析。這個包的目標是提供時間序列分析所需的一切,包括檢測、預測、特徵提取/嵌入、多變量分析等。
Kats 提供了一套全面的預測工具,例如集成、元學習模型、回測、超參數調整和經驗預測區間。此外,它還包括用於檢測時間序列數據中的季節性、異常值、變化點和緩慢趨勢變化的功能。使用 TSFeature 選項,可以生成 65 個具有清晰統計定義的特徵,這些特徵可用於大多數機器學習模型。
fromkats.models.sarima importSARIMAModel, SARIMAParams
# create SARIMA param class
params = SARIMAParams(p = 2, d= 1, q= 1,
trend = 'ct', seasonal_order=( 1, 0, 1, 12))
# initiate SARIMA model
m = SARIMAModel(data=air_passengers_ts, params=params)
# fit SARIMA model
m.fit
# generate forecast values
fcst = m.predict(steps= 30, freq= "MS")
m.plot
預測庫比較
這裡提供了一個包含一些常見功能的表格來比較預測包。表中顯示了一些指標,例如 GitHub 星數、發布年份、支持功能等。
發行年份 | GitHub 星星 | 統計與計量經濟學 | 機器學習 | 深度學習 | |
---|---|---|---|---|---|
Statsmodels | 2010 | 7200 | |||
Pmdarima | 2018 | 1100 | |||
Sklearn | 2007 | 50000 | |||
PyTorch | 2016 | 55000 | |||
TensorFlow | 2015 | 164000 | |||
Sktime | 2019 | 5000 | |||
Prophet | 2017 | 14000 | |||
PyCaret | 2020 | 5500 | |||
AutoTS | 2020 | 450 | |||
Darts | 2021 | 3800 | |||
Kats | 2021 | 3600 |
結論
在這篇文章中,我們描述了時間序列項目最常用的工具、包和庫。使用此工具列表,可以涵蓋幾乎所有與時間序列相關的項目。最重要的是,我們提供了用於預測的庫的比較,其中顯示了一些有趣的統計數據,例如發布年份、受歡迎程度以及它支持的模型類型。
上下滑動查看更多
參考資料
[1]
Pandas: https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html
[2]
NumPy: https://numpy.org/
[3]
Datetime: https://docs.python.org/3/library/datetime.html#module-datetime
[4]
Tsfresh: https://tsfresh.readthedocs.io/en/latest/index.html
[5]
Matplotlib: https://matplotlib.org/
[6]
Plotly: https://plotly.com/python/time-series/
[7]
Statsmodels: https://www.statsmodels.org/dev/generated/statsmodels.tsa.seasonal.seasonal_decompose.html
[8]
Statsmodels: https://www.statsmodels.org/stable/tsa.html
[9]
pmdarima: https://alkaline-ml.com/pmdarima/
[10]
Sklearn: https://scikit-learn.org/stable/index.html
[11]
PyTorch: https://github.com/jdb78/pytorch-forecasting
[12]
TensorFlow: https://www.tensorflow.org/tutorials/structured_data/time_series
[13]
Sktime: https://www.sktime.org/en/stable/
[14]
Prophet: https://github.com/facebook/prophet
[15]
PyCaret: https://pycaret.readthedocs.io/en/time_series/api/time_series.html
[16]
autots_1280: https://github.com/winedarksea/AutoTS
[17]
Darts: https://unit8co.github.io/darts/
[18]
smaimr1: https://facebookresearch.github.io/Kats/
[19]
smaimr2: https://github.com/facebookresearch/Kats
點這裡關注我,記得標星哦~
CDA課程諮詢