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

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

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

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

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

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

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

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

格式說明

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

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

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

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

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

Feather:一個(gè)快速、輕量級(jí)的存儲(chǔ)框架

Parquet:Apache Hadoop的列式存儲(chǔ)格式

指標(biāo)說明

為了找到格式來存儲(chǔ)數(shù)據(jù),本文選擇以下指標(biāo)進(jìn)行對(duì)比。

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

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

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

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

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

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

對(duì)比

現(xiàn)在開始對(duì)前文介紹的5種數(shù)據(jù)格式進(jìn)行比較,為了更好地控制序列化的數(shù)據(jù)結(jié)構(gòu)和屬性我們將使用自己生成的數(shù)據(jù)集。 下面是生成測試數(shù)據(jù)的代碼,我們隨機(jī)生成具有數(shù)字和分類特征的數(shù)據(jù)集。數(shù)值特征取自標(biāo)準(zhǔn)正態(tài)分布。分類特征以基數(shù)為C的uuid4隨機(jī)字符串生成,其中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文件保存和加載的性能作為基準(zhǔn)。將五個(gè)隨機(jī)生成的具有百萬個(gè)觀測值的數(shù)據(jù)集轉(zhuǎn)儲(chǔ)到CSV中,然后讀回內(nèi)存以獲取平均指標(biāo)。并且針對(duì)具有相同行數(shù)的20個(gè)隨機(jī)生成的數(shù)據(jù)集測試了每種二進(jìn)制格式。 同時(shí)使用兩種方法進(jìn)行對(duì)比:

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

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

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

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

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

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

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

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

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

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

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

結(jié)論

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

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

責(zé)任編輯:lq

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

    關(guān)注

    8

    文章

    1369

    瀏覽量

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

    關(guān)注

    0

    文章

    613

    瀏覽量

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

    關(guān)注

    4

    文章

    1208

    瀏覽量

    24737

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Mathematica 在數(shù)據(jù)分析中的應(yīng)用

    ,在數(shù)據(jù)分析領(lǐng)域發(fā)揮著重要作用。 1. 數(shù)據(jù)導(dǎo)入 在進(jìn)行數(shù)據(jù)分析之前,首先需要將數(shù)據(jù)導(dǎo)入到Mathematica中。Mathematica支持多種數(shù)
    的頭像 發(fā)表于 12-26 15:41 ?120次閱讀

    zeta的定義和應(yīng)用 如何使用zeta進(jìn)行數(shù)據(jù)分析

    Zeta(ζ)電位是描述懸浮粒子在液體中移動(dòng)時(shí)所產(chǎn)生的電位差的一個(gè)物理量,以下是對(duì)其定義、應(yīng)用以及如何進(jìn)行數(shù)據(jù)分析的詳細(xì)解釋: Zeta電位的定義 Zeta電位是通過理論推導(dǎo)和實(shí)驗(yàn)測量得到的,它反映
    的頭像 發(fā)表于 12-19 18:10 ?805次閱讀

    如何使用SQL進(jìn)行數(shù)據(jù)分析

    使用SQL進(jìn)行數(shù)據(jù)分析是一個(gè)強(qiáng)大且靈活的過程,它涉及從數(shù)據(jù)庫中提取、清洗、轉(zhuǎn)換和聚合數(shù)據(jù),以便進(jìn)行進(jìn)一步的分析和洞察。 1.
    的頭像 發(fā)表于 11-19 10:26 ?321次閱讀

    eda與傳統(tǒng)數(shù)據(jù)分析的區(qū)別

    進(jìn)行初步的探索和理解,發(fā)現(xiàn)數(shù)據(jù)中潛在的模式、關(guān)系、異常值等,為后續(xù)的分析和建模提供線索和基礎(chǔ)。 方法論 :EDA強(qiáng)調(diào)數(shù)據(jù)的真實(shí)分布和可視化,使用多種圖表和可視化工具來展示
    的頭像 發(fā)表于 11-13 10:52 ?356次閱讀

    為什么選擇eda進(jìn)行數(shù)據(jù)分析

    數(shù)據(jù)科學(xué)領(lǐng)域,數(shù)據(jù)分析是一個(gè)復(fù)雜且多步驟的過程,它涉及到數(shù)據(jù)的收集、清洗、探索、建模和解釋。在這些步驟中,探索性數(shù)據(jù)分析(EDA)扮演著至關(guān)重要的角色。 1. 理解
    的頭像 發(fā)表于 11-13 10:41 ?260次閱讀

    raid 在大數(shù)據(jù)分析中的應(yīng)用

    RAID(Redundant Array of Independent Disks,獨(dú)立磁盤冗余陣列)在大數(shù)據(jù)分析中的應(yīng)用主要體現(xiàn)在提高存儲(chǔ)系統(tǒng)的性能、可靠性和容量上。以下是RAID在大數(shù)據(jù)分析
    的頭像 發(fā)表于 11-12 09:44 ?265次閱讀

    云計(jì)算在大數(shù)據(jù)分析中的應(yīng)用

    和處理大規(guī)模的數(shù)據(jù)集。通過云計(jì)算平臺(tái),用戶可以快速構(gòu)建數(shù)據(jù)倉庫,將海量數(shù)據(jù)進(jìn)行存儲(chǔ)、管理和分析。這種能力使得企業(yè)能夠
    的頭像 發(fā)表于 10-24 09:18 ?506次閱讀

    使用AI大模型進(jìn)行數(shù)據(jù)分析的技巧

    使用AI大模型進(jìn)行數(shù)據(jù)分析的技巧涉及多個(gè)方面,以下是一些關(guān)鍵的步驟和注意事項(xiàng): 一、明確任務(wù)目標(biāo)和需求 在使用AI大模型之前,首先要明確數(shù)據(jù)分析的任務(wù)目標(biāo),這將直接影響模型的選擇、數(shù)據(jù)收集和處理方式
    的頭像 發(fā)表于 10-23 15:14 ?864次閱讀

    如何利用海外爬蟲IP進(jìn)行數(shù)據(jù)抓取

    利用海外爬蟲IP進(jìn)行數(shù)據(jù)抓取需要綜合考慮多個(gè)方面。
    的頭像 發(fā)表于 10-12 07:54 ?212次閱讀

    IP 地址大數(shù)據(jù)分析如何進(jìn)行網(wǎng)絡(luò)優(yōu)化?

    一、大數(shù)據(jù)分析在網(wǎng)絡(luò)優(yōu)化中的作用 1.流量分析數(shù)據(jù)分析可以對(duì)網(wǎng)絡(luò)中的流量進(jìn)行實(shí)時(shí)監(jiān)測和分析,了解網(wǎng)絡(luò)的使用情況和流量趨勢。通過對(duì)流量
    的頭像 發(fā)表于 10-09 15:32 ?255次閱讀
    IP 地址大<b class='flag-5'>數(shù)據(jù)分析</b>如何<b class='flag-5'>進(jìn)行</b>網(wǎng)絡(luò)優(yōu)化?

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

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

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

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

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

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

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

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

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

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