赞
踩
7.NumPy专用函数
NumPy针对金融计算或信号处理方面的特殊的需求有很多专用函数。
NumPy提供了多种排序函数:
sort()函数返回排序后的数组
lexsort()函数根据键值的字典序进行排序
argsort()函数返回输入数组排序后的下标
ndarray类的sort()方法可对数组进行原地排序
msort()函数沿着第一个轴排序
sort_complex()函数对复数按照先实部后虚部的顺序进行排序
其中,argsort和sort函数可用来对NumPy数组类型进行排序。
import numpy as np
import datetime
#处理日期的转换函数
def datestr2num(s):
return datetime.datetime.strptime(s.decode('ascii'), "%d-%m-%Y").toordinal()
dates, closes = np.loadtxt('AAPL.csv', delimiter=',', usecols=(1, 6), converters={1: datestr2num}, unpack=True)
# 使用lexsort()函数排序(按照收盘价排序)
indices = np.lexsort((dates, closes))
print("Indices", indices)
print(["%s %s" % (datetime.date.fromordinal(int(dates[i])), closes[i]) for i in indices])
复数包含实数部分和虚数部分,NumPy中有专门的复数类型,使用两个浮点数来表示复数。这些复数可以使用NumPy的sort_complex()函数进行排序,照先实部后虚部的顺序排序。
import numpy as np
np.random.seed(42)
complex_numbers = np.random.random(5) + 1j * np.random.random(5)
print("Complex numbers\n", complex_numbers)
print("Sorted\n", np.sort_complex(complex_numbers))
# NumPy中有多个函数可以在数组中进行搜索
# argmax函数返回数组中最大值对应的下标。
a = np.array([2, 4, 8])
print(np.argmax(a))
print(np.argmin(a))
# nanargmax函数提供相同的功能,但忽略NaN值
b = np.array([np.nan, 2, 4])
print(np.nanargmax(b))
# argmin和nanargmin函数的功能类似,只不过换成了最小值。
# argwhere函数根据条件搜索非零的元素,并分组返回对应的下标。
a = np.array([2, 4, 8])
print(np.argwhere(a <= 4))
searchsorted()函数为指定的插入值返回一个在有序数组中的索引位置,从这个位置插入可以保持数组的有序性。
# searchsorted()函数为指定的插入值返回一个在有序数组中的索引位置,从这个位置插入可以保持数组的有序性
import numpy as np
a = np.arange(5)
print("a",a)
indices = np.searchsorted(a, [-2, 7])
print("Indices", indices)
print("The full array", np.insert(a, indices, [-2, 7]))
extract()函数可以根据某个条件从数组中抽取元素。nonzero()函数专门用来抽取非零的数组元素。
import numpy as np
a = np.arange(-5,7)
print(a)
condition = (a % 2) == 0
print("Even numbers", np.extract(condition, a))
print("Non zero", np.nonzero(a))
NumPy中有很多金融函数:
fv函数计算所谓的终值(future value),即基于一些假设给出的某个金融资产在未来某一 时间点的价值
pv函数计算现值(present value),即金融资产当前的价值。
npv函数返回的是净现值(net present value),即按折现率计算的净现金流之和。
pmt函数根据本金和利率计算每期需支付的金额。
irr函数计算内部收益率(internal rate of return)。内部收益率是是净现值为0时的有效利率,不考虑通胀因素
mirr函数计算修正后内部收益率(modified internal rate of return),是内部收益率的改进版本
nper函数计算定期付款的期数。
rate函数计算利率(rate of interest)
# 计算终值
# pip install numpy-financial
import numpy_financial as npf
from matplotlib.pyplot import plot, show
# 利率3%、每季度支付金额10、存款周期5年以及现值1000
print("Future value", npf.fv(0.03/4, 5 * 4, -10, -1000))
fvals = []
for i in range(1, 10):
fvals.append(npf.fv(0.03/4, i * 4, -10, -1000))
plot(fvals, 'bo')
show()
# 计算现值
import numpy_financial as npf
from matplotlib.pyplot import plot, show
print("Future value", npf.pv(0.03/4, 5 * 4, -10, 1376.09))
# 计算净现值
import numpy as np
import numpy_financial as npf
cashflows = np.random.randint(100, size=5)
print(cashflows)
cashflows = np.insert(cashflows, 0, -100)
print("Cashflows", cashflows)
print("Net present value", npf.npv(0.03, cashflows))
# 计算内部收益率
import numpy as np
import numpy_financial as npf
cashflows = np.random.randint(100, size=5)
print(cashflows)
cashflows = np.insert(cashflows, 0, -100)
print("Cashflows", cashflows)
print("Net present value", npf.irr(cashflows))
# 计算分期付款
import numpy_financial as npf
# 贷款100万,年利率为10%,用30年还贷款,每月支付资金
print("Payment", npf.pmt(0.10/12, 12 * 30, 1000000))
# 计算付款期数
import numpy_financial as npf
# 贷款9000,年利率10%,每月固定还款100,需要的月数
print("Number of payments", npf.nper(0.10/12, -100, 9000))
# 计算利率
import numpy_financial as npf
print("Interest rate", 12 * npf.rate(167, -100, 9000, 0))
窗函数(window function)是信号处理领域常用的数学函数,相关应用包括谱分析和滤波器设计等。这些窗函数除在给定区间之外取值均为0。NumPy中有很多窗函数,如bartlett、blackman、 hamming、hanning和kaiser。
# 绘制巴特利特窗
import numpy as np
window = np.bartlett(42)
plot(window)
show()
# 绘制布莱克曼窗
import numpy as np
window = np.blackman(30)
plot(window)
show()
# 绘制汉明窗
import numpy as np
window = np.hamming(30)
plot(window)
show()
# 绘制凯泽窗
import numpy as np
window = np.kaiser(30,12)
plot(window)
show()
# 布莱克曼窗形式上为三项余弦值的加和
import numpy as np
from matplotlib.pyplot import plot, show, legend
from matplotlib.dates import datestr2num
import sys
closes=np.loadtxt('AAPL.csv', delimiter=',', usecols=(6,), converters={1:datestr2num}, unpack=True)
N = 6
window = np.blackman(N)
smoothed = np.convolve(window/window.sum(), closes, mode='same')
plot(smoothed[N:-N], lw=2, label="smoothed")
plot(closes[N:-N], label="closes")
legend(loc='best')
show()
贝塞尔函数(Bessel function)是贝塞尔微分方程的标准解函数。在NumPy中,以i0表示第一类修正的零阶贝塞尔函数。
sinc函数在NumPy中有同名函数sinc,并且该函数也有一个二维版本,sinc是一个三角函数。
# 使用NumPy中的i0()函数绘制了第一类修正的零阶贝塞尔函数
import numpy as np
x = np.linspace(0, 4, 100)
vals = np.i0(x)
plot(x, vals)
show()
# 绘制sinc()函数
import numpy as np
x = np.linspace(0, 4, 100)
vals = np.sinc(x)
plot(x, vals)
show()
# 绘制二维的sinc()函数
import numpy as np
from matplotlib.pyplot import imshow, show
x = np.linspace(0, 4, 100)
xx = np.outer(x, x)
vals = np.sinc(xx)
imshow(vals)
show()
介绍了一些专用性较强的NumPy功能,包括排序和搜索、专用函数、金融函数以及窗函数等。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。