0、
预测的模型包括:
- SARIMA(季节性自回归积分移动平均模型)
- Prophet(Facebook开源的预测库)
- ARIMA(自回归积分移动平均模型)
- ExponentialSmoothing(指数平滑模型),使用两种不同的方法
- TBATS(基于BATS的时间序列预测工具箱)- 这部分代码被注释掉了,所以没有运行
- Kats SARIMA(由Facebook开源的Kats库提供的SARIMA模型)
- SVM(支持向量机)
- DLM(动态线性模型)
1、更新pandas以后不能运行代码了
2、
代码语言:javascript复制从您提供的错误信息来看,问题出在`所有预测 = 所有预测.append(预测数据)`这一行。错误提示`AttributeError: 'DataFrame' object has no attribute 'append'`,意味着在您使用的pandas版本中,DataFrame对象没有`append`方法。这很可能是因为您更新了pandas库版本后,新版本的pandas中的DataFrame对象不再支持`append`方法。
您提供的pandas版本为2.0.1,这个版本并不是pandas的官方版本。pandas的官方版本目前(截止到2022年11月)最新版本是1.3.4。建议您尝试将pandas库回退到官方版本,以解决此问题。可以使用以下命令来安装指定版本的pandas:
```
pip install pandas==1.3.4
```
安装完成后,请重新运行您的代码,问题应该会得到解决。
3、关闭程序后更新库
代码语言:javascript复制# -*- coding: utf-8 -*-
"""
Created on Wed May 31 11:40:48 2023
@author: Administrator
"""
# -*- coding: utf-8 -*-
"""
Created on Thu May 25 17:23:53 2023
@author: Administrator
"""
import pandas as pd
from statsmodels.tsa.statespace.sarimax import SARIMAX
from prophet import Prophet
from pmdarima import auto_arima
from statsmodels.tsa.holtwinters import ExponentialSmoothing as ES1
from statsmodels.tsa.api import ExponentialSmoothing as ES2
# import pkg_resources
# for package in pkg_resources.working_set:
# print(f"{package.key}=={package.version}")
# import pandas as pd
# print(pd.__version__)
# print(type(所有预测))
# print(type(预测数据))
# 读取Excel文件
数据 = pd.read_excel('销售数据.xlsx')
# 将年月列转换为时间格式
数据['年月'] = pd.to_datetime(数据['年月'])
# 将年月列设置为索引
数据.set_index('年月', inplace=True)
# 创建一个空的DataFrame来保存所有的预测结果
所有预测 = pd.DataFrame()
for i in range(48, len(数据)):
# 创建一个数据子集,包含到当前迭代的所有行
数据子集 = 数据[:i 1]
# 初始化SARIMA模型
模型_sarima = SARIMAX(数据子集['销售金额'], order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))
# 训练模型
模型_sarima_fit = 模型_sarima.fit(disp=False)
# 预测下个月的销售金额
预测_sarima = 模型_sarima_fit.predict(start=len(数据子集), end=len(数据子集))
# Prophet
数据_prophet = 数据子集.reset_index().rename(columns={'年月': 'ds', '销售金额': 'y'})
# 初始化Prophet模型
模型_prophet = Prophet()
# 训练模型
模型_prophet.fit(数据_prophet)
# 创建未来1个月的日期框架
未来 = 模型_prophet.make_future_dataframe(periods=1, freq='MS')
# 进行预测
预测_prophet = 模型_prophet.predict(未来)
预测数据_prophet = 预测_prophet[['ds', 'yhat']].iloc[-1]
# ARIMA
模型_arima = auto_arima(数据子集['销售金额'], seasonal=True, m=12)
# 使用选择的模型进行预测
预测_arima = 模型_arima.predict(n_periods=1)
# ExponentialSmoothing预测方法1
模型_es1 = ES1(数据子集['销售金额'], trend='add', seasonal='add', seasonal_periods=12)
模型_es1_fit = 模型_es1.fit()
预测_es1 = 模型_es1_fit.predict(start=len(数据子集), end=len(数据子集))
# ExponentialSmoothing预测方法2
模型_es2 = ES2(数据子集['销售金额'], trend='add', seasonal='add', seasonal_periods=12)
模型_es2_fit = 模型_es2.fit()
预测_es2 = 模型_es2_fit.forecast(steps=1)
# 移动平均预测
数据子集['移动平均'] = 数据子集['销售金额'].rolling(window=36).mean()
预测_移动平均 = [数据子集['移动平均'].iloc[-1]] # 使用最后一个移动平均值作为预测值
# 创建一个新的DataFrame来保存预测结果
预测数据 = pd.DataFrame({
'年月': [数据子集.index[-1] pd.DateOffset(months=1)],
'SARIMA预测销售金额': 预测_sarima.values,
'Prophet预测销售金额': [预测数据_prophet['yhat']],
'ARIMA预测销售金额': 预测_arima,
'ExponentialSmoothing方法1预测销售金额': 预测_es1.values,
'ExponentialSmoothing方法2预测销售金额': 预测_es2,
'移动平均预测销售金额': 预测_移动平均
})
# 将预测结果追加到所有预测中
所有预测 = 所有预测.append(预测数据)
# 将预测结果保存到新的Excel文件中
所有预测.to_excel('预测销售数据.xlsx', index=False)
4、上面代码,增加VAR、ETS和TBATS的时间序列预测方法到代码中
代码语言:javascript复制# -*- coding: utf-8 -*-
import pandas as pd
from statsmodels.tsa.statespace.sarimax import SARIMAX
from prophet import Prophet
from pmdarima import auto_arima
from statsmodels.tsa.holtwinters import ExponentialSmoothing as ES1
from statsmodels.tsa.api import ExponentialSmoothing as ES2
from statsmodels.tsa.vector_ar.var_model import VAR
from statsmodels.tsa.statespace.exponential_smoothing import ExponentialSmoothing as ETSModel
from tbats import TBATS
数据 = pd.read_excel('销售数据.xlsx')
数据['年月'] = pd.to_datetime(数据['年月'])
数据.set_index('年月', inplace=True)
所有预测 = pd.DataFrame()
for i in range(48, len(数据)):
数据子集 = 数据[:i 1]
# SARIMA
模型_sarima = SARIMAX(数据子集['销售金额'], order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))
模型_sarima_fit = 模型_sarima.fit(disp=False)
预测_sarima = 模型_sarima_fit.predict(start=len(数据子集), end=len(数据子集))
# Prophet
数据_prophet = 数据子集.reset_index().rename(columns={'年月': 'ds', '销售金额': 'y'})
模型_prophet = Prophet()
模型_prophet.fit(数据_prophet)
未来 = 模型_prophet.make_future_dataframe(periods=1, freq='MS')
预测_prophet = 模型_prophet.predict(未来)
预测数据_prophet = 预测_prophet[['ds', 'yhat']].iloc[-1]
# ARIMA
模型_arima = auto_arima(数据子集['销售金额'], seasonal=True, m=12)
预测_arima = 模型_arima.predict(n_periods=1)
# ExponentialSmoothing方法1
模型_es1 = ES1(数据子集['销售金额'], trend='add', seasonal='add', seasonal_periods=12)
模型_es1_fit = 模型_es1.fit()
预测_es1 = 模型_es1_fit.predict(start=len(数据子集), end=len(数据子集))
# ExponentialSmoothing方法2
模型_es2 = ES2(数据子集['销售金额'], trend='add', seasonal='add', seasonal_periods=12)
模型_es2_fit = 模型_es2.fit()
预测_es2 = 模型_es2_fit.forecast(steps=1)
# VAR预测模型
模型_var = VAR(数据子集[['销售金额']])
模型_var_fit = 模型_var.fit(maxlags=15, ic='aic')
预测_var = 模型_var_fit.forecast(数据子集[['销售金额']].values[-1:], steps=1)
# ETS预测模型
模型_ets = ETSModel(数据子集['销售金额'], error='add', trend='add', seasonal='add', damped_trend=True, seasonal_periods=12)
模型_ets_fit = 模型_ets.fit()
预测_ets = 模型_ets_fit.forecast(steps=1)
# TBATS预测模型
模型_tbats = TBATS(seasonal_periods=(12,))
模型_tbats_fit = 模型_tbats.fit(数据子集['销售金额'])
预测_tbats = 模型_tbats_fit.forecast(steps=1)
预测数据 = pd.DataFrame({
'年月': [数据子集.index[-1] pd.DateOffset(months=1)],
'SARIMA预测销售金额': 预测_sarima.values,
'Prophet预测销售金额': [预测数据_prophet['yhat']],
'ARIMA预测销售金额': 预测_arima,
'ExponentialSmoothing方法1预测销售金额': 预测_es1.values,
'ExponentialSmoothing方法2预测销售金额': 预测_es2,
'VAR预测销售金额': 预测_var[0],
'ETS预测销售金额': 预测_ets[0],
'TBATS预测销售金额': 预测_tbats[0]
})
所有预测 = 所有预测.append(预测数据)
所有预测.to_excel('预测销售数据.xlsx', index=False)
5、报错
代码语言:javascript复制 File d:UsersAdministratoranaconda3libsite-packagesstatsmodelstsavector_arvar_model.py:553 in __init__
raise ValueError("Only gave one variable to VAR")
ValueError: Only gave one variable to VAR
6、
代码语言:javascript复制根据错误信息,问题出在这一行:
```python
模型_var = VAR(数据子集[['销售金额']])
```
`VAR`模型需要至少两个变量才能进行预测。在这里,您只提供了一个变量`销售金额`。如果您有其他与销售金额相关的变量,您可以将它们一起传递给`VAR`模型。例如,如果您有一个名为`销售数量`的变量,您可以这样做:
```python
模型_var = VAR(数据子集[['销售金额', '销售数量']])
```
如果您没有其他变量,您可以考虑使用其他时间序列模型,如ARIMA或SARIMA,这些模型只需要一个变量。您已经在代码中使用了这些模型,因此可以考虑删除`VAR`模型部分。
7、报错
代码语言:javascript复制 File ~DesktopGPT4预测2023.5.24合并2023.5.31-3.py:53
模型_ets = ETSModel(数据子集['销售金额'], error='add', trend='add', seasonal='add', damped_trend=True, seasonal_periods=12)
TypeError: __init__() got an unexpected keyword argument 'error'
8、我已经从代码中删除了ETSModel部分。现在您可以使用这段代码进行预测
代码语言:javascript复制# -*- coding: utf-8 -*-
import pandas as pd
from statsmodels.tsa.statespace.sarimax import SARIMAX
from prophet import Prophet
from pmdarima import auto_arima
from statsmodels.tsa.holtwinters import ExponentialSmoothing as ES1
from statsmodels.tsa.api import ExponentialSmoothing as ES2
from tbats import TBATS
数据 = pd.read_excel('销售数据.xlsx')
数据['年月'] = pd.to_datetime(数据['年月'])
数据.set_index('年月', inplace=True)
所有预测 = pd.DataFrame()
for i in range(48, len(数据)):
数据子集 = 数据[:i 1]
# SARIMA
模型_sarima = SARIMAX(数据子集['销售金额'], order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))
模型_sarima_fit = 模型_sarima.fit(disp=False)
预测_sarima = 模型_sarima_fit.predict(start=len(数据子集), end=len(数据子集))
# Prophet
数据_prophet = 数据子集.reset_index().rename(columns={'年月': 'ds', '销售金额': 'y'})
模型_prophet = Prophet()
模型_prophet.fit(数据_prophet)
未来 = 模型_prophet.make_future_dataframe(periods=1, freq='MS')
预测_prophet = 模型_prophet.predict(未来)
预测数据_prophet = 预测_prophet[['ds', 'yhat']].iloc[-1]
# ARIMA
模型_arima = auto_arima(数据子集['销售金额'], seasonal=True, m=12)
预测_arima = 模型_arima.predict(n_periods=1)
# ExponentialSmoothing方法1
模型_es1 = ES1(数据子集['销售金额'], trend='add', seasonal='add', seasonal_periods=12)
模型_es1_fit = 模型_es1.fit()
预测_es1 = 模型_es1_fit.predict(start=len(数据子集), end=len(数据子集))
# ExponentialSmoothing方法2
模型_es2 = ES2(数据子集['销售金额'], trend='add', seasonal='add', seasonal_periods=12)
模型_es2_fit = 模型_es2.fit()
预测_es2 = 模型_es2_fit.forecast(steps=1)
# TBATS预测模型
模型_tbats = TBATS(seasonal_periods=(12,))
模型_tbats_fit = 模型_tbats.fit(数据子集['销售金额'])
预测_tbats = 模型_tbats_fit.forecast(steps=1)
预测数据 = pd.DataFrame({
'年月': [数据子集.index[-1] pd.DateOffset(months=1)],
'SARIMA预测销售金额': 预测_sarima.values,
'Prophet预测销售金额': [预测数据_prophet['yhat']],
'ARIMA预测销售金额': 预测_arima,
'ExponentialSmoothing方法1预测销售金额': 预测_es1.values,
'ExponentialSmoothing方法2预测销售金额': 预测_es2,
'TBATS预测销售金额': 预测_tbats[0]
})
所有预测 = 所有预测.append(预测数据)
所有预测.to_excel('预测销售数据.xlsx', index=False)
9、
代码语言:javascript复制import pandas as pd
from statsmodels.tsa.statespace.sarimax import SARIMAX
from prophet import Prophet
from pmdarima import auto_arima
from statsmodels.tsa.holtwinters import ExponentialSmoothing as ES1
from statsmodels.tsa.api import ExponentialSmoothing as ES2
import numpy as np
from sklearn.svm import SVR
from pydlm import dlm, trend, seasonality
# 读取数据并处理时间
销售数据 = pd.read_excel('销售数据.xlsx')
销售数据['年月'] = pd.to_datetime(销售数据['年月'])
销售数据.set_index('年月', inplace=True)
所有预测 = pd.DataFrame()
for i in range(48, len(销售数据)):
数据子集 = 销售数据.iloc[:i 1].copy()
# SARIMA
SARIMA模型 = SARIMAX(数据子集['销售金额'], order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))
SARIMA模型拟合 = SARIMA模型.fit(disp=False)
SARIMA预测 = SARIMA模型拟合.predict(start=len(数据子集), end=len(数据子集))
# Prophet
数据_Prophet = 数据子集.reset_index().rename(columns={'年月': 'ds', '销售金额': 'y'})
Prophet模型 = Prophet()
Prophet模型.fit(数据_Prophet)
未来 = Prophet模型.make_future_dataframe(periods=1, freq='MS')
Prophet预测 = Prophet模型.predict(未来)
Prophet预测数据 = Prophet预测[['ds', 'yhat']].iloc[-1]
# ARIMA
ARIMA模型 = auto_arima(数据子集['销售金额'], seasonal=True, m=12)
ARIMA预测 = ARIMA模型.predict(n_periods=1)
# ExponentialSmoothing方法1
ES1模型 = ES1(数据子集['销售金额'], trend='add', seasonal='add', seasonal_periods=12)
ES1模型拟合 = ES1模型.fit()
ES1预测 = ES1模型拟合.predict(start=len(数据子集), end=len(数据子集))
# ExponentialSmoothing方法2
ES2模型 = ES2(数据子集['销售金额'], trend='add', seasonal='add', seasonal_periods=12)
ES2模型拟合 = ES2模型.fit()
ES2预测 = ES2模型拟合.forecast(steps=1)
# SVM
SVM模型 = SVR()
时间序列 = np.arange(len(数据子集)).reshape(-1, 1)
SVM模型.fit(时间序列, 数据子集['销售金额'].values)
SVM预测 = SVM模型.predict(np.array([[len(数据子集)]]))
预测数据 = pd.DataFrame({
'年月': [数据子集.index[-1] pd.DateOffset(months=1)],
'SARIMA预测销售金额': SARIMA预测.values,
'Prophet预测销售金额': [Prophet预测数据['yhat']],
'ARIMA预测销售金额': ARIMA预测,
'ExponentialSmoothing方法1预测销售金额': ES1预测.values,
'ExponentialSmoothing方法2预测销售金额': ES2预测,
'SVM预测销售金额': SVM预测,
})
所有预测 = 所有预测.append(预测数据)
所有预测.to_excel('预测销售数据.xlsx', index=False)
10、可以运行
代码语言:javascript复制# -*- coding: utf-8 -*-
"""
Created on Wed May 31 15:23:36 2023
@author: Administrator
"""
# -*- coding: utf-8 -*-
# import pandas as pd
# from statsmodels.tsa.statespace.sarimax import SARIMAX
# from prophet import Prophet
# from pmdarima import auto_arima
# from statsmodels.tsa.holtwinters import ExponentialSmoothing as ES1
# from statsmodels.tsa.api import ExponentialSmoothing as ES2
# from tbats import TBATS
import pandas as pd
from statsmodels.tsa.statespace.sarimax import SARIMAX
from prophet import Prophet
from pmdarima import auto_arima
from statsmodels.tsa.holtwinters import ExponentialSmoothing as ES1
from statsmodels.tsa.api import ExponentialSmoothing as ES2
# from tbats import TBATS
import numpy as np
# from kats.models.sarima import SARIMAParams, SARIMAModel
from sklearn.svm import SVR
# from pydlm import dlm, trend, seasonality
数据 = pd.read_excel('销售数据.xlsx')
数据['年月'] = pd.to_datetime(数据['年月'])
数据.set_index('年月', inplace=True)
所有预测 = pd.DataFrame()
for i in range(48, len(数据)):
数据子集 = 数据[:i 1]
# SARIMA
模型_sarima = SARIMAX(数据子集['销售金额'], order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))
模型_sarima_fit = 模型_sarima.fit(disp=False)
预测_sarima = 模型_sarima_fit.predict(start=len(数据子集), end=len(数据子集))
# Prophet
数据_prophet = 数据子集.reset_index().rename(columns={'年月': 'ds', '销售金额': 'y'})
模型_prophet = Prophet()
模型_prophet.fit(数据_prophet)
未来 = 模型_prophet.make_future_dataframe(periods=1, freq='MS')
预测_prophet = 模型_prophet.predict(未来)
预测数据_prophet = 预测_prophet[['ds', 'yhat']].iloc[-1]
# ARIMA
模型_arima = auto_arima(数据子集['销售金额'], seasonal=True, m=12)
预测_arima = 模型_arima.predict(n_periods=1)
# ExponentialSmoothing方法1
模型_es1 = ES1(数据子集['销售金额'], trend='add', seasonal='add', seasonal_periods=12)
模型_es1_fit = 模型_es1.fit()
预测_es1 = 模型_es1_fit.predict(start=len(数据子集), end=len(数据子集))
# ExponentialSmoothing方法2
模型_es2 = ES2(数据子集['销售金额'], trend='add', seasonal='add', seasonal_periods=12)
模型_es2_fit = 模型_es2.fit()
预测_es2 = 模型_es2_fit.forecast(steps=1)
# # TBATS预测模型
# 模型_tbats = TBATS(seasonal_periods=(12,))
# 模型_tbats_fit = 模型_tbats.fit(数据子集['销售金额'])
# 预测_tbats = 模型_tbats_fit.forecast(steps=1)
# # VAR预测模型
# 模型_var = VAR(数据子集[['销售金额']])
# 模型_var_fit = 模型_var.fit(maxlags=15, ic='aic')
# 预测_var = 模型_var_fit.forecast(数据子集[['销售金额']].values[-1:], steps=1)
# # ETS预测模型
# 模型_ets = ETSModel(数据子集['销售金额'], error='add', trend='add', seasonal='add', damped_trend=True, seasonal_periods=12)
# 模型_ets_fit = 模型_ets.fit()
# 预测_ets = 模型_ets_fit.forecast(steps=1)
# # Kats SARIMA
# 模型参数 = SARIMAParams(p=2, d=1, q=1, trend='ct')
# 模型 = SARIMAModel(data=数据子集.reset_index()[['年月', '销售金额']], params=模型参数)
# 模型.fit()
# 预测 = 模型.predict(steps=6)
# 数据子集['Kats_SARIMA预测值'] = 预测['fcst'].rolling(window=7).sum().shift(-6).values[0]
# # SVM
# 模型_svm = SVR()
# 模型_svm.fit(数据子集[['年月']].values, 数据子集['销售金额'].values)
# 预测_svm = 模型_svm.predict(np.array([[数据子集.index[-1] pd.DateOffset(months=1)]]))
# 数据子集['SVM预测值'] = 预测_svm
# # 贝叶斯结构时间序列模型
# 模型 = dlm(trend.LocalLinear(data=数据子集['销售金额'].values),
# seasonality.Fourier(period=12, harmonics=2, data=数据子集['销售金额'].values))
# 模型.fit()
# 预测 = 模型.predict(n_ahead=1)
# 数据子集['贝叶斯结构时间序列预测值'] = 预测[0]
预测数据 = pd.DataFrame({
'年月': [数据子集.index[-1] pd.DateOffset(months=1)],
'SARIMA预测销售金额': 预测_sarima.values,
'Prophet预测销售金额': [预测数据_prophet['yhat']],
'ARIMA预测销售金额': 预测_arima,
'ExponentialSmoothing方法1预测销售金额': 预测_es1.values,
'ExponentialSmoothing方法2预测销售金额': 预测_es2,
# 'TBATS预测销售金额': 预测_tbats[0]
# 'Kats_SARIMA预测销售金额': 数据子集['Kats_SARIMA预测值'],
# 'SVM预测销售金额': 数据子集['SVM预测值'],
# '贝叶斯结构时间序列预测销售金额': 数据子集['贝叶斯结构时间序列预测值'],
})
所有预测 = 所有预测.append(预测数据)
所有预测.to_excel('预测销售数据.xlsx', index=False)
11、可以运行
代码语言:javascript复制# -*- coding: utf-8 -*-
"""
Created on Wed May 31 15:57:00 2023
@author: Administrator
"""
import pandas as pd
from statsmodels.tsa.statespace.sarimax import SARIMAX
from prophet import Prophet
from pmdarima import auto_arima
from statsmodels.tsa.holtwinters import ExponentialSmoothing as ES1
from statsmodels.tsa.api import ExponentialSmoothing as ES2
import numpy as np
from sklearn.svm import SVR
# from pydlm import dlm, trend, seasonality
# 读取数据并处理时间
销售数据 = pd.read_excel('销售数据.xlsx')
销售数据['年月'] = pd.to_datetime(销售数据['年月'])
销售数据.set_index('年月', inplace=True)
所有预测 = pd.DataFrame()
for i in range(48, len(销售数据)):
数据子集 = 销售数据.iloc[:i 1].copy()
# SARIMA
SARIMA模型 = SARIMAX(数据子集['销售金额'], order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))
SARIMA模型拟合 = SARIMA模型.fit(disp=False)
SARIMA预测 = SARIMA模型拟合.predict(start=len(数据子集), end=len(数据子集))
# Prophet
数据_Prophet = 数据子集.reset_index().rename(columns={'年月': 'ds', '销售金额': 'y'})
Prophet模型 = Prophet()
Prophet模型.fit(数据_Prophet)
未来 = Prophet模型.make_future_dataframe(periods=1, freq='MS')
Prophet预测 = Prophet模型.predict(未来)
Prophet预测数据 = Prophet预测[['ds', 'yhat']].iloc[-1]
# ARIMA
ARIMA模型 = auto_arima(数据子集['销售金额'], seasonal=True, m=12)
ARIMA预测 = ARIMA模型.predict(n_periods=1)
# ExponentialSmoothing方法1
ES1模型 = ES1(数据子集['销售金额'], trend='add', seasonal='add', seasonal_periods=12)
ES1模型拟合 = ES1模型.fit()
ES1预测 = ES1模型拟合.predict(start=len(数据子集), end=len(数据子集))
# ExponentialSmoothing方法2
ES2模型 = ES2(数据子集['销售金额'], trend='add', seasonal='add', seasonal_periods=12)
ES2模型拟合 = ES2模型.fit()
ES2预测 = ES2模型拟合.forecast(steps=1)
# SVM
SVM模型 = SVR()
时间序列 = np.arange(len(数据子集)).reshape(-1, 1)
SVM模型.fit(时间序列, 数据子集['销售金额'].values)
SVM预测 = SVM模型.predict(np.array([[len(数据子集)]]))
预测数据 = pd.DataFrame({
'年月': [数据子集.index[-1] pd.DateOffset(months=1)],
'SARIMA预测销售金额': SARIMA预测.values,
'Prophet预测销售金额': [Prophet预测数据['yhat']],
'ARIMA预测销售金额': ARIMA预测,
'ExponentialSmoothing方法1预测销售金额': ES1预测.values,
'ExponentialSmoothing方法2预测销售金额': ES2预测,
'SVM预测销售金额': SVM预测,
})
所有预测 = 所有预测.append(预测数据)
所有预测.to_excel('预测销售数据.xlsx', index=False)
12、
代码语言:javascript复制# -*- coding: utf-8 -*-
"""
Created on Wed May 31 15:57:00 2023
@author: Administrator
"""
import pandas as pd
from statsmodels.tsa.statespace.sarimax import SARIMAX
from prophet import Prophet
from pmdarima import auto_arima
from statsmodels.tsa.holtwinters import ExponentialSmoothing as ES1
from statsmodels.tsa.api import ExponentialSmoothing as ES2
import numpy as np
from sklearn.svm import SVR
# from pydlm import dlm, trend, seasonality
# 读取数据并处理时间
销售数据 = pd.read_excel('销售数据.xlsx')
销售数据['年月'] = pd.to_datetime(销售数据['年月'])
销售数据.set_index('年月', inplace=True)
所有预测 = pd.DataFrame()
for i in range(48, len(销售数据)):
数据子集 = 销售数据.iloc[:i 1].copy()
# SARIMA
SARIMA模型 = SARIMAX(数据子集['销售金额'], order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))
SARIMA模型拟合 = SARIMA模型.fit(disp=False)
SARIMA预测 = SARIMA模型拟合.predict(start=len(数据子集), end=len(数据子集))
# Prophet
数据_Prophet = 数据子集.reset_index().rename(columns={'年月': 'ds', '销售金额': 'y'})
Prophet模型 = Prophet()
Prophet模型.fit(数据_Prophet)
未来 = Prophet模型.make_future_dataframe(periods=1, freq='MS')
Prophet预测 = Prophet模型.predict(未来)
Prophet预测数据 = Prophet预测[['ds', 'yhat']].iloc[-1]
# ARIMA
ARIMA模型 = auto_arima(数据子集['销售金额'], seasonal=True, m=12)
ARIMA预测 = ARIMA模型.predict(n_periods=1)
# ExponentialSmoothing方法1
ES1模型 = ES1(数据子集['销售金额'], trend='add', seasonal='add', seasonal_periods=12)
ES1模型拟合 = ES1模型.fit()
ES1预测 = ES1模型拟合.predict(start=len(数据子集), end=len(数据子集))
# ExponentialSmoothing方法2
ES2模型 = ES2(数据子集['销售金额'], trend='add', seasonal='add', seasonal_periods=12)
ES2模型拟合 = ES2模型.fit()
ES2预测 = ES2模型拟合.forecast(steps=1)
# SVM
SVM模型 = SVR()
时间序列 = np.arange(len(数据子集)).reshape(-1, 1)
SVM模型.fit(时间序列, 数据子集['销售金额'].values)
SVM预测 = SVM模型.predict(np.array([[len(数据子集)]]))
# 移动平均预测
数据子集['移动平均'] = 数据子集['销售金额'].rolling(window=36).mean()
预测_移动平均 = [数据子集['移动平均'].iloc[-1]] # 使用最后一个移动平均值作为预测值
预测数据 = pd.DataFrame({
'年月': [数据子集.index[-1] pd.DateOffset(months=1)],
'SARIMA预测销售金额': SARIMA预测.values,
'Prophet预测销售金额': [Prophet预测数据['yhat']],
'ARIMA预测销售金额': ARIMA预测,
'ExponentialSmoothing方法1预测销售金额': ES1预测.values,
'ExponentialSmoothing方法2预测销售金额': ES2预测,
'SVM预测销售金额': SVM预测,
'移动平均预测销售金额': 预测_移动平均
})
所有预测 = 所有预测.append(预测数据)
所有预测.to_excel('预测销售数据.xlsx', index=False)