今天是4.28號(hào)。
天氣又開始變陰搁拙,雨持續(xù)了一整個(gè)月秒梳。
之前學(xué)習(xí)了用python寫爬蟲和python與mongodb數(shù)據(jù)庫、文件之間的簡(jiǎn)單操作箕速。想想自己還是想用python去做數(shù)據(jù)分析酪碘,或者能夠在證券量化工作中用到相應(yīng)的知識(shí),所以接下來會(huì)主要學(xué)習(xí)數(shù)據(jù)分析相關(guān)的庫numpy,pandas,matplotlib等盐茎,至于機(jī)器學(xué)習(xí)的庫scikit-learn則等掌握了前三個(gè)庫的使用后再根據(jù)需要去學(xué)習(xí)兴垦。
import numpy as np
可以認(rèn)為numpy就是一個(gè)多維的列表(list):
例如
a=[[1,2,3],
[3,4,5],]
a.shape能夠得到a是nxn維數(shù)組;
a.dtype能夠得到數(shù)組中的元素類型是什么字柠;同時(shí)注意narray中所有元素的類型必須是一致的探越。
取數(shù)組a中特定位置的值也是用索引,一維直接用a[x]窑业,二維用a[x,y]即第x行第y列的數(shù)據(jù)钦幔。
(1) arange函數(shù)在numpy中用于創(chuàng)建等差數(shù)組,使用頻率非常高数冬。arange非常類似range函數(shù)节槐,在沒有學(xué)習(xí)numpy時(shí)在for循環(huán)中搀庶,幾乎都用到了range拐纱,二者的區(qū)別僅僅在于是arange返回的是一個(gè)arr數(shù)組,而range返回的是list哥倔。
range()函數(shù)的用法:
range(1,5) #代表從1到5(不包含5)
[1, 2, 3, 4]
range(1,5,2) #代表從1到5秸架,間隔2(不包含5)
[1, 3]
range(5) #代表從0到5(不包含5)
[0, 1, 2, 3, 4]
(2) 花式索引,即利用整數(shù)數(shù)組進(jìn)行索引咆蒿。
例如
arr=[[1,1,2,3],
[1,4,5,6],
[3,2,5,0],
[2,3,1,9]]
那么arr[[1,3]]得到的結(jié)果為arr([[1,4,5,6],[2,3,1,9]])
(3) 進(jìn)行矩陣計(jì)算時(shí)常用到轉(zhuǎn)置(T)和內(nèi)積:
arr.T东抹,可以直接表示轉(zhuǎn)置
np.dot()函數(shù)可以計(jì)算內(nèi)積蚂子,如np.dot(a,a.T)
(4) arr是一個(gè)數(shù)組,有一些函數(shù)可以快速對(duì)數(shù)組中所有的元素進(jìn)行相應(yīng)的計(jì)算操作:
用法例子為:np.abs(arr),np.sqrt(arr)
對(duì)兩個(gè)數(shù)組的操作為:add(x,y),multiply(x,y)等缭黔,執(zhí)行方法是均是對(duì)應(yīng)位置元素進(jìn)行計(jì)算食茎。
(5)條件方法 np.where(cond,x,y)三元表達(dá)式的使用,其中cond表示條件;x馏谨、y可以是單獨(dú)的數(shù)字别渔,可以是數(shù)組。在數(shù)據(jù)分析中惧互,它常用于根據(jù)一個(gè)數(shù)組產(chǎn)生新的數(shù)組哎媚。
例如假設(shè)現(xiàn)在有兩個(gè)數(shù)值數(shù)組和一個(gè)布爾型值數(shù)組:
xarr=np.array([2,2,3,5,6])
yarr=np.array([5,6,9,0,1])
con=np.array([False,True,True,True,False])
現(xiàn)在想根據(jù)con的值選取xarr、yarr中的值喊儡,當(dāng)con中值為True時(shí)選xarr的值拨与,否則選y的值。
用一般的方法為:
result=[(x if c else y) for x,y,c in zip(xarr,yarr,con)]
使用np.where()則能極大提高計(jì)算效率艾猜,用法為:
result=np.where(con,xarr,yarr)
**(6) 數(shù)學(xué)和統(tǒng)計(jì)方法 **
可通過sum,mean,std等方法對(duì)對(duì)整個(gè)數(shù)組或某個(gè)軸上的數(shù)據(jù)進(jìn)行統(tǒng)計(jì)計(jì)算买喧,通常叫做約簡(jiǎn)(reduction)。
對(duì)于axis不懂的可以直接這樣理解箩朴,axis=0或沒有即默認(rèn)為零岗喉,就豎著看;aixs=1就橫著看炸庞。
若x為一個(gè)數(shù)組使用方法為:
x.sum(), x.mean()
x.sum(axis=0或1)钱床,其中axis=0 表示按行將每一列的向量相加,axis=1表示按列將每一行的向量相加埠居。
sum也可以用來對(duì)布爾型數(shù)組中的True值計(jì)數(shù):
例如:arr=randn(100)
(arr>0).sum()
(7) sort()排序
若x為一個(gè)數(shù)組查牌,x.sort()默認(rèn)將數(shù)組x中的元素從小到大排序。若x是多維數(shù)組滥壕,x.sort()會(huì)默認(rèn)按從小到大對(duì)每一列進(jìn)行排序纸颜;x.sort(1)則會(huì)從小到大對(duì)每一行進(jìn)行排序。
(8) 數(shù)組的集合運(yùn)算
np.unique()與python中set()的功能類似绎橘。
例若a=np.array([1,2,3,2,3,4,6])
則np.unique(a)結(jié)果為array([1,2,3,4,6])胁孙,np,unique()在去除重復(fù)元素的同時(shí)將元素從小到大進(jìn)行了排序。
其他集合運(yùn)算如下称鳞,注意集合運(yùn)算的結(jié)果均是數(shù)組
(9) 線性代數(shù)的相關(guān)計(jì)算
這里暫時(shí)不作介紹涮较,后面有需要用到時(shí)具體學(xué)習(xí)并補(bǔ)充進(jìn)來
(10) 隨機(jī)數(shù)生成
numpy.random模塊對(duì)python中內(nèi)置的random進(jìn)行了補(bǔ)充。使用隨機(jī)數(shù)生成函數(shù)時(shí)一般要加size=()的參數(shù)冈止。
例如使用的方法為:
a). numpy.random.normal(size=(4,4))可以得到4x4維服從正太分布的數(shù)組狂票,
其中size是normal()函數(shù)的一個(gè)參數(shù),random的其他函數(shù)也有該參數(shù)熙暴,若該參數(shù)缺失闺属,則默認(rèn)只生成一個(gè)值.
b). randint(low,high,size=xx)
表示從low到high范圍內(nèi)隨機(jī)生成size個(gè)整數(shù)慌盯,且high值取不到。
注意:當(dāng)high缺失或聲明high=None時(shí)掂器,將唯一的一個(gè)數(shù)作為上限亚皂。
例如:a=np.random.randint(3,size=10)和a=np.random.randint(3,high=None,size=(2,3))
二者表達(dá)的意思是一樣的。
c). random.randn(n国瓮,n)可以生成nxn維的服從正太分布的隨機(jī)數(shù)據(jù)數(shù)組孕讳。
部分numpy.random函數(shù)如下:
最后再說一下reshape()函數(shù)可以把一維數(shù)組轉(zhuǎn)化為自己想要的多維數(shù)組,如下:
np.random.randint(8,size=9).reshape(3,3)