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

我们在使用pandas处理完数据之后,最终总是要把数据作为一个文件保存下来,

那么,保存数据最常用的文件是什么呢?

我想大部分人一定会选择csv或者excel

刚接触数据分析时,我也是这么选择的,不过,今天将介绍几种不一样的存储数据的文件格式。

这些文件格式各有自己的一些优点,希望本文能让你以后的数据存储方式能有不一样的选择,从而存储的更加专业。

1. 准备数据

本次使用的数据来自A股2023年全年的日交易数据。

数据下载地址:databook.top/。

导入数据:

python 复制代码
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文件。

python 复制代码
df = pd.read_csv(fp)
df.to_csv("d:/share/test.csv", index=None)

看看文件大小:

powershell 复制代码
ls .\test.csv


    目录: D:\share


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2024/03/15  10:41:27      101411037 test.csv

test.csv文件大约: <math xmlns="http://www.w3.org/1998/Math/MathML"> 101411037 / 1024 / 1024 ≈ 96.7 M B 101411037/1024/1024 \approx 96.7MB </math>101411037/1024/1024≈96.7MB

读取效率:

python 复制代码
%%timeit
df = pd.read_csv("d:/share/test.csv")
vbnet 复制代码
1.73 s ± 54.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

写入的效率:

python 复制代码
%%timeit
df.to_csv("d:/share/test.csv", index=None)
vbnet 复制代码
13.2 s ± 402 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

3. Pickle

Pickle格式是一种用于序列化和反序列化Python对象结构二进制格式

它的主要特点是能够将程序中运行的对象信息保存到文件中。

下面,我们先把准备的数据保存为一个测试用的test.pkl文件。

python 复制代码
# pickle file
df = pd.read_csv(fp)
df.to_pickle("d:/share/test.pkl")

文件大小:

powershell 复制代码
ls .\test.pkl


    目录: D:\share


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2024/03/15  10:49:09      116904470 test.pkl

test.pkl文件大约: <math xmlns="http://www.w3.org/1998/Math/MathML"> 116904470 / 1024 / 1024 ≈ 111.5 M B 116904470/1024/1024 \approx 111.5MB </math>116904470/1024/1024≈111.5MB

读取效率:

python 复制代码
%%timeit
df = pd.read_pickle("d:/share/test.pkl")
sql 复制代码
136 ms ± 5.09 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

写入效率:

python 复制代码
%%timeit
df.to_pickle("d:/share/test.pkl")
vbnet 复制代码
182 ms ± 7.42 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

4. Parquet

Parquet格式是一种列式存储格式,被广泛应用于大数据处理领域。

它采用了压缩和编码技术,能够有效地存储和压缩数据,同时保持数据的结构和模式。

下面,我们先把准备的数据保存为一个测试用的test.parquet文件。

python 复制代码
# parquet file
df = pd.read_csv(fp)
df.to_parquet("d:/share/test.parquet")

文件大小:

powershell 复制代码
ls .\test.parquet


    目录: D:\share


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2024/03/15  10:52:08       32964728 test.parquet

test.parquet文件大约: <math xmlns="http://www.w3.org/1998/Math/MathML"> 32964728 / 1024 / 1024 ≈ 31.4 M B 32964728/1024/1024 \approx 31.4MB </math>32964728/1024/1024≈31.4MB

读取效率:

python 复制代码
%%timeit
df = pd.read_parquet("d:/share/test.parquet")
vbnet 复制代码
200 ms ± 8.54 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

写入效率:

python 复制代码
%%timeit
df.to_parquet("d:/share/test.parquet")
vbnet 复制代码
1.23 s ± 62.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

5. Feather

Feather格式是一种高速、轻量且易于使用的二进制文件格式,专门用于存储数据帧。

Feather的主要目标是提供高性能的读写操作。

下面,我们先把准备的数据保存为一个测试用的test.feather文件。

python 复制代码
# feather file
df = pd.read_csv(fp)
df.to_feather("d:/share/test.feather")

文件大小:

powershell 复制代码
ls .\test.feather


    目录: D:\share


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2024/03/15  11:17:15       57347098 test.feather

test.feather文件大约: <math xmlns="http://www.w3.org/1998/Math/MathML"> 57347098 / 1024 / 1024 ≈ 54.7 M B 57347098/1024/1024 \approx 54.7MB </math>57347098/1024/1024≈54.7MB

读取效率:

python 复制代码
%%timeit
df = pd.read_feather("d:/share/test.feather")
sql 复制代码
130 ms ± 5.29 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

写入效率:

python 复制代码
%%timeit
df.to_feather("d:/share/test.feather")
vbnet 复制代码
277 ms ± 14.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

6. 总结

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对象的状态,只用来保存数据的话,这个优势难以体现。

而且它的磁盘占用比较大,单纯保存数据的话,不建议使用这种格式。

相关推荐
yanglamei19622 分钟前
基于Python+Django+Vue的旅游景区推荐系统系统设计与实现源代码+数据库+使用说明
vue.js·python·django
虚假程序设计4 分钟前
python用 PythonNet 从 Python 调用 WPF 类库 UI 用XAML
python·ui·wpf
胡桃不是夹子42 分钟前
CPU安装pytorch(别点进来)
人工智能·pytorch·python
是一只努力的小菜鸡啦1 小时前
数据分析和数据挖掘的工作内容
信息可视化·数据挖掘·数据分析
不会玩技术的技术girl2 小时前
使用Python和正则表达式爬取网页中的URL数据
开发语言·python·正则表达式
阿_旭2 小时前
基于YOLO11深度学习的糖尿病视网膜病变检测与诊断系统【python源码+Pyqt5界面+数据集+训练代码】
人工智能·python·深度学习·视网膜病变检测
胖哥真不错3 小时前
Python实现GO鹅优化算法优化随机森林分类模型项目实战
python·机器学习·项目实战·go鹅优化算法·随机森林分类模型
小白今天也很酷3 小时前
Python与MCU通信:串口数据采集及CSV/Excel存储方法
python·单片机·excel
Sharewinfo_BJ4 小时前
智信BI:解决Power BI全面兼容问题的新选择
数据分析·数据可视化·powerbi
奔跑吧邓邓子4 小时前
【Python爬虫(27)】探索数据可视化的魔法世界
开发语言·爬虫·python·数据可视化