刺猬教你量化投资(十八):信息可视化技能进阶1

可视化是信息交换的捷径

Pandas和Seaborn

matplotlib为我们提供了基本的绘图功能,不过图片会有些单调,如何进行美化呢?
有一个非常简单且一步到位的方法—— import seaborn即可。

1、线型图

在Pandas下,整理好数据后便可用plot()对序列或dataframe绘制线型图。例如之前天齐锂业的例子:

df4.plot()

# df.plot()等价于df.plot.line()
image.png

如果是序列,其索引会被传到图像中,作为X轴的内容。use_index=False来禁用这一功能。然后用xticks和xlim来设置刻度和界限。

plot()的更多参数如下:

image.png

image.png

DataFrame绘图的更多参数如下:

image.png
2、柱状图

水平的柱状图,可用plot.bar()
垂直的柱状图,可用plot.barh()

生成的图表轴刻度,默认是数据的索引。

  • 对于序列:
fig, axes = plt.subplots(2, 1)
data = pd.Series(np.random.rand(21), index=list('getlotsofrandomnumber'))
data.plot.bar(ax=axes[0], color='k', alpha=0.7)
data.plot.barh(ax=axes[1], color='k', alpha=0.7)
image.png

若想查看频数的柱状图,可用value_counts():

s = pd.Series(['1','2','3','2','3','3','4'])
s.value_counts().plot.bar()
image.png
  • 对于dataframe:
df = pd.DataFrame(np.random.rand(6, 4),
      index=['one', 'two', 'three', 'four', 'five', 'six'],
      columns=pd.Index(['A', 'B', 'C', 'D'], name='Grade'))
print df
df.plot.bar()
image.png

程序会自动将列的名称视为图例的标题。

如果想要堆积起来的柱状图,可用加上stacked=True:

image.png

在dataframe中,可指定使用哪些列的数据:

df4 = df4.iloc[[100,500,800,1000,1500,1700],:]
sns.barplot(x='closePrice', y='asset volumes', data=df4, orient='h')   # orient='h'表示水平的柱状图,v表示垂直的
image.png

如果同一资产量对应了多个收盘价,那么X轴取的是收盘价的平均值。届时图形中会出现一条黑线,这条黑线代表了置信度为95%的取值范围。

image.png

更进一步的设置:

df4.columns = ['tradeDate','closePrice','asset volumes']
df4 = df4.iloc[[100,500,800,1000,1500,1700],:]
sns.barplot(x='closePrice', y='asset volumes', data=df4, orient='h' ,hue='tradeDate')   
# orient='h'表示水平的柱状图,v表示垂直的
# 可用'hue'来增加图例
sns.set(style="darkgrid") #可选择使用sns内置的风格
#Seaborn有五个预设好的主题: darkgrid , whitegrid , dark , white ,和 ticks  默认: darkgrid
3、直方图、密度图

直方图可显示数据频率的离散化程度。

例如天齐锂业均线金叉策略的例子,实际仓位的频率分布图如下:

df['实际仓位'].plot.hist(bins=50)

可见,满仓的日子大于空仓的日子。

密度图是通过计算“可能会产生观测数据的连续概率分布的估计”而产生的。一般的过程是将该分布近似为一组核(即诸如正态分布之类的较为简单的分布)。因此,密度图也被称作KDE(Kernel Density Estimate,核密度估计)图。

df['实际仓位'].plot.density()
image.png

使用seaborn的distplot方法,可以同时画出直方图和连续密度估计图。

comp1 = np.random.normal(0, 1, size=200)
comp2 = np.random.normal(10, 2, size=200)
values = pd.Series(np.concatenate([comp1, comp2]))
print values.shape
sns.distplot(values, bins=100, color='k')
image.png

4、散布图或点图

使用seaborn的regplot方法,可以画出一个散布图及一条线性回归线。

df = pd.DataFrame(np.random.rand(6, 4),
        index=['one', 'two', 'three', 'four', 'five', 'six'],
        columns=pd.Index(['A', 'B', 'C', 'D'], name='Grade'))
print df
df1 = np.log(df).diff().dropna()  #求df的对数差分
print df1
# 使用regplot的方式
sns.regplot('A', 'B', data=df1)
plt.title('Changes in log %s versus log %s' % ('A', 'B'))
image.png

如果要同时观察一组变量的散布图,即散布图矩阵(scatter plot matrix),可使用pairplot()函数。它将在对角线上放置每个变量的直方图或密度估计。

sns.pairplot(df1, hue=None, hue_order=None, palette=None, vars=None, x_vars=None, y_vars=None, kind='scatter', diag_kind='kde', markers=None, size=2.5, aspect=1, dropna=True, diag_kws=None, grid_kws=None
, plot_kws={'alpha': 0.2})
# plot_kws参数可以传递配置选项到非对角线元素上的图形
image.png
5、分面网格(facet grid)和类型数据

对于有分组维度的数据集,可用factorplot()函数进行统计。

df4 = df[['交易日期','收盘价','策略仓位','总资产']]
df4.columns = ['tradeDate','closePrice','pos','asset volumes']
df4 = df4.iloc[[100,500,800,1000,1500,1700],:]

sns.set(style="darkgrid") #可选择使用sns内置的风格
sns.factorplot(x='closePrice', y='asset volumes', hue='tradeDate', col='pos',kind='bar', data=df4)

# 这里按照col来进行分类,如有必要,还可以加入row=‘’来扩展分组
# kind除了bar,还可以用box等图形。详情可参阅https://seaborn.pydata.org

image.png

总结

这一节主要讲了Pandas和Seaborn的基本绘图方法,在“信息可视化技能进阶2”的课程里,我们会学习如何对时间序列的数据进行绘图。

刺猬偷腥
2018年10月1日

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容