數(shù)據(jù)挖掘 numpy,pandas庫(kù)詳解

????????python依靠numpy和pandas成為數(shù)據(jù)挖掘的首選語(yǔ)言设江,就連c++也排名其后,numpy分析數(shù)據(jù)攘轩,pandas處理數(shù)據(jù)

下面是兩個(gè)官方文檔的鏈接

numpy

pandas

? ? ? ? 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)第煮,建議拿官方文檔入手

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市抑党,隨后出現(xiàn)的幾起案子包警,更是在濱河造成了極大的恐慌,老刑警劉巖底靠,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件害晦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡暑中,警方通過(guò)查閱死者的電腦和手機(jī)壹瘟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鳄逾,“玉大人稻轨,你說(shuō)我怎么就攤上這事⊙铣模” “怎么了澄者?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我粱挡,道長(zhǎng)赠幕,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任询筏,我火速辦了婚禮榕堰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嫌套。我一直安慰自己逆屡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布踱讨。 她就那樣靜靜地躺著魏蔗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪痹筛。 梳的紋絲不亂的頭發(fā)上莺治,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音帚稠,去河邊找鬼谣旁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛滋早,可吹牛的內(nèi)容都是我干的榄审。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼杆麸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼搁进!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起角溃,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拷获,失蹤者是張志新(化名)和其女友劉穎篮撑,沒(méi)想到半個(gè)月后减细,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赢笨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年未蝌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茧妒。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡萧吠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出桐筏,到底是詐尸還是另有隱情纸型,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站狰腌,受9級(jí)特大地震影響除破,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜琼腔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一瑰枫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丹莲,春花似錦光坝、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至洲赵,卻和暖如春土铺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背板鬓。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工悲敷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人俭令。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓后德,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親抄腔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瓢湃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容