第3天:一大波金融Library来袭之numpy篇

Python在量化金融中运用最广泛的几个Library:

numpy

scipy

pandas

matplotlib

NumPy 简介

逐渐出现了关于Python的大量外部扩展,NumPy (Numeric Python)就是其中之一。NumPy提供了大量的数值编程工具,可以方便地处理向量、矩阵等运算,极大地便利了人们在科学计算方面的工作。

"from numpy import *"

Python的外部扩展成千上万,在使用中很可能会import好几个外部扩展模块,如果某个模块包含的属性和方法与另一个模块同名,就必须使用import module来避免名字的冲突。所以这前缀最好还是带上。

那有没有简单的办法呢?有的,我们可以在import扩展模块时添加模块在程序中的别名,调用时就不必写成全名了,例如,我们使用"np"作为别名并调用version.full_version函数:

import numpy as np
np.version.full_version

'1.8.0'

二、NumPy对象:数组

NumPy中的基本对象是同类型的多维数组(homogeneous multidimensional array)

a = np.arange(20)
print a

[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]

type(a)

numpy.ndarray

a = a.reshape(4, 5)
print a
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]]

构造更高维的也没问题:

a = a.reshape(2, 2, 5)
[[[ 0  1  2  3  4]
  [ 5  6  7  8  9]]

 [[10 11 12 13 14]
  [15 16 17 18 19]]]

既然a是array,我们还可以调用array的函数进一步查看a的相关属性:"ndim"查看维度;"shape"查看各维度的大小;"size"查看全部的元素个数,等于各维度大小的乘积;"dtype"可查看元素类型;"dsize"查看元素占位(bytes)大小。

a.ndim

3a.shape

(2, 2, 5)

a.size

20

a.dtype

dtype('int64')

三、创建数组

数组的创建可通过转换列表实现,高维数组可通过转换嵌套列表实现:

raw = [0,1,2,3,4]
a= np.array(raw) #[0 1 2 3 4]
raw = [[0,1,2,3,4], [5,6,7,8,9]]​​​​​​​
b = np.array(raw)
#[[0 1 2 3 4]
# [5 6 7 8 9]]

一些特殊的数组有特别定制的命令生成,如4*5的全零矩阵:

 

d = (4, 5)
np.zeros(d)

 

array([[ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.]])

默认生成的类型是浮点型,可以通过指定类型改为整型:

np.ones(d, dtype=int)

[0, 1)区间的随机数数组:

np.random.rand(5)

array([ 0.7261,  0.9573,  0.388 ,  0.4874,  0.1617])

四、数组操作

简单的四则运算已经重载过了,全部的’+’,’-’,’*’,’/'运算都是基于全部的数组元素的,以加法为例:

a = np.array([[1.0, 2], [2, 4]])
b = np.array([[3.2, 1.5], [2.5, 4]])
print(a+b)
[[ 4.2  3.5]
 [ 4.5  8. ]]

这里可以发现,a中虽然仅有一个与元素是浮点数,其余均为整数,在处理中Python会自动将整数转换为浮点数(因为数组是同质的),并且,两个二维数组相加要求各维度大小相同。当然,NumPy里这些运算符也可以对标量和数组操作,结果是数组的全部元素对应这个标量进行运算,

print 3 * a
[[  3.   6.]
 [  6.  12.]]

类似C++,’+=’、’-=’、’*=’、’/='操作符在NumPy中同样支持:

开根号求指数也很容易:

print np.exp(a)
print np.sqrt(a)
print np.square(a)
print np.power(a, 3)

需要知道二维数组的最大最小值怎么办?想计算全部元素的和、按行求和、按列求和怎么办?for循环吗?不,NumPy的ndarray类已经做好函数了:

a = np.arange(20).reshape(4,5)
print (a)
print ("sum of all elements in a: " + str(a.sum()))
print ("maximum element in a: " + str(a.max()))
print ("minimum element in a: " + str(a.min()))
print ("maximum element in each row of a: " + str(a.max(axis=1)))
print ("minimum element in each column of a: " + str(a.min(axis=0)))
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]]
sum of all elements in a: 190
maximum element in a: 19
minimum element in a: 0
maximum element in each row of a: [ 4  9 14 19]
minimum element in each column of a: [0 1 2 3 4]

NumPy同时提供了矩阵对象(matrix)。矩阵对象和数组的主要有两点差别:一是矩阵是二维的,而数组的可以是任意正整数维;二是矩阵的’*‘操作符进行的是矩阵乘法,乘号左侧的矩阵列和乘号右侧的矩阵行要相等,而在数组中’*'操作符进行的是每一元素的对应相乘,乘号两侧的数组每一维大小需要一致。数组可以通过asmatrix或者mat转换为矩阵,或者直接生成也可以:

a = np.arange(20).reshape(4, 5)
a = np.asmatrix(a)
print (type(a)) #<class 'numpy.matrixlib.defmatrix.matrix'>
b = np.matrix('1.0 2.0; 3.0 4.0')
print (type(b)) #<class 'numpy.matrixlib.defmatrix.matrix'>
b = np.arange(2, 45, 3).reshape(5, 3)
print(b)
b = np.mat(b)
print(b)
[[ 2  5  8]
 [11 14 17]
 [20 23 26]
 [29 32 35]
 [38 41 44]]
[[ 2  5  8]
 [11 14 17]
 [20 23 26]
 [29 32 35]
 [38 41 44]]np.linspace(0, 2, 9)

array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ,  1.25,  1.5 ,  1.75,  2.  ])

五、数组元素访问

数组和矩阵元素的访问可通过下标进行,以下均以二维数组(或矩阵)为例:

a = np.array([[3.2, 1.5], [2.5, 4]])
print(a[0][1])
print(a[0, 1])
1.5
1.5b = a

原因在于Python不是真正将a复制一份给b,而是将b指到了a对应数据的内存地址上。想要真正的复制一份a给b,可以使用copy:

b = a.copy()

利用’:'可以访问到某一维的全部数据,例如取矩阵中的指定列:

a = np.arange(20).reshape(4, 5)
print (a[:,[1,3]])
print (a[:,[1]])
print (a[:,1])
[[ 1  3]
 [ 6  8]
 [11 13]
 [16 18]]
[[ 1]
 [ 6]
 [11]
 [16]]
[ 1  6 11 16]

稍微复杂一些,我们尝试取出满足某些条件的元素,将第一列大于5的元素(10和15)对应的第三列元素(12和17)取出来:

a[:, 2][a[:, 0] > 5]  #array([12, 17])  

可使用where函数查找特定值在数组中的位置:

print(a)
loc = np.where(a==11)
print(loc)
print (a[loc[0][0], loc[1][0]])  #11
# [[ 0  1  2  3  4]
#  [ 5  6  7  8  9]
#  [10 11 12 13 14]
#  [15 16 17 18 19]]
# (array([2], dtype=int64), array([1], dtype=int64))

六、数组操作

矩阵转置:

a = np.random.rand(2,4)
print (a)
a = np.transpose(a) #转置阵
print ("a is an array, by using transpose(a):")
print (a)
b = np.random.rand(2,4)
b = np.mat(b)
print (b)
print ("b is a matrix, by using b.T:")
print (b.T) #转置阵
# [[ 0.5767  0.0306  0.0309  0.8471]
#  [ 0.7568  0.8851  0.1031  0.3775]]
# a is an array, by using transpose(a):
# [[ 0.5767  0.7568]
#  [ 0.0306  0.8851]
#  [ 0.0309  0.1031]
#  [ 0.8471  0.3775]]
# [[ 0.0197  0.8156  0.6196  0.4281]
#  [ 0.393   0.5539  0.3431  0.1927]]
# b is a matrix, by using b.T:
# [[ 0.0197  0.393 ]
#  [ 0.8156  0.5539]
#  [ 0.6196  0.3431]
#  [ 0.4281  0.1927]]

矩阵求逆:

import numpy.linalg as nlg

a = np.random.rand(2,2)
a = np.mat(a)
print (a)
ia = nlg.inv(a)
print (ia)
print (a * ia)
# [[ 0.512   0.3824]
#  [ 0.3855  0.579 ]]
# [[ 3.8834 -2.5644]
#  [-2.5852  3.4342]]
# [[ 1.  0.]
#  [ 0.  1.]]

求特征值和特征向量

a = np.random.rand(3,3)
eig_value, eig_vector = nlg.eig(a)
print (eig_value)
print (eig_vector)
# [ 1.2348 -0.2653  0.4338]
# [[ 0.6992  0.7358  0.1208]
#  [ 0.4979 -0.4632 -0.935 ]
#  [ 0.5131 -0.494   0.3334]]

按列拼接两个向量成一个矩阵:

a = np.array((1,2,3))
b = np.array((7,8,9))
print(a)
print(b)
print (np.column_stack((a,b)))
# [1 2 3]
# [7 8 9]
# [[1 7]
#  [2 8]
#  [3 9]]

拼接成一个矩阵,可以通过vstack和hstack完成:

a = np.random.rand(2,2)
b = np.random.rand(2,2)
print (a)
print (b)
c = np.hstack([a,b])
d = np.vstack([a,b])
print (c)
print (d)
# [[ 0.3145  0.1903]
#  [ 0.4647  0.383 ]]
# [[ 0.1069  0.7182]
#  [ 0.3543  0.5928]]
# [[ 0.3145  0.1903  0.1069  0.7182]
#  [ 0.4647  0.383   0.3543  0.5928]]
# [[ 0.3145  0.1903]
#  [ 0.4647  0.383 ]
#  [ 0.1069  0.7182]
#  [ 0.3543  0.5928]]

七、缺失值

NumPy提供nan作为缺失值的记录,通过isnan判定。

a = np.random.rand(2,2)
a[0, 1] = np.nan
print (np.isnan(a))
# [[False  True]
#  [False False]]

nan_to_num可用来将nan替换成0,在后面会介绍到的更高级的模块pandas时,我们将看到pandas提供能指定nan替换值的函数。

print (np.nan_to_num(a))
# [[ 0.0177  0.    ]
#  [ 0.9551  0.6671]]

NumPy还有很多的函数,想详细了解可参考链接http://wiki.scipy.org/Numpy_Example_List 和 http://docs.scipy.org/doc/numpy

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值