《大數(shù)據(jù)分析:基于Python》 課件 第10章 應(yīng)用案例分析_第1頁(yè)
《大數(shù)據(jù)分析:基于Python》 課件 第10章 應(yīng)用案例分析_第2頁(yè)
《大數(shù)據(jù)分析:基于Python》 課件 第10章 應(yīng)用案例分析_第3頁(yè)
《大數(shù)據(jù)分析:基于Python》 課件 第10章 應(yīng)用案例分析_第4頁(yè)
《大數(shù)據(jù)分析:基于Python》 課件 第10章 應(yīng)用案例分析_第5頁(yè)
已閱讀5頁(yè),還剩33頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

大數(shù)據(jù)分析:基于Python

第10章

應(yīng)用案例分析余本國(guó)本章將主要是綜合案例分析,涉及爬蟲(chóng)庫(kù)request和HTML網(wǎng)頁(yè)分析beautifulsoup庫(kù),jieba分詞,wordcloud庫(kù),以及NetworkX可視化庫(kù)的應(yīng)用。10.1案例1爬蟲(chóng)與文本分析本案例主要是獲取網(wǎng)頁(yè)上的標(biāo)題內(nèi)容,并對(duì)標(biāo)題詞語(yǔ)進(jìn)行統(tǒng)計(jì),計(jì)算出前top10個(gè)高頻詞,并對(duì)獲取的所有的標(biāo)題文本做出詞云圖。為了獲取網(wǎng)頁(yè)上所需要的內(nèi)容,需先對(duì)整個(gè)網(wǎng)頁(yè)內(nèi)容的獲取,再對(duì)網(wǎng)頁(yè)進(jìn)行HTML代碼分析,找到所需的內(nèi)容并進(jìn)行提取。10.1.1獲取網(wǎng)頁(yè)爬蟲(chóng)的第一步是獲取網(wǎng)頁(yè),而獲取網(wǎng)頁(yè)中最關(guān)鍵的一步就是模擬瀏覽器向服務(wù)器發(fā)出網(wǎng)絡(luò)請(qǐng)求,一般使用requests庫(kù)的get()函數(shù)。requests庫(kù)是Python第三方庫(kù),需要安裝:pipinstallrequests。requests庫(kù)的作用發(fā)起各種網(wǎng)絡(luò)請(qǐng)求,用法如下:requests.get(url[,headers=headers])其中:url:表示要獲取網(wǎng)頁(yè)的網(wǎng)址。headers:獲取響應(yīng)的響應(yīng)頭。

一般網(wǎng)站往往都會(huì)檢測(cè)請(qǐng)求頭的User-Agent,如果UA不合法,可能會(huì)獲取不到響應(yīng),一種反爬蟲(chóng)技術(shù)。所以加請(qǐng)求頭的目的就是模擬瀏覽器,欺騙服務(wù)器,獲取和瀏覽器一致的內(nèi)容。當(dāng)然,有的時(shí)候甚至不止需要傳User-Agent一個(gè)參數(shù),請(qǐng)求信息還需要其他的參數(shù)像Referer,Cookie等等。requests添加多個(gè)請(qǐng)求頭信息,使用字典鍵值對(duì)的形式實(shí)現(xiàn)。如headers={"User-Agent":'Mozilla/5.0(Macintosh;IntelMacOSX10_14_3)AppleWebKit/537.36(KHTML,likeGecko)Chrome/89.0.4389.114Safari/537.36'}如向百度網(wǎng)頁(yè)發(fā)起網(wǎng)絡(luò)請(qǐng)求。In[1]:importrequestsurl=''response=requests.get(url)#通過(guò)get方法向目標(biāo)url發(fā)送get請(qǐng)求,返回response對(duì)象print(response)#返回<Response[200]>表示網(wǎng)絡(luò)請(qǐng)求成功

<Response[200]>requests.get(url)得到的結(jié)果是一個(gè)Response對(duì)象,其中響應(yīng)狀態(tài)碼200代表服務(wù)器成功處理了請(qǐng)求,即訪問(wèn)網(wǎng)頁(yè)成功,若是響應(yīng)狀態(tài)碼是418,表示訪問(wèn)的網(wǎng)站有反爬蟲(chóng)機(jī)制。響應(yīng)狀態(tài)碼共分為5種類(lèi)型:1xx(臨時(shí)響應(yīng)):表示臨時(shí)響應(yīng)并需要請(qǐng)求者繼續(xù)執(zhí)行操作的狀態(tài)代碼。2xx(成功):表示成功處理了請(qǐng)求的狀態(tài)代碼。3xx(重定向):表示要完成請(qǐng)求,需要進(jìn)一步操作。4xx(請(qǐng)求錯(cuò)誤):這些狀態(tài)代碼表示請(qǐng)求可能出錯(cuò),妨礙了服務(wù)器的處理。5xx(服務(wù)器錯(cuò)誤):這些狀態(tài)代碼表示服務(wù)器在嘗試處理請(qǐng)求時(shí)發(fā)生內(nèi)部錯(cuò)誤。常見(jiàn)的響應(yīng)狀態(tài)碼:200:服務(wù)器成功返回網(wǎng)頁(yè)404:請(qǐng)求的網(wǎng)頁(yè)不存在503:服務(wù)不可用如向豆瓣網(wǎng)頁(yè)發(fā)起網(wǎng)絡(luò)請(qǐng)求:In[1]:importrequestsurl=r"/tag/%E5%B0%8F%E8%AF%B4?start=0&type=T"response=requests.get(url)

In[2]:responseOut[2]:<Response[418]>為了能夠正常的獲取信息,此時(shí)就需要用到獲取響應(yīng)的響應(yīng)頭參數(shù)headers。In[3]:importrequestsurl=r"/tag/%E5%B0%8F%E8%AF%B4?start=0&type=T"headers={"User-Agent":"ozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/80.0.3987.162Safari/537.36"}response=requests.get(url,headers=headers)print(response)

<Response[200]>此處headers使用的參數(shù)信息是模擬windowsNT系統(tǒng)Chrome瀏覽器。發(fā)起請(qǐng)求獲取后,對(duì)網(wǎng)頁(yè)內(nèi)容需進(jìn)行獲取,需要使用response.text和response.content。有時(shí)為了為了獲取正確的文本,還需要獲取文本編碼response.encoding。In[4]:print(response.encoding)#獲取編碼方式utf-8

In[5]:html_data=response.text#獲取網(wǎng)頁(yè)代碼信息print(html_data)

<!DOCTYPEhtml><htmllang="zh-cmn-Hans"class="ua-windowsua-webkitbook-new-nav"><head><metahttp-equiv="Content-Type"content="text/html;charset=utf-8"><title>

豆瓣圖書(shū)標(biāo)簽:小說(shuō)</title><script>!function(e){varo=function(o,n,t){varc,i,r=newDate;n=n||30,t=t||"/",r.setTime(r.getTime()+24*n*60*60*1e3),c=";expires="+r.toGMTString();for(iino)e.cookie=i+"="+o[i]+c+";path="+t},n=function(o){var……(由于信息過(guò)多,此處省略)……response.text返回的是一個(gè)unicode型的文本數(shù)據(jù),適用于文本數(shù)據(jù)的爬??;response.content返回的是bytes型的二進(jìn)制數(shù)據(jù),適用于圖片、文件的爬取。10.1.2網(wǎng)頁(yè)內(nèi)容與代碼標(biāo)簽我們以“豆瓣圖書(shū)標(biāo)簽:小說(shuō)”頁(yè)面為例,獲取頁(yè)面的小說(shuō)名稱(chēng)、作者、出版社、出版時(shí)間以及價(jià)格等。圖10-1中的B區(qū)域和A區(qū)域中以“<liclass=”開(kāi)頭的都是顯示每部小說(shuō)相關(guān)信息的列表。10.1.3提取網(wǎng)頁(yè)內(nèi)容以獲取中國(guó)日?qǐng)?bào)中文網(wǎng)上的新聞標(biāo)題為例,將爬取到的內(nèi)容進(jìn)行分詞,分析標(biāo)題熱詞都有哪些,并做成詞云圖。首先獲取頁(yè)面內(nèi)容。In[6]:importrequests frombs4importBeautifulSoup url='/' html=requests.get(url)

html_text=html.text從HTML頁(yè)面可知,其頁(yè)面的標(biāo)簽高亮顯示對(duì)應(yīng)HTML的div元素下的h1、h2標(biāo)簽In[7]:soup=BeautifulSoup(html_text,"lxml")#依賴(lài)lxml解析器來(lái)解析網(wǎng)頁(yè)

In[8]:all_h=soup.find_all({"h1","h2"})

In[9]:print(len(all_h))86

In[10]:all_h[:3]Out[10]:[<h1><aclass="thbt"href="http:///a/202312/31/WS65911f5ba310af3247ffa506.html"shape="rect"target="_blank">“把人民的期待變成我們的行動(dòng),把人民的希望變成生活的現(xiàn)實(shí)”</a></h1>,<h2><span><ahref="http:///a/202312/31/WS6591218ba310af3247ffa50c.html"shape="rect"target="_blank">《求是》雜志發(fā)表習(xí)近平總書(shū)記重要文章《以美麗中國(guó)建設(shè)全面推進(jìn)人與自然和諧共生的現(xiàn)代化》</a></span>…….<h1><ahref="http:///a/202312/30/WS658f6c7ca310af3247ffa397.html"shape="rect"target="_blank">全國(guó)政協(xié)舉行新年茶話(huà)會(huì)</a></h1>]代碼行soup=BeautifulSoup(html_text,"lxml")是依賴(lài)lxml解析器來(lái)解析網(wǎng)頁(yè),并提供定位內(nèi)容的便捷接口。代碼行soup.find_all({"h1","h2"})是從soup中查找標(biāo)簽"h1"和"h2"的內(nèi)容,也可以用soup.select('h2')和soup.select('h1')來(lái)逐一提取,提取的內(nèi)容是一個(gè)列表。從上面的運(yùn)行結(jié)果可以看出,盡管標(biāo)題都包含在列表中的每個(gè)元素里,但在標(biāo)簽h2中含有多個(gè)需要提取的標(biāo)題,所以提取標(biāo)題的方法不能簡(jiǎn)單的使用for循環(huán)來(lái)提取。In[11]:importreall_h_str=",".join([str(i)foriinall_h])#將列表連接成字符串

ptm=r'target="_blank">(.*?)</a>'#正則表達(dá)式匹配標(biāo)題re.findall(ptm,all_h_str)#匹配查找所有符合匹配模式的標(biāo)題Out[11]:['國(guó)家主席習(xí)近平發(fā)表二〇二四年新年賀詞(全文)','《求是》雜志發(fā)表習(xí)近平總書(shū)記重要文章《以美麗中國(guó)建設(shè)全面推進(jìn)人與自然和諧共生的現(xiàn)代化》','從這80幅海報(bào)里,讀懂2023年的治國(guó)理政腳步','習(xí)近平:以美麗中國(guó)建設(shè)全面推進(jìn)人與自然和諧共生的現(xiàn)代化','看圖學(xué)習(xí)丨重溫習(xí)主席新年賀詞:一往無(wú)前、頑強(qiáng)拼搏,讓明天的中國(guó)更美好','創(chuàng)意海報(bào)丨和總書(shū)記一起辭舊迎新!','國(guó)家主席習(xí)近平發(fā)表二〇二四年新年賀詞','中國(guó)日?qǐng)?bào)視覺(jué)中心:記錄中國(guó)影像傳播中國(guó)故事',……'多彩慶元旦歡喜迎新年']In[12]:len(_)#此處“_”表示上一次運(yùn)行的結(jié)果所有的標(biāo)題已經(jīng)提取完畢,共計(jì)91條。10.1.4文本分析與可視化對(duì)標(biāo)題進(jìn)行分詞,找出出現(xiàn)頻率最高top10,并提取關(guān)鍵短語(yǔ)和做出詞云圖。用wordcloud做詞云圖,需要用到j(luò)ieba對(duì)文本做分詞。需要先安裝這兩庫(kù),安裝命令:pipinstalljiebapipinstallwordcloud我們需要先將上節(jié)中的91條標(biāo)題列表連接成一個(gè)文本,再對(duì)其使用jieba分詞,并將分詞中的停用詞(如“的”等虛詞以及標(biāo)點(diǎn)符號(hào)等)剔除掉,再對(duì)其進(jìn)行詞頻統(tǒng)計(jì),提取關(guān)鍵短語(yǔ),并作出詞云圖。1.jieba分詞jieba分詞對(duì)中文使用jieba.cut(),生成的是一個(gè)生成器,可以通過(guò)for循環(huán)來(lái)取里面的每一個(gè)詞,如word_list=[wordforwordinjieba.cut(text)],就是將文本text用jieba.cut()分詞后,用for循環(huán)將其中的每一個(gè)分割出來(lái)的詞語(yǔ)做成了列表word_list。In[13]:importjiebatext="".join(re.findall(ptm,all_h_str))#連接所有的標(biāo)題

In[14]:new_text="".join(jieba.cut(text))#對(duì)text分詞并用空格符連接停用詞用記事本記錄,每個(gè)詞占一行,如圖所示,保存成stopwords.txt。In[15]:new_word=''#創(chuàng)建一個(gè)空字符串#逐行讀取停用詞表,存入列表中

stopwords=[line.strip()forlineinopen('stopwords.txt',encoding='UTF-8').readlines()]forelementinnew_text:ifelementnotinstopwords:new_word+=elementprint(new_word)

國(guó)家主席習(xí)近平發(fā)表

四新賀詞(全文)

求是

雜志發(fā)表習(xí)近平總書(shū)記重要文章

以美麗中國(guó)建設(shè)全面推進(jìn)人與自然和諧共生

現(xiàn)代化

從這80幅海報(bào)里

讀懂03治國(guó)理政腳步

習(xí)近平

以美麗中國(guó)建設(shè)全面推進(jìn)人與自然和諧共生

現(xiàn)代化

看圖學(xué)習(xí)

重溫習(xí)主席新賀詞

一往無(wú)前

頑強(qiáng)拼搏

讓明天

中國(guó)更美好

創(chuàng)意海報(bào)

和總書(shū)記一起辭舊迎新!

國(guó)家主席習(xí)近平發(fā)表

四新賀詞

中國(guó)報(bào)視覺(jué)中心

記錄中國(guó)影像

傳播中國(guó)故事

……三季度國(guó)國(guó)際收支基本平衡

跨境投資活動(dòng)有序開(kāi)展

中國(guó)報(bào)漫畫(huà)

霸權(quán)眼光

多彩慶元旦

歡喜迎新2.統(tǒng)計(jì)詞頻

對(duì)已經(jīng)分詞并且剔除了停用詞的標(biāo)題文本進(jìn)行詞頻統(tǒng)計(jì)做成字典word_counts,并進(jìn)行排序。In[16]:word_counts={}forwordinnew_word.split():ifwordinword_counts:word_counts[word]+=1else:word_counts[word]=1

sorted_dict=sorted(word_counts.items(),key=lambdax:x[1])print(sorted_dict)

[('求是',1),('雜志',1),('重要',1),('文章',1),('80',1),('幅',1),('里',1),('讀懂',1),('治國(guó)',1),('理政',1),('腳步',1),('圖',1),('重',1),('溫習(xí)',1),('一往無(wú)前',1),('頑強(qiáng)拼搏',1),('更',1),……('影響',6),('人員',6),('發(fā)展',6),('中國(guó)報(bào)',7),('國(guó)',7),('美國(guó)',7),('將',8),('制造業(yè)',8),('世界',9),('03',13),('中國(guó)',20)]3.關(guān)鍵詞和短語(yǔ)提取

關(guān)鍵詞和短語(yǔ)直接使用jieba.analyse模塊。In[17]:importjieba.analyse#基于TF-IDF算法進(jìn)行關(guān)鍵詞提取keywords=jieba.analyse.extract_tags(new_word)print("關(guān)鍵詞提取結(jié)果:",keywords)

關(guān)鍵詞提取結(jié)果:['03','中國(guó)','元旦假期','賀詞','習(xí)近平','制造業(yè)','04','世界','長(zhǎng)城站','PMI','0.4','新規(guī)','476.8','07','新好','雪龍','光伏','人員','拒收','積石山']

In[18]:keyphrases=jieba.analyse.textrank(new_word)print("關(guān)鍵短語(yǔ)提取結(jié)果:",keyphrases)

關(guān)鍵短語(yǔ)提取結(jié)果:['中國(guó)','美國(guó)','發(fā)展','世界','制造業(yè)','水平','長(zhǎng)城站','保持','主席','人員','傳播','解決','抵達(dá)','南極','發(fā)表','危機(jī)','活動(dòng)','呼吁','國(guó)際','建設(shè)']4.繪制詞云圖詞云又叫做文字云,是文本數(shù)據(jù)的一種可視化展現(xiàn)方式,其核心價(jià)值在于以高頻關(guān)鍵詞的可視化表達(dá),來(lái)傳達(dá)大量文本數(shù)據(jù)背后的有價(jià)值的信息。用wordcloud做詞云圖需依賴(lài)于matplotlib.pyplot模塊,所以使用前需要導(dǎo)入matplotlib.pyplot模塊。In[19]:importwordcloudimportmatplotlib.pyplotaspltwordcloud=wordcloud.WordCloud(font_path='simhei.ttf',background_color="black").generate(new_word)plt.imshow(wordcloud)plt.axis("off")plt.show()#結(jié)果如圖所示10.2案例2航班中轉(zhuǎn)最佳選擇分析現(xiàn)有一組來(lái)源于網(wǎng)絡(luò)的航空數(shù)據(jù),關(guān)于航線上各個(gè)城市間的航班基本信息,包括旅程的起點(diǎn)和目的地以及距離和飛行的時(shí)間等?,F(xiàn)假設(shè)有以下幾個(gè)問(wèn)題需要處理:(1)從A到B的最短途徑是什么?分別從距離和時(shí)間角度考慮。(2)有沒(méi)有辦法從C到D?(3)哪些機(jī)場(chǎng)的交通最繁忙?(4)哪個(gè)機(jī)場(chǎng)位于大多數(shù)其他機(jī)場(chǎng)“之間”?這樣它就可以變成一個(gè)中轉(zhuǎn)站。這里的ABCD分別表示某四個(gè)機(jī)場(chǎng)的名稱(chēng)。10.2.1預(yù)備知識(shí)1.圖論簡(jiǎn)介圖理論主要用于研究和模擬社交網(wǎng)絡(luò),欺詐模式,社交媒體的病毒性和影響力,尤其社交網(wǎng)絡(luò)分析(SNA)可能是圖理論在數(shù)據(jù)科學(xué)中最著名的應(yīng)用,它用于聚類(lèi)算法,特別是K-Means,系統(tǒng)動(dòng)力學(xué)也使用一些圖理論。為了后續(xù)進(jìn)一步研究的方便,我們需要熟悉以下術(shù)語(yǔ)。頂點(diǎn)u和v稱(chēng)為邊(u,v)的末端節(jié)點(diǎn),所以頂點(diǎn)和節(jié)點(diǎn)有時(shí)候是一個(gè)意思。如果兩條邊具有相同的末端頂點(diǎn),則它們是平行的。具有共同頂點(diǎn)的邊是相鄰的。節(jié)點(diǎn)v的度,寫(xiě)作d(v),是指以v作為末端頂點(diǎn)的邊數(shù)。平均路徑長(zhǎng)度:所有可能節(jié)點(diǎn)對(duì)應(yīng)的最短路徑長(zhǎng)度的平均值。給出了圖的“緊密度”度量,可用于了解此網(wǎng)絡(luò)中某些內(nèi)容的流動(dòng)速度。中心性旨在尋找網(wǎng)絡(luò)中最重要的節(jié)點(diǎn),中心性的度量標(biāo)準(zhǔn)常用的有以下三個(gè):度中心性(degree_centrality)比如我有20個(gè)好友,那么意味著20個(gè)結(jié)點(diǎn)與我相連,如果你有50個(gè)好友,那么意味著你的點(diǎn)度中心度比我高,社交圈子比我廣。這個(gè)就是點(diǎn)度中心性的概念。如果一個(gè)點(diǎn)與其他許多點(diǎn)直接相連,就意味著該點(diǎn)具有較高中心度,居于中心地位。一個(gè)節(jié)點(diǎn)的節(jié)點(diǎn)度越大,就意味著這個(gè)節(jié)點(diǎn)的度中心性越高,該節(jié)點(diǎn)在網(wǎng)絡(luò)中就越重要。緊密中心性(closeness_centrality)比如要建一個(gè)大型的娛樂(lè)商場(chǎng)(或者倉(cāng)庫(kù)的核心中轉(zhuǎn)站),希望周?chē)念櫩偷竭_(dá)這個(gè)商場(chǎng)(中轉(zhuǎn)站)的距離都盡可能地短。這個(gè)就涉及到緊密中心性或接近中心性的概念,接近中心性的值為路徑長(zhǎng)度的倒數(shù)。介數(shù)中心性(betweenness_centrality)類(lèi)似于我們身邊的社交達(dá)人,我們認(rèn)識(shí)的不少朋友可能都是通過(guò)他/她認(rèn)識(shí)的,這個(gè)人起到了中介的作用。介數(shù)中心性是指所有最短路徑中經(jīng)過(guò)該節(jié)點(diǎn)的路徑數(shù)目占最短路徑總數(shù)的占比。如經(jīng)過(guò)點(diǎn)Y并且連接兩點(diǎn)的短程線占這兩點(diǎn)之間的短程線總數(shù)之比。計(jì)算圖中節(jié)點(diǎn)的介數(shù)中心性分為兩種情況:有權(quán)圖上的介數(shù)中心性和無(wú)權(quán)圖上的介數(shù)中心性。2.Networkx庫(kù)NetworkX是一個(gè)用Python語(yǔ)言開(kāi)發(fā)的圖論與復(fù)雜網(wǎng)絡(luò)建模工具,內(nèi)置了常用的圖與復(fù)雜網(wǎng)絡(luò)分析算法,可以方便的進(jìn)行復(fù)雜網(wǎng)絡(luò)數(shù)據(jù)分析、仿真建模等工作。networkx支持創(chuàng)建簡(jiǎn)單無(wú)向圖、有向圖和多重圖(multigraph);內(nèi)置許多標(biāo)準(zhǔn)的圖論算法,節(jié)點(diǎn)可為任意數(shù)據(jù);支持任意的邊值維度,功能豐富,簡(jiǎn)單易用。使用NetworkX庫(kù)需導(dǎo)入:importnetworkxasnx。1)圖的基本操作G=nx.Graph()#建立一個(gè)空的無(wú)向圖GG.add_node(1)#添加一個(gè)節(jié)點(diǎn)1,只能增加一個(gè)節(jié)點(diǎn)。節(jié)點(diǎn)可以用數(shù)字或字符表示G.add_nodes_from([3,4,5,6])#增加多個(gè)節(jié)點(diǎn)G.add_edge(2,3)#添加一條邊2-3(隱含著添加了兩個(gè)節(jié)點(diǎn)2、3)G.add_edge(3,2)#對(duì)于無(wú)向圖,邊3-2與邊2-3被認(rèn)為是一條邊

G.nodes()#輸出全部的節(jié)點(diǎn)G.edges()#輸出全部的邊G.number_of_edges()#輸出邊的數(shù)量len(G)

#返回G中節(jié)點(diǎn)數(shù)目nx.degree(G)#計(jì)算圖的各個(gè)節(jié)點(diǎn)的度nx.draw_networkx(G,with_labels=True)#畫(huà)出帶有刻度標(biāo)尺及節(jié)點(diǎn)標(biāo)簽pos=nx.spring_layout(G)#生成節(jié)點(diǎn)位置

nx.draw_networkx_nodes(G,pos,node_color='g',node_size=500,alpha=0.8)#畫(huà)出節(jié)點(diǎn)nx.draw_networkx_edges(G,pos,width=1.0,alpha=0.5,edge_color='b')#把邊畫(huà)出來(lái)nx.draw_networkx_labels(G,pos,labels,font_size=16)#畫(huà)出節(jié)點(diǎn)的標(biāo)簽,label是字典nx.draw_networkx_edge_labels(G,pos,edge_labels)#把邊權(quán)重畫(huà)出來(lái)plt.savefig("wuxiangtu.png")#保存圖

G.to_undirected()#有向圖和無(wú)向圖互相轉(zhuǎn)換G.to_directed()#無(wú)向圖和有向圖互相轉(zhuǎn)換

G.add_weighted_edges_from([(3,4,3.5),(3,5,7.0)])#加權(quán)圖G.get_edge_data(2,3)#獲取3-4邊的權(quán)

sub_graph=G.subgraph([1,3,4])#子圖2)加權(quán)圖有向圖和無(wú)向圖都可以給邊賦予權(quán)重,用到的方法是add_weighted_edges_from,它接受1個(gè)或多個(gè)三元組[u,v,w]作為參數(shù),其中u是起點(diǎn),v是終點(diǎn),w是權(quán)重。如G.add_weighted_edges_from([(3,4,3.5),(3,5,7.0)]),表示3到4的權(quán)重為3.5,3到7的權(quán)重為7.0。3)圖論經(jīng)典算法計(jì)算1:求無(wú)向圖的任意兩點(diǎn)間的最短路徑#-*-coding:cp936-*-importnetworkxasnximportmatplotlib.pyplotasplt

#求無(wú)向圖的任意兩點(diǎn)間的最短路徑G=nx.Graph()G.add_edges_from([(1,2),(1,3),(1,4),(1,5),(4,5),(4,6),(5,6)])path=nx.all_pairs_shortest_path(G)foriinpath:print(i)nx.draw_networkx(G,with_labels=True)計(jì)算2:找圖中兩個(gè)點(diǎn)的最短路徑importnetworkxasnxG=nx.Graph()G.add_nodes_from([1,2,3,4])G.add_edge(1,2)G.add_edge(3,4)

nx.draw_networkx(G,with_labels=True)try:n=nx.shortest_path_length(G,1,4)print(n)exceptnx.NetworkXNoPath:print('Nopath')4)求最短路徑和最短距離的函數(shù)NetworkX最短路徑dijkstra_path和最短距離dijkstra_path_length:nx.dijkstra_path(G,source,target,weight='weight')#求最短路徑nx.dijkstra_path_length(G,source,target,weight='weight')#求最短距離

nx.degree_centrality(G)#節(jié)點(diǎn)度中心系數(shù)。

nx.closeness_centrality(G)#緊密中心性,nx.betweenness_centrality(G)#介數(shù)中心系數(shù)。

nx.transitivity(G)#圖或網(wǎng)絡(luò)的傳遞性。即圖或網(wǎng)絡(luò)中,認(rèn)識(shí)同一個(gè)節(jié)點(diǎn)的兩個(gè)節(jié)點(diǎn)也可能認(rèn)識(shí)雙方,計(jì)算公式為3*圖中三角形的個(gè)數(shù)/三元組個(gè)數(shù)(該三元組個(gè)數(shù)是有公共頂點(diǎn)的邊對(duì)數(shù))。

nx.clustering(G)#圖或網(wǎng)絡(luò)中節(jié)點(diǎn)的聚類(lèi)系數(shù)。計(jì)算公式為:節(jié)點(diǎn)u的兩個(gè)鄰居節(jié)點(diǎn)間的邊數(shù)除以((d(u)(d(u)-1)/2)。10.2.2航班數(shù)據(jù)處理我們先來(lái)對(duì)數(shù)據(jù)進(jìn)行了解。打開(kāi)數(shù)據(jù)表前4行數(shù)據(jù),如圖10-1所示。從上圖可以看出,數(shù)據(jù)共有16列,為了方便對(duì)數(shù)據(jù)的理解,我們將數(shù)據(jù)的列名對(duì)應(yīng)關(guān)系給出,如右表所示。1.導(dǎo)入數(shù)據(jù)In[1]:importpandasaspd

...:importnumpyasnp

...:

...:data=pd.read_csv(r'c:\Users\lenovo\Airlines.csv',

...:engine='python')#參數(shù)engine='python'是為了防止中文路徑出錯(cuò)

...:data.shapeOut[1]:(100,16)

In[2]:data.dtypesOut[2]:yearint64monthint64dayint64dep_timefloat64sched_dep_timeint64dep_delayfloat64arr_timefloat64sched_arr_timeint64arr_delayfloat64carrierobjectflightint64tailnumobjectoriginobjectdestobjectair_timefloat64distanceint64dtype:objectIn[3]:data.head()Out[3]:yearmonthdaydep_time...origindestair_timedistance020132261807.0...EWRMEM144.0946120138171459.0...LGAFLL147.01076220132131812.0...EWRSEA315.02402320134112122.0...JFKDEN221.0162642013851832.0...JFKSEA358.02422

[5rowsx16columns]2.處理時(shí)間格式數(shù)據(jù)預(yù)計(jì)離港時(shí)間格式不標(biāo)準(zhǔn),將時(shí)間格式轉(zhuǎn)化成正常格式,轉(zhuǎn)化為標(biāo)準(zhǔn)格式std。In[4]:data['sched_dep_time'].head()Out[4]:0163011445218153211541835Name:sched_dep_time,dtype:int64In[5]:data['std']=data.sched_dep_time.astype(str).str.replace('(\d{2}$)','')+':’+data.sched_dep_time.astype(str).str.extract('(\d{2}$)',expand=False)+':00'

...:data['std'].head()Out[5]:016:30:00114:45:00218:15:00321:15:00418:35:00Name:std,dtype:objectreplace()將sched_dep_time字段從末尾取兩個(gè)數(shù)字用空去替代(也就是刪除末尾的兩個(gè)數(shù)字);replace()方法:S.replace(old,new[,count=S.count(old)])參數(shù):old--指定的舊子字符串new--指定的新子字符串count--可選參數(shù),替換的次數(shù),默認(rèn)為指定的舊子字符串在字符串中出現(xiàn)的總次數(shù)。

返回值:返回把字符串中指定的舊子字符串替換成指定的新子字符串后生成的新字符串,如果指定count可選參數(shù)則替換指定的次數(shù),默認(rèn)為指定的舊子字符串在字符串中出現(xiàn)的總次數(shù)。\d{2}$:其中\(zhòng)d表示匹配數(shù)字0~9,{2}表示將前面的操作重復(fù)2次,$表示從末尾開(kāi)始匹配。

Series.str.extract(pat,flags=0,expand=None)可用正則從字符數(shù)據(jù)中抽取匹配的數(shù)據(jù),只返回第一個(gè)匹配的數(shù)據(jù)參數(shù):pat:字符串或正則表達(dá)式flags:整型,expand:布爾型,是否返回DataFrameReturns:數(shù)據(jù)框dataframe/索引indexIn[6]:#將計(jì)劃到達(dá)時(shí)間sched_arr_time轉(zhuǎn)化為標(biāo)準(zhǔn)格式'sta'

...:data['sta']=data.sched_arr_time.astype(str).str.replace('(\d{2}$)','')+':'+data.sched_arr_time.astype(str).str.extract('(\d{2}$)',expand=False)+':00'

...:

...:#將實(shí)際離港時(shí)間dep_time轉(zhuǎn)化為標(biāo)準(zhǔn)格式'atd'

...:data['atd']=data.dep_time.fillna(0).astype(64).astype(str).str.replace('(\d{2}$)','')+':'+data.dep_time.fillna(0).astype(64).astype(str).str.extract('(\d{2}$)',expand=False)+':00'

...:

...:#將實(shí)際到達(dá)時(shí)間arr_time轉(zhuǎn)化為標(biāo)準(zhǔn)格式'ata'

...:data['ata']=data.arr_time.fillna(0).astype(64).astype(str).str.replace('(\d{2}$)','')+':'+data.arr_time.fillna(0).astype(64).astype(str).str.extract('(\d{2}$)',expand=False)+':00'

...:

...:#將年月日時(shí)間合并一列date

...:data['date']=pd.to_datetime(data[['year','month','day']])

...:

...:#刪除掉我們不需要的'year','month','day'

...:data=data.drop(['year','month','day'],axis=1)#drop默認(rèn)刪除行,列需要加axis=1

...:data.head(15)Out[6]:dep_timesched_dep_timedep_delay...atdatadate01807.0163097.0...18:07:0019:56:002013-02-2611459.0144514.0...14:59:0018:01:002013-08-1721812.01815-3.0...18:12:0020:55:002013-02-1332122.021157.0...21:22:0023:39:002013-04-1141832.01835-3.0...18:32:0021:45:002013-08-0551500.01505-5.0...15:00:0017:51:002013-06-3061442.01445-3.0...14:42:0018:33:002013-02-147752.0755-3.0...7:52:0010:37:002013-07-258557.0600-3.0...5:57:007:25:002013-07-1091907.01915-8.0...19:07:0021:55:002013-12-13101455.01500-5.0...14:55:0016:47:002013-01-2811903.0912-9.0...9:03:0010:51:002013-09-0612NaN620NaN...NaNNaN2013-08-1913553.0600-7.0...5:53:006:57:002013-04-0814625.0630-5.0...6:25:008:24:002013-05-12

[15rowsx18columns]3.檢查數(shù)據(jù)空缺值檢查數(shù)據(jù)有沒(méi)有0值或空值In[7]:np.where(data==0)#從得出的空行數(shù)據(jù)中查看29行數(shù)據(jù):data.iloc[29]Out[7]:(array([29,43,48,59,62,87,93,96],dtype=int64),array([5,2,2,5,2,2,2,2],dtype=int64))

In[8]:np.where(pd.isnull(data))#發(fā)現(xiàn)了nan數(shù)據(jù)Out[8]:(array([12,12,12,12,12,12,12,90],dtype=int64),array([0,2,3,5,11,15,16,16],dtype=int64))發(fā)現(xiàn)了0和空值,該怎么處置?一般使用刪除或者填充。當(dāng)數(shù)據(jù)夠大時(shí),在刪除不影響整體數(shù)據(jù)或者影響很小時(shí),可以采用刪除的方法,當(dāng)數(shù)據(jù)不夠多時(shí),或者刪除對(duì)原數(shù)據(jù)集在計(jì)算、預(yù)測(cè)有影響時(shí),建議采用均值法填充、0值填充、按前值或后值等方法填充。10.2.3數(shù)據(jù)分析與可視化1.構(gòu)建圖,并載入數(shù)據(jù)In[9]:importnetworkxasnx

...:FG=nx.from_pandas_edgelist(data,source='origin',target='dest',edge_attr=True,)

...:FG.nodes()Out[9]:NodeView(('EWR','MEM','LGA','FLL','SEA','JFK','DEN','ORD','MIA','PBI','MCO','CMH','MSP','IAD','CLT','TPA','DCA','SJU','ATL','BHM','SRQ','MSY','DTW','LAX','JAX','RDU','MDW','DFW','IAH','SFO','STL','CVG','IND','RSW','BOS','CLE'))

In[10]:FG.edges()Out[10]:EdgeView([('EWR','MEM'),('EWR','SEA'),('EWR','MIA'),('EWR','ORD'),('EWR','MSP'),('EWR','TPA'),('EWR','MSY'),('EWR','DFW'),('EWR','IAH'),('EWR','SFO'),('EWR','CVG'),('EWR','IND'),('EWR','RDU'),('EWR','IAD'),('EWR','RSW'),('EWR','BOS'),('EWR','PBI'),('EWR','LAX'),('EWR','MCO'),('EWR','SJU'),('LGA','FLL'),('LGA','ORD'),('LGA','PBI'),('LGA','CMH'),('LGA','IAD'),('LGA','CLT'),('LGA','MIA'),('LGA','DCA'),('LGA','BHM'),('LGA','RDU'),('LGA','ATL'),('LGA','TPA'),('LGA','MDW'),('LGA','DEN'),('LGA','MSP'),('LGA','DTW'),('LGA','STL'),('LGA','MCO'),('LGA','CVG'),('LGA','IAH'),('FLL','JFK'),('SEA','JFK'),('JFK','DEN'),('JFK','MCO'),('JFK','TPA'),('JFK','SJU'),('JFK','ATL'),('JFK','SRQ'),('JFK','DCA'),('JFK','DTW'),('JFK','LAX'),('JFK','JAX'),('JFK','CLT'),('JFK

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論