时间序列数据在许多不同行业中都非常重要。它在研究、金融业、制药、社交媒体、网络服务等领域尤为重要。时间序列数据的分析也变得越来越重要。分析中有什么比一些好的可视化更好的呢?没有一些视觉效果,任何类型的数据分析都是不完整的。因为一个好的情节比20页的报告更能让你理解。因此,这篇文章是关于时间序列数据可视化的。
我将从一些非常简单的可视化开始,然后慢慢转向一些高级可视化技术和工具
在开始之前,我还需要弄清楚一件事。
标题中的“完整指南”并不意味着它具有所有可视化。在如此多的不同库中有如此多的可视化方法,因此将所有这些方法都包含在一篇文章中是不切实际的。
但是这篇文章可以为你提供足够的工具和技术来清晰地讲述故事或理解和可视化时间序列数据。我试图解释一些简单的方法和一些先进的技术。
数据集
如果您阅读本文是为了学习python 时间序列模型,最好的办法是自己跟踪和运行所有代码。请随时从以下链接下载数据集:
作为PD
numpy 作为 np
.as plt
df = pd.(“.csv”, =True, = “日期”)
df.head()
我使用函数中的“”参数将“日期”列转换为格式。在大多数情况下,日期以字符串格式存储,这不是时间序列数据分析的正确格式。如果采用某种格式,将其作为时间序列数据处理会非常有帮助。
让我们从基础开始。最基本的图表应该是使用的折线图。我将在这里绘制“”数据。看看它的样子:
df[”].plot()
这是我们的“”数据图表,看起来有点忙,有一些大的尖峰。将所有其他列也绘制在一个图中以同时检查它们的所有曲线是一个好主意。
df.plot(=True, =(10,12))
‘Open’, ‘Close’, ‘High’ , ‘Low’ 数据具有相同的曲线形状。只有“”具有不同的形状。
我上面使用的折线图非常适合显示季节性。重新采样数月或数周并绘制条形图是另一种非常简单且广泛使用的发现季节性的方法。在这里,我绘制了 2016 年和 2017 年月份数据的条形图。对于指数,我将使用 [2016:]。因为我们的数据集包含截至 2017 年的数据。所以,2016 年末应该带来 2016 年和 2017 年。
= df.(“M”).mean()
无花果,斧头 = plt.(=(10, 6))
ax.xaxis.(.(‘%Y-%m’))
ax.bar([‘2016’:].index, .loc[‘2016’:, “”], width=25,
有24个酒吧。每个条形代表一个月。2017 年 7 月大幅上涨。
找到季节性的一种方法是使用一组箱线图。在这里,我将制作每个月的箱线图。我将使用 Open’、’Close’、’High’、’Low’ 数据来绘制此图。
作为sns
#开始,结束=’2016-01’,’2016-12′
无花果,轴 = plt.(4, 1, =(10, 16), =True)
对于名称,ax in zip([‘Open’,’Close’,’High’,’Low’],axes):
sns.(data = df, x=’月’, y=name, ax=ax)
斧头。(””)
斧头。(名称)
如果 ax != 轴 [-1]:
斧头。(”)
它清楚地显示了每月的价值差异。
有更多的方法来显示季节性。在本文的最后,我以另一种方式讨论它。
重采样和滚动
记住上面“”数据的第一行图。正如我们前面所讨论的,这里的数据量太大了。它可以通过重新采样来修复。绘制月平均数据将在很大程度上解决这个问题,而不是绘制每日数据。为此,我将使用已经为上面的条形图和箱形图准备的数据集。
[”].plot(=(8, 6))
更容易理解更清晰!它可以让您更好地了解长期趋势。
重采样在时间序列数据中很常见。大多数情况下,重采样是在较低频率下完成的。
因此,本文将只处理低频的重采样。尽管也需要高频率的重采样,尤其是出于建模目的。不用于数据分析。
在我们目前正在处理的“”数据中,我们可以观察到一些大的峰值。这些类型的尖峰对数据分析或建模没有帮助。通常平滑尖峰、重新采样到较低频率和滚动非常有用。
现在,在同一张图表上绘制每日数据和每周平均值“”。首先,使用重采样方法制作每周平均数据集。
= df.(“W”).mean()
这个“”和“”在未来的可视化中也将很有用。
让我们在同一张图表上绘制每日和每周数据。
开始、结束 = ‘2015-01’、’2015-08’
无花果python 时间序列模型,斧头 = plt.()
ax.plot(df.loc[start:end, ”], =’.’, =’-‘, = 0.5, label=’Daily’, color=’black’)
ax.plot(.loc[start:end, ”], =’o’, =8, =’-‘, label=”, color=’珊瑚’)
标签=”,颜色=”)
斧头。(“打开”)
斧头。()
周平均面积的峰值小于日数据。
滚动是平滑曲线的另一种非常有用的方法。它取特定数量数据的平均值。如果我想要 7 天滚动,它会给我们 7 天的平均值。
让我们在上图中包含 7 维滚动数据。
= df.(7, =True).mean()
开始,结束 = ‘2016-06’,’2017-05’图,ax = plt.()
ax.plot(df.loc[start:end, ”], =’.’, =’-‘,
=0.5, 标签=’每日’)
ax.plot(.loc[start:end, ”], =’o’, =5,
=’-‘,标签=’意思’)
ax.plot(.loc[start:end, ”], =’.’, =’-‘, label=’7d’)
ax.(‘股票’)
斧头。()
这一集发生了很多事情。但如果仔细观察,这是可以理解的。如果您注意到 7 天的滚动平均值比每周平均值要平滑一些。
使用 30 d 或 365 d 滚动平均值来使曲线更平滑也很常见。
图表显示变化
很多时候,查看数据如何随时间变化比查看日常数据更有用。
有几种不同的方法可以计算和可视化数据的变化。
shift 函数在指定时间之前或之后移动数据。如果我不指定时间,它会默认传输一天的数据。这意味着您将获得前一天的数据。在这样的财务数据中,将前一天的数据与今天的数据放在一起会很有帮助。
由于这篇文章只关注可视化,我将仅绘制前一天的数据:
df[”] = df.Close.div(df.Close.shift())
df[”].plot(=(20, 8), = 16)
在上面的代码中, .div() 有助于填充缺失的数据。div() 表示“除”。df.div(6) 将 df 中的每个元素除以 6。但这里我使用’ df.Close.shift() ‘所以 df 的每个元素将除以 ‘ df.close . shift() ‘划分每个元素。这样做是为了避免“shift()”操作创建空值。
您可以简单地指定一个时间段并绘制它以获得更清晰的外观。这只是2017年的一集。
df[‘2017’][”].plot(=(10, 6))
尽管这种转变在许多方面都很有用。但我发现百分比变化在许多情况下都很有用。
% 改变
我将使用每月数据开始计算。这次我选择了条形图。它清楚地显示了百分比变化。有一个百分比变化函数可用于获取数据。
.loc[:, ”] = df.Close.()*100
无花果,斧头 = plt.()
[” ].plot(kind=’bar’, color=’coral’, ax=ax)
ax.xaxis.(.())
ax.xaxis.(.(‘%b %d’))
plt.(=45)
斧头。()
我在这里绘制了封闭数据的百分比变化。此处使用每月百分比变化。
不同之处
差值取指定距离值的差值。默认为 1。如果你指定 2 像 “df.High.diff(2)”, 它将取 ‘High’ 列的第一个和第三个元素,第二个和第四个元素之间的差异,等等类比。
去趋势数据是一种流行的方法。这种趋势不利于预测或建模。
df.High.diff().plot(=(10, 6))
扩展窗口
另一种转变方式。它不断增加和积累。例如,如果将扩展函数添加到“高”列元素,则第一个元素保持不变。第二个元素成为第一个和第二个元素的累加,第三个元素成为第一个、第二个和第三个元素的累加,以此类推。您还可以在其上使用聚合函数,例如均值、中位数、标准差等。
通过这种方式,它提供了一段时间内的平均值、中位数和/或标准差。它对财务数据、业务销售或利润数据不是很有用吗?
无花果,斧头 = plt.()
ax = df.High.plot(label=’High’)
ax = df.High.().mean().plot(label=’High mean’)
ax = df.High.().std().plot(label=’High std’)
斧头。()
在这里,我添加了平均值和标准差。查看每日数据和平均值。2017年底,每日数据显示出巨大的飙升。但它没有显示平均值的峰值。如果只看 2017 年的数据,扩大的平均值可能会有所不同。
热图
热图通常是随处使用的常见数据可视化类型。在时间序列数据中,热图也非常有用。
但在深入研究热图之前,我们需要开发一个日历来表示我们数据集的年份和月份数据。让我们看一个例子。
在这个演示中,我将导入一个日历包并使用数据透视表函数来生成值。
= pd.(df, =”打开”,
指数=[“月”],
=[“年份”],
=0,
=真)
= [[.[i] if (i, int) else i for i in list(.index)]] # name
= .()
日历已经准备好月平均“未结”数据。现在,使用它来生成热图。
ax = sns.(, cmap=”, =True, fmt=’.2f’,
annot=True, =.5, ={‘size’:11},
={”:.8, ‘标签’:’打开’})
ax.(ax.(), =0, =10)
ax.(ax.(), =0, =10)
plt.title(‘ ‘, ={”:18}, pad=14);
深红色表示数值非常高,深绿色表示数值非常低。
分解图
分解将在同一张图中显示观察结果和这三个元素:
趋势:时间序列的一致向上或向下斜率。
季节性:时间序列中的显式周期性模式
噪声:异常值或缺失值
使用 stats 模型库,很容易做到:
来自 pylab
.api 作为 sm
[‘.’] = 11, 9
= sm.tsa.([”], 模型=”)
无花果 = .plot()
plt.show()
趋势是移动平均线。为了对最后一行的残差有一个高级的了解,这里有一个通用的公式:
原始观测值 = 趋势 + 季节性 + 残差
尽管关于分解本身的文档说它是一个非常简单的表示,但它仍然很受欢迎。
总结
如果你可以运行上面的所有代码,恭喜!今天,您已经学到了足够的知识来可视化时间序列数据。正如我在开头提到的,有很多很酷的可视化技术可用。
文章来源:https://www.163.com/dy/article/FRSASHV60531D9VR.html
感谢您的来访,获取更多精彩文章请收藏本站。

暂无评论内容