官术网_书友最值得收藏!

1.3 常用第三方庫

1.3.1 NumPy

NumPy(http://www.numpy.org/)是Numerical Python的簡稱,是一個開源的Python科學(xué)計(jì)算庫,是Python數(shù)值計(jì)算的基石。它提供多種數(shù)據(jù)結(jié)構(gòu)、算法,以及大部分Python數(shù)值計(jì)算所需的接口。NumPy的常用功能如下:

● 快速、高效的多維數(shù)組對象ndarray(N-dimensional Array)。

● 基于元素的數(shù)組計(jì)算或數(shù)組間的數(shù)學(xué)操作函數(shù)。

● 線性代數(shù)、傅里葉變換和隨機(jī)數(shù)功能。

● 用于讀/寫硬盤中基于數(shù)組的數(shù)據(jù)集的工具。

● 成熟的C語言API。

通過Python的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)和強(qiáng)大的標(biāo)準(zhǔn)庫,已經(jīng)能夠?qū)崿F(xiàn)很多數(shù)學(xué)函數(shù)來對數(shù)據(jù)進(jìn)行操作,為什么還要選擇NumPy?這里要說明一下NumPy的顯著優(yōu)勢:

● 對于同樣的數(shù)值計(jì)算任務(wù),使用NumPy要比直接編寫Python代碼便捷得多,有時使用NumPy的幾行代碼就可以完成幾十行純Python代碼的工作。

● NumPy中數(shù)組的存儲效率和輸入/輸出性能均遠(yuǎn)優(yōu)于Python中等價(jià)的基本數(shù)據(jù)結(jié)構(gòu),且其能夠提升的性能是與數(shù)組中的元素成比例的(待處理的數(shù)據(jù)量越大,NumPy的效率提升就越大)。

● NumPy的大部分代碼都是用C語言編寫的,其底層算法在設(shè)計(jì)時就有著優(yōu)異的性能。

NumPy實(shí)際上包含了兩種基本的數(shù)據(jù)類型:數(shù)組和矩陣。二者在處理上稍有不同。在使用Python內(nèi)置的列表存儲和處理數(shù)組/矩陣時,需要通過循環(huán)語句分別訪問每一個元素并完成計(jì)算。而在使用NumPy時,則可以一次性地完成對所有元素的計(jì)算。下面通過使用NumPy處理數(shù)組的一些例子,使讀者對NumPy的易用性有一個直觀認(rèn)識。

◎ 操作練習(xí)1-25 NumPy中的數(shù)組操作1

按圖1-35所示輸入代碼并運(yùn)行。

圖1-35 NumPy中的數(shù)組操作1

如果使用Python內(nèi)置的列表類型,完成上述功能則需要使用循環(huán)。讀者可以嘗試將待處理的元素分別存儲在兩個列表中,對兩個列表中對應(yīng)位置的元素分別求和并輸出。

另外,在Python中對數(shù)組的一些數(shù)學(xué)運(yùn)算也需要使用循環(huán)進(jìn)行處理,如給數(shù)組中的每個元素乘以某個整數(shù),或者求數(shù)組的平方,而在NumPy中僅用一行代碼就可以完成。

◎ 操作練習(xí)1-26 NumPy中的數(shù)組操作2

按圖1-36所示輸入代碼并運(yùn)行。

圖1-36 NumPy中的數(shù)組操作2

NumPy也支持多維數(shù)組,多維數(shù)組中的元素既可以像列表一樣訪問,也可以用矩陣方式訪問。

◎ 操作練習(xí)1-27 NumPy中的數(shù)組操作3

按圖1-37所示代碼輸入并運(yùn)行。

圖1-37 NumPy中的數(shù)組操作3

在NumPy中,當(dāng)把兩個數(shù)組相乘時,兩個數(shù)組中的元素將對應(yīng)相乘。

◎ 操作練習(xí)1-28 NumPy中的數(shù)組操作4

按圖1-38所示輸入代碼并運(yùn)行。

圖1-38 NumPy中的數(shù)組操作4

在NumPy中,維度被稱為軸。例如,對于array([1,2,1])這個一維數(shù)組,其具有一個軸,且該軸有3個元素(長度為3)。而對于array([[1,0,0],[0,1,2]])這個二維數(shù)組,其具有兩個軸,第一個軸的長度為2,第二個軸的長度為3。

ndarray是NumPy中的數(shù)組類,ndarray類對象具有許多重要屬性。例如,對于ndarray類對象a,有以下幾項(xiàng)。

● ndim:數(shù)組a的軸數(shù)(尺寸)。

● shape:數(shù)組a的大小。如果a是具有n行m列的矩陣,則shape的值是(n,m)。

● size:數(shù)組a的元素總數(shù)。

● dtype:描述數(shù)組a中元素類型的對象。

◎ 操作練習(xí)1-29 NumPy中的數(shù)組操作5

按圖1-39所示輸入代碼并運(yùn)行。

圖1-39 NumPy中的數(shù)組操作5

提示 NumPy的數(shù)組類型名是ndarray,而不是array,array是NumPy的一個內(nèi)置函數(shù),其作用是創(chuàng)建ndarray類型的數(shù)組對象。

下面介紹矩陣。與使用數(shù)組一樣,需要從NumPy中導(dǎo)入matrix模塊。

◎ 操作練習(xí)1-30 NumPy中的矩陣操作1

按圖1-40所示輸入代碼并運(yùn)行。

圖1-40 NumPy中的矩陣操作1

◎ 操作練習(xí)1-31 NumPy中的矩陣操作2

按圖1-41所示輸入代碼并運(yùn)行。

圖1-41 NumPy中的矩陣操作2

圖1-41 NumPy中的矩陣操作2(續(xù))

NumPy中除了數(shù)組和矩陣數(shù)據(jù)類型,還提供了很多其他有用的方法,建議讀者瀏覽完整的官方文檔(http://docs.scipy.org/doc/)。

當(dāng)然,讀者也可以隨時通過help函數(shù)查看模塊、類型、對象、方法、屬性的詳細(xì)信息,以及通過dir函數(shù)查看一個類或者對象所具有的屬性和方法,如圖1-42所示。

圖1-42 help和dir函數(shù)的使用示例

1.3.2 SciPy

SciPy(https://www.scipy.org/)是一個基于Python的數(shù)學(xué)、科學(xué)和工程開源軟件生態(tài)系統(tǒng),是科學(xué)計(jì)算領(lǐng)域針對不同標(biāo)準(zhǔn)問題域的包集合。以下是SciPy的一些核心包。

● NumPy:基本N維數(shù)組包。

● SciPy庫:科學(xué)計(jì)算的基礎(chǔ)庫。

● Matplotlib:全面的2D繪圖包。

● IPython:增強(qiáng)交互式控制臺。

● SymPy:符號數(shù)學(xué)包。

● Pandas:數(shù)據(jù)結(jié)構(gòu)和分析包。

SciPy和NumPy一起為很多傳統(tǒng)科學(xué)計(jì)算應(yīng)用提供了合理、完整、成熟的計(jì)算基礎(chǔ)。

接下來,看一下使用SciPy進(jìn)行最小二乘擬合的例子。假設(shè)有一組包含m個樣本的實(shí)驗(yàn)數(shù)據(jù){(x1y1),(x2y2),…,(xmym)},它們之間的函數(shù)關(guān)系是y=fx)。通過這些已知信息,需要確定函數(shù)中的一些參數(shù)項(xiàng)。例如,如果f是一個線性函數(shù)fx)=kx+b,那么kb就是需要確定的參數(shù)項(xiàng)。如果將這些參數(shù)用p表示的話,那么就要找到一組p值使得下式中的S函數(shù)最小:

這種算法稱為最小二乘擬合(Least-square Fitting)。

SciPy中的子函數(shù)庫optimize已經(jīng)提供了實(shí)現(xiàn)最小二乘擬合算法的leastsq函數(shù)。下面是用leastsq函數(shù)進(jìn)行數(shù)據(jù)擬合的一個例子,這個例子中要擬合的函數(shù)是一個正弦波函數(shù),它有三個參數(shù)A、k和theta,分別對應(yīng)振幅、頻率和相角。假設(shè)實(shí)驗(yàn)數(shù)據(jù)是一組包含噪聲的數(shù)據(jù)(x,y1),其中y1是在真實(shí)數(shù)據(jù)y0的基礎(chǔ)上加入噪聲得到的數(shù)據(jù)。通過leastsq函數(shù)對帶噪聲的實(shí)驗(yàn)數(shù)據(jù)(x,y1)進(jìn)行數(shù)據(jù)擬合,可以估算出x和真實(shí)數(shù)據(jù)y0之間的正弦關(guān)系中的三個參數(shù)A、k和theta。

◎ 操作練習(xí)1-32 使用SciPy進(jìn)行最小二乘擬合

按圖1-43所示輸入代碼并運(yùn)行。

圖1-43 使用SciPy進(jìn)行最小二乘擬合

圖1-44所示是程序的輸出結(jié)果。

圖1-44 最小二乘擬合輸出結(jié)果

1.3.3 Pandas

Pandas(https://pandas.pydata.org/)是基于NumPy的一個廣受歡迎的數(shù)據(jù)分析庫,它提供了高級的數(shù)據(jù)結(jié)構(gòu)和函數(shù),簡化了數(shù)據(jù)分析過程,非常適合應(yīng)用于數(shù)據(jù)清洗、分析、建模和可視化。

Pandas將表格和關(guān)系型數(shù)據(jù)庫的靈活數(shù)據(jù)操作能力與NumPy的高性能數(shù)組計(jì)算的理念相結(jié)合。它提供復(fù)雜的索引函數(shù),使得數(shù)據(jù)的重組、切塊、切片、聚合、子集選擇更為簡單。

Pandas適合處理許多不同類型的數(shù)據(jù):

● 不同列可能具有不同數(shù)據(jù)類型的表格數(shù)據(jù)。

● 有序和無序(不一定是固定頻率)時間序列數(shù)據(jù)。

● 具有行和列標(biāo)簽的任意矩陣數(shù)據(jù)(相同或不同類型)。

● 其他形式的觀測/統(tǒng)計(jì)數(shù)據(jù)集。

Series(1D)和DataFrame(2D)是Pandas的兩個主要數(shù)據(jù)結(jié)構(gòu),用于處理金融、統(tǒng)計(jì)、社會科學(xué)和許多工程領(lǐng)域中的絕大多數(shù)典型問題。下面給出Pandas的簡單應(yīng)用示例。

1.創(chuàng)建對象

◎ 操作練習(xí)1-33 使用Pandas創(chuàng)建對象

按圖1-45所示創(chuàng)建對象。

圖1-45 使用Pandas創(chuàng)建對象

圖1-46所示是創(chuàng)建的對象。

圖1-46 使用Pandas創(chuàng)建的對象

2.查看數(shù)據(jù)

Pandas對象具有許多屬性,利用這些屬性可以輕松訪問元數(shù)據(jù)。

● shape:給出對象的軸尺寸,與ndarray一致。

● 軸標(biāo)簽。

● Series:對元素的索引(僅一個軸)。

● DataFrame:對行的索引和列的索引。

◎ 操作練習(xí)1-34 查看數(shù)據(jù)

按圖1-47所示輸入代碼并運(yùn)行。

圖1-47 查看數(shù)據(jù)

圖1-48和圖1-49是數(shù)據(jù)查看結(jié)果。從圖1-48可以看出,當(dāng)輸出數(shù)據(jù)較多時,實(shí)際上只會輸出開始和結(jié)束的若干數(shù)據(jù),中間用省略號表示。

圖1-48 數(shù)據(jù)查看結(jié)果1(右側(cè)數(shù)據(jù)實(shí)際上在左側(cè)數(shù)據(jù)的下方)

圖1-49 數(shù)據(jù)查看結(jié)果2

3.選擇數(shù)據(jù)

Pandas目前支持多種類型的多軸索引。

●.loc:基于標(biāo)簽進(jìn)行數(shù)據(jù)選擇,但也可以與布爾數(shù)組一起使用。.loc通過標(biāo)簽選擇數(shù)據(jù),即通過index和columns的值進(jìn)行行和列的選取。如果找不到相應(yīng)標(biāo)簽,則會引發(fā)KeyError異常。

●.iloc:基于索引值(從0開始的整數(shù))進(jìn)行數(shù)據(jù)選擇,但也可以與布爾數(shù)組一起使用。.iloc通過行號和列號選擇數(shù)據(jù),如果索引值越界,則會引發(fā)IndexError異常。

● []:直接索引(行標(biāo)簽、行號或列標(biāo)簽)。

● at/iat通過行列標(biāo)簽/行列號獲取某個數(shù)值的具體位置。

●.loc、.iloc,以及[]均接收一個索引器。

◎ 操作練習(xí)1-35 數(shù)據(jù)選擇1

按圖1-50所示輸入代碼并運(yùn)行。

圖1-50 數(shù)據(jù)選擇1

圖1-51所示是數(shù)據(jù)選擇結(jié)果。

圖1-51 數(shù)據(jù)選擇結(jié)果(右側(cè)數(shù)據(jù)實(shí)際上在左側(cè)數(shù)據(jù)的下方)

◎ 操作練習(xí)1-36 數(shù)據(jù)選擇2

按圖1-52所示輸入代碼并運(yùn)行。

圖1-52 數(shù)據(jù)選擇2

4.缺失數(shù)據(jù)填充

Pandas主要使用np.nan來表示缺失數(shù)據(jù)。默認(rèn)情況下,它不包含在計(jì)算中。

1)檢測缺失值

為了檢測缺失值,Pandas提供了isna和notna函數(shù)進(jìn)行缺失值檢測。

◎ 操作練習(xí)1-37 Pandas中isna和notna函數(shù)的應(yīng)用

按圖1-53所示輸入代碼并運(yùn)行。

圖1-53 Pandas中isna和notna函數(shù)的應(yīng)用

2)填充缺失值

Fillna函數(shù)可以通過幾種方式用非NA數(shù)據(jù)“填充”NA值,具體填充方法如表1-5所示。

表1-5 具體填充方法

◎ 操作練習(xí)1-38 用fillna函數(shù)填充缺失值

按圖1-54所示輸入代碼并運(yùn)行。

圖1-54 用fillna函數(shù)填充缺失值

圖1-55所示是用fillna函數(shù)填充缺失值的結(jié)果。

圖1-55 用fillna函數(shù)填充缺失值的結(jié)果

圖1-55 用fillna函數(shù)填充缺失值的結(jié)果(續(xù))

3)使用對象填充缺失值

還可以使用對齊的字典或者Series填充缺失值,前提是字典的標(biāo)簽或者Series的索引必須與要填充的列匹配。接下來看均值填充的例子。

◎ 操作練習(xí)1-39 均值填充缺失值

按圖1-56所示輸入代碼并運(yùn)行。

圖1-56 均值填充缺失值

5.Pandas數(shù)據(jù)類型和NumPy中ndarray數(shù)據(jù)類型的轉(zhuǎn)換

在大數(shù)據(jù)分析中,常用的兩個數(shù)據(jù)分析包就是NumPy和Pandas,而Pandas正是基于NumPy構(gòu)建的含有更高級數(shù)據(jù)結(jié)構(gòu)和工具的數(shù)據(jù)分析包,在金融領(lǐng)域應(yīng)用非常廣泛。在實(shí)際的工程中,經(jīng)常遇到的問題是NumPy的ndarray數(shù)據(jù)結(jié)構(gòu)與Pandas的Series和DataFrame數(shù)據(jù)結(jié)構(gòu)之間的相互轉(zhuǎn)換問題。前面在介紹Series和DataFrame對象的創(chuàng)建方法時,已看到如何利用ndarray創(chuàng)建這兩個Pandas對象。下面介紹將Pandas的Series對象和DataFrame對象轉(zhuǎn)換為ndarray的方法。

◎ 操作練習(xí)1-40 數(shù)據(jù)類型轉(zhuǎn)換

按圖1-57所示輸入代碼并運(yùn)行。

圖1-57 數(shù)據(jù)類型轉(zhuǎn)換

1.3.4 Matplotlib

Matplotlib是一個Python 2D繪圖庫,可以生成各種硬拷貝格式和跨平臺的交互式環(huán)境的出版物質(zhì)量數(shù)據(jù)。它還提供了一整套和Matlab相似的命令A(yù)PI,十分適合交互式制圖。也可以方便地將它作為繪圖控件,嵌入GUI應(yīng)用程序。通過Matplotlib,開發(fā)者僅需要幾行代碼,便可以生成直方圖、功率譜、條形圖、錯誤圖、散點(diǎn)圖等。

使用Matplotlib繪圖前需要先安裝Matplotlib庫。具體安裝步驟如下。

打開Anaconda Prompt,輸入conda install matplotlib,安裝完成后,即可使用Matplotlib進(jìn)行圖形繪制。

下面通過幾個例子,讓讀者更好地理解和學(xué)習(xí)Matplotlib繪圖的一些基本概念。

Matplotlib的pyplot子庫提供了和Matlab類似的繪圖API,以方便用戶快速繪制2D圖表。

◎ 操作練習(xí)1-41 使用Matplotlib快速繪圖

按圖1-58所示輸入代碼并運(yùn)行。

圖1-58 使用Matplotlib快速繪圖

一個繪圖對象(figure)可以包含多個軸(axis),在Matplotlib中用軸表示一個繪圖區(qū)域,可以將其理解為子圖。上面的第一個例子中,繪圖對象只包括一個軸,因此只顯示了一個軸(子圖)。可以使用subplot函數(shù)快速繪制有多個軸的圖表。subplot函數(shù)的調(diào)用形式如下:

subplot函數(shù)將整個繪圖區(qū)域等分為numRows(行)×numCols(列)個子區(qū)域,然后按照從左到右、從上到下的順序?qū)γ總€子區(qū)域進(jìn)行編號,左上的子區(qū)域的編號為1。如果numRows、numCols和plotNum這三個數(shù)都小于10,則可以把它們縮寫為一個整數(shù),如subplot(323)和subplot(3,2,3)是相同的。Subplot函數(shù)在plotNum指定的區(qū)域中創(chuàng)建一個軸對象。如果新創(chuàng)建的軸和之前創(chuàng)建的軸重疊,則之前的軸將被刪除。

◎ 操作練習(xí)1-42 使用Matplotlib中的subplot函數(shù)繪制多軸圖

按圖1-59所示輸入代碼并運(yùn)行。

圖1-59 使用Matplotlib中的subplot函數(shù)繪制多軸圖

使用Matplotlib也可以方便地進(jìn)行條形圖、餅圖等各種圖表的繪制。下面的例子調(diào)用scatter函數(shù)實(shí)現(xiàn)散點(diǎn)圖的繪制。

◎ 操作練習(xí)1-43 使用Matplotlib中的scatter函數(shù)繪制散點(diǎn)圖

按圖1-60所示輸入代碼并運(yùn)行。

圖1-60 使用Matplotlib中的scatter函數(shù)繪制散點(diǎn)圖

1.3.5 Scikit-learn

Scikit-learn項(xiàng)目(https://scikit-learn.org/stable/)誕生于2010年,目前已成為Python開發(fā)者首選的機(jī)器學(xué)習(xí)工具包。它實(shí)現(xiàn)了各種成熟的算法,并且易于安裝與使用。

它包含以下模塊。

● 分類:支持向量機(jī)(SVM)、最近鄰、隨機(jī)森林、邏輯回歸等。

● 回歸:支持向量回歸(SVR)、嶺回歸、套索等。

● 聚類:k-means、譜聚類、均值漂移等。

● 維度降低:主成分分析(PCA)、特征選擇、矩陣分解等。

● 型號選擇:網(wǎng)絡(luò)搜索、交叉驗(yàn)證、指標(biāo)矩陣。

● 預(yù)處理:預(yù)提取、特征提取。

Scikit-learn框架還提供了一些常用的數(shù)據(jù)集,如表1-6所示。

表1-6 Scikit-learn常用數(shù)據(jù)集

Scikit-learn中除包含上述常用數(shù)據(jù)集之外,還封裝了大量的其他數(shù)據(jù)集,讀者可以通過help命令查看Scikit-learn中封裝的數(shù)據(jù)集,如圖1-61所示。

圖1-61 用help命令查看Scikit-learn中封裝的數(shù)據(jù)集

主站蜘蛛池模板: 察隅县| 鲜城| 雷山县| 饶平县| 当涂县| 元阳县| 溧水县| 烟台市| 永寿县| 广水市| 榆中县| 承德市| 德江县| 博爱县| 霸州市| 新建县| 兴和县| 朝阳市| 云和县| 宣恩县| 西乡县| 荥经县| 岑巩县| 兴山县| 乐业县| 南城县| 吐鲁番市| 新巴尔虎右旗| 睢宁县| 西安市| 西青区| 土默特左旗| 武川县| 色达县| 霍林郭勒市| 长沙县| 英德市| 邢台市| 永州市| 平度市| 安塞县|