GPT4做数据分析时间序列预测之六相当棒2023.5.31

2023-08-16 21:19:30 浏览数 (1)

0、

预测的模型包括:

  1. SARIMA(季节性自回归积分移动平均模型)
  2. Prophet(Facebook开源的预测库)
  3. ARIMA(自回归积分移动平均模型)
  4. ExponentialSmoothing(指数平滑模型),使用两种不同的方法
  5. TBATS(基于BATS的时间序列预测工具箱)- 这部分代码被注释掉了,所以没有运行
  6. Kats SARIMA(由Facebook开源的Kats库提供的SARIMA模型)
  7. SVM(支持向量机)
  8. 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)

0 人点赞