使用statsmodels處理時間序列需先設定時間索引,1.讀取數據并轉換為datetimeindex;2.檢查缺失與連續性,進行重采樣;3.用seasonal_decompose分解趨勢、季節性與殘差;4.選擇sarimax建模,設置order與seasonal_order參數;5.擬合模型后預測未來數據;6.注意缺失值插值、平穩性檢驗及模型評估。全過程需重視數據預處理與參數調優以提高預測準確性。
python處理時間序列的方法有很多,其中用 statsmodels 進行分析是比較常見且實用的一種方式。如果你有結構化的時間數據,并希望做一些趨勢、周期性識別或者預測,那用這個庫可以比較直接地實現。
時間序列的基本準備:把數據讀成“帶時間索引的”
在開始分析之前,最重要的一點是確保你的數據是“時間序列格式”的,也就是說,數據中有一列是時間戳,而且已經被設為 DatetimeIndex 類型。
import pandas as pd df = pd.read_csv('your_time_series_data.csv') df['date'] = pd.to_datetime(df['date']) df.set_index('date', inplace=True)
這一步做完之后,你可以檢查一下時間是否是連續的、有沒有缺失值。如果是按天或按小時記錄的數據,建議先做重采樣(resample),比如:
立即學習“Python免費學習筆記(深入)”;
df_monthly = df.resample('M').mean()
這樣可以把數據統一到月度或者你想要的粒度上,方便后續建模。
使用 statsmodels 做分解:看清趨勢、季節性和殘差
對于一個初步分析來說,把時間序列拆分成趨勢項、季節項和殘差項是非常有用的。可以用 seasonal_decompose 來完成:
from statsmodels.tsa.seasonal import seasonal_decompose result = seasonal_decompose(df_monthly, model='multiplicative', period=12) result.plot()
- model 可以選乘法模型(multiplicative)或加法模型(additive)
- period 通常根據業務周期設定,比如年周期就是12個月
看圖能很清楚地看到:
- 數據是否有明顯的上升或下降趨勢
- 是否存在每年重復的模式
- 殘差部分是否平穩
這對判斷是否需要差分、是否適合使用 ARIMA 等模型很有幫助。
實際建模:ARIMA 或 SARIMAX 是不錯的選擇
如果目標是預測,那么 SARIMAX 是比普通 ARIMA 更靈活的選擇,尤其是當你發現數據有季節性時。
from statsmodels.tsa.statespace.sarimax import SARIMAX # 示例參數設置 model = SARIMAX(df_monthly, order=(1,1,1), seasonal_order=(1,1,1,12)) results = model.fit(disp=False) print(results.summary())
關鍵參數說明:
- order=(p,d,q) 是非季節部分的自回歸、差分、移動平均階數
- seasonal_order=(P,D,Q,m) 中 m 是周期長度,比如12表示年周期
調參方法:
- 觀察 ACF 和 PACF 圖來輔助選擇 p 和 q
- 差分次數 d 一般取0或1,D也類似
- 如果沒有明顯季節性,SARIMAX 的季節部分可以省略
擬合完成后可以用來預測未來幾期的數據:
forecast = results.get_forecast(steps=6) pred_ci = forecast.conf_int() predictions = forecast.predicted_mean
小貼士和注意事項
- 缺失值處理很重要:時間序列對缺失敏感,不能簡單 drop 掉。可以用插值填充,比如 df.interpolate()。
- 平穩性檢驗別跳過:可以用 ADF 測試判斷是否要差分,from statsmodels.tsa.stattools import adfuller
- 可視化是理解的關鍵:多畫圖,尤其在建模前后對比效果會更直觀
- 模型評估不要只看 R2:MAPE、RMSE 這些指標更適合衡量預測誤差
基本上就這些了。用 Python + statsmodels 分析時間序列不復雜但容易忽略細節,特別是前期數據處理和模型參數調整部分,多花點時間在這兩塊,后面的結果會穩定很多。