精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

什么格式是保存Pandas數據的最好格式

科技綠洲 ? 來源:Python實用寶典 ? 作者:Python實用寶典 ? 2023-10-30 15:05 ? 次閱讀

在數據分析相關項目工作時,我通常使用Jupyter筆記本和pandas庫來處理和傳遞我的數據。對于中等大小的數據集來說,這是一個非常直接的過程,你甚至可以將其存儲為純文本文件而沒有太多的開銷。

然而,當你的數據集中的觀測數據數量較多時,保存和加載數據回內存的過程就會變慢,現在程序的重新啟動都會迫使你等待數據重新加載。所以最終,CSV文件或任何其他純文本格式都會失去吸引力。

我們可以做得更好。有很多二進制格式可以用來將數據存儲到磁盤上,其中有很多格式pandas都支持。我們怎么能知道哪一種更適合我們的目的呢?

來吧,我們嘗試其中的幾個,然后進行對比!這就是我決定在這篇文章中要做的:通過幾種方法將 pandas.DataFrame 保存到磁盤上,看看哪一種在I/O速度、內存消耗和磁盤空間方面做的更好。

在這篇文章中,我將展示我的測試結果。
1.要比較的格式

我們將考慮采用以下格式來存儲我們的數據:

  1. CSV -- 數據科學家的一個好朋友
  2. Pickle -- 一種Python的方式來序列化事物
  3. MessagePack -- 它就像JSON,但又快又小
  4. HDF5 -- 一種設計用于存儲和組織大量數據的文件格式
  5. Feather -- 一種快速、輕量級、易于使用的二進制文件格式,用于存儲數據框架
  6. Parquet -- Apache Hadoop的柱狀存儲格式

所有這些格式都是被廣泛使用的,而且(也許除了MessagePack)在你做一些數據分析的事情時非常經常遇到。

為了追求找到最好的緩沖格式來存儲程序會話之間的數據,我選擇了以下指標進行比較。

  1. size_mb - 文件大小(Mb)。
  2. save_time - 將數據幀保存到磁盤上所需的時間量。
  3. load_time - 將之前轉儲的數據幀加載到內存中所需要的時間量。
  4. save_ram_delta_mb - 數據幀保存過程中最大的內存消耗增長量。
  5. load_ram_delta_mb - 數據幀加載過程中的最大內存消耗增長量。

請注意,當我們使用高效壓縮的二進制數據格式,如 Parquet 時,最后兩個指標變得非常重要。它們可以幫助我們估計加載序列化數據所需的內存量,此外還有數據大小本身。我們將在接下來的章節中更詳細地討論這個問題。

2.測試及結果

我決定使用一個合成數據集進行測試,以便更好地控制序列化的數據結構和屬性。

另外,我在我的基準中使用了兩種不同的方法:

(a) 將生成的分類變量保留為字符串。

(b) 在執行任何I/O之前將它們轉換為 pandas.Categorical 數據類型。

函數generate_dataset顯示了我在基準中是如何生成數據集的:

def generate_dataset(n_rows, num_count, cat_count, max_nan=0.1, max_cat_size=100):
    """
    隨機生成具有數字和分類特征的數據集。
    
    數字特征取自正態分布X ~ N(0, 1)。
    分類特征則被生成為隨機的uuid4字符串。
    
    此外,數字和分類特征的max_nan比例被替換為NaN值。
    """
    dataset, types = {}, {}
    
    def generate_categories():
        from uuid import uuid4
        category_size = np.random.randint(2, max_cat_size)
        return [str(uuid4()) for _ in range(category_size)]
    
    for col in range(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'
        
    for col in range(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'
    
    return pd.DataFrame(dataset), types

我們將CSV文件的保存和加載性能作為一個基準。

五個隨機生成的具有一百萬個觀測值的數據集被轉儲到CSV中,并讀回內存以獲得平均指標。

每種二進制格式都針對20個隨機生成的具有相同行數的數據集進行測試。

這些數據集包括15個數字特征和15個分類特征。你可以在這個資源庫中找到帶有基準測試功能和所需的完整源代碼:

https://github.com/devforfu/pandas-formats-benchmark

或在Python實用寶典后臺回復 **Pandas IO對比 **,下載完整代碼。

(a) 數據為字符串特征時的性能

下圖顯示了每種數據格式的平均I/O時間。一個有趣的觀察是,hdf顯示出比csv更慢的加載速度,而其他二進制格式的表現明顯更好。其中最令人印象深刻的是feather和parquet。

圖片

在保存數據和從磁盤上讀取數據時,內存開銷如何?

下一張圖片告訴我們,hdf 的表現就不是那么好了。可以肯定的是,csv在保存/加載純文本字符串時不需要太多的額外內存,而Feather和parquet則相當接近:

圖片

最后,讓我們看看文件的大小。這次parquet顯示了一個令人印象深刻的結果,考慮到這種格式是為有效存儲大量數據而開發的,這并不令人驚訝。

圖片

(b) 字符串特征轉換為數字時的性能

在上一節中,我們沒有嘗試有效地存儲我們的分類特征而是使用普通的字符串。讓我們來彌補這個遺漏吧! 這一次我們使用一個專門的 pandas.Categorical 類型,轉字符串特征為數字特征。

圖片

看看現在與純文本的csv相比,它看起來如何!

現在所有的二進制格式都顯示出它們的真正力量。Csv的基準結果已經遠遠落后了,所以讓我們把它去掉,以便更清楚地看到各種二進制格式之間的差異:

圖片

Feather 和 Pickle 顯示了最好的 I/O 速度,而 hdf 仍然顯示了明顯的性能開銷。

現在是時候比較數據進程加載時的內存消耗了。下面的柱狀圖顯示了我們之前提到的關于parquet格式的一個重要事實。

圖片

可以看到 parquet 讀寫時的內存空間差距有多大,你有可能你無法將比較大的 parquet 文件加載到內存中。

最后的圖顯示了各格式的文件大小。所有的格式都顯示出良好的效果,除了hdf仍然需要比其他格式多得多的空間:

圖片

3.結論

正如我們的測試所顯示的,似乎 feather 格式是存儲Python會話數據的理想候選者。它顯示了很快的I/O速度,在磁盤上不占用太多內存,并且在加載回RAM時不需要消耗太大的內存。

當然,這種比較并不意味著你應該在每個可能的情況下使用這種格式。例如,feather格式一般不會被用作長期文件存儲的格式。

另外,某些特定情況下也無法使用 feather,這由你的整個程序架構決定。然而,就如本帖開頭所述的目的,它在不被任何特殊事項限制的情況下是一個很好的選擇。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    6898

    瀏覽量

    88836
  • 存儲
    +關注

    關注

    13

    文章

    4265

    瀏覽量

    85675
  • 磁盤
    +關注

    關注

    1

    文章

    367

    瀏覽量

    25177
收藏 人收藏

    評論

    相關推薦

    Labview存儲數據格式和怎么保存桌面

    問題如下:1:保存桌面,就是把左面保存.BMP格式,用LABVIEW2011怎么實現?有那位高手使用過,順便發我例子;2:就是數據保存
    發表于 04-07 10:10

    輸入并保存txt格式的文件

    如何在txt格式的文件中輸入一列數據,并保存文件到指定位置
    發表于 03-31 09:06

    廣播音頻數據文件格式規范—廣播波形格式(BWF) GY T

    廣播音頻數據文件格式規范—廣播波形格式(BWF) GY T 168-2001
    發表于 11-22 16:55 ?39次下載

    數據格式,計算機中數據格式詳細介紹

    數據格式,計算機中數據格式詳細介紹    計算機中常用的數據表示格式有兩種,一是定點格式,二是浮點格式
    發表于 04-13 11:36 ?3646次閱讀

    gps數據格式含義說明

    本內容介紹了gps數據格式的含義,給出了GPS輸出的是NMEA-0183的數據格式,GPS固定數據輸出語句($GPGGA)
    發表于 12-19 14:57 ?1.3w次閱讀

    格式化對硬盤有傷害嗎_硬盤格式化后數據還能恢復嗎

    普通的格式化硬盤是不會影響硬盤壽命的。硬盤格式化后數據還能恢復嗎?下面就來看看使用強力數據是如何將格式化后的
    發表于 12-14 16:09 ?1.7w次閱讀

    java生成json格式數據 和 java遍歷json格式數據

    本文檔內容介紹了基于java生成json格式數據 和 java遍歷json格式數據,供參考
    發表于 03-19 15:04 ?0次下載

    Apollo與GPS串口通信的數據格式

    GPS驅動解析USB串口數據格式參考設備所提供的GPS格式
    的頭像 發表于 10-20 09:46 ?6449次閱讀

    更高效的利用Jupyter+pandas進行數據分析

    本文將對pandas支持的多種格式數據在處理數據的不同方面進行比較,包含I/O速度、內存消耗、磁盤占用空間等指標,試圖找出如何為我們的數據
    的頭像 發表于 03-12 15:20 ?1723次閱讀

    Cx51用戶指南之數據存儲格式數據存儲格式

    Cx51用戶指南之數據存儲格式數據存儲格式
    發表于 12-13 15:11 ?2次下載

    淺談CAN錯誤幀格式

    數據幀和遙控幀有標準格式和擴展格式兩種格式。標準格式有 11 個位的標識符(Identifier: 以下簡稱 ID), 擴展
    發表于 09-29 12:31 ?1014次閱讀

    WAV文件格式詳解

    WAV是微軟公司開發的一種音頻格式文件,用于保存Windows平臺的音頻信息資源,它符合資源互換文件格式(Resource Interchange File Format,RIFF)文件規范。標準
    的頭像 發表于 10-21 09:52 ?5168次閱讀
    WAV文件<b class='flag-5'>格式</b>詳解

    Pandas:Python中最好數據分析工具

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

    Pandas DataFrame的存儲格式性能對比

    Pandas 支持多種存儲格式,在本文中將對不同類型存儲格式下的Pandas Dataframe的讀取速度、寫入速度和大小的進行測試對比。 創建測試Dataframe 首先創建一個包含
    的頭像 發表于 11-03 09:58 ?497次閱讀
    <b class='flag-5'>Pandas</b> DataFrame的存儲<b class='flag-5'>格式</b>性能對比

    態勢數據有哪些格式

    智慧華盛恒輝態勢數據格式可以因應用場景和數據來源的不同而有所差異。以下是一些常見的態勢數據格式,并進行了分點表示和歸納: 智慧華盛恒輝態勢數據
    的頭像 發表于 06-24 17:44 ?286次閱讀