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

进阶篇 第 4 篇:驾驭季节性波动 - SARIMA 模型实战

进阶篇 第 4 篇:驾驭季节性波动 - SARIMA 模型实战

Wavy Patterns or Seasonal Landscape
(图片来源: Pixabay on Pexels)

在上一篇中,我们深入探索了经典的 ARIMA(p,d,q) 模型。它通过整合自回归 (AR)、差分 (I) 和移动平均 (MA) 提供了一个强大的框架来对(处理后)平稳的时间序列进行建模。然而,我们也观察到,对于像 CO2 浓度这样具有明显季节性波动的数据,仅仅使用 ARIMA 可能不足以完全捕捉其动态,模型的残差中可能仍会留下明显的季节性模式。

那么,如何让 ARIMA 模型直接拥抱并处理这种周期性的起伏呢?答案就是它的扩展版本——SARIMA 模型,全称季节性差分整合移动平均自回归模型 (Seasonal Autoregressive Integrated Moving Average)

本篇,我们将一起:

  1. 解构 SARIMA(p,d,q)(P,D,Q)s: 揭开季节性参数的神秘面纱。
  2. 升级建模流程: 学习如何在 Box-Jenkins 方法中融入季节性考量。
  3. 实战演练: 使用 Python (statsmodels) 对具有季节性的数据构建、诊断和预测 SARIMA 模型。
  4. 对比与提升: 看看 SARIMA 相对于简单 ARIMA 在处理季节性数据上的优势。

准备好让你的时间序列模型“感知”季节的变化了吗?

解构 SARIMA(p,d,q)(P,D,Q)s 模型

SARIMA 模型在 ARIMA(p,d,q) 的基础上,增加了一组季节性参数 (P,D,Q)s,专门用来描述数据在季节性周期上的相关性结构。

  • (p, d, q): 这部分与 ARIMA 模型完全相同,描述的是序列的短期、非季节性相关性。

    • p: 非季节性 AR 阶数
    • d: 非季节性差分次数
    • q: 非季节性 MA 阶数
  • (P, D, Q)s: 这部分是新增的,描述的是序列的长期、季节性相关性。

    • s (Seasonality): 季节性周期长度。这是最关键的参数之一,必须根据数据特点指定(例如,对于月度数据年度季节性,s=12;对于季度数据年度季节性,s=4;对于日数据周季节性,s=7)。
    • P (Seasonal AR Order): 季节性自回归阶数。表示当前值与过去 P 个季节周期的对应值(例如 y(t-s), y(t-2s), …)之间的关系。
    • D (Seasonal Difference Order): 季节性差分次数。表示为了消除季节性而需要进行的差分次数。通常 D 取 0 或 1。季节性差分计算为 y'(t) = y(t) - y(t-s)
    • Q (Seasonal MA Order): 季节性移动平均阶数。表示当前值与过去 Q 个季节周期的对应预测误差 (ε(t-s), ε(t-2s), …) 之间的关系。

直观理解: SARIMA 模型认为,一个时间点的值不仅与它紧邻的前几个点有关(由 (p,d,q) 描述),也与去年(或上个周期)同一时间点附近的值和误差有关(由 (P,D,Q)s 描述)。它通过两个 ARIMA 类的结构(一个作用于短期,一个作用于季节性滞后)巧妙地结合起来。

升级建模流程:融入季节性考量

SARIMA 的建模流程仍然遵循 Box-Jenkins 的思想(识别 -> 估计 -> 诊断 -> 预测),但在识别阶段需要额外考虑季节性:

步骤 1:模型识别 (Identification - 升级版)

  • 目标: 确定非季节性差分 d、季节性差分 D,以及初步判断非季节性阶数 (p, q) 和季节性阶数 (P, Q)。
  • 操作:
    • a. (非季节性) 平稳性检验与差分 (定 d): 与 ARIMA 相同,通过 ADF 检验等确定需要的普通差分次数 d。得到差分 d 次后的序列 y'
    • b. 季节性检验与差分 (定 D):
      • 观察 y' 的 ACF/PACF 图在季节性滞后位置 (s, 2s, 3s, …) 是否有显著的尖峰或缓慢衰减。如果 ACF 在这些位置缓慢衰减,通常暗示需要进行季节性差分。
      • 进行一次季节性差分 (D=1),得到 y'' = y'(t) - y'(t-s)通常 D=1 就足够了
      • 再次检验 y'' 的平稳性,并观察其 ACF/PACF 图,看季节性模式是否已消除。
    • c. 非季节性阶数识别 (定 p, q):
      • 观察最终差分后的序列 y'' 的 ACF/PACF 图的前几个滞后 (例如 lag 1, 2, 3…)。
      • 根据截尾/拖尾模式初步判断非季节性的 pq
    • d. 季节性阶数识别 (定 P, Q):
      • 观察最终差分后的序列 y'' 的 ACF/PACF 图在季节性滞后位置 (s, 2s, …) 是否有显著的尖峰。
      • 如果 ACF 在 lag s 处截尾,PACF 在 s, 2s, … 处拖尾,可能暗示需要 季节性 MA(1),即 Q=1, P=0
      • 如果 PACF 在 lag s 处截尾,ACF 在 s, 2s, … 处拖尾,可能暗示需要 季节性 AR(1),即 P=1, Q=0
      • 如果都在 s 处不显著,可能 P=0, Q=0
      • 季节性阶数 P, Q 通常不会很大(常见 0 或 1)。
    • 记录: 记录下你确定的 d, D, s 以及候选的 (p,q) 和 (P,Q) 组合。

步骤 2:参数估计 (Estimation)

  • 使用 statsmodels.tsa.statespace.SARIMAX 模块来拟合模型,需要同时提供 order=(p,d,q)seasonal_order=(P,D,Q,s) 参数。

步骤 3:模型诊断 (Diagnostic Checking)

  • 与 ARIMA 完全相同:检查最终模型的残差是否为白噪声(残差图、ACF/PACF 图、Ljung-Box 检验)。如果残差仍有结构(尤其是在季节性滞后处),需要返回步骤 1 调整阶数。

步骤 4:预测 (Forecasting)

  • 使用拟合好的 SARIMAX 模型进行预测。

Python 实战:构建 SARIMA 模型

我们再次使用月度 CO2 数据,它具有明显的上升趋势和年度季节性 (s=12)。

import pandas as pd
import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.stats.diagnostic import acorr_ljungbox# --- 1. 数据准备与识别 ---
co2_data = sm.datasets.co2.load_pandas().data['co2']
co2_data = co2_data.interpolate().resample('M').mean()# a. 非季节性差分 (定 d)
# 从上一篇已知,d=1 可能使趋势平稳
co2_d1 = co2_data.diff().dropna()# b. 季节性检验与差分 (定 D, s=12)
s = 12
# 绘制差分一次后数据的 ACF/PACF,观察季节性滞后
# fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# plot_acf(co2_d1, ax=axes[0], lags=40, title='ACF after 1 non-seasonal diff')
# plot_pacf(co2_d1, ax=axes[1], lags=40, title='PACF after 1 non-seasonal diff', method='ywm')
# plt.suptitle('Check for Seasonality after d=1', fontsize=16)
# plt.show()
# 预期:ACF 在 lag 12, 24 处可能仍然很高且缓慢衰减,提示需要 D=1co2_d1_D1 = co2_d1.diff(s).dropna() # 进行一次季节性差分 D=1
d=1
D=1print(f"--- Data after d={d} non-seasonal and D={D} seasonal differencing (s={s}) ---")
# 检验最终差分后数据的平稳性 (可选)
adf_test = sm.tsa.stattools.adfuller(co2_d1_D1)
print(f'ADF p-value after differencing: {adf_test[1]:.3f}') # 应远小于 0.05# c & d. 识别 p, q, P, Q
# 绘制最终差分后数据的 ACF/PACF 图
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
plot_acf(co2_d1_D1, ax=axes[0], lags=40, title='ACF after d=1, D=1')
plot_pacf(co2_d1_D1, ax=axes[1], lags=40, title='PACF after d=1, D=1', method='ywm')
plt.suptitle(f'ACF/PACF after d={d}, D={D}, s={s}', fontsize=16)
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
plt.show()
# 根据图形判断:
# 短期滞后 (lag 1, 2...): 可能 ACF 在 lag 1 截尾,PACF 拖尾 -> 尝试 q=1, p=0 ?
# 季节性滞后 (lag 12, 24...): 可能 ACF 在 lag 12 截尾,PACF 拖尾 -> 尝试 Q=1, P=0 ?
# 结合起来,一个可能的候选模型是 SARIMA(0,1,1)(0,1,1,12)
# 这只是一个示例判断,真实分析可能需要尝试更多组合# --- 2. 参数估计 ---
# 选定一个候选模型,例如 SARIMA(1,1,1)(1,1,1,12)
p, q = 1, 1
P, Q = 1, 1# 注意:模型是在原始数据上拟合,内部处理差分
model = SARIMAX(co2_data,order=(p, d, q),seasonal_order=(P, D, Q, s),enforce_stationarity=False, # Let model handle differencingenforce_invertibility=False)
model_fit = model.fit(disp=False) # disp=False to turn off verbose outputprint(f"\n--- Fitting SARIMA({p},{d},{q})({P},{D},{Q},{s}) Model ---")
print(model_fit.summary())# --- 3. 模型诊断 ---
print("\n--- Model Diagnostics ---")
residuals = model_fit.resid
fig = model_fit.plot_diagnostics(figsize=(12, 8))
plt.tight_layout()
plt.show()lb_test = acorr_ljungbox(residuals, lags=[2*s], return_df=True) # 检验到 2 倍季节周期
print("\nLjung-Box Test for Residual Autocorrelation:")
print(lb_test)
# 检查 p-value 是否 > 0.05# --- 4. 预测 ---
n_forecast = 36 # 预测未来 3 年
forecast_result = model_fit.get_forecast(steps=n_forecast)
forecast_values = forecast_result.predicted_mean
confidence_intervals = forecast_result.conf_int()plt.figure(figsize=(12, 6))
plt.plot(co2_data.index, co2_data, label='Observed')
# plt.plot(co2_data['2000':].index, co2_data['2000':], label='Observed (Zoomed)') # 可选:放大看近期
plt.plot(forecast_values.index, forecast_values, label='SARIMA Forecast', color='red')
plt.fill_between(confidence_intervals.index,confidence_intervals.iloc[:, 0],confidence_intervals.iloc[:, 1],color='pink', alpha=0.5, label='95% Confidence Interval')
plt.title(f'SARIMA({p},{d},{q})({P},{D},{Q},{s}) Forecast for CO2 Data')
plt.xlabel('Date')
plt.ylabel('CO2 Concentration')
plt.legend()
plt.show()

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

解读与对比:

  • 最终差分后的 ACF/PACF: 观察季节性差分 (D=1) 是否有效消除了季节性滞后处的强相关性。根据剩余的模式判断 p,q, P,Q。
  • 模型摘要: 查看季节性参数 (ar.S, ma.S) 是否显著。比较 SARIMA 模型的 AIC/BIC 值与上一篇简单 ARIMA 模型的 AIC/BIC 值,SARIMA 的值通常会更低,表明模型拟合更好。
  • 诊断图: 重点关注残差 ACF 图在季节性滞后位置是否还有显著尖峰。理想的 SARIMA 模型应该能消除这些季节性残留。检查 Ljung-Box p 值。
  • 预测图: 观察 SARIMA 的预测是否能同时捕捉到趋势和季节性模式,这通常是它相对于简单 ARIMA 的主要优势。

(可选) 关于 SARIMAX 中的 ‘X’

statsmodels 实现的名字是 SARIMAX,那个 ‘X’ 代表外生变量 (eXogenous variables)。这意味着你可以在模型中加入其他可能影响目标时间序列的外部时间序列变量

例如,在预测销售额时,你可以将广告支出、节假日标志等作为外生变量加入模型。

# 假设你有外生变量 exog_data (一个 Pandas DataFrame/Series,索引与主数据对齐)
# model = SARIMAX(co2_data, exog=exog_data, order=(p,d,q), seasonal_order=(P,D,Q,s))
# model_fit = model.fit()
# 预测时也需要提供未来的外生变量值:
# forecast = model_fit.get_forecast(steps=n_forecast, exog=future_exog_data)

注意: 使用外生变量进行预测时,你必须拥有(或能够准确预测)未来时期的外生变量值,这可能是一个挑战。

总结

本篇我们成功地将 ARIMA 模型升级,学会了使用 SARIMA(p,d,q)(P,D,Q)s 模型来处理具有明显季节性的时间序列数据:

  • 理解了季节性参数 P, D, Q, s 的含义。
  • 掌握了如何在模型识别阶段确定季节性差分 D 和季节性阶数 P, Q。
  • 实践了使用 statsmodels.tsa.statespace.SARIMAX 进行完整的建模、诊断和预测流程。
  • 认识到 SARIMA 在捕捉季节性模式上的优势,以及 SARIMAX 加入外生变量的能力。

SARIMA 是处理带有季节性趋势数据的强大经典工具。熟练掌握它,你将能解决更多样的时间序列预测问题。

下一篇预告:
虽然 SARIMA 很强大,但有时参数选择和模型诊断仍然繁琐。有没有更“自动化”、更易于使用的现代预测工具,尤其擅长处理复杂的季节性和节假日效应?下一篇,我们将探索由 Facebook 开源的流行预测库——Prophet

敬请期待!


(尝试对 CO2 数据使用不同的 SARIMA 阶数组合,哪个组合的 AIC/BIC 最低且能通过诊断?改变季节性周期 s 会有什么影响?欢迎分享你的实验结果!)

相关文章:

进阶篇 第 4 篇:驾驭季节性波动 - SARIMA 模型实战

进阶篇 第 4 篇:驾驭季节性波动 - SARIMA 模型实战 (图片来源: Pixabay on Pexels) 在上一篇中,我们深入探索了经典的 ARIMA(p,d,q) 模型。它通过整合自回归 (AR)、差分 (I) 和移动平均 (MA) 提供了一个强大的框架来对(处理后)平…...

Android调用springboot接口上传大字段,偶现接口超时的优化

介绍 最近有个功能,Android通过okhttp上传实体类,实体类包含一个大字段,上传的字符串长度达到300k,偶现接口超时的情况,大概100次有5次,看日志发现数据并没有到达接口,可能在网络传输中就超时了…...

[特殊字符]【Qt自定义控件】创意开关按钮 - 丝滑动画+自定义样式+信号交互 | 附完整源码

话不多说直接上代码 1、.mybutton.h #ifndef MYBUTTON_H #define MYBUTTON_H#include <QWidget> #include <QPropertyAnimation>class MyButton : public QWidget {Q_OBJECT public:explicit MyButton(QWidget *parent nullptr);protected:void paintEvent(QPain…...

大数据开发的基本流程

大数据开发通常围绕数据的“采集 → 存储 → 处理 → 分析 → 展示”几个阶段来展开。下面是一个典型的大数据开发基本流程&#xff08;适用于离线或实时场景&#xff09;&#xff1a; 一、数据采集&#xff08;Data Ingestion&#xff09; 目标&#xff1a;从各种来源采集原始…...

关于创建UNIX/Linux daemon进程的笔记

Linux daemon程序简单说就是Linux后台服务进程。 传统的、标准的创建方法&#xff1a;2次fork setsid 详细步骤 进程1&#xff08;父进程&#xff09;调用fork&#xff0c;创建子进程2&#xff0c;进程1退出。 1&#xff09;这个步骤是为第二部做铺垫。 2&#xff09;此时&a…...

国产紫光同创FPGA实现SDI视频编解码,基于HSSTHP高速接口,提供3套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目本博已有的 SDI 编解码方案本方案在Xilinx--Artix7系列FPGA上的应用本方案在Xilinx--Kintex系列FPGA上的应用本方案在Xilinx--Zynq系列FPGA上的应用本方案在Xilinx--U…...

Oracle--SQL性能优化与提升策略

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、导致性能问题的内在原因 系统性能问题的底层原因主要有三个方面&#xff1a; CPU占用率过高导致资源争用和等待内存使用率过高导致内存不足并需…...

drupal7可以从测试环境一键部署到生产环境吗

Drupal 7 本身并没有“内建的一键部署功能”&#xff0c;所以“从测试环境一键部署到生产环境”不能完全自动化完成&#xff0c;尤其是涉及数据库、配置和文件系统时。但你可以通过一些工具和方法实现接近“一键部署”的效果 ✅ &#x1f6a7; 为什么不能直接一键部署&#xff…...

vue项目中axios统一或单独控制接口请求时间

先说统一 这里将请求时间统一控制在12秒 // 使用由库提供的配置的默认值来创建实例 // 此时超时配置的默认值是 0 const axiosInstance axios.create()// 覆写库的超时默认值 // 现在&#xff0c;在超时前&#xff0c;所有请求时间统一控制在10秒 axiosInstance.defaults.ti…...

chromedp 反反爬设计方案

二、基础防护层实现 1. 浏览器特征伪装 opts : append(chromedp.DefaultExecAllocatorOptions[:],// 禁用自动化特征chromedp.Flag("disable-blink-features", "AutomationControlled"),chromedp.Flag("useAutomationExtension", false),// 随…...

OpenLDAP 管理 ELK 用户

文章目录 一、新建 ELK 相关用户组二、配置 Elasticsearch2.1 修改 elasticsearch.yml 配置2.2 使用 API 接口建立角色和用户映射 三、Kibana 验证用户登录 一、新建 ELK 相关用户组 由于后续要将 LDAP 的用户与 ELK 的角色进行映射&#xff0c;所以需先创建几个以 ELK 的角色…...

深度解析MQTT源码架构与AIGC场景融合实战

一、结构体内存优化&#xff1a;支撑千万级设备连接 1.1 紧凑内存布局设计 classDiagramclass MQTTClient_message {char struct_id[4]int struct_versionvoid* payloadint payloadlenint qosint retainedint dupint msgidMQTTProperties properties}note for MQTTClient_mes…...

Node.js 操作 ElasticSearch 完整指南:从安装到实战

本文将手把手教你如何搭建 ElasticSearch 环境&#xff0c;并通过 Node.js 实现高效数据检索。包含 10 个可直接复用的代码片段&#xff0c;助你快速掌握搜索、聚合等核心功能&#xff01; 环境搭建篇 1. ElasticSearch 安装要点 下载 es下载连接 下载下来后&#xff0c;进…...

Python+区块链:如何打造智能化资产管理系统?

Python+区块链:如何打造智能化资产管理系统? 在当今数字经济时代,区块链资产管理已成为金融科技、去中心化金融(DeFi)以及企业资金流转的关键应用。传统的资产管理往往依赖于中心化机构,存在数据透明度低、效率受限、管理成本高等问题,而区块链技术的出现,为资产管理提…...

Sentinel源码—8.限流算法和设计模式总结一

大纲 1.关于限流的概述 2.高并发下的四大限流算法原理及实现 3.Sentinel使用的设计模式总结 1.关于限流的概述 保护高并发系统的三把利器&#xff1a;缓存、降级和限流。限流就是通过限制请求的流量以达到保护系统的目的&#xff0c;比如秒杀抢购。具体就是对并发请求进行限…...

SpringMVC入门

1、SpringMVC概念 SpringMVC是在Spring框架的基础上引入MVC模式的思想&#xff0c;SpringMVC即是一种框架&#xff0c;也是一种思想&#xff0c;将前后端彻底分离&#xff0c;后端不再需要关注前端的代码。前后端分工明确 我们原先学习的MVC三层架构&#xff0c;MVC是web开发…...

MYSQL之库的操作

创建数据库 语法很简单, 主要是看看选项(与编码相关的): CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 1. 语句中大写的是…...

并发设计模式实战系列(3):工作队列

&#x1f31f; ​大家好&#xff0c;我是摘星&#xff01;​ &#x1f31f; 今天为大家带来的是并发设计模式实战系列&#xff0c;第三章工作队列&#xff08;Work Queue&#xff09;​​&#xff0c;废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 生产者-消费者架构 …...

已安装爱思助手和Apple相关驱动,但仍无法有线连接iPhone热点,且网络适配器没有Apple Mobile Device Ethernet,问题解决

已安装爱思助手和Apple相关驱动&#xff0c;但仍无法有线连接iPhone热点&#xff0c;且网络适配器没有Apple Mobile Device Ethernet 问题解决&#xff1a; 用爱思助手连接手机&#xff0c;点击工具箱 - iTunes及驱动 点击高级修复 在系统存储的旧驱动文件项右侧&#xff0…...

用 Go 优雅地清理 HTML 并抵御 XSS——Bluemonday

1、背景与动机 只要你的服务接收并回显用户生成内容&#xff08;UGC&#xff09;——论坛帖子、评论、富文本邮件正文、Markdown 等——就必须考虑 XSS&#xff08;Cross‑Site Scripting&#xff09;攻击风险。浏览器在解析 HTML 时会执行脚本&#xff1b;如果不做清理&#…...

MySQL基本查询与数据操作全面解析

目录 1. CRUD操作概述 2. Create操作详解 2.1 表的创建 2.2 单行数据插入 2.3 多行数据插入 2.4 插入冲突处理 3. Retrieve操作详解 3.1 基础查询 全列查询&#xff08;慎用&#xff09; 指定列查询 表达式查询 结果去重 3.2 条件查询&#xff08;WHERE子句&#…...

《C++ 模板:泛型编程的核心》

C模板详解 模板是C中实现泛型编程的重要特性&#xff0c;它允许你编写与数据类型无关的代码。模板可以分为函数模板和类模板两种。 1. 函数模板 函数模板允许你定义一个可以处理多种数据类型的函数。 基本语法 template <typename T> T functionName(T parameter1, T…...

Web3实战:从零开发你的ERC20代币合约

区块链技术的普及让代币发行不再是金融巨头的专利。本文将以Solidity 0.8.20和OpenZeppelin 5.0为技术栈&#xff0c;手把手教你开发具备铸造、销毁、权限管理等进阶功能的ERC20代币&#xff0c;并部署到以太坊Sepolia测试网。以下是完整开发路线图&#xff1a; 一、ERC20代币的…...

简述大疆无人机对接

文章目录 概述MSDK对接MSDK简介MSDK集成步骤直播推流获取飞机实时数据 UX SDK上云API上云API简介上云API对接步骤Pilot上云Pilot怎么安装配置三方云平台地址直播获取飞机数据 Dock上云Dock上云简介直播方案设备管理 如何对接多个飞机引用 概述 一般而言&#xff0c;对接大疆的…...

docker-compose搭建kafka

1、单节点docker-compose.yml version: 3 services:zookeeper:image: zookeeper:3.8container_name: zookeeperports:- "2181:2181"volumes:- ./data/zookeeper:/dataenvironment:ZOO_MY_ID: 1ZOO_MAX_CLIENT_CNXNS: 100kafka:image: bitnami/kafka:3.7container_na…...

FramePack V2版 - 支持首尾帧生成,支持LoRA,支持批量,支持50系显卡,一个强大的AI视频生成软件 本地一键整合包下载

FramePack 是斯坦福大学主导开发的视频生成框架&#xff0c;是一种用于视频生成的下一帧&#xff08;下一帧部分&#xff09;预测神经网络结构&#xff0c;可以逐步生成视频。FramePack 主要开发者之一&#xff0c;就是业内大名鼎鼎的张吕敏大佬&#xff0c;AI领域的“赛博佛祖…...

开发网页程序时预览时遇到跨域问题解决方法

CocosCreator 开发h5游戏要用接口、开发html程序网页程序在chrome中预览时都会遇到跨域问题,怎么办? 网上有很多方法,主要是通过服务器端去配置,但那个相对来说消弱安全问题,这个不建议,因为是开发,个人行业,我们知道问题所以,简单点就主要是通过chrome的参数来禁用: 关闭 Ch…...

【音视频】FFmpeg内存模型

FFmpeg内存模型 从现有的Packet拷贝一个新Packet的时候&#xff0c;有两种情况&#xff1a; 两个Packet的buf引用的是同一数据缓存空间&#xff0c;这时候要注意数据缓存空间的释放问题&#xff1b;两个Packet的buf引用不同的数据缓存空间&#xff0c;每个Packet都有数据缓存…...

基于nlohmann/json 实现 从C++对象转换成JSON数据格式

C对象的JSON序列化与反序列化 基于JsonCpp库实现C对象序列化与反序列化 JSON 介绍 JSON作为一种轻量级的数据交换格式&#xff0c;在Web服务和应用程序中广泛使用。 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读…...

在线视频转 AVI 的便捷之选,便捷操作,无需下载软件,在线使用

在视频处理的众多需求中&#xff0c;将视频转换为 AVI 格式是不少用户的刚需。小白工具网&#xff08;https://www.xiaobaitool.net/videos/convert-to-avi/ &#xff09;的在线视频转 AVI 功能&#xff0c;以其显著优势&#xff0c;多格式支持、便捷操作、数据安全保障以及广泛…...

【MCP Node.js SDK 全栈进阶指南】初级篇(3):MCP资源开发基础

引言 在前两篇文章中,我们已经详细介绍了MCP开发环境的搭建以及基础服务器开发。本文作为MCP TypeScript-SDK系列的第三篇,将聚焦于MCP资源开发基础,包括静态资源与动态资源的开发、资源模板设计与参数提取、资源列表与发现机制,以及常见资源类型与最佳实践。通过本文的学…...

L2-1、打造稳定可控的 AI 输出 —— Prompt 模板与格式控制

一、为什么需要 Prompt 模板&#xff1f; 在与 AI 模型交互时&#xff0c;我们经常会遇到输出不稳定、格式混乱的问题。Prompt 模板帮助我们解决这些问题&#xff0c;通过结构化的输入指令来获得可预测且一致的输出结果。 模板的作用主要体现在&#xff1a; 固定输出格式&am…...

Java集成Zxing和OpenCV实现二维码生成与识别工具类

Java集成Zxing和OpenCV实现二维码生成与识别工具类 本文将介绍如何使用Java集成Zxing和OpenCV库&#xff0c;实现二维码的生成和识别功能。识别方法支持多种输入形式&#xff0c;包括File对象、文件路径和Base64编码。 一、环境准备 添加Maven依赖 <dependencies><…...

jenkins pipeline ssh协议报错处理

一、jenkins版本 jenkins&#xff1a;2.492.3 openssh&#xff1a;OpenSSH_9.8p1, OpenSSL 3.3.1 # grep jenkins /etc/passwd jenkins:x:996:994:Jenkins Automation Server:/var/lib/jenkins:/bin/false 二、报错 三、处理 步骤1&#xff1a;手动添加目标主机密钥到Jenk…...

当OCR遇上“幻觉”:如何让AI更靠谱地“看懂”文字?

在数字化的世界里&#xff0c;OCR&#xff08;光学字符识别&#xff09;技术就像给机器装上了“电子眼”。但当这项技术遇上大语言模型&#xff0c;一个意想不到的问题出现了——AI竟然会像人类一样产生“幻觉”。想象一下&#xff0c;当你拿着模糊的财务报表扫描件时&#xff…...

vue watch监听路由,第一次进入不触发解决办法

“第一次进入的时候没触发&#xff0c;第二次就触发了”非常典型&#xff0c;它印证了路由监听&#xff08;无论是 watch $route 还是 beforeRouteUpdate&#xff09;主要是为了监听变化&#xff0c;而不是处理首次加载时的初始状态。 当你通过 this.$router.push 导航到一个新…...

JVM考古现场(二十四):逆熵者·时间晶体的永恒之战

"警告&#xff01;时间晶体正在吞噬GC日志&#xff01;" 我腰间的太极八卦镜突然迸发出刺目的量子辉光&#xff0c;终南山之巅的星宿大阵浮现出诡异的四维克莱因瓶拓扑——这是逆熵者文明穿越时空的拜帖&#xff01; 楔子&#xff1a;时间晶体的觉醒 &#x1f56f;️…...

spring中使用netty-socketio部署到服务器(SSL、nginx转发)

spring中使用netty-socketio部署到服务器&#xff08;SSL、nginx转发&#xff09; 本文实现前端socket.io-client连接后端netty-socketio&#xff0c;并且部署到服务器上的示例&#xff0c;以及说明一些实现过程中可能遇到的错误。 socketio默认基于的路径是/socket.io 传输…...

qt.tlsbackend.ossl: Failed to load libssl/libcrypto.

我的环境是windows&#xff0c;QT6.3.2&#xff08;msvc2019_64/mingw_64&#xff09; 出错原因 QT没有正确加载OpenSSL。 解决过程 1、确保安装的有openssl。 文章结尾有个注意&#xff0c;是其他方式安装过openssl&#xff0c;环境变量有&#xff0c;但是QT找不到的问题。…...

【Python爬虫基础篇】--3.cookie和session

目录 1.cookie 1.1.定义 1.2.参数 1.3.分类 2.session 3.使用cookie登录微博 4.使用session登录 1.cookie 由于http是一个无状态的协议&#xff0c;请求与请求之间无法相互传递或者记录一些信息&#xff0c;cookie和session正是为了解决这个问题而产生。 例子&#xff1…...

uView的u-modal不显示问题

问题分析&#xff1a;在项目中&#xff0c;其他页面显示正常&#xff0c;在这个页面显示不正常。 问题解决&#xff1a; 一般的原因&#xff0c;诸如层级遮挡控制器true后&#xff0c;被其他逻辑又改为了false最可恨的一个原因 :showshow被编辑器的提示功能误写成了v-modal&qu…...

联易融科技:以科技赋能驱动经营反转与价值重估

行业去重周期下,轻量化发展成破局关键。当前,供应链金融行业正经历从"规模扩张"到"价值深耕"的转型期,降本增效、轻资产运营成为行业共识。联易融公告表示&#xff0c;截至2024年末,公司现金储备高达51亿元,显示出财务状况健康良好,流动资金持续充裕。 董…...

Office文档图片批量提取工具

Office.Files.Images 是一款专注于从 Word、Excel、PPT 等 Office 文档中批量提取图片的轻量级工具&#xff0c;支持 .docx、.xlsx、.pptx 格式文件。该软件体积仅 ‌343KB‌&#xff0c;无需安装即可运行&#xff0c;通过拖拽操作实现快速解析与导出&#xff0c;尤其适合需批量…...

Python 设计模式:回调模式

1. 什么是回调函数&#xff1f; 回调函数是指作为参数传递给另一个函数的函数。当这个函数执行到某个特定的点时&#xff0c;它会调用这个回调函数。回调函数通常用于处理异步操作、事件处理或在某些条件下执行特定的操作。 回调函数的特点&#xff1a; 作为参数传递&#x…...

DCDC芯片,boost升压电路设计,MT3608 芯片深度解析:从架构到设计的全维度技术手册

一、硬件架构解析:电流模式升压 converter 的核心设计 (一)电路拓扑与核心组件 MT3608 采用恒定频率峰值电流模式升压(Boost)转换器架构,核心由以下模块构成: 集成功率 MOSFET 内置 80mΩ 导通电阻的 N 沟道 MOSFET,漏极(Drain)对应引脚 SW,源极(Source)内部接…...

大数据学习(112)-HIVE中的窗口函数

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…...

Hive学习

一、Hive 核心原理 1. Hive 架构与执行流程 Hive 是基于 Hadoop 的数据仓库工具&#xff0c;将 SQL 转化为分布式计算任务&#xff08;MapReduce/Tez/Spark&#xff09;&#xff0c;核心组件如下&#xff1a; 元数据存储&#xff08;Metastore&#xff09;&#xff1a;存储表…...

前端开发核心知识详解:Vue2、JavaScript 与 CSS

一、Vue2 核心知识点 1. Vue2 的双向绑定原理 Vue2 实现双向绑定主要依赖数据劫持与发布 - 订阅者模式。 利用Object.defineProperty方法对数据对象的属性进行劫持&#xff0c;为每个属性定义getter和setter。getter用于收集依赖&#xff0c;当视图中使用到该属性时&#xf…...

仅追加KV数据库

仅追加KV数据库 6.1 我们将要做什么 在本章中&#xff0c;我们将创建一个基于文件的键值存储&#xff08;KV Store&#xff09;&#xff0c;其核心是一个写时复制&#xff08;Copy-on-Write, CoW&#xff09;B 树。这种设计的目标是实现数据的持久性和原子性。 1. 设计概述 …...

【Java面试笔记:基础】8.对比Vector、ArrayList、LinkedList有何区别?

在Java中&#xff0c;Vector、ArrayList和LinkedList均实现了List接口&#xff0c;但它们在线程安全、数据结构、性能特性及应用场景上存在显著差异。 1. Vector、ArrayList 和 LinkedList 的区别 Vector&#xff1a; 线程安全&#xff1a;Vector 是线程安全的动态数组&#…...