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

【数据挖掘】时间序列预测-时间序列的平稳性

时间序列的平稳性

      • (1)平稳性定义
      • (2)平稳性处理方法
        • 2.1 差分法
        • 2.2 季节调整(Seasonal Adjustment)
        • 2.3 趋势移除(Detrending)
        • 2.4 对数转换(Logarithmic Transformation)
      • (3)平稳性检测方法
        • 3.1 ADF平稳性检验
        • 3.2 ACF自相关检验
        • 3.3 滞后图

(1)平稳性定义

做时间序列预测,就一定要关注序列的平稳性。序列的稳定性直接决定了序列预测的效果。

序列的平稳性(Stationary Series),是指一组时间序列数据看起来平坦,其各阶统计特征(如均值、方差、协方差等)不随时间的变化而变化。这种平稳性可以分为严平稳和宽平稳(或称为弱平稳)两种。

  • 严平稳(强平稳):其要求非常严格,它要求两组数据之间的任何统计性质都不会随着时间改变。然而,这种严平稳的要求过于严苛,理论上很难证明、实际中难以检验,因此它基本上没有什么应用场景。
  • 宽平稳(弱平稳):它不要求全部特性不随时间改变,仅要求平均值、方差和协方差不随时间而变化。在实际应用中,我们更多关注的是宽平稳性。

与平稳序列相对应的就是非平稳序列(Non-stationary Series):非平稳序列是指其统计特性在时间上发生变化。这种序列可能具有趋势(随着时间变化的整体增长或减少)、季节性(周期性变化)或者其他随机的不规则变化。

时间序列的非平稳性(non-stationarity)是一个在真实世界中广泛存在的问题。非平稳性可能导致在训练集上训练的模型在测试集上表现不佳。这是因为训练集和测试集往往属于不同的时间段,而不同时间段的数据分布可能存在较大差异。这种差异可能导致模型在训练集上学习到的模式在测试集上不再适用,从而影响模型的预测性能。

(2)平稳性处理方法

2.1 差分法

差分法的基本思想是通过计算时间序列中相邻两个或多个时刻的观测值之差,来消除或减弱原始数据中的趋势或季节性等不稳定因素,从而得到一个相对平稳的新序列。

具体来说,一次差分(也称为一阶差分)是计算相邻两个时刻的观测值之差,即:
在这里插入图片描述

其中, yt 表示第 t 个时刻的观测值, Δyt 表示 t 时刻的一次差分。

如果一次差分后的序列仍然不满足平稳性要求,可以进行二次差分(也称为二阶差分),即计算一次差分序列中相邻两个时刻的观测值之差:

在这里插入图片描述

以此类推,可以进行更高阶的差分。

差分法的优点在于简单易行,能够有效地消除时间序列中的趋势和季节性等不稳定因素。然而,差分法也可能带来一些问题,比如过度差分可能导致信息损失和预测精度下降。

下面是一个简单的例子:

假设我们有以下时间序列数据:y={1,3,7,13,21,31}

对应的差分序列为:dy={3−1,7−3,13−7,21−13,31−21}={2,4,6,8,10}

原曲线:在图上绘制点 (1,1),(2,3),(3,7),(4,13),(5,21),(6,31),并连接这些点形成曲线。

差分曲线:在图上绘制点 (1,2),(2,4),(3,6),(4,8),(5,10),并连接这些点形成曲线。

在这里插入图片描述

从上图中我们可以看到,原始数据是一个趋势递增数列,差分后得到的序列变成了一条直线序列。差分操作实际上是在计算数据点之间的变化率,当数据中存在明显的趋势或周期性时,差分可以减少这种趋势或周期性的变化速度。

2.2 季节调整(Seasonal Adjustment)

在分析时间序列数据时,我们经常会发现数据受到季节变动的影响。这种季节变动可能由气候条件、生产周期、假期和销售等季节性因素造成。这些季节因素有时会掩盖时间序列的短期基本变动趋势,从而降低数据的可比性,影响经济分析和预测的准确性。

常见的季节调整方法包括移动平均法、X-11方法等。这些方法可以根据序列的季节性特征,对序列进行平滑处理或分解,以消除季节性波动的影响。

举例:假设我们有一个包含季节性的时间序列数据。我们通过季度平均的方法来消除单月带来的差异。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt# 构造一个包含季节性的时间序列数据
np.random.seed(0)
trend = np.linspace(100, 200, 120)  # 线性趋势
seasonal = [40, 30, 24, 20] * 30  # 季度季节性
irregular = np.random.normal(0, 5, 120)  # 随机不规则成分
data = trend + seasonal + irregular# 生成pandas序列
index = pd.date_range(start='2020-01-01', periods=120, freq='M')
df = pd.DataFrame({'Original': data}, index=index)# 这里仅通过简单平均计算季节因子
seasonal_factors = df['Original'].resample('Q').mean() / df['Original'].mean()# 应用季节因子进行调整,这里仅作示意
df['Seasonally Adjusted'] = df['Original'] / seasonal_factors.reindex(df.index, method='ffill')# 绘制原始和季节调整后的数据
plt.rcParams['font.sans-serif']=['SimHei']
plt.figure(figsize=(12, 6))
plt.plot(df['Original'], label='原始序列')
plt.plot(df['Seasonally Adjusted'], label='季节调整后曲线')
plt.title('季节调整示例')
plt.xlabel('Time')
plt.ylabel('Value')
plt.legend()
plt.show()

在这里插入图片描述

2.3 趋势移除(Detrending)

趋势移除的主要目的是消除数据中由于某种系统性原因产生的长期变化趋势,这种趋势可能会掩盖或误导对数据中其他模式或关系的分析。通过去除趋势,可以更加清晰地看到数据的周期性、季节性或其他短期波动。

趋势移除的具体方法包括:

  • 移动平均方法:移动平均方法通过计算一个固定大小窗口内数据的平均值来平滑数据。在趋势移除中,我们通常使用中心移动平均(Centered Moving Average, CMA)或简单移动平均(Simple Moving Average, SMA)。移动平均可以消除数据中的短期波动,从而更清晰地看到长期趋势。
  • 线性回归方法:线性回归方法通过拟合一条直线来描述数据的趋势变化。它将时间作为自变量,对应的观测值作为因变量,通过最小二乘法来估计直线的斜率和截距,从而得到数据的趋势。这种方法能够较准确地反映数据的变化趋势,但可能不适用于具有非线性趋势的数据。
  • 趋势循环剔除法:趋势循环剔除法基于假设:数据中的异常值通常会与数据中的趋势或周期性变化相矛盾。该方法首先确定数据的趋势和周期,对数据进行拟合得到一条拟合曲线。然后计算每个数据点在拟合曲线中的残差值,并将这些残差值按大小排序。接下来,确定一个剔除的阈值(通常为残差值的平均值加上某个倍数的标准差),将不符合阈值的数据点视为异常值并剔除。

举例1:我们还是用上一节的季节性趋势和随机噪声的时间序列数据,并使用简单移动平均来移除趋势。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt# 构造一个包含季节性的时间序列数据
np.random.seed(0)
trend = np.linspace(100, 200, 120)  # 线性趋势
seasonal = [40, 30, 24, 20] * 30  # 季度季节性
irregular = np.random.normal(0, 5, 120)  # 随机不规则成分
data = trend + seasonal + irregular# 生成pandas序列
index = pd.date_range(start='2020-01-01', periods=120, freq='M')
df = pd.DataFrame({'Original': data}, index=index)# 使用简单移动平均移除趋势
window_size = 12  # 假设季节性周期为12个月
df['Moving Average'] = df['Original'].rolling(window=window_size, center=True).mean()# 季节调整(这里简单地用移动平均作为季节趋势的近似)
df['Seasonally Adjusted'] = df['Original'] - df['Moving Average'] + df['Moving Average'].mean()# 绘制原始和季节调整后的数据
plt.figure(figsize=(12, 6))
plt.plot(df['Original'], label='Original')
plt.plot(df['Moving Average'], label='Moving Average (Trend Approximation)', color='orange')
plt.plot(df['Seasonally Adjusted'], label='Seasonally Adjusted', color='green')
plt.title('Seasonal Adjustment Example using Moving Average')
plt.xlabel('Time')
plt.ylabel('Value')
plt.legend()
plt.show()

在这里插入图片描述

举例2:本例用一个二项式拟合来移除趋势。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression# 构造一个包含季节性的时间序列数据
np.random.seed(0)
x = np.linspace(0, 11, 120).reshape(-1, 1)  # 时间作为自变量,这里简化使用0到11的等差数列
trend = 5 * x ** 2 + 10 * x + 50  # 非线性趋势成分
irregular = np.random.normal(0, 10, 120)  # 随机噪声
data = trend.ravel() + irregular  # 合并趋势和噪声index = pd.date_range(start='2020-01-01', periods=120, freq='M')
df = pd.DataFrame({'Original': data}, index=index)# 使用二次多项式回归拟合趋势
poly_features = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly_features.fit_transform(x)
model = LinearRegression()
model.fit(X_poly, data)# 预测趋势值
trend_values = model.predict(X_poly)# 去除趋势后的数据
df['Trend Removed'] = df['Original'] - trend_values# 绘制原始和去除趋势后的数据
plt.figure(figsize=(12, 6))
plt.plot(df.index, df['Original'], label='Original')
plt.plot(df.index, trend_values, label='Fitted Trend', color='orange')
plt.plot(df.index, df['Trend Removed'], label='Trend Removed', color='green')
plt.title('Nonlinear Trend Removal Example using Polynomial Regression')
plt.xlabel('Time')
plt.ylabel('Value')
plt.legend()
plt.show()

在这里插入图片描述

2.4 对数转换(Logarithmic Transformation)

对数转换通常用于时间序列分析,特别是当数据呈现出指数增长或衰减趋势时。通过对数转换,我们可以将数据转换为线性增长或衰减形式,从而更容易地识别和分析趋势。

对数转换通过取数据的自然对数(或其他底数的对数)来转换数据。对于指数增长的数据,这种转换可以将趋势转换为线性增长,从而使得趋势分析更为简单。转换后的数据可以通过线性模型(如最小二乘法)来拟合,进而估算趋势。

举例:

# 构造一个包含季节性的时间序列数据
np.random.seed(0)
time_index = np.linspace(0, 10, 120)  # 时间索引
trend = np.exp(time_index * 0.2)  # 指数增长趋势成分
seasonal = np.tile([1.2, 1.0, 0.8, 0.6], 30)  # 季节性成分
irregular = np.random.normal(0, 0.1, 120)  # 随机噪声
data = trend * seasonal + irregular  # 合并趋势、季节性和噪声index = pd.date_range(start='2020-01-01', periods=120, freq='M')
df = pd.DataFrame({'Original': data}, index=index)# 对数转换
df['Log-Transformed'] = np.log(df['Original'])# 线性拟合转换后的数据(这里仅用于演示目的,实际应用中可能需要更复杂的方法)
from sklearn.linear_model import LinearRegression
X = time_index.reshape(-1, 1)  # 假设我们知道时间索引的确切值
y = df['Log-Transformed']
model = LinearRegression()
model.fit(X, y)
trend_line = model.predict(X)# 转换回原始尺度以绘制趋势线
trend_line_original_scale = np.exp(trend_line)# 绘制原始和转换后的数据,以及趋势线
plt.figure(figsize=(12, 6))
plt.plot(df.index, df['Original'], label='Original')
plt.plot(df.index, trend_line_original_scale, label='Fitted Trend (after Log-Transformation)', color='orange')
plt.plot(df.index, df['Log-Transformed'], label='Log-Transformed', color='green', linestyle='--')
plt.title('Trend Analysis with Log-Transformation')
plt.xlabel('Time')
plt.ylabel('Value')
plt.legend()
plt.show()

在这里插入图片描述

(3)平稳性检测方法

3.1 ADF平稳性检验

ADF平稳性检验(Augmented Dickey-Fuller test,增广迪基-福勒检验)是一种用于检验时间序列数据是否平稳的统计方法。具体来说,ADF检验是基于Dickey-Fuller单位根检验的扩展,用于判断时间序列数据是否存在单位根,从而判断数据是否平稳。如果时间序列数据存在单位根,则表明该数据序列是非平稳的,可能存在某种趋势或周期性。

ADF平稳性检验在金融经济学、宏观经济学等领域有广泛应用,例如用于判断股票价格、经济指标等时间序列数据的平稳性。在进行ADF检验时,通常需要先对数据进行差分处理,以消除可能的趋势或周期性。然后,通过计算检验统计量并与临界值进行比较,可以判断时间序列数据是否平稳。

ADF(Augmented Dickey-Fuller)算法的输出结果通常包含几个关键部分:

  • p-value(p值):p值表示观察到的统计量或更极端情况在零假设(即序列存在单位根,因此非平稳)下出现的概率。
    • 如果p值小于选定的显著性水平(如0.05或0.01),我们通常拒绝零假设,认为序列是平稳的。
    • 如果p值大于选定的显著性水平,我们不能拒绝零假设,因此认为序列可能是非平稳的。
  • Test Statistic(检验统计量)
    • 检验统计量是ADF检验的核心,它基于模型的残差计算得出。
    • 通常,检验统计量会与临界值(critical values)进行比较。临界值是基于样本大小和显著性水平计算得出的。
    • 如果检验统计量小于临界值,我们可以拒绝零假设,认为序列是平稳的。
  • Critical Values(临界值)
    • 临界值通常与显著性水平(如1%,5%,10%)相对应,表示在零假设下,检验统计量可能取到的极端值的界限。
    • 如果检验统计量落在临界值之外(即小于临界值),我们可以拒绝零假设。
ADF Statistic: -4.5678  
p-value: 0.0001  
Critical Values:  1%: -3.43  5%: -2.86  10%: -2.57  

在这个例子中,ADF统计量(-4.5678)小于所有临界值(1%为-3.43,5%为-2.86,10%为-2.57),p值(0.0001)远小于常用的显著性水平(如0.05),因此我们可以拒绝原假设,认为这个序列是平稳的。

ADF Statistic: -1.2345  
p-value: 0.4567  
Critical Values:  1%: -3.43  5%: -2.86  10%: -2.57  

在这个例子中,ADF统计量(-1.2345)大于所有临界值,p值(0.4567)大于常用的显著性水平(如0.05),因此我们不能拒绝原假设,即该序列可能存在单位根,是非平稳的。

3.2 ACF自相关检验

ACF(自相关函数):用于衡量时间序列数据与其自身在不同时间点延迟之间的相关性。它计算了时间序列在每个滞后值上的相关系数,以度量时间序列中每个时刻与过去某一时刻之间的相关性。ACF图通常以延迟(lag)为横轴,相关系数为纵轴。

自相关图是一个平面二维坐标悬垂线图,其中一个坐标轴表示延迟时期数(通常称为lag),另一个坐标轴表示自相关系数。通常以悬垂线表示自相关系数的大小。

在自相关图中,我们可以观察自相关系数随延迟期数的变化情况。如果自相关系数一直都比较小,且在零附近波动,那么可以认为该序列是平稳时间序列。相反,如果自相关系数衰减到零的速度较慢,或者在某些延迟期数上出现了较大的自相关系数,那么可能说明该序列不是平稳的。

举例

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf# 创建一个平稳序列(白噪声)
np.random.seed(0)  # 为了可复现性
n_samples = 100
stable_series = np.random.normal(size=n_samples)# 创建一个非平稳序列(带有线性趋势的白噪声)
time_index = np.arange(n_samples)
non_stable_series = 0.05 * time_index + np.random.normal(size=n_samples)# 将序列转换为pandas Series对象,以便于处理
stable_series = pd.Series(stable_series)
non_stable_series = pd.Series(non_stable_series, index=time_index)plt.rcParams['font.sans-serif']=['SimHei']
# 绘制平稳序列的时序图和自相关图
plt.figure(figsize=(12, 6))
plt.subplot(2, 1, 1)
plt.plot(stable_series)
plt.title('平稳序列时序图')
plt.subplot(2, 1, 2)
plot_acf(stable_series, lags=60, ax=plt.gca())
plt.title('平稳序列自相关图')
plt.show()# 绘制非平稳序列的时序图和自相关图
plt.figure(figsize=(12, 6))
plt.subplot(2, 1, 1)
plt.plot(non_stable_series)
plt.title('非平稳序列时序图')
plt.subplot(2, 1, 2)
plot_acf(non_stable_series, lags=60, ax=plt.gca())
plt.title('非平稳序列自相关图')
plt.show()

下图是一个平稳序列:自相关系数快速衰减,在0值附近波动。

在这里插入图片描述

下图是一个平稳序列:自相关系数衰减较慢,且不在0值附近波动。

在这里插入图片描述

3.3 滞后图

滞后图(Lag Plot)通过绘制时间序列的当前值与过去某个时间点(滞后值)的值之间的对应关系,可以直观地展示它们之间的相关性。如果图中存在明显的模式或趋势,则表明序列可能具有自相关性。

通过观察滞后图,可以初步确定自相关性的持续时间和强度,从而为后续的模型选择提供依据。特别是,可以估计适当的滞后阶数,以捕捉序列中的动态效应。

  • 如果滞后图中的点沿对角线分布,则表明序列存在正自相关性。这意味着数据的变化趋势在相邻的间隔里是相似的。
  • 如果点随机分布,没有明显的模式或趋势,则表明序列可能是随机的或接近白噪声。
  • 如果存在其他模式或趋势(如曲线形状、离群点等),则可能需要进一步分析以理解序列的特性。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

滞后图可以用来判断序列的自相关性,不能直接判断序列的平稳性。但是如果滞后图中的点随机分布,没有明显的模式或趋势,这通常意味着序列是平稳的。

相关文章:

【数据挖掘】时间序列预测-时间序列的平稳性

时间序列的平稳性 (1)平稳性定义(2)平稳性处理方法2.1 差分法2.2 季节调整(Seasonal Adjustment)2.3 趋势移除(Detrending)2.4 对数转换(Logarithmic Transformation&…...

成都蒲江石象湖旅游攻略之石象湖郁金香最佳观赏时间

石象湖坐落于成都蒲江,拥有绝美的郁金香花海,吸引了很多的游客。如果大家想要观赏比较诱惑人的郁金香,那自然就应该知道正确的观赏时间。 心想郁金香合适的时间是每年的3月份到3月底。石象湖会还会举办盛大的郁金香节,在花园内有数…...

大模型、知识图谱和强化学习三者的结合,可以形成哪些研究方向?

大模型(Large Language Models, LLMs)、知识图谱(Knowledge Graph, KG)与强化学习(Reinforcement Learning, RL)作为人工智能领域的三大核心技术,其融合正推动着认知智能迈向新高度。本文结合2023-2025年的最新研究成果,系统梳理三者结合的七大科研方向及其技术路径。 …...

Linux文件操作

在C语言中,我们已经学习了文件相关的知识,那么在Linux中我们为什么还要再来学习文件呢?这是因为C语言中和Linux中,"文件"是2个不同的概念。所以我们要来学习Linux中对文件的操作。 在学习之前,我们先来回顾一…...

PostSwigger Web 安全学习:CSRF漏洞3

CSRF 漏洞学习网站:What is CSRF (Cross-site request forgery)? Tutorial & Examples | Web Security Academy CSRF Token 基本原理 CSRF Token 是服务端生成的唯一、随机且不可预测的字符串,用于验证客户端合法校验。 作用:防止攻击…...

【Node.js 】在Windows 下搭建适配 DPlayer 的轻量(简陋)级弹幕后端服务

一、引言 DPlayer官网:DPlayer 官方弹幕后端服务:DPlayer-node MoePlayer/DPlayer-node:使用 Docker for DPlayer Node.js 后端(https://github.com/DIYgod/DPlayer) 本来想直接使用官网提供的DPlayer-node直接搭建…...

淘宝tb.cn短链接生成

淘宝短链接简介 1. 一键在线生成淘宝短链接tb.cn,m.tb.cn等 2. 支持淘宝优惠券短链接等淘宝系的所有网址 3. 生成的淘宝短链接是官方的,安全稳定有保证 4.适合多种场景下使用,如:网站推广,短信推广 量大提供api接口&#xff0…...

在web应用后端接入内容审核——以腾讯云音频审核为例(Go语言示例)

腾讯云对象存储数据万象(Cloud Infinite,CI)为用户提供图片、视频、语音、文本等文件的内容安全智能审核服务,帮助用户有效识别涉黄、违法违规和广告审核,规避运营风险。本文以音频审核为例给出go语言示例代码与相应结…...

优化无头浏览器流量:使用Puppeteer进行高效数据抓取的成本降低策略

概述 使用 Puppeteer 进行数据抓取时,流量消耗是一个重要考虑因素。特别是在使用代理服务时,流量成本可能显著增加。为了优化流量使用,我们可以采用以下策略: 资源拦截:通过拦截不必要的资源请求来减少流量消耗。请求…...

【C语言】fprintf与perror对比,两种报错提示的方法

它们的主要区别在于 信息来源 和 自动包含的系统错误详情。 1. fprintf(stderr, "自定义错误信息\n"); 功能: 这是标准库中的一个通用格式化输出函数。你可以用它向任何文件流(包括 stdout 标准输出, stderr 标准错误, 或任何用 fopen 打开的文件&#x…...

C语言复习笔记--内存函数

在复习完字符函数和字符串函数之后,今天让我们复习一下内存函数吧.这一块的东西不太多,并且与之前的字符串函数有一些地方很相似,所以这里应该会比较轻松. memcpy使用和模拟实现 老规矩,先看函数原型 void * memcpy ( void * destination, const void * source, size_t num );…...

前端面试高频算法

前端面试高频算法 1 排序算法;1.1 如何分析一个排序算法1.1.1 执行效率3.1.2 内存消耗1.1.3 稳定性 1.2 冒泡排序(Bubble Sort)1.3 插入排序(Insertion Sort)1.4 选择排序(Selection Sort)1.5 归…...

云原生--核心组件-容器篇-4-认识Dockerfile文件(镜像创建的基础文件和指令介绍)

1、Dockerfile的定义与作用 定义: Dockerfile是一个文本文件,包含一系列Docker指令,用于自动化构建Docker镜像。Docker 在构建镜像时会按照Dockerfile中的指令逐步执行,每一行指令都会生成一个新的镜像层(layer&#x…...

13.组合模式:思考与解读

原文地址:组合模式:思考与解读 更多内容请关注:7.深入思考与解读设计模式 引言 在软件开发中,是否曾经遇到过这样一种情况:你有一个对象,它本身很简单,但是它包含了其他类似的对象。随着系统变得越来越复…...

Pycharm(十七)生成器

一、生成器介绍 1.1 概述 生成器指的是Generator对象,它不再像以往一样,一次性生成所有的数据,而是用一个,再生成一个,基于用户写的规则(条件)来生成数据,如果条件不成立&#xff…...

盛元广通实验材料管理系统-实验室管理系统-LIMS

一、引言 在当下科学研究及各类实验日益频繁的背景下,实验材料管理成为实验室高效运作的核心环节。从“人工低效”到“智能自动化”,盛元广通可覆盖实验材料的采购、存储、使用、追踪等全流程,从功能适配性、技术性能、成本效益、供应商服务…...

检查 NetCDF Fortran的版本

执行 nf-config --all命令后,它会输出一堆信息,大致像这样: This netCDF-Fortran version: 4.6.0 netCDF-Fortran installation dir: /usr/local/netcdf4 Fortran compiler: gfortran Fortran compiler flags: -g -O2 Fortran preprocesso…...

MySQL 存储引擎与服务体系深度解析

一、存储引擎核心概念 基本定义 存储引擎:MySQL服务的核心组件,负责数据的存储、检索和管理版本演进: MySQL 5.0/5.1 默认使用MyISAM引擎MySQL 5.5/5.6+ 默认采用InnoDB引擎关键特性 不同存储引擎采用不同的数据存储结构和处理机制直接影响表的CRUD操作性能和数据安全特性作…...

乐企数电发票分布式发票号码生成重复的问题修复思路分享

文章目录 1.前言2.解决思路2.1错误姿势2.2歪打正着2.3正确姿势 3.总结 1.前言 由于之前接了乐企数电开票,服务上线之后,使用的公司少没有啥问题,后面切换了两家日开票量大的公司上线之后,就发现发票号码生成重复了,后面…...

多级缓存架构设计与实践经验

多级缓存架构设计与实践经验 在互联网大厂Java求职者的面试中,经常会被问到关于多级缓存的架构设计和实践经验。本文通过一个故事场景来展示这些问题的实际解决方案。 第一轮提问 面试官:马架构,欢迎来到我们公司的面试现场。请问您对多级…...

LCD1602液晶显示屏详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图​编辑 2.接口说明 三、程序设计 main文件 lcd1602.h文件 lcd1602.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 LCD1602A字符型液晶显示模块是专门用于显示字母、数字元、符号等的点阵型液晶显示模块。分4位和8位数据…...

Golang | 集合求交

文章目录 bitmap求交集2个有序链表多个有序链表跳表 bitmap求交集 2个有序链表 多个有序链表 为什么非最大的所有都要往后移动呢?因为现在已经知道交集即使有,也最小都是这个目前最大的了,其他不是最大的不可能是交集,所有除了最大…...

手机充电进入“秒充“时代:泡面刚下锅,电量已满格

现代人的生活节奏越来越快,手机充电技术也在飞速发展。从最初的"充电一整晚"到如今的"秒充"时代,充电效率的提升正在悄然改变着我们的生活习惯。最新数据显示,目前最快的手机充电技术仅需4分30秒就能充满一部手机的电量&…...

网站字体文件过大 导致字体从默认变成指定字体的时间过长

1.选择字体中只用到的字符集较小的包 只用到了数字,所以使用了 xx-sans.ttf的版本(86kb) 2.转换ttf格式为woff2 转换后26kb 3.使用字体 // 定义字体 font-face {font-family: "myFont";src: url(/assets/fonts/myFont.woff2) format(woff2);font-weigh…...

WPF常用技巧汇总 - Part 2

WPF常用技巧汇总-CSDN博客 主要用于记录工作中发现的一些问题和常见的解决方法。 目录 WPF常用技巧汇总-CSDN博客 1. DataGrid Tooltip - Multiple 2. DataGrid Tooltip - Cell值和ToolTip值一样 3. DataGrid Tooltip - Cell值和ToolTip值不一样 4. DataGrid - Ctrl A /…...

C++中析构函数

析构函数 析构函数(Destructor)是类的一种特殊成员函数,用于在对象的生命周期结束时执行清理操作,他的主要作用是释放对象占用资源,例如动态分配的内存,文件句柄或网络连接等。 特点 名称与类名称相同 单…...

树莓派超全系列教程文档--(44)如何在树莓派上编译树莓派内核

如何在树莓派上编译树莓派内核 构建内核下载内核源代码 本地构建内核构建配置使用 LOCALVERSION 自定义内核版本构建安装内核 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 构建内核 操作系统预装的默认编译器和链接器被配置为构建在该操作系统…...

flask返回文件的同时返回其他参数

参考:flask实现上传文件与下载文件_flask 文件上传和下载-CSDN博客 在 Flask 中,返回文件的同时附加额外参数(如处理时间)可以通过 自定义 HTTP 响应头 或 返回 JSON 数据与文件结合 的方式实现。以下是具体方法和示例: 方法 1:通过 HTTP 响应头 附加参数(推荐) 将参…...

C++23 std::move_only_function:一种仅可移动的可调用包装器 (P0288R9)

文章目录 一、定义与基本概念1.1 定义1.2 基本概念 二、特点2.1 仅可移动性2.2 支持多种限定符2.3 无target_type和target访问器2.4 强前置条件 三、使用场景3.1 处理不可复制的可调用对象3.2 性能优化3.3 资源管理 四、与其他可调用包装器的对比4.1 与std::function的对比4.2 …...

Zookeeper实现分布式锁实战应用

Zookeeper实现分布式锁实战应用示例 1. 分布式锁概述 在分布式系统中,当多个进程或服务需要互斥地访问共享资源时,就需要分布式锁来协调。Zookeeper因其强一致性和临时节点特性,非常适合实现分布式锁。 2. Zookeeper实现分布式锁的核心原理…...

使用 Playwright 构建高效爬虫:原理、实战与最佳实践

随着网站前端技术日益复杂,传统的基于请求解析(如 requests、BeautifulSoup)的爬虫在处理 JavaScript 渲染的网站时变得力不从心。Playwright,作为微软推出的一款强大的自动化浏览器控制框架,不仅适用于自动化测试,也成为了处理现代网站爬取任务的利器。 本篇文章将带你…...

ComfyUI for Windwos与 Stable Diffusion WebUI 模型共享修复

#工作记录 虽然在安装ComfyUI for Windwos时已经配置过extra_model_paths.yaml 文件,但升级ComfyUI for Windwos到最新版本后发现原先的模型配置失效了,排查后发现,原来是 extra_model_paths.yaml 文件在新版本中被移动到了C盘目录下&#x…...

【RabbitMQ消息队列】详解(一)

初识RabbitMQ RabbitMQ 是一个开源的消息代理软件,也被称为消息队列中间件,它遵循 AMQP(高级消息队列协议),并且支持多种其他消息协议。 核心概念 生产者(Producer):创建消息并将其…...

【MySQL数据库入门到精通-08 约束】

文章目录 4、约束4.1 概述4.2 约束演示1. 根据需求,完成表的创建2. SQL数据库3. 结果 4.3 外键约束4.3.1 介绍1. 根据需求,完成表的创建2. SQL数据库3. 结果4.3.2 外键约束建立1. 语法2. SQL语句3. 现象4.3.3 外键删除更新行为1. 知识点2.SQL3.结果 4、约…...

C++笔记-模板进阶和继承(上)

一.模板进阶 1.1非模板类型参数 那之前学过的stack举例,在这之前我们如果要用N,就要用宏来定义,但是宏毕竟有局限性: 如果我要用到两个stack,一个要求10个空间,另一个要求100空间呢? 这时候…...

云计算赋能质检LIMS的价值 质检LIMS系统在云计算企业的创新应用

在云计算技术高速发展的背景下,实验室信息化管理正经历深刻变革。质检LIMS(实验室信息管理系统)作为实验室数字化转型的核心工具,通过与云计算深度融合,为企业提供了高弹性、高安全性的解决方案。本文将探讨质检LIMS在…...

2025系统架构师---数据抽象(Data Abstraction)‌与‌面向对象架构风格

引言 在软件系统复杂度与规模不断攀升的今天,如何设计出可扩展、易维护且能快速响应需求变化的架构,是每一位系统架构师面临的挑战。‌数据抽象(Data Abstraction)‌与‌面向对象架构风格(Object-Oriented Architectu…...

[python] 基于WatchDog库实现文件系统监控

Watchdog库是Python中一个用于监控文件系统变化的第三方库。它能够实时监测文件或目录的创建、修改、删除等操作,并在这些事件发生时触发相应的处理逻辑,因此也被称为文件看门狗。 Watchdog库的官方仓库见:watchdog,Watchdog库的官…...

缺省处理、容错处理

布尔判定 假:false 0 null undefined NaN 可选符.?和?? let obj {name: jim,data: {money: 0,age: 18,fn(a){return a}} }1、如果左侧的值为null或者undefined,则使用右侧值。需要使用"??" obj?.data?.a…...

Taro on Harmony :助力业务高效开发纯血鸿蒙应用

背景 纯血鸿蒙逐渐成为全球第三大操作系统,业界也掀起了适配鸿蒙原生的浪潮,用户迁移趋势明显,京东作为国民应用,为鸿蒙用户提供完整的购物体验至关重要。   去年 9 月,京东 AP…...

Java基础——排序算法

排序算法不管是考试、面试、还是日常开发中都是一个特别高频的点。下面对八种排序算法做简单的介绍。 1. 冒泡排序(Bubble Sort) 原理:相邻元素比较,每一轮将最大元素“冒泡”到末尾。 示例数组:[5, 3, 8, 1, 2] pub…...

【操作系统原理07】输入/输出系统

文章目录 零.大纲一.I/O设备的概念和分类0.大纲1.什么是I/O设备2.I/O分类 二.I/O控制器0.大纲1.I/O设备的电子部件(I/O控制器)2.IO控制器组成3.内存映像I/O VS 寄存器独立编址 三.I/O控制方式0.大纲与总结1.程序直接控制方式(1) 操…...

IM云端搜索全面升级,独家能力拓展更多“社交连接”玩法

在这个数字时代,网络让信息传递前所未有的便捷,但同时,海量数据堆积也让内容检索变得像大海捞针。尤其是在我们日常工作生活中最常用的即时通信软件中,信息的快速查找和精准定位正变得越来越重要。 但传统的本地搜索功能受限于设…...

汽车产业链主表及类别表设计

(提前设计,备用) 一、汽车产业链类别表(industry_chain_category) 设计要点 1、核心字段:定义产业链分类(如零部件、整车制造、销售服务等) 2、主键约束:自增ID作为唯一标…...

有效的字母异位词

recorded&#xff1a;用于统计或抵消字符出现次数。 class Solution { public:bool isAnagram(string s, string t) {int record[26]{0};for(int i0;i<s.size();i){record[s[i]-a];}for(int i0;i<t.size();i){record[t[i]-a]--;}for(int i0;i<26;i){if(record[i]!0){…...

汽车网络安全 -- 理解暴露面、攻击面和攻击向量

1.暴露面是攻击面的子集 举个例子&#xff0c;房子都有门、窗户&#xff0c;这些窗户、门不管是否打开&#xff0c;都可能被小偷利用进入到房内&#xff0c;因此这些门窗可能是潜在的漏洞&#xff0c;所以称之为攻击面(Attack Surface)。 小偷经过长期观察&#xff0c;发现家…...

C++异步利器:全面理解 std::packaged_task

在现代 C&#xff08;C11及以后&#xff09;中&#xff0c;并发与异步编程是不可回避的重要技能。我们常常希望把某些计算任务扔给后台线程去处理&#xff0c;同时又能优雅地获取任务结果。 这时候&#xff0c;std::packaged_task 就是一个非常强大的工具。 本文将带你深入理解…...

Animate 中HTMLCanvas 画布下的鼠标事件列表(DOM 鼠标)

在 JavaScript 和 ‌Adobe Animate&#xff08;CreateJS&#xff09;‌ 中&#xff0c;常用的鼠标交互事件可分为两大类&#xff1a;‌基础 DOM 事件‌ 和 ‌CreateJS 扩展事件‌12。以下是完整分类&#xff1a; 一、基础 DOM 鼠标事件 事件名触发场景冒泡特性click鼠标左键单…...

RagFlow文档切块提升

1.RagFlow切块介绍 2.复现优化 2.1 General 通用分块 def parser_text(self, txt, blockSize512, overlapSize0, delimiter"\n!?;。&#xff1b;&#xff01;&#xff1f;"):文本分割sentences self.split_text_by_period_qh(txt, delimiter, blockSizeblockSize)…...

音频转base64

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>音频转Base64</title><style>.containe…...