用Jupyter+pandas資料分析,6種資料格式效率對比
在使用Python進行資料分析時, Jupyter Notebook是一個非常強力的工具,在資料集不是很大的情況下,我們可以使用pandas輕鬆對 txt或 csv等 純文字格式資料進行讀寫。
然而當資料集的維度或者體積很大時,將資料儲存並載入回記憶體的過程就會變慢,並且每次啟動 Jupyter Notebook時都需要等待一段時間直到資料重新載入, 這樣csv格式或任何其他純文字格式資料都失去了吸引力。
本文將對pandas支援的多種格式資料在處理資料的不同方面進行比較,包含 I/O速度、 記憶體消耗、 磁碟佔用空間等指標,試圖找出如何為我們的資料找到一個合適的格式的辦法!
格式說明
現在對本文進行對比的幾種資料格式進行說明。
- CSV:最常用的資料格式
- Pickle:用於序列化和反序列化Python物件結構
- MessagePack:類似於json,但是更小更塊
- HDF5:一種常見的跨平臺資料儲存檔案
- Feather:一個快速、輕量級的儲存框架
- Parquet:Apache Hadoop的列式儲存格式
指標說明
為了找到格式來儲存資料,本文選擇以下指標進行對比。
- size_mb:帶有序列化資料幀的檔案的大小
- save_time:將資料幀儲存到磁碟所需的時間
- 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個隨機生成的資料集測試了每種二進位制格式。
同時使用兩種方法進行對比:
- 1.將生成的分類變數保留為字串
- 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格式用作長期檔案儲存。此外,當其他格式發揮最佳效果時,它並未考慮所有可能的情況。所以我們也需要根據具體情況進行選擇!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69923331/viewspace-2730764/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 探索多種資料格式:JSON、YAML、XML、CSV等資料格式詳解與比較JSONYAMLXML
- 資料庫訪問幾種方式對比資料庫
- MySQL 資料對比MySql
- 多種格式資料輸出
- 【資料分析】針對家庭用電資料進行時序分析(1)
- 大資料分析師,比資料分析師厲害在哪大資料
- 用《Excel》玩轉格式,輕鬆分析龐大資料!Excel大資料
- SQL與Pandas大資料分析效能對比(Haki Benita)SQL大資料
- MXNet的資料格式轉化為tensorflow訓練用的資料格式
- JSON資料交換格式有幾種?JSON
- 電商資料分析必備的4種資料分析方法
- 77種資料建模工具比較
- 比較 Apache Hadoop 資料儲存格式 - techwellApacheHadoop
- 關聯式資料庫與文件資料庫對比資料庫
- Python資料處理(一):處理 JSON、XML、CSV 三種格式資料PythonJSONXML
- 迴歸資料分析,資料運營的三種角色!
- 資料庫在資料分析中如何應用資料庫
- 資料包格式
- 資料分析 | 用 SeaTable 表格快速統計分析訂單資料
- json_encode的資料格式化的兩種格式[]和{}JSON
- 大資料分析的幾種方法大資料
- HashMap,LinkedHashMap,TreeMap讀取大量資料效率的比較HashMap
- 大資料開發之常見九種資料分析方法大資料
- 大資料開發常見的9種資料分析手段大資料
- oracle Mysql PostgreSQL 資料庫的對比OracleMySql資料庫
- 漫談“資料拆分層次對比”
- 用兩種方法把JSON資料格式轉換為Python的類物件JSONPython物件
- 對比6款資料分析熱門工具,入門入行學什麼,看完一目瞭然
- 資料湖表格式比較(Iceberg、Hudi 和 Delta Lake)
- mongodb資料遷移2種方式比較MongoDB
- ClickHouse 與 MySQL 資料庫適用場景對比總結MySql資料庫
- 資料分析師如何應對資料庫取數後的離線分析資料庫
- 使用資料倉儲BI的6種策略
- Oracle資料塊格式Oracle
- GEOJSON資料格式解析JSON
- 九種常見的資料分析模型模型
- 四種大資料分析方法介紹!大資料
- 資料湖選型指南|Hudi vs Iceberg 資料更新能力深度對比