時間序列資料分析與預測之Python工具彙總

數據分析那些事
22 min readSep 21, 2022

--

文章來源於:數據STUDIO

本文中總結了十多種時間序列資料分析和預測工具和python庫,在我們處理時間序列專案時,可以翻開本文,根據需要選擇合適的工具,將會事半功倍!

在處理時間序列專案時,資料科學家或 ML 工程師通常會使用特定的工具和庫。或者他們使用一些眾所周知的工具,而這些工具已被證明可以很好地適用與對應的時間序列專案。

如果能將這些工具彙總,在以後的專案中將會很受用。這篇文章是一個時間序列工具和包的備忘錄。其中一些是非常有名的,也有些可能是第一次聽說。希望你以後會發現這篇文章很有用!

時間序列

時間序列是按時間順序索引的資料點序列。這是在連續時間點對同一變數的觀察。換句話說,它是在一段時間內觀察到的一組資料。

資料通常繪製為圖表上的一條線,x 軸為時間,y 軸為每個點的值。此外,時間序列有四個主要組成部分:

  • 趨勢
  • 季節性變化
  • 週期性變化
  • 隨機變化

一般來說,時間序列經常被用於經濟學、數學、生物學、物理學、氣象學等許多領域。

時間序列專案示例

股票預測

股票市場預測是一個具有挑戰性和吸引力的話題,其主要目標是開發多種方法和策略來預測未來的股票價格。有很多不同的技術,從經典的演算法和統計方法到複雜的神經網路架構。共同點是它們都利用不同的時間序列來實現準確的預測。股市預測方法被業餘投資者、金融科技初創公司和大型對沖基金廣泛使用。

基本面分析著眼於公司的財務報表、管理和行業趨勢等因素。此外,它還考慮了一些宏觀經濟指標,例如通貨膨脹率、GDP、經濟狀況等。所有這些指標都是時間相關的,因此可以表示為時間序列。

與基本面分析相比,技術分析使用交易量、價格變化和來自市場本身的其他資訊的模式來預測股票未來的表現。投資者在做出投資決定之前瞭解這兩種方法很重要。

心電異常檢測

心電圖異常檢測是一種檢測心電圖異常的技術。心電圖是一項監測心臟電活動的測試。基本上,它是由心臟產生並表示為時間序列的電訊號。

心電圖異常檢測是透過將心電圖的正常模式與異常模式進行比較來完成的。心電圖異常有多種型別,可分為以下幾類:

  • 心率異常: 這是指心率在正常範圍內的任何變化。這可能是由於心臟問題或如何刺激它。
  • 心律異常:這是指節律與其正常模式的任何變化。這可能是由於脈衝透過心臟傳導的方式存在問題,或者它們透過心臟傳導的速度存在問題。

從學術研究到商用心電圖機,在這個主題上已經做了很多工作,並且有一些有希望的結果。最大的問題是系統應該具有很高的準確性,並且不應該有任何誤報或誤報。這是由於問題的性質和錯誤預測的後果。

時間序列專案的工具

時間序列在各個行業中的重要性,已經不用多說。接下來看看用於時間序列專案的Python工具都有哪些。

1、資料準備和特徵工程工具
2、資料分析和視覺化工具
3、時間序列預測工具

資料準備和特徵工程

資料準備和特徵工程是資料科學管道中的兩個非常重要的步驟。資料準備通常是任何資料科學專案的第一步。這是將資料轉換為可用於分析和進一步處理的形式的過程。

特徵工程是從原始資料中提取特徵以使其對建模和預測更有用的過程。下面,我們將提到一些用於這些任務的最流行的工具。

Pandas 的時間序列處理

Pandas 是一個用於資料操作和分析的 Python 庫。它包括用於運算元值表和時間序列的資料結構和方法。此外,它還包含廣泛的功能和特性,可用於處理所有領域的時間序列資料。

它支援來自各種檔案型別的資料輸入,包括 CSV、JSON、Parquet、SQL 資料庫表和查詢以及 Microsoft Excel。此外,Pandas 允許各種資料操作功能,例如合併、重塑、選擇以及資料清理和整理。

一些常用的時間序列特徵是:

  • 日期範圍生成和頻率轉換
  • 移動視窗統計
  • 移動視窗線性迴歸
  • 日期轉換
  • 滯後等等

NumPy 的時間序列處理

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 值返回最佳模型。

這個包不是很常見,這裡給出一個簡單的例子:

import pmdarima as pm
from pmdarima import model_selection
import matplotlib.pyplot as plt
import numpy as np
# 加载数据并将其拆分为单独的部分
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進行超引數調整

使用 Tensorflow (Keras) 進行時間序列預測

TensorFlow 是一個基於資料流圖的機器學習開源軟體庫。它最初由 Google Brain 團隊開發供內部使用,但後來作為開源專案釋出。該軟體庫提供了一組高階資料流運算元,可以組合起來以自然的方式表達涉及多維資料陣列、矩陣和高階張量的複雜計算。它還提供了一些較低級別的原語,例如用於構造自定義運算子或加速執行常見操作的核心。

Keras 是構建在 TensorFlow 之上的高階 API。使用 Keras 和 TensorFlow,可以構建用於時間序列預測的神經網路模型。下面的教程解釋了使用天氣時間序列資料集的時間序列專案的一個示例:

使用 Sktime 進行時間序列預測

Sktime 是一個用於時間序列和機器學習的開源 Python 庫。它包括有效解決時間序列迴歸、預測和分類任務所需的演算法和轉換工具。建立 Sktime 是為了與 scikit-learn 一起工作,並且可以輕鬆地為相互關聯的時間序列任務調整演算法以及構建複合模型。

總體而言,此包提供:

  • 最先進的時間序列預測演算法
  • 時間序列的轉換,例如去趨勢或去季節化等
  • 模型和轉換、模型調整實用程式和其他有用功能的管道

使用 Prophet 進行時間序列預測

Prophet 是 Facebook 核心資料科學團隊釋出的開源庫。簡而言之,它包含一個預測時間序列資料的程式,該程式基於一個加性模型,該模型將一些非線性趨勢與年度、每週和每日季節性以及假日效應相結合。它最適用於具有強烈季節性影響的時間序列和來自多個季節的歷史資料。它通常能夠處理缺失資料、趨勢變化和異常值。

使用 Pycaret 進行時間序列預測

PyCaret 是 Python 中的一個開源機器學習庫,可自動執行機器學習工作流。使用 PyCaret,可以用最少的工作和幾行程式碼來構建和測試多個機器學習模型。一般用最少的程式碼,不需要深入細節,就可以構建一個從 EDA 到部署的端到端機器學習專案。

這個庫有一些有用的時間序列模型,其中包括:

  • 季節性樸素預測器
  • ARIMA
  • 多項式趨勢預測器
  • Lasso Net 具有去季節化和去趨勢選項以及許多其他選項

使用 AutoTS 進行時間序列預測

AutoTS 是 Python 的時間序列包,旨在自動化時間序列預測。它可用於為單變數和多變數時間序列找到最佳時間序列預測模型。此外,AutoTS 本身會從資料中清除任何缺失值或異常值。

近 20 個預定義模型(如 ARIMA、ETS、VECM)可用,並且使用遺傳演算法,它可以為給定資料集進行預處理、找到最佳模型和模型整合。

使用 Darts 進行時間序列預測

Darts 是一個 Python 庫,允許對時間序列進行簡單的操作和預測。它包括範圍廣泛的模型,從經典的 ES 和 ARIMA 到 RNN 和transformers。所有模型都可以以與 scikit-learn 包中相同的方式使用。

該庫還允許輕鬆地對模型進行回測、組合來自多個模型的預測以及合併外部資料。它支援單變數和多變數模型。可以在此處找到所有可用模型的表以及幾個示例:

# TimeSeries从 Pandas DataFrame创建一个对象,并将其拆分为训练/验证系列:
import pandas as pd
import matplotlib.pyplot as plt
from darts import TimeSeries
from darts.models import ExponentialSmoothing
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 個具有清晰統計定義的特徵,這些特徵可用於大多數機器學習模型。

from kats.models.sarima import SARIMAModel, 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 星數、釋出年份、支援功能等。

結論

在這篇文章中,我們描述了時間序列專案最常用的工具、包和庫。使用此工具列表,可以涵蓋幾乎所有與時間序列相關的專案。最重要的是,我們提供了用於預測的庫的比較,其中顯示了一些有趣的統計資料,例如釋出年份、受歡迎程度以及它支援的模型型別。

參考資料

[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

文章連接:https://mp.weixin.qq.com/s/fSOkX9KqUIxPSS3D-06NLg

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

我是「數據分析那些事」。常年分享數據分析乾貨,不定期分享好用的職場技能工具。各位也可以關注我的Facebook,按讚我的臉書並私訊「10」,送你十週入門數據分析電子書唷!期待你與我互動起來~

文章推薦

餅圖變形記,肝了3000字,收藏就是學會!

MySQL必須掌握4種語言!

太實用了!4種方法教你輕鬆製作互動式儀表板!

跟資料打交道的人都得會的這8種資料模型,滿足工作中95%的需求

妙呀!一行Python程式碼

--

--

數據分析那些事

這是一個專注於數據分析職場的內容部落格,聚焦一批數據分析愛好者,在這裡,我會分享數據分析相關知識點推送、(工具/書籍)等推薦、職場心得、熱點資訊剖析以及資源大盤點,希望同樣熱愛數據的我們一同進步! 臉書會有更多互動喔:https://www.facebook.com/shujvfenxi/