前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GPT4做数据分析时间序列预测之六相当棒2023.5.31

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

作者头像
用户7138673
发布2023-08-16 21:19:30
2800
发布2023-08-16 21:19:30
举报
文章被收录于专栏:大大的小数据

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:\Users\Administrator\anaconda3\lib\site-packages\statsmodels\tsa\vector_ar\var_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 ~\Desktop\GPT4预测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)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-05-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大大的小数据 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档