数据导入与预处理-拓展-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


相关文章
|
10天前
|
数据采集 存储 数据挖掘
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第27天】在数据分析领域,Python的Pandas库因其强大的数据处理能力而备受青睐。本文介绍了Pandas在数据导入、清洗、转换、聚合、时间序列分析和数据合并等方面的高效技巧,帮助数据分析师快速处理复杂数据集,提高工作效率。
33 0
|
2月前
|
数据采集 数据可视化 数据挖掘
Pandas函数大合集:数据处理神器一网打尽!
Pandas函数大合集:数据处理神器一网打尽!
34 0
|
2月前
|
机器学习/深度学习 数据处理 Python
从NumPy到Pandas:轻松转换Python数值库与数据处理利器
从NumPy到Pandas:轻松转换Python数值库与数据处理利器
73 0
|
11天前
|
存储 数据挖掘 数据处理
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第26天】Python 是数据分析领域的热门语言,Pandas 库以其高效的数据处理功能成为数据科学家的利器。本文介绍 Pandas 在数据读取、筛选、分组、转换和合并等方面的高效技巧,并通过示例代码展示其实际应用。
24 1
|
1月前
|
并行计算 大数据 数据处理
亿级数据处理,Pandas的高效策略
在大数据时代,数据量的爆炸性增长对处理技术提出更高要求。本文介绍如何利用Python的Pandas库及其配套工具高效处理亿级数据集,包括:采用Dask进行并行计算,分块读取以减少内存占用,利用数据库进行复杂查询,使用内存映射优化Pandas性能,以及借助PySpark实现分布式数据处理。通过这些方法,亿级数据处理变得简单高效,助力我们更好地挖掘数据价值。
45 1
|
1月前
|
机器学习/深度学习 并行计算 大数据
【Python篇】深入挖掘 Pandas:机器学习数据处理的高级技巧
【Python篇】深入挖掘 Pandas:机器学习数据处理的高级技巧
77 3
|
2月前
|
数据采集 数据挖掘 数据处理
Pandas实践:南京地铁数据处理分析
Pandas实践:南京地铁数据处理分析
32 2
|
3月前
|
数据采集 数据挖掘 数据处理
解锁Python数据分析新技能!Pandas实战学习,让你的数据处理能力瞬间飙升!
【8月更文挑战第22天】Python中的Pandas库简化了数据分析工作。本文通过分析一个金融公司的投资数据文件“investment_data.csv”,介绍了Pandas的基础及高级功能。首先读取并检查数据,包括显示前几行、列名、形状和数据类型。随后进行数据清洗,移除缺失值与重复项。接着转换日期格式,并计算投资收益。最后通过分组计算平均投资回报率,展示了Pandas在数据处理与分析中的强大能力。
44 0
|
4月前
|
机器学习/深度学习 数据采集 数据处理
重构数据处理流程:Pandas与NumPy高级特性在机器学习前的优化
【7月更文挑战第14天】在数据科学中,Pandas和NumPy是数据处理的关键,用于清洗、转换和计算。用`pip install pandas numpy`安装后,Pandas的`read_csv`读取数据,`fillna`处理缺失值,`drop`删除列。Pandas的`apply`、`groupby`和`merge`执行复杂转换。NumPy加速数值计算,如`square`进行向量化操作,`dot`做矩阵乘法。结合两者优化数据预处理,提升模型训练效率和效果。
59 1
|
4月前
|
数据采集 机器学习/深度学习 数据处理
从基础到卓越:Pandas与NumPy在复杂数据处理中的实战策略
【7月更文挑战第14天】Pandas与NumPy在数据科学中的核心应用:**加载数据(如`read_csv`)、探索(`head()`, `info()`, `describe()`)、数据清洗(`fillna`, `dropna`, `replace`, `apply`)、数值计算(借助NumPy的`ndarray`)、分组聚合(`groupby`与聚合函数)、窗口函数(如`rolling`)和数据筛选排序(布尔索引,`query`,`sort_values`)。通过这些工具,实现从数据预处理到复杂分析的高效处理。
57 0
下一篇
无影云桌面