NumPy 特殊例程

NumPy 特殊例程

# 来源:NumPy Biginner's Guide 2e ch7

字典排序

import numpy as np
import datetime

# 日期转成字符串
def datestr2num(s):
    return datetime.datetime.strptime(s, "%d-%m-%Y").toordinal()

# 读取 AAPL 的日期和收盘价
# 并转换日期格式
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]
'''
['2011-01-28 336.1', '2011-02-22 338.61', '2011-01-31 339.32', '2011-02-23 342.62', '2011-02-24 342.88', '2011-02-03 343.44', '2011-02-02 344.32', '2011-02-01 345.03', '2011-02-04 346.5', '2011-03-10 346.67', '2011-02-25 348.16', '2011-03-01 349.31', '2011-02-18 350.56', '2011-02-07 351.88', '2011-03-11 351.99', '2011-03-02 352.12', '2011-03-09 352.47', '2011-02-28 353.21', '2011-02-10 354.54', '2011-02-08 355.2', '2011-03-07 355.36', '2011-03-08 355.76', '2011-02-11 356.85', '2011-02-09 358.16', '2011-02-17 358.3', '2011-02-14 359.18', '2011-03-03 359.56', '2011-02-15 359.9', '2011-03-04 360.0', '2011-02-16 363.13']
'''

复数排序

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

# sort_complex 按照先实部后虚部的顺序对复数排序
print "Sorted\n", np.sort_complex(complex_numbers)
'''
Sorted
[ 0.39342751+0.34955771j  0.40597665+0.77477433j  0.41516850+0.26221878j
  0.86631422+0.74612422j  0.92293095+0.81335691j]
'''

使用 searchsorted

import numpy as np

a = np.arange(5)

# searchsorted 的第一个参数 a 是有序数组
# 第二个参数 v 是插入值的数组
# 返回插入值在有序数组中的位置
indices = np.searchsorted(a, [-2, 7])
print "Indices", indices
# Indices [0 5]

# 将这些值插入后,数组也能保持有序
print "The full array", np.insert(a, indices, [-2, 7])
# The full array [-2  0  1  2  3  4  7]

从数组移除元素

import numpy as np

a = np.arange(7)

# condition 是一个布尔索引
condition = (a % 2) == 0

# extract 从 a 中选取条件为 condition 的元素
# 等价于 a[conditon]
print "Even numbers", np.extract(condition, a)
# Even numbers [0 2 4 6]

# nonzero 选取 a 的非零元素
# 等价于 a[a != 0]
print "Non zero", np.nonzero(a)
# Non zero (array([1, 2, 3, 4, 5, 6]),)

期值与现值预测

import numpy as np
from matplotlib.pyplot import plot, show

# 期值预测
# fv(rate, n, pmt, pv)
# rate:利率,n:周期数量
# pmt:周期性投入,pv:现值
# 这个例子是计算,假设现在你存了 1000 元,之后每个季度多存 10 元,年利率是 3%,五年之后你有多少钱。
# 负值表示你失去的钱
print "Future value", np.fv(0.03/4, 5 * 4, -10, -1000)
# Future value 1376.09633204

fvals = []

# 计算第 i 年有多少钱
for i in xrange(1, 10):
   fvals.append(np.fv(.03/4, i * 4, -10, -1000))

plot(fvals, 'bo')
show()

# 现值预测
# pv(rate, n, pmt, fv)
# fv 为期值,其它同上
# 这个例子是计算,五年后想得到 1376.09633204 元,其它条件同上,现在应存多少钱。
print "Present value", np.pv(0.03/4, 5 * 4, -10, 1376.09633204)
Present value -999.999999999
# Present value -999.999999999

# 周期性投入预测
# pmt(rate, n, pv, fv=0) 参数含义同上
# 假设你贷款 100 万元,利率为 10%,需要在 30 年内还完,每个月需要还多少呢?
print "Payment", np.pmt(0.01/12, 12 * 30, 10000000)
# Payment -32163.9520447

# 周期数量预测
# nper(rate, pmt, fv, pv=0) 参数含义同上
# 假设你贷款 9000 元,利率为 10%,每个月还 100 元
# 多少个月能还完?
print "Number of payments", np.nper(0.10/12, -100, 9000)
# Number of payments 167.047511801

# 利率
# 假设我们知道除了利率之外的其他参数
# rate(n, pmt, pv, fv)
print "Interest rate", 12 * np.rate(167, -100, 9000, 0)
# Interest rate 0.0999756420664

注:

假设现在存入pv元钱(正),之后就不存了,年利率为raten年之后余额是pv * (1 + rate) ** n

如果之后每年都往里面存 pmt 元(正),fv[i] = fv[i - 1] * (1 + rate) + pmt

年数 余额
0 pv
1 pv * (1 + rate) + pmt
2 pv * (1 + rate) ** 2 + pmt * (1 + rate) + pmt
3 pv * (1 + rate) ** 3 + pmt * (1 + rate) ** 2 + pmt * (1 + rate) + pmt
n pv * (1 + rate) ** n + pmt * ((1 + rate) ** n - 1) / rate

np.fv中的pvpmt是负的,求完之后取相反数即可。

计算净现值(NPV)、内部收益率(IRR)

import numpy as np

# 生成五个 100 以内的随机数作为现金流序列
# -100 为初始值
cashflows = np.random.randint(100, size=5)
cashflows = np.insert(cashflows, 0, -100)
print "Cashflows", cashflows
# Cashflows [-100   38   48   90   17   36]

# npv(rate, vals) 计算净现值
# npv = np.sum(vals / (np.ones(length) + rate) ** np.arange(length))
# 其中 l = len(vals)
print "Net present value", np.npv(0.03, cashflows)
# Net present value 107.435682443

# irr(vals) 计算内部收益率
# 满足 npv(irr, vals) == 0
print "Internal rate of return", np.irr([-100, 38, 48, 90,
  17, 36])
# Internal rate of return 0.373420226888

布林窗口

# 布林窗口是三角平滑窗口
# 参数为 n 的布林函数是 (0,0) 到 (n/2,1) 再到 (n,0) 的线段
# bartlett 函数返回布林窗口函数值的数组,x 范围从 0 到 n
window = np.bartlett(42)
plot(window)
show()

使用布莱克曼窗口来平滑股票价格

import numpy as np
from matplotlib.pyplot import plot, show, legend
from matplotlib.dates import datestr2num
import sys

# 获取 AAPL 收盘价
closes=np.loadtxt('AAPL.csv', delimiter=',', usecols=(6,), converters={1:datestr2num}, unpack=True)

# 读入天数
N = int(sys.argv[1])

# 创建布莱克曼窗口
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()

汉明窗口

# 使用方法同布林窗口
window = np.hamming(42)
plot(window)
show()

凯撒窗口

# kaiser(M, beta)
window = np.kaiser(42, 14)
plot(window)
show()

修正贝塞尔函数

x = np.linspace(0, 4, 100)
vals = np.i0(x)
plot(x, vals)
show()

sinc 函数

# sinc(x) = sin(pi * x) / (pi * x)
# 在 0 处取极限值 1
x = np.linspace(0, 4, 100)
vals = np.sinc(x)
plot(x, vals)
show()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容