时间序列预测(6) — ARIMA实现单输入单输出负荷预测

目录

1 数据准备与可视化

 2 简单数据探索与清洗

3 差分处理

4 绘制ACF与PACF图像,完成模型选择

5 建立ARIMA和SARIMA模型

5.1 初步建模

5.2 精细化建模

5.3 最终的模型


ARIMA作为成熟的统计学模型已被各种软件以各种方式实现,在Python中我们最常使用的一般是statsmodel库。statsmodels是Python中专用于统计模型估计、统计测试和统计数据探索的库。现在我们就使用数据集1 (下载链接) 中的负荷数据进行实验,来实现statsmodel下的ARIMA模型。

我们在ARIMA建模之前完成平稳性检验样本的相关性检验,并在ARIMA建模完成之后完成一系列验证白噪声的混成检验,不过有时候我们会省略样本相关性检验,因为我们将在ARIMA建模过程中使用ACF和PACF辅助判断ARIMA模型的参数,如果样本与样本之间缺乏相关性,我们在绘制ACF和PACF时就能够发觉这一点。在开始建模之前,我们需要简单复习一下ARIMA模型实验的基本流程

  1. 序列平稳化检验;确定d值
  2. 确定p值和g值
  3. 参数估计与诊断检验
  4. 预测未来的值

1 数据准备与可视化

首先导入实验需要的库文件

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

然后读取数据并进行可视化,本数据原始数据是多输入单输出的数据,需要进行截取,变成单输入单输出数据

data=pd.read_csv(r'C:\Users\Qin\Myfile\07课题组\05学习案例\Machine-Learning-for-Time-Series-Forecasting-main\Notebooks\data\energy.csv')
#可视化
data.plot(figsize=(10,5),grid=True);

通过可视化发现,发现标签load前面存在大量缺失值,同时时间特征Hour可以合并,对原始数据进行截取

# 将数据变成单输入单输出数据
df = pd.DataFrame(data, columns=['Date', 'load'])
# 将时间和特征Hour可以合并
df['Date'] = data["Date"].astype(str) + ' ' + data["Hour"].astype(str)
# 截取20天的数据并重置索引
df = df[17544:17544+24*20].reset_index(drop=True)

 2 简单数据探索与清洗

首先检查数据类型和缺失值

#检查是否数据类型和缺失值
df.info()
### 输出 ###
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 480 entries, 0 to 479
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   Date    480 non-null    object 
 1   load    480 non-null    float64
dtypes: float64(1), object(1)
memory usage: 7.6+ KB

最后对使用的数据进行可视化 

df.plot(figsize=(12,5),grid=True);

很明显,数据具有周期性,因此数据大概率是无法满足平稳性条件的。具体地来说,每天会出现一个峰值、一个谷底,峰值出现在每天的用电高峰,谷底出现在夜晚用电低谷。接下来我们进行平稳性检验。

  • 假设检验:平稳性检验

在使用统计学模型进行建模时,我们往往需要完成一系列假设检验的工作。对ARIMA模型而言,我们必须要完成的建模前检验主要是平稳性检验。对ARIMA模型来说,如果数据是不平稳的、比如带有持续上升或下降的趋势、或者数据在不同时间阶段的波动程度明显不同,那我们则需要对数据进行差分处理直到数据平稳为止。

通过前文的讲解,在这里我们将要使用的是ADF单位根检验。在概率论与数理统计当中,单位根是趋势性的象征。如果一个序列中存在单位根,那该序列应该有较强的趋势性,在这样的序列上建模的难度会很大、模型也很容易失效,因此单位根检验能够帮助我们判断“趋势”这一因素在多大程度上影响了一个时间序列的值。如果在检验中我们发现单位根存在,则说明该时间序列受到“趋势”影响很大。

在这个检验中,两项假设如下:

  • 原假设H0:数据是不平稳序列。如果该假设没有被拒绝,则表示时间序列里有单位根,意味着它是不平稳的,它很大程度上受到“趋势性”的影响。
  • 备择假设H1:数据是平稳的。如果拒绝原假设,则说明该时间序列没有单位根,则数据是平稳的,它基本不受“趋势性”的影响。

在测试中,我们使用测试的p值来解释这个结果:

  • p>0.05:无法拒绝原假设,数据有单位根且不平稳。
  • p<=0.05:拒绝原假设,数据没有单位根,是平稳的序列。
# ADF检验
result=adfuller(df['load']) #这就可以完成一次检验
result
### 输出 ###
(-2.7122595076597857,
 0.07194075827270735,
 18,
 461,
 {'1%': -3.4446148284445153,
  '5%': -2.8678299626609314,
  '10%': -2.5701203107928157},
 5237.469230118977)

以上返回的结果分别是检验值、p值、使用的滞后数、使用的样本数、在1%、5%、10%显著性水平上的检验值、以及当前数据上使用ARIMA时可能的AIC值。在这些值当中,我们最为关心前2项数值,因此我们可以将前2项打包到函数中,并让函数直接输出检验的结果:

def adfuller_test(sales):
    #将唯一的标签:销售额放入检验
    result=adfuller(sales)
    
    #让statsmodel的DF单位根检验为我们返回检验值 & p值 & 添加了多少滞后 & 使用的样本量
    labels = ['ADF Test Statistic','p-value']
    
    #打包标签和结果
    for value,label in zip(result,labels):
        print(label+' : '+str(value) )
    
    #如果p值小于等于0.05,则说明我们可以拒绝原假设,认为数据是平稳的。如果p值大于0.05,则说明我们需要接受原假设,数据不平稳。
    if result[1] <= 0.05:
        print("拒绝原假设,数据具有平稳性")
    else:
        print("无法拒绝原假设,数据不平稳")
        
    return result[1]

pvalue = adfuller_test(df['load'])
### 输出 ###
ADF Test Statistic : -2.7122595076597857
p-value : 0.07194075827270735
无法拒绝原假设,数据不平稳

3 差分处理

编写函数通过循环,查看究竟多少步差分能够让这一序列满足单位根检验,如果许多差分都能够满足单位根检验,我们通常选择ADF值最小、或差分后数据方差最小的步数

#可以通过循环,查看究竟多少步差分能够让这一序列满足单位根检验
#如果许多差分都能够满足单位根检验,我们通常选择ADF值最小、或差分后数据方差最小的步数

columns = ["D1","D2","D3","D4","D5","D6","D7","D8","D9","D10","D11","D12","D24","D36"]
pvalues = []
stds = []

for idx,degree in enumerate([*range(1,13),24,36]):
    #打印差分的步数
    print("{}步差分".format(degree))
    
    #计算差分列
    df[columns[idx]] = df['load'] - df['load'].shift(idx+1)
    
    #进行ADF检验,提取P值,并计算差分列的标准差
    pvalue = adfuller_test(df[columns[idx]].dropna())
    std_ = df[columns[idx]].std()
    
    #保存P值和标准差
    pvalues.append(pvalue)
    stds.append(std_)
    
    #对结果进行打印
    print("差分后数据的标准差为{}".format(std_))
    print("\n")
### 输出 ###
1步差分
ADF Test Statistic : -15.04966453828655
p-value : 9.33360597580164e-28
拒绝原假设,数据具有平稳性
差分后数据的标准差为196.46922954307323

2步差分
ADF Test Statistic : -16.29765178325621
p-value : 3.290283138175626e-29
拒绝原假设,数据具有平稳性
差分后数据的标准差为370.118759085922

3步差分
ADF Test Statistic : -18.10835313744563
p-value : 2.5417172879071722e-30
拒绝原假设,数据具有平稳性
差分后数据的标准差为516.0701985963952

4步差分
ADF Test Statistic : -12.212093452012402
p-value : 1.1575596271658605e-22
拒绝原假设,数据具有平稳性
差分后数据的标准差为637.530782228096

5步差分
ADF Test Statistic : -8.427256072491113
p-value : 1.9119982547299384e-13
拒绝原假设,数据具有平稳性
差分后数据的标准差为735.5323395039408

6步差分
ADF Test Statistic : -3.808930036426557
p-value : 0.002817259184627013
拒绝原假设,数据具有平稳性
差分后数据的标准差为809.0926365719258

7步差分
ADF Test Statistic : -8.065521894930814
p-value : 1.6002046598852696e-12
拒绝原假设,数据具有平稳性
差分后数据的标准差为858.9712521678126

8步差分
ADF Test Statistic : -3.986627589360495
p-value : 0.0014821747210727353
拒绝原假设,数据具有平稳性
差分后数据的标准差为888.1440385449231

9步差分
ADF Test Statistic : -5.2743084989186535
p-value : 6.188084027315802e-06
拒绝原假设,数据具有平稳性
差分后数据的标准差为899.8903760966008

10步差分
ADF Test Statistic : -5.452074920857974
p-value : 2.6307700522164034e-06
拒绝原假设,数据具有平稳性
差分后数据的标准差为900.7550646561206

11步差分
ADF Test Statistic : -6.121643384720841
p-value : 8.826171805323979e-08
拒绝原假设,数据具有平稳性
差分后数据的标准差为899.4711717537107

12步差分
ADF Test Statistic : -3.8927045263314537
p-value : 0.0020891986455885032
拒绝原假设,数据具有平稳性
差分后数据的标准差为899.9772611011314

24步差分
ADF Test Statistic : -5.1781941701238425
p-value : 9.73951803250042e-06
拒绝原假设,数据具有平稳性
差分后数据的标准差为901.6634469701739

36步差分
ADF Test Statistic : -4.145310100643183
p-value : 0.0008143374624994226
拒绝原假设,数据具有平稳性
差分后数据的标准差为905.2053218960154

通过可视化p值和标准差输出可以看到,差分都能够满足单位根检验,标准差呈现递增的趋势,此时最优的差分步为0,考虑到负荷数据具有明显的以天为单位的周期性,可也考虑最优的差分步为24,在SARIMA模型中有差分步参数的设置,ARIMA模型中只有差分阶数的设置。

4 绘制ACF与PACF图像,完成模型选择

 绘制ACF与PACF图像,完成模型选择

from statsmodels.tsa.arima_model import ARIMA
import statsmodels.api as sm
from statsmodels.graphics.tsaplots import plot_acf,plot_pacf
fig = plt.figure(figsize=(12,8))
ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(df['D1'].dropna(),lags=40,ax=ax1)
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(df['D1'].dropna(),lags=40,ax=ax2)

观察ACF和PACF的状态,很明显,两个自相关系数都没有呈现拖尾的情况、而是更加随机地排列,因此p和q都不为0,在确定p和q都不为0后,我们需要先确定合适的d值、再建模寻找合适的p和q。根据之前我们讲解的理论,我们一般会尝试[0,1,2,3]阶差分,并取这些差分当中不存在过差分问题的、方差较小、噪音较少的阶数作为d的取值。当我们对数据的ACF绘图时,如果滞后为1的ACF为负,就说明数据存在过差分问题。依据这些理论,我们来打印4个不同阶差分的标准差和ACF图像:

from statsmodels.graphics.tsaplots import plot_acf

diff = [df['load'],df['load'].diff().dropna()
        ,df['load'].diff().diff().dropna()
        ,df['load'].diff().diff().diff().dropna()
       ]

titles = ["d=0","d=1","d=2","d=3"]

fig, (ax1, ax2, ax3, ax4) = plt.subplots(4,1,figsize=(8,14))

for idx, ts, fig, title in zip(range(4),diff,[ax1,ax2,ax3,ax4],titles):
    print("{}阶差分的标准差为{}".format(idx,ts.std()))
    plot_acf(ts, ax=fig, title=title)
### 输出 ###
0阶差分的标准差为538.1409590325272
1阶差分的标准差为196.46922954307325
2阶差分的标准差为131.69638621457582
3阶差分的标准差为153.37183416857923

很明显,d=3出现了“过差分”的情况(滞后为1的ACF值为负),d=2 的标准差小于任何差分数据,因此我们可以判断对ARIMA模型而言最佳的d取值为2

在这里,除了ARIMA(p,d,q)之外,我们还可以考虑使用SARIMA(p,d,q,s)模型。SARIMA是季节性ARIMA模型,非常擅长处理周期性数据,它的前三个超参数含义与ARIMA完全相同,而最后一个超参数s则代表差分的步数,这说明SARIMA模型可以同时完成多步差分和高阶差分两个任务,相比之下ARIMA模型只能做高阶差分。

在之前的平稳性检验中,我们已经知道当前时间序列具有较强的周期性、且能够让序列变得平稳的最佳选择是24步差分,因此自带多步差分功能、且擅长处理周期性数据的SARIMA模型可能是更好的选择。SARIMA模型规定,当原始序列明显周期性明显时,d的值至少是2,因此我们可以暂时将SARIMA模型的d值确认为2。

5 建立ARIMA和SARIMA模型

5.1 初步建模

首先导入库文件,并忽视不必要的警告信息。

import statsmodels
from statsmodels.tsa.arima.model import ARIMA
#在0.12及以上版本的statsmodel中,ARIMA一个类可以实现AR、MA、ARMA、ARIMA和SARIMA模型
from pandas.tseries.offsets import DateOffset
# ignore警告
import warnings
warnings.filterwarnings("ignore")

初步建立模型,预测的时间为最后一天的数据

#对每个备选模型,我们进行训练、打印训练结果,并绘制预测图像
arima_0=ARIMA(endog = df['load'],order=(1,0,1))
arima_0=arima_0.fit()
df['arima']=arima_0.predict(start=480-24,end=480,dynamic=True)
df[['load','arima']].plot(figsize=(12,4));

从预测出的图像我们大概可以看出模型在预测上没有任何作用,当预测的图像不合格时我们可以直接更换参数,当预测的图像看起来相对合理时我们可以打印当前模型的更多详情进行查看。

5.2 精细化建模

#alpha:人为规定的显著性水平,一般都使用0.05或者0.01
print(arima_0.summary(alpha=0.05))

输出后标记summary中参数的具体含义,帮助我们更好的建模  

summary方法返回的第一部分是当前模型最基本的信息和最基本的评估指标。如上图所示,训练的基本信息,包括了当前建立的ARIMA模型、建模时间、样本数量等等信息。

在statsmodels中存在6种以上不同的协方差计算方法,默认的方法是opg(即等同于皮尔逊相关系数中的协方差计算方法),一般保持默认的选项。

值得注意的是模型评估方法,这里列出的四个指标分别是对数似然估计、AIC、BICHQIC四个评估指标,其中对数似然估计Log Likehood是越大越好,而其他三个指标AIC、BIC和HQIC是越小越好。通常来说我们会直接关注AIC的指标,优先选出AIC最低的模型进行进一步的参数选取。

summary方法返回的第二部分(没有标记部分)展示了训练好的ARIMA模型中每一个具体的项的值、以及这些项的显著性水平,结合第二部分和我们建立的ARIMA模型时设置的p、d、q值,我们可以写出当前ARIMA模型的具体公式:

以现在的ARIMA(1,2,1)为例,当前ARIMA由MA(1)和RA(1)共同构成,因此公式如下:

在这个公式中,常数对应着表格左侧第一项const,AR模型的唯一项对应着ar.L1,MA模型的唯一项就对应着 ma.L1。如此不难发现,ar.L1中的L1指的是滞后1,表示值带有滞后1这一项的AR模型,ma.L1同理。你可以看到,该表格中左侧的项是与ARIMA的项一 一对应的,因此当我们设置的p、d、q值不同时,该表格中反馈的项也会不一样。

在此基础上,该表格中值得关注的列有:

  • coef:该项的系数,比如 ar.L1 的coef就是𝛽1的取值,ma.L1的coef就是𝜃1的取值。当该项是常数项时,coef就等于该项本身。
  • std err:当前项的标准误,衡量当前项对整个ARIMA模型的预测损失的影响。一个项的std err越大,说明这个项对当前模型的损失贡献越大,说明模型对这个项的参数估计可能越不准确。
  • 𝑷>|𝒛|:该项的系数在统计学上是否显著的p值。在这里我们完成的是针对每一个系数的单变量检验。

        单变量检验的原假设(H0):当前系数coef为0(当前项与标签不相关)
        单变量检验的备择假设(H1):当前系数coef不为0(当前项与标签相关)

很明显,对模型来说理想的状态是拒绝原假设、接受备择假设,因此在我们规定的显著性水平𝛼(0.05)下,如果有任意项的p值大于𝛼,则说明当前项的系数没能通过显著性检验,模型对当前项的系数没有足够的信心。例如,在当前表格中,ar.L1的p值为0,小于显著性水平0.05,则说明系数0.7837是可靠的。
在一个模型当中,如果很多系数的p值都大于0.05,则可能说明模型处于复杂度过高的状态(即,许多项看起来都与标签无关,所以我们可能创造了许多原本不需要的项)。此时我们可以选择更简单的模型。

在读表格的这一部分的时候,我们首先会观察p值,确定是否有任何项的p值大于我们设置的显著性水平𝛼。如果存在这样的项,那我们大概率就不会关注当前的模型了。在ARIMA模型选择过程中,我们选出的模型应当是所有项的p值都小于显著性水平的模型。

Summary表单的第三部分是针对残差完成的各项假设检验。在混成检验的定义中,残差是真实标签与当前ARIMA的预测标签之间的差异,即:

𝒓=𝒚−𝒚̂ 

需要注意的是,MA模型求解过程中不断估计出的 [𝜖𝑡,𝜖𝑡−1,...,𝜖𝑡−𝑘] 也是残差,但建模过程中估计出的残差与建模结束后才计算的残差序列𝒓具体数值上有巨大的差别。序列𝒓是在ARIMA模型训练完毕后才结合真实标签计算出来的,因此相当于使用了最后、最新的、迭代完毕的𝛽值,而MA模型中的[𝜖𝑡,𝜖𝑡−1,...,𝜖𝑡−𝑘]是一系列中间变量,在模型迭代过程中会不断发生变化。注意不要混淆两个残差序列。

statsmodel中的ARIMA自动完成以下三项检验:

  • Ljung-Box test,为LBQ检验。LBQ检验是检查样本之间是否存在自相关性的检验。在查看LBQ测试的p值时,我们希望这是一个大于显著性水平(0.05)、令我们接受原假设的p值。

        LBQ检验原假设(H0):样本之间是相互独立的
        LBQ检验备择假设(H1):样本之间不是相互独立的,存在一些内在联系

总结一下,LBQ下的Prob(Q)项大于0.05时模型可用,否则可考虑更换模型的超参数组合


  • Heteroskedasticity test,异方差检验在一个序列当中,随机抽出不同的子序列并计算这些子序列的方差,如果每个子序列的方差不一致,则称该序列存在“异方差现象”,否则称该序列为“同方差序列”。我们对残差做异方差检验,可以帮助我们进一步确认残差是否高度类似于白噪音数据。同理,我们想要的是接受原假设的结果,因此同LBQ测试,我们希望异方差检验的p值是大于显著性水平的(大于0.05)。

        异方差检验(White's test)原假设(H0):该序列同方差
        异方差检验(White's test)备择假设(H1):该序列异方差

总结一下,异方差检验的Prob(H)大于0.05时模型可用,否则可考虑更换超参数组合


  • Jarque-Bera test,雅克贝拉检验。是正态性检验中的一种,用于检验当前序列是否符合正态分布。同理,我们希望检验结果无法拒绝原假设,因此我们希望该检验的p值是大于显著性水平的。

        雅克-贝拉检验原假设(H0):序列是正态分布的

        雅克-贝拉检验备择假设(H1):序列不是正态分布的

总结一下,雅克-贝拉检验的Prob(JB)大于0.05时模型可用,否则可考虑更换超参数组合


对ARIMA模型而言,最佳的情况是三个检验都无法拒绝原假设,但现实往往不会这么完美。在实际选择模型过程中,如果实在找不到能让三个检验都接受原假设的参数组合,也可以选择没通过的检验中、p值最大的参数组合。另外,也可以调低显著性水平,例如将0.05调整为0.01,从而让检验全都接受原假设。

5.3 最终的模型

对于ARIMA模型,我们建立如下9个备选模型,而对SARIMA模型,我们同样建立9个备选模型:

#备选模型
arimas = [ARIMA(endog = df['load'],order=(1,1,1))
         ,ARIMA(endog = df['load'],order=(1,1,2))
         ,ARIMA(endog = df['load'],order=(2,1,1))
         ,ARIMA(endog = df['load'],order=(2,1,2))
         ,ARIMA(endog = df['load'],order=(1,1,3))
         ,ARIMA(endog = df['load'],order=(3,1,1))
         ,ARIMA(endog = df['load'],order=(3,1,2))
         ,ARIMA(endog = df['load'],order=(2,1,3))
         ,ARIMA(endog = df['load'],order=(3,1,3))
         ]
sarimas = [ARIMA(endog = df['load'],seasonal_order=(1,1,1,24))
          ,ARIMA(endog = df['load'],seasonal_order=(1,1,2,24))
          ,ARIMA(endog = df['load'],seasonal_order=(2,1,1,24))
          ,ARIMA(endog = df['load'],seasonal_order=(2,1,2,24))
          ,ARIMA(endog = df['load'],seasonal_order=(1,1,3,24))
          ,ARIMA(endog = df['load'],seasonal_order=(3,1,1,24))
          ,ARIMA(endog = df['load'],seasonal_order=(3,1,2,24))
          ,ARIMA(endog = df['load'],seasonal_order=(2,1,3,24))
          ,ARIMA(endog = df['load'],seasonal_order=(3,1,3,24))
          ]

SARIMA模型规定,最少要使用1阶差分,1步差分,所有d和s都需要大于1,不然会报错。通过函数循环训练显示:

def plot_summary(models,summary=True,model_name=[]):
    """绘制图像并打印summary的函数"""
    for idx,model in enumerate(models):
        m = model.fit()
        if summary:
            print("\n")
            print(model_name[idx])
            print(m.summary(alpha=0.01))
        else:
            df["model"] = m.predict(start=480-24,end=480,dynamic=True)
            df[['load','model']].plot(figsize=(12,2),title="Model {}".format(idx))

ARIMA模型的9个模型的效果如下:

#先进行图像的绘制,从预测结果中选出效果可能比较好的参数组合
plot_summary(arimas,False) 

ARIMA系列模型看起来都问题很大,索引3,6,7,8的模型大略地捕捉到了一点点趋势,但是和准确的预测比起来还是有很大地差异。接着继续绘制SARIMA备选模型的图像。 

#先进行图像的绘制,从预测结果中选出效果可能比较好的参数组合
plot_summary(sarimas,False) 

可以看出,SARIMA的情况明显比ARIMA要好很多,所有的SARIMA模型看起来都能够较为精准地捕捉到数据的趋势,接下来我们可以查看这些SARIMA模型的summary总结,来观察这些模型能否被使用。 

#打印较好的参数组合的summary
plot_summary([sarimas[0],sarimas[1],sarimas[2],sarimas[3],sarimas[4],sarimas[5],sarimas[6],sarimas[7],sarimas[8]]
             ,model_name=["SARIMA0","SARIMA1","SARIMA02","SARIMA03","SARIMA04","SARIMA05","SARIMA06","SARIMA07","SARIMA08"])

从打印的summary来看,所有建立的模型并没有很好的满足要求,03号模型的AIC=6049.452最低,因此我们应该考虑03号模型,模型参数的调整可以根据流程进一步优化,最后可视化最后的预测效果图。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电源地虚接,导致信号线发烫

音频板的信号是经过隔直电容接到音频板的。

【STM32】CRC(循环冗余校验)

一、CRC的背景知识 1、什么是CRC (1)CRC&#xff08;Cyclic Redundancy Check&#xff09;&#xff0c;循环冗余校验 (2)什么是校验&#xff0c;为什么需要校验&#xff1a;数据传输&#xff0c;数据存储过程中需要使用到的 (3)什么是冗余&#xff1a;表示比实际上要传输的数据…

正版软件|Kaspersky 杀毒软件 - 全方位安全软件

卡巴斯基 全方位安全软件 一款产品满足 您的全部安全需求&#xff0c; 通过屡获殊荣的保护产品抵御黑客、病毒和恶意软件&#xff0c;获得无与伦比的安全感。此外还有支付保护和隐私保护工具&#xff0c;为您提供全方位保护。包含高级版功能&#xff1a; 免费 Kaspersky Safe …

使用Jupyter Notebook调试PySpark程序错误总结

项目场景&#xff1a; 在Ubuntu16.04 hadoop2.6.0 spark2.3.1环境下 简单调试一个PySpark程序&#xff0c;中间遇到的错误总结&#xff08;发现版对应和基础配置很重要&#xff09; 注意&#xff1a;在前提安装配置好 hadoop hive anaconda jupyternotebook spark zo…

vulnhub靶机Momentum2

下载地址&#xff1a;https://download.vulnhub.com/momentum/Momentum2.ova 主机发现 端口扫描 端口服务扫描 漏洞扫描 先去看看web 这里面没有什么&#xff0c;就顺手扫一下目录 发现一些可疑的目录 比较正常 再看一下有没有别的web 看到几个新的东西去看看 文件上传 啥都没…

8.jib-maven-plugin构建springboot项目镜像,docker部署配置

目录 1.构建、推送镜像 1.1 执行脚本 2.2 pom.xml配置 ​2.部署镜像服务 2.1 执行脚本 2.2 compose文件 3.docker stack常用命令 介绍&#xff1a;使用goole jib插件构建镜像&#xff0c;docker stack启动部署服务&#xff1b; 通过执行两个脚本既可以实现构建镜像、部…

实时音视频方案汇总

若有好的方案欢迎留言讨论&#xff0c;非常感谢&#xff0c;汇总了一些&#xff0c;从市面上了解的一些低时延的端到端的方案&#xff0c;仅供参照&#xff0c;若有问题&#xff0c;也欢迎留言更正&#xff01; 方案 方案描述 时延 备注 1大华同轴高清电缆200米电缆&#xf…

Mysql之多表查询下篇

Mysql之多表查询下篇 满外连接的实现UNION关键字UNIONUNION ALL操作符 7种SQL JOINS的实现语法格式小结自然连接USING连接表连接的约束条件 满外连接的实现 在上篇博客中&#xff0c;我们可以了解到在Mysql中是不支持FULL JOIN来实现 满外连接的&#xff0c;那么我们在Mysql采用…

“鸿蒙之父”确认鸿蒙 PC 来了;腾讯是囤积 AI 芯片最多的中国科技公司之一丨 RTE 开发者日报 Vol.87

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

Cow Lineup S——离散化、单调队列、双指针

题目描述 思路 x、id不大于1亿&#xff0c;数据量太大&#xff0c;使用离散化将id离散化成一串从1开始连续的编号&#xff0c;使用map集合进行离散化使用双指针维护一段区间&#xff0c;这段区间满足每个编号都包含 如何使用map集合进行离散化&#xff1f; 维护一个变量nums…

如何将中文翻译成荷兰语?

随着中国的崛起&#xff0c;荷兰与中国的交流日益频繁。越来越多的企业和个人需要荷兰语翻译服务。那么&#xff0c;如何将中文翻译成荷兰语&#xff0c;北京哪家翻译公司比较专业&#xff1f; 专业人士指出&#xff0c;要提供优质的荷兰语翻译服务&#xff0c;不仅需要扎实的荷…

如何为初创企业选择合适的 ERP 系统?

**ERP系统**是制造、分销、供应链、金融、会计、风险管理等多个行业必不可少的企业技术解决方案。不论垂直行业、企业规模或目标受众如何&#xff0c;将ERP作为企业管理战略的核心部分都非常重要。 对于渴望发展的小型企业和初创企业来说&#xff0c;更是如此。大型企业需要对…

Maven依赖管理项目构建工具(保姆级教学)

一、Maven介绍 官网地址&#xff1a;Maven – Introduction Maven 是一款为 Java 项目管理构建、依赖管理的工具&#xff08;软件&#xff09;&#xff0c;使用 Maven 可以自动化构建、测试、打包和发布项目&#xff0c;大大提高了开发效率和质量。 Maven就是一个软件&#…

mysql索引学习案例

简单的学习一下mysql普通索引 这是一个小的案例 一、创建表SQL CREATE TABLE group_order (id int(11) NOT NULL AUTO_INCREMENT,group_seq varchar(64) COLLATE utf8mb4_bin NOT NULL COMMENT 拼单号,group_status int(8) NOT NULL COMMENT 100 待提货, 200 已提货, 300 已…

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-B卷

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-B卷 2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-B卷A模块基础设施设置/安全加固&#xff08;200分&#xff09;A-1&#xff1a;登录安全加固&#xff08;Windows, Linux&#xff09;A-2&#…

vite+vue3+ts中watch和watchEffct的使用

vitevue3ts中watch和watchEffct的使用 本文目录 vitevue3ts中watch和watchEffct的使用watchrefreactivepropsimmediate组合监听 watchEffect单值多值侦听副作用停止监听 watch vue官方文档&#xff1a;https://cn.vuejs.org/api/reactivity-core.html#watch 可以监听基础类型&…

cookie机制 + java 案例

目录 为什么会有cookie?? cookie从哪里来的&#xff1f;&#xff1f; cookie到哪里去&#xff1f;&#xff1f; cookie有啥用&#xff1f;&#xff1f; session HttpServletRequest类中的相关方法 简单的实现cookie登录功能 实现登录页面 实现servlet逻辑 实现生成主…

牛客机考题编程题输入输出

有时空可以练练这里的题目&#xff1a; https://ac.nowcoder.com/acm/contest/5652 做个总结&#xff0c;其实就两种输入类型&#xff1a; 一种是下面这种&#xff0c;需要对输入的每行进行运算 这种就是循环读取每行的数做一个运算&#xff1a; import sys while True:line …

【Nuxt】Nuxt3 动态导入图片 src

nuxt3 不再支持 require 动态导入资源&#xff0c;因此需要我们将图片放到 public 目录下&#xff0c;这样我们就可以动态导入了 比如下面 &#x1f447;&#xff1a; 感谢 Nuxt3遇见的坑&#xff08;四&#xff09;&#xff1a;图片动态渲染之后打包路径问题以及打包css样式…

代码混淆的原理是什么?常见代码混淆方法介绍

​ 代码混淆的原理是什么&#xff1f;常见代码混淆方法介绍 本文主要想你介绍代码混淆的原理&#xff0c;常见代码混淆方法&#xff0c;欢迎查阅~ 移动应用代码安全非常重要&#xff0c;代码逆向会导致代码逻辑被获取&#xff0c;进一步导致控制流被hook&#xff0c;安全防线被…