




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第十章Python數(shù)據(jù)工程與可視化
1網(wǎng)絡(luò)爬蟲(chóng)是自動(dòng)進(jìn)行HTTP訪問(wèn)并捕獲HTML頁(yè)面的程序或腳本。Python語(yǔ)言提供了多個(gè)具備網(wǎng)絡(luò)爬蟲(chóng)功能的第三方庫(kù),比如Requests、BeautifulSoup、Scrapy、PyQuery等。網(wǎng)絡(luò)爬蟲(chóng)1Requests庫(kù)是一個(gè)非常簡(jiǎn)潔且簡(jiǎn)單的處理HTTP請(qǐng)求的第三方庫(kù),其最大優(yōu)點(diǎn)是程序編寫(xiě)過(guò)程接近URL訪問(wèn)過(guò)程。Requests庫(kù)支持非常豐富的鏈接訪問(wèn)功能,包括國(guó)際域名和URL獲取、HTTP長(zhǎng)連接和連接緩存,HTTP會(huì)話和cookie保持,瀏覽器使用風(fēng)格的SSL驗(yàn)證、基本的摘要認(rèn)證、有效的鍵值對(duì)cookie記錄、自動(dòng)解壓縮、自動(dòng)內(nèi)容解碼、文件分塊上傳、HTTP(S)代理功能、連接超時(shí)處理和流數(shù)據(jù)下載等。requests的安裝命令如下:pipinstallrequests1.1Requests網(wǎng)絡(luò)爬蟲(chóng)1requests庫(kù)提供了7個(gè)函數(shù),用來(lái)表示網(wǎng)頁(yè)的HTTP請(qǐng)求,如表10-1所示。1.1Requests網(wǎng)絡(luò)爬蟲(chóng)函數(shù)說(shuō)明requests.request()構(gòu)造一個(gè)請(qǐng)求,支持以下各種方法的基礎(chǔ)方法requests.get()獲取HTML網(wǎng)頁(yè)信息的主要方法requests.head()獲取HTML網(wǎng)頁(yè)頭信息的方法requests.post()向HTML網(wǎng)頁(yè)提交POST請(qǐng)求方法requests.put()向HTML網(wǎng)頁(yè)提交PUT請(qǐng)求方法requests.patch()向HTML網(wǎng)頁(yè)提交局部修改請(qǐng)求requests.delete()向HTML網(wǎng)頁(yè)提交刪除請(qǐng)求表10-1HTTP的7種請(qǐng)求1Requests庫(kù)支持使用帶參URL,為了請(qǐng)求特定的數(shù)據(jù),需要在URL查詢字符串中加入某些特定數(shù)據(jù),一般構(gòu)建URL,數(shù)據(jù)會(huì)放在一個(gè)問(wèn)號(hào)后面,并且以鍵值的形式放在URL中。如:/get?name=xiaoming&password=123。Requests庫(kù)支持定制請(qǐng)求頭。HTTP標(biāo)頭(Header)允許客戶端和服務(wù)器通過(guò)HTTP請(qǐng)求(request)或者響應(yīng)(response)傳遞附加信息。一個(gè)HTTP標(biāo)頭由它的名稱(不區(qū)分大小寫(xiě))后跟隨一個(gè)冒號(hào),冒號(hào)后跟隨它具體的值。Requests并不能根據(jù)定制的請(qǐng)求頭Headers的具體情況而改變自己的行為,只是在請(qǐng)求的最后,將所有的請(qǐng)求頭信息都傳遞進(jìn)去。1.1Requests網(wǎng)絡(luò)爬蟲(chóng)1Requests庫(kù)支持重定向。通過(guò)各種方法將各種網(wǎng)絡(luò)請(qǐng)求重新定個(gè)方向轉(zhuǎn)到其它位置(如:網(wǎng)頁(yè)重定向、域名的重定向、路由選擇的變化也是對(duì)數(shù)據(jù)報(bào)文經(jīng)由路徑的一種重定向)。在Requests中,重定向只需要設(shè)置allow_redirects參數(shù),設(shè)置為T(mén)rue為允許重定向,設(shè)置False為禁止重定向,默認(rèn)為T(mén)rue。Requests庫(kù)支持請(qǐng)求超時(shí)。有時(shí)網(wǎng)絡(luò)爬蟲(chóng)會(huì)遇到服務(wù)器長(zhǎng)時(shí)間不返回請(qǐng)求,這時(shí)爬蟲(chóng)程序就會(huì)一直等待,導(dǎo)致爬蟲(chóng)程序不能順利執(zhí)行。在Requests中有一個(gè)timeout參數(shù)設(shè)定爬蟲(chóng)請(qǐng)求時(shí)間,當(dāng)?shù)却龝r(shí)間超過(guò)設(shè)定timeout參數(shù),爬蟲(chóng)會(huì)自動(dòng)結(jié)束請(qǐng)求。timeout參數(shù)默認(rèn)為0,即沒(méi)有超時(shí)。1.1Requests網(wǎng)絡(luò)爬蟲(chóng)1Requests在完成請(qǐng)求后,會(huì)返回一個(gè)Response對(duì)象,該對(duì)象包含多種信息如表10-2所示。1.1Requests網(wǎng)絡(luò)爬蟲(chóng)屬性說(shuō)明apparent_encoding服務(wù)器內(nèi)容使用的文本編碼content返回響應(yīng)的內(nèi)容,以字節(jié)為單位headers返回響應(yīng)頭,字典格式j(luò)sonrequests中內(nèi)置的Json解碼器reason響應(yīng)狀態(tài)的描述,比如"NotFound"或"OK"status_code返回HTTP的狀態(tài)碼text返回服務(wù)器的內(nèi)容,會(huì)自動(dòng)根據(jù)相應(yīng)頭部的字符編碼進(jìn)行解碼url相應(yīng)的URL表10-2Response對(duì)象返回信息1>>>importrequests>>>user_agent="Mozilla/5.0(WindowsNT10.0;Win64;x64) AppleWebKit/537.36/(KHTML,likeGecko)Chrome/Safari/537.36">>>headers={'User-Agent':user_agent}>>>res=requests.get('/',headers=headers,timeout=2)>>>res.apparent_encoding #服務(wù)器編碼'utf-8'>>>res.reason #響應(yīng)狀態(tài)'OK'>>>res.status_code #HTTP狀態(tài)碼200>>>res.url #URL'/'示例:使用Requests庫(kù)中GET請(qǐng)求訪問(wèn)百度官網(wǎng)網(wǎng)絡(luò)爬蟲(chóng)1beautifulsoup4庫(kù),也稱為BeautifulSoup庫(kù)或bs4庫(kù),用于解析和處理HTML和XML。它的最大優(yōu)點(diǎn)是能根據(jù)HTML和XML語(yǔ)法建立解析樹(shù),進(jìn)而高效解析其中的內(nèi)容。HTML建立的Web頁(yè)面一般非常復(fù)雜,除了有用的內(nèi)容信息外,還包括大量用于頁(yè)面格式的元素,直接解析一個(gè)Web網(wǎng)頁(yè)需要深入了解HTML語(yǔ)法,而且比較復(fù)雜。beautifulsoup4庫(kù)將專(zhuān)業(yè)的Web頁(yè)面格式解析部分封裝成函數(shù),提供了若干有用且便捷的處理函數(shù)。1.2beautifulsoup4網(wǎng)絡(luò)爬蟲(chóng)1beautifulsoup4庫(kù)采用面向?qū)ο笏枷雽?shí)現(xiàn),簡(jiǎn)單地說(shuō),它把每個(gè)頁(yè)面當(dāng)作一個(gè)對(duì)象,通過(guò)<a>.<b>的方式調(diào)用對(duì)象的屬性(即包含的內(nèi)容),或者通過(guò)<a>.<b>()的方式調(diào)用方法。在使用beautifulsoup4庫(kù)之前,需要進(jìn)行引用,由于這個(gè)庫(kù)的名字非常特殊且采用面向?qū)ο蠓绞浇M織,可以用from-import方式從庫(kù)中直接引用BeautifulSoup類(lèi),方法如下:frombs4importBeautifulSoup1.2beautifulsoup4網(wǎng)絡(luò)爬蟲(chóng)1beautifulSoup4庫(kù)中最主要的是BeautifulSoup類(lèi),每個(gè)實(shí)例化的對(duì)象相當(dāng)于一個(gè)頁(yè)面,導(dǎo)入BeautifulSoup類(lèi)后,使用BeautifulSoup()創(chuàng)建一個(gè)BeautifulSoup對(duì)象。BeautifulSoup支持的HTML解析器有四種,Python標(biāo)準(zhǔn)庫(kù)、lxmlHTML解析器、lxmlXML解析器和html5lib解析器,常用的是lxmlHTML解析器。1.2beautifulsoup4網(wǎng)絡(luò)爬蟲(chóng)1本文自建一個(gè)HTML示例文件books.html文件,通過(guò)對(duì)books.html文件的過(guò)濾操作,演示beautifulSoup4庫(kù)解析HTML文件。1.2beautifulsoup4網(wǎng)絡(luò)爬蟲(chóng)1beautifulSoup4庫(kù)中最主要的是BeautifulSoup類(lèi),每個(gè)實(shí)例化的對(duì)象相當(dāng)于一個(gè)頁(yè)面,導(dǎo)入BeautifulSoup類(lèi)后,使用BeautifulSoup()創(chuàng)建一個(gè)BeautifulSoup對(duì)象。1.2beautifulsoup4網(wǎng)絡(luò)爬蟲(chóng)>>>frombs4importBeautifulSoup>>>html_doc='D:\python\ch10\books.html'>>>soup=BeautifulSoup(open(html_doc),'lxml')>>>type(soup) #打印soup類(lèi)型<class'bs4.BeautifulSoup'>1創(chuàng)建的BeautifulSoup對(duì)象是一個(gè)樹(shù)形結(jié)構(gòu),它包含HTML頁(yè)面中的每一個(gè)Tag(標(biāo)簽)元素,如<head>、<body>、<title>等。HTML中的結(jié)構(gòu)轉(zhuǎn)化BeautifulSoup對(duì)象的一個(gè)屬性,可以采用<a>.<b>形式獲取,其中<b>的名字采用HTML中標(biāo)簽的名字。BeautifulSoup對(duì)象常用的屬性見(jiàn)表10-3。1.2beautifulsoup4網(wǎng)絡(luò)爬蟲(chóng)屬性描述headHTML頁(yè)面中的<head>內(nèi)容titleHTML頁(yè)面中的<title>內(nèi)容,一般在<head>內(nèi)部bodyHTML頁(yè)面中的<body>內(nèi)容pHTML頁(yè)面中第一個(gè)<p>內(nèi)容stringsHTML頁(yè)面所有呈現(xiàn)在Web上的字符串(標(biāo)簽內(nèi)容)stripped_stringsHTML頁(yè)面所有呈現(xiàn)在Web上的非空格字符串表10-3BeautifulSoup對(duì)象常用的屬性1獲取books.html文件中的head、title、body中內(nèi)容。1.2beautifulsoup4網(wǎng)絡(luò)爬蟲(chóng)#打印head中內(nèi)容>>>soup.head <head><metacharset="utf-8"/><title>教材匯總</title><metacontent="教材匯總"name="description"/></head>
#打印body中內(nèi)容>>>soup.body<body><ahref="book1_url"id="book1">高等數(shù)學(xué)</a><ahref="book2_url"id="book2">實(shí)用大學(xué)英語(yǔ)教程綜合訓(xùn)練1</a><ahref="book3_url"id="book3">C語(yǔ)言程序設(shè)計(jì)</a></body>#打印title中內(nèi)容>>>soup.title <title>教材匯總</title>1每一個(gè)Tag標(biāo)簽在beautifulSoup4庫(kù)中也是一個(gè)對(duì)象,稱為T(mén)ag對(duì)象。每一個(gè)標(biāo)簽對(duì)象在HTML中都有類(lèi)似的結(jié)構(gòu):<ahref="book1_url"id="book1">高等數(shù)學(xué)</a>其中,尖括號(hào)(<>)中的標(biāo)簽的名字是name,尖括號(hào)內(nèi)其它項(xiàng)是attrs,尖括號(hào)之間的內(nèi)容是string。因此,通過(guò)Tag對(duì)象的name、attrs和string屬性來(lái)獲取相應(yīng)的內(nèi)容。標(biāo)簽對(duì)象有4個(gè)常用的屬性。如表10-4所示。1.2beautifulsoup4網(wǎng)絡(luò)爬蟲(chóng)11.2beautifulsoup4網(wǎng)絡(luò)爬蟲(chóng)屬性描述name字符串類(lèi)型,標(biāo)簽的名字,如a,divattrs字典類(lèi)型,包含Tag下所有的屬性,如hrefstring字符串類(lèi)型,Tag所包含的文本內(nèi)容,顯示到Web的內(nèi)容contents列表類(lèi)型,Tag下所有子Tag的內(nèi)容表10-4標(biāo)簽對(duì)象4個(gè)常用屬性11.2beautifulsoup4網(wǎng)絡(luò)爬蟲(chóng)示例:獲取標(biāo)簽屬性>>>soup.a<ahref="book1_url"id="book1">高等數(shù)學(xué)</a>>>>a>>>soup.a.attrs{'href':'book1_url','id':'book1'}>>>soup.a.string高等數(shù)學(xué)>>>soup.a.contents['高等數(shù)學(xué)']11.2beautifulsoup4網(wǎng)絡(luò)爬蟲(chóng)當(dāng)需要列出標(biāo)簽對(duì)應(yīng)的所有內(nèi)容或者需要找到非第一個(gè)標(biāo)簽時(shí),需要使用BeautifulSoup的find()和find_all()方法。這兩個(gè)方法會(huì)遍歷HTML文檔,根據(jù)條件返回內(nèi)容。find_all()會(huì)根據(jù)參數(shù)返回對(duì)應(yīng)的所有標(biāo)簽,返回類(lèi)型為列表。BeautifulSoup.find_all(name,attrs,recursive,string,limit)參數(shù)解釋?zhuān)簄ame:按照標(biāo)簽名稱檢索attrs:按照標(biāo)簽的屬性值檢索recursive:設(shè)置檢索層次,只查找當(dāng)前標(biāo)簽下一層時(shí),設(shè)置recursive=Falsestring:按照關(guān)鍵字檢索string屬性內(nèi)容limit:返回結(jié)果的個(gè)數(shù),默認(rèn)返回全部?jī)?nèi)容11.2beautifulsoup4網(wǎng)絡(luò)爬蟲(chóng)>>>soup.find_all("a") #查找所有<a>標(biāo)簽[<ahref="book1_url"id="book1">高等數(shù)學(xué)</a>,<ahref="book2_url"id="book2">實(shí)用大學(xué)英語(yǔ)教程綜合訓(xùn)練1</a>,<ahref="book3_url"id="book3">C語(yǔ)言程序設(shè)計(jì)</a>]#查找所有<a>標(biāo)簽,并且超鏈接為book1_url>>>soup.find_all("a",attrs={"href":"book1_url"}) [<ahref="book1_url"id="book1">高等數(shù)學(xué)</a>]>>>importre #導(dǎo)入re模塊#查找所有包含“語(yǔ)”的標(biāo)簽>>>soup.find_all(string=pile("語(yǔ)"))['實(shí)用大學(xué)英語(yǔ)教程綜合訓(xùn)練1','C語(yǔ)言程序設(shè)計(jì)']11.2beautifulsoup4網(wǎng)絡(luò)爬蟲(chóng)find()方法根據(jù)參數(shù)返回對(duì)應(yīng)的第一個(gè)結(jié)果,其余功能和find_all()類(lèi)似,因此,本文只給出find()函數(shù)的使用形式。BeautifulSoup.find(name,attrs,recursive,string)NumPy(NumericalPython)是Python中用于科學(xué)計(jì)算的一個(gè)開(kāi)源庫(kù)。它提供了高效的多維數(shù)組對(duì)象以及用于處理這些數(shù)組的各種工具。NumPy是其他Python科學(xué)計(jì)算庫(kù)的基礎(chǔ),包括科學(xué)計(jì)算、數(shù)據(jù)分析和機(jī)器學(xué)習(xí)等領(lǐng)域常用的Pandas和Scikit-learn。NumPy的主要功能之一是它的ndarray(N-dimensionalarray)對(duì)象,它是一個(gè)多維數(shù)組,支持高效的數(shù)組操作和運(yùn)算。與Python內(nèi)置的列表(list)相比,NumPy的數(shù)組提供了更高的性能和更靈活的操作方式。2科學(xué)計(jì)算NumPy2科學(xué)計(jì)算NumPy安裝numpy,安裝命令為:pipinstallnumpy引用NumPy方式為importnumpyasnp:2.1數(shù)組的創(chuàng)建1).array()方法創(chuàng)建一個(gè)ndarray數(shù)組,可以調(diào)用numpy中的array()方法。np.array(object,dtype=None,order=None)object表示數(shù)組或嵌套的數(shù)列;dtype表示數(shù)組元素的數(shù)據(jù)類(lèi)型,可選;order表示創(chuàng)建數(shù)組的樣式,C為行方向,F(xiàn)為列方向,A為任意方向(默認(rèn))。2科學(xué)計(jì)算NumPy示例:創(chuàng)建一個(gè)一維數(shù)組。>>>importnumpyasnp>>>arr=np.array([1,2,3])>>>a[123]2科學(xué)計(jì)算NumPy示例:創(chuàng)建一個(gè)二維數(shù)組。>>>importnumpyasnp>>>arr=np.array([[1,2,3],[4,5,6]])>>>arr[[123][456]]2).empty()方法empty()方法用來(lái)創(chuàng)建一個(gè)指定形狀(shape)、數(shù)據(jù)類(lèi)型(dtype)且未初始化的數(shù)組(每次運(yùn)行程序可能會(huì)產(chǎn)生不一樣的數(shù)據(jù))。np.empty(shape,dtype=int,order='C')shape表示數(shù)組形狀;dtype表示數(shù)組元素的數(shù)據(jù)類(lèi)型,可選;order表示在計(jì)算機(jī)內(nèi)存中的存儲(chǔ)元素的順序,有”C”和”F”兩個(gè)選項(xiàng),分別代表行優(yōu)先和列優(yōu)先。2科學(xué)計(jì)算NumPy>>>importnumpyasnp>>>arr=np.empty([3,2],dtype=int)>>>arr[[1382733280570][1382874480570][1381966664570]]3).zeros()方法zeros()方法創(chuàng)建指定大小的數(shù)組,數(shù)組元素以0來(lái)填充。np.zeros(shape,dtype=float,order='C')shape表示數(shù)組的形狀;dtype表示數(shù)組元素的數(shù)據(jù)類(lèi)型。2科學(xué)計(jì)算NumPy>>>importnumpyasnp>>>arr=np.zeros([3,2],dtype=int)#創(chuàng)建一個(gè)3行2列的0數(shù)組>>>arr[[00][00][00]]4).ones()方法創(chuàng)建指定形狀的數(shù)組,數(shù)組元素以1來(lái)填充。np.ones(shape,dtype=None,order='C')shape表示數(shù)組的形狀;dtype表示數(shù)組元素的數(shù)據(jù)類(lèi)型。2科學(xué)計(jì)算NumPy>>>importnumpyasnp>>>arr=np.ones([3,2],dtype=int)>>>arr[[11][11][11]]5).arange()方法在指定數(shù)值范圍內(nèi)創(chuàng)建數(shù)組np.arange(start,stop,step,dtype=None)start:開(kāi)始位置,默認(rèn)起始值為0;stop:停止位置,不包括該位置的值;step:步長(zhǎng),默認(rèn)步長(zhǎng)為1,如果指定了step,則還必須給出start。dtype:輸出數(shù)組的類(lèi)型。2科學(xué)計(jì)算NumPy>>>importnumpyasnp>>>arr=np.arange(1,5,2)>>>arrarray([1,3])6).linspace()方法在線性空間中以均勻步長(zhǎng)(等差數(shù)列)生成數(shù)字序列。np.linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None)start:序列的起始值;stop:序列的終止值,如果endpoint為T(mén)rue,則該值包含在序列中;num:樣本數(shù)量,默認(rèn)為50;endpoint:stop終止值是否包含在該序列中,True表示stop值包含在序列中,F(xiàn)alse:不包含在序列中,默認(rèn)為T(mén)rue;retstep:顯示間距,True表示生成的數(shù)組中會(huì)顯示間距,F(xiàn)alse表示生成的數(shù)組中不會(huì)顯示間距。2科學(xué)計(jì)算NumPy>>>importnumpyasnp>>>arr=np.linspace(start=1,stop=10,num=10,endpoint=True,retstep=False,dtype=float)>>>arrarray([1.,
2.,
3.,
4.,
5.,
6.,
7.,
8.,
9.,10.])>>>arr2=np.linspace(start=1,stop=10,num=5,endpoint=False,retstep=True,dtype=float)>>>arr2(array([1.,2.8,4.6,6.4,8.2]),1.8)2科學(xué)計(jì)算NumPyarr是采用linspace()函數(shù)在[0-10]之間生成10個(gè)浮點(diǎn)數(shù);arr2是采用linspace()函數(shù)在[0-10)之間生成5個(gè)浮點(diǎn)數(shù)并顯示間距。7).logspace()方法logspace()方法用于創(chuàng)建一個(gè)于等比數(shù)列。np.logspace(start,stop,num=50,endpoint=True,base=10.0,dtype=None)start:序列的起始值;stop:序列的終止值,如果endpoint為T(mén)rue,則該值包含在序列中;num:樣本數(shù)量,默認(rèn)為50;endpoint:stop終止值是否包含在該序列中,True表示stop值包含在序列中,F(xiàn)alse:不包含在序列中,默認(rèn)為T(mén)rue;base:對(duì)數(shù)log的底數(shù)。2科學(xué)計(jì)算NumPy>>>importnumpyasnp>>>arr=np.logspace(start=0,stop=9,num=10,base=2)>>>arr[
1.
2.
4.
8.16.32.64.128.256.512.]2科學(xué)計(jì)算NumPy2.2數(shù)組的屬性數(shù)組屬性反映了數(shù)組本身固有的信息,常見(jiàn)的數(shù)組屬性見(jiàn)表10-52科學(xué)計(jì)算NumPy表10-5常見(jiàn)的數(shù)組屬性1).ndarray.ndim用于返回?cái)?shù)組的維度,即秩。2科學(xué)計(jì)算NumPy>>>importnumpyasnp>>>arr=np.arange(9)#使用arange()生成一個(gè)0-8的一維數(shù)組>>>arr#打印數(shù)組[012345678]>>>arr.ndim#打印數(shù)組的秩1>>>arr_2=np.arange(9).reshape(3,3)#使用reshape()函數(shù)將一維數(shù)組并轉(zhuǎn)化為二維數(shù)組>>>arr_2[[012][345][678]]>>>arr_2.ndim22).ndarray.shape數(shù)組的維度,返回一個(gè)元組,(n,m)表示n行和m列,也可以調(diào)整數(shù)組的大小。2科學(xué)計(jì)算NumPy>>>importnumpyasnp>>>arr=np.arange(6).reshape(2,3)#使用reshape()函數(shù)生成一個(gè)2*3的數(shù)組>>>arr[[012][345]]>>>arr.shape(2,3)#調(diào)整數(shù)組的大小>>>arr.shape=(3,2)#通過(guò)shape屬性調(diào)整數(shù)組的大小>>>arr[[01][23][45]]>>>arr.shape#打印調(diào)整后數(shù)組的形狀(3,2)3).ndarray.reshape調(diào)整數(shù)組的形狀。2科學(xué)計(jì)算NumPy>>>importnumpyasnp>>>arr=np.arange(6).reshape(2,3)#生成一個(gè)2*3的數(shù)組>>>arr[[012][345]]>>>arr_2=arr.reshape(3,2)#將數(shù)組形狀由2*3調(diào)整為3*2>>>arr_2[[01][23][45]]4).ndarray.itemsize以字節(jié)的形式返回?cái)?shù)組中每一個(gè)元素的大小。例如,一個(gè)元素的類(lèi)型為float64,則它的itemsize屬性為8,float64占用64個(gè)bits,每個(gè)字節(jié)長(zhǎng)度為8,即占用8個(gè)字節(jié)。2科學(xué)計(jì)算NumPy>>>importnumpyasnp>>>arr=np.arange(6,dtype=8).reshape(2,3)>>>arr.itemsizeint8:1>>>arr2=np.arange(6,dtype=np.float64).reshape(2,3)>>>arr2.itemsizefloat64:82.3切片與索引1)一維數(shù)組索引與切片可以采用冒號(hào)分割切片參數(shù)進(jìn)行切片操作。[start:stop:step]如果只放置一個(gè)start參數(shù),如[2],將返回與該索引相對(duì)應(yīng)的單個(gè)元素。2科學(xué)計(jì)算NumPyndarray對(duì)象的內(nèi)容可以通過(guò)索引或切片來(lái)訪問(wèn)和修改,與Python中l(wèi)ist的切片操作類(lèi)似。>>>importnumpyasnp>>>arr=np.arange(10)>>>arrarray([0,1,2,3,4,5,6,7,8,9])>>>arr[2]2[start:stop:step]如果為[2:],表示從該索引開(kāi)始以后的所有項(xiàng)都將被提取,英文冒號(hào)(:)表示獲取所有元素。>>>arr[2:][2,3,4,5,6,7,8,9]2科學(xué)計(jì)算NumPy>>>importnumpyasnp>>>arr=np.arange(10)>>>arrarray([0,1,2,3,4,5,6,7,8,9])[start:stop:step]如果使用了三個(gè)參數(shù),如[2:8:2],則提取步長(zhǎng)為2的兩個(gè)索引(不包括停止索引)之間的項(xiàng)。>>>arr[2:8:2][246]>>>importnumpyasnp>>>arr=np.arange(10)>>>arrarray([0,1,2,3,4,5,6,7,8,9])>>>arr[::-1]#設(shè)置步長(zhǎng)為-1,翻轉(zhuǎn)數(shù)組array([9,8,7,6,5,4,3,2,1,0])>>>arr[-10:-5]array([0,1,2,3,4])2科學(xué)計(jì)算NumPynumpy數(shù)組索引與Python中List索引相似,既有正向索引也有負(fù)數(shù)索引。下面將演示負(fù)數(shù)索引。設(shè)置步長(zhǎng)為-1翻轉(zhuǎn)數(shù)組,設(shè)置負(fù)數(shù)下表選取元素0-4。2)多維數(shù)組索引下例演示創(chuàng)建一個(gè)多維數(shù)組,可以采用arange()方法并用reshape()方法改變它的維度,使之變?yōu)橐粋€(gè)三維數(shù)組。2科學(xué)計(jì)算NumPy>>>importnumpyasnp>>>arr=np.arange(24).reshape(2,3,4)>>>arr[[[0
1
2
3]
[4
5
6
7]
[8
91011]][[12131415]
[16171819]
[20212223]]]三維的數(shù)組可以看作2個(gè)3×4的二維數(shù)組。我們可以形象的將一個(gè)三維數(shù)組理解為一個(gè)電子表格中工作表(sheet)、行和列的關(guān)系,下面均采用電子表格來(lái)講解三維數(shù)組。2)多維數(shù)組索引下例演示創(chuàng)建一個(gè)多維數(shù)組,可以采用arange()方法并用reshape()方法改變它的維度,使之變?yōu)橐粋€(gè)三維數(shù)組。2科學(xué)計(jì)算NumPy>>>importnumpyasnp>>>arr=np.arange(24).reshape(2,3,4)>>>arr[[[0
1
2
3]
[4
5
6
7]
[8
91011]][[12131415]
[16171819]
[20212223]]]三維的數(shù)組可以看作2個(gè)3×4的二維數(shù)組。我們可以形象的將一個(gè)三維數(shù)組理解為一個(gè)電子表格中工作表(sheet)、行和列的關(guān)系,下面均采用電子表格來(lái)講解三維數(shù)組。獲取指定元素:第一張工作表中,第二行、第三列元素>>>arr[0,1,2]112科學(xué)計(jì)算NumPy[[[0
1
2
3]
[4
5
6
7]
[8
91011]][[12131415]
[16171819]
[20212223]]]英文冒號(hào)(:)代替缺少值表示獲取所有元素。獲取第一張sheet中所有元素,在進(jìn)行索引時(shí)可以將第一個(gè)下標(biāo)可以設(shè)置為0,第二和三個(gè)下標(biāo)可以用英文冒號(hào)(:)來(lái)代替。>>>arr[0,:,:][[0
1
2
3][4
5
6
7][8
91011]]多個(gè)冒號(hào)可以用一個(gè)省略號(hào)(…)來(lái)代替,下例第二和第三個(gè)下標(biāo)可以用一個(gè)省略號(hào)來(lái)表示。>>>arr[0,...][[0
1
2
3][4
5
6
7][8
91011]]2科學(xué)計(jì)算NumPy[[[0
1
2
3]
[4
5
6
7]
[8
91011]][[12131415]
[16171819]
[20212223]]]在獲取第一個(gè)sheet工作表中數(shù)據(jù)后,如果還想進(jìn)一步獲取行和列中的數(shù)據(jù),可以直接在獲取的二維數(shù)組中進(jìn)行切片索引,也可以在原始的三維數(shù)組切片中間隔地選取元素。>>>arr_2=arr[0,...][[0
1
2
3][4
5
6
7][8
91011]]>>>arr_2[1,1]5>>>arr[0,1,::2][46]多維數(shù)組支持負(fù)數(shù)切片索引,下例獲取第一個(gè)sheet中所有元素。>>>arr[-2,...][[0
1
2
3][4
5
6
7][8
91011]]
2科學(xué)計(jì)算NumPy[[[0
1
2
3]
[4
5
6
7]
[8
91011]][[12131415]
[16171819]
[20212223]]]獲取所有sheet中的最后一個(gè)元素。>>>arr[:,-1,-1][1123]2.4數(shù)組的變換1)reshape()方法對(duì)于定義好的數(shù)組,可以通過(guò)reshape()方法改變其數(shù)據(jù)的維度。np.reshape(a,newshape)a:待處理的數(shù)組,newshape:新維度,整數(shù)或整數(shù)元組2科學(xué)計(jì)算NumPyNumPy中包含了一些數(shù)組變換的方法,可分為數(shù)組重塑、數(shù)組合并、數(shù)組分割>>>importnumpyasnp>>>arr=np.arange(9)>>>arr[012345678]>>>arr_re=arr.reshape(3,3)>>>arr_re
[[012][345][678]]2)hstack()方法實(shí)現(xiàn)數(shù)組的橫向合并。2科學(xué)計(jì)算NumPy>>>importnumpyasnp>>>arr1=np.arange(6).reshape(3,2)>>>arr1[[0,1],[2,3],[4,5]]>>>arr2=arr1*2>>>arr2[[0,
2],[4,
6],[8,10]]>>>arr3=np.hstack((arr1,arr2))>>>arr3[[0
1
0
2][2
3
4
6][4
5
810]]3)vstack()方法實(shí)現(xiàn)數(shù)組的縱向合并。2科學(xué)計(jì)算NumPy>>>importnumpyasnp>>>arr1=np.arange(6).reshape(3,2)>>>arr2=arr1*2>>>arr2>>>arr4=np.vstack((arr1,arr2))>>>arr4[[0
1][2
3][4
5][0
2][4
6][810]]4)concatenate()方法可以實(shí)現(xiàn)數(shù)組的橫向或縱向合并,參數(shù)axis=1時(shí)進(jìn)行橫向合并,axis=0時(shí)進(jìn)行縱向合并(默認(rèn))。2科學(xué)計(jì)算NumPy>>>importnumpyasnp>>>arr1=np.arange(6).reshape(3,2)>>>arr2=arr1*2#實(shí)現(xiàn)數(shù)組的橫向合并>>>np.concatenate((arr1,arr2),axis=1)[[0
1
0
2][2
3
4
6][4
5
810]]#實(shí)現(xiàn)數(shù)組的縱向合并>>>np.concatenate((arr1,arr2),axis=0)[[0
1][2
3][4
5][0
2][4
6][810]]5)hsplit()方法實(shí)現(xiàn)數(shù)組的橫向分割。2科學(xué)計(jì)算NumPy>>>>importnumpyasnp>>>arr=np.arange(16).reshape(4,4)>>>arrarray([[0,
1,
2,
3],[4,
5,
6,
7],[8,
9,10,11],[12,13,14,15]])>>>np.hsplit(arr,2)[array([[0,
1],[4,
5],[8,
9],[12,13]]),array([[2,
3],[6,
7],[10,11],[14,15]])]6)vsplit()方法實(shí)現(xiàn)數(shù)組的縱向分割。2科學(xué)計(jì)算NumPy>>>>importnumpyasnp>>>arr=np.arange(16).reshape(4,4)>>>np.vsplit(arr,2)[array([[0,1,2,3],[4,5,6,7]]),array([[8,
9,10,11],[12,13,14,15]])]7)split()方法指定方向的分割。axis=0時(shí)實(shí)現(xiàn)水平分割(默認(rèn)),axis=1時(shí)則實(shí)現(xiàn)垂直分割。2科學(xué)計(jì)算NumPy>>>importnumpyasnp>>>arr=np.arange(16).reshape(4,4)>>>np.split(arr,2)#水平分割[array([[0,1,2,3], [4,5,6,7]]),array([[8,
9,10,11], [12,13,14,15]])]>>>np.split(arr,2,axis=1)#垂直分割[array([[0,
1], [4,
5], [8,
9], [12,13]]),array([[2,
3], [6,
7], [10,11], [14,15]])]2科學(xué)計(jì)算NumPy2.5廣播NumPy廣播是指在算術(shù)運(yùn)算期間處理不同形狀的數(shù)組的能力。在Numpy中當(dāng)數(shù)組進(jìn)行運(yùn)算時(shí),如果兩個(gè)數(shù)組的形狀相同,那么兩個(gè)數(shù)組相乘就是兩個(gè)數(shù)組的對(duì)應(yīng)位相乘,這要求各維度的長(zhǎng)度相同,但是當(dāng)運(yùn)算中兩個(gè)數(shù)組的形狀不同使時(shí),NumPy將會(huì)自動(dòng)觸發(fā)廣播機(jī)制,所以要了解numpy的廣播機(jī)制,才能更好的進(jìn)行數(shù)組的運(yùn)算。2科學(xué)計(jì)算NumPy2.5廣播NumPy廣播規(guī)則:1.讓所有輸入數(shù)組都向其中shape最長(zhǎng)的數(shù)組看齊,shape中不足的部分都通過(guò)在左邊加1補(bǔ)齊。2.如果兩個(gè)數(shù)組的形狀在任何一個(gè)維度上都不匹配,那么數(shù)組的形狀會(huì)沿著維度為1的維度進(jìn)行擴(kuò)展,以匹配另一個(gè)數(shù)組的形狀。3.輸出數(shù)組的shape是輸入數(shù)組shape的各個(gè)軸上的最大值。4.如果兩個(gè)數(shù)組的形狀在任何一個(gè)維度上都不匹配,并且沒(méi)有任何一個(gè)維度等于1,則引發(fā)異常。2科學(xué)計(jì)算NumPy1)一維數(shù)組與標(biāo)量相加在NumPy廣播機(jī)制中,對(duì)于一維數(shù)組,要實(shí)現(xiàn)一個(gè)一維數(shù)組與一個(gè)標(biāo)量作操作,那么需要將標(biāo)量拉伸為與一維數(shù)組相匹配的形狀,再進(jìn)行加法,拉伸位置的值都為該標(biāo)量的值。圖10-1(a)所示,要實(shí)現(xiàn)一維數(shù)組np.arange(3)與一個(gè)標(biāo)量2相加,需要將標(biāo)量2拉伸到與一維數(shù)組相同的形狀,再進(jìn)行相加。圖10-1Numpy廣播2科學(xué)計(jì)算NumPy>>>importnumpyasnp>>>arr=np.arange(3)>>>arr[012]>>>arr+=2>>>arr[234]2科學(xué)計(jì)算NumPy2)二維數(shù)組與一維數(shù)組相加在二維數(shù)組中,要實(shí)現(xiàn)一個(gè)二維數(shù)組與一個(gè)一維數(shù)組的和,需要將一維數(shù)組拉伸到與二維數(shù)組相同的形狀,拉伸的值與原一維數(shù)組相同。如圖10-1(b)所示,要實(shí)現(xiàn)一個(gè)3×3的二維數(shù)組與一個(gè)1×3的一維數(shù)組的和,需要將一維數(shù)組拉伸到二維數(shù)組相同的形狀,拉伸位置的值與一維數(shù)組對(duì)應(yīng)相同。圖10-1Numpy廣播2科學(xué)計(jì)算NumPy>>>importnumpyasnp>>>arr=np.arange(9).reshape(3,3)>>>arr2=np.ones(3,dtype=int)>>>arr3=arr+arr2>>>arr3[[123][456][789]]2科學(xué)計(jì)算NumPy3)n*1數(shù)組與1*n數(shù)組相加實(shí)現(xiàn)一個(gè)3×1一維數(shù)組與1×3一維數(shù)組的和,需要將3×1的數(shù)組拉伸為3×3的形狀,同時(shí)將1×3的數(shù)組也拉伸為3×3的形狀,拉伸位置的值為對(duì)應(yīng),如圖10-1(c)所示。圖10-1Numpy廣播2科學(xué)計(jì)算NumPy>>>importnumpyasnp>>>arr=np.arange(3).reshape(3,1)>>>arr2=np.arange(3)>>>arr3=arr+arr2>>>arr3[[012][123][234]]2科學(xué)計(jì)算NumPy4)尾部維度不匹配3×3的二維數(shù)組和1×4的一維數(shù)組求和,結(jié)果會(huì)是什么呢?圖10-1Numpy廣播2科學(xué)計(jì)算NumPy>>>importnumpyasnp>>>arr=np.arange(9).reshape(3,3)>>>arr2=np.ones(4,dtype=int)>>>arr3=arr+arr2Traceback(mostrecentcalllast):File"<pyshell#3>",line1,in<module>arr3=arr+arr2ValueError:operandscouldnotbebroadcasttogetherwithshapes(3,3)(4,)3可視化Matplotlibmatplotlib是一個(gè)優(yōu)秀的Python數(shù)據(jù)可視化庫(kù),用于創(chuàng)建各種靜態(tài)、動(dòng)態(tài)、交互式和嵌入式圖表。它廣泛用于數(shù)據(jù)科學(xué)、統(tǒng)計(jì)學(xué)、金融、工程和其他領(lǐng)域。matplotlib提供了廣泛的圖表類(lèi)型,例如,線圖、散點(diǎn)圖、餅圖、條形圖、直方圖、熱力圖和等高線圖等。它還具有強(qiáng)大的自定義功能,可以讓用戶輕松控制圖表的各個(gè)方面,例如,標(biāo)簽、注釋、顏色、字體和圖例等。matplotlib還可以與其他Python工具和庫(kù)集成。例如,它可以與Numpy、Pandas、SciPy和Seaborn等庫(kù)結(jié)合使用,以更高效地處理和可視化數(shù)據(jù)。安裝matplotlib,命令為:pipinstallmatplotlib3.1創(chuàng)建畫(huà)布和創(chuàng)建子圖3可視化Matplotlib創(chuàng)建一個(gè)空白畫(huà)布,可以指定畫(huà)布大小,像素等參數(shù)。plt.figure(num,figsize=None,dpi=None,facecolor=None,edgecolor=None,frameon=True)num:圖像編號(hào)或名稱,數(shù)字為編號(hào),字符串為名稱。figsize:指定figure的寬和高,單位為英寸。dpi:指定繪圖對(duì)象的分辨率。facecolor:背景顏色。edgecolor:邊框顏色。frameon:是否顯示邊框。3可視化Matplotlib>>>importmatplotlib.pyplotasplt>>>plt.figure(figsize=(8,6))>>>plt.show()3可視化Matplotlib創(chuàng)建并選中子圖,可以指定子圖的行數(shù)、列數(shù)、選中圖片編號(hào)figure.subplot(nrows,ncols,plot_number)nrows:子圖的行數(shù),ncols:子圖的列數(shù),plot_number:子圖的編號(hào)。3可視化Matplotlib多個(gè)對(duì)其的行和列子圖是一種常見(jiàn)的需求,matplotlib提供了subplot()函數(shù)在網(wǎng)格中創(chuàng)建單個(gè)子圖,該函數(shù)中,nrows表示行數(shù),ncols表示列數(shù),plot_number為索引位置,下列在全局繪圖區(qū)域中創(chuàng)建2×3個(gè)子繪圖區(qū)域。>>>importmatplotlib.pyplotasplt>>>foriinrange(1,7) plt.subplot(2,3,i)>>>plt.show()3可視化Matplotlibmatplotlib還提供了axes()函數(shù)自定義繪制子圖的功能,通過(guò)指定參數(shù)來(lái)控制繪圖區(qū)域的位置、大小和比例等。plt.axes(rect)rect:包含四個(gè)浮點(diǎn)數(shù)的列表或元組,表示坐標(biāo)軸的位置和尺寸。通常采用(left、bottom、width、height)的形式,表示相對(duì)于繪圖區(qū)域的左下角的位置和寬度、高度。3可視化Matplotlib>>>importmatplotlib.pyplotasplt>>>plt.figure(figsize=(12,6))#react1、react2、react3表示子圖的位置>>>react1=[0.1,0.55,0.65,0.35]
#[左,下,寬,高]規(guī)定子圖的區(qū)域>>>react2=[0.1,0.1,0.65,0.35]>>>react3=[0.8,0.1,0.15,0.8]>>>plt.axes(react1)>>>plt.axes(react2)>>>plt.axes(react3)>>>plt.show()3.2添加畫(huà)布內(nèi)容3可視化Matplotlib在創(chuàng)建一個(gè)空白畫(huà)布后,如何繪制圖的繪圖的主體部分呢。其中添加標(biāo)題、坐標(biāo)軸名稱、繪制圖形等步驟是并列的,沒(méi)有先后順序,可以先繪制圖形,也可以先添加各類(lèi)標(biāo)簽。但是添加圖例一定要在繪制圖形之后。plt常用的標(biāo)簽設(shè)置函數(shù)見(jiàn)表10-6。3可視化Matplotlibimportnumpyasnpimportmatplotlib.pyplotaspltplt.rcParams['font.sans-serif']=['SimHei']#正常顯示中文標(biāo)簽plt.figure(figsize=(8,6))#創(chuàng)建畫(huà)布data=np.arange(0,1,0.01)#使用Numpy創(chuàng)建數(shù)據(jù)plt.title('函數(shù)示例')#設(shè)置標(biāo)題plt.xlabel('X軸')#設(shè)置X軸名稱plt.ylabel('Y軸')#設(shè)置Y軸名稱plt.xlim(0,1)#指定當(dāng)前圖形x軸的范圍plt.ylim(0,1)#指定當(dāng)前圖形y軸的范圍plt.xticks([0,0.2,0.4,0.6,0.8,1])#X軸刻度的數(shù)目與取值plt.yticks([0,0.2,0.4,0.6,0.8,1])#Y軸刻度的數(shù)目與取值plt.plot(data,data**2,'-')plt.plot(data,data**3,':')plt.legend(['y=x^2','y=x^3'])#設(shè)置當(dāng)前圖形的圖例plt.show()3.3繪圖的顯示與保存3可視化Matplotlib在本機(jī)上顯示繪圖,可以調(diào)用matplotlib的show()函數(shù)plt.show()保存繪圖通常采用savefig()函數(shù),該函數(shù)功能如下:fig.savefig(save_path,format='png',dpi=300)save_path:保存路徑;format:文件格式為png、pdf、svg、ps等;dpi:設(shè)置每英寸點(diǎn)數(shù)的分辨率,默認(rèn)為100。3.4pyplot的動(dòng)態(tài)rc參數(shù)3可視化Matplotlibpyplot使用rc配置文件來(lái)自定義圖形的各種默認(rèn)屬性,被稱為rc配置或rc參數(shù)。
在pyplot中幾乎所有的默認(rèn)屬性都是可以控制的,例如,視圖窗口大小以及每英寸點(diǎn)數(shù)、線條寬度、顏色和樣式、坐標(biāo)軸、坐標(biāo)和網(wǎng)格屬性、文本、字體等。兩種方式可以設(shè)置參數(shù),即全局參數(shù)定制和rc設(shè)置方法。查看matplotlib的rc參數(shù):>>>importmatplotlibasplt>>>plt.rc_params()3.4pyplot的動(dòng)態(tài)rc參數(shù)3可視化Matplotlib常用參數(shù):?Axes:設(shè)置坐標(biāo)軸邊界、顏色、坐標(biāo)、刻度值大小和網(wǎng)格的顯示;?Figure:設(shè)置邊界顏色、圖形大小和子區(qū);?Font:設(shè)置字號(hào)、字體和樣式;?Grid:設(shè)置網(wǎng)格顏色和線型;?Legend:設(shè)置圖例和其中的文本顯示;?Lines:設(shè)置線條顏色、寬度、線型等;?Savefig:對(duì)保存圖像進(jìn)行單獨(dú)設(shè)置;?xtick和ytick:X、Y軸的主刻度和次刻度設(shè)置顏色、大小、方向和標(biāo)簽大小。3.4pyplot的動(dòng)態(tài)rc參數(shù)3可視化Matplotlib為了正確顯示中文字符,一般在程序中加入下列代碼更改默認(rèn)設(shè)置。顯示中文后,會(huì)出現(xiàn)數(shù)字前的負(fù)號(hào)無(wú)法正常顯示,可以添加第二行代碼。一些常見(jiàn)的字體名稱和對(duì)應(yīng)的英文名稱見(jiàn)表10-7。plt.rcParams['font.sans-serif']=['SimHei']#正常顯示中文標(biāo)簽plt.rcParams['axes.unicode_minus']=False#正常顯示負(fù)號(hào)3可視化Matplotlib3可視化Matplotlib線條的常用rc參數(shù)名稱、解釋和取值見(jiàn)表10-8。3可視化Matplotlib常用的線條類(lèi)型解釋見(jiàn)表10-9。常用的8種顏色的縮寫(xiě)見(jiàn)表10-10。3.5常見(jiàn)圖形繪制3可視化Matplotlib1.折線圖折線圖(linechart)是一種將數(shù)據(jù)點(diǎn)按照順序連接起來(lái)的圖形。可以看作是將散點(diǎn)圖,按照x軸坐標(biāo)順序連接起來(lái)的圖形。plt.plot(*args,**kwargs)plot()函數(shù)在官方文檔的語(yǔ)法中只要求填入不定長(zhǎng)參數(shù),實(shí)際可以填入的主要參數(shù)見(jiàn)表10-11。3.5常見(jiàn)圖形繪制3可視化Matplotlib1.折線圖3.5常見(jiàn)圖形繪制3可視化Matplotlib1.折線圖importmatplotlibaspltt=np.arange(0.,5.,0.2)plt.plot(t,t,'r',t,t**2,'bs',t,t**3,'g^')plt.show()3.5常見(jiàn)圖形繪制3可視化Matplotlib2.散點(diǎn)圖散點(diǎn)圖(scatterdiagram)又稱為散點(diǎn)分布圖,是以一個(gè)特征為橫坐標(biāo),另一個(gè)特征為縱坐標(biāo),利用坐標(biāo)點(diǎn)(散點(diǎn))的分布形態(tài)反映特征間的統(tǒng)計(jì)關(guān)系的一種圖形。值是由點(diǎn)在圖表中的位置表示,類(lèi)別是由圖表中的不同標(biāo)記表示,通常用于比較跨類(lèi)別的數(shù)據(jù)。3.5常見(jiàn)圖形繪制3可視化Matplotlib2.散點(diǎn)圖matplotlib.pyplot.scatter(x,y,s=None,c=None,marker=None,alpha=None)參數(shù)解析:?x,y:數(shù)組或者標(biāo)量,表示散點(diǎn)的x和y坐標(biāo)。?s:標(biāo)量或數(shù)組,可選。表示點(diǎn)的大小。?c:顏色、序列、或者數(shù)組??蛇x。表示點(diǎn)的顏色。?marker:標(biāo)量或字符串,可選。表示點(diǎn)的形狀。alpha:標(biāo)量,可選。表示點(diǎn)的透明度。3.5常見(jiàn)圖形繪制3可視化Matplotlib2.散點(diǎn)圖importnumpyasnpimportmatplotlib.pyplotaspltfig,ax=plt.subplots()#plt.title('散點(diǎn)圖示例')formarin['.','o','D']:n=100x,y=np.random.randn(2,n)ax.scatter(x,y,label=mar,marker=mar)ax.legend()ax.grid(True)plt.show()3.5常見(jiàn)圖形繪制3可視化Matplotlib3.直方圖直方圖(histogram)又稱質(zhì)量分布圖,是統(tǒng)計(jì)報(bào)告圖的一種,由一系列高度不等的縱向條紋或線段表示數(shù)據(jù)分布的情況,一般用橫軸表示數(shù)據(jù)所屬類(lèi)別,縱軸表示數(shù)量或者占比。用直方圖可以比較直觀地看出產(chǎn)品質(zhì)量特性的分布狀態(tài),便于判斷其總體質(zhì)量分布情況。直方圖可以發(fā)現(xiàn)分布表無(wú)法發(fā)現(xiàn)的數(shù)據(jù)模式、樣本的頻率分布和總體的分布。3.5常見(jiàn)圖形繪制3可視化Matplotlibmatplotlib.pyplot.hist(x,bins=None,range=None,density=False)參數(shù)說(shuō)明:?x:要繪制直方圖的數(shù)據(jù)。?bins:可選參數(shù),指定直方圖的區(qū)間個(gè)數(shù)或邊界。如果不提供此參數(shù),默認(rèn)為10個(gè)區(qū)間。?range:可選參數(shù),指定直方圖的數(shù)據(jù)范圍。如果不提供此參數(shù),默認(rèn)為數(shù)據(jù)的最小值和最大值。?density:可選參數(shù),指定是否將直方圖的值歸一化為概率密度(即將計(jì)數(shù)除以總數(shù)以得到占比),默認(rèn)為False。3可視化Matplotlibimportmatplotlib.pyplotaspltimportrandom#生成12個(gè)月的隨機(jī)銷(xiāo)售數(shù)據(jù)#假定每月銷(xiāo)售額在10000到50000之間sales_data=[random.randint(10000,50000)for_inrange(12)]months=range(1,13)#生成1到12的月份#繪制銷(xiāo)售數(shù)據(jù)的直方圖plt.figure(figsize=(8,6))#設(shè)置圖形大小plt.hist(sales_data,bins=6,color='skyblue',edgecolor='black')plt.rcParams['font.sans-serif']=['SimHei']#正常顯示中文標(biāo)簽plt.title('公司銷(xiāo)售數(shù)據(jù)—銷(xiāo)售額分布圖',fontsize=16)#圖表標(biāo)題plt.tick_params(labelsize=16)#修改x,y軸刻度字體大小plt.xlabel('銷(xiāo)售額',fontsize=16)#X軸標(biāo)簽plt.ylabel('頻率',fontsize=16)#Y軸標(biāo)簽plt.show()3.5常見(jiàn)圖形繪制3可視化Matplotlib4.餅圖餅圖(piegraph)是將各項(xiàng)的大小與各項(xiàng)總和的比例顯示在一張“餅”中,以“餅”的大小來(lái)確定每一項(xiàng)的占比。餅圖可以比較清楚地反映出部分與部分、部分與整體之間的比例關(guān)系,易于顯示每組數(shù)據(jù)相對(duì)于總數(shù)的大小,而且顯現(xiàn)方式直觀。3可視化Matplotlibmatplotlib.pyplot.pie(x,explode=None,labels=None,colors=None,autopct=None,shadow=False,startangle=None)參數(shù)說(shuō)明:?x:餅圖的數(shù)據(jù),可以是一個(gè)數(shù)組或者列表;其中,數(shù)組的每個(gè)元素代表一個(gè)扇形的大小,數(shù)組的總和決定了餅圖的總大小。?explode:可選參數(shù),用于指定哪些扇形將會(huì)被“爆破”(分離出來(lái))。默認(rèn)值為None,表示不分離任何扇形。?labels:可選參數(shù),用于為每個(gè)扇形添加標(biāo)簽,默認(rèn)值為None。?colors:可選參數(shù),用于指定餅圖的顏色,默認(rèn)值為None,表示使用默認(rèn)的matplotlib顏色循環(huán)。?autopct:可選參數(shù),用于為每個(gè)扇形添加百分比標(biāo)簽,默認(rèn)值為None,表示不顯示百分比標(biāo)簽。?shadow:可選參數(shù),用于為餅圖添加陰影效果,默認(rèn)值為False,表示不顯示陰影。?startangle:可選參數(shù),用于指定餅圖的起始角度,默認(rèn)值為None,表示以x軸正方向?yàn)槠鹗冀嵌取?可視化Matplotlibimportmatplotlib.pyplotaspltplt.rcParams['font.sans-serif']=['FangSong']#正常顯示中文標(biāo)簽seasons=['春季','夏季','秋季','冬季']#定義季節(jié)sales=[3000,4500,2000,3500]#定義每個(gè)季節(jié)的銷(xiāo)售額explode=(0.05,0.2,0.05,0.05)#控制分離的距離的,突出銷(xiāo)售額最大的plt.pie(sales,labels=seasons,explode=explode,autopct='%1.1f%%')#繪制餅圖plt.title('四季銷(xiāo)售額比例')#添加標(biāo)題plt.show()#顯示圖形4PandasPandas(pythondataanalysislibrary)是基于Numpy的數(shù)據(jù)分析模塊,它提供了大量標(biāo)準(zhǔn)數(shù)據(jù)模型和高效操作大型數(shù)據(jù)集所需的工具??梢哉f(shuō)Pandas是使得Python能夠成為高效且強(qiáng)大的數(shù)據(jù)分析環(huán)境的重要因素之一。Pandas的主要數(shù)據(jù)結(jié)構(gòu)是Series(一維數(shù)據(jù))與DataFrame(二維數(shù)據(jù)),這兩種數(shù)據(jù)結(jié)構(gòu)足以處理金融、統(tǒng)計(jì)、社會(huì)科學(xué)、工程等領(lǐng)域里的大多數(shù)典型用例。安裝Pandas,命令為pipinstallpandas引用Pandas方式為importpandasaspd4.1SeriesSeries是一種一維數(shù)組對(duì)象,包含了一個(gè)值序列,并且包含了數(shù)據(jù)標(biāo)簽,稱為索引(index),可通過(guò)索引來(lái)訪問(wèn)數(shù)組中的數(shù)據(jù)。通過(guò)指定索引和值來(lái)創(chuàng)建Series,下例中的索引與默認(rèn)索引一致。4Pandasimportpandasaspda=list(range(5))b=['a','b','c','d','e']c=pd.Series(b,index=a,name='c')print(c)0a1b2c3d4eName:c,dtype:object4.2DataFrameDataFrame是一個(gè)表格型的數(shù)據(jù)結(jié)構(gòu),它含有一組有序的列,每列可以是不同的值類(lèi)型(數(shù)值、字符串、布爾值等)。DataFrame既有行索引也有列索引,它可以被看做由Series組成的字典(共用同一個(gè)索引)。創(chuàng)建DataFrame,格式如下:pd.DataFrame(data,index,columns,dtype,copy)data:一組數(shù)據(jù)(ndarray、series,map,lists,dict等類(lèi)型);index:索引值,或者可以稱為行標(biāo)簽;columns:列標(biāo)簽,默認(rèn)為RangeIndex(0,1,2,…,n);dtype:數(shù)據(jù)類(lèi)型;
copy:拷貝數(shù)據(jù),默認(rèn)為False。4Pandas下面將演示使用Pandas創(chuàng)建的內(nèi)容,見(jiàn)表10-12。>>>importpandasaspd>>>columns=['姓名','語(yǔ)文','數(shù)學(xué)','外語(yǔ)','體育']>>>index=['0001','0002','0003','0004']>>>data=[['張三',97,93,96,100],['李四',94,97,94,97],['王五',96,94,99,92],['小明',91,97,93,99]]>>>df=pd.DataFrame(data,index=index,columns=columns)>>>pd.set_option('display.unicode.east_asian_width',True)#設(shè)置列名對(duì)齊>>>df4PandasDataFrame會(huì)自動(dòng)加上索引(跟Series一樣),且全部列會(huì)被有序排列。如果指定了列序列,則DataFrame的列就會(huì)按照指定順序進(jìn)行排列。DataFrame的基礎(chǔ)屬性有index、columns、values、size、ndim、shape和dtypes,其解釋見(jiàn)表10-134Pandas下面將演示輸出DataFrame的基礎(chǔ)屬性。>>>df.indexIndex(['0001','0002','0003','0004'],dtype='object')>>>df.columnsIndex(['姓名','語(yǔ)文','數(shù)學(xué)','外語(yǔ)','體育'],dtype='object')>>>df.values[['張三'979396100]['李四'94979497]['王五'96949992]['小明'91979399]]4Pandas>>>df.size20>>>df.ndim2>>>df.shape(4,5)>>>df.dtypes姓名object語(yǔ)文int64數(shù)學(xué)int64外語(yǔ)int64體育int64dtype:object4.3數(shù)據(jù)查詢通過(guò)列索引或以屬性的方式可以單獨(dú)獲取DataFrame的列數(shù)據(jù),返回的數(shù)據(jù)類(lèi)型為Series。>>>df['姓名']0001張三0002李四0003王五0004小明Name:姓名,dtype:object4Pandas通過(guò)切片形式可以選取一行或多行數(shù)據(jù)。查詢成績(jī)表中李四和王五的所有成績(jī)。>>>df[1:3]姓名語(yǔ)文數(shù)學(xué)外語(yǔ)體育0002李四949794970003王五96949992head()、tail()和sample()通過(guò)DataFrame提供的head()和tail()方法可以得到多行數(shù)據(jù),head()方法從開(kāi)始獲取連續(xù)的數(shù)據(jù),tail()方法從末尾獲取連續(xù)的數(shù)據(jù)。sample可以隨機(jī)抽取數(shù)據(jù)并顯示。它們的使用方法如下:head(n)#獲取前n行,默認(rèn)獲取前5行tail(n)#獲取最后n行,默認(rèn)獲取最后5行sample(n)#隨機(jī)抽取n行顯示sample(frac=0.6)#隨機(jī)抽取60%的行4Pandasloc和iloc:DataFrame.loc(行索引名稱或條件,列索引名稱)loc屬性根據(jù)指定參數(shù)的索引或者索引條件進(jìn)行索引,返回指定索引的數(shù)據(jù)。返回指定行的數(shù)據(jù),類(lèi)型為Series,返回多行數(shù)據(jù),類(lèi)型為DataFrame。DataFrame.iloc(行索引位置,列索引位置)iloc屬性根據(jù)指定參數(shù)的位置進(jìn)行索引,返回指定行和列的索引數(shù)據(jù)。4Pandasloc和iloc:下面例子分別演示了根據(jù)指定索引“0001”輸出第一行數(shù)據(jù)、輸出第一行和第二行數(shù)據(jù),篩選語(yǔ)文成績(jī)大于95的學(xué)生姓名,使用iloc屬性,輸出王五同學(xué)的體育成績(jī)。4Pandas>>>df.loc['0001']姓名張三語(yǔ)文97數(shù)學(xué)93外語(yǔ)96體育100Name:0001,dtype:object>>>df.loc['0001':'0002']姓名語(yǔ)文數(shù)學(xué)外語(yǔ)體育0001張三979396
1000002李四94979497>>>df.loc[df['語(yǔ)文']>95,['姓名‘]]姓名0001張三0003王五>>>df.iloc[2,4]92DataFrame.query方法查詢數(shù)據(jù)4Pandas4.4數(shù)據(jù)清洗在采集過(guò)數(shù)據(jù)程中,獲取的數(shù)據(jù)一般是不完整的、有噪聲的、形狀不一致的,因此,在使用數(shù)據(jù)之前需要對(duì)數(shù)據(jù)進(jìn)行清洗。1、缺失值統(tǒng)計(jì)isnull()函數(shù)可以檢測(cè)數(shù)據(jù)中的缺失值,如果值缺失返回True,否則返回False。也可以和sum()函數(shù)配合使用,統(tǒng)計(jì)每列的缺失值數(shù)量。4Pandas>>>df=pd.DataFrame(np.arange(12).reshape(3,4),columns=['a','b','c','d'])#將第二行和第二列置空>>>df['b']=np.nan>>>df.iloc[1,:]=np.nan>>>dfa
bcd0
0.0
NaN
2.0
3.01
NaN
NaN
NaN
NaN2
8.0
NaN
10.0
11.04Pandas>>>df.isnull()abcd0
False
True
False
False1
True
True
True
True2
False
True
False
False>>>df.isnull().sum()a1b3c1d1dtype:int642、缺失值處理在處理缺失值時(shí)常用兩種方法:刪除缺失值和填充缺失值。1)刪除缺失值:通過(guò)dropna方法可以刪除具有缺失值的行。格式如下:dropna(axis=0,how='any',thresh=None,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2031年中國(guó)豬舍自動(dòng)喂料裝置行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2031年中國(guó)合成紙復(fù)合氣泡信封袋行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2031年中國(guó)中秋月餅行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2030年中國(guó)高鋁質(zhì)致密澆注料數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)靴/鞋面曲線定型機(jī)數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)超強(qiáng)開(kāi)鎖器數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)燃?xì)馊∨O(shè)備數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)滑臺(tái)吸塑包裝機(jī)數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)操縱分檔器開(kāi)關(guān)數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)平均速度儀數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 酒店長(zhǎng)包房租賃協(xié)議書(shū)范本
- 2 找春天 公開(kāi)課一等獎(jiǎng)創(chuàng)新教學(xué)設(shè)計(jì)
- 2025年幾內(nèi)亞水泥廠項(xiàng)目投資可行性報(bào)告
- 2025年江蘇護(hù)理職業(yè)學(xué)院高職單招語(yǔ)文2018-2024歷年參考題庫(kù)頻考點(diǎn)含答案解析
- 2025年江蘇南京水務(wù)集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- 口腔門(mén)診分診流程
- 建筑工程施工安全管理課件
- 2025年春新外研版(三起)英語(yǔ)三年級(jí)下冊(cè)課件 Unit2第1課時(shí)Startup
- 2025年上半年畢節(jié)市威寧自治縣事業(yè)單位招考考試(443名)易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年天津市寧河區(qū)事業(yè)單位招聘12人重點(diǎn)基礎(chǔ)提升(共500題)附帶答案詳解-1
- 處方點(diǎn)評(píng)知識(shí)培訓(xùn)
評(píng)論
0/150
提交評(píng)論