刺猬教你量化投资(十八):信息可视化技能进阶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日

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,612评论 5 471
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,345评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,625评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,022评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,974评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,227评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,688评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,358评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,490评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,402评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,446评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,721评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,802评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,013评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,504评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,080评论 2 341

推荐阅读更多精彩内容