pd.melt_pd.melt_pd.melt

本文含8890字,37图表截屏

建议阅读46分钟

引言

本文是 系列的 补充篇。整套 盘一盘系列目录如下:

对于做数据分析的同学简直就是神器,可以让他们把注意力放在分析过程上,同时又能产出漂亮的可视图。

可以不严谨的分解成 、 和 iplot,如下图所示:

pd.melt_pd.melt_pd.melt

其中

由此可知, 直接在 上画图,而 是最基本的数据格式,因此很方便; 只是设定图形,而 iplot 才真正的把图给画出来。

本贴结构如下,第一章解释 iplot() 函数的参数含义,当你明晰所有参数该怎么用时,你会发现用 画图真的再简单不过了。第二章就“随意”画些图看看效果 (如以下视频所示)。

首先引入 包,并设置离线模式画图。

import cufflinks as cfcf.set_config_file(offline=True)

iplot 函数 API

用一个词形容 的 API 就是优雅,所有绘图实现都写在一个函数 iplot() 里。查看其函数签名可用以下语句:

df = pd.DataFrame()help(df.iplot)

pd.melt_pd.melt_pd.melt

绘图函数 iplot()是一招鲜吃遍天,常用参数的解释如下。尽管内容枯燥,建议一定认真读完,细节在魔鬼,读得越细就能实现越精巧的图。

kind:字符串格式,用于设置图的种类,具体值包括

散点图 、柱状图 bar、箱形图 box、差异图 、比率图 ratio、热力图 、平面图 、直方图 、气泡图 、三维气泡图 、三维散点图 、地理散点图 、K线图 ohlc、蜡烛图 、饼状图 pie、地图

title, , , :字符串格式,用于设置图表标题、x 轴、y 轴和 z 轴标题 (只适用 3D 图)

theme:字符串格式,用于设置主题风格,可用cf.()查看,具体值包括

, pearl, solar, space, white, polar,

:字典、列表或字符串格式,用于设置颜色

:字符串格式,用于设置色阶,具体名称可用cf..scale()查看,如下图所示。在颜色字符串前加–前缀可以反转色阶。举例 “” 和 “-” 的色阶顺序正好相反。

pd.melt_pd.melt_pd.melt

fill:布尔格式,用于填充轨迹 (trace) 和坐标轴之间的空白。

width:字典、列表或整数格式,用于设置轨迹宽度

dash:字典、列表或字符串格式,用于设置轨迹风格

具体选项有实线 solid、虚线 dash、虚点 、点 dot

mode:字典、列表或字符串格式,用于设置轨迹模式

具体选项有折线lines、散点 、折线加散点 lines+、折线加文字lines+text、散点加文字 +text、折线加散点和文字 lines++text

:字典、列表或字符串格式,用于设置插值方法

具体选项有线性、三次样条 、 阶梯 hv 或 vh 或 vhv 或 hvh。

:字典、列表或字符串格式,用于设置标记类型,仅当mode含才适用

具体选项有圆形、圆形加点 -dot、菱形 、方形 等。

size:字符串或整数格式,用于设置标记大小,仅当mode含才适用。

:字符串格式,用于设置柱状类型,仅当kind = bar才适用,具体选项有分组 group、堆叠 stack、重叠 。

:布尔格式,用于递减排列柱状,仅当kind = bar才适用。

:浮点数格式,值在0和 1 之间,用于设置柱状的间隔,仅当kind = bar或才适用。

:浮点数格式,值在 0和 1 之间,用于设置柱状分组的间隔,仅当kind = bar或才适用。

bins:整数或元组格式,仅当kind = 才适用

:字符串格式,仅当kind = 才适用。具体选项有

:字符串格式,用于设置桶函数,仅当kind = 才适用。具体选项有计数函数count、求和函数 sum、平均函数 avg、最小值函数 min、最大值函数 max。

:字符串格式,用于设置形状的排放方式,h 代表水平 v 代表竖直,仅当kind = bar或或box才适用

:布尔或字符串格式,用于在箱形图中显示数据,仅当kind = box才适用,具体选项有离群值 、全部 all、可疑离群值 、不显示False。

:字典格式 {: text},用于在点 上标注 text。

keys:列表格式,指定数据帧中的一组列标签用于排序。

:布尔或列表格式,用于拟合数据。

:字典或列表格式,用于设定数据拟合线的颜色。

:字符串格式,数据帧中用于区分类别的列标签

x:字符串格式,数据帧中用于 x 轴变量的列标签

y:字符串格式,数据帧中用于 y 轴变量的列标签

z:字符串格式,数据帧中用于 z 轴变量的列标签 (只适用 3D 图)

text:字符串格式,数据帧用于显示文字的列标签

:字符串格式,用于设定网格颜色

:字符串格式,用于设定零线颜色

:字符串格式,将数据帧中的里列标签设为饼状图每块的标签,仅当kind = pie才适用。

:字符串格式,将数据帧中的列数据的值设为饼状图每块的面积,仅当 kind = pie才适用。

:字符串格式,数据帧中用于第二个 y 轴变量的列标签

:字符串格式,用于设置第二个 y 轴标题

:布尔格式,如果 True 则画子图

shape:元组格式 (rows, cols),仅当= True才适用,

:整数或浮点数格式,用于设置 x 轴变量的误差值

:整数或浮点数格式,用于设置 y 轴变量的误差值

:字符串格式,用于设定误差条形的类型,具体选项有 data、、、sqrt、、。

最后将图存成不同数据格式的布尔型参数:

其他参数** 可以让图更个性化,比如 shape,等pd.melt,这些在下节用具体例子来展示,读者一看就知道这些参数的效用了。

认真读参数含义!认真读参数含义!认真读参数含义!读完你就发现“诶,我怎么会用 画各式各样的图了”。

用 iplot 画图

数据

首先用 来下载四个股票的 2020 年到 2021年的最新数据,安装该 API 用一行代码:

pip install yahoofinancials

数据的描述如下

下面代码就是从 API 获取数据:

pd.melt_pd.melt_pd.melt

该 API 返回结果 是「字典」格式,样子非常丑陋,将上面的「原始数据」转换成 ,代码如下:

pd.melt_pd.melt_pd.melt

第 3 行完全是为了 里面的输入格式准备的。如果 Asset 是加密货币,直接用其股票代码;如果 Asset 是汇率,一般参数写成 或

第 6 行定义好开盘价、收盘价、最低价和最高价的标签。

第 7 行获取出一个「字典」格式的数据。

第 8, 9 行用列表解析式 (list ) 将日期和价格获取出来。

第 11 到 13 行定义一个

处理过后,将每个股票的收盘价合并成一个数据帧,打印其首尾三行得到:

df = pd.DataFrame()for code in stock_code:    data = data_converter( stock_daily, code, 'EQ' )    df[code] = data['close']
df.index = pd.to_datetime(df.index)df.head(3).append(df.tail(3))

pd.melt_pd.melt_pd.melt

接下来画图,代码简单到已经不需要额外文字解释了,对比着参数设置一下子就能找出图中相对应特征。

可视图

四只股票价格折线图,在 x 轴、y 轴和图上列出标题。

df.iplot( kind='line',           xTitle='日期',           yTitle='价格',           title='四只股票表现' )

pd.melt_pd.melt_pd.melt

由于股票价格量纲不同,有时候多只股票放在一起比较效果很差,比如你加入 AMZN,大概 3200 多,这样那些价格只有几十的股票折线几乎像一条水平线。下面做了标准化,将起始日的价格设为 100,再进行比较。

df.div(df.iloc[0,:]).mul(100).iplot( kind='line',                                      xTitle='日期',                                     yTitle='标准化后价格',                                     title='四只股票表现' )

画 FUTU 和 NIO 日收益率的散点图。注意参数 color 和 的用法 (以字典个格式传入参数值)。

df[['FUTU','NIO']].pct_change().iplot(kind='scatter', mode='markers', size=8,                                      color={'FUTU':'pink', 'NIO':'red'},                                      symbol={'FUTU':'diamond', 'NIO':'circle'},                                      xTitle='FUTU', yTitle='NIO', title='日收益率散点图')

pd.melt_pd.melt_pd.melt

画FUTU 和 NIO 价格的差异图。

df[['FUBO','NIO']].iplot(kind='spread',                         xTitle='日期',                          yTitle='价格',                          title='FUBO 和 NIO 价格差异图')

pd.melt_pd.melt_pd.melt

画FUTU 和 NIO 价格的比率图。

df[['FUBO','NIO']].iplot(kind='ratio',                          xTitle='日期',                          yTitle='价格',                          title='FUBO 和 NIO 价格比率图')

pd.melt_pd.melt_pd.melt

画四只股票日收益率的分组直方图。注意参数 和 的用法。

df.pct_change().iplot(kind='histogram',                       barmode='group', histnorm='probability',                       xTitle='日收益率', yTitle='概率', title='四只股票日收益率分组直方图')

pd.melt_pd.melt_pd.melt

画四只股票日收益率的堆叠直方图。注意参数 设为 stack。

df.pct_change().iplot(kind='histogram',                       barmode='stack',                      xTitle='日收益率', yTitle='概率', title='四只股票日收益率堆叠直方图')

pd.melt_pd.melt_pd.melt

下面四图分别画四只股票日收益率的直箱形图,前三个都是竖直展示箱 (参数 ='v'),并展示全部数据点、只展示离群点,和只展示可疑离群点,最后一天按水平展示箱 (参数 ='h')。

df.pct_change().iplot(kind='box',                       orientation='v', boxpoints='all',                      xTitle='股票', yTitle='日收益率', title='四只股票日收益率箱形图')

pd.melt_pd.melt_pd.melt

df.pct_change().iplot(kind='box',                      orientation='v', boxpoints='outliers',                      xTitle='股票', yTitle='日收益率', title='四只股票日收益率箱形图')

pd.melt_pd.melt_pd.melt

df.pct_change().iplot(kind='box',                       orientation='v', boxpoints='suspectedoutliers',                      xTitle='股票', yTitle='日收益率', title='四只股票日收益率箱形图')

pd.melt_pd.melt_pd.melt

df.pct_change().iplot(kind='box',                       orientation='h',                      xTitle='日收益率', yTitle='股票', title='四只股票日收益率箱形图')

pd.melt_pd.melt_pd.melt

画四只股票按季度收益率的柱状图。按季度用 ('Q') 来分组;计算累计收益用 apply() 将 np.prod(1+x)-1 应用到每组中所有的数据。

df.pct_change().resample('Q').apply(lambda x: np.prod(1+x)-1).        iplot(kind='bar',               xTitle='季度',              yTitle='收益率',              title='四只股票季度收益率柱状图')

pd.melt_pd.melt_pd.melt

画 NIO 和 DAO 的折线+拟合图,只需设置 为 True,此外还可用 和 设置折线和拟合线的颜色。

df[['NIO','DAO']].iplot( kind='scatter',                          bestfit=True,                          colors=['blue','red'],                         bestfit_colors=['blue','red'],                         xTitle='日期', yTitle='价格', title='最优线性拟合' )

pd.melt_pd.melt_pd.melt

画图四只股票月收益率的气泡图。代码稍微有些复杂,但还是能一行流写出 (尽管有几个断行)。如何 计算累计收益率前面已经讲了就不重复了,关键是先用 pd.melt() 将宽表变成长表pd.melt,使其用三列 date, code 和 value,然后分别设为气泡的 x 轴数据、y 轴数据、和气泡大小。最后用 code 来区分不同股票的月收益率,即用不同颜色区分。

pd.melt( df.pct_change()           .resample('M')           .apply(lambda x: np.prod(1+x)-1)           .reset_index(), id_vars=['date'], var_name='code' )        .iplot( kind='bubble',                 x='value', y='date', size='value',                 categories='code',                xTitle='收益率', yTitle='日期', title='四只股票月度收益率气泡图' )

pd.melt_pd.melt_pd.melt

回顾上面 iplot() 函数签名中,还有 ** 参数,比如添加水平线 (hline) 和竖直线 (vline)。

df[['FUTU']].iplot(hline=[40,60],                    vline=['2020-11-19'],                   xTitle='价格', yTitle='日期', title='FUTU 股价')

可用字典格式进一步设置水平线和竖直线的特征。

df[['FUTU']].iplot(hline=[dict(y=40,color='blue',width=10),                          dict(y=60,color='green',dash='dash')],                    vline=['2020-11-19'],                   xTitle='价格', yTitle='日期', title='FUTU 股价')

pd.melt_pd.melt_pd.melt

同理,可添加水平块 (hspan)和竖直块 (vspan)。

df[['FUTU']].iplot(hspan=[(40,60)],                   vspan=[('2020-11-19','2021-01-01')],                   xTitle='价格', yTitle='日期', title='FUTU 股价')

pd.melt_pd.melt_pd.melt

可用字典格式进一步设置水平块和竖直块的特征。

df[['FUTU']].iplot(hspan={'y0':40, 'y1':60, 'color':'black', 'fill':False},                    vspan={'x0':'2020-11-19', 'x1':'2021-01-01', 'color':'blue', 'fill':True, 'opacity':0.2},                   xTitle='价格', yTitle='日期', title='FUTU 股价')

pd.melt_pd.melt_pd.melt

画子图也可以实现,将 设为 True 即可。

df.iplot( subplots=True,           subplot_titles=True          legend=False,          xTitle='日期', yTitle='价格', title='四只股票价格')

显式设定多图的布局也容易,用 shape 参数。

df.pct_change()[-30:].iplot( subplots=True,                              shape=(4,1),                              shared_xaxes=True                             vertical_spacing=.02                             fill=True,                             xTitle='日期', title='四只股票日收益率')

pd.melt_pd.melt_pd.melt

如果多图的布局不规则怎么办?如果每个子图的类型不一样怎么办?

好办!分四步:

将具体的子图一个个按顺序放入 cf.() 里

创建布局,用 cf.tools.()

设定每个子图占布局的位置,用 cf.() 并设置 specs

最后 cf.iplot() 画图即可

pd.melt_pd.melt_pd.melt

pd.melt_pd.melt_pd.melt

总结

很简单,一行 iplot 流

不简单,细节在魔鬼

熟读函数 API,很快能学会

pd.melt_pd.melt_pd.melt

付费精品视频课

8 节 数据分析 (NumPy//Scipy) 课:

11 节 基础课:

今年还会出 三个系列:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注