matplotlib输出图形到网页_【Python】No.2 Numpy和Matplotlib初体验

6af0567e8800e948a3d85a4e81495a22.png

上一次推送,我们了解了Python安装部署和conda管理,为后续的Python学习打下了基础,这次我们进入数据分析模块。

Pandas、Numpy和Matplotlib被称为“数据分析三剑客”,其重要地位可想而知。这篇推送我们就来简单了解一下Numpy和Matplotlib的知识。

4db64161acf23c1a2f90070f16efe27e.png

什么是Numpy

一个在Python中做科学计算的基础库,也是大部分Python科学计算库的基础库,多用于在大型、多维数组上执行数值运算。它的内容包括:(1)强大的N维数组对象; (2)复杂的广播功能; (3)用于集成C/C++和Fortran代码的工具; (4) 实用的线性代数、傅里叶变换和随机数功能等。

我们通过一个例子来了解它们的基本知识:

假定某投资者拥有一个投资组合,该组合的初始投资金额是1亿元,组合甲配置了4只在A股市场上市的股票,分别是工商银行、中国石油、宝钢股份以及上汽集团,配置的比例分别是15%、20%、25%以及40%。与此同时,表1描绘了2018年9月3日至9月7日这5个交易日中相关股票的涨跌幅情况,投资者希望通过Python快速计算这5个交易日整个投资组合的涨跌幅情况。

b3ce5941819d00d69f86911559b5178c.png

*案例出自斯文的《基于Python的金融风险与风险管理》

首先,由于Numpy是Python的外部模块,使用时需要导入,具体的代码如下:(control+enter执行代码)

import numpy as np #导入numpy模块

Numpy最显著的特征在于它的数据结构是运用了数组,它是可以定义维度的,因此数组的全称是N维数组,适合做数学代数运算。

例一:

生成一维数组

根据信息,将4只股票的配置比例以一维数组方式直接在Python中进行输入,具体的代码如下:

import numpy as np 
weight=np.array([0.15,0.2,0.25,0.4])
type(weight)
weight.shape
68989c9f80b35dfc46f5e7ce02d4ccaf.png

用shape函数得到该变量是一维数组,相当于4个元素组成的向量。

例二:

生成二维数组

根据信息,将这4只股票涨跌幅以数组方式在Python中进行输入,具体代码如下:

stock_return=np.array([[0.003731,0.021066,-0.004854,0.006098,-0.006060 ],
                       [-0.001838,0.001842,-0.016544,-0.003738,0.003752] ,
                       [-0.003087,-0.000344,-0.033391,0.007123,0.004597] ,
                      [ -0.024112,0.011704,-0.029563,-0.014570,0.016129 ]])
stock_return
stock_return.shape
输出结果如下: 3087a096eeb8c6cb172d278c67d92918.png 68989c9f80b35dfc46f5e7ce02d4ccaf.png

这次用shape函数可以得到该变量是一个二维数组,相当于是一4行5列的矩阵。

依然运用开头案例,假定投资者希望了解自己的投资组合中某只股票在某个交易日的涨跌情况,就会运用到数组的索引功能;如果希望寻找某只股票在若干个交易日或者若干只股票在某个交易日,再或者若干只股票在若干个交易日的涨跌幅情况,就需要用到数组的切片功能。

例三:

一维数组的索引

根据信息,投资者希望找到工商银行这只股票在2018年9月5日的涨跌幅,对应于数组中第2行第3列,具体的代码如下:

stock_return[1,2]
输出结果如下: 760813a2b892fc9545f8e6910e18b978.png 68989c9f80b35dfc46f5e7ce02d4ccaf.png

注意,第一个参数代表的是第几行,第二个参数代表第几列,并且是从0开始。

例四:

二维数组的索引

根据信息,投资者希望找出涨跌幅低于-1%的数据所在数组中的索引值,具体的代码如下:

np.where(stock_return<-0.01)
输出结果如下: e3f44f15176546e863fdcec4e0c9ca41.png 68989c9f80b35dfc46f5e7ce02d4ccaf.png

需要说明一下,由于数组stock_return 是一个二维数组,因此对应的索引值必然对应着两个数值,一个代表第几行,另一个代表第几列。因此,在输出结果中,第1个数组代表行的索引值,第2个数组代表列的索引值。比如,在输出的结果中,第1个数组的第1个元素是1,第2个数组的第一个元素是2,这就是表明涨跌幅低于-1%的第1个数值是在第2行、第3列;再比如,第1个数组的第3个元素是3,第2个数组的第3个元素是0,这就是表明涨跌幅低于-1%的第3个数值是在第4行、第1列,以此类推。

例五:

数组的切片

根据信息,投资者希望提取上汽集团、宝钢股份在2018年9日4日至9月6日的涨跌幅数据,也就是提取第3行、第4行中第2~4列的数据,具体的代码如下:

stock_return[2:,1:4]
输出结果如下: 62a716eafa7e8f9a398dc1bd2aaafa94.png 68989c9f80b35dfc46f5e7ce02d4ccaf.png

注意,在中括号中,2:代表选择从第3行开始一直到最后行,1:4代表了选择第2列至第4列。

例六:

数组的切片

根据信息,投资者希望分别提取第2行的全部数据和第3列的全部数据,相关的操作如下:

stock_return[1]  #提取第二行的全部数据
stock_return[:,2]  #提取第三列的全部数据
输出结果如下: ec3c96cbfc603e2e2c1ee58e13f196d1.png

以本章开头的例子作为示例进行讨论。假定投资者需要计算2018年9月3日至9月7日这5个交易日中,相关股票的平均涨跌幅、累积涨跌幅、 最大或者最小涨跌幅等指标,就可以运用数组的内部元素之间的计算。

数组内的计算有求和(sum函数)、求乘积(prod函数)、求最值(max、min函数)、求均值(mean函数)、求方差和标准差(var、std函数)、幂运算(sqrt、square、exp函数)、对数运算(log函数)等。我们演示操作两种。

例七:

数组的运算

根据信息,投资者按照stock_return数组中的列、行分别求和,具体的代码如下:

stock_return.sum(axis=0)   #按照列求和
stock_return.sum(axis=1)   #按照行求和
stock_return.sum()   #全部元素求和
输出结果如下: a0db91b7e84ab24b920590847a4b7328.png 68989c9f80b35dfc46f5e7ce02d4ccaf.png

注意,axis=0代表按列求和,axis=1代表按行求和。不输入参数表示对所有元素求和。

例八:

数组内的运算

根据信息,投资者对stock_return数组中每个元素分别计算自然对数、底数10的对数、底数2的对数,具体的代码如下:

np.log(stock_return)
np.log10(stock_return)
np.log2(stock_return)
输出结果 如下: 88add7d23b9a69db7c329eb006dd35a3.png 68989c9f80b35dfc46f5e7ce02d4ccaf.png

注意,由于对数仅适用于正数,因此,负数的对数在Python中显示为nan,表示无解。

例九:

数组间运算

如果两个数组a和b形状相同,即满足a.shape == b.shape,那么a*b的结果就是a与b数组对应位相乘。这要求维数相同,且各维度的长度相同。如下图例子所示:

a=np.array([1,2,3,4])
b=np.array([10,20,30,40])
c=a*b
print(c)
输出结果如下: b13e49bf59d8482baa19c185aba04903.png

Numpy除了拥有这些基本功能外,还拥有强大的广播功能。广播是numpy对不同形状的数组进行数值计算的方式,对数组的算术运算通常在相应的元素上进行。

例十:

广播功能

当运算中的2个数组的形状不同时,numpy将自动触发广播机制。如下图例子所示:

a=np.array([[0,0,0],[10,10,10],[20,20,20],[30,30,30]])
b=np.array([1,2,3])
print(a+b)
输出结果如下: 76a9dce9118423041ba3829ee87badfc.png

下图展示了两个数组通过广播兼容:

d6bb6c2d486e082552860d4cb431d74a.png 4db64161acf23c1a2f90070f16efe27e.png

什么是matplotlib?

Matplotlib是Python的绘图库。仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,散点图等。

下面展示了常用的绘图函数:

8f09fa0ffa8f603e7ee29c2952cc086c.png 下面是一些绘图时的参数: b766e3f4baa911ea60383ab07d58bce4.png

绘制图形过程中经常需要选择不同的颜色,下面是一些常用的颜色参数:

aa7dbd5e29b856e596045def62082096.png

此外,关于样式或者标记也有许多参数可以选择:

5e2f0fb2d23b0b60cc507f3cd4250db6.png 51dd7f458b0f3eb84ac7d81a633a8340.png

总的来看,绘图的组件如下图显示:

c60f9911aa72663e99fc45cb08df5709.png

同时,如果要Matplotlib输出的图形显示中文字体,运用以下代码:

import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False

例十一:

直线图

绘制一个函数为y=2x+5的直线图,具体代码如下:

import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1,11,2) 
y =  2  * x +  5 
plt.title("直线图") 
plt.xlabel("x轴") 
plt.ylabel("y轴") 
plt.plot(x,y) 
plt.show()
输出结果如下: 38bc8890ad49932ed1272381fc64d052.png 68989c9f80b35dfc46f5e7ce02d4ccaf.png

前两行导入外部模块Numpy和Matplotlib,接着输入有关参数,就可以很容易得到图像。

例十二:

正弦波图

绘制一个正弦波图,具体代码如下:

x = np.arange(0,  2  * np.pi,0.1) 
y = np.sin(x)
plt.title("正弦波图")  
# 使用 matplotlib 来绘制点
plt.plot(x, y) 
plt.show()
输出结果如下: 4936f243960f4e4c18b8e384b5424a1c.png

例十三:

散点图

绘制一个数据服从正态分布的散点图,具体代码如下:

import numpy as np
from pylab import mpl
import matplotlib.pyplot as plt
n =100000
X = np.random.normal(0,1,n)
Y = np.random.normal(0,1,n)

plt.scatter(X,Y)
输出结果如下: 1a3424c0ef0696fdcb2983a2b269d819.png

例十四:

柱形图

绘制一个两组数据的柱形图,具体代码如下:

plt.figure(3)
x_index = np.arange(5)   #柱的索引
x_data = ('A', 'B', 'C', 'D', 'E')
y1_data = (20, 35, 30, 35, 27)
y2_data = (25, 32, 34, 20, 25)
bar_width = 0.35   #定义一个数字代表每个独立柱的宽度

rects1 = plt.bar(x_index, y1_data, width=bar_width,alpha=0.4, color='b',label='柱1')          
#参数:左偏移、高度、柱宽、透明度、颜色、图例
rects2 = plt.bar(x_index + bar_width, y2_data, width=bar_width,alpha=0.5,color='r',label='柱2') 
#参数:左偏移、高度、柱宽、透明度、颜色、图例
#关于左偏移,不用关心每根柱的中心不中心,因为只要把刻度线设置在柱的中间就可以了
plt.xticks(x_index + bar_width/2, x_data)   #x轴刻度线
plt.legend()    #显示图例
plt.tight_layout()  #自动控制图像外部边缘,此方法不能够很好的控制图像间的间隔
plt.show()
输出结果如下: 02c28afdd26fcb4eba5f9968c34817e3.png

例十五:

直方图

绘制一个两组数据的直方图,具体代码如下:

fig,(ax0,ax1) = plt.subplots(nrows=2,figsize=(9,6))     #在窗口上添加2个子图
sigma = 1   #标准差
mean = 0    #均值
x=mean+sigma*np.random.randn(10000)   #正态分布随机数
ax0.hist(x,bins=40,density=False,histtype='bar',facecolor='green',alpha=0.8)
#normed是否归一化,histtype直方图类型,facecolor颜色,alpha透明度
ax1.hist(x,bins=20,density=1,histtype='bar',facecolor='pink',alpha=1,cumulative=True,rwidth=0.8)
#bins柱子的个数,cumulative是否计算累加分布,rwidth柱子宽度
plt.show()  #所有窗口运行
输出结果如下: 997dbdd1f26152c5e461bda084a8b77e.png

例十六:

三维图

绘制一个三维图,具体代码如下:

from pylab import mpl
from mpl_toolkits.mplot3d import Axes3D  #绘制三维图

fig = figure()
ax = Axes3D(fig)
X = np.arange(-4, 4, 0.25)  #获取x轴数据
Y = np.arange(-4, 4, 0.25)  #获取y轴数据
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)  #获取z轴数据

ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='hot')  #绘制三维图表面

show()
输出结果如下: 8709e4d458979f1fd4a80382af60fea7.png

除了基本的绘图,我们还需要对多子图的展现有一定了解:

在matplotlib中,整个图像为一个Figure对象。在Figure对象中可以包含一个或者多个Axes对象。每个Axes(ax)对象都是一个拥有自己坐标系统的绘图区域。在matplotlib中,整个图像为一个Figure对象。在Figure对象中可以包含一个或者多个Axes对象。每个Axes(ax)对象都是一个拥有自己坐标系统的绘图区域。

一个"Figure"意味着用户交互的整个窗口。在这个figure中容纳着"subplots"

08dc6eb1ca9e0639bdf1751cfc9db258.png

下面的代码是三个子图展示的案例:

import numpy 后面那个1表示第1个子图。那个数字的变化来定位不同的子图。下面的分割方式是先2*2分出4块,然后取1、2块,然后再2*1分出两块,取第2块。'''

c6a45e0da5bd5d8b9d70839281e9ed43.png

上面的代码中我们用sca来选择了子图。如果不对子图进行选择的话(可以尝试将3个plt.sca注释),所有的图会挤到最后一个子图中:

d7e366a5f188f0b34e18a44fc71ecbe6.png

利用matplotlib还可以对图像中的点进行色彩深浅和形状大小的映射,从而将原本最多的3个维度转换成5个维度,这样可以将数据的关系看得更清楚。下图就利用画散点图的c和s参数映射到数据color和shape,所以图中颜色越深的点直径也越大(在jupyterlab中下图是不可以旋转的,可以考虑画2维平面+颜色+形状的4个维度的映射,或者使用可以Pycharm进行画图,这个IDE工具生成的图可以旋转)。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

x = np.random.random(100)
y = np.random.random(100)
z = np.random.random(100)
#color和shape的一样
color = np.arange(100)
shape = np.arange(100)

cmap = plt.cm.get_cmap('YlGnBu')

fig = plt.figure(figsize=(30,10))
ax = fig.add_subplot(121, projection='3d')

sc = ax.scatter(x, y, z, c=color, s=shape,
                cmap=cmap)
cbar = plt.colorbar(sc)
plt.xlabel('x')
plt.ylabel('y')

a082f9fea38ee0b721d9294f505cf995.png

6af0567e8800e948a3d85a4e81495a22.png

其实Python数据分析包含的知识还有很多,这篇推送也只能简单的介绍其中一部分内容,感兴趣的同学还可以通过Python菜鸟教程和Matplotlib官网http://matplotlib.org/,尤其是官网的案例进行深度学习。学习时建议对Matplotlib的常用操作熟悉,学习工作中需要用到特殊图表的时候直接去官网看案例的演示图的代码,可以满足你绝大部分的需求。

77d021765f05a31b7e5e665340810592.png

下一篇会讲Pandas数据分析的知识,请持续关注。

本期撰写人:徐博凡

南京审计大学2018级CFA3班

邮箱:1300432158@qq.com

公众号:甫十寸 

南京审计大学CFA

f20aa4231c22079f40f68ae550e9364a.png

推进CFA学术交流,集聚南审CFA校友资源

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值