当前位置: 首页 > news >正文

Python训练营---DAY56

DAY 56 时序数据的检验

知识点回顾:

  1. 假设检验基础知识
    1. 原假设与备择假设
    2. P值、统计量、显著水平、置信区间
  2. 白噪声
    1. 白噪声的定义
    2. 自相关性检验:ACF检验和Ljung-Box 检验
    3. 偏自相关性检验:PACF检验
  3. 平稳性
    1. 平稳性的定义
    2. 单位根检验
  4. 季节性检验
    1. ACF检验
    2. 序列分解:趋势+季节性+残差

记忆口诀:p越小,落在置信区间外,越拒绝原假设。

时序部分需要铺垫的知识非常多,相信这次应该说清楚了假设检验相关的基础知识。

作业:自行构造数据集,来检查是否符合这个要求。

创造数据,并可视化进行ACF检验

import numpy as np
from statsmodels.graphics.tsaplots import plot_acf 
from statsmodels.graphics.tsaplots import plot_pacf # 引入PACF图
from statsmodels.stats.diagnostic import acorr_ljungbox  # 引入Ljung-Box检验
from statsmodels.tsa.stattools import adfuller  # 引入ADF检验
from statsmodels.tsa.seasonal import seasonal_decompose  # 引入季节性分解
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
# 中文显示设置
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示为方块的问题# 为了让每次运行的结果都一样,设置一个随机种子(可选)
np.random.seed(42)# 定义序列的长度
num_points = 200# --- 1. 生成随机序列数据 ---# 白噪声序列
white_noise= np.random.randn(num_points)# 趋势序列(均值随时间变化,非平稳序列)
trend = np.linspace(0, 5, num_points)  # 线性趋势
trend_noise = np.random.randn(num_points)  # 随机噪声
trend_series = trend + trend_noise# 季节性序列(周期性变化)
seasonal_period = 10  # 季节周期
seasonal = np.sin(np.linspace(0, 2 * np.pi * (num_points // seasonal_period), num_points))
seasonal_noise = np.random.randn(num_points) * 0.3  # 较小的随机噪声
seasonal_series = seasonal + seasonal_noise# --- 2. 可视化序列 ---# 可视化三种序列
fig, axes = plt.subplots(3, 2, figsize=(14, 12))# 趋势序列
axes[0, 0].plot(trend_series)
axes[0, 0].set_title('趋势序列')
axes[0, 0].set_xlabel('时间')
axes[0, 0].set_ylabel('值')
axes[0, 0].axhline(y=0, color='r', linestyle='--', label='Mean (均值 ≈ 0)')
axes[0, 0].grid(True, linestyle='--', alpha=0.6)
axes[0, 0].legend()
plot_acf(trend_series, lags=30, ax=axes[0, 1])
axes[0, 1].set_title('趋势序列的ACF')# 季节性序列
axes[1, 0].plot(seasonal_series)
axes[1, 0].set_title('季节性序列')
axes[1, 0].set_xlabel('时间')
axes[1, 0].set_ylabel('值')
axes[1, 0].axhline(y=0, color='r', linestyle='--', label='Mean (均值 ≈ 0)')
axes[1, 0].grid(True, linestyle='--', alpha=0.6)
axes[1, 0].legend()
plot_acf(seasonal_series, lags=30, ax=axes[1, 1])
axes[1, 1].set_title('季节性序列的ACF')# 白噪声序列
axes[2, 0].plot(white_noise)
axes[2, 0].set_title('白噪声序列')
axes[2, 0].set_xlabel('时间')
axes[2, 0].set_ylabel('值')
axes[2, 0].axhline(y=0, color='r', linestyle='--', label='Mean (均值 ≈ 0)')
axes[2, 0].grid(True, linestyle='--', alpha=0.6)
axes[2, 0].legend()
plot_acf(white_noise, lags=30, ax=axes[2, 1])
axes[2, 1].set_title('白噪声序列的ACF')plt.tight_layout()
plt.show()    

ADF平稳性检验

# --- 使用ADF检验来判断平稳性 ---
print("开始进行trend_series序列的ADF平稳性检验...")# 执行ADF检验
# adfuller()函数会返回一个包含多个结果的元组
adf_result = adfuller(trend_series)# 提取并展示主要结果
adf_statistic = adf_result[0]
p_value = adf_result[1]
critical_values = adf_result[4]print(f"ADF统计量 (ADF Statistic): {adf_statistic:.4f}")
print(f"p值 (p-value): {p_value:.4f}")
print("临界值 (Critical Values):")
for key, value in critical_values.items():print(f'    {key}: {value:.4f}')print("\n--- 检验结论 ---")
# 根据p值进行判断
if p_value < 0.05:print(f"p-value ({p_value:.4f}) 小于 0.05,我们强烈拒绝原假设(H₀)。")print("结论:trend_series序列是平稳的 (Stationary)。")
else:print(f"p-value ({p_value:.4f}) 大于或等于 0.05,我们无法拒绝原假设(H₀)。")print("结论:trend_series序列是非平稳的 (Non-stationary)。")# 也可以通过比较ADF统计量和临界值来判断,结论是一致的
if adf_statistic < critical_values['5%']:print("\n补充判断:ADF统计量小于5%的临界值,同样表明序列是平稳的。")print('*'*60)
print("开始进行seasonal_series序列的ADF平稳性检验...")# 执行ADF检验
# adfuller()函数会返回一个包含多个结果的元组
adf_result = adfuller(seasonal_series)# 提取并展示主要结果
adf_statistic = adf_result[0]
p_value = adf_result[1]
critical_values = adf_result[4]print(f"ADF统计量 (ADF Statistic): {adf_statistic:.4f}")
print(f"p值 (p-value): {p_value:.4f}")
print("临界值 (Critical Values):")
for key, value in critical_values.items():print(f'    {key}: {value:.4f}')print("\n--- 检验结论 ---")
# 根据p值进行判断
if p_value < 0.05:print(f"p-value ({p_value:.4f}) 小于 0.05,我们强烈拒绝原假设(H₀)。")print("结论:seasonal_series序列是平稳的 (Stationary)。")
else:print(f"p-value ({p_value:.4f}) 大于或等于 0.05,我们无法拒绝原假设(H₀)。")print("结论:seasonal_series序列是非平稳的 (Non-stationary)。")# 也可以通过比较ADF统计量和临界值来判断,结论是一致的
if adf_statistic < critical_values['5%']:print("\n补充判断:ADF统计量小于5%的临界值,同样表明序列是平稳的。")print('*'*60)
print("开始进行white_noise序列的ADF平稳性检验...")# 执行ADF检验
# adfuller()函数会返回一个包含多个结果的元组
adf_result = adfuller(white_noise)# 提取并展示主要结果
adf_statistic = adf_result[0]
p_value = adf_result[1]
critical_values = adf_result[4]print(f"ADF统计量 (ADF Statistic): {adf_statistic:.4f}")
print(f"p值 (p-value): {p_value:.4f}")
print("临界值 (Critical Values):")
for key, value in critical_values.items():print(f'    {key}: {value:.4f}')print("\n--- 检验结论 ---")
# 根据p值进行判断
if p_value < 0.05:print(f"p-value ({p_value:.4f}) 小于 0.05,我们强烈拒绝原假设(H₀)。")print("结论:seasonal_series序列是平稳的 (Stationary)。")
else:print(f"p-value ({p_value:.4f}) 大于或等于 0.05,我们无法拒绝原假设(H₀)。")print("结论:seasonal_series序列是非平稳的 (Non-stationary)。")# 也可以通过比较ADF统计量和临界值来判断,结论是一致的
if adf_statistic < critical_values['5%']:print("\n补充判断:ADF统计量小于5%的临界值,同样表明序列是平稳的。")

时间序列分解

# 方法三:序列分解
print("\n--- 方法三:序列分解 ---")
# 使用statsmodels进行分解(假设为加法模型)
decomposition = seasonal_decompose(seasonal_series, model='additive', period=12)# 绘制分解图
fig = decomposition.plot()
fig.set_size_inches(14, 8)
plt.suptitle('时间序列分解图', y=1.02, fontsize=16)
plt.show()
# 观察:分解图清晰地将数据拆分成了趋势、季节性和残差。季节性部分呈现完美的年度周期,而残差看起来像随机噪声。

http://www.lryc.cn/news/574364.html

相关文章:

  • C#串口通讯实战指南
  • RAW图像简单可视化以及png、jpg的区别
  • 设计模式 - 抽象工厂
  • AI智能体——MCP 模型上下文协议
  • 71-Oracle Undo与Flashback管理(Guarantee设置)深度解析
  • vue3+ELInput无法输入的问题
  • 传输层协议UDP
  • 服务器中集群防御和单机防御分别是指什么?
  • (cvpr2025) DefMamba: Deformable Visual State Space Model
  • github常用插件
  • Java编程中的设计模式:单例模式的深度剖析
  • EEG分类攻略2-Welch 周期图
  • Python 数据分析与可视化 Day 5 - 数据可视化入门(Matplotlib Seaborn)
  • Spring Boot使用MCP服务器
  • Flask框架index.html里引用的本地的js和css或者图片
  • EEG分类 - Theta 频带 power
  • C++ Vector 基础入门操作
  • QML革命:下一代GUI开发的核心优势详解
  • 论文笔记:Answering POI-Recommendation Questions using TourismReviews
  • 单片机——浮点数转换4位数码管显示
  • 【笔记】在Cygwin上使用mintty连接wsl
  • 1.2、CAN总线帧格式
  • Apache SeaTunnel Flink引擎执行流程源码分析
  • DeepSeek今天喝什么随机奶茶推荐器
  • 如何利用Charles抓包工具提升API调试与性能优化
  • 组件化设计核心:接口与实现分离(C++)
  • 拼团系统多层限流架构详解
  • 《去哪儿网Redis高并发实战:从问题定位到架构升级》
  • 边缘-云协同智能视觉系统:实时计算与云端智能的融合架构
  • C++的前世今生-C++11