1. 程式人生 > >七種方法實現Python抓取資料的視覺化

七種方法實現Python抓取資料的視覺化

七種方法實現Python抓取資料的視覺化

 

Python 的scientific stack(一個介紹Python科學計算包的網站)已經完全成熟,並且有各種各樣用例的庫,包括機器學習(連結:machine learning),資料分析(連結:data analysis)。資料視覺化是探索資料和清晰的解釋結果很重要的一部分,但是Python在過去卻相對於其他工具比如R落後一點。

 

小編推薦大家可以加我的扣扣群 735934841  。

裡面有海量視訊教程和學習資料免費領取,

不失為是一個學習的好地方,歡迎你的到來。

一起交流學習!共同進步!!

 

幸運的是,近幾年出現很多新的資料視覺化Python庫彌補了這個差距,matplotlib已經成為主要的資料視覺化庫,但是還有很多其它的庫,比如vispy,bokeh,seaborn,pygal,folium,和networkx,他們都建立在matplotlib的基礎之上,或者擁有matplotlib所不具有的功能。

在這篇文章中,我們將運用真實世界的資料,然後使用這些庫進行資料的視覺化。當我們這樣做的時候,我們將發現,每個庫最適合用在哪裡,以及如何利用Python資料視覺化系統最有效。

探索資料集

在我們進行資料視覺化之前,讓我們快速檢視一下我們將要用到的資料集。我們將用到的據來自openflights。我們將用到 route,airport,和airline這三個資料。route資料的每一行對應兩個機場之間的一條路線,以及相應的資訊。arline資料的每一行對應一個航空公司。

首先,讀入資料:

七種方法實現Python抓取資料的視覺化

 

資料沒有列標題,所以我們通過給columns這個屬性賦值來新增列標題。我們想把每一列作為字串來讀入,這樣做是為了後面基於id匹配行時,比較資料框方便一點。我們通過讀取資料時設定dtype引數來達到目的。

我們可以快速看一下每個資料框:

airports.head()

部分資料截圖:

七種方法實現Python抓取資料的視覺化

 

airlines.head()

部分資料截圖:

七種方法實現Python抓取資料的視覺化

 

routes.head()

部分資料截圖:

七種方法實現Python抓取資料的視覺化

 

我們可以對每個資料集做各種各樣有趣的探索,但是通過把這些資料集合並起來,我們能有最大的收穫。當我們做資料分析的時候,Pandas可以幫助我們,因為它可以幫助我們很容易的過濾矩陣型別的資料,或著對矩陣資料使用某個函式。我們將深入一些有趣的度量,比如分析航空公司和航線。

在我們做這些之前,我們需要做一點資料清理的工作:

routes = routes[routes["airline_id"] != "N"]

這行程式碼保證我們airline_id的資料列中只包含數值型的資料。

繪製直方圖

現在我們瞭解了資料結構,我們可以繼續深入開始畫圖和探索資料。我們的第一個圖,將使用matplotlib庫。Matplotlib在Python中繪相簿,是一個相對低水平的,所以為了畫出一個看起來很漂亮的圖,它通常要使用比其他的庫需要更多的命令。另一方面,你幾乎可以使用matplotlib繪製任何你想畫的圖。它非常靈活,但是靈活性帶來的問題就是冗餘問題。

我們首先繪製一個直方圖來展示每個航空公司的航線長度的分佈。直方圖將所有的路線長度劃分成範圍(或著箱子),然後每個範圍內的資料點進行計數。這可以告訴我們,航空公司飛長線多一點還是飛短線多一點。

為了達到這個目的,我們首先要計算航線的長度。第一步是一個距離公式,我們使用半正矢距離,也就是計算兩個緯度,經度座標對之間的距離。

七種方法實現Python抓取資料的視覺化

 

然後我們可以定義一個功能,用來計算出發機場和目的機場之間的單程距離。想做這個,我們需要從routes這個資料框中提取出source_id和 dest_id兩列,然後使用airports資料框的id列來進行匹配,從而得到這些機場的經度和緯度。然後接下來就是計算問題了,下面是這個功能函式:

七種方法實現Python抓取資料的視覺化

 

如果source_id列 或著 dest_id列有無效的值,這個函式將會出錯,所以我們要新增一個try/except模組來捕捉這些錯誤。

最後,我們使用pandas庫來在routes資料框上使用這個計算距離的函式。這將得到一個pandas序列包含所有的航線長度。航線長度都是千米級的。

route_lengths = routes.apply(calc_dist, axis=1)

現在我們已經擁有了一系列的航線長度,我們可以建立一個直方圖,將我們得到的值轉換成範圍,然後計算每個範圍內有多少個數據點。

七種方法實現Python抓取資料的視覺化

 

七種方法實現Python抓取資料的視覺化

 

我們使用import matplotlib.pyplot as plt匯入matplotlib的繪圖功能。最後我們在使用%matplotlib inline命令將matplotlib的圖表內嵌到ipython notebook中。最後我們可以使用plt.hist(route_lengths, bins=20)來繪製直方圖啦。我們可以看到,航空公司的短航線要多於長航線。

使用Seaborn

我們可以使用python的高水平繪相簿Seaborn,繪製出一樣的圖。Seaborn是基於matplotlib的,Seaborn用來繪製特定型別的圖,它通常需要做一些比較簡單統計工作。我們可以使用distplot函式來繪製一個頂端帶有核密度估計的直方圖。和密度估計是一條曲線,實質上是直方圖的平滑以後的版本,這樣能使我們更容易發現裡面的模式。

import seaborn

seaborn.distplot(route_lengths, bins=20)

七種方法實現Python抓取資料的視覺化

 

如圖所示,Seaborn相比於matplotlib擁有更好的預設風格。對於matplotlib的所有繪圖,Seaborn裡面並沒有自己對應的版本,但是,使用Seaborn來快速繪製一個好看的,並且比matplotlib預設的圖表更加深入的圖表,是一個不錯的方式。如果你想要繼續深入,或著做更多的統計工作,Seaborn是一個很好的庫。

條形圖

直方圖很好,但是或許我們想看一下航空公司的平均航線長度。這時我們就可以使用條形圖,每條航線會單獨對應條形圖裡面的一條,告訴我們每個航空公司的平均航線長度。這可以告訴我們哪些航班是飛本地區的,哪些是國際的。我們可以使用pandas,python的一個數據分析庫,計算出每個航空公司的平均航線長度。

七種方法實現Python抓取資料的視覺化

 

首先,構造一個航空公司id和航線長度的資料框,我們把route_length_df基於airline_id來分組。實際上就是,每個航空公司構造一個數據框。然後使用pandas的aggregate函式對每個資料框裡面的length這一列求平均,然後再把計算結果重新組合成一個新的資料框。然後對資料框進行排序,把路線最多的航空公司放在最前面。

然後我們可以把它用matplotlib畫出來

plt.bar(range(airline_route_lengths.shape[0]),

airline_route_lengths["length"])

七種方法實現Python抓取資料的視覺化

 

Matplotlib的plt.bar方法可以畫出每個airline檔案中(airline_route_lengths["length"])的航線—平均長度的關係圖。flies(airline_route_lengths["length"])

上述圖的問題是我們不能很容易的看出哪家航空公司擁有什麼航線長度。所以我們需要看到座標軸標籤。這有一點難,因為有太多的航空公司了。一種能使這個工作變得簡單的方法就是繪製互動圖,它允許我們放大或縮小來檢視標籤。我們可以使用bokeh庫——它使繪製互動圖和意義伸縮的圖會變得簡單。

為了使用bokeh,我們首先需要預處理一下我們的資料:

七種方法實現Python抓取資料的視覺化

 

上面的程式碼可以獲取airline_route_lengths中每一行資料的名字,並新增在name這一列中,name這一列包含了每一個航空公司的名字,我們還添加了id這一列,用來做查詢(apply函式不傳遞索引值)。

最後我們重置索引來得到所有的唯一值,沒有這一步bokeh就不能正常的工作。

現在,我們繼續我們的圖表問題:

七種方法實現Python抓取資料的視覺化

 

我們使用output_notebook建立背景虛化,在iPython的 notebook 裡畫出圖。然後我們使用資料框和指定的列繪製條形圖,最後,使用show函式顯示出畫好的圖。

在notebook中產生的圖並不是影象,它實質上是一個java外掛,也正因為如此,我們在下面展示的是一個螢幕截圖,而不是真正的圖表。

七種方法實現Python抓取資料的視覺化

 

有了這個圖,我們可以放大,看哪一趟航班的航線最長。上圖的標籤看起來都堆疊在了一起,但是當你放大以後就很容易看清楚了。

水平條形圖

Pygal是python的一個數據分析庫,它能夠快速的繪製出很有吸引力的圖。我們可以用它來對路線按長度進行拆分。首先,我們把我們的路線分成短,中,長三類,並計算出在route_lengths中每一類所佔的百分比。

七種方法實現Python抓取資料的視覺化