![]() |
3.1 NumPy的使用 |
NumPy 是高性能科学计算和数据分析的基础包,是本章接下来要讲解的 Pandas、Scikit-Learn、StatModels等库的构建基础。NumPy的主要功能在第1章中已经有所介绍,对于一般的金融数据分析而言,其大部分功能可由更高级的 Pandas 实现。我们并不需要在学习NumPy上花费过多精力,但是回过头来深入学习NumPy可以帮助我们更好地理解面向数组编程的思维方式。
在本书中对NumPy的引入约定为:
In [1]:import numpy as np
因此,一旦在代码中看到np,就是使用了NumPy。
NumPy 的主要对象是 ndarray,该对象是一个快速、灵活的大数据容器。在此需要注意,在ndarray与Python中内置的list、tuple并不相同:在Python中,元素的数据类型可以不同;而在ndarray中,所有元素的数据类型必须相同。
首先,我们利用NumPy中的array函数创建一个一维ndarray:
等长序列组成的列表将会被转换为一个多维数组:
除了np.array函数,还有其他函数可以快速创建数组:
dtype代表ndarray中元素的数据类型,数据类型有很多,对于新手来说,要全部记住这些数据类型是十分困难的。不过没有关系,在大部分数据分析工作中,我们只需要知道float(浮点数)、int(整数)、bool(布尔值)、string_(字符串)、unicode_就可以了。若想了解更多的数据类型,则可以查阅NumPy的文档。
接下来举几个例子,代码如下:
在不同的数据类型之间也能互相转换:
索引切片的操作类似于Python的内置函数list,只不过是从一维拓展到多维而已。首先,我们创建一个3×3的ndarray:
需要注意的是,在将一个标量赋值给一个切片时,该值会被广播到整个切片视图上,并直接对源数组进行修改。如果我们想避免改变源数组,则可以使用copy函数:
ndarray 的一大特色就是可以将代码向量化。所谓向量化,就是对一个复杂的对象进行整体操作,而不是对其中的单个元素进行循环。NumPy 的大部分代码都是由 C 语言编写的,并且进行了高度优化,这大大加快了计算速度。
简单的数学运算可以直接在ndarray上运行,例如:
在 NumPy 中还有一些内置的数学函数,可以帮助我们快速地对数据进行统计计算,比如sum、max、mean、std等。
表3-1列出了基本的数组统计方法。
表3-1 基本的数组统计方法
我们也可以自定义函数,再将其传入ndarray中:
NumPy还可以用来生成伪随机数,负责这一功能的是其子库numpy.random。
首先,导入 numpy.random。为了更直观地展示随机数的生成过程,这里同时导入了Matplotlib,以将结果可视化:
例如,npr.rand函数可以用来生成[0,1)的随机多维数组:
稍微开动一下大脑,就可以将随机区间转化为[2,4):
表3-2展示了生成简单随机数的函数及其参数和描述。
表3-2
然后,对表3-2中部分函数生成的随机数进行可视化,效果如图3-1所示。
图3-1
许多金融模型,例如 BSM 模型、跳跃扩散模型、平方根扩散模型等,都依赖于正态分布。我们可以通过生成相应的随机数,来将原本连续的金融模型离散化,从而进行近似模拟。在npr.random模块中内置了很多分布函数,这里限于篇幅不再全面展示,感兴趣的读者可以自行查阅NumPy的文档。
作为例子,我们将如下分布的随机数进行可视化。
(1)n=100、P=0.3的二项分布。
(2)均值为10、标准差为2的正态分布。
(3)自由度为0.5的卡方分布。
(4)λ为2的泊松分布。
相应的代码如下:
其可视化效果如图3-2所示。
图3-2