数据加载很慢_Vaex真香!几秒钟就能处理数十亿行数据,比Pandas、Dask更好用
Python中的大數據分析正在復興。這一切都是從NumPy開始的,它也是我在本文中介紹的工具背后的構建塊之一。
2006年,大數據這個話題逐漸受到關注,尤其是隨著Hadoop的發布。
Pandas因為它的數據幀而緊隨其后。
2014年是大數據成為主流的一年,也是Apache Spark發布的一年。
2018年,Dask和其他用于Python數據分析的庫相繼問世。
技術更迭速度實在太快了,每個月我都能找到一個新的工具,作為一名IT從業者,需要時刻保持與最新技術的聯系。如果你認為這篇文章是關于Dask的,那你就大錯特錯了。在這里,給大家分享一個我發現的另一個用于數據分析的Python庫,好用到飛起!
認識Vaex
Vaex是一個高性能的Python庫,用于惰性核心數據幀(類似于Pandas),以可視化和探索大型表格數據集。它可以每秒計算超過十億行的基本統計數據,并且支持多種可視化方式,允許對大數據進行交互式探索。
1、Vaex vs Dask
Vaex與Dask不相似,但與Dask數據幀相似,后者構建在pandas數據幀之上。這意味著Dask繼承了pandas的問題,比如數據必須完全加載到RAM中才能進行處理。但是Vaex不是這樣的。
Vaex不會復制數據幀,因此它可以在主存較小的機器上處理較大的數據幀。
Vaex和Dask都使用延遲處理。唯一的區別是Vaex只在需要時計算字段,而Dask則需要顯式使用計算函數。
數據需要采用HDF5或Apache Arrow格式才能充分利用Vaex。
2、安裝Vaex
安裝Vaex與安裝任何其他Python庫一樣簡單:
pip install vaex我們開始吧
讓我們創建一個包含10億行和1000列的pandas數據框來創建一個大數據文件。
import vaex import pandas as pd import numpy as np n_rows = 1000000 n_cols = 1000 df = pd.DataFrame(np.random.randint(0, 100, size=(n_rows, n_cols)), columns=['col%d' % i for i in range(n_cols)]) df.head()這個數據幀將會使用多少主內存?
df.info(memory_usage='deep')我們要把該數據幀保存到磁盤上,以便以后用Vaex讀取它。
file_path = 'big_file.csv' df.to_csv(file_path, index=False)通過直接使用Vaex讀取整個CSV文件,我們不會獲得太多的速度,因為這與Pandas相似。我的筆記本電腦需要大約85秒。
但是,當我們將CSV轉換為HDF5(分層數據格式版本5)時,你就能了解到Vaex的好處了。Vaex具有轉換的功能,該功能甚至可以通過轉換較小的塊來支持大于主內存的文件。
由于內存限制,我們無法使用Pandas打開大文件,但是我們可以將其隱藏為HDF5,使用Vaex處理可以輕松處理。dv = vaex.from_csv(file_path, convert=True, chunk_size=5_000_000)該功能自動創建HDF5文件并將其永久保存到磁盤上。
讓我們檢查一下dv類型。
type(dv) # 輸出 vaex.hdf5.dataset.Hdf5MemoryMapped現在,讓我們使用Vaex讀取7.5 GB的數據集,測試讀取速度。
dv = vaex.open('big_file.csv.hdf5')Vaex用1秒的時間就執行完上面的命令。但Vaex實際上并沒有讀取文件,因為加載很慢。
讓我們通過計算col1的和來強制讀取它。
suma = dv.col1.sum() suma # 數組(49486599)看到測試結果時,你會非常驚訝,Vaex只花了不到1秒的時間,就計算出了總和。它是怎么做到的呢?通過使用內存映射。
1、繪圖
Vaex在繪制數據時也很快,它具有特殊的繪圖功能plot1d、plot2d和plot2d_等高線。
dv.plot1d(dv.col2, figsize=(14, 7))2、虛擬列
Vaex在添加新列時會創建一個虛擬列,該列不占用主內存,因為它是動態計算的。
dv['col1_plus_col2'] = dv.col1 + dv.col2 dv['col1_plus_col2']3、有效過濾
Vaex在過濾數據時不會創建數據幀副本,這樣更節省內存。
dvv = dv[dv.col1 > 90]聚合
聚集的工作原理與Panddas略有不同,但重要的是,它們的速度非???。
讓我們計算一個二進制列,其中col1≥50。
dv['col1_50'] = dv.col1 >= 50Vaex在一個命令中組合group by和aggregation。下面的命令按“col1_50”列對數據進行分組,并計算col3列的總和。
dv_group = dv.groupby(dv['col1_50'], agg=vaex.agg.sum(dv['col3'])) dv_group連接
Vaex在不創建內存副本的情況下連接數據,這樣可以節省主內存。Pandas用戶熟悉的 join 函數:
dv_join = dv.join(dv_group, on=’col1_50')最后
看完有沒有覺得大開眼界?
平時,我們一般都會用Pandas和Dask等庫,但是Python的讀取速度實在不敢恭維,這也是它的最大缺點了,有了Vaex,相信能幫助大家提高一些讀取速度。
希望以上內容,能給大家帶來幫助,喜歡本文的同學記得轉發+收藏哦~
關注我們的公眾號:為AI吶喊(weainahan)可以學到更多知識!
總結
以上是生活随笔為你收集整理的数据加载很慢_Vaex真香!几秒钟就能处理数十亿行数据,比Pandas、Dask更好用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员微信头像_这才是程序员的内心独白
- 下一篇: 自带的数据集_机器学习练习数据哪里找?两