愛了愛了!0.052秒打開100GB數據,這個Python開源庫火爆了!

Python實戰社羣

Java實戰社羣

長按識別下方二維碼,按需求添加

掃碼關注添加客服

進Python社羣▲

掃碼關注添加客服

進Java社羣

編譯 | AI科技大本營(ID:rgznai100)

許多組織都在嘗試收集和利用盡可能多的數據,以改善其經營方式,增加收入和提升影響力。因此,數據科學家面對50GB甚至500GB大小的數據集情況變得越來越普遍。

 

不過,這類數據集使用起來不太容易。它們足夠小,可以裝入日常筆記本電腦的硬盤驅動器中,但同時大到無法裝入RAM,導致它們已經很難打開和檢查,更不用說探索或分析了。

 

處理此類數據集時,通常採用3種策略。

 

第一種是對數據進行二次採樣,但缺點很明顯:你可能因爲忽視相關部分數據而錯過關鍵洞察,甚至更糟的是,這會誤解了數據所闡釋的含義。

 

第二種策略是使用分佈式計算。在某些情況下這是一種有效的方法,但它需要管理和維護集羣的大量開銷。

 

又或者,你可以租用一個強大的雲實例,該實例具有處理相關數據所需的內存。例如,AWS提供具有TB級RAM的實例。在這種情況下,你仍然必須管理雲數據存儲區,每次實例啓動時,都需要等待數據從存儲空間傳輸到實例,同時,還要考慮將數據存儲在雲上的合規性問題,以及在遠程計算機上工作帶來的不便。更不別說成本,儘管一開始成本很低,但後續往往會增加。

 

Vaex是解決這個問題的新方法。它是一種幾乎可以對任意大小的數據進行數據科學研究的更快、更安全、更方便的方法,只要數據集可以安裝在你的筆記本電腦,臺式機或服務器硬盤上。

什麼是Vaex?

 

Vaex 是一個開源的 DataFrame 庫(類似於Pandas),對和你硬盤空間一樣大小的表格數據集,它可以有效進行可視化、探索、分析甚至進行實踐機器學習。

 

它可以在N維網格上計算每秒超過十億(10^9)個對象/行的統計信息,例如均值、總和、計數、標準差等 。使用直方圖、密度圖和三維體繪製完成可視化,從而可以交互式探索大數據。Vaex使用內存映射、零內存複製策略獲得最佳性能(不浪費內存)。

 

爲實現這些功能,Vaex 採用內存映射、高效的核外算法和延遲計算等概念。所有這些都封裝爲類 Pandas 的 API,因此,任何人都能快速上手。

 

十億級計程車的數據分析

爲了說明這一概念,讓我們對一個數據集進行簡單的探索性數據分析,該數據集並不適合典型筆記本電腦的RAM。

 

本文中將使用紐約市(NYC)出租車數據集,其中包含標誌性的黃色出租車在2009年至2015年之間進行的超過10億次出行的信息。數據可以從網站(https://www1.nyc.gov/site/tlc/about/tlc-trip-record-data.page)下載,並且爲CSV格式。完整的分析可以在此Jupyter筆記本中單獨查看(https://nbviewer.jupyter.org/github/vaexio/vaex-examples/blob/master/medium-nyc-taxi-data-eda/vaex-taxi-article.ipynb)。

爲什麼要選擇vaex

  • 性能:處理海量表格數據,每秒處理超過十億行

  • 虛擬列:動態計算,不浪費內存

  • 高效的內存在執行過濾/選擇/子集時沒有內存副本。

  • 可視化:直接支持,單線通常就足夠了。

  • 用戶友好的API:只需處理一個數據集對象,製表符補全和docstring可以幫助你:ds.mean<tab>,類似於Pandas。

  • 精益:分成多個包

  • Jupyter集成:vaex-jupyter將在Jupyter筆記本和Jupyter實驗室中提供交互式可視化和選擇。

 

打開100GB數據集只需0.052秒

第一步是將數據轉換爲內存可映射文件格式,例如Apache Arrow,Apache Parquet或HDF5。在此處也可以找到如何將CSV數據轉換爲HDF5的示例。數據變爲內存可映射格式後,即使在磁盤上的大小超過100GB,也可以使用Vaex即時打開(只需0.052秒!):

       

爲什麼這麼快?當使用Vaex打開內存映射文件時,實際上沒有進行任何數據讀取。Vaex僅讀取文件的元數據,例如磁盤上數據的位置,數據結構(行數、列數、列名和類型),文件說明等。那麼,如果我們要檢查數據或與數據交互怎麼辦?打開數據集會生成一個標準的DataFrame並對其進行快速檢查:

   

  

注意,單元執行時間太短了。這是因爲顯示Vaex DataFrame或列僅需要從磁盤讀取前後5行數據。這將我們引向另一個重點:Vaex只會在需要時遍歷整個數據集,並且會嘗試通過儘可能少的數據傳遞來做到這一點。

無論如何,讓我們從極端異常值或錯誤數據輸入值開始清除此數據集。一個很好的方法是使用describe方法對數據進行高級概述,其中顯示了樣本數、缺失值數和每一列的數據類型。如果列的數據類型爲數字,則還將顯示平均值、標準偏差以及最小值和最大值。所有這些統計信息都是通過對數據的一次傳遞來計算的。

       

     

使用describe方法獲得 DataFrame 的高級概覽,注意這個 DataFrame 包含 18 列數據,不過截圖只展示了前 7 列。

 

該describe方法很好地體現了Vaex的功能和效率:所有這些統計數據都是在我的MacBook Pro(2018款15英寸,2.6GHz Intel Core i7,32GB RAM)上用不到3分鐘的時間計算出來的。其他庫或方法都需要分佈式計算或擁有超過100GB的雲實例來執行相同的計算。而使用Vaex,你所需要的只是數據,以及只有幾GB RAM的筆記本電腦。

 

查看describe的輸出,很容易注意到數據包含一些嚴重的異常值。

 

首先開始檢查上車地點。消除異常值的最簡單方法是簡單地繪製上下車地點的位置,並直觀地定義我們要集中分析的NYC區域。由於我們正在使用如此大的數據集,因此直方圖是最有效的可視化效果。使用Vaex創建和顯示直方圖和熱力圖的速度很快,而且圖表可以交互!

 

一旦我們通過交互決定要關注的NYC區域,就可以簡單地創建一個篩選後的DataFrame: 

   

         

關於上面的代碼,最酷的事情是它需要執行的內存量可以忽略不計!在篩選Vaex DataFrame時不會複製數據,而是僅創建對原始對象的引用,在該引用上應用二進制掩碼。用掩碼選擇要顯示的行,並將其用於將來的計算。這將爲我們節省100GB的RAM,而像今天許多標準數據科學工具卻要複製數據。

現在,檢查一下該passenger_count列。單次出租車行程記錄的最大乘客數爲255,這似乎有些誇張。計算每次行程的乘客人數,使用以下value_counts方法很容易做到這一點:

       

在 10 億行數據上使用 value_counts 方法只需要 20 秒

 

從上圖可以看出,載客超過6人的行程可能是罕見的異常值,或者僅僅是錯誤的數據輸入,還有大量的0位乘客的行程。由於目前我們尚不瞭解這些行程是否合法,因此我們也將其過濾掉。  

       

 

讓我們對行程距離進行類似的練習。由於這是一個連續變量,因此我們可以繪製行程距離的分佈圖。讓我們繪製一個更合理範圍的直方圖。

       

紐約出租車數據行程距離直方圖

 

從上圖可以看出,出行次數隨着距離的增加而減少。在距離約100英里處,分佈有明顯下降。目前,我們將以此爲起點,根據行程距離消除極端離羣值:

       

       

出行距離一列中存在極端異常值,這也是研究出行時間和出租車平均速度的動機。這些功能在數據集中尚不可用,但計算起來很簡單:

       

上面的代碼塊無需內存,無需花費時間即可執行!這是因爲代碼只會創建虛擬列。這些列僅包含數學表達式,並且僅在需要時才進行評估。此外,虛擬列的行爲與任何其他常規列都相同。注意,其他標準庫將需要10 GB的RAM才能進行相同的操作。

好了,讓我們來繪製行程耗費時間的分佈:

    

紐約超過 10 億次出租車行程耗費時間的直方圖

 

從上面的圖中可以看出,儘管有一些行程可能需要花費4至5個小時,但95%的出租車花費不到30分鐘即可到達目的地。你能想象在紐約市被困出租車中超過3個小時嗎?無論如何,我們要保持開放的態度,並考慮所有花費時間少於3小時的行程:

       

     

現在,讓我們研究出租車的平均速度,同時選擇一個合理的數據範圍:

     

出租車平均速度分佈

 

根據分佈趨平的位置,我們可以推斷出在每小時1到60英里之間合理的平均滑行速度,因此可以更新篩選後的DataFrame:

將重點轉移到出租車費用上。從describe方法的輸出中,我們可以看到在fare_amount,total_amount和tip_amount列中有一些瘋狂的異常值。對於初學者,任何這些列中的任何值都不應爲負。同時數字表明,一些幸運的司機僅憑開一次出租車便幾乎成爲了百萬富翁。讓我們看一下在相對合理的範圍內這些數量的分佈:

       

紐約超過 10 億次出租車行程的車費、總額和小費的分佈。在筆記本上繪製這些圖表只用了 31 秒!

我們看到上述所有三個分佈都有相當長的尾部。尾部的某些值可能是合法的,而其他值可能是錯誤的數據輸入。無論如何,讓我們先保守下,只考慮fare_amount,total_amount和tip_amount少於$200的行程。我們還要求fare_amount,total_amount值大於$0。

       

最後,在初步清理完所有數據之後,讓我們看看有多少出租車數據需要進行分析:

       

還有超過11億次旅行!大量的數據可以使你深入瞭解出租車行程背後的信息。

後記

此外,作者還從出租車司機最大化利潤等角度利用Vaex進行分析數據。總之,Vaex會幫你緩解可能面臨的一些數據挑戰的問題。

有了 Vaex,你可以在短短几秒內遍歷超過 10 億行數據,計算各種統計、聚合併產出信息圖表,這一切都能在你的筆記本電腦上完成。它免費且開源。

如果你對探索本文中用到的數據集感興趣,可以直接在 S3 中配合 Vaex 使用它,請參閱完整的 Jupyter notebook 瞭解如何實現。

Vaex 官方網站:https://vaex.io/  

文檔:https://docs.vaex.io/ 

GitHub:https : //github.com/vaexio/vaex 

PyPi:https://pypi.python.org/pypi/vaex/

程序員專欄 掃碼關注填加客服 長按識別下方二維碼進羣

近期精彩內容推薦:  

 朋友入職中軟一個月(外包華爲)就離職了!

 再見,胡阿姨!再見,共享單車!

 一代經典銷聲匿跡:WinXP徹底再見了!

 2021年1月編程語言排行榜


在看點這裏好文分享給更多人↓↓

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章