python學習打卡day59

DAY 59 經典時序預測模型3

知識點回顧:

  1. SARIMA模型的參數和用法:SARIMA(p, d, q)(P, D, Q)m
  2. 模型結果的檢驗可視化(昨天說的是摘要表怎么看,今天是對這個內容可視化)
  3. 多變量數據的理解:內生變量和外部變量
  4. 多變量模型
    1. 統計模型:SARIMA(單向因果)、VAR(考慮雙向依賴)
    2. 機器學習模型:通過滑動窗口實現,往往需要借助arima等作為特征提取器來捕捉線性部分(趨勢、季節性),再利用自己的優勢捕捉非線性的殘差
    3. 深度學習模型:獨特的設計天然為時序數據而生

作業:由于篇幅問題,無法實戰SARIMAX了,可以自己借助AI嘗試嘗試,相信大家已經有這個能力了。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import adfuller
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.statespace.sarimax import SARIMAX
import warnings
import itertools
warnings.filterwarnings('ignore')
# 顯示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 1. 加載數據
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv'
df = pd.read_csv(url, header=0, index_col=0, parse_dates=True)
df.columns = ['Passengers']# 2. 劃分訓練集和測試集(保留最后12個月作為測試)
train_data = df.iloc[:-12]
test_data = df.iloc[-12:]print("--- 訓練集 ---")
print(train_data.tail()) # 觀察訓練集最后5行
print("\n--- 測試集 ---")
print(test_data.head()) # 觀察測試集前5行
# 3. 可視化原始數據
plt.figure(figsize=(12, 6))
plt.plot(train_data['Passengers'], label='訓練集')
plt.plot(test_data['Passengers'], label='測試集', color='orange')
plt.title('國際航空乘客數量 (1949-1960)')
plt.xlabel('年份')
plt.ylabel('乘客數量 (千人)')
plt.legend()
plt.show()

# 進行季節性差分 (D=1, m=12)
seasonal_diff = df['Passengers'].diff(12).dropna()
# 再進行普通差分 (d=1)
seasonal_and_regular_diff = seasonal_diff.diff(1).dropna()# 繪制差分后的數據
plt.figure(figsize=(12, 6))
plt.plot(seasonal_and_regular_diff)
plt.title('經過一次季節性差分和一次普通差分后的數據')
plt.show()# ADF檢驗
result = adfuller(seasonal_and_regular_diff)
print(f'ADF Statistic: {result[0]}')
print(f'p-value: {result[1]}') # p-value越小,越說明數據平穩

?

# 繪制ACF和PACF圖
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8))
plot_acf(seasonal_and_regular_diff, lags=36, ax=ax1) # 繪制36個時間點
plot_pacf(seasonal_and_regular_diff, lags=36, ax=ax2)
plt.show()

?

手動的超參數搜索:

# 固定已知參數
d = 1           # 非季節性差分階數
D = 1           # 季節性差分階數
m = 12          # 季節性周期(月度數據為12)# 定義待搜索的參數范圍
p = q = range(0, 3)  # 非季節性參數 p和q取0-2
P = Q = range(0, 2)  # 季節性參數 P和Q取0-1# 生成所有可能的參數組合
pdq = list(itertools.product(p, [d], q))  # d固定為1
seasonal_pdq = [(x[0], D, x[2], m) for x in list(itertools.product(P, [D], Q))]  # D固定為1# 修正列名引用(假設數據列名為'Passengers')
train_column = 'Passengers'  # 請根據實際數據列名調整# 初始化最佳參數和最小AIC
best_aic = float('inf')
best_pdq = None
best_seasonal_pdq = None
best_model = Noneprint("開始網格搜索最佳SARIMA參數...")# 網格搜索最佳參數
for param in pdq:for param_seasonal in seasonal_pdq:try:# 擬合SARIMA模型model = SARIMAX(train_data[train_column],order=param,seasonal_order=param_seasonal,enforce_stationarity=False,  # 放寬平穩性約束enforce_invertibility=False, # 放寬可逆性約束disp=False)# 使用優化的擬合方法results = model.fit(method='bfgs',  # 使用BFGS優化算法maxiter=200,    # 增加最大迭代次數disp=False)# 打印當前參數組合及AICprint(f'SARIMA{param}x{param_seasonal} - AIC: {results.aic:.2f}')# 更新最佳參數if results.aic < best_aic:best_aic = results.aicbest_pdq = parambest_seasonal_pdq = param_seasonalbest_model = resultsexcept Exception as e:print(f'SARIMA{param}x{param_seasonal} 擬合失敗: {str(e)}')continue
# 輸出最佳模型
if best_pdq:print(f"\n最佳模型: SARIMA{best_pdq}x{best_seasonal_pdq} - AIC: {best_aic:.2f}")final_model = SARIMAX(train_data[train_column],order=best_pdq,seasonal_order=best_seasonal_pdq,enforce_stationarity=False,enforce_invertibility=False)final_results = final_model.fit(disp=False)

?

# 檢查是否找到有效模型
if best_model is not None:print(f'\n最佳模型: SARIMA{best_pdq}x{best_seasonal_pdq} - AIC: {best_aic:.2f}')# 打印最佳模型摘要print(best_model.summary())# 繪制模型診斷圖best_model.plot_diagnostics(figsize=(15, 10))plt.tight_layout()plt.show()else:print("\n未能找到合適的SARIMA模型。請檢查:")print("1. 數據列名是否正確(當前使用:", train_column, ")")print("2. 數據是否包含缺失值或異常值")print("3. 嘗試進一步調整參數范圍")print("4. 考慮使用其他時間序列模型")

?

# 1. 預測測試集
forecast = final_results.get_forecast(steps=len(test_data))
forecast_mean = forecast.predicted_mean
forecast_ci = forecast.conf_int()# 2. 評估模型
from sklearn.metrics import mean_squared_error
import numpy as npmse = mean_squared_error(test_data[train_column], forecast_mean)
rmse = np.sqrt(mse)
print(f'測試集 MSE: {mse:.2f}')
print(f'測試集 RMSE: {rmse:.2f}')# 3. 繪制預測結果
plt.figure(figsize=(12, 6))
plt.plot(train_data.index, train_data[train_column], label='訓練數據')
plt.plot(test_data.index, test_data[train_column], label='真實值', color='orange')
plt.plot(test_data.index, forecast_mean, label='預測值', color='red')
plt.fill_between(forecast_ci.index,forecast_ci.iloc[:, 0],forecast_ci.iloc[:, 1],color='pink', alpha=0.5, label='95%置信區間')
plt.title('SARIMA模型預測 vs. 真實值')
plt.xlabel('日期')
plt.ylabel('乘客數量 (千人)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

?

@浙大疏錦行?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/913073.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/913073.shtml
英文地址,請注明出處:http://en.pswp.cn/news/913073.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java中agent的作用

一 java中agent1.1 agent-javaagent 是 Java 虛擬機 (JVM) 提供的一個啟動參數&#xff0c;用于在 Java 程序 main 方法執行之前&#xff0c;加載一個特殊的 Java 代理程序&#xff08;Java Agent&#xff09;。它的核心作用是對運行中的 Java 程序進行字節碼層面的動態修改、監…

[C/C++內存安全]_[中級]_[如何避免數組訪問越界]

場景 C/C的標準在C26以前還沒支持內存安全的訪問連續內存的類或特性。在開發分析內存數據或文件數據的程序時&#xff0c;經常需要把一段內存數據復制到另一個堆空間里。 這時目標內存空間由于起始地址的移動&#xff0c;剩余大小的計算錯誤&#xff0c;經常會導致訪問越界錯誤…

rabbitmq 與 Erlang 的版本對照表 win10 安裝方法

win10 64位系統 安裝的版本 otp_win64_27.3.3.exe rabbitmq-server-4.1.1.exe rabbitmq 與 Erlang 的版本對照表 Erlang Version Requirements This guide covers Erlang/OTP version requirements https://www.rabbitmq.com/docs/which-erlang Erlang 28 is not currently…

kali安裝教程

kali教程 我下載的是kali的集成環境&#xff0c;可以直接進行打開&#xff0c;無需進行安裝。 Get Kali | Kali Linux&#xff0c; 官網下載路徑 直接按enter鍵 安裝完成 生成一個小皮安裝鏈接 會給你生成一個外網和內網地址&#xff0c; 可以進行瀏覽 點擊我同意這個協議…

微信小程序入門實例_____快速搭建一個快遞查詢小程序?

&#x1f337;&#x1f337;之前幾篇博文我們一起開發了天氣查詢、單詞速記和待辦事項小程序&#xff0c;這次我們來對生活中常用的功能 —— 快遞查詢來探索相關的小程序。網購已經成為大家生活的一部分&#xff0c;有了自己的快遞查詢小程序&#xff0c;不用切換多個應用&…

【防火墻基礎之傳統墻到 UTM 到 NGFW 再到 AI 的變化】

防火墻技術演進與未來趨勢&#xff1a;從傳統防御到AI驅動的智能安全 防火墻技術歷經數十年發展&#xff0c;已從早期的簡單包過濾演進為融合AI的智能安全平臺。當前&#xff0c;傳統爬蟲防護技術如頻率限制和人機校驗已無法應對現代攻擊&#xff0c;而全面風控體系通過多維協同…

【仿muduo庫實現并發服務器】Poller模塊

仿muduo庫實現并發服務器 1.Poller模塊成員變量創建epoll模型對于一個描述符添加或修改事件監控對于一個描述符移除事件監控啟動epoll事件監控&#xff0c;獲取所有活躍連接 1.Poller模塊 Poller模塊主要是對任意的描述符進行IO事件監控。 它是對epoll的封裝&#xff0c;可以讓…

小程序學習筆記:使用 MobX 實現全局數據共享,實例創建、計算屬性與 Actions 方法

在小程序開發過程中&#xff0c;組件間的數據共享是一個常見且關鍵的問題。今天&#xff0c;我們就來深入探討一下如何在小程序中實現全局數據共享&#xff0c;借助 MobX 相關的包&#xff0c;讓數據管理變得更加高效便捷。 什么是全局數據共享 全局數據共享&#xff0c;也被…

觀測云 × AWS SSO:權限治理可觀測實踐

AWS IAM Identity Center 介紹 AWS IAM Identity Center&#xff08;原 AWS Single Sign-On&#xff09;是 AWS 提供的一項云原生身份與訪問管理&#xff08;IAM&#xff09;服務&#xff0c;旨在集中簡化多 AWS 賬戶、多業務應用的安全訪問控制。 觀測云 觀測云是一款專為 …

springboot整合配置swagger3

一. swagger3介紹 Swagger 3 是基于 OpenAPI 規范 3.0 的 API 文檔工具&#xff0c;用于設計、構建和消費 RESTful API。它通過標準化描述 API 的接口、參數、響應等元數據&#xff0c;實現以下核心功能&#xff1a; 自動生成交互式文檔API 測試與調試代碼生成&#xff08;客…

RabbitMQ 4.1.1初體驗

為什么選擇 RabbitMQ&#xff1f;* RabbitMQ 是一款可靠且成熟的消息代理和流處理中間件&#xff0c;可輕松部署在云端、本地數據中心或您的開發機上&#xff0c;目前已被全球數百萬用戶使用。 優勢在哪里 互操作性 RabbitMQ 支持多種開放標準協議&#xff0c;包括 AMQP 1.0 和…

【精華】QPS限流等場景,Redis其他數據結構優劣勢對比

下面是一個詳細的 Redis 數據結構對比表&#xff0c;比較它們在實現 QPS 限流 / 滑動窗口統計 / 查定比監控等場景中的適用性&#xff1a; ? Redis 數據結構對比表&#xff08;用于接口限流 / QPS 監控&#xff09; 維度String INCR 固定窗口List 滑動窗口Hash 計數器ZSet 滑…

頂層設計:支持單元化、灰度化的應用架構

一、頂層目標 業務連續性&#xff1a;任何單元故障不影響整體彈性伸縮&#xff1a;根據業務流量橫向擴展靈活灰度&#xff1a;任何發布都可逐步平滑上線成本可控&#xff1a;單元化帶來的資源冗余最小 二、核心理念 設計目標核心理念單元化垂直拆分&#xff0c;分而治之&…

MacOS Safari 如何打開F12 開發者工具 Developer Tools

背景 If you’re a web develper, the Safari Develop menu provides tools you can use to make sure your website works well with all standards-based web browsers. 解決 If you don’t see the Develop menu in menu bar, Choose Safari > settingsClick Advanced…

2025—暑期訓練一

A 本題描述了一個最優路徑規劃問題的解法&#xff0c;核心思路是利用數軸上區間覆蓋的特性&#xff0c;將問題簡化為兩個端點的訪問問題。以下是關鍵點的詳細解析&#xff1a; 核心觀察 區間覆蓋特性 給定的位置數組 x1, x2, ..., xn 是嚴格遞增的&#xff08;即 x1 < x2 …

ubuntu 18.04配置鏡像源

配置鏡像源的主要作用是優化軟件下載速度、提升系統更新穩定性&#xff0c;并確保軟件包獲取的可靠性 我這里配置阿里云鏡像源 鏡像的具體內容參考此文: 文章鏈接 以防萬一,先備份一下 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak然后開始修改 sudo nano /etc…

RecyclerView中跳轉到最后一條item并確保它在可視區域內顯示

在RecyclerView中跳轉并顯示最后一條Item 要在RecyclerView中跳轉到最后一條item并確保它在可視區域內顯示&#xff0c;可以使用以下幾種方法&#xff1a; 1. 使用scrollToPosition()方法&#xff08;基本方法&#xff09; recyclerView.scrollToPosition(adapter.getItemCo…

ubuntu22 桌面版開啟root登陸

一、先創建root sudo passwd root 二、注釋代碼 vim /etc/pam.d/gdm-password vim/etc/pam.d/gdm-autologin 都注釋 auth required pam_succeed_if.so user ! root quiet_success 三、修改profile文件 vim /root/.profile 注釋掉 mesg n 2&#xff1e; /dev/null || true 插入新…

docker學習二天之鏡像操作與容器操作

鏡像的一般運用過程 一、鏡像&#xff08;Image&#xff09;操作 鏡像是容器的基礎模板&#xff0c;存儲在本地或遠程倉庫中。 1. 鏡像拉取 # 從指定鏡像源拉取 docker pull docker.m.daocloud.io/library/nginx 2. 鏡像查看 # 列出本地鏡像 docker images # 或 docker image…

多個參數用websocket 向io 服務器發送變量,一次發一個,并接收響應

問題&#xff1a;多個參數用websocket 向io 服務器發送變量&#xff0c;一次發一個&#xff0c;并接收響應&#xff0c;如果是多個變量&#xff0c;但還是需要一個個發送&#xff0c;應該怎么實現&#xff0c;思路是什么樣子的呢&#xff1f;用數組的話&#xff0c;應該怎么用&…