????????python依靠numpy和pandas成為數(shù)據(jù)挖掘的首選語(yǔ)言设江,就連c++也排名其后,numpy分析數(shù)據(jù)攘轩,pandas處理數(shù)據(jù)
下面是兩個(gè)官方文檔的鏈接
? ? ? ? numpy:
numpy的大致功能有
ndarray 具有矢量運(yùn)算和復(fù)雜傳播能力叉存,快速并且節(jié)省空間的多維數(shù)組
對(duì)矩陣進(jìn)行快速運(yùn)算和數(shù)學(xué)函數(shù)(已經(jīng)封裝好了,不需要在寫(xiě)循環(huán))
線代度帮,隨機(jī)數(shù)生成歼捏,傅立葉變換等等功能
集成c,c++笨篷,F(xiàn)ortran瞳秽,等語(yǔ)言以及運(yùn)算工具于一體
import numpy as np? ? #np約定俗成
import pandas as pd? ? #pd也是約定俗成
ndarray是一個(gè)多維矩陣對(duì)象
data = np.arange(6).reshape(2,3)? ? #生成一個(gè)2*3矩陣
data*10? ? #矩陣中的每個(gè)元素*10
data + data? ? ?#矩陣中對(duì)應(yīng)位置的每個(gè)元素想家
data.shape? ? #矩陣結(jié)構(gòu)? ? (2,3)
data.dtype? ? #矩陣中元素?cái)?shù)據(jù)類(lèi)型? ? ?dtype('int64')
data.ndim? ? #查看第一維的度數(shù)
array是一個(gè)一維矩陣對(duì)象率翅,可以接受一個(gè)py內(nèi)置數(shù)組(list)练俐,cast為array類(lèi)型,arange是py內(nèi)置函數(shù)range的數(shù)組版
data1 = [i for i in range(5)]
data1 = np.array(data1,dtype=np.float64)? ? #第二個(gè)參數(shù)可不寫(xiě),用于指定數(shù)據(jù)類(lèi)型
data1 = np.zeros(10)? ? #創(chuàng)建一個(gè)十個(gè)0元素構(gòu)成的array
data1 = np.zeros((10,10))? ? #創(chuàng)建一個(gè)10*10的全部都是0元素的矩陣
data1 = np.empty((10,10))? ? #創(chuàng)建一個(gè)10*10的未初始化的矩陣,返回的是垃圾值
data1 = np.arange(10)
ones_like,zeros_like,empty_like根據(jù)參數(shù)的形狀創(chuàng)建全1冕臭,全0腺晾,全垃圾值的數(shù)組
eye,identity 創(chuàng)建一個(gè)N*N的矩陣,正對(duì)角線為1辜贵,其余為0
利用astype進(jìn)行數(shù)據(jù)類(lèi)型轉(zhuǎn)換
arr = np.array([1,2,3,4,5])
float_arr = arr.astype(np.float64)? ? #如果float轉(zhuǎn)換成int悯蝉,會(huì)截?cái)嘈?shù)部分
like_data = arr.astype(data.dtype)? ? #利用別的數(shù)組的數(shù)據(jù)類(lèi)型進(jìn)行轉(zhuǎn)換
numpy內(nèi)部也有切片操作,numpy內(nèi)部的切片操作是對(duì)原有數(shù)組的視圖進(jìn)行操作托慨,也就是說(shuō)泉粉,視圖上的任何修改,都會(huì)被映射到源數(shù)據(jù)上榴芳,copy()可以進(jìn)行復(fù)制操作
>>>arr = np.arange(10)
>>>arr1 = arr[3:6]
>>>arr1[0] = 1000
>>>arr
array([ ? 0,? ? 1,? ? 2, 1000, 4,? ? 5,? ? 6,? ? 7,? ? 8,? ? 9])
>>>arr2 = arr[3:6].copy()
>>>arr2[0] = 3
>>>arr2
array([3,4,5])
>>>arr
array([ ? 0,? ? 1,? ? 2, 1000, 4,? ? 5,? ? 6,? ? 7,? ? 8,? ? 9])
布爾值索引嗡靡,說(shuō)不清,直接上代碼窟感,自己理解吧
>>>name = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])
>>>data = np.randm.randn(7,4)? ? #產(chǎn)生一個(gè)7*4的正太分布矩陣
>>>names == 'Bob'
array([ True, False, False,? True, False, False, False], dtype=bool)
>>>data[name == 'Bob']
array([[-0.09563111, -0.59702644,? 0.51999751,? 1.81938195],
?? ? ? [-1.67285045, -2.0938256 , -0.08594732,? 1.17717593]])
#輸出第0行和第3行
>>>data[name == 'Bob',2:]? ? #布爾索引和切片同時(shí)操作
array([[ 0.51999751,? 1.81938195],
?? ? ? [-0.08594732,? 1.17717593]])
布爾值的不相等 可以用(!=)也可以用(-)進(jìn)行操作,布爾索引也可以使用算數(shù)運(yùn)算符和(&)讨彼,或(|)進(jìn)行運(yùn)算
>>>mask = (name == 'Bob') | (name == 'Will')
>>>mask
array([ True, False,? True,? True,? True, False, False], dtype=bool)
>>>data[mask]
array([[-0.09563111, -0.59702644,? 0.51999751,? 1.81938195],
?? ? ? [-0.81575058,? 1.27094657, -0.31711804, -2.19019167],
?? ? ? [-1.67285045, -2.0938256 , -0.08594732,? 1.17717593],
?? ? ? [ 0.31254292,? 0.74331803, -0.39005352,? 0.6800547 ]])
花式索引
>>> arr = np.arange(32).reshape((8,4))
>>>arr[[1,5,7,2],[0,3,1,2]]
array([4,23,29,10])
選出來(lái)的元素是不是和你預(yù)期的不一樣,為什么會(huì)選出來(lái)(1,0),(5,3),(7,1),(2,2)柿祈,花式索引的行為和預(yù)期結(jié)果不一樣很正常哈误,下面是得到想要結(jié)果的一個(gè)辦法
>>>arr[[1,5,7,2]][:,[0,3,1,2]]
array([[4,7,5,6],
? ? [20,23,21,22],
? ? [28,31,29,30],
? ? [8,11,9,10]])
如果學(xué)過(guò)linux的管道,那么這個(gè)命令很好理解躏嚎,現(xiàn)提取需要的行蜜自,然后行不變,提取需要的列卢佣,還有一個(gè)辦法是使用np.ix_函數(shù)重荠,將兩個(gè)一位整數(shù)數(shù)組轉(zhuǎn)換成一個(gè)用于選取方形區(qū)域的選擇器
arr[np.ix_([1,5,7,2],[0,3,1,2])]
新的得到的結(jié)果和上面的一樣,花式索引不會(huì)再源數(shù)據(jù)的視圖上操作虚茶,會(huì)保存到新的矩陣中
arr = np.arange(15).reshape((3,5))
np.dot(arr.T,arr)? ? #計(jì)算兩個(gè)矩陣的內(nèi)積x.T*x
矩陣的轉(zhuǎn)置可以直接利用DataFrame.T進(jìn)行轉(zhuǎn)置戈鲁,對(duì)于高維度數(shù)組轉(zhuǎn)制仇参,也可以利用transpose例如下面
>>>arr = np.arange(16).randn((2,2,4))
>>>arr.transpose((1,0,2))
array([[[ 0,? 1,? 2,? 3],
? ? ? ? [ 8,? 9, 10, 11]],
? ? ? ? [[ 4,? 5,? 6,? 7],
? ? ? ? [12, 13, 14, 15]]])
是不是沒(méi)看懂怎么轉(zhuǎn)的,很簡(jiǎn)單婆殿,原來(lái)矩陣下標(biāo)為0诈乒,1,2婆芦,現(xiàn)在要轉(zhuǎn)成1怕磨,0,2消约,那就可以看作第三維不變肠鲫,只轉(zhuǎn)第1和第2維的矩陣,也就是說(shuō)第三維矩陣可以看作一個(gè)大塊兒不變荆陆,然后按照二維進(jìn)行轉(zhuǎn)制
有人會(huì)問(wèn),那么1集侯,2被啼,0怎么轉(zhuǎn),牛逼的人可以一下轉(zhuǎn)出來(lái)棠枉。笨一點(diǎn)的話浓体,先把0,1辈讶,2轉(zhuǎn)成1命浴,0,2贱除,也就是第三維不變生闲,然后1,0月幌,2轉(zhuǎn)成1碍讯,2,0扯躺,第一維不變捉兴,兩步轉(zhuǎn)置,熟練的話录语,一步就可以轉(zhuǎn)出來(lái)倍啥。或者利用swapaxes方法澎埠,傳入需要轉(zhuǎn)的維度參數(shù)虽缕,直接進(jìn)行這兩個(gè)維度的轉(zhuǎn)置,不牽扯其他維度蒲稳。
將條件邏輯表述為算數(shù)運(yùn)算彼宠,利用where循環(huán)處理數(shù)據(jù)時(shí)鳄虱,一共三個(gè)參數(shù),第一個(gè)參數(shù)為真就返回第二個(gè)參數(shù)凭峡,否則返回第三個(gè)參數(shù)
>>>xarr = np.array([1.1,1.2,1.3,1.4,1.5])
>>>yarr = np.array([2.1,2.2,2.3,2.4,2.5])
>>>cond = np.array([True,False,True,True,False])
>>>result = np.where(cond,xarr,yarr)
>>>result
array([1.1,2.2,1.3,1.4,2.5])
也可以對(duì)上的某個(gè)數(shù)組或者軸向進(jìn)行統(tǒng)計(jì)計(jì)算拙已,比如sum,mean摧冀,std等聚合計(jì)算倍踪。mean,sum這類(lèi)函數(shù)一般都可以接受一個(gè)axis參數(shù)索昂,用于對(duì)矩陣軸向的統(tǒng)計(jì)建车,1橫0豎。
布爾值會(huì)被強(qiáng)制轉(zhuǎn)換成0和1椒惨,所以sum經(jīng)常用在布爾數(shù)組中True值的個(gè)數(shù)
>>>arr = np.random.randn(100)
>>>(arr > 0).sum()
44
布爾數(shù)組中缤至,any用于測(cè)試數(shù)組中是否存在一個(gè)或多個(gè)True,all檢查數(shù)組中是否全是True康谆,返回True或False
sort可以對(duì)數(shù)組進(jìn)行排序领斥,同樣可以接受axis,選擇對(duì)橫豎軸進(jìn)行排序沃暗,也可以選擇某一個(gè)軸對(duì)其進(jìn)行排序
unique用于數(shù)組去重并且排序月洛,py內(nèi)置函數(shù)set同樣可以去重,但是對(duì)返回值不進(jìn)行排序孽锥,可以利用sorted進(jìn)行排序嚼黔,但是效率會(huì)很低
np.save可以將二進(jìn)制文件寫(xiě)入磁盤(pán)中,接受的第一個(gè)參數(shù)是文件名惜辑,可以不加后綴唬涧,默認(rèn)保存在后綴為.npy的文件中,第二個(gè)參數(shù)是要保存的數(shù)組名盛撑。
np.load讀取npy文件中的內(nèi)容爵卒,然后賦值給數(shù)組。
np.savez將多個(gè)數(shù)組保存在一個(gè)壓縮文件中撵彻,一般后綴為npz钓株,讀取這類(lèi)文件時(shí),會(huì)得到一個(gè)類(lèi)似字典的對(duì)象陌僵。
讀取csv文件轴合,利用np.read_csv,讀取文本文件利用np.loadtxt碗短,loadtxt可以傳入?yún)?shù)delimiter選擇數(shù)據(jù)分隔符
矩陣乘法可以利用dot函數(shù)受葛,np.dot(x,y) 和x.dot(y)是相等的,inv是矩陣的逆矩陣,qr對(duì)矩陣進(jìn)行分解总滩,分解為正交矩陣和上三角矩陣纲堵,返回兩個(gè)參數(shù)
大概numpy就是這么多了吧
想了解更多更具體的numpy建議去看官方文檔
下面是pandas庫(kù)
? ? ? ? pandas庫(kù)有兩個(gè)主要的數(shù)據(jù)結(jié)構(gòu),相當(dāng)重要相當(dāng)重要相當(dāng)重要:Series闰渔,DataFrame
? ? ? ? Series類(lèi)似于一維數(shù)組的對(duì)象席函,由數(shù)據(jù)和相關(guān)的數(shù)據(jù)標(biāo)簽組成,也就是通常人說(shuō)的索引冈涧。
>>>obj = pd.Series([4,7,-5,3])
>>>obj
0 4
1 7
2 -5
3 4
>>>obj.values
array([4,7,-5,3])
>>>obj.index
Int64Index([0,1,2,3])
也可以對(duì)Series指定索引
>>>obj2 = od.Series([4,7,-5,3],index=['d','b','a','c'])
>>>obj2
d 4
b 7
a -5
c 3
可以通過(guò)索引的方式選取Series中一個(gè)或者一組值茂附,也可以將dict強(qiáng)制類(lèi)型轉(zhuǎn)換為Series,轉(zhuǎn)換之后dict的key就是index督弓,values就是Series的value营曼,Series的索引可以通過(guò)Series.index的方式進(jìn)行賦值修改
對(duì)于數(shù)據(jù)中的NAN,可以用isnull和notnull來(lái)進(jìn)行檢測(cè)愚隧,返回值為T(mén)rue或False
兩個(gè)Series相加時(shí)蒂阱,會(huì)自動(dòng)對(duì)其index的屬性,然后將其value相加
DataFrame是一個(gè)表格型數(shù)據(jù)結(jié)構(gòu)
在操作DataFrame時(shí)狂塘,對(duì)其索引方式返回的列的數(shù)據(jù)如果進(jìn)行修改录煤,那么修改的是視圖,修改的數(shù)據(jù)會(huì)直接映射到源數(shù)據(jù)上睹耐,可以通過(guò)copy的方式對(duì)其進(jìn)行顯示的賦值操作
映射出來(lái)的索引是不可進(jìn)行修改的
>>>obj = pd.Series(range(3),index=['a','b','c'])
>>>index = obj.index
>>>index
Index([a,b,c],dtype=object)
>>>index[1:]
Index([b,c],dtype=object)
>>>index[1] = 'd'
Exception : <class 'pandas.core.index.Index'> object is immutable
但是如果需要重新定義DataFrame的索引辐赞,可以利用reindex對(duì)其進(jìn)行重新重排部翘,如果索引不存在硝训,就會(huì)引入缺失值NAN,如果不想引入缺失值新思,傳入?yún)?shù)fill_value就可以指定NAN的值窖梁,也可以利用method選擇插值選項(xiàng),對(duì)其進(jìn)行插值處理夹囚。
如果直接傳入?yún)?shù)columns纵刘,會(huì)對(duì)行的索引進(jìn)行排列,同樣荸哟,不存在的值可以傳入?yún)?shù)進(jìn)行指定或者選擇插值處理假哎。在進(jìn)行reindex的時(shí)候可以同時(shí)傳入inde和columns指定行標(biāo)和列標(biāo)
如果有需要?jiǎng)h除的數(shù)據(jù),利用drop可以將其刪除鞍历。不指定參數(shù)的話舵抹,刪除的是索引值指向的數(shù)據(jù),指定參數(shù)axis選擇刪除行還是列劣砍,1橫0豎
在DataFrame相加的時(shí)候同樣也會(huì)產(chǎn)生NAN的情況惧蛹,可以調(diào)用add方法,然后傳入fill_value指定NAN的處理方式
>>>df1 = pd.DataFrame(np.arange(12).reshape((3,4)),columns=list('abcd'))
>>>df2 = pd.DataFrame(np.arange(20).reshape((4,5)),columns=list('abcde'))
>>>df1.add(df2,fill_value=0)
? ? ?a? b? ?c? ?d? e
0? ?0? 2? ?4? ?6? 4
1? 9? 11 13 15 19
2 18 20 22 24 14
3 15 16 17 18 19
在指定索引的時(shí)候,也可以指定一個(gè)填充值香嗓,fill_value指定填充值為多少
需要注意的是pandas高版本進(jìn)行過(guò)一些庫(kù)的遷移迅腔,比如pandas.io.data被遷移到pandas_datareader.data中,yahoo將數(shù)據(jù)關(guān)掉之后靠娱,想調(diào)取yahoo的數(shù)據(jù)的話沧烈,需要先pip3 install fix_yahoo_finance之后倒入這個(gè)庫(kù),最后一步y(tǒng)f.pdr_override()就可以將其數(shù)據(jù)安全完整的傳輸?shù)奖镜?/p>
利用DataFrame.corr返回相關(guān)系數(shù)饱岸,cov返回?cái)?shù)據(jù)的協(xié)方差矩陣掺出。
corrwith返回一個(gè)列和另一個(gè)Series之間的相關(guān)系數(shù)
處理DataFrame的缺失數(shù)據(jù)時(shí),存在一個(gè)操作是過(guò)濾缺失數(shù)據(jù)苫费,利用dropna就可以汤锨,傳入?yún)?shù)how選擇刪除所有為NAN的行,還是重要存在NAN就刪除
>>>data = pd.Series([1,NA,3.5,NA,7])
>>>data.dropna()
0 1
2 3.5
4 7.0
>>>data = DataFrame([1,6.5,3],[1,NAN,NAN,NAN],[NAN,NAN,NAN],[NAN,6.5,3])
>>>data.dropna(how='all')? ? #傳入all百框,指定全部為NAN才會(huì)被刪除
? ? 0? ? 1? ? 2
0 1? ? 6.5? ? 3
1 1? ? NAN? ? NAN
3 NAN 6.5? ? 3
同樣在進(jìn)行Drop是也可以指定axis刪除行與列闲礼,如果不想刪除,可以通過(guò)fillna來(lái)填補(bǔ)缺失數(shù)據(jù)铐维,指定inplace為T(mén)rue的話柬泽,可以指定為修改視圖
暫時(shí)就寫(xiě)這么多吧,numpy和panda是數(shù)據(jù)挖掘的前綴課程嫁蛇,數(shù)據(jù)挖掘是機(jī)器學(xué)習(xí)的前綴課程锨并,所以這兩個(gè)庫(kù)就當(dāng)是打基礎(chǔ)了。
官方文檔永遠(yuǎn)都可以把庫(kù)介紹的很具體很清晰睬棚,并且非常嚴(yán)謹(jǐn)第煮,建議拿官方文檔入手