目录
2023-c-问题二
问题分析
介绍
单位根检验
白噪声检验
自相关和偏自相关图
利用信息准则定阶
构建AMIMA模型
D-W检验
预测
代码
2023-c-问题二
问题分析
ARMA适合多个领域的时间序列分析,不同时间的定价策略属于这类问题。
介绍
ARMA模型,全称为自回归移动平均模型(Autoregressive Integrated Moving Average Model),是一种常用于时间序列分析的统计模型。它结合了自回归模型(AR)和移动平均模型(MA)的特性,能够描述时间序列数据中的自相关性和随机扰动之间的关系。ARMA模型通常表示为ARMA(p, q)形式,其中p表示自回归项的数量,q表示移动平均项的数量。
对时间序列的随机性和平稳性进行检验,根据检验的结果,可将序列分为不同的类型:
纯随机序列(白噪声序列):序列的各项之间没有任何的相关关系,序列在进行完全无序的波动,对于这样的序列,ARMA选择放弃分析。
平稳非白噪声序列:平稳的意思指该序列的均值和方差是常数,对于该类型的数据,我们通常建立一个线性拟合该序列的发展,比如使用ARMA。
非平稳序列:它的均值和方差不稳定,处理方法一般是将其转化为平稳性数据,然后再使用ARMA算法。
单位根检验
用于判断时间序列是否有非平稳性
输出:
原始序列的ADF检测结果为: (-3.5139213200446737, 0.007636680826067631, 13, 1071, {'1%': -3.436470487817901, '5%': -2.8642424166404, '10%': -2.5682088634756735}, 10564.986426036365)
p值为 0.007636680826067631<0.05,ADF值为-3.5139213200446746,同时小于1%= -3.436470487817901、5%=-2.8642424166404、10%=-2.5682088634756735即说明非常好地拒绝该假设,故为平稳序列,选择ARMA模型
白噪声检验
用于确定一个给定的数据集是否符合白噪声的特性。在实际应用中,白噪声检验可以用来评估数据的随机性,以及排除数据集中可能存在的非随机因素。
在python中,引入相关函数就可以直接判断是否为非白噪声
自相关和偏自相关图
自相关是指一个时间序列与其自身在不同时间点的相似程度。它通常用于分析时间序列数据中的重复模式或周期性波动。
偏自相关是自相关的一种特殊形式,它考虑了时间序列中的滞后效应。偏自相关图是用来展示这种滞后效应的图形工具,观察偏自相关图,我们可以识别出时间序列中的潜在因果关系。
这种图大多只需你会识别即可,如下图自相关图将显示出明显的峰值,数据序列中的未来值与过去值有较高的相关性。
利用信息准则定阶
信息准则定阶是指使用AIC(赤池信息准则)或BIC(贝叶斯信息准则)等信息准则来确定ARMA模型的最佳阶数。帮助我们在不同的ARMA模型之间做出选择,找到那个既能很好地拟合数据,又不会过度拟合的数据。AIC和BIC都是基于模型复杂度和拟合优度的权衡。
在python中,利用statsmodels库,使用内置的方法来自动选择最佳的ARMA模型阶数。
构建AMIMA模型
上面的准则是为了得到参数order
绘制出如下诊断图(残差图、散点图、直方图、自相关图)
- 残差图展示了模型残差与时间的关系。理想情况下,残差应该是随机噪声,不显示出任何明显的模式或趋势。
D-W检验
D-W检验(Durbin-Watson检验),用于检测时间序列数据中自相关的统计测试。它主要用于检查模型残差是否存在自相关性。
D-W检验的值范围在0到4之间,接近2表示没有自相关,小于2表示正自相关,大于2表示负自相关。D-W检验的值越远离2,表明自相关性越强。
在Python中,可以使用statsmodels库来进行Durbin-Watson检验。
预测
主要关注p值和置信区间
代码
# %% [markdown]
# 考虑商超以品类为单位做补货计划,请分析各蔬菜品类的销售总量与成本加成
# 定价的关系,并给出各蔬菜品类未来一周(2023 年 7 月 1-7 日)的日补货总量和定价策略,
# 使得商超收益最大。
# %%
import numpy as np
import pandas as pd
import datetime
import seaborn as sns
from scipy import stats
import matplotlib.pyplot as plt
from sklearn import preprocessing
from sklearn.model_selection import KFold
from statsmodels.graphics.tsaplots import acf,pacf,plot_acf, plot_pacf
from statsmodels.tsa.stattools import adfuller as ADF
from sklearn.metrics import mean_squared_error
import sys
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# %%
Category = pd.read_excel(r"D:\jianmo\2023年数学建模C\2023年数学建模C\附件1.xlsx")
Category
# %%
loss = pd.read_excel(r"D:\jianmo\2023年数学建模C\2023年数学建模C\附件2.xlsx")
loss
# %%
price = pd.read_excel(r"D:\jianmo\2023年数学建模C\2023年数学建模C\附件3.xlsx")
price
# %%
merge_data=pd.merge(price, loss, on="单品编码", how="left")
merge_data
# %%
category_sales = pd.read_excel(r"C:\Users\Administrator\Desktop\程序\data\save2.xlsx")
category_sales
# %%
# Group by date and category and sum the sales volume
daily_sales = category_sales.groupby(['销售日期', '分类名称'])['销量(千克)'].sum().reset_index()
daily_sales
# %%
daily_sales.info()
# %% [markdown]
# daily_sales=daily_sales.set_index('销售日期')
# daily_sales
# %%
plt.figure(figsize=(10, 5))
for category in daily_sales['分类名称'].unique():
subset = daily_sales[daily_sales['分类名称'] == category]
plt.plot(subset['销售日期'], subset['销量(千克)'], label=category)
plt.title('按时间分类的销售量趋势')
plt.xlabel('时间')
plt.ylabel('销量 (kg)')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()
# %%
lj=daily_sales[daily_sales['分类名称'] == '辣椒类']
hy=daily_sales[daily_sales['分类名称'] == '花叶类']
hc=daily_sales[daily_sales['分类名称'] == '花菜类']
qz=daily_sales[daily_sales['分类名称'] == '茄类']
syj=daily_sales[daily_sales['分类名称'] == '食用菌']
ss=daily_sales[daily_sales['分类名称'] == '水生根茎类']
# %% [markdown]
# # 辣椒类预测
# %%
lj=lj.set_index('销售日期')
lj
# %%
#进行单位根检验
print('原始序列的ADF检测结果为:',ADF(lj['销量(千克)']))
#返回值依次为:adf,pvalue,usedleg,nobs,critrical value,icbest,regresults,resstore
# %% [markdown]
# pvalue= 0.007636680826067594< 0.5,ADF Test result=-3.5139213200446746,同时小于1%= -3.436470487817901、5%=-2.8642424166404、10%=-2.5682088634756735即说明非常好地拒绝该假设,故为平稳序列,选择ARMA模型
# %%
#白噪声数据没有分析价值,所以要进行白噪声检验
from statsmodels.stats.diagnostic import acorr_ljungbox as lb_test
p= lb_test(lj['销量(千克)']).iloc[0,1]
if p<0.05:
print(u'原始序列为非白噪声序列')
else:
print(u'原始序列为白噪声序列')
# %%
#绘制自相关、偏自相关图
plt.figure(figsize=(10,5))
plot_acf(lj['销量(千克)'])
plot_pacf(lj['销量(千克)'])
plt.show()
# %% [markdown]
# 两个都是拖尾,选择ARMA模型
# %%
import statsmodels.api as sm
def detetminante_order_AIC(timeseries): #信息准则定阶:AIC、BIC、HQIC
#AIC
AIC = sm.tsa.arma_order_select_ic(timeseries,\
max_ar=6,max_ma=4,ic='aic')['aic_min_order']
#BIC
BIC = sm.tsa.arma_order_select_ic(timeseries,max_ar=6,\
max_ma=4,ic='bic')['bic_min_order']
#HQIC
HQIC = sm.tsa.arma_order_select_ic(timeseries,max_ar=6,\
max_ma=4,ic='hqic')['hqic_min_order']
print('the AIC is{},\nthe BIC is{}\n the HQIC is{}'.format(AIC,BIC,HQIC))
# %%
lj
# %%
lj_train_size = 1078
lj_test_size = len(lj) - lj_train_size
lj_train,lj_test = lj[0:lj_train_size], lj[lj_train_size:len(lj)]
lj_train
# %%
trend_evaluate = sm.tsa.arma_order_select_ic(lj_train['销量(千克)'], ic=['aic', 'bic'], trend='n', max_ar=20,
max_ma=5)
print('train AIC', trend_evaluate.aic_min_order)
print('train BIC', trend_evaluate.bic_min_order)
# %%
detetminante_order_AIC(lj['销量(千克)'])
# %%
from statsmodels.tsa.arima.model import ARIMA #ARIMA模型
model=ARIMA(lj_train['销量(千克)'],order=(4,0,3)) #建立ARIMA(8,0)模型
model_fit=model.fit()
model_fit.plot_diagnostics(figsize=(12,8))
# %%
# D-W检验
# DW趋近2,P=0,不存在自相关性
print(sm.stats.durbin_watson(model_fit.resid.values))
# %%
resid=model_fit.resid
fig=plt.figure(figsize=(16,12))
ax1=fig.add_subplot(211)
sm.graphics.tsa.plot_acf(resid,lags=15,ax=ax1) #自相关系数
ax2=fig.add_subplot(212)
sm.graphics.tsa.plot_pacf(resid,lags=15,ax=ax2) #偏相关系数
# %%
acf,q,p=sm.tsa.acf(resid.values.squeeze(),nlags=20,qstat=True)
data=np.c_[range(1,21),acf[1:],q,p]
table=pd.DataFrame(data,columns=["lag","AC","Q","P-value"])
print(table.set_index("lag"))
# %%
fc= model_fit.forecast(7) # 95% conf
fc
# %%
print('模型报告为:\n',model_fit.summary())
# %%
fc_series = pd.DataFrame(fc, index=lj_test.index)
fc_series
# %%
forcast=pd.DataFrame(fc)
forcast
# %%
dates = pd.date_range('2023-06-24',periods=7)
# %%
forcast.index=dates
forcast
# %%
plt.figure(figsize=(10,5), dpi=100)
plt.plot(lj_train['销量(千克)'], label='training')
plt.plot(lj_test['销量(千克)'], label='actual')
plt.plot(forcast , label='forecast')
plt.title('Forecast vs Actuals')
plt.xlabel('时间')
plt.ylabel('销量 (kg)')
plt.legend(loc='upper left', fontsize=8)
plt.show()
# %%
lj_model=ARIMA(lj['销量(千克)'],order=(4,0,3)) #建立ARIMA(8,0)模型
lj_model_fit=lj_model.fit()
pre_lj=lj_model_fit.forecast(7)
pre_lj
# %%
forcast_lj=pd.DataFrame(pre_lj)
dateslj = pd.date_range('2023-07-01',periods=7)
forcast_lj.index=dateslj
forcast_lj
# %%
plt.figure(figsize=(10,5), dpi=100)
plt.plot(lj['销量(千克)'], label='actual')
plt.plot(forcast_lj , label='forecast')
plt.title('Forecast vs Actuals')
plt.legend(loc='upper left', fontsize=8)
plt.show()
# %% [markdown]
# # 花叶类预测
# %%
from statsmodels.tsa.stattools import adfuller #ADF检验
def ADF_test(timeseries): ## 用于检测序列是否平稳
x = np.array(timeseries['销量(千克)'])
adftest = adfuller(x, autolag='AIC')
#print (adftest)
if adftest[0] < adftest[4]["1%"] and adftest[1] < 10**(-8):
# 对比Adf结果和10%的时的假设检验 以及 P-value是否非常接近0(越小越好)
print("序列平稳")
return True
else:
print("非平稳序列")
return False
# %%
ADF_test(hy)
# %%
hy=hy.set_index('销售日期')
#进行单位根检验
print('原始序列的ADF检测结果为:',ADF(hy['销量(千克)']))
#返回值依次为:adf,pvalue,usedleg,nobs,critrical value,icbest,regresults,resstore
# %% [markdown]
# 非平稳时间序列,故选择ARIMA模型
# %%
## 做差分,检查平稳性
def diff(timeseries):
time_diff1=timeseries.diff(1).fillna(0) #1阶差分
time_diff2=time_diff1.diff(1).fillna(0) #2阶差分
time_adf=ADF(timeseries)
time_diff1_adf=ADF(time_diff1)
time_diff2_adf=ADF(time_diff2)
fig = plt.figure(figsize=(10, 5))
ax1 = fig.add_subplot(111)
time_diff1.plot(ax=ax1)
plt.title('一阶差分图')
return [time_diff1_adf,time_diff2_adf]
diff(hy['销量(千克)'])
# %%
def autocorr(time_series,lags):
fig=plt.figure(figsize=(12,8))
ax1=fig.add_subplot(211)
sm.graphics.tsa.plot_acf(time_series,lags=lags,ax=ax1)
ax2=fig.add_subplot(212)
sm.graphics.tsa.plot_pacf(time_series,lags=lags,ax=ax2)
plt.show()
hy_diff1=hy['销量(千克)'].diff(1).fillna(0)
#hy_diff2=hy_diff1.diff(1).fillna(0)
autocorr(hy_diff1,30)
# %% [markdown]
# 选择d=1
# %%
train_size_hy=len(hy)-7
train_hy,test_hy = hy[0:train_size_hy], lj[train_size_hy:len(hy)]
# %%
detetminante_order_AIC(train_hy['销量(千克)'])
# %%
arma_64=sm.tsa.SARIMAX(train_hy['销量(千克)'],order=(6,1,4)).fit()
print("arma_64",arma_64.aic,arma_64.bic,arma_64.hqic)
arma_34=sm.tsa.SARIMAX(train_hy['销量(千克)'],order=(3,1,4)).fit()
print("arma_34",arma_34.aic,arma_34.bic,arma_34.hqic)
# %%
def Arima(train,test,order):
model=ARIMA(train['销量(千克)'],order=order) #建立ARIMA(8,0)模型
model_fit=model.fit()
fc= model_fit.forecast(7, alpha=0.05) # 95% conf
print('模型报告为:\n',model_fit.summary())
fc_series = pd.DataFrame(fc, index=test.index)
forcast=pd.DataFrame(fc)
dates = pd.date_range('2023-06-24',periods=7)
forcast.index=dates
plt.figure(figsize=(10,5), dpi=100)
plt.plot(train['销量(千克)'], label='training')
plt.plot(test['销量(千克)'], label='actual')
plt.plot(forcast , label='forecast')
plt.title('Forecast vs Actuals')
plt.legend(loc='upper left')
plt.show()
R_squared = 1- (mean_squared_error(test['销量(千克)'],forcast)/ np.var(test))
return model_fit,forcast,R_squared
# %%
forcast_hy,R=Arima(train_hy,test_hy,order=(6,1,4))
print(R)
# %%
arma_64.plot_diagnostics(figsize=(10,8))
# %%
# D-W检验
# DW趋近2,P=0,不存在自相关性
print(sm.stats.durbin_watson(arma_64.resid.values))
# %%
resid_hy=arma_64.resid
fig=plt.figure(figsize=(16,12))
ax1=fig.add_subplot(211)
sm.graphics.tsa.plot_acf(resid_hy,lags=15,ax=ax1) #自相关系数
ax2=fig.add_subplot(212)
sm.graphics.tsa.plot_pacf(resid_hy,lags=15,ax=ax2) #偏相关系数
# %%
from statsmodels.tsa.arima.model import ARIMA #ARIMA模型
model_hy=ARIMA(hy['销量(千克)'],order=(6,1,4)) #建立ARIMA(8,0)模型
model_fit_hy=model_hy.fit()
fc_hy= model_fit_hy.forecast(7, alpha=0.05) # 95% conf
print(fc_hy)
print('模型报告为:\n',model_fit_hy.summary())
# %%
forcast_hy=pd.DataFrame(fc_hy)
dates_hy = pd.date_range('2023-07-01',periods=7)
forcast_hy.index=dates_hy
forcast_hy
# %%
def Pre(data,pre_data):
plt.figure(figsize=(10,5), dpi=100)
plt.plot(data['销量(千克)'], label='actual')
plt.plot(pre_data , label='forecast')
plt.title('Forecast vs Actuals')
plt.legend(loc='upper left', fontsize=8)
plt.show()
# %%
Pre(hy,forcast_hy)
# %% [markdown]
# # 花菜类预测
# %%
hc
# %%
plt.figure(figsize=(20, 10))
plt.plot(hc.index,hc['销量(千克)'])
plt.title('花菜类销售量趋势')
plt.xlabel('时间')
plt.ylabel('销量 (kg)')
# %%
#平稳性检验
ADF_test(hc)
# %%
hc=hc.set_index('销售日期')
#进行单位根检验
print('原始序列的ADF检测结果为:',ADF(hc['销量(千克)']))
#返回值依次为:adf,pvalue,usedleg,nobs,critrical value,icbest,regresults,resstore
# %%
diff(hc['销量(千克)'])
# %%
train_size2 = len(hc)-7
test_size2 = len(hc) - train_size2
train2,test2 = hc[0:train_size2], hc[train_size2:len(hc)]
# %%
# %%
detetminante_order_AIC(train2['销量(千克)'])
# %%
model_hc,forcast_hc,R=Arima(train2,test2,order=(3,1,4))
# %%
model_hc.plot_diagnostics(figsize=(12,8))
# %%
forecasthc2=pd.DataFrame(forecasthc1)
dates1 = pd.date_range('2023-07-01',periods=7)
forecasthc2.index=dates1
forecasthc2
# %%
Pre(hc,forecasthc2)
# %% [markdown]
# # 茄类预测
# %%
qz
# %%
ADF_test(qz)
# %%
qz=qz.set_index('销售日期')
#进行单位根检验
print('原始序列的ADF检测结果为:',ADF(qz['销量(千克)']))
#返回值依次为:adf,pvalue,usedleg,nobs,critrical value,icbest,regresults,resstore
# %% [markdown]
# 平稳时间序列,使用ARMA模型
# %%
p= lb_test(qz['销量(千克)']).iloc[0,1]
if p<0.05:
print(u'原始序列为非白噪声序列')
else:
print(u'原始序列为白噪声序列')
# %%
#绘制自相关、偏自相关图
plt.figure(figsize=(20,5))
plot_acf(qz['销量(千克)'])
plot_pacf(qz['销量(千克)'])
plt.show()
# %%
train_size3 = len(qz) -7
test_size3 = len(qz) - train_size3
train3,test3 = qz[0:train_size3], qz[train_size3:len(qz)]
# %%
train3
# %%
detetminante_order_AIC(train3['销量(千克)'])
# %%
model4=ARIMA(train3['销量(千克)'],order=(4,0,4)) #建立ARIMA(8,0)模型
model_fit4=model4.fit()
forcastqz= model_fit4.forecast(7, alpha=0.05) # 95% conf
print('模型报告为:\n',model_fit4.summary())
# %%
forcastqz
# %%
forcastqz=pd.DataFrame(forcastqz)
dates = pd.date_range('2023-06-24',periods=7)
forcastqz.index=dates
forcastqz
# %%
plt.figure(figsize=(10,5), dpi=100)
plt.plot(train3.index,train3['销量(千克)'], label='training')
plt.plot(test3.index,test3['销量(千克)'], label='actual')
plt.plot(forcastqz, label='forecast')
plt.title('Forecast vs Actuals')
plt.legend(loc='upper left', fontsize=8)
plt.show()
# %%
from statsmodels.tsa.arima.model import ARIMA #ARIMA模型
modelqz=ARIMA(qz['销量(千克)'],order=(4,0,4)) #建立ARIMA(8,0)模型
model_fitqz=modelqz.fit()
forecastqz1= model_fitqz.forecast(7, alpha=0.05) # 95% conf
print(forecastqz1)
print('模型报告为:\n',model_fitqz.summary())
# %%
forecastqz2=pd.DataFrame(forecastqz1)
dates1 = pd.date_range('2023-07-01',periods=7)
forecastqz2.index=dates1
forecastqz2
# %%
plt.figure(figsize=(10,5), dpi=100)
plt.plot(qz['销售日期'],qz['销量(千克)'], label='actual')
plt.plot(forecastqz2.index,forecastqz2 , label='forecast')
plt.title('Forecast vs Actuals')
plt.legend(loc='upper left', fontsize=8)
plt.show()
# %% [markdown]
# # 食用菌预测
# %%
syj
# %%
#ADF_test(syj)
#syj=syj.set_index('销售日期')
#进行单位根检验
print('原始序列的ADF检测结果为:',ADF(syj['销量(千克)']))
#返回值依次为:adf,pvalue,usedleg,nobs,critrical value,icbest,regresults,resstore
# %% [markdown]
# 平稳,用ARMA模型
# %%
detetminante_order_AIC(syj['销量(千克)'])
# %%
train_size4 = len(syj) -7
test_size4= len(syj) - train_size4
train4,test4 = syj[0:train_size4], syj[train_size4:len(syj)]
test4
# %%
model5=ARIMA(train4['销量(千克)'],order=(3,0,3)) #建立ARIMA(8,0)模型
model_fit5=model5.fit()
forcastsyj= model_fit5.forecast(7, alpha=0.05) # 95% conf
print('模型报告为:\n',model_fit5.summary())
# %%
forcastsyj
# %%
forcastsyj=pd.DataFrame(forcastsyj)
dates = pd.date_range('2023-06-24',periods=7)
forcastsyj.index=dates
plt.figure(figsize=(10,5), dpi=100)
plt.plot(train4['销量(千克)'], label='training')
plt.plot(test4['销量(千克)'], label='actual')
plt.plot(forcastsyj , label='forecast')
plt.title('Forecast vs Actuals')
plt.legend(loc='upper left', fontsize=8)
plt.show()
# %%
from statsmodels.tsa.arima.model import ARIMA #ARIMA模型
modelsyj=ARIMA(syj['销量(千克)'],order=(3,0,3)) #建立ARIMA(8,0)模型
model_fitsyj=modelsyj.fit()
forecastsyj1= model_fitsyj.forecast(7, alpha=0.05) # 95% conf
print(forecastsyj1)
print('模型报告为:\n',model_fitsyj.summary())
# %%
forecastsyj2=pd.DataFrame(forecastsyj1)
dates1 = pd.date_range('2023-07-01',periods=7)
forecastsyj2.index=dates1
print(forecastsyj2)
Pre(syj,forecastsyj2)
# %%
ss
# %%
ADF_test(ss)
ss=ss.set_index('销售日期')
#进行单位根检验
print('原始序列的ADF检测结果为:',ADF(ss['销量(千克)']))
#返回值依次为:adf,pvalue,usedleg,nobs,critrical value,icbest,regresults,resstore
# %%
#一阶差分
fig = plt.figure(figsize=(12, 8))
ax1 = fig.add_subplot(111)
diffss1 = ss['销量(千克)'].diff(1)
diffss1.plot(ax=ax1)
# %%
detetminante_order_AIC(ss['销量(千克)'])
# %%
train_size5 = len(ss) -7
test_size5= len(ss) - train_size5
train5,test5 = ss[0:train_size5], ss[train_size5:len(ss)]
model6=ARIMA(train5['销量(千克)'],order=(5,1,3)) #建立ARIMA(8,0)模型
model_fit6=model6.fit()
forcastss= model_fit6.forecast(7, alpha=0.05) # 95% conf
print('模型报告为:\n',model_fit6.summary())
# %%
forcastss=pd.DataFrame(forcastss)
dates = pd.date_range('2023-06-25',periods=7)
forcastss.index=dates
plt.figure(figsize=(10,5), dpi=100)
plt.plot(train5['销量(千克)'], label='training')
plt.plot(test5['销量(千克)'], label='actual')
plt.plot(forcastss , label='forecast')
plt.title('Forecast vs Actuals')
plt.legend(loc='upper left', fontsize=8)
plt.show()
# %%
from statsmodels.tsa.arima.model import ARIMA #ARIMA模型
modelss=ARIMA(ss['销量(千克)'],order=(5,1,3)) #建立ARIMA(8,0)模型
model_fitss=modelss.fit()
forecastss1= model_fitss.forecast(7, alpha=0.05) # 95% conf
print(forecastss1)
print('模型报告为:\n',model_fitss.summary())
# %%
forecastss2=pd.DataFrame(forecastss1)
dates1 = pd.date_range('2023-07-01',periods=7)
forecastss2.index=dates1
print(forecastss2)
Pre(syj,forecastss2)
# %%
plt.figure(figsize=(10,5), dpi=100)
plt.plot(forcast_lj,label='辣椒类')
plt.plot(forcast_hy,label='花叶类')
plt.plot(forecasthc2,label='花菜类')
plt.plot(forecastqz2,label='茄类')
plt.plot(forecastsyj2,label='食用菌')
plt.plot(forecastss2,label='水生根茎类')
plt.xlabel('销售时间')
plt.ylabel('销量(千克)')
plt.title('6种蔬菜品类未来七天的预测值')
plt.legend(loc='upper left', fontsize=8)
plt.show()
# %%
del lj['分类名称']
del hy['分类名称']
del hc['分类名称']
del qz['分类名称']
del syj['分类名称']
del ss['分类名称']
# %%
forcast_lj.rename(columns={'predicted_mean':'销量(千克)'},inplace=True)
forcast_hy.rename(columns={'predicted_mean':'销量(千克)'},inplace=True)
forecasthc2.rename(columns={'predicted_mean':'销量(千克)'},inplace=True)
forecastqz2.rename(columns={'predicted_mean':'销量(千克)'},inplace=True)
forecastsyj2.rename(columns={'predicted_mean':'销量(千克)'},inplace=True)
forecastss2.rename(columns={'predicted_mean':'销量(千克)'},inplace=True)
# %%
ljc=['辣椒类']*7
hyc=['花叶类']*7
hcc=['花菜类']*7
qzc=['茄类']*7
syjc=['食用菌']*7
ssc=['水生根茎类']*7
# %%
forcast_lj['分类名称']=ljc
forcast_hy['分类名称']=hyc
forecasthc2['分类名称']=hcc
forecastqz2['分类名称']=qzc
forecastsyj2['分类名称']=syjc
forecastss2['分类名称']=ssc
# %%
sales_predict= pd.concat([forcast_lj,forcast_hy,forecasthc2,forecastqz2,forecastsyj2,forecastss2])
# %%
sales_predict
# %%
sales_predict.to_csv(r"C:\Users\Administrator\Desktop\程序\data\各品类未来一周销量的ARIMA预测.csv", index=True)
# %%