pandas:如何保存数据比较好? - wang_yb
source link: https://www.cnblogs.com/wang_yb/p/18075201
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
我们在使用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≈96.7MB101411037/1024/1024≈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≈111.5MB116904470/1024/1024≈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≈31.4MB32964728/1024/1024≈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≈54.7MB57347098/1024/1024≈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)
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
对象的状态,只用来保存数据的话,这个优势难以体现。
而且它的磁盘占用比较大,单纯保存数据的话,不建议使用这种格式。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK