1. 程式人生 > >《Python資料分析基礎教程:Numpy學習指南》- 速記

《Python資料分析基礎教程:Numpy學習指南》- 速記

3.2 讀寫檔案

savetxt

import numpy as np
i2 = np.eye(2)
np.savetxt("eye.txt", i2)

3.4 讀入CSV檔案

# AAPL,28-01-2011, ,344.17,344.4,333.53,336.1,21144800

c,v=np.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True) #index從0開始

3.6.1 算術平均值

np.mean(c) = np.average(c)

3.6.2 加權平均值

t = np.arange(len(c))
np.average(c, weights=t)

3.8 極值

np.min(c)
np.max(c)

np.ptp(c) 最大值與最小值的差值

3.10 統計分析

np.median(c) 中位數
np.msort(c) 升序排序
np.var(c) 方差

3.12 分析股票收益率

np.diff(c) 可以返回一個由相鄰陣列元素的差
值構成的陣列

returns = np.diff( arr ) / arr[ : -1]  #diff返回的陣列比收盤價陣列少一個元素

np.std(c) 標準差

對數收益率

logreturns = np.diff( np.log(c) )  #應檢查輸入陣列以確保其不含有零和負數

where 可以根據指定的條件返回所有滿足條件的數
組元素的索引值。
posretindices = np.where(returns > 0)

np.sqrt(1./252.) 平方根,浮點數

3.14 分析日期資料

# AAPL,28-01-2011, ,344.17,344.4,333.53,336.1,21144800

dates, close=np.loadtxt('data.csv', delimiter=',', usecols=(1,6), converters={1:datestr2num}, unpack=True)
print "Dates =", dates

def
datestr2num(s):
return datetime.datetime.strptime(s, "%d-%m-%Y").date().weekday() # 星期一 0 # 星期二 1 # 星期三 2 # 星期四 3 # 星期五 4 # 星期六 5 # 星期日 6 #output Dates = [ 4. 0. 1. 2. 3. 4. 0. 1. 2. 3. 4. 0. 1. 2. 3. 4. 1. 2. 4. 0. 1. 2. 3. 4. 0. 1. 2. 3. 4.]
averages = np.zeros(5)
for i in range(5):
    indices = np.where(dates == i)
    prices = np.take(close, indices)  #按陣列的元素運算,產生一個數組作為輸出。

>>> a = [4, 3, 5, 7, 6, 8]
>>> indices = [0, 1, 4]
>>> np.take(a, indices)
array([4, 3, 6])

np.argmax(c) #返回的是陣列中最大元素的索引值
np.argmin(c)

3.16 彙總資料

# AAPL,28-01-2011, ,344.17,344.4,333.53,336.1,21144800

#得到第一個星期一和最後一個星期五
first_monday = np.ravel(np.where(dates == 0))[0]
last_friday = np.ravel(np.where(dates == 4))[-1]

#建立一個數組,用於儲存三週內每一天的索引值
weeks_indices = np.arange(first_monday, last_friday + 1)
#按照每個子陣列5個元素,用split函式切分陣列
weeks_indices = np.split(weeks_indices, 5)
#output
[array([1, 2, 3, 4, 5]), array([ 6, 7, 8, 9, 10]), array([11,12, 13, 14, 15])]

weeksummary = np.apply_along_axis(summarize, 1, weeks_indices,open, high, low, close)

def summarize(a, o, h, l, c): #open, high, low, close
monday_open = o[a[0]]
week_high = np.max( np.take(h, a) )
week_low = np.min( np.take(l, a) )
friday_close = c[a[-1]]
return("APPL", monday_open, week_high, week_low, friday_close)

np.savetxt("weeksummary.csv", weeksummary, delimiter=",", fmt="%s") #指定了檔名、需要儲存的陣列名、分隔符(在這個例子中為英文標點逗號)以及儲存浮點數的格式。

格式化字串

格式字串以一個百分號開始。接下來是一個可選的標誌字元:-表示結果左對齊,0表示左端補0,+表示輸出符號(正號+或負號-)。第三部分為可選的輸出寬度引數,表示輸出的最小位數。第四部分是精度格式符,以”.”開頭,後面跟一個表示精度的整數。最後是一個型別指定字元,在例子中指定為字串型別。

numpy.apply_along_axis(func1d, axis, arr, *args, **kwargs)

>>> def my_func(a):
...     """Average first and last element of a 1-D array"""
...     return (a[0] + a[-1]) * 0.5
>>> b = np.array([[1,2,3], [4,5,6], [7,8,9]])
>>> np.apply_along_axis(my_func, 0, b)  #沿著X軸運動,取列切片
array([ 4.,  5.,  6.])
>>> np.apply_along_axis(my_func, 1, b)  #沿著y軸運動,取行切片
array([ 2.,  5.,  8.])


>>> b = np.array([[8,1,7], [4,3,9], [5,2,6]])
>>> np.apply_along_axis(sorted, 1, b)
array([[1, 7, 8],
       [3, 4, 9],
       [2, 5, 6]])

3.20 計算簡單移動平均線

(1) 使用ones函式建立一個長度為N的元素均初始化為1的陣列,然後對整個陣列除以N,即可得到權重。如下所示:

N = int(sys.argv[1])
weights = np.ones(N) / N
print "Weights", weights

在N = 5時,輸出結果如下:

Weights [ 0.2 0.2 0.2 0.2 0.2]  #權重相等

(2) 使用這些權重值,呼叫convolve函式:

c = np.loadtxt('data.csv', delimiter=',', usecols=(6,),unpack=True)
sma = np.convolve(weights, c)[N-1:-N+1]   #卷積是分析數學中一種重要的運算,定義為一個函式與經過翻轉和平移的另一個函式的乘積的積分。

t = np.arange(N - 1, len(c))   #作圖
plot(t, c[N-1:], lw=1.0)
plot(t, sma, lw=2.0)
show()

3.22 計算指數移動平均線

指數移動平均線(exponential moving average)。指數移動平均線使用的權重是指數衰減的。對歷史上的資料點賦予的權重以指數速度減小,但永遠不會到達0。

x = np.arange(5)
print "Exp", np.exp(x)
#output
Exp [ 1. 2.71828183 7.3890561 20.08553692 54.59815003]

Linspace 返回一個元素值在指定的範圍內均勻分佈的陣列。

print "Linspace", np.linspace(-1, 0, 5) #起始值、終止值、可選的元素個數
#output 
Linspace [-1. -0.75 -0.5 -0.25 0. ]

(1)權重計算

N = int(sys.argv[1])
weights = np.exp(np.linspace(-1. , 0. , N))

(2)權重歸一化處理

weights /= weights.sum()
print "Weights", weights
#output
Weights [ 0.11405072 0.14644403 0.18803785 0.24144538 0.31002201]

(3)計算及作圖

c = np.loadtxt('data.csv', delimiter=',', usecols=(6,),unpack=True)
ema = np.convolve(weights, c)[N-1:-N+1]
t = np.arange(N - 1, len(c))
plot(t, c[N-1:], lw=1.0)
plot(t, ema, lw=2.0)
show()

3.26 用線性模型預測價格

(x, residuals, rank, s) = np.linalg.lstsq(A, b) #係數向量x、一個殘差陣列、A的秩以及A的奇異值
print x, residuals, rank, s
#計算下一個預測值
print np.dot(b, x)

3.28 繪製趨勢線

>>> x = np.arange(6)
>>> x = x.reshape((2, 3))
>>> x
array([[0, 1, 2],
       [3, 4, 5]])
>>> np.ones_like(x)   #用1填充陣列
array([[1, 1, 1],
       [1, 1, 1]])

類似函式
zeros_like
empty_like
zeros
ones
empty

3.30 陣列的修剪和壓縮

a = np.arange(5)
print "a =", a
print "Clipped", a.clip(1, 2) #將所有比給定最大值還大的元素全部設為給定的最大值,而所有比給定最小值還小的元素全部設為給定的最小值
#output
a = [0 1 2 3 4]
Clipped [1 1 2 2 2]
a = np.arange(4)
print a
print "Compressed", a.compress(a > 2) #返回一個根據給定條件篩選後的陣列
#output
[0 1 2 3]
Compressed [3]
b = np.arange(1, 9)
print "b =", b
print "Factorial", b.prod() #輸出陣列元素階乘結果
#output
b = [1 2 3 4 5 6 7 8]
Factorial 40320

print "Factorials", b.cumprod()
#output
Factorials [ 1 2 6 24 120 720 5040 40320] #陣列元素遍歷階乘