数据导入与预处理-拓展-pandas时间数据处理03(下)

简介: 数据导入与预处理-拓展-pandas时间数据处理03Pandas时序数据系列博客1. 时间序列数据1. 1 时间序列概述

5. 方法4——简单指数平滑法

简单指数平滑法与加权移动平均法类似,但权重随着观测值从早期到晚期的变化呈指数级下降,最小的权重和最早的观测值相关

from statsmodels.tsa.api import ExponentialSmoothing, SimpleExpSmoothing, Holt
y_hat_avg = test.copy()
fit2 = SimpleExpSmoothing(np.asarray(train['Count'])).fit(smoothing_level=0.6,optimized=False)
y_hat_avg['SES'] = fit2.forecast(len(test))
plt.figure(figsize=(16,8))
plt.plot(train['Count'], label='Train')
plt.plot(test['Count'], label='Test')
plt.plot(y_hat_avg['SES'], label='SES')
plt.legend(loc='best')
plt.show()
y_hat_avg

输出为:




计算均方根误差

rms = sqrt(mean_squared_error(test.Count, y_hat_avg.SES))
rms

输出为:


6. 方法5——霍尔特线性趋势法

以上几种方法在波动性较大的数据集上表现不够友好,如果未来趋势是逐渐上涨的,我们需要考虑这种趋势。

每个时序数据集可以分解为相应的几个部分:趋势,季节性和残差。任何呈现某种趋势的数据集都可以用霍尔特线性趋势法用于预测。

import statsmodels.api as sm
sm.tsa.seasonal_decompose(train.Count).plot()
result = sm.tsa.stattools.adfuller(train.Count)
plt.show()
result

输出为:


我们从图中可以看出,该数据集呈上升趋势。因此我们可以用霍尔特线性趋势法预测未来价格。

该算法包含三个方程:一个水平方程,一个趋势方程,一个方程将二者相加以得到预测值 ŷ :

image.png


上述方程中,水平方程显示它是观测值和样本内单步预测值的加权平均数,趋势方程显示它是根据 e(t)−e(t−1) 和之前的预测趋势 b(t−1) 在时间t处的预测趋势的加权平均值。

我们将这两个方程相加,得出一个预测函数。我们也可以将两者相乘而不是相加得到一个乘法预测方程。当趋势呈线性增加和下降时,我们用相加得到的方程;当趋势呈指数级增加或下降时,我们用相乘得到的方程。实践操作显示,用相乘得到的方程,预测结果会更稳定,但用相加得到的方程,更容易理解。

y_hat_avg = test.copy()
fit1 = Holt(np.asarray(train['Count'])).fit(smoothing_level = 0.3,smoothing_trend = 0.1)
y_hat_avg['Holt_linear'] = fit1.forecast(len(test))
plt.figure(figsize=(16,8))
plt.plot(train['Count'], label='Train')
plt.plot(test['Count'], label='Test')
plt.plot(y_hat_avg['Holt_linear'], label='Holt_linear')
plt.legend(loc='best')
plt.show()
y_hat_avg

输出为:





均方根误差,检查模型的准确率:

rms = sqrt(mean_squared_error(test.Count, y_hat_avg.Holt_linear))
rms

输出为:

7. 方法6——Holt-Winters季节性预测模型

针对时间序列数据,如果数据实体具有季节性,那么该数据集就具有季节性。

前面讨论的5种模型在预测时并没有考虑到数据集的季节性,因此我们需要一种能考虑这种因素的方法。

应用到这种情况下的算法就叫做Holt-Winters季节性预测模型,它是一种三次指数平滑预测,其背后的理念就是除了水平和趋势外,还将指数平滑应用到季节分量上。

Holt-Winters季节性预测模型由预测函数和三次平滑函数——一个是水平函数ℓt,一个是趋势函数bt,一个是季节分量 st,以及平滑参数 α, β 和 γ。




水平函数为季节性调整的观测值和时间点t处非季节预测之间的加权平均值。趋势函数和霍尔特线性方法中的含义相同。季节函数为当前季节指数和去年同一季节的季节性指数之间的加权平均值。在本算法,我们同样可以用相加和相乘的方法。当季节性变化大致相同时,优先选择相加方法,而当季节变化的幅度与各时间段的水平成正比时,优先选择相乘的方法。

y_hat_avg = test.copy()
fit1 = ExponentialSmoothing(np.asarray(train['Count']) ,seasonal_periods=7 ,trend='add', seasonal='add',).fit()
y_hat_avg['Holt_Winter'] = fit1.forecast(len(test))
plt.figure(figsize=(16,8))
plt.plot( train['Count'], label='Train')
plt.plot(test['Count'], label='Test')
plt.plot(y_hat_avg['Holt_Winter'], label='Holt_Winter')
plt.legend(loc='best')
plt.show()
y_hat_avg

输出为:




均方根误差,看看模型的准确度

# 我们现在计算一下均方根误差,看看模型的准确度。
rms = sqrt(mean_squared_error(test.Count, y_hat_avg.Holt_Winter))
rms

输出为:


看到趋势和季节性的预测准确度都很高。我们选择了 seasonal_period = 7作为每周重复的数据。也可以调整其它其它参数,我在搭建这个模型的时候用的是默认参数。你可以试着调整参数来优化模型。

8. 方法7——自回归移动平均模型

参考:石晓文

另一个场景的时序模型是自回归移动平均模型(ARIMA)。指数平滑模型都是基于数据中的趋势和季节性的描述,而自回归移动平均模型的目标是描述数据中彼此之间的关系。ARIMA的一个优化版就是季节性ARIMA。它像Holt-Winters季节性预测模型一样,也把数据集的季节性考虑在内。


ARIMA算法模型主体包括三大部分:AR,I以及MA模型。其中,每一个模型部分都拥有一个相关的模型参数—ARIMA(p,d,q)。算法的基本原理是将非平稳时间序列转化为平稳时间序列,然后将因变量仅对它的滞后值以及随机误差项的现值和滞后值进行回归所建立的模型。


差分法平稳数据

train['Count_diff_1'] = train['Count'].diff(1)
train['Count_diff_2'] = train['Count_diff_1'].diff(1)
fig = plt.figure(figsize=(6,12))
ax1 = fig.add_subplot(311)
ax1.plot(train['Count'])
ax2 = fig.add_subplot(312)
ax2.plot(train['Count_diff_1'])
ax3 = fig.add_subplot(313)
ax3.plot(train['Count_diff_2'])
ax1.set_title("原始")
ax2.set_title("1阶")
ax3.set_title("2阶")
plt.show()
train['Count_diff_2']

输出为:



在ARIMA(p,d,q)整体模型中,AR是自回归模型,对应的模型参数p为自回归项数;I为差分模型,对应的模型参数d为使之成为平稳时间序列所做的差分次数(阶数);MA为滑动平均模型,q为滑动平均项数。在实际进行算法模型的构建时,可以根据ACF自相关系数图决定q的取值,PACF偏自相关系数图决定p的取值。

y_hat_avg = test.copy()
fit1 = sm.tsa.statespace.SARIMAX(train.Count, order=(2, 1, 4),seasonal_order=(0,1,1,7)).fit()
y_hat_avg['SARIMA'] = fit1.predict(start="2013-11-1", end="2013-12-31", dynamic=True)
plt.figure(figsize=(16,8))
plt.plot( train['Count'], label='Train')
plt.plot(test['Count'], label='Test')
plt.plot(y_hat_avg['SARIMA'], label='SARIMA')
plt.legend(loc='best')
plt.show()
y_hat_avg

输出为:




均方根误差

# 计算一下均方根误差,看看模型的准确度。
rms = sqrt(mean_squared_error(test.Count, y_hat_avg.SARIMA))
rms

输出为:



我们可以看到使用季节性 ARIMA 的效果个 Holt-Winters 一样好。我们根据 ACF 和 PACF 图选择参数。如果你为 ARIMA 模型选择参数时遇到了困难,可以用 R 语言中的 auto.arima。

最后,我们将这几种模型的准确度比较一下:

Model RMSE
朴素法 43.9
简单平均法 109.9
移动平均法 46.72
简单指数 43.35
霍尔特线性趋势 43.05
Holt-Winters季节预测 25.26
自回归移动平均ARIMA 26.05


相关文章
|
2月前
|
并行计算 数据处理 API
再见 Pandas,又一数据处理神器!
再见 Pandas,又一数据处理神器!
|
2月前
|
并行计算 数据处理 API
再见Pandas,又一数据处理神器!
再见Pandas,又一数据处理神器!
|
6天前
|
数据采集 数据挖掘 大数据
数据处理利器:使用Pandas进行数据清洗与转换
【4月更文挑战第12天】在大数据时代,Pandas是Python数据分析的关键工具,提供高效的数据清洗和转换功能。本文介绍了如何使用Pandas处理缺失值(删除或填充)、异常值(Z-Score法和IQR法)以及重复值(检测和删除)。此外,还涵盖了数据转换,包括数据类型转换、数据标准化(Min-Max和Z-Score)以及类别数据的one-hot编码。通过学习这些方法,可以为数据分析和挖掘奠定坚实基础。
|
2天前
|
数据处理 索引 Python
Pandas常见问题与解决方案:避开数据处理中的坑
【4月更文挑战第16天】本文总结了Pandas数据处理中的常见问题及解决方案:1) 数据类型不匹配,使用`astype`转换;2) 缺失值处理,用`dropna`删除或`fillna`填充;3) 内存占用过大,通过选择性加载列、指定`dtype`和使用`chunksize`分块处理;4) 合并数据问题,确保键匹配和正确合并方式;5) 排序和分组聚合错误,使用`sort_values`/`sort_index`和`groupby`配合聚合函数。掌握这些技巧可提高数据处理效率。
|
2天前
|
SQL 机器学习/深度学习 数据可视化
Pandas与其他库的集成:构建强大的数据处理生态
【4月更文挑战第16天】Pandas在数据处理中扮演关键角色,但与其他Python库如NumPy、Matplotlib/Seaborn、Scikit-learn和SQL的集成使其功能更加强大。结合NumPy进行数值计算,搭配Matplotlib/Seaborn实现高效可视化,与Scikit-learn联用加速机器学习,以及与SQL集成便于数据库操作,这些都构建了一个全面的数据处理生态系统,提升了数据科学家的工作效率,助力于数据价值的发掘。
|
1月前
|
数据采集 自然语言处理 数据可视化
使用Pandas库对淘宝原始数据进行数据处理和分词处理
使用Pandas库对淘宝原始数据进行数据处理和分词处理
26 0
|
1月前
|
数据采集 数据可视化 数据挖掘
Python爬虫之Pandas数据处理技术详解
Python爬虫之Pandas数据处理技术详解
|
1月前
|
数据处理 数据格式 Python
python进行数据处理——pandas的drop函数
python进行数据处理——pandas的drop函数
13 3
|
2月前
|
数据采集 数据挖掘 数据处理
Python中的数据处理利器 - Pandas库详解
Pandas是Python中一款强大的数据处理工具,提供了丰富的数据结构和函数,能够高效地进行数据清洗、转换和分析。本文将深入探讨Pandas库的核心功能和应用,帮助读者更好地理解和利用这一工具。
|
2月前
|
人工智能 程序员 数据处理
Pandas数据处理——通过value_counts提取某一列出现次数最高的元素
Pandas数据处理——通过value_counts提取某一列出现次数最高的元素
36 0