时间序列数据在许多不同的行业中都非常重要。它在研究、金融行业、制药、社交媒体、网络服务等领域尤为重要。对时间序列数据的分析也变得越来越重要。在分析中有什么比一些好的可视化效果更好呢?没有一些视觉效果,任何类型的数据分析都是不完整的。因为一个好的情节比20页的报告更能让你理解。因此,本文是关于时间序列数据可视化的。
我将从一些非常简单的可视化开始,然后慢慢地转向一些高级的可视化技术和工具
在开始之前,我需要再弄清楚一件事。
标题中的“完整指南”并不意味着,它有所有的可视化。在这么多不同的库中有这么多的可视化方法,所以在一篇文章中包含所有这些方法是不实际的。
但是本文可以为您提供足够的工具和技术来清楚地讲述一个故事或理解和可视化时间序列数据。我试图解释一些简单的方法和一些先进的技术。
数据集
如果您正在阅读本文以进行学习,则最好的方法是自己跟踪并运行所有代码。请随时从以下链接下载数据集:
https://github.com/rashida048/Datasets/blob/master/stock_data.csv
importpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltdf=pd.read_csv("stock_data.csv", parse_dates=True, index_col="Date") df.head()
我在read_csv函数中使用了“ parse_dates”参数将“日期”列转换为DatetimeIndex格式。在大多数情况下,日期是以字符串格式存储的,而字符串格式不是用于时间序列数据分析的正确格式。如果采用DatetimeIndex格式,则将其作为时间序列数据进行处理将非常有帮助。
我们先从基本开始。最基本的图形应该是使用Pandas的线形图。我将在这里绘制“Volume”数据。看看它是怎样的:
df['Volume'].plot()
这是我们的“Volume”数据图,看起来有些忙碌而有一些大的峰值。将所有其他列也绘制在一个图中以同时检查所有它们的曲线将是一个好主意。
df.plot(subplots=True, figsize=(10,12))
‘Open’, ‘Close’, ‘High’ ,‘Low’ 数据的曲线形状具有相同的形状。只有“Volume”具有不同的形状。
我上面使用的折线图非常适合显示季节性。重新采样数月或数周并绘制条形图是发现季节性的另一种非常简单且广泛使用的方法。我在这里绘制2016年和2017年月份数据的条形图。对于指数,我将使用[2016:]。因为我们的数据集包含直到2017年的数据。所以,2016年末应该带来2016年和2017年。
df_month=df.resample("M").mean()fig, ax=plt.subplots(figsize=(10, 6)) ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m')) ax.bar(df_month['2016':].index, df_month.loc['2016':, "Volume"], width=25, align='center'
有24个小节。每个条代表一个月。2017年7月大幅飙升。
找到季节性的一种方法是使用一组箱线图。这里我将为每个月制作箱线图。我将使用Open’, ‘Close’, ‘High’ ,‘Low’数据来绘制这个图。。
importseabornassns#start, end='2016-01', '2016-12'fig, axes=plt.subplots(4, 1, figsize=(10, 16), sharex=True) forname, axinzip(['Open', 'Close', 'High', 'Low'], axes): sns.boxplot(data=df, x='Month', y=name, ax=ax) ax.set_ylabel("") ax.set_title(name) ifax!=axes[-1]: ax.set_xlabel('')
它清楚地显示了每月的价值差异。
有更多的方式来显示季节性。在本文的最后我用另一种方式进行讨论。
重采样和滚动
请记住上面的“Volume”数据的第一行图。正如我们之前讨论过的,这里数据量太大了。它可以通过重采样来修复。绘制月平均数据将在很大程度上解决这个问题,而不是绘制每日数据。为此,我将使用已经为上面的条形图和框图准备的df_month数据集。
df_month['Volume'].plot(figsize=(8, 6))
更容易理解,更清楚!它能让你更好地了解长期趋势。
重采样在时间序列数据中很常见。大多数时候重采样是在较低的频率进行。
因此,本文将只处理低频的重采样。虽然重新采样的高频率也有必要,特别是为了建模的目的。不是为了数据分析。
在我们目前正在研究的“Volume”数据中,我们可以观察到一些大的峰值。这些类型的尖峰对数据分析或建模没有帮助。通常平滑尖峰,重新采样到较低的频率和滚动是非常有用的。
现在,将日数据和周平均“Volume”画在同一幅图上。首先,使用重采样方法制作每周平均数据集。
df_week=df.resample("W").mean()
这个“df_week”和“df_month”在以后的可视化中也会很有用。
让我们把每日和每周的数据画在同一个图上。
start, end='2015-01', '2015-08'fig, ax=plt.subplots() ax.plot(df.loc[start:end, 'Volume'], marker='.', linestyle='-', linewidth=0.5, label='Daily', color='black') ax.plot(df_week.loc[start:end, 'Volume'], marker='o', markersize=8, linestyle='-', label='Weekly', color='coral') label='Monthly', color='violet') ax.set_ylabel("Open") ax.legend()
周平均面积的峰值比日数据要小。
滚动是另一种非常有用的平滑曲线的方法。它取特定数据量的平均值。如果我想要一个7天的滚动,它会给我们7-d的平均数据。
让我们在上面的图中包含7-d滚动数据。
df_7d_rolling=df.rolling(7, center=True).mean() start, end='2016-06', '2017-05'fig, ax=plt.subplots() ax.plot(df.loc[start:end, 'Volume'], marker='.', linestyle='-', linewidth=0.5, label='Daily') ax.plot(df_week.loc[start:end, 'Volume'], marker='o', markersize=5, linestyle='-', label='Weekly mean volume') ax.plot(df_7d_rolling.loc[start:end, 'Volume'], marker='.', linestyle='-', label='7d Rolling Average') ax.set_ylabel('Stock Volume') ax.legend()
在这个情节中发生了很多事情。但如果你仔细看,还是可以理解的。如果你注意到7-d的滚动平均比周平均平滑一些。
使用30-d或365-d滚动平均也很常见,以使曲线更平滑。