python數據處理——Numpy特殊例程

轉載自:https://www.jianshu.com/p/dcc02facd405

字典排序:

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章