图表展示变化
很多时候,查看数据如何随时间变化比查看日常数据更有用。
有几种不同的方法可以计算和可视化数据的变化。
shift
shift函数在指定的时间之前或之后移动数据。如果我不指定时间,它将转移数据一天默认。这意味着你将获得前一天的数据。在像这样的财务数据中,把前一天的数据和今天的数据放在一起是很有帮助的。
因为这篇文章只专注于可视化,所以我将只绘制前一天的数据:
df['Change'] =df.Close.div(df.Close.shift()) df['Change'].plot(figsize=(20, 8), fontsize=16)
在上面的代码中,.div()帮助填充丢失的数据。div()的意思是“除”。df.div(6)将把df中的每个元素除以6。但这里我用的是' df.Close.shift() '因此,df的每个元素将被' df. close .shift() '的每个元素除。这样做是为了避免' shift() '操作创建的空值。
您可以简单地指定一个时间段并进行绘图以使外观更清晰。这仅是2017年的情节。
df['2017']['Change'].plot(figsize=(10, 6))
尽管这种转变在很多方面都很有用。但我发现百分比变化在很多情况下很有用。
变化百分比
我将使用开始计算的月度数据。这次我选择了条形图。它清楚地显示了百分比的变化。有一个百分比更改函数可用来获取percent_change数据。
df_month.loc[:, 'pct_change'] =df.Close.pct_change()*100fig, ax=plt.subplots() df_month['pct_change' ].plot(kind='bar', color='coral', ax=ax) ax.xaxis.set_major_locator(mdates.WeekdayLocator()) ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %d')) plt.xticks(rotation=45) ax.legend()
我在这里画出了封闭数据的变化百分比。这里用的是月变化百分比。
差分
差分取指定距离值的差值。默认情况下,是1。如果像“df.High.diff(2)”那样指定2,它将取‘High’列的第一个和第三个元素、第二个和第四个元素的差值,依此类推。
在数据中去除趋势是一种流行的方法。这种趋势不利于预测或建模。
df.High.diff().plot(figsize=(10, 6))
扩展窗口
另一种转变方式。它不断增加累积。例如,如果向' High '列元素添加展开函数,则第一项元素保持不变。第二个元素成为第一个和第二个元素的累积,第三个元素成为第一个、第二个和第三个元素的累积,以此类推。你也可以在上面使用聚合函数,比如平均值、中位数、标准差等等。
这样,它就能提供随时间变化的均值、中位数、和或标准差。它对财务数据、业务销售或利润数据不是很有用吗?
fig, ax=plt.subplots() ax=df.High.plot(label='High') ax=df.High.expanding().mean().plot(label='High expanding mean') ax=df.High.expanding().std().plot(label='High expanding std') ax.legend()
这里我加了均值和标准差。看看每天的数据和平均值。在2017年底,每日数据显示一个巨大的高峰。但它并没有显示平均值的峰值。如果只看2017年的数据,不断扩大的平均水平可能会有所不同。
热点图
热点图通常是一种随处使用的常见数据可视化类型。在时间序列数据中,热点图也是非常有用的。
但是在深入研究热点图之前,我们需要开发一个日历来表示我们数据集的年和月数据。让我们看一个例子。
在这个演示中,我将导入一个日历包并使用pivot表函数来生成值。
importcalendarall_month_year_df=pd.pivot_table(df, values="Open", index=["month"], columns=["year"], fill_value=0, margins=True) named_index= [[calendar.month_abbr[i] ifisinstance(i, int) elseiforiinlist(all_month_year_df.index)]] #namemonthsall_month_year_df=all_month_year_df.set_index(named_index) all_month_year_df
日历已经准备好了每月平均“Open”数据。现在,用它生成热点图。
ax=sns.heatmap(all_month_year_df, cmap='RdYlGn_r', robust=True, fmt='.2f', annot=True, linewidths=.5, annot_kws={'size':11}, cbar_kws={'shrink':.8, 'label':'Open'}) ax.set_yticklabels(ax.get_yticklabels(), rotation=0, fontsize=10) ax.set_xticklabels(ax.get_xticklabels(), rotation=0, fontsize=10) plt.title('Average Opening', fontdict={'fontsize':18}, pad=14);
深红色意味着非常高的数值,深绿色意味着非常低的数值。
分解图
分解将在同一个图中显示观察结果和这三个元素:
趋势:时间序列一致的向上或向下的斜率。
季节性:时间序列的明确周期模式
噪声:异常值或缺失值
使用stats模型库,很容易做到:
frompylabimportrcParamsimportstatsmodels.apiassmrcParams['figure.figsize'] =11, 9decomposition=sm.tsa.seasonal_decompose(df_month['Volume'], model='Additive') fig=decomposition.plot() plt.show()
趋势是移动平均线。为了让对最后一行的残差有一个高层次的概念,下面是一般公式:
原始观测值=趋势+季节性+残差
尽管关于分解的文档本身说它是一种非常简单的表示,但它仍然很流行。
总结
如果你能运行上面所有的代码,恭喜你!今天,您已经学习了足够多的时间序列数据可视化。正如我在开始时提到的,有很多很酷的可视化技术可用。