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

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

什么是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个交易日整个投资组合的涨跌幅情况。

*案例出自斯文的《基于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

用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_returnstock_return.shape

输出结果如下:

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

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

例三:

一维数组的索引

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

stock_return[1,2]

输出结果如下:

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

例四:

二维数组的索引

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

np.where(stock_return<-0.01)

输出结果如下:

需要说明一下,由于数组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]

输出结果如下:

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

例六:

数组的切片

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

stock_return[1]  #提取第二行的全部数据stock_return[:,2]  #提取第三列的全部数据

输出结果如下:

以本章开头的例子作为示例进行讨论。假定投资者需要计算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()   #全部元素求和

输出结果如下:

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

例八:

数组内的运算

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

np.log(stock_return)np.log10(stock_return)np.log2(stock_return)

输出结果如下:

注意,由于对数仅适用于正数,因此,负数的对数在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*bprint(c)

输出结果如下:

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)

输出结果如下:

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

什么是matplotlib?

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

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

下面是一些绘图时的参数:

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

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

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

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

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

例十一:

直线图

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

import numpy as npimport matplotlib.pyplot as pltx = np.arange(1,11,2) y =  2  * x +  5 plt.title("直线图") plt.xlabel("x轴") plt.ylabel("y轴") plt.plot(x,y) plt.show()

输出结果如下:

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

例十二:

正弦波图

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

x = np.arange(0,  2  * np.pi,0.1) y = np.sin(x)plt.title("正弦波图")  # 使用 matplotlib 来绘制点plt.plot(x, y) plt.show()

输出结果如下:

例十三:

散点图

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

import numpy as npfrom pylab import mplimport matplotlib.pyplot as pltn =100000X = np.random.normal(0,1,n)Y = np.random.normal(0,1,n)

plt.scatter(X,Y)

输出结果如下:

例十四:

柱形图

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

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()

输出结果如下:

例十五:

直方图

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

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()  #所有窗口运行

输出结果如下:

例十六:

三维图

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

from pylab import mplfrom 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()

输出结果如下:

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

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

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

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

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

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

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

import matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dimport 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')

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

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

本期撰写人:徐博凡

南京审计大学2018级CFA3班

邮箱:1300432158@qq.com

公众号:甫十寸

南京审计大学CFA

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

numpy数组某一行求和 python_【Python】No.2 Numpy和Matplotlib初体验相关推荐

  1. python中numpy数组的合并_基于Python中numpy数组的合并实例讲解

    基于Python中numpy数组的合并实例讲解 Python中numpy数组的合并有很多方法,如 - np.append() - np.concatenate() - np.stack() - np. ...

  2. Python使用numpy函数vsplit垂直(行角度)拆分numpy数组(返回拆分后的numpy数组列表)实战:垂直拆分二维numpy数组、split函数垂直拆分二维numpy数组

    Python使用numpy函数vsplit垂直(行角度)拆分numpy数组(返回拆分后的numpy数组列表)实战:垂直拆分二维numpy数组.split函数垂直拆分二维numpy数组 目录

  3. 每日一课 | Python数据可视化—Matplotlib初体验

    04. Matplotlib初体验 大家好,我是小C,上期给大家分享--Python数据可视化-如何做好启动准备(小白必读) 本期分享内容:Python数据可视化-Matplotlib初体验 本期小C ...

  4. python输入数组并计算_利用Python进行数据分析——Numpy基础:数组和矢量计算

    利用Python进行数据分析--Numpy基础:数组和矢量计算 ndarry,一个具有矢量运算和复杂广播能力快速节省空间的多维数组 对整组数据进行快速运算的标准数学函数,无需for-loop 用于读写 ...

  5. numpy 矩阵乘法_一起学习Python常用模块——numpy

    关注微信公众号:一个数据人的自留地 作者介绍 知乎@王多鱼 百度的一名推荐算法攻城狮. 主要负责商品推荐的召回和排序模型的优化工作. 1 前言 Python在数据科学.机器学习.AI领等域中占据主导地 ...

  6. python简单体育竞技模拟_python初体验 —— 模拟体育竞技

    python初体验 -->>> 模拟体育竞技 一.排球训练营 1. 简介: 模拟不同的两个队伍进行排球的模拟比赛. 2. 模拟原理: 通过输入各自的能力值(Ⅰ),模拟比赛的进行( P ...

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

    上一次推送,我们了解了Python安装部署和conda管理,为后续的Python学习打下了基础,这次我们进入数据分析模块. Pandas.Numpy和Matplotlib被称为"数据分析三剑 ...

  8. python输入输出流详解_Python 初体验之 输入输出流

    任何一个语言都有他的输入输出,对于文件的操作是非常有用的.在Java中曾经有对象序列化这么一个概念,在 Python中同样可以对对象进行序列化然后存放到文件中去,同时还能从文件中再读取出来,估计也可以 ...

  9. python os.system 不打印_Python初体验之我爱你

    前言 大家好,我是阿皮.接下来的一段时间就让我们一起学习python吧! 阿皮会和大家一起学习,因为阿皮也是一个小白呢!(当然阿皮报了某编程的课,不会误导大家的,阿皮会结合自己的理解和大家分享的) 阿 ...

  10. python win10 ffmpeg_win10系统ffmpeg命令初体验

    一.下载配置 1.1 官网下载地址: 1.2 选择系统对应的压缩包下载 (我这里是用window系统测试) 点击跳转后页面如下,根据操作下载 1.3 配置环境变量 ① 把压缩包解压到指定的目录下 ② ...

最新文章

  1. 一道腾讯面试题:如何快速判断某 URL 是否在 20 亿的网址 URL 集合中?布隆过滤器...
  2. 数据库系统概论:第十章 数据库恢复技术
  3. win32 断言函数和转换到COFF期间失败错误
  4. 科大星云诗社动态20201227
  5. Sentinel-Dashboard 与 apollo 规则的相互同步
  6. python代码技巧_让你python代码更快的3个小技巧
  7. day25 crm 权限管理 通用的增删改查框架
  8. 水晶报表的使用经验和资料总结
  9. 实战NSURLProtocol 拦截 APP网络请求NSURLConnection, NSURLSession, Alamofire
  10. QThread如何优雅实现暂停(挂起)功能
  11. 奥城大学计算机专业,美国硕士双录取院校一览表:
  12. [ZZ]一名IT从业者的英语口语能力成长路径
  13. 华为手机怎么用计算机玩隐藏空间,华为隐私空间怎么用?开启隐私空间私人信息存储更安全...
  14. java 序列化 内存溢出_Gson序列化问题导致的内存溢出,tip:Background sticky concurrent mark sweep GC freed...
  15. 1万小时贫穷定律:为什么你越忙越穷
  16. 系统servlet、request知识付费(List/Map/Set)小程序开发
  17. 无线打印服务器评测,打印服务器试用体验
  18. 解决JSCH的sftp连接时出现的com.jcraft.jsch.JSchException: Session.connect: java.io.IOException: End of IO Stre
  19. 如何检查 MDAC 版本
  20. 粗谈云端概念及首次写博客感悟

热门文章

  1. [原创].Net中绑定到DataView的问题
  2. spring扩展点一:BeanDefinitionRegistryPostProcessor
  3. Spring源码之getBean(获取 bean)方法(一)解读
  4. [easyui] - 在easyui的table中展示提示框
  5. iOS,QRCord(矩阵二维码)
  6. linux如何正确关机,重启
  7. 关于多表的leftJoin(转)
  8. 一个奇怪现象的分析过程
  9. [Android Studio]-基本快捷键大全
  10. Luogu1712 [NOI2016] 区间