0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

更高效的利用Jupyter+pandas進行數(shù)據(jù)分析

數(shù)據(jù)分析與開發(fā) ? 來源:數(shù)據(jù)分析與開發(fā) ? 作者:數(shù)據(jù)分析與開發(fā) ? 2021-03-12 15:20 ? 次閱讀

在使用Python進行數(shù)據(jù)分析時,Jupyter Notebook是一個非常強力的工具,在數(shù)據(jù)集不是很大的情況下,我們可以使用pandas輕松對txt或csv等純文本格式數(shù)據(jù)進行讀寫。

然而當數(shù)據(jù)集的維度或者體積很大時,將數(shù)據(jù)保存并加載回內(nèi)存的過程就會變慢,并且每次啟動Jupyter Notebook時都需要等待一段時間直到數(shù)據(jù)重新加載, 這樣csv格式或任何其他純文本格式數(shù)據(jù)都失去了吸引力。

本文將對pandas支持的多種格式數(shù)據(jù)在處理數(shù)據(jù)的不同方面進行比較,包含I/O速度、內(nèi)存消耗、磁盤占用空間等指標,試圖找出如何為我們的數(shù)據(jù)找到一個合適的格式的辦法!

格式說明

現(xiàn)在對本文進行對比的幾種數(shù)據(jù)格式進行說明。

CSV:最常用的數(shù)據(jù)格式

Pickle:用于序列化和反序列化Python對象結(jié)構(gòu)

MessagePack:類似于json,但是更小更塊

HDF5:一種常見的跨平臺數(shù)據(jù)儲存文件

Feather:一個快速、輕量級的存儲框架

Parquet:Apache Hadoop的列式存儲格式

指標說明

為了找到格式來存儲數(shù)據(jù),本文選擇以下指標進行對比。

size_mb:帶有序列化數(shù)據(jù)幀的文件的大小

save_time:將數(shù)據(jù)幀保存到磁盤所需的時間

load_time:將先前轉(zhuǎn)儲的數(shù)據(jù)幀加載到內(nèi)存所需的時間

save_ram_delta_mb:在數(shù)據(jù)幀保存過程中最大的內(nèi)存消耗增長

load_ram_delta_mb:數(shù)據(jù)幀加載過程中最大的內(nèi)存消耗增長

注意,當我們使用有效壓縮的二進制數(shù)據(jù)格式(例如Parquet)時,最后兩個指標變得非常重要。它們可以幫助我們估算加載串行化數(shù)據(jù)所需的RAM數(shù)量,以及數(shù)據(jù)大小本身。我們將在下一部分中更詳細地討論這個問題。

對比

現(xiàn)在開始對前文介紹的5種數(shù)據(jù)格式進行比較,為了更好地控制序列化的數(shù)據(jù)結(jié)構(gòu)和屬性我們將使用自己生成的數(shù)據(jù)集。 下面是生成測試數(shù)據(jù)的代碼,我們隨機生成具有數(shù)字和分類特征的數(shù)據(jù)集。數(shù)值特征取自標準正態(tài)分布。分類特征以基數(shù)為C的uuid4隨機字符串生成,其中2 <= C <= max_cat_size。

defgenerate_dataset(n_rows,num_count,cat_count,max_nan=0.1,max_cat_size=100): dataset,types={},{} defgenerate_categories(): fromuuidimportuuid4 category_size=np.random.randint(2,max_cat_size) return[str(uuid4())for_inrange(category_size)] forcolinrange(num_count): name=f'n{col}' values=np.random.normal(0,1,n_rows) nan_cnt=np.random.randint(1,int(max_nan*n_rows)) index=np.random.choice(n_rows,nan_cnt,replace=False) values[index]=np.nan dataset[name]=values types[name]='float32' forcolinrange(cat_count): name=f'c{col}' cats=generate_categories() values=np.array(np.random.choice(cats,n_rows,replace=True),dtype=object) nan_cnt=np.random.randint(1,int(max_nan*n_rows)) index=np.random.choice(n_rows,nan_cnt,replace=False) values[index]=np.nan dataset[name]=values types[name]='object' returnpd.DataFrame(dataset),types 現(xiàn)在我們以CSV文件保存和加載的性能作為基準。將五個隨機生成的具有百萬個觀測值的數(shù)據(jù)集轉(zhuǎn)儲到CSV中,然后讀回內(nèi)存以獲取平均指標。并且針對具有相同行數(shù)的20個隨機生成的數(shù)據(jù)集測試了每種二進制格式。 同時使用兩種方法進行對比:

1.將生成的分類變量保留為字符串

2.在執(zhí)行任何I/O之前將其轉(zhuǎn)換為pandas.Categorical數(shù)據(jù)類型

1.以字符串作為分類特征

下圖顯示了每種數(shù)據(jù)格式的平均I/O時間。這里有趣的發(fā)現(xiàn)是hdf的加載速度比csv更低,而其他二進制格式的性能明顯更好,而feather和parquet則表現(xiàn)的非常好。

保存數(shù)據(jù)并從磁盤讀取數(shù)據(jù)時的內(nèi)存消耗如何?下一張圖片向我們展示了hdf的性能再次不那么好。但可以肯定的是,csv不需要太多額外的內(nèi)存來保存/加載純文本字符串,而feather和parquet則非常接近。

最后,讓我們看一下文件大小的對比。這次parquet顯示出非常好的結(jié)果,考慮到這種格式是為有效存儲大量數(shù)據(jù)而開發(fā)的,也是理所當然。

2. 對特征進行轉(zhuǎn)換

在上一節(jié)中,我們沒有嘗試有效地存儲分類特征,而是使用純字符串,接下來我們使用專用的pandas.Categorical類型再次進行比較。

從上圖可以看到,與純文本csv相比,所有二進制格式都可以顯示其真強大功能,效率遠超過csv,因此我們將其刪除以更清楚地看到各種二進制格式之間的差異。

可以看到feather和pickle擁有最快的I/O速度,接下來該比較數(shù)據(jù)加載過程中的內(nèi)存消耗了。下面的條形圖顯示了我們之前提到的有關(guān)parquet格式的情況。

為什么parquet內(nèi)存消耗這么高?因為只要在磁盤上占用一點空間,就需要額外的資源才能將數(shù)據(jù)解壓縮回數(shù)據(jù)幀。即使文件在持久性存儲磁盤上需要適度的容量,也可能無法將其加載到內(nèi)存中。 最后我們看下不同格式的文件大小比較。所有格式都顯示出良好的效果,除了hdf仍然需要比其他格式更多的空間。

結(jié)論

正如我們的上面的測試結(jié)果所示,feather格式似乎是在多個Jupyter之間存儲數(shù)據(jù)的理想選擇。它顯示出很高的I/O速度,不占用磁盤上過多的內(nèi)存,并且在裝回RAM時不需要任何拆包。

當然這種比較并不意味著我們應(yīng)該在每種情況下都使用這種格式。例如,不希望將feather格式用作長期文件存儲。此外,當其他格式發(fā)揮最佳效果時,它并未考慮所有可能的情況。所以我們也需要根據(jù)具體情況進行選擇!

責任編輯:lq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • RAM
    RAM
    +關(guān)注

    關(guān)注

    8

    文章

    1344

    瀏覽量

    114214
  • 變量
    +關(guān)注

    關(guān)注

    0

    文章

    607

    瀏覽量

    28257
  • 數(shù)據(jù)集
    +關(guān)注

    關(guān)注

    4

    文章

    1197

    瀏覽量

    24536

原文標題:更高效的利用 Jupyter+pandas 進行數(shù)據(jù)分析,6 種常用數(shù)據(jù)格式效率對比!

文章出處:【微信號:DBDevs,微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    數(shù)據(jù)分析在提高灌區(qū)管理水平中的作用

    數(shù)據(jù)分析在提升灌區(qū)管理水平中扮演著至關(guān)重要的角色,它通過深度挖掘海量信息,為灌溉系統(tǒng)的高效運作、資源優(yōu)化配置及可持續(xù)發(fā)展提供了科學決策的基礎(chǔ)。這一過程不僅涉及數(shù)據(jù)的收集、整理與分析,還
    的頭像 發(fā)表于 08-28 17:23 ?147次閱讀
    <b class='flag-5'>數(shù)據(jù)分析</b>在提高灌區(qū)管理水平中的作用

    數(shù)據(jù)分析的工具有哪些

    開發(fā)的一款電子表格軟件,廣泛應(yīng)用于數(shù)據(jù)分析領(lǐng)域。它具有以下特點: 數(shù)據(jù)整理:Excel提供了豐富的數(shù)據(jù)整理功能,如排序、篩選、查找和替換等。 數(shù)據(jù)計算:Excel內(nèi)置了數(shù)百種函數(shù),可以
    的頭像 發(fā)表于 07-05 14:54 ?519次閱讀

    數(shù)據(jù)分析有哪些分析方法

    。 描述性分析 描述性分析數(shù)據(jù)分析的第一步,它的目的是對數(shù)據(jù)進行描述和總結(jié)。描述性分析通常包括
    的頭像 發(fā)表于 07-05 14:51 ?323次閱讀

    機器學習在數(shù)據(jù)分析中的應(yīng)用

    隨著大數(shù)據(jù)時代的到來,數(shù)據(jù)量的爆炸性增長對數(shù)據(jù)分析提出了更高的要求。機器學習作為一種強大的工具,通過訓練模型從數(shù)據(jù)中學習規(guī)律,為企業(yè)和組織提
    的頭像 發(fā)表于 07-02 11:22 ?302次閱讀

    求助,關(guān)于AD采集到的數(shù)據(jù)分析問題

    問題描述:使用AD采集一個10Hz到2MHz的脈沖,脈沖底部可能大于零,由采集到的數(shù)據(jù)分析出該脈沖的上升時間,幅值和占空比。 備注:在分析的時候已經(jīng)知道脈沖的頻率,精度為2X10^-5. 在分析
    發(fā)表于 05-09 07:40

    Python利用pandas讀寫Excel文件

    使用pandas模塊讀取Excel文件可以更為方便和快捷。pandas可以將Excel文件讀取為一個DataFrame對象,方便進行數(shù)據(jù)處理和分析。
    的頭像 發(fā)表于 12-16 11:22 ?1029次閱讀
    Python<b class='flag-5'>利用</b><b class='flag-5'>pandas</b>讀寫Excel文件

    Python編程的十大依賴庫有哪些

    Pandas庫是數(shù)據(jù)科學家的得力工具,它提供了強大的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)分析功能。無論您需要進行數(shù)據(jù)清洗、分析
    的頭像 發(fā)表于 12-13 10:29 ?711次閱讀

    Get職場新知識:做分析,用大數(shù)據(jù)分析工具

    、多維動態(tài)分析,業(yè)務(wù)人隨時按需分析,更靈活,更高效。 3、指標計算能力極強,能很好地完成計算組合多變、計算量極大的財務(wù)分析指標計算。 現(xiàn)在登錄奧威BI SaaS平臺,即可享受在線連接系
    發(fā)表于 12-05 09:36

    使用pandas進行數(shù)據(jù)選擇和過濾的基本技術(shù)和函數(shù)

    Python pandas庫提供了幾種選擇和過濾數(shù)據(jù)的方法,如loc、iloc、[]括號操作符、query、isin、between等等
    的頭像 發(fā)表于 12-01 10:14 ?280次閱讀
    使用<b class='flag-5'>pandas</b><b class='flag-5'>進行數(shù)據(jù)</b>選擇和過濾的基本技術(shù)和函數(shù)

    如何實現(xiàn)Pandas的DataFrame轉(zhuǎn)換交互式表格

    Pivottablejs是一個通過IPython widgets集成到Python中的JavaScript庫,允許用戶直接從DataFrame數(shù)據(jù)創(chuàng)建交互式和靈活的匯總報表??梢?b class='flag-5'>進行高效、清晰的
    的頭像 發(fā)表于 11-21 16:15 ?676次閱讀
    如何實現(xiàn)<b class='flag-5'>Pandas</b>的DataFrame轉(zhuǎn)換交互式表格

    Anaconda:Python 數(shù)據(jù)分析與挖掘好幫手

    用Python進行數(shù)據(jù)分析的時候,你會不會煩惱要安裝那么多的模塊?比如Pandas、Numpy、matplotlib、scipy等等,而當你接手的項目是由不同的Python版本編寫的時候你又得
    的頭像 發(fā)表于 11-02 16:00 ?469次閱讀
    Anaconda:Python <b class='flag-5'>數(shù)據(jù)分析</b>與挖掘好幫手

    如何利用Python和pandas來處理json數(shù)據(jù)

    了如何利用Python和pandas(Python的第三方庫)來處理json數(shù)據(jù),主要內(nèi)容包含: json數(shù)據(jù)簡介 常用json數(shù)據(jù)轉(zhuǎn)化網(wǎng)站
    的頭像 發(fā)表于 11-01 10:59 ?1672次閱讀
    如何<b class='flag-5'>利用</b>Python和<b class='flag-5'>pandas</b>來處理json<b class='flag-5'>數(shù)據(jù)</b>

    Pandas:Python中最好的數(shù)據(jù)分析工具

    Pandas絕對是Python中最好的數(shù)據(jù)分析工具,不接受反駁。 本文將展示如何美化 Pandas DataFrame 中的數(shù)字,并使用一些更高級的
    的頭像 發(fā)表于 10-31 10:47 ?389次閱讀
    <b class='flag-5'>Pandas</b>:Python中最好的<b class='flag-5'>數(shù)據(jù)分析</b>工具

    什么格式是保存Pandas數(shù)據(jù)的最好格式

    數(shù)據(jù)分析相關(guān)項目工作時,我通常使用Jupyter筆記本和pandas庫來處理和傳遞我的數(shù)據(jù)。對于中等大小的數(shù)據(jù)集來說,這是一個非常直接的過
    的頭像 發(fā)表于 10-30 15:05 ?562次閱讀
    什么格式是保存<b class='flag-5'>Pandas</b><b class='flag-5'>數(shù)據(jù)</b>的最好格式

    盤點66個Pandas函數(shù)合集

    今天我們重新盤點66個Pandas函數(shù)合集,包括數(shù)據(jù)預(yù)覽、數(shù)值數(shù)據(jù)操作、文本數(shù)據(jù)操作、行/列操作等等,涉及“ 數(shù)據(jù)清洗 ”的方方面面。
    的頭像 發(fā)表于 10-30 09:58 ?1269次閱讀
    盤點66個<b class='flag-5'>Pandas</b>函數(shù)合集