文档章节

用Python玩转时序数据

阿里云官方博客
 阿里云官方博客
发布于 01/08 11:47
字数 2948
阅读 8
收藏 0

摘要: 本文简要介绍了如何从零开始使用Python中的时间序列。这包括对时间序列的简单定义,以及对利用pandas访问伦敦市居民智能电表所获取数据的处理。

 

40bcc382257664321cfa7ba1566b3d48cf8bfef2

时间序列是日常生活中最常见的数据类型之一。股票价格、销售信息、气候数据、能源使用,甚至个人身高体重都是可以用来定期收集的数据样本。几乎每个数据科学家在工作中都会遇到时间序列,能够有效地处理这些数据是数据科学领域之中的一项非常重要的技能。

本文简要介绍了如何从零开始使用Python中的时间序列。这包括对时间序列的简单定义,以及对利用pandas访问伦敦市居民智能电表所获取数据的处理。可以点击此处获取本文中所使用的数据。还提供了一些我认为有用的代码。

让我们从基础开始,时间序列的定义是这样的:

时间序列是按时间的顺序进行索引、排列或者绘制的数据点的集合。最常见的定义是,一个时间序列是在连续的相同间隔的时间点上取得的序列,因此它是一个离散时间数据的序列。

时间序列数据是围绕相对确定的时间戳而组织的。因此,与随机样本相比,可能包含我们将要尝试提取的一些相关信息。

加载和控制时间序列

数据集

让我们使用一些关于能源消耗计费的数据作为例子,以kWh(每半小时)为单位, 在2011年11月至2014年2月期间,对参与英国电力网络领导的低碳伦敦项目的伦敦居民样本数据进行分析。我们可以从绘制一些图表开始,最好了解一下样本的结构和范围,这也将允许我们寻找最终需要纠正的缺失值。

bb1c04add122e45a3b52b834f34f8ffdcc1e8052

对于本文的其余部分,我们只关注DateTime和kWh两列。

952a95644124bb2b4d064fc03a59395acf41ece3

重采样

让我们从较简单的重采样技术开始。重采样涉及到更改时间序列观测的频率。特征工程可能是你对重新采样时间序列数据感兴趣的一个原因。实际上,它可以用来为监督学习模型提供额外的架构或者是对学习问题的领会角度。pandas中的重采样方法与GroupBy方法相似,因为你基本上是按照特定时间间隔进行分组的。然后指定一种方法来重新采样。让我们通过一些例子来把重采样技术描述的更具体些。我们从每周的总结开始:

·data.resample()方法将用于对DataFrame的kWh列数据重新取样;

·“W”表示我们要按每周重新取样;

·sum()方法用于表示在此时间段计算kWh列的总和;

4c51afdaa525a8fc1fe33bbf80454c1811ce41c2

我们可以对每日的数据也这么做处理,并且可以使用groupby和mean函数进行按小时处理:

d504e3f9503b54b2d179c5b66f035de15a19e984

9ea1358c3d54f7d50b8fd2efd3a7758e3377b129

为了进一步进行重新采样,pandas有许多内置的选项,你甚至还可以定义自己的方法。下面两个表分别显示了时间周期选项及其缩写别名和一些可能用于重采样的常用方法。

258e4aeef3151c660c502d2e47066230c0767dab

cc4be2da049920864807e783dd44d6aafc6018b4

 

其它探索

这里还有一些你可以用于处理数据而进行的其它探索:

cbfdda2adfe36dc78ead94c2caa355caaaa93fb9

d41974da0be58f43d8c10c5a5a971d43d962db49

393d0a708408e577b8be92607d73f3bd728cf40f

243e4831dd1c12975244c4f3c83edc2671953c59

06673e07eda261555e44ea02adc99578ea867520

Prophet建模

1e281616097ae3177c900b05805cbd4627ec5c7c

Facebook Prophet于2017年发布的,可用于Python,而R.Prophet是设计用于分析在不同时间间隔上显示模式的日观测时间序列。Prophet对于数据丢失情况和趋势的变化具有很强的鲁棒性,并且通常能够很好地处理异常值。它还具有高级的功能,可以模拟假日在时间序列上产生的影响并执行自定义的变更点,但我将坚持使用基本规则来启动和运行模型。我认为Prophet可能是生产快速预测结果的一个好的选择,因为它有直观的参数,并且可以由有良好领域知识背景的但缺乏预测模型的技术技能的人来进行调整。有关Prophet的更多信息,大家可以点击这里查阅官方文档。

在使用Prophet之前,我们将数据里的列重新命名为正确的格式。Date列必须称为“ds”和要预测值的列为“y”。我们在下面的示例中使用了每日汇总的数据。

7db062ecc598b4e732b8488bbd0cf53e44763b90

然后我们导入Prophet,创建一个模型并与数据相匹配。在Prophet中,changepoint_prior_scale参数用于控制趋势对变化的敏感度,越高的值会更敏感,越低的值则敏感度越低。在试验了一系列值之后,我将这个参数设置为0.10,而不是默认值0.05。

bfafd1ade6a1b39a476224373a6557e53b76547e

为了进行预测,我们需要创建一个称为未来数据框(future dataframe)的东西。我们需要指定要预测的未来时间段的数量(在我们的例子中是两个月)和预测频率(每天)。然后我们用之前创建的Prophet模型和未来数据框进行预测。

274593475d6cca002aadde617101d54e89fa9894

非常简单!未来数据框包含了未来两个月内的预估居民使用电量。我们可以用一个图表来进行可视化预测展示:

179467d15b6ef0147094af11c3a2674ff34e9c9a

图中的黑点代表了实际值,蓝线则代表了预测值,而浅蓝色阴影区域代表不确定性。

如下图所示,不确定性区域随着我们在之后的进一步变化而扩大,因为初始的不确定性随着时间的推移而扩散和增多。

38eb6e48000e3ba52559500d527c9d36ea2a2188

Prophet还可以允许我们轻松地对整体趋势和组件模式进行可视化展示:

35ab60fd45aa64655455b76202c6fd0abc90c731

每年的模式很有趣,因为它看起来表明了居民的电量使用在秋季和冬季会增加,而在春季和夏季则会减少。直观地说,这正是我们期望要看到的。从每周的趋势来看,周日的使用量似乎比一周中其它时间都要多。最后,总体的趋势表明,使用量增长了一年,然后才缓慢地下降。需要进行进一步的调查来解释这一趋势。在下一篇文章中,我们将尝试找出是否与天气有关。

LSTMLong Short-Term Memory,长短期记忆网络)预测

LSTM循环神经网络具有学习长序列观测值的前景。博客文章《了解LSTM网络》,在以一种易于理解的方式来解释底层复杂性方面做的非常出色。以下是一个描述LSTM内部单元体系结构的示意图:

8482146bc0f0c7f1e8570a6626405e0cf827a97e

来源:Understanding LSTM Networks

LSTM似乎非常适合于对时间序列的预测。让我们再次使用一下每日汇总的数据。

ad31a42683a11d4bc66fb581612674586bedeaba

LSTM对输入数据的大小很敏感,特别是当使用Sigmoid或Tanh这两个激活函数的时候。通常,将数据重新调整到[0,1]或[-1,1]这个范围是一个不错的实践,也称为规范化。我们可以使用scikit-learn库中的MinMaxScaler预处理类来轻松地规范化数据集。

def43ca17d6fc236ab4e8c40fd021a1bcf26cb7a

现在我们可以将已排好序的数据集拆分为训练数据集和测试数据集。下面的代码计算出了分割点的索引,并将数据拆分为多个训练数据集,其中80%的观测值可用于训练模型,剩下的20%用于测试模型。

af820a4470ddc067430e76f89f48bdfb9aded5f4

我们可以定义一个函数来创建一个新的数据集,并使用这个函数来准备用于建模的训练数据集和测试数据集。

a752beb32c119c587e3d66955712ea627529b541

LSTM网络要求输入的数据以如下的形式提供特定的数组结构:[样本、时间间隔、特征]。

数据目前都规范成了[样本,特征]的形式,我们正在为每个样本设计两个时间间隔。可以将准备好的分别用于训练和测试的输入数据转换为所期望的结构,如下所示:

5c726255191ca4045404b38d7ac9f3c6ab385fac

就是这样,现在已经准备好为示例设计和设置LSTM网络了。

626b2a47702f486fc0094e24e01ff03a992dc627

从下面的损失图可以看出,该模型在训练数据集和测试数据集上都具有可比较的表现。

741adcd1f0f28745ac2b00e7b4c47f3c6e3c8451

在下图中,我们看到LSTM在拟合测试数据集方面做得非常好。

c59950101ccd3c25c09c6bbd075563124ffcbd00

聚类(Clustering

最后,我们还可以使用示例的数据进行聚类。执行聚类有很多不同的方式,但一种方式是按结构层次来形成聚类。你可以通过两种方式形成一个层次结构:从顶部开始来拆分,或从底部开始来合并。我决定先看看后者。

让我们从数据开始,只需简单地导入原始数据,并为某年中的某日和某日中的某一小时添加两列。

bf4bb310722fc4cf288cf714a449eadea3155338

db87f82b37a85007e9441a36870a5030f565a19e

LinkageDendrograms

linkage函数根据对象的相似性,将距离信息和对象对分组放入聚类中。这些新形成的聚类随后相互连接,以创建更大的聚类。这个过程将会进行迭代,直到在原始数据集中的所有对象在层次树中都连接在了一起。

对数据进行聚类:

cd609fb4652654ad28626da872f1be0cd94b642a

完成了!!!这难道不是很简单吗?

当然很简单了,但是上面代码中的“ward”在那里意味着什么呢?这实际上是如何执行的?正如scipy linkage文档上告诉我们的那样,“ward”是可以用来计算新形成的聚类之间距离的一个方法。关键字“ward”让linkage函数使用Ward方差最小化算法。其它常见的linkage方法,如single、complete、average,还有不同的距离度量标准,如euclidean、manhattan、hamming、cosine,如果你想玩玩的话也可以使用一下。

现在让我们来看看这个称为dendogram的分层聚类图。dendogram图是聚类的层次图,其中那些条形的长度表示到下一个聚类中心的距离。

3b9b73ddb1c12f8945ceb172f991a084920a568c

如果这是你第一次看到dendrogram图,那看起来挺复杂的,但是别担心,让我们把它分解来看:

·在x轴上可以看到一些标签,如果你没有指定任何其它内容,那么这些标签就是X上样本的索引;

·在y轴上,你可以看到那些距离长度(在我们的例子中是ward方法);

·水平线是聚类的合并;

·那些垂线告诉你哪些聚类或者标签是合并的一部分,从而形成了新的聚类;

·水平线的高度是用来表示需要被“桥接”以形成新聚类的距离;

即使有解释说明,之前的dendogram图看起来仍然不明显。我们可以减少一点,以便能更好地查看数据。

a35346026ce4729dd77720373c276804e585a86e

建议查找聚类文档以便能了解更多内容,并尝试使用不同的参数。

原文链接

© 著作权归作者所有

共有 人打赏支持
阿里云官方博客
粉丝 157
博文 983
码字总数 2307296
作品 0
杭州
程序员
私信 提问
实战 Python 网络爬虫:美团美食商家信息和用户评论

实战 Python 网络爬虫 美团美食商家信息和用户评论 作者简介: Hyx,多年系统研发经验,主要从事机器人流程系统研发、大数据系统研发、网络爬虫研发以及自动化运维系统开发。 擅长使用 Pyth...

GitChat技术杂谈
2018/11/15
0
0
2019年推荐几个你看了就会关注的公众号

大V推荐 作为一个可怜弱小又无助的小萌新,求知若渴却找不到良好的渠道去学习,只能看着教科书苦哈哈的抓瞎学习? 不用担心,这里为大家带来如下几个Python和知乎的大佬们!迷茫的萌新们快扫...

JAVA高级架构v
02/28
0
0
利用python函数的输入、输出定义与时序图相结合,让生活更有趣

写在前面 1. 重点是思路交流,利用python函数的输入、输出定义与时序图相结合,让流程更加的简洁、清晰。该方法不局限于工作,同样适用于学习笔记、恋爱心得...等等只要存在个体交互的活动。...

python达人
2018/05/08
0
0
用Python写一份独特的元宵节祝福

今天是正月十五,首先祝大家元宵节快乐! 以前加过我个人VX号的朋友,可以在朋友圈看到我今天发的元宵节祝福图片: 这个祝福文字乍一看其貌不扬,不过点开大图有惊喜:是拿自己VX好友的头像拼...

crossin
02/19
0
0
高手问答第 202 期 —— 想要玩转 Python?不妨从 Python 网络爬虫开始

OSCHINA 本期高手问答(2018 年 6 月 20 日 — 6 月 26 日)我们邀请到了黄永祥@XyHJw 和大家一起讨论关于 Python 爬虫的问题。 黄永祥,信息管理与信息系统专业学士,曾从事过系统开发和自动化...

局长
2018/06/19
5.5K
44

没有更多内容

加载失败,请刷新页面

加载更多

关于360插件化Replugin Activity动态修改父类的字节码操作

近期在接入360插件化方案Replugin时,发现出现崩溃情况。 大概崩溃内容如下: aused by: java.lang.ClassNotFoundException: Didn't find class "x.x.x.xActivity" on path: 我自己在插件代码......

Gemini-Lin
28分钟前
0
0
mybatis缓存的装饰器模式

一般在开发生产中,对于新需求的实现,我们一般会有两种方式来处理,一种是直接修改已有组件的代码,另一种是使用继承方式。第一种显然会破坏已有组件的稳定性。第二种,会导致大量子类的出现...

算法之名
昨天
15
0
单元测试

右键方法 Go To --> Test,简便快速生成测试方法。 相关注解 @RunWith(SpringRunner.class) 表示要在测试环境中跑,底层实现是 jUnit测试工具。 @SpringBootTest 表示启动整个 Spring工程 @A...

imbiao
昨天
4
0
欧拉公式

欧拉公式表达式 欧拉公式的几何意 cosθ + j sinθ 是个复数,实数部分也就是实部为 cosθ ,虚数部分也就是虚部为 j sinθ ,对应复平面单位圆上的一个点。 根据欧拉公式和这个点可以用 复指...

sharelocked
昨天
5
0
burpsuite无法抓取https数据包

1.将浏览器和burpsuite的代理都设置好 2.在浏览器地址栏输入: http://burp 3.下载下面的证书,并将证书导入浏览器 cacert.der

Frost729
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部