【Python数据分析—NumPy】7.NumPy专用函数

7.NumPy专用函数



前言

  NumPy针对金融计算或信号处理方面的特殊的需求有很多专用函数。


1、排序(np.lexsort())

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

2、复数排序(np.sort_complex())

  复数包含实数部分和虚数部分,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))

3、搜索(np.argmax()、np.argmin()、np.nanargmax()、np.argwhere()、np.searchsorted()、np.insert()、np.extract()、np.nonzero())

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

4、金融函数

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

5、窗函数

  窗函数(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()

6、专用数学函数(np.i0()、np.sinc())

  贝塞尔函数(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功能,包括排序和搜索、专用函数、金融函数以及窗函数等。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器视觉小学徒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值