1

pandas:如何保存数据比较好? - wang_yb

 1 month ago
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
image.png

总共大约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能够保存的文件格式有很多,比如还有XMLJSONHTML等等,
上面列出的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对象的状态,只用来保存数据的话,这个优势难以体现。
而且它的磁盘占用比较大,单纯保存数据的话,不建议使用这种格式。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK