Python打卡训练营Day56

DAY 56 时序数据的检验

知识点回顾:

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

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

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

import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
# 中文显示设置
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示为方块的问题# --- 1. 生成随机序列数据 ---# 为了让每次运行的结果都一样,设置一个随机种子(可选)
np.random.seed(42)# 定义序列的长度
num_points = 200# 生成一个包含 200 个点的随机序列
# np.random.randn() 从标准正态分布(均值为0,方差为1)中抽取随机样本
random_sequence = np.random.randn(num_points)print("生成的前10个数据点:")
print(random_sequence[:10])# --- 2. 可视化序列 ---# 设置图形大小
plt.figure(figsize=(12, 6))# 绘制线图
plt.plot(random_sequence, label='Random Sequence (White Noise)')# 添加标题和标签
plt.title('Visualization of a Randomly Generated Sequence', fontsize=16)
plt.xlabel('Time Step (时间步)', fontsize=12)
plt.ylabel('Value (值)', fontsize=12)# 添加一条水平线,表示序列的均值(接近于0)
plt.axhline(y=0, color='r', linestyle='--', label='Mean (均值 ≈ 0)')# 显示网格和图例
plt.grid(True, linestyle='--', alpha=0.6)
plt.legend()# 显示图形
plt.show()from statsmodels.graphics.tsaplots import plot_acf 
print("--- 开始检验白噪声属性 ---")# 检验 1: 均值是否接近 0
mean = np.mean(random_sequence)
print(f"1. 序列的均值: {mean:.4f}")
if -0.1 < mean < 0.1:print("   (结论: 均值非常接近0,满足条件。)\n")
else:print("   (结论: 均值偏离0较远。)\n")# 检验 2: 方差是否恒定(且接近理论值1)
# 对于我们生成的数据,方差恒定是与生俱来的。我们主要检查其值。
variance = np.var(random_sequence)
print(f"2. 序列的方差: {variance:.4f}")
if 0.8 < variance < 1.2:print("   (结论: 方差接近于1,满足条件。np.random.randn理论方差为1)\n")
else:print("   (结论: 方差偏离1较远。)\n")# 检验 3: 自相关性是否为 0
# 这是最核心的检验。我们通过绘制ACF图来完成。
print("3. 检验自相关性 (使用ACF图):")
print("   - ACF图展示了序列与它过去值之间的相关性。")
print("   - 对于白噪声,只有lag=0时相关性为1,其他所有lag的相关性都应在蓝色置信区间内(统计上不显著)。")# 创建一个新的图形来绘制ACF图
fig, ax = plt.subplots(figsize=(12, 5))
plot_acf(random_sequence, lags=30, ax=ax) # 我们查看前30个滞后的相关性
ax.set_title('序列的自相关函数图 (ACF Plot)')
ax.set_xlabel('Lag (滞后阶数)')
ax.set_ylabel('Autocorrelation (自相关系数)')
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()from statsmodels.graphics.tsaplots import plot_pacf # 引入PACF图
# --- 绘制PACF图 ---
fig, ax = plt.subplots(figsize=(12, 5))
plot_pacf(random_sequence, lags=30, ax=ax)
ax.set_title('序列的偏自相关函数图 (PACF Plot)')
ax.set_xlabel('Lag (滞后阶数)')
ax.set_ylabel('Partial Autocorrelation')
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()# --- 新增:使用 Ljung-Box 检验进行严格的白噪声检验 ---
# 引入Ljung-Box检验的函数
from statsmodels.stats.diagnostic import acorr_ljungbox 
print("\n" + "="*50)
print("4. 进行严格的白噪声检验 (Ljung-Box Test)")
print("="*50)
print("   - 原假设(H₀): 序列是白噪声。")
print("   - 判断标准: 如果 p-value > 0.05,则接受原假设,认为序列是白噪声。")# 执行Ljung-Box检验
# 我们通常会检查一系列的滞后项,比如前10、20、30个
# 函数返回一个包含统计量和p值的DataFrame
ljung_box_result = acorr_ljungbox(random_sequence, lags=[10, 20, 30], return_df=True)print("\nLjung-Box检验结果:")
print(ljung_box_result)# --- 结论解释 ---
print("\n--- 检验结论 ---")
# 我们可以检查最后一个(最严格的)p值
# .iloc[-1] 获取最后一行, .loc['lb_pvalue'] 获取p值
last_p_value = ljung_box_result.iloc[-1]['lb_pvalue']if last_p_value < 0.05:print(f"在滞后30阶时,p-value ({last_p_value:.4f}) 小于 0.05。")print("结论:我们拒绝原假设,该序列不是白噪声。")
else:print(f"在滞后30阶时,p-value ({last_p_value:.4f}) 大于 0.05。")print("结论:我们无法拒绝原假设,该序列是白噪声。")# 引入ADF检验的函数
from statsmodels.tsa.stattools import adfuller # --- 新增:使用ADF检验来判断平稳性 ---print("开始进行ADF平稳性检验...")# 执行ADF检验
# adfuller()函数会返回一个包含多个结果的元组
adf_result = adfuller(random_sequence)# 提取并展示主要结果
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("结论:该序列是平稳的 (Stationary)。")
else:print(f"p-value ({p_value:.4f}) 大于或等于 0.05,我们无法拒绝原假设(H₀)。")print("结论:该序列是非平稳的 (Non-stationary)。")# 也可以通过比较ADF统计量和临界值来判断,结论是一致的
if adf_statistic < critical_values['5%']:print("\n补充判断:ADF统计量小于5%的临界值,同样表明序列是平稳的。")import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.graphics.tsaplots import plot_acf
# 显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False# --- 1. 创建一个带季节性的序列 ---
# 我们模拟一个为期5年的月度数据(60个点)
num_points = 60
time = np.arange(num_points)# a. 创建一个线性趋势
trend = 0.5 * time# b. 创建一个季节性成分(周期为12个月)
# 使用sin函数来模拟年度周期性波动
seasonal_component = 15 * np.sin(2 * np.pi * time / 12)# c. 创建一些随机噪声
np.random.seed(10)
noise = np.random.randn(num_points) * 2# d. 合成最终序列
seasonal_data = trend + seasonal_component + noise# --- 2. 开始检验季节性 ---# 方法一:肉眼观察
print("--- 方法一:肉眼观察 ---")
plt.figure(figsize=(14, 6))
plt.plot(seasonal_data)
plt.title('带趋势和季节性的时间序列图', fontsize=16)
plt.xlabel('时间步 (月)')
plt.ylabel('值')
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()
# 观察:我们可以清晰地看到一个整体上升的趋势,以及每年重复的波峰和波谷。# 方法二:ACF图
print("\n--- 方法二:ACF图 ---")
fig, ax = plt.subplots(figsize=(14, 6))
plot_acf(seasonal_data, lags=30, ax=ax)
ax.set_title('季节性序列的ACF图')
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()
# 观察:ACF图不仅整体缓慢下降(表明有趋势),更重要的是在lag=12和24的位置出现了明显的峰值!# 方法三:序列分解
print("\n--- 方法三:序列分解 ---")
# 使用statsmodels进行分解(假设为加法模型)
decomposition = seasonal_decompose(seasonal_data, model='additive', period=12)# 绘制分解图
fig = decomposition.plot()
fig.set_size_inches(14, 8)
plt.suptitle('时间序列分解图', y=1.02, fontsize=16)
plt.show()
# 观察:分解图清晰地将数据拆分成了趋势、季节性和残差。季节性部分呈现完美的年度周期,而残差看起来像随机噪声。

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

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

什么叫做白噪声呢?他需要满足以下条件:

1. 均值为0

2. 方差恒定

3. 自相关性为0(即过去的值对未来的值没有影响)

# 构造数据集 24h动态变化周期性的函数 模拟5day中每个24h人口流动的数据集 
num_points = 120
time = np.arange(num_points)# a. 创建一个线性趋势
trend = 1.0 * time# b. 创建一个季节性成分(周期为24h)
# 使用sin函数来模拟周期性波动
day_component = 15 * np.sin(2 * np.pi * time / 24)# c. 创建一些随机噪声
np.random.seed(10)
noise = np.random.randn(num_points) * 2# d. 合成最终序列
daily_data = trend + day_component + noise#step0 可视化
# 设置图形大小
plt.figure(figsize=(12, 6))# 绘制线图
plt.plot(daily_data, label='Daily Data')# 添加标题和标签
plt.title('Visualization of a 24h Dynamic Periodic Time Series', fontsize=16)
plt.xlabel('Time Step (时间步)', fontsize=12)
plt.ylabel('Value (值)', fontsize=12)# 添加一条水平线,表示序列的均值(接近于0)
plt.axhline(y=0, color='r', linestyle='--', label='Mean (均值 ≈ 0)')# 显示网格和图例
plt.grid(True, linestyle='--', alpha=0.6)
plt.legend()# 显示图形
plt.show()#step1 可预测性检验 使用 Ljung-Box 检验进行严格的白噪声检验 
print("\n" + "="*50)
print("4. 进行严格的白噪声检验 (Ljung-Box Test)")
print("="*50)
print("   - 原假设(H₀): 序列是白噪声。")
print("   - 判断标准: 如果 p-value > 0.05,则接受原假设,认为序列是白噪声。")# 执行Ljung-Box检验
# 我们通常会检查一系列的滞后项,比如前10、20、30个
# 函数返回一个包含统计量和p值的DataFrame
ljung_box_result = acorr_ljungbox(daily_data, lags=[10, 20, 30], return_df=True)print("\nLjung-Box检验结果:")
print(ljung_box_result)# --- 结论解释 ---
print("\n--- 检验结论 ---")
# 我们可以检查最后一个(最严格的)p值
# .iloc[-1] 获取最后一行, .loc['lb_pvalue'] 获取p值
last_p_value = ljung_box_result.iloc[-1]['lb_pvalue']if last_p_value < 0.05:print(f"在滞后30阶时,p-value ({last_p_value:.4f}) 小于 0.05。")print("结论:我们拒绝原假设,该序列不是白噪声。")
else:print(f"在滞后30阶时,p-value ({last_p_value:.4f}) 大于 0.05。")print("结论:我们无法拒绝原假设,该序列是白噪声。")#step2 平稳性检验
# --- 新增:使用ADF检验来判断平稳性 ---print("开始进行ADF平稳性检验...")# 执行ADF检验
# adfuller()函数会返回一个包含多个结果的元组
adf_result = adfuller(daily_data)# 提取并展示主要结果
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("结论:该序列是平稳的 (Stationary)。")
else:print(f"p-value ({p_value:.4f}) 大于或等于 0.05,我们无法拒绝原假设(H₀)。")print("结论:该序列是非平稳的 (Non-stationary)。")# 也可以通过比较ADF统计量和临界值来判断,结论是一致的
if adf_statistic < critical_values['5%']:print("\n补充判断:ADF统计量小于5%的临界值,同样表明序列是平稳的。")#step3 结构识别(序列分解,ACF/PACF)
print("\n--- 方法二:ACF图 ---")
fig, ax = plt.subplots(figsize=(14, 6))
plot_acf(daily_data, lags=30, ax=ax)
ax.set_title('24h序列的ACF图')
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()
# 观察:ACF图不仅整体缓慢下降(表明有趋势)# 方法三:序列分解
print("\n--- 方法三:序列分解 ---")
# 使用statsmodels进行分解(假设为加法模型)
decomposition = seasonal_decompose(daily_data, model='additive', period=24)# 绘制分解图
fig = decomposition.plot()
fig.set_size_inches(14, 8)
plt.suptitle('时间序列分解图', y=1.02, fontsize=16)
plt.show()
# 观察:分解图清晰地将数据拆分成了趋势、季节性和残差。季节性部分呈现完美的年度周期,而残差看起来像随机噪声。#stpe4 数据清洗 箱线图和Z分数识别异常值
# 绘制箱线图
plt.figure(figsize=(12, 6))
plt.boxplot(daily_data, vert=False, widths=0.5, patch_artist=True, boxprops=dict(facecolor='blue', color='blue'))
plt.title('24h动态周期性时间序列的箱线图', fontsize=16)
plt.xlabel('值', fontsize=12)
plt.yticks([])  # 隐藏y轴刻度
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()
# 观察:箱线图显示了数据的四分位数、中位数和异常值。这里没有明显的异常值,数据分布相对比较均匀。# 计算Z分数并识别异常值
# 计算Z分数
z_scores = np.abs((daily_data - daily_data.mean()) / daily_data.std())# 定义Z分数阈值(例如:超过3个标准差)
z_threshold = 3# 识别异常值
outlier_indices = np.where(z_scores > z_threshold)[0]# 打印异常值的索引和值
if outlier_indices.size > 0:print(f"发现 {outlier_indices.size} 个异常值(超过Z分数阈值):")for idx in outlier_indices:print(f"索引 {idx}: 值 {daily_data[idx]:.4f}, Z分数 {z_scores[idx]:.4f}")
else:print("没有发现异常值。")

==================================================

进行严格的白噪声检验 (Ljung-Box Test) ================================================== -

原假设(H₀): 序列是白噪声。

- 判断标准: 如果 p-value > 0.05,则接受原假设,认为序列是白噪声。

Ljung-Box检验结果: lb_stat lb_pvalue 10 869.534899 2.289377e-180 20 1307.450690 7.507512e-265 30 1529.131369 2.447689e-303

--- 检验结论 --- 在滞后30阶时,p-value (0.0000) 小于 0.05。

结论:我们拒绝原假设,该序列不是白噪声。

开始进行ADF平稳性检验

... ADF统计量 (ADF Statistic): -0.2350

p值 (p-value): 0.9342

临界值 (Critical Values): 1%: -3.4936    5%: -2.8892   10%: -2.5815

--- 检验结论 --- p-value (0.9342) 大于或等于 0.05,我们无法拒绝原假设(H₀)。

结论:该序列是非平稳的 (Non-stationary)。

Z-scores 没有发现异常值。

浙大疏锦行-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/84724.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/84724.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[GESP202312 五级] 烹饪问题

题目描述 有 N N N 种食材&#xff0c;编号从 0 0 0 至 N − 1 N-1 N−1&#xff0c;其中第 i i i 种食材的美味度为 a i a_i ai​。 不同食材之间的组合可能产生奇妙的化学反应。具体来说&#xff0c;如果两种食材的美味度分别为 x x x 和 y y y &#xff0c;那么它们…

JSON Mock 工具:从接口模拟到前端联调(二)

JSON Mock 工具&#xff1a;模拟JSON API 接口&#xff08;一&#xff09;-CSDN博客 上一篇学习到&#xff0c;JSON Mock 工具&#xff0c;是用于模拟返回 JSON 数据的 API 接口&#xff0c;解决后端接口未就绪时前端无法开发测试的问题&#xff0c;实现 “无后端依赖” 的前端…

质量小议55 - 搜索引擎与AI

先有搜索引擎(谷歌、百度)&#xff0c;后有AI(chatGPT&#xff0c;deepSeek&#xff0c;文心一主&#xff0c;CSDN助手) 慢慢的百度用的少了&#xff0c;更多的是直接向AI工具提问 虽然搜索引擎也有了AI版的结果&#xff0c;而且是置顶的&#xff0c;但更多的时间在用A…

Life:Internship in OnSea Day 0

Prolog This will be a new serial Blog to record my internship life in OnSea(I like this straightly translation of hell divers). As usual&#xff0c;这些 Blogs 主要还是给 自分自身 看的&#xff0c;以便日后考古自己的 career。 既然已经这个系列归类到了 Life 类…

ChangeNotifierProvider 本质上也是 Widget

场景 void main() {runApp(MyApp()); }class MyApp extends StatelessWidget {const MyApp({super.key});overrideWidget build(BuildContext context) {return ChangeNotifierProvider(create: (context) > MyAppState(),child: MaterialApp(title: Namer App,theme: Them…

【软考高级系统架构论文】论负载均衡技术在Web系统中的应用

论文真题 负载均衡技术是提升Web系统性能的重要方法。利用负载均衡技术&#xff0c;可将负载(工作任务)进行平衡、分摊到多个操作单元上执行&#xff0c;从而协同完成工作任务&#xff0c;达到提升Web系统性能的目的。 请围绕“负载均衡技术在Web系统中的应用”论题&#xff…

pyqt5工具-串口调试工具

目录 功能界面代码功能 串口设置:支持选择串口、波特率、数据位、停止位和校验位 串口操作:扫描串口、打开 / 关闭串口连接 数据收发: 支持文本和 Hex 模式显示与发送 可设置自动添加换行符 接收区自动滚动 支持中文显示 辅助功能:清空接收区、状态栏显示连接状态 多串口管…

Mybatis-Plus支持多种数据库

使用Mybatis-Plus进行数据库的访问&#xff0c;但是由于不同的数据库有不同的方言&#xff0c;所以需要进行适配。 有2种实现方式&#xff1a; databaseId方式Mapper Location方式 指定databaseId方式 通过databaseId指定所使用的数据库&#xff0c;选择同步的SQL。 Mappe…

【系统分析师】2018年真题:综合知识-答案及详解

【第1题】 面向对象分析中&#xff0c;对象是类的实例。对象的构成成分包含了&#xff08;1&#xff09;&#xff0c;属性和方法&#xff08;或操作&#xff09;。 (1)A.标识 B.消息 C.规则 D.结构 【解析】本题考查的是面向对象的基本概念 对象的三要素为&#xff1a;属性…

从Git历史中删除大文件的完整解决方案

从Git历史中删除大文件的完整解决方案 当你意外提交了一个大文件导致无法推送到远程仓库时&#xff0c;可以按照以下步骤彻底从Git历史中删除这个大文件。 情况分析 首先确认你的问题属于以下哪种情况&#xff1a; 大文件在最近一次提交中&#xff1a;相对容易处理大文件在…

[xiaozhi-esp32] 应用层(9种state) | 音频编解码层 | 双循环架构

第三章&#xff1a;应用层 在第一章&#xff1a;开发板抽象层中&#xff0c;我们实现了硬件交互标准化&#xff1b;在第二章&#xff1a;通信协议层中&#xff0c;我们构建了云端通信桥梁。 现在需要将这些能力有机整合——这便是应用层的使命 应用层的本质 应用层是设备的…

Java 锁升级的过程详解

Java 锁升级的过程详解 Java 虚拟机(JVM)为了提高多线程并发的效率,对内置锁(synchronized 关键字)的实现进行了一系列优化。这些优化体现在锁的升级过程中,即当竞争程度从低到高变化时,锁的状态会从偏向锁逐渐升级为轻量级锁,最终升级为重量级锁。这个过程是不可逆的…

使用vitis tcl脚本构建vitis app工程

一&#xff1a;最近重新学习了zynq系列开发&#xff0c;想着使用tcl创建工程&#xff0c;因此分享一下脚本例子 #!/bin/bashsource /tools/Xilinx/Vitis/2022.2/settings64.sh cd ../../ . ./script/project.sh cd app/script #tcl脚本只能在虚拟机桌面执行 xsct build_vitis…

电脑商城--购物车

加入购物车 1 购物车-创建数据表 1.使用use命令先选中store数据库。 USE store; 2.在store数据库中创建t_cart用户数据表。 CREATE TABLE t_cart (cid INT AUTO_INCREMENT COMMENT 购物车数据id,uid INT NOT NULL COMMENT 用户id,pid INT NOT NULL COMMENT 商品id,price BIG…

2024-2025学年度下期《网页设计》期末模拟测试

一、 单选题 1. HTML文档的根标签是( ) A. <html> B. <head> C. <body> D. <!DOCTYPE> 2. 用于定义段落内容的标签是&#xff1a;( ) A. <div> B. <p> C. <span> D. <br> 3. 网以下哪个属性用于定义CSS内联样式…

搭建加解密网站遇到的问

本机向云服务器传输文件 用winscp 服务器在安装 SSH 服务时自动生成密钥对&#xff08;公钥私钥&#xff09; 为什么要有指纹验证&#xff1f; 防止中间人攻击&#xff08;Man-in-the-Middle&#xff09; 指纹验证打破这个攻击链&#xff1a; 小问题 安装python时 ./confi…

CSS 制作学成在线网页

1 项目结构 1.1 总结 2 网页制作思路 3 header 区域 - 布局 3.1 通栏 3.2 logo 3.3 导航 3.4 搜索区域 3.5 用户区域 4 banner 区域 4.1 左侧侧导航 4.2 右侧课程表 5 精品推荐 6 推荐课程区域 参考链接&#xff1a; 82-准备工作-项目目录与版心_哔哩哔哩_bilibili

图灵完备之路(数电学习三分钟)----门的多路化

上一章中我们学习了如何用与非门实现其他逻辑门&#xff0c;但上节中的输入信号始终为2&#xff0c;但在现实中&#xff0c;输入的信号数量是不确定的&#xff0c;所以我们需要设计多输入的门&#xff1a; 1.三路与非门&#xff08;卡诺图法&#xff09; 我们还是从与非门开始…

【前端】二进制文件流下载(get、post)再谈一次

最近二进制文件流下载可谓是又出幺蛾子&#xff0c;翻阅以前的文章也找不到解决方案&#xff0c;感觉还是没用完全理解&#xff0c;这次再整理一遍。 先说一个通用场景&#xff0c;就是无论get还是post在接口请求的时候设定好 headers: { Content-Type: application/json;cha…

uv功能介绍和完整使用示例总结

以下是关于 UV 工具的完整使用示例总结,结合其核心功能与典型场景,帮助用户快速上手并高效管理 Python 项目: 一、安装与配置 快速安装 macOS/Linux:curl -LsSf https://astral.sh/uv/install.sh | shWindows:powershell -ExecutionPolicy ByPass -c "irm https://as…