指数平滑代码

指数平滑介绍

指数平滑是一种常用的时间序列预测方法。它通过对历史数据进行平滑处理,来预测未来的趋势。指数平滑方法主要适用于具有较弱季节性和趋势的时间序列数据。

指数平滑可以分为一次指数平滑、二次指数平滑和三次指数平滑。每种方法都有不同的平滑因子,可以根据实际情况选择最合适的平滑因子来进行预测。

一般情况下,指数平滑的步骤如下:

  1. 选择适合的指数平滑方法:根据时间序列数据的特点,选择一次、二次或三次指数平滑方法。
  2. 初始化平滑参数:为指数平滑方法选择适当的平滑因子(如 α、β、γ)。
  3. 进行平滑:使用选定的指数平滑方法和初始化的平滑参数,对历史数据进行平滑处理,得到平滑后的值。
  4. 进行预测:根据平滑后的值和趋势,预测未来的时间序列数据。
  5. 不断更新参数:随着时间的推移,不断更新平滑参数,以保持预测的准确性。

需要注意的是,指数平滑方法适用于较为平稳的时间序列数据,对于具有强季节性、趋势复杂或异常值较多的时间序列数据,可能需要使用其他更复杂的预测方法。

总体而言,指数平滑是一种简单但有效的时间序列预测方法,特别适用于对未来短期趋势的预测。在实际应用中,预测的准确性也会受到数据质量和选择的平滑因子等因素的影响,因此需要结合实际情况进行调整和优化。

原理介绍参考:指数平滑原理介绍

指数平滑代码

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from statsmodels.tsa.api import SimpleExpSmoothing
from statsmodels.tsa.api import Holt
from statsmodels.tsa.api import ExponentialSmoothing
from time import time

df = pd.read_excel("data/Energy_consumption2.xlsx")
data = df[["原始序列"]]
date_index = pd.date_range("20230718", periods=72, freq="H")
data["ds"] = date_index
data = data.rename(columns={"原始序列": "y"})

# 原序列可视化
data.plot(x="ds", y="y", style="b-o", figsize=(14, 7))
plt.grid()
plt.title("Time series")
# plt.savefig("./output/energy_data2", dpi=300)
plt.show()

np.random.seed(1234)
data = data.set_index("ds")
train_data = data["y"][:-16]
test_data = data["y"][-16:]
start_time = time()
# 建模拟合
# 一次指数平滑
model1 = SimpleExpSmoothing(train_data)
model1_fit = model1.fit(smoothing_level=0.2)
predict_data1 = model1_fit.forecast(16)
fitted_data1 = model1_fit.fittedvalues
# 二次指数平滑
model2 = Holt(train_data)
model2_fit = model2.fit(smoothing_level=0.2, smoothing_slope=0.1)
predict_data2 = model2_fit.forecast(16)
fitted_data2 = model2_fit.fittedvalues
# 三次指数平滑
model3 = ExponentialSmoothing(train_data, trend="add", seasonal="add", seasonal_periods=24)
model3_fit = model3.fit(smoothing_level=0.2, smoothing_slope=0.1, smoothing_seasonal=0.3)
predict_data3 = model3_fit.forecast(16)
fitted_data3 = model3_fit.fittedvalues
end_time = time()
execution_time = end_time - start_time
print("一共耗时:", execution_time)


def show_predict_result(train_data, test_data, fitted_data, predict_data, tilte):
    # 可视化预测结果
    pd.DataFrame({
        "data_train": train_data,
        "fitted_data": pd.Series(fitted_data, index=train_data.index),
        "data_test": test_data,
        "predict_data": pd.Series(predict_data, index=test_data.index)
    }).plot(legend=True, figsize=(10, 6))
    # plt.fill_between(test_data.index, pd.Series(interval_data[:,0]), pd.Series(interval_data[:,1]), color='b', alpha=.2,
    #                  label="98%Confidence interval")
    plt.legend()
    plt.tick_params()
    plt.xticks()
    plt.yticks()
    plt.title(tilte)
    # plt.savefig("./output/arima_energy2.png")
    plt.show()


show_predict_result(train_data, test_data, fitted_data1, predict_data1, tilte="SimpleExpSmoothing")
show_predict_result(train_data, test_data, fitted_data2, predict_data2, tilte="Holt")
show_predict_result(train_data, test_data, fitted_data3, predict_data3, tilte="ExponentialSmoothing")

导包方式

# from statsmodels.tsa.api import SimpleExpSmoothing
# from statsmodels.tsa.api import Holt
# from statsmodels.tsa.api import ExponentialSmoothing

from statsmodels.tsa.holtwinters import SimpleExpSmoothing
from statsmodels.tsa.holtwinters import Holt
from statsmodels.tsa.holtwinters import ExponentialSmoothing

两种导入方式的区别主要在于导入的路径和代码的简洁程度,从功能上说它们是等效的,都可以用于实现三次指数平滑方法。以下两种方式是等价的:

拟合参数介绍

在 statsmodels 中,一次指数平滑、二次指数平滑和三次指数平滑的 fit 方法中的参数有所不同。这些参数用于拟合指数平滑模型,并根据给定的数据来估计平滑因子和其他参数。

一次指数平滑 - SimpleExpSmoothing:

  • smoothing_level: 平滑因子(alpha),用于平滑观测值。取值范围为 0 到 1
    之间,较大的值表示更快适应新数据,较小的值表示更稳定。
  • optimized: 是否在拟合过程中优化平滑因子的值。默认为 True,表示使用最小二乘法估计最优平滑因子。

二次指数平滑 - Holt:

  • smoothing_level: 平滑因子(alpha),用于平滑观测值。取值范围为 0 到 1
    之间,较大的值表示更快适应新数据,较小的值表示更稳定。

  • smoothing_slope: 平滑因子(beta),用于平滑趋势。取值范围为 0 到 1
    之间,较大的值表示更快适应新数据,较小的值表示更稳定。

  • optimized: 是否在拟合过程中优化平滑因子的值。默认为 True,表示使用最小二乘法估计最优平滑因子。

三次指数平滑 - ExponentialSmoothing:

  • smoothing_level: 平滑因子(alpha),用于平滑观测值。取值范围为 0 到 1
    之间,较大的值表示更快适应新数据,较小的值表示更稳定。

  • smoothing_slope: 平滑因子(beta),用于平滑趋势。取值范围为 0 到 1
    之间,较大的值表示更快适应新数据,较小的值表示更稳定。

  • smoothing_seasonal: 平滑因子(gamma),用于平滑季节性。取值范围为 0 到 1
    之间,较大的值表示更快适应新数据,较小的值表示更稳定。

  • optimized: 是否在拟合过程中优化平滑因子的值。默认为 True,表示使用最小二乘法估计最优平滑因子。

在这些方法中,fit 方法用于拟合指数平滑模型,并返回一个拟合后的模型对象。在拟合过程中,可以通过设置不同的平滑因子和其他参数来控制模型的拟合效果。默认情况下,fit 方法会使用最小二乘法估计最优平滑因子,但也可以通过设置 optimized=False 来固定平滑因子的值。

值得注意的是,在使用 fit 方法拟合模型之后,可以通过拟合后的模型对象获取平滑因子和其他参数的估计值,从而进行预测和分析。例如,在三次指数平滑中,可以使用 fitted_model.params 获取拟合后的参数估计值。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

现实、狠残酷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值