专栏首页用 Python 进行时间序列数据可视化

抱歉,你查看的文章已删除

用 Python 进行时间序列数据可视化

用 Python 绘制时间序列数据的6种方法

时间序列本身就很自然地适合于可视化。

随时间推移的观测数据的线图可视化是很受欢迎,但还有一些其他类型的图像您可以用来了解关于您的问题的更多信息。

您越了解你的数据,就越有可能开发一个更好的预测模型。

在本教程中,您将了解6种不同类型的图像,您可以使用 Python 来以这些类型的图像可视化时间序列数据。

具体来说,完成本教程后,您将知道:

  • 如何用线图(line plots)、滞后图(lag plots)和自相关图(autocorrelation plots)来探索时间序列的时间结构。
  • 如何使用直方图(histograms)和密度图(density plots)来理解观测数据的分布。
  • 如何使用箱须图(box and whisker plots)以及热图(heat map plots)来梳理区间内分布的变化。

有遗漏您喜欢的时间序列数据可视化图像类型吗?

在评论中留言让我知道。

让我们开始吧。

时间序列可视化

可视化在时间序列分析和预测中起着重要的作用。

原始样本数据的可视化图可以提供有价值的诊断来识别可以影响模型选择的时间结构,如趋势、周期和季节性。

一个问题是,许多时间序列预测领域的新手都止步于线图。

在本教程中,我们将看看您可以在自己的时间序列数据上使用的6种不同类型的可视化方法。它们是:

  1. 线条图
  2. 直方图和密度图
  3. 箱须图
  4. 热图
  5. 滞后图或散点图
  6. 自相关图。

(本教程的)焦点在于单变量时间序列,但是于多变量时间序列,即每个时间步长上有多个观察值,这些技术也同样适用。

接下来,让我们来看看将在本教程中用于演示时间序列可视化的数据集。

最低日温数据集

这个数据集描述了澳大利亚墨尔本市十年(1981-1990)来的最低日温。

单位是摄氏度,有3650个观测值。数据的来源是澳大利亚气象局。

下载数据集并以 "daily-minimum-temperatures.csv" 为文件名将其放在当前工作目录中。

注意:下载的文件包含一些问号 '?' 字符,在使用数据集之前必须将其删除。在文本编辑器中打开文件并删除 '?' 字符。同时也删除该文件中的所有页脚信息。

下面是一个载入数据集为 Pandas(全称 Python for Data Analysis, 下同) 序列的示例。

from pandas import Series
from matplotlib import pyplot
series = Series.from_csv('daily-minimum-temperatures.csv', header=0)
print(series.head())

运行示例加载数据集并打印前5行。

Date
1981-01-01 20.7
1981-01-02 17.9
1981-01-03 18.8
1981-01-04 14.6
1981-01-05 15.8
Name: Temp, dtype: float64

1.时间序列线图

时间序列的首选也可能是最流行的可视化方法是线图。

在此图中,时间显示在x轴上,而观察值则沿着y轴的。

以下是将最低日温数据集的 Pandas 序列直观地可视化为线图的示例。

from pandas import Series
from matplotlib import pyplot
series = Series.from_csv('daily-minimum-temperatures.csv', header=0)
series.plot()
pyplot.show()

运行该示例将创建一个线图。

最低日温线图

该线图相当密集。

有时改变线条的风格会有所改善; 例如,使用虚线或点样式。

下面是将线条样式改为黑点而不是连线(参数:style='k.')的示例。

我们可以通过设置 style 为 'k–' 来改变这个例子为使用虚线。

from pandas import Series
from matplotlib import pyplot
series = Series.from_csv('daily-minimum-temperatures.csv', header=0)
series.plot(style='k.')
pyplot.show()

运行该示例将重新创建相同但使用点样式而非连接线的线图。

最低日温点图

比较相同时间间隔内的线图可能会有所帮助,例如从天到天,月到月和年到年。

最低日温数据集跨越了10年。我们可以将数据按年份分组,并为每个年份创建一个用于直接比较的线图。

下面的示例显示了如何做到这一点。首先观测值按年份分组(series.groupby(TimeGrouper('A')))。

随后枚举这些组,并将每年的观察值以列的形式存储在一个新的 DataFrame(数据框) 中。

最后,为构建的 DataFrame 创建一个图,DataFrame 的每列都被可视化为一个移除了图例以避免混乱的子图。

from pandas import Series
from pandas import DataFrame
from pandas import TimeGrouper
from matplotlib import pyplot
series = Series.from_csv('daily-minimum-temperatures.csv', header=0)
groups = series.groupby(TimeGrouper('A'))
years = DataFrame()
for name, group in groups:
    years[name.year] = group.values
years.plot(subplots=True, legend=False)
pyplot.show()

运行这个示例,创建了10个子线图,从顶上1981年开始每年一个,最底下一个是1990年,每个线图时长为365天。

最低日温年度线图

2.时间序列直方图和密度图

另一个重要的可视化是关于观察值本身的分布。

这意味着一个没有时间顺序仅观测值本身的图像。

一些线性时间序列预测方法假定观测值具有良好的分布(即钟形曲线或正态分布)。这可以使用统计假设检验等工具来明确地检查。但是,对于原始观测值和经任何类型的数据转换后的值,图像也能提供对其分布进行有用的初次检查。

下面的示例在最低日温数据集中创建观测值的直方图。直方图将值分组为各个直方,并且每个直方中的观测频率或曰计数可以提供对观测值的基本分布的深入了解。

from pandas import Series
from matplotlib import pyplot
series = Series.from_csv('daily-minimum-temperatures.csv', header=0)
series.hist()
pyplot.show()

运行该示例显示了一个看起来极像高斯(分布)的分布。绘图函数根据数据中值的散布自动选择直方尺寸的大小。

最低日温直方图

通过使用密度图,我们可以更好地了解观测值分布的形状。

除了一个用于拟合观测值分布的函数以及一条良好的、平滑的线用来表示该分布,密度图和直方图很相似。

以下是最低日温数据集的密度图示例。

from pandas import Series
from matplotlib import pyplot
series = Series.from_csv('daily-minimum-temperatures.csv', header=0)
series.plot(kind='kde')
pyplot.show()

运行该示例会创建一个提供观察值分布更为清晰的概貌的图像。我们可以看到该分布(可视为)是些许不对称,又些许尖利的高斯分布。

看到这样的分布可能提示后续探索可以用统计假设检验来正式检查分布是否是高斯分布,或者要数据预处理技术来重塑分布,如 Box-Cox 变换。

最低日温密度图

3.时间序列区间箱须图

直方图和密度图显示了所有观测值的分布情况,但我们可能对一定时间区间内值的分布感兴趣。

另一种有助于总结观察值分布的图像是箱须图。这种图绘制了一个框,围绕数据的第25百分位数(下四分位数)和第75百分位数(上四分位数)来框住中间50%的观测数据。在第50百分位(中位数)处绘制一条线,在盒子的上下绘制须线表示观察的总体范围。在须线或数据范围以外的异常值绘制为点。

可以创建箱须图,并按时间序列(如年,月,日)对每个时间区间进行比较。

如上面在绘图示例中所做的一样,以下是将最低日温数据集按年分组的示例。然后对每年的数据创建一个箱须图像,并排列在一起以直接比较。

from pandas import Series
from pandas import DataFrame
from pandas import TimeGrouper
from matplotlib import pyplot
series = Series.from_csv('daily-minimum-temperatures.csv', header=0)
groups = series.groupby(TimeGrouper('A'))
years = DataFrame()
for name, group in groups:
    years[name.year] = group.values
years.boxplot()
pyplot.show()

比较相同间隔的不同区间箱须图是很有用的。在区间内,它可以帮助发现异常值(须线上方或下方的点)。

在这种情况下,跨越时间间隔,我们可以寻找多年的趋势、季节性和其他可以用于建模的结构化信息。

最低日温年度箱须图

我们也可能对一年中在每个月内观测值的分布感兴趣。

下面的示例创建了,数据集中的最后一年,1990年中每月一个共12个箱须图形。

在这个例子中,首先只提取1990年的观测数据。

然后,观察值按月分组,每个月以列的形式添加到新的 DataFrame 中。

最后,在新构建的 DataFrame 中为每个月份(列)创建一个箱须图形。

from pandas import Series
from pandas import DataFrame
from pandas import TimeGrouper
from matplotlib import pyplot
from pandas import concat
series = Series.from_csv('daily-minimum-temperatures.csv', header=0)
one_year = series['1990']
groups = one_year.groupby(TimeGrouper('M'))
months = concat([DataFrame(x[1].values) for x in groups], axis=1)
months = DataFrame(months)
months.columns = range(1,13)
months.boxplot()
pyplot.show()

运行这个例子创建了12个箱须图形,显示了从一月份的南半球夏季到该年年中的南半球冬季,并再次回到夏季的一年中的最低气温分布的显著变化,。

最低日温月度箱须图

4.时间序列热图

数字矩阵可以绘制为矩阵中的每个单元的值都被分配一个唯一颜色的曲面。

这被称为热图,因为较大的值可以用暖色调(黄色和红色)绘制,而较小的值可以用冷色调(蓝色和绿色)绘制。

像箱须图一样,我们可以使用热图来比较不同区间内的观察值。

对于最低日温数据的情况下,可将观测值排列成年份列和日期行的矩阵,并且每个单元的值是每天的最低温度。然后可以绘制该矩阵的热图。

以下是创建最低日温数据的热图的示例。由于在 Pandas 中没有直接提供对热图的支持,需使用 matplotlib 库中的 matshow() 函数。

为了方便起见,矩阵是经旋转的(转置),以每行代表年,每列代表天。这提供了一个更直观的,从左到右的数据布局。

from pandas import Series
from pandas import DataFrame
from pandas import TimeGrouper
from matplotlib import pyplot
series = Series.from_csv('daily-minimum-temperatures.csv', header=0)
groups = series.groupby(TimeGrouper('A'))
years = DataFrame()
for name, group in groups:
    years[name.year] = group.values
years = years.T
pyplot.matshow(years, interpolation=None, aspect='auto')
pyplot.show()

这个图像显示了在这些年里每年中间日子里有更低的最低日温,而这些年的开始和结束时有较高的最低日温,以及之间所有的褪变和复杂性。

最低日温年度热图

正如上述箱须图的示例一样,我们也可以比较一年中的每个月。

下面是一个比较1990年的月度热图的示例。每列代表一个月,而行代表每月从1号到31号的日期。

from pandas import Series
from pandas import DataFrame
from pandas import TimeGrouper
from matplotlib import pyplot
from pandas import concat
series = Series.from_csv('daily-minimum-temperatures.csv', header=0)
one_year = series['1990']
groups = one_year.groupby(TimeGrouper('M'))
months = concat([DataFrame(x[1].values) for x in groups], axis=1)
months = DataFrame(months)
months.columns = range(1,13)
pyplot.matshow(months, interpolation=None, aspect='auto')
pyplot.show()

运行示例显示了我们已见过的每年的情况在月度的缩放水平上展现了相同的宏观趋势。

我们还可以在图像的底部看到一些白色的斑块。这是那些月份不到31天的缺失数据,比如1990年的二月份不同寻常的仅28天。

最低日温月度热图

5.时间序列滞后散点图

时间序列建模假定一个观测值与前面的观测值之间存在一定的关系。

在时间序列中的(相对于某观察值)前面的观测值被称为滞后值,在一个时间步长前的观测值称为滞后一期,在两个时间步长前的观测值为滞后二期,依此类推。

对探索每个观察值之间和其滞后值的关系极为有用的一个类型称为散点图。

Pandas 就正好有一个称为滞后图的内置函数。它绘制的x轴是t时刻的观测值和而y轴的是 (t-1) 时刻的观察值(滞后一期)(此处表述与下图有异,译者注)。

  • 如果这些点沿着从图的左下角到右上角的对角线聚集,则表示正相关。
  • 如果这些点沿着从左上角到右下角的对角线聚集,则表示负相关。
  • 以上任一关系都是好的,因为它们都可以被建模。

离对角线越紧密,表明关系越强,而从对角线上散开得越广表明关系越弱。

中间一个球状或分散在整个图中表明了一个微弱的关系或者不相关。

以下是最低日温数据集滞后图的示例。

from pandas import Series
from matplotlib import pyplot
from pandas.tools.plotting import lag_plot
series = Series.from_csv('daily-minimum-temperatures.csv', header=0)
lag_plot(series)
pyplot.show()

通过运行示例代码生成的图显示了观察值与其滞后值之间的相对较强的正相关性。

最低日温滞后图

我们可以在观察值和其任何滞后期数的滞后值上重复这个处理过程。或许是在上周,上个月或去年的同一时间观察值,或者我们可能希望探索的任何其他特定领域的知识。

例如,我们可以为观测值和前七天的每滞后值创建一个散点图。以下是最低日温数据集的相应示例。

首先,创建一个新的 DataFrame ,以其滞后值为新列,列经适当命名。然后绘制每个观察值与其不同的滞后值的新子图(作者将原观察值列命名为 t+1,这一点不太明白;另外原文有评论指出事实上 lag_plot() 函数可指定滞后期数,请参考,译者注)。

from pandas import Series
from pandas import DataFrame
from pandas import concat
from matplotlib import pyplot
from pandas.tools.plotting import scatter_matrix
series = Series.from_csv('daily-minimum-temperatures.csv', header=0)
values = DataFrame(series.values)
lags = 7
columns = [values]
for i in range(1,(lags + 1)):
    columns.append(values.shift(i))
dataframe = concat(columns, axis=1)
columns = ['t+1']
for i in range(1,(lags + 1)):
    columns.append('t-' + str(i))
dataframe.columns = columns
pyplot.figure(1)
for i in range(1,(lags + 1)):
    ax = pyplot.subplot(240 + i)
    ax.set_title('t+1 vs t-' + str(i))
    pyplot.scatter(x=dataframe['t+1'].values, y=dataframe['t-'+str(i)].values)
pyplot.show()

运行这个示例表明观察值与其滞后一期的值之间的关系最强,但总体上与上周的每个值都有良好的正相关性。

最低日温散点图

6.时间序列自相关图

我们可以量化观测值与其滞后值关系的强度和类型。

在统计学中,这被称为相关性,并且在时间序列中对滞后值进行计算时,被称为自相关性。

计算两组数据之间的相关值(如观测值及其滞后一期值)会得到一个介于-1和1之间的数值。该数值的符号分别表示负相关或正相关。接近0的值表示弱相关性,而接近-1或1的值表示强相关性。

可以为每个观测值和不同的滞后值计算相关值,称为相关系数。计算出来结果后,就可以创建一个帮助更好地理解这种关系对不同滞后值是如何变化的图。

这种类型的图被称为自相关图,Pandas 提供了绘制这种图,被称为 autocorrelation_plot() 的内置函数。

下面的示例为最低日温数据集创建一个自相关图:

from pandas import Series
from matplotlib import pyplot
from pandas.tools.plotting import autocorrelation_plot
series = Series.from_csv('daily-minimum-temperatures.csv', header=0)
autocorrelation_plot(series)
pyplot.show()

得到的图表显示x轴为滞后期数和y轴为相关值。提供的虚线,表明在这些线以上的任何相关值在统计上是显著的(有意义的)。

我们可以看到,对于最低日温数据集,我们可以看到强烈的负相关和正相关的周期。在一年的相同、相反的季节或时间,自相关图得到了观测值与过去观测值的关系。正如本示例中所见的正弦波是数据集中含季节性的强烈迹象。

最低日温自相关图

深入阅读

这一节提供了一些关于时间序列绘图以及在本教程中用到的 Pandas 和 Matplotlib 函数使用,供读者深入阅读的资源。

总结

在本教程中,您已经了解到了如何在 Python 中探索和更好地理解您的时间序列数据集。

具体来说,你了解到了:

  • 如何用线图、散点图和自相关图来探索时间关系。
  • 如何用直方图和密度图来探索观测值的分布。
  • 如何用箱须图和热图来探索观测值分布的变化。

本文的版权归 lwj786 所有,如需转载请联系作者。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Ionic2 Rest 认证1、创建Ionic 2 APP2、创建服务3、创建登陆和注册页面4、登出和token检查

    孙亖
  • react仿微信即时IM聊天|react+redux仿微信界面

    基于react+react-dom+react-router-dom+redux+react-redux+ant等技术开发的手机端仿微信界面聊天,实现了聊天记录...

    andy2018
  • Basemap系列教程:自定义colormap

    matplotlib colormap非常强大,比其他软件要更好用 [注1],但是相当难理解。大多数时候,可以使用颜色列表创建 colormap:

    bugsuse
  • 初次就这么给了你(Django-rest-framework)

    工程已经创建好了,需要cd进工程里边,关键是manage.py在工程里边,我们就需要借用manage.py来进行其他的操作了。

    Wyc
  • 彻底搞懂Python 中的 import 与 from import

    对不少 Python 初学者来说,Python 导入其他模块的方式让他们很难理解。什么时候用import xxx?什么时候用from xxx import yy...

    青南
  • vuex(2)如何传值

    第四步 (将发送来的‘me’事件来处理 将vuex里的state里的good来改变值) mutations.js

    河湾欢儿
  • Scala-13.包和导包

    悠扬前奏
  • SpringBoot系列之Spring容器添加组件方式

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    SmileNicky
  • Oracle常用函数

    Create Table Test6( id varchar2(30), name varchar2(30), age...

    郑小超.

扫码关注云+社区

领取腾讯云代金券