更高效地利用 Jupyter+pandas 進行數據分析,6 種常用數據格式效率對比!

2021-02-19 CSDN

來源 | 早起Python(ID:zaoqi-python)

編譯 | 劉早起(有刪改)

在使用 Python 進行數據分析時,Jupyter Notebook 是一個非常強力的工具,在數據集不是很大的情況下,我們可以使用 pandas 輕鬆對 txt 或 csv 等純文本格式數據進行讀寫。然而當數據集的維度或者體積很大時,將數據保存並加載回內存的過程就會變慢,並且每次啟動 Jupyter Notebook 時都需要等待一段時間直到數據重新加載, 這樣 csv 格式或任何其他純文本格式數據都失去了吸引力。本文將對 pandas 支持的多種格式數據在處理數據的不同方面進行比較,包含 I/O速度、內存消耗、磁碟佔用空間等指標,試圖找出如何為我們的數據找到一個合適的格式的辦法!Pickle:用於序列化和反序列化Python對象結構MessagePack:類似於json,但是更小更塊Parquet:Apache Hadoop的列式存儲格式為了找到格式來存儲數據,本文選擇以下指標進行對比。load_time:將先前轉儲的數據幀加載到內存所需的時間save_ram_delta_mb:在數據幀保存過程中最大的內存消耗增長load_ram_delta_mb:數據幀加載過程中最大的內存消耗增長注意,當我們使用有效壓縮的二進位數據格式(例如Parquet)時,最後兩個指標變得非常重要。它們可以幫助我們估算加載串行化數據所需的RAM數量,以及數據大小本身。我們將在下一部分中更詳細地討論這個問題。現在開始對前文介紹的5種數據格式進行比較,為了更好地控制序列化的數據結構和屬性我們將使用自己生成的數據集。下面是生成測試數據的代碼,我們隨機生成具有數字和分類特徵的數據集。數值特徵取自標準正態分布。分類特徵以基數為C的uuid4隨機字符串生成,其中2 <= C <= max_cat_size。
def generate_dataset(n_rows, num_count, cat_count, max_nan=0.1, max_cat_size=100):
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個隨機生成的數據集測試了每種二進位格式。2.在執行任何 I/O 之前將其轉換為 pandas.Categorical 數據類型1、以字符串作為分類特徵下圖顯示了每種數據格式的平均 I/O 時間。這裡有趣的發現是 hdf 的加載速度比 csv 更低,而其他二進位格式的性能明顯更好,而 feather 和 parquet 則表現的非常好。保存數據並從磁碟讀取數據時的內存消耗如何?下一張圖片向我們展示了 hdf 的性能再次不那麼好。但可以肯定的是,csv 不需要太多額外的內存來保存/加載純文本字符串,而 feather 和 parquet 則非常接近。最後,讓我們看一下文件大小的對比。這次 parquet 顯示出非常好的結果,考慮到這種格式是為有效存儲大量數據而開發的,也是理所當然。2、對特徵進行轉換在上一節中,我們沒有嘗試有效地存儲分類特徵,而是使用純字符串,接下來我們使用專用的 pandas.Categorical 類型再次進行比較。從上圖可以看到,與純文本 csv 相比,所有二進位格式都可以顯示其真強大功能,效率遠超過 csv,因此我們將其刪除以更清楚地看到各種二進位格式之間的差異。可以看到 feather 和 pickle 擁有最快的 I/O 速度,接下來該比較數據加載過程中的內存消耗了。下面的條形圖顯示了我們之前提到的有關 parquet 格式的情況。為什麼parquet內存消耗這麼高?因為只要在磁碟上佔用一點空間,就需要額外的資源才能將數據解壓縮回數據幀。即使文件在持久性存儲磁碟上需要適度的容量,也可能無法將其加載到內存中。最後我們看下不同格式的文件大小比較。所有格式都顯示出良好的效果,除了hdf仍然需要比其他格式更多的空間。正如我們的上面的測試結果所示,feather 格式似乎是在多個 Jupyter 之間存儲數據的理想選擇。它顯示出很高的 I/O 速度,不佔用磁碟上過多的內存,並且在裝回 RAM 時不需要任何拆包。當然這種比較並不意味著我們應該在每種情況下都使用這種格式。例如,不希望將 feather 格式用作長期文件存儲。此外,當其他格式發揮最佳效果時,它並未考慮所有可能的情況。所以我們也需要根據具體情況進行選擇!

相關焦點

  • 讓數據分析更簡單的Panda技巧:萬能轉格式、輕鬆合併、數據壓縮...
    現在,數據科學家 Roman Orac 分享了他在工作中相見恨晚的 Pandas 使用技巧。了解了這些技巧,能讓你在學習、使用 Pandas 的時候更加高效。話不多說,一起學習一下~Pandas實用技巧用 Pandas 做數據分析,最大的亮點當屬 DataFrame。不過,在展示成果的時候,常常需要把 DataFrame 轉成另一種格式。
  • 推薦6個Python數據分析神器!!
    出品:Python數據科學用Python處理數據大家都不陌生了,屬常規操作,但常規之下還是也有些暗藏技巧的,本篇東哥分享6個好玩高效的操作,幫助大家提高效率。一、Pandas ProfilingPandas Profiling提供數據的一個整體報告,是一個幫助我們理解數據的過程。它可以簡單快速地對Pandas的數據框數據進行探索性數據分析。其實,Pandas中df.describe()和df.info()函數也可以實現數據探索過程第一步。
  • 推薦 6 個 Python 數據分析神器!!
    出品 | Python數據科學用Python處理數據大家都不陌生了,屬常規操作,但常規之下還是也有些暗藏技巧的,本篇東哥分享6個好玩高效的操作,幫助大家提高效率。一、Pandas ProfilingPandas Profiling提供數據的一個整體報告,是一個幫助我們理解數據的過程。它可以簡單快速地對Pandas的數據框數據進行探索性數據分析。其實,Pandas中df.describe()和df.info()函數也可以實現數據探索過程第一步。
  • 使用Python和Jupyter Notebook進行數據分析
    ——漢·王符《潛夫論·明暗》數據分析,不管對於個人,還是公司,都是一種核心能力。和一些數據朋友聊天時,會談及一些有效的數據分析工具。懷揣著學習和進取的心態,我立刻在google上面檢索關鍵詞:python jupyter notebook data analysis,閱讀了一些與這個主題相關的系列文章,並且積極地進行實踐之,讓自己一來熟悉jupyter notebook這個工具,二來藉助這個工具實現更有效地做數據分析。
  • Python數據分析實戰:用Pandas 處理時間序列
    這裡我們採用美國能源消耗數據集進行分析和討論,數據集可以在kaggle上下載,如果有問題,可以留言討論。該數據集包含了美國一家能源公司的長達數十年的能源消耗數據,數據解析度為小時。這裡我們下載了兩個數據集進行對比分析,PJME_hourly 和PJMW_hourly (分別對應東區和西區)。數據集默認放在同目錄的data文件夾下。
  • 不容錯過的Pandas小技巧:萬能轉格式、輕鬆合併、壓縮數據,讓數據分析更高效
    了解了這些技巧,能讓你在學習、使用 Pandas 的時候更加高效。Pandas實用技巧用 Pandas 做數據分析,最大的亮點當屬 DataFrame。不過,在展示成果的時候,常常需要把 DataFrame 轉成另一種格式。Pandas 在這一點上其實十分友好,只需添加一行代碼。如果你需要用 HTML 發送自動報告,那麼 to_html 函數了解一下。
  • Pandas 數據分析: 3 種方法實現一個實用小功能
    Pandas 的強大體現在其簡潔,解決一些數據分析問題非常方便。
  • Pandas v0.15.0 final 發布,Python 數據分析工具包
    Pandas v0.15.0 final 發布,此版本現已提供下載,主要是大量的 API 改進,一些新特性,功能增強和性能提升,還有大量的 bug 修復,具體更新內容如下:Drop
  • 花式導數據、合併、壓縮,數據分析更高效
    現在,數據科學家 Roman Orac 分享了他在工作中相見恨晚的 Pandas 使用技巧。了解了這些技巧,能讓你在學習、使用 Pandas 的時候更加高效。話不多說,一起學習一下~Pandas實用技巧用 Pandas 做數據分析,最大的亮點當屬 DataFrame。不過,在展示成果的時候,常常需要把 DataFrame 轉成另一種格式。Pandas 在這一點上其實十分友好,只需添加一行代碼。
  • python數據分析之pandas常用命令整理
    pandas 是基於NumPy 的一種工具,該工具是為了解決數據分析任務而創建的。Pandas 納入了大量庫和一些標準的數據模型,提供了高效地操作大型數據集所需的工具。pandas提供了大量能使我們快速便捷地處理數據的函數和方法。你很快就會發現,它是使Python成為強大而高效的數據分析環境的重要因素之一。
  • 數據分析工具篇——pandas高效函數
    ,這些方法圍繞數據的查詢結果進行深入處理,在數據分析中主要做特徵處理工作。先看使用最頻繁的一個:import pandas as pddata1 = pd.DataFrame([['1','23',3, 5],['2','4',9, 6],['3','83',6, 7]], columns=['a','b','c','d'])print(data1.drop_duplicates(subset=['a'
  • 數據分析利器 pandas 系列教程(二):強大的 DataFrame
    在上一篇文章 數據分析利器 pandas 系列教程(一):從 Series 說起  中:詳細介紹了 pandas 基礎數據結構 Series,今天說說另一種數據結構 DataFrame。創建 dataframe 其實有 N 種方法,沒必要一一掌握,畢竟常用的不過兩三種,我也不打算把所有的創建方式都說一遍,那樣有炫技的嫌疑,按照自己的理解,我把這些創建方式統一分為兩大類:按列的方式創建、按行的方式創建,只講這兩大類下各自最具代表性的創建方式。
  • Pandas | 5 種技巧高效利用value-counts
    在確定訓練哪種模型以及訓練多少模型之前,我們必須對數據包含的內容有所了解。Pandas 庫為此提供了許多有用的函數,value_counts 就是其中之一。此函數返回 pandas 數據框中各個項的數量。但在使用 value-counts 函數的大多數時候用到的是默認參數。因此,在這篇短文中,作者介紹了如何通過自定義參數來實現更多的功能。
  • Python 數據分析:Pandas 進階
    概述我們在上一篇文章初識 Pandas中已經對 Pandas 作了一些基本介紹,本文我們進一步來學習 Pandas 的一些使用。2. 缺失項在現實中我們獲取到的數據有時會存在缺失項問題,對於這樣的數據,我們通常需要做一些基本處理,下面我們通過示例來看一下。
  • ​數據可視化|用斜率圖進行對比分析
    斜率圖,可以快速展現兩組數據之間各維度的變化,特別適合用於對比兩個時間點的數據。比如說,為了對比分析某產品不同功能的用戶滿意度,經過問卷調查和數據統計,得到下面這個調查結果:你不妨自己先思考一下,如何對這組數據進行可視化,才能讓信息傳遞變得更加高效?下面是我用 matplotlib 製作的圖表:
  • 小白學 Python 數據分析(3):Pandas (二)數據結構 Series
    (1):數據分析基礎小白學 Python 數據分析(2):Pandas (一)概述引言先介紹下 Pandas 的數據結構,畢竟數據結構是萬物的基礎。Pandas 有兩種主要的數據結構:Series 和 DataFrame ,本文就先介紹第一種 Series 。
  • 利用 Pandas 分析日誌數據
    若能將數據處理成結構化表格信息,則可便於分析各步驟的執行狀況例如起止時間、耗時,進而輔助性能與維穩性的優化。此文主要通過非結構化數據日誌文件樣例,來介紹如何利用Pandas中的技巧,完成數據從非結構化到結構化的過程。
  • 利用機器學習進行金融數據風險評估
    需求使用數據1,用python語言構建邏輯回歸模型,分析預測目標人群發生風險交易的概率(1)以 「python.txt」命名完整python執行代碼,建模流程完整,主要步驟代碼注釋規範:有讀入或導入樣本、分析特徵變量、查看數據維度、建立模型、測試模型相關步驟。(2)能測試評估模型有效性。
  • 數據分析利器 pandas 系列教程(四):對比 sql 學 pandas
    pandas 教程的第四篇,本篇將對比 sql 語言,學習 pandas 中各種類 sql 操作,文章篇幅較長,可以先收藏後食用,但不可以收藏後積灰~為了方便,依然以下面這個 DataFrame 為例,其變量名為 df,設有一同樣結構的 SQL 表,表名為 tb:
  • 手把手教你用 Jupyter Notebook 分析安全事件(一)
    其餘四部分可在以下連結找到:· 用Jupyter Notebook 進行威脅狩獵——第二部分: Pandas 數據分析基礎· 用Jupyter Notebook 進行威脅狩獵——第三部分: 利用 Apache Spark 查詢 Elasticsearch ·