數據量再大也不怕!筆記本電腦也可以分析 100GB 數據

2022年07月01日12:54:05 熱門 1976
數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞

許多組織正試圖收集和利用儘可能多的數據,以改進其業務運營方式、增加收入或對周圍世界產生更大的影響。因此,數據科學家面對 50GB 甚至 500GB 大小的數據集的情況變得越來越普遍。

但是現在,這些數據集使用起來並不方便。它們可能小到可以裝進你日常筆記本電腦的硬盤,也可能大到和 RAM 匹配。因此,它們已經很難被打開和檢查,更不用說探索或分析了。

在處理這些數據集時,通常使用 3 種策略。第一個是對數據進行子抽樣。它的缺點是顯而易見的:可能會錯過關鍵的部分,或者更糟的是,不看全部內容可能會對數據和它表達的事實有所曲解。還有一個策略是使用分佈式計算。雖然在某些情況下這是一種有效的方法,但它會帶來管理和維護集群的巨大開銷。想像一下,必須為一個不在 RAM 範圍內的數據集(比如在 30-50GB 範圍內)設置一個集群會是什麼樣子的。對我來說,這似乎難以承受。或者,你可以租用一個強大的雲實例,該實例具有處理相關數據所需的足夠內存。例如,AWS 提供了具有兆位元組 RAM 的實例。在這種情況下,你仍然需要管理雲數據存儲桶,在每次實例啟動時等待從存儲桶到實例的數據傳輸,處理將數據放到雲上帶來的遵從性問題,並處理在遠程計算機上工作帶來的所有不便。當然,成本就更不用說了,雖然起價很低,但隨着時間的推移,成本往往會越來越高。

在本文中,我將向你展示一種新的方法:只要數據可以被存進筆記本電腦、台式機或服務器的硬盤上,那麼這種方法可以讓使用幾乎任意大小的數據進行數據科學研究更快、更安全、更方便。

Vaex

數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞

Vaex 是一個開源的數據框架庫,它可以在與硬盤大小相同的表格數據集上進行可視化、探索、分析甚至機器學習。為此,Vaex 採用了一些概念,如內存映射、高效的核心外算法和延後計算。所有這些都被一個和 pandas 類似的 API 類綁定起來,任何人都可以馬上開始使用它。

十億的士分析

為了說明這個概念,讓我們在一個數據集上做一個簡單的探索性數據分析,這個數據集非常大,可以放入一個典型的筆記本電腦的 RAM 中。在這篇文章中,我們將使用紐約(NYC)的士數據集,其中包含 2009 至 2015 年之間的超過 10 億個標誌性黃色的士。數據可以從這個網站下載,並以 CSV 格式提供。完整的分析可以在這個 Jupyter notebook 中單獨查看。

清理街道

第一步是將數據轉換為內存可映射文件格式,如 Apache Arrow、Apache Parquet 或 HDF5。將 CSV 數據轉換為 HDF5 的示例可以在這裡找到。一旦數據是內存可映射格式,用 Vaex 打開它是即時的(0.052 秒!),儘管磁盤上的數據超過 100GB:

數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞

使用 Vaex 打開內存映射文件只需要 0.052 秒,即使它們超過 100 GB

為什麼這麼快?使用 Vaex 打開內存映射文件時,實際上沒有數據讀取。Vaex 只讀取文件元數據,如磁盤上數據的位置、數據結構(行數、列數、列名和類型)、文件描述等。那麼,如果我們想檢查數據或與數據交互呢?打開一個數據集會生成一個標準數據框,檢查它的速度是否也很快:

數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞

紐約市黃色的士數據預覽

再一次注意,單元執行時間非常短。這是因為顯示 Vaex 數據幀或列只需要從磁盤讀取前 5 行和後 5 行。這就引出了另一個重要的問題:Vaex 只會在必須的時候遍歷整個數據集,它會儘可能少地傳遞數據。

無論如何,讓我們首先從極端異常值或錯誤的數據輸入中清除這個數據集。一個好的開始方法是使用 describe 方法獲得數據的高層次概述,該方法顯示每個列的樣本數、缺少的值數和數據類型。如果列的數據類型是數字,則平均值、標準偏差以及最小值和最大值也將被顯示。所有這些統計數據都是通過對數據的一次傳遞來計算的。

數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞

使用 describe 方法獲得數據幀的高級概述。注意,數據幀包含 18 列,但在此屏幕截圖中只有前 7 列可見

描述方法很好地說明了 Vaex 的功耗和效率:所有這些統計數據都是在我的 MacBook Pro(15", 2018, 2.6GHz Intel Core i7, 32GB RAM)上 3 分鐘之內計算出來的。其他的庫或方法需要分佈式計算或 100GB 以上的雲實例來執行相同的計算。有了 Vaex,你所需要的只是數據,你的筆記本電腦只需要幾 GB 的內存。

從 descripe 的輸出來看,很容易注意到數據中包含了一些嚴重的異常值。首先,讓我們從檢查取貨地點開始。刪除異常值的最簡單方法是簡單地繪製出上下車的位置,並直觀地定義我們希望重點分析的紐約市的區域。由於我們使用的數據集太大了,直方圖是最有效的可視化方法。用 Vaex 創建和顯示直方圖和熱圖是如此的快,這樣的繪圖可以更好地互動!

df.plot_widget(df.pickup_longitude,

df.pickup_latitude,

shape=512,

limits='minmax',

f='log1p',

colormap='plasma')

數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞

一旦我們以交互方式決定要關注紐約市的哪個區域,我們就可以簡單地創建一個過濾數據框:

數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞

上面代碼塊最酷的地方是它需要的內存可以忽略不計!它在過濾 Vaex 數據幀時,不會生成數據的副本,相反,它只創建對原始對象的引用,並在其上應用二進制掩碼。掩碼選擇顯示哪些行並用於將來的計算。這為我們節省了 100GB 的 RAM。

現在,讓我們檢查一下乘客計數欄。在一次的士行程中記錄的乘客人數最多為 255 人,這似乎有點極端。讓我們計算一下每一位乘客的出行次數。這很容易通過值計數方法實現:

數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞

對 10 億行應用「value counts」方法只需大約 20 秒!

從上圖中我們可以看出,乘客數超過 6 人的旅行可能是罕見的異常值,或者只是錯誤的數據輸入。上面也有大量的 0 名乘客的旅行。既然現在我們還不知道這些旅行是否合理,那就讓我們把它們過濾掉吧。

讓我們做一個與前面的旅行距離相似的練習。由於這是一個連續變量,我們可以繪製行程的分佈。參考最小和最大距離,我們用一個更合理的範圍繪製一個柱狀圖。

數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞

紐約的士數據集的行程距離直方圖

從上面的圖表我們可以看出,旅行次數隨着距離的增加而減少。在大約 100 英里的距離上,分佈會有一個很大的下降。目前,我們將使用此作為截止點,以消除基於行程距離的極端異常值:

出行距離列中極端離群值的存在是考察的士出行持續時間和平均速度的動機。這些功能在數據集中不易獲得,但計算起來很簡單:

數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞

上面的代碼塊需要的內存為零,不需要時間執行!這是因為代碼導致創建虛擬列。這些列僅包含數學表達式,並且僅在需要時計算,否則,虛擬列的行為與任何其他常規列一樣。請注意,其他標準庫在相同的操作中需要 10GB 的 RAM。

好吧,我們來繪製旅行時間的分佈圖:

數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞

紐約 10 億多次的士出行持續時間的直方圖

從上面的圖中我們可以看到 95% 的的士使用都不到 30 分鐘就能到達目的地,儘管有些旅程可以花費 4 到 5 個小時。你能想像在紐約被困在的士里超過 3 個小時嗎?不管怎樣,讓我們開誠布公,考慮一下總共持續不到 3 小時的所有旅行:

現在讓我們研究的士的平均速度,同時也為數據限制選擇一個合理的範圍:

數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞

的士平均速度的分佈

根據上圖,我們可以推斷出的士平均速度在 1 到 60 英里每小時的範圍內,因此我們可以更新過濾後的 DataFrame:

讓我們把注意力轉移到的士旅行的成本上。從 describe 方法的輸出中,我們可以看到 fare_amount、total_amount 和 tip_amount 列中有一些異常值。首先,這些列中的任何值都不應為負。與此相反,這些數字表明,一些幸運的司機幾乎成了百萬富翁,只有一輛的士。讓我們看看在一個相對合理的範圍內,這些量的分佈:

數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞

紐約 10 億多個的士出行的票價、總金額和小費的分佈情況。在筆記本電腦上創建這些圖只用了 31 秒!

我們看到上述三種分佈圖都有很長的尾巴。在尾部的某些值可能是合法的,而其他值可能是錯誤的數據輸入。無論如何,現在我們還是保守一點,只考慮票價、總票價和小費低於 200 美元的行程。我們還要求票價金額、總金額值大於 0 美元。

最後,在對所有數據進行初步清洗之後,讓我們看看我們的分析有多少的士行程。

我們還有 11 億多次旅行!通過這樣大量的數據,可以獲得一些關於的士旅行的寶貴見解。

坐進駕駛座

假設我們是一個未來的的士司機,或的士公司的經理,並有興趣使用這個數據集來學習如何最大限度地提高我們的利潤,降低我們的成本,或者只是改善我們的工作生活。

讓我們先找出平均來說能帶來最好收益的接送乘客的地點。天真地說,我們可以畫出一張接送地點的熱圖,用平均票價進行編碼。然而,的士司機自己也有成本,例如,他們得付燃料費。因此,把乘客帶到很遠的地方可能會導致更高的票價,但這也意味着更大的油耗和時間損失。此外,要從偏遠的地方找到一個乘客帶去市中心的某個地方可能不那麼容易,因此在沒有乘客的情況下開車回去可能會花銷很大。一種解決方法是用車費和旅行距離之比的平均值對熱圖進行顏色編碼。讓我們考慮這兩種方法:

數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞

紐約市彩色熱圖編碼:平均票價金額(左)和票價金額與行程的平均比率

在簡單的情況下,當我們只關心為提供的服務獲得最大票價時,最佳接送乘客的區域是紐約機場以及主要的大道,如 Van Wyck 高速公路和 Long Island 高速公路。當我們把旅行的距離考慮進去時,我們得到的是一張稍微不同的圖片。 Van Wyck 高速公路、Long Island 高速公路大道以及機場仍然是接送乘客的好地方,但它們在地圖上的重要性要小得多。然而,在 Hudson 河的西側出現了一些新的熱點地區,這些地區似乎可以賺到相當的利潤。

開的士是一項相當靈活的工作。為了更好地利用這種靈活性,知道什麼時候開車是最有益的。為了回答這個問題,我們製作一個圖表,顯示每天和一天中每小時的車費與出行距離的平均比率:

數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞

一周中每天和一天中每小時的車費與出行距離的平均比率

上面的數字是有道理的:最好的收入發生在高峰時段,特別是在一周工作日的中午。作為的士司機,我們的一小部分收入是的士公司的,所以我們可能會對哪一天的顧客給的小費最多感興趣。因此,讓我們生成一個類似的圖,這次顯示平均小費百分比:

數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞

每周每天和每天小時的平均小費百分比

上面的圖很有趣。它告訴我們,乘客喜歡在早上 7 點到 10 點之間和在本周早些時候的晚上給的士司機小費。如果你在凌晨 3 點或 4 點接乘客,不要指望會有太大的小費。結合上面兩個地塊的分析,早上 8 點到 10 點是上班的好時間:每個人每英里可以獲得不錯的車費和滿意的小費。

發動引擎!

在本文的前一部分中,我們簡要介紹了 trip_distance 列,在從異常值中清除它的同時,我們保留了所有小於 100 英里的行程值。這仍然是一個相當大的截止值,特別是考慮到黃色的士公司主要在曼哈頓經營。Trimih 距離列描述的士在接到乘客和乘客下車位置之間行駛的距離。然而,為了避免交通堵塞或道路工程等原因,人們通常可能會選擇不同的路線。因此,作為 trip_distance 列的對應項,讓我們計算上車和下車位置之間的最短可能距離,我們稱之為 arc_distance:

數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞

對於用 numpy 編寫的複雜表達式,vaex 可以在 Numba、Pythran 甚至 CUDA(如果你有 NVIDIA GPU)的幫助下使用即時編譯來大大加快計算速度

弧長計算公式涉及面廣,包含了大量的三角函數和算法,特別是在處理大型數據集時,計算量很大。如果表達式或函數只使用來自 Numpy 包的 Python 操作和方法編寫,Vaex 將使用機器的所有核心並行計算它。除此之外,VAEX 支持通過 NUBBA(使用 LLVM)或 Pythran(通過 C++加速)及時編譯,從而提供更好的性能。如果你碰巧有一個 NVIDIA 圖形卡,你可以通過 jit_CUDA 方法使用 CUDA 來獲得更高的性能。

總之,讓我們畫出 trip_distance 和 arc_distance 的分佈:

數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞

左:行程距離和弧距離的比較;右:弧距

有趣的是,arc_distance 從來沒有超過 21 英里,但是的士實際行駛的距離可以是 5 倍大。事實上,有數百萬的的士旅行,下車位置在上車地點 100 米(0.06 英里)以內!

多年來的黃色的士公司

我們今天使用的數據集跨越了 7 年。我們可以看到,隨着時間的推移,一些收益的數量是如何演變的。使用 Vaex,我們可以快速執行核心分組和聚合操作。讓我們來探討 7 年來票價和行程是如何演變的:

數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞

對於一個超過 10 億個樣本的 Vaex 數據幀,在筆記本電腦上使用四核處理器進行 8 個聚合的分組操作只需不到 2 分鐘

在上面的單元塊中,我們執行一個分組操作,然後是 8 個聚合,其中 2 個在虛擬列上。上面的單元塊在我的筆記本電腦上執行不到 2 分鐘。這相當令人印象深刻,因為我們使用的數據包含超過 10 億個樣本。不管怎樣,讓我們看看結果。以下是多年來駕駛的士的費用演變過程:

數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞

平均票價和總金額,以及乘客每年支付的小費百分比

我們看到的士價格,以及小費隨着歲月的流逝而增加。現在讓我們來看一下的士的 trip_distance 和 arc_distance,的士是以年為單位行駛的:

數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞

的士每年旅行的平均行程和弧距。

上圖顯示,出行距離和弧線距離都有小幅增加,這意味着,平均而言,人們每年的出行都會稍微遠一點。

給我看看錢

在我們的旅程結束之前,讓我們再停一站,調查一下乘客如何支付乘車費用。數據集包含付款類型列,因此讓我們看看它包含的值:

數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞

從數據集文檔中,我們可以看到此列只有 6 個有效條目:

1 = credit card payment

2 = cash payment

3 = no charge

4 = dispute

5 = Unknown

6 =Voided trip

因此,我們可以簡單地將 payment_type 列中的條目映射為整數:

現在,我們可以按每年的數據分組,看看紐約人在的士租賃支付方面的習慣是如何改變的:

數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞

每年付款方式

我們看到,隨着時間的推移,信用卡支付慢慢變得比現金支付更頻繁。我們真的生活在一個數字時代!注意,在上面的代碼塊中,一旦我們聚合了數據,小的 Vaex 數據幀可以很容易地轉換為 Pandas 數據幀,我們可以方便地將其傳遞給 Seaborn。不是想在這裡重新發明輪子。

最後,讓我們通過繪製現金支付與信用卡支付的比率來確定支付方式是取決於一天中的時間還是一周中的某一天。為此,我們將首先創建一個過濾器,它只選擇用現金或卡支付的乘車。下一步是我最喜歡的 Vaex 特性之一:帶有選擇的聚合。其他庫要求對以後合併為一個支付方法的每個單獨篩選的數據幀進行聚合。另一方面,使用 Vaex,我們可以通過在聚合函數中提供選擇來一步完成此操作。這非常方便,只需要一次傳遞數據,就可以獲得更好的性能。在此之後,我們只需以標準方式繪製結果數據幀:

數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞數據量再大也不怕!筆記本電腦也可以分析 100GB 數據 - 天天要聞

在一周的某一時間和某一天,現金和卡支付的一部分

看上面的圖表,我們可以發現一個類似的模式,顯示小費百分比和一周中的一天和一天中的時間相關的函數。從這兩個圖中,數據表明,用卡支付的乘客往往比用現金支付的乘客小費更多。事實真的是這樣嗎?我想請你自己試着去弄清楚,因為現在你已經掌握了知識、工具和數據!你也可以看看這個 notebook 來獲得一些額外的提示。

到達目的地

我希望這篇文章是對 Vaex 的一個有用的介紹,它將幫助緩解你可能面臨的一些「不舒服的數據」問題,至少當涉及到表格數據集時會對你有幫助。如果你對本文中使用的數據集感興趣,可以直接從帶 Vaex 的 S3 中使用它。查看完整的 Jupyter notebook 了解如何執行此操作。

有了 Vaex,你只需幾秒鐘就可以通過自己的筆記本電腦瀏覽超過十億行數據,計算出各種統計數據、聚合數據,並生成信息豐富的圖表。它不僅免費而且開源,我希望你會給它一個機會!

via:https://towardsdatascience.com/how-to-analyse-100s-of-gbs-of-data-on-your-laptop-with-python-f83363dda94

雷鋒網雷鋒網雷鋒網

熱門分類資訊推薦

曾小賢的上司Lisa榕,現實中不僅才貌雙全,還嫁給了CEO - 天天要聞

曾小賢的上司Lisa榕,現實中不僅才貌雙全,還嫁給了CEO

曾小賢的上司Lisa榕,現實中不僅才貌雙全,還嫁給了CEO雖然說《愛情公寓》這部劇在劇情上充滿了爭議,但是一定程度上,這部劇也是很多人的回憶,是伴隨了一代人的青春回憶,而且劇中的很多角色都成為了經典,他們的口頭禪也一直被拿來玩兒梗。
Lisa榕做主持多年沒紅,被陳赫拉進愛情公寓爆紅,如今怎樣了 - 天天要聞

Lisa榕做主持多年沒紅,被陳赫拉進愛情公寓爆紅,如今怎樣了

談到《愛情公寓》這部火爆一時的歡樂喜劇,大家肯定都不陌生。不知道大家是否還記得《愛情公寓》中那個把曾小賢治得服服帖帖的女上司Lisa榕,現實中的她名叫榕榕,和劇中的形象也判若兩人。1981年出生在遼寧瀋陽的榕榕,畢業於上海戲劇學院,後來成為了上海東方傳媒集團有限公司的一名主持人。