使用python進(jìn)行時(shí)間序列預(yù)測(cè)的流程
引言
使用 Python 進(jìn)行時(shí)間序列預(yù)測(cè)是一個(gè)非常常見的任務(wù),可以應(yīng)用于各種領(lǐng)域,如金融市場(chǎng)預(yù)測(cè)、銷售量預(yù)測(cè)、天氣預(yù)報(bào)等。時(shí)間序列預(yù)測(cè)的方法有很多,包括統(tǒng)計(jì)方法(如 ARIMA 模型)、機(jī)器學(xué)習(xí)方法(如支持向量機(jī)、決策樹)、以及深度學(xué)習(xí)方法(如 LSTM 網(wǎng)絡(luò))。
下面是一個(gè)簡(jiǎn)單的時(shí)間序列預(yù)測(cè)流程示例,使用 Python 和 pandas、numpy、以及 statsmodels 庫(kù)來(lái)實(shí)現(xiàn) ARIMA 模型的時(shí)間序列預(yù)測(cè)。
1. 導(dǎo)入必要的庫(kù)
首先,我們需要導(dǎo)入一些常用的 Python 庫(kù)。
import pandas as pd import numpy as np import matplotlib.pyplot as plt from statsmodels.tsa.arima.model import ARIMA from sklearn.metrics import mean_squared_error
2. 準(zhǔn)備數(shù)據(jù)
我們將使用一個(gè)簡(jiǎn)單的時(shí)間序列數(shù)據(jù)集。這個(gè)數(shù)據(jù)集可以是來(lái)自 CSV 文件的數(shù)據(jù),也可以是生成的模擬數(shù)據(jù)。在這里,我們將生成一些模擬數(shù)據(jù)。
# 生成模擬時(shí)間序列數(shù)據(jù) np.random.seed(0) date_range = pd.date_range(start='2020-01-01', periods=100, freq='D') data = np.random.normal(0, 1, size=(100,)).cumsum() time_series_data = pd.Series(data, index=date_range) # 可視化數(shù)據(jù) time_series_data.plot(title="Time Series Data", xlabel="Date", ylabel="Value") plt.show()
3. 檢查時(shí)間序列的平穩(wěn)性
ARIMA 模型要求時(shí)間序列是平穩(wěn)的。我們可以通過(guò)觀察時(shí)間序列圖或使用統(tǒng)計(jì)檢驗(yàn)(如 ADF 檢驗(yàn))來(lái)檢查時(shí)間序列的平穩(wěn)性。
from statsmodels.tsa.stattools import adfuller # ADF 檢驗(yàn) result = adfuller(time_series_data) print(f'ADF Statistic: {result[0]}') print(f'p-value: {result[1]}')
如果 p-value
小于 0.05,說(shuō)明時(shí)間序列是平穩(wěn)的。否則,我們可能需要對(duì)時(shí)間序列進(jìn)行差分操作來(lái)使其平穩(wěn)。
4. 拆分訓(xùn)練集和測(cè)試集
在進(jìn)行時(shí)間序列預(yù)測(cè)時(shí),我們通常將數(shù)據(jù)集拆分為訓(xùn)練集和測(cè)試集。訓(xùn)練集用于訓(xùn)練模型,測(cè)試集用于評(píng)估模型性能。
# 拆分?jǐn)?shù)據(jù)集 train_size = int(len(time_series_data) * 0.8) train, test = time_series_data[:train_size], time_series_data[train_size:] # 可視化訓(xùn)練集和測(cè)試集 train.plot(label='Training Data') test.plot(label='Test Data') plt.legend() plt.show()
5. 構(gòu)建和訓(xùn)練 ARIMA 模型
ARIMA 模型的參數(shù)包括 p(自回歸部分的階數(shù))、d(差分階數(shù))、q(移動(dòng)平均部分的階數(shù))??梢酝ㄟ^(guò) ACF 和 PACF 圖或網(wǎng)格搜索來(lái)確定這些參數(shù)。在這里,我們將使用簡(jiǎn)單的參數(shù)值。
# 創(chuàng)建 ARIMA 模型 model = ARIMA(train, order=(5, 1, 0)) # 這里 (p, d, q) = (5, 1, 0) model_fit = model.fit() # 打印模型總結(jié) print(model_fit.summary())
6. 進(jìn)行預(yù)測(cè)
訓(xùn)練好模型后,我們可以對(duì)測(cè)試集進(jìn)行預(yù)測(cè),并與實(shí)際值進(jìn)行比較。
# 進(jìn)行預(yù)測(cè) predictions = model_fit.forecast(steps=len(test)) predictions_series = pd.Series(predictions, index=test.index) # 可視化預(yù)測(cè)結(jié)果 train.plot(label='Training Data') test.plot(label='Test Data') predictions_series.plot(label='Predictions') plt.legend() plt.show()
7. 評(píng)估模型
最后,我們?cè)u(píng)估模型的性能,可以使用均方誤差(MSE)、平均絕對(duì)誤差(MAE)等指標(biāo)。
# 計(jì)算均方誤差 mse = mean_squared_error(test, predictions_series) print(f'Mean Squared Error: {mse}')
8. 完整代碼
import pandas as pd import numpy as np import matplotlib.pyplot as plt from statsmodels.tsa.arima.model import ARIMA from sklearn.metrics import mean_squared_error from statsmodels.tsa.stattools import adfuller # 生成模擬時(shí)間序列數(shù)據(jù) np.random.seed(0) date_range = pd.date_range(start='2020-01-01', periods=100, freq='D') data = np.random.normal(0, 1, size=(100,)).cumsum() time_series_data = pd.Series(data, index=date_range) # 檢查時(shí)間序列的平穩(wěn)性 result = adfuller(time_series_data) print(f'ADF Statistic: {result[0]}') print(f'p-value: {result[1]}') # 拆分?jǐn)?shù)據(jù)集 train_size = int(len(time_series_data) * 0.8) train, test = time_series_data[:train_size], time_series_data[train_size:] # 創(chuàng)建和訓(xùn)練 ARIMA 模型 model = ARIMA(train, order=(5, 1, 0)) model_fit = model.fit() # 進(jìn)行預(yù)測(cè) predictions = model_fit.forecast(steps=len(test)) predictions_series = pd.Series(predictions, index=test.index) # 評(píng)估模型 mse = mean_squared_error(test, predictions_series) print(f'Mean Squared Error: {mse}') # 可視化 train.plot(label='Training Data') test.plot(label='Test Data') predictions_series.plot(label='Predictions') plt.legend() plt.show()
總結(jié)
上述步驟展示了一個(gè)簡(jiǎn)單的時(shí)間序列預(yù)測(cè)流程。根據(jù)實(shí)際情況,你可以選擇更復(fù)雜的模型,如 SARIMA、季節(jié)性分解、或使用機(jī)器學(xué)習(xí)和深度學(xué)習(xí)模型(如 LSTM)。此外,可以使用更復(fù)雜的特征工程和模型選擇方法來(lái)進(jìn)一步提高預(yù)測(cè)的準(zhǔn)確性。
以上就是使用python進(jìn)行時(shí)間序列預(yù)測(cè)的流程的詳細(xì)內(nèi)容,更多關(guān)于python時(shí)間序列預(yù)測(cè)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python 實(shí)現(xiàn)的發(fā)送郵件模板【普通郵件、帶附件、帶圖片郵件】
這篇文章主要介紹了python 實(shí)現(xiàn)的發(fā)送郵件模板,包含Python發(fā)送普通郵件、帶附件及帶圖片郵件相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-07-07基于python編寫的五個(gè)拿來(lái)就能用的炫酷表白代碼分享
七夕快到了,所以本文小編將給給大家介紹五種拿來(lái)就能用的炫酷表白代碼,無(wú)限彈窗表白,愛(ài)心發(fā)射,心動(dòng)表白,玫瑰花等表白代碼,需要的小伙伴快來(lái)試試吧2023-08-08python實(shí)現(xiàn)文本進(jìn)度條 程序進(jìn)度條 加載進(jìn)度條 單行刷新功能
這篇文章主要介紹了python實(shí)現(xiàn)文本進(jìn)度條 程序進(jìn)度條 加載進(jìn)度條 單行刷新功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07Python GUI教程之在PyQt5中使用數(shù)據(jù)庫(kù)的方法
Qt平臺(tái)對(duì)SQL編程有著良好的支持,PyQt5也一并繼承了過(guò)來(lái),這篇文章主要介紹了Python GUI教程之在PyQt5中使用數(shù)據(jù)庫(kù)的方法,需要的朋友可以參考下2021-09-09python 實(shí)現(xiàn)網(wǎng)上商城,轉(zhuǎn)賬,存取款等功能的信用卡系統(tǒng)
本篇文章主要介紹 基于python 實(shí)現(xiàn)信用卡系統(tǒng),附有代碼實(shí)例,對(duì)于用python 開發(fā)網(wǎng)絡(luò)上傳系統(tǒng)具有參考價(jià)值,有需要的朋友可以看下2016-07-07Python實(shí)現(xiàn)多線程下載文件的代碼實(shí)例
這篇文章主要介紹了Python實(shí)現(xiàn)多線程下載文件的代碼實(shí)例,需要的朋友可以參考下2014-06-06Python基于Floyd算法求解最短路徑距離問(wèn)題實(shí)例詳解
這篇文章主要介紹了Python基于Floyd算法求解最短路徑距離問(wèn)題,結(jié)合完整實(shí)例形式詳細(xì)分析了Python使用Floyd算法求解最短路徑距離問(wèn)題的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-05-05教你學(xué)會(huì)通過(guò)python的matplotlib庫(kù)繪圖
今天教大家如何學(xué)會(huì)通過(guò)python的matplotlib庫(kù)繪圖,文中有非常詳細(xì)的圖文解說(shuō)及代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05