我們在使用pandas處理完數據之後,最終總是要把數據作為一個文件保存下來,那麼,保存數據最常用的文件是什麼呢?我想大部分人一定會選擇csv或者excel。 剛接觸數據分析時,我也是這麼選擇的,不過,今天將介紹幾種不一樣的存儲數據的文件格式。這些文件格式各有自己的一些優點,希望本文能讓你以後的數據存 ...
我們在使用pandas
處理完數據之後,最終總是要把數據作為一個文件保存下來,
那麼,保存數據最常用的文件是什麼呢?
我想大部分人一定會選擇csv
或者excel
。
剛接觸數據分析時,我也是這麼選擇的,不過,今天將介紹幾種不一樣的存儲數據的文件格式。
這些文件格式各有自己的一些優點,希望本文能讓你以後的數據存儲方式能有不一樣的選擇,從而存儲的更加專業。
1. 準備數據
本次使用的數據來自A股2023年全年的日交易數據。
數據下載地址:https://databook.top/。
導入數據:
import pandas as pd
fp = "d:/share/歷史行情數據-不復權-2023.csv"
df = pd.read_csv(fp)
df
總共大約120多萬條數據。
準備好測試數據之後,開始測試各種文件的效果。
2. CSV
使用pandas
做數據分析時,保存數據最常用的格式一定是CSV
(或者excel
)。
因為CSV
格式易於分享,用excel
或者文本編輯器都能直接打開。
但是當數據集規模比較大時,它的磁碟利用率和讀寫效率究竟如何呢?
首先我們把準備的數據保存為一個測試用的test.csv
文件。
df = pd.read_csv(fp)
df.to_csv("d:/share/test.csv", index=None)
看看文件大小:
ls .\test.csv
目錄: D:\share
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2024/03/15 10:41:27 101411037 test.csv
test.csv
文件大約:\(101411037/1024/1024 \approx 96.7MB\)
讀取效率:
%%timeit
df = pd.read_csv("d:/share/test.csv")
1.73 s ± 54.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
寫入的效率:
%%timeit
df.to_csv("d:/share/test.csv", index=None)
13.2 s ± 402 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
3. Pickle
Pickle
格式是一種用於序列化和反序列化Python對象結構的二進位格式。
它的主要特點是能夠將程式中運行的對象信息保存到文件中。
下麵,我們先把準備的數據保存為一個測試用的test.pkl
文件。
# pickle file
df = pd.read_csv(fp)
df.to_pickle("d:/share/test.pkl")
文件大小:
ls .\test.pkl
目錄: D:\share
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2024/03/15 10:49:09 116904470 test.pkl
test.pkl
文件大約:\(116904470/1024/1024 \approx 111.5MB\)
讀取效率:
%%timeit
df = pd.read_pickle("d:/share/test.pkl")
136 ms ± 5.09 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
寫入效率:
%%timeit
df.to_pickle("d:/share/test.pkl")
182 ms ± 7.42 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
4. Parquet
Parquet
格式是一種列式存儲格式,被廣泛應用於大數據處理領域。
它採用了壓縮和編碼技術,能夠有效地存儲和壓縮數據,同時保持數據的結構和模式。
下麵,我們先把準備的數據保存為一個測試用的test.parquet
文件。
# parquet file
df = pd.read_csv(fp)
df.to_parquet("d:/share/test.parquet")
文件大小:
ls .\test.parquet
目錄: D:\share
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2024/03/15 10:52:08 32964728 test.parquet
test.parquet
文件大約:\(32964728/1024/1024 \approx 31.4MB\)
讀取效率:
%%timeit
df = pd.read_parquet("d:/share/test.parquet")
200 ms ± 8.54 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
寫入效率:
%%timeit
df.to_parquet("d:/share/test.parquet")
1.23 s ± 62.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
5. Feather
Feather
格式是一種高速、輕量且易於使用的二進位文件格式,專門用於存儲數據幀。
Feather的主要目標是提供高性能的讀寫操作。
下麵,我們先把準備的數據保存為一個測試用的test.feather
文件。
# feather file
df = pd.read_csv(fp)
df.to_feather("d:/share/test.feather")
文件大小:
ls .\test.feather
目錄: D:\share
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2024/03/15 11:17:15 57347098 test.feather
test.feather
文件大約:\(57347098/1024/1024 \approx 54.7MB\)
讀取效率:
%%timeit
df = pd.read_feather("d:/share/test.feather")
130 ms ± 5.29 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
寫入效率:
%%timeit
df.to_feather("d:/share/test.feather")
277 ms ± 14.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
6. 總結
pandas
能夠保存的文件格式有很多,比如還有XML
,JSON
,HTML
等等,
上面列出的4種是我認為比較典型,且在數據分析領域用的比較多的格式。
4種格式的比較總結如下:
磁碟占用 | 讀取效率 | 寫入效率 | |
---|---|---|---|
csv | 96.7 MB | 1.73 s ± 54.7 ms | 13.2 s ± 402 ms |
pickle | 111.5 MB | 136 ms ± 5.09 ms | 182 ms ± 7.42 ms |
parquet | 31.4 MB | 200 ms ± 8.54 ms | 1.23 s ± 62.4 ms |
feather | 54.7 MB | 130 ms ± 5.29 ms | 277 ms ± 14.8 ms |
綜合來看,當我們的數據量不大的時候,用CSV
格式比較好,分享方便,可以用多種編輯器直接打開查看。
當數據規模變大了之後,如果數據需要長期存儲,而且不需要經常的更新寫入,那麼用parquet
格式(它的磁碟占用最低,讀取性能好,寫入性能略遜);
如果只要短期存儲的話,用fetdher
格式更好(磁碟占用不算高,讀寫性能都不錯)。
至於pickle
格式,它的讀寫性能也不錯,但它的最大優勢是可以保存python
對象的狀態,只用來保存數據的話,這個優勢難以體現。
而且它的磁碟占用比較大,單純保存數據的話,不建議使用這種格式。