现在,每次运行脚本时,我都会导入一个相当大的CSV作为数据框架。是否有一个好的解决方案来保持数据帧在运行之间不断可用,这样我就不必花费所有的时间等待脚本运行?
当前回答
Arctic是一个高性能的Pandas, numpy和其他数值数据的数据存储。它位于MongoDB之上。也许对于OP来说有点过分了,但对于其他无意中看到这篇文章的人来说,值得一提
其他回答
https://docs.python.org/3/library/pickle.html
pickle协议格式如下:
协议版本0是原始的“人类可读”协议,并向后兼容Python的早期版本。
协议版本1是一种旧的二进制格式,它也与早期版本的Python兼容。
协议版本2是在Python 2.3中引入的。它提供了更有效的新样式类的pickle。有关协议2带来的改进,请参阅PEP 307。
协议版本3是在Python 3.0中添加的。它显式支持bytes对象,不能被Python 2.x解封。这是默认协议,也是在需要与其他Python 3版本兼容时的推荐协议。
协议版本4是在Python 3.4中添加的。它增加了对非常大的对象、pickle更多类型的对象以及一些数据格式优化的支持。有关协议4带来的改进的信息,请参阅PEP 3154。
Arctic是一个高性能的Pandas, numpy和其他数值数据的数据存储。它位于MongoDB之上。也许对于OP来说有点过分了,但对于其他无意中看到这篇文章的人来说,值得一提
虽然已经有一些答案,我找到了一个很好的比较,他们尝试了几种方法来序列化熊猫数据框架:有效地存储熊猫数据框架。
他们比较:
pickle:原始ASCII数据格式 cPickle,一个C库 Pickle-p2:使用更新的二进制格式 Json: standardlib Json库 json-no-index:类似json,但没有索引 msgpack:二进制JSON替代品 CSV hdfstore: HDF5存储格式
在他们的实验中,他们序列化了一个包含1,000,000行的DataFrame,并分别测试了两列:一列是文本数据,另一列是数字。他们的免责声明说:
您不应该相信以下内容适用于您的数据。您应该查看自己的数据并自己运行基准测试
他们提到的测试源代码可以在网上找到。由于这段代码不能直接工作,我做了一些小更改,您可以在这里看到:serialize.py 我得到了以下结果:
他们还提到,通过将文本数据转换为分类数据,序列化速度要快得多。在他们的测试中,大约是10倍的速度(另见测试代码)。
编辑:pickle的时间比CSV的时间长可以用所使用的数据格式来解释。默认情况下,pickle使用可打印的ASCII表示,这会生成更大的数据集。然而,从图中可以看出,使用更新的二进制数据格式(版本2,pickle-p2)的pickle加载时间要短得多。
其他参考资料:
在“最快的Python库来读取CSV文件”这个问题中,有一个非常详细的答案,它比较了不同的库来读取CSV文件的基准。结果是,对于读取csv文件,numpy.fromfile是最快的。 另一个序列化测试 显示msgpack, usjson和cPickle在序列化中是最快的。
Numpy文件格式对于数字数据来说非常快
我更喜欢使用numpy文件,因为它们快速且易于使用。 下面是一个简单的基准测试,用于保存和加载一个包含100万个点的1列数据框架。
import numpy as np
import pandas as pd
num_dict = {'voltage': np.random.rand(1000000)}
num_df = pd.DataFrame(num_dict)
使用ipython的%%timeit魔法函数
%%timeit
with open('num.npy', 'wb') as np_file:
np.save(np_file, num_df)
输出为
100 loops, best of 3: 5.97 ms per loop
将数据加载回数据框架
%%timeit
with open('num.npy', 'rb') as np_file:
data = np.load(np_file)
data_df = pd.DataFrame(data)
输出为
100 loops, best of 3: 5.12 ms per loop
不坏!
CONS
如果您使用python 2保存numpy文件,然后尝试使用python 3打开,则会出现问题(反之亦然)。
如前所述,有不同的选项和文件格式(HDF5, JSON, CSV, parquet, SQL)来存储数据帧。然而,pickle不是一级公民(取决于你的设置),因为:
泡菜是一个潜在的安全隐患。形成pickle的Python文档:
警告pickle模块不安全 恶意构造的数据。对象接收的数据永远不能解pickle 不受信任或未经身份验证的源。
泡菜很慢。找到这里和这里的基准。
根据您的设置/使用情况,这两个限制都不适用,但我不建议将pickle作为pandas数据帧的默认持久性。
推荐文章
- 如何从Python函数中返回两个值?
- 前一个月的Python日期
- Python中方括号括起来的列表和圆括号括起来的列表有什么区别?
- Python日志记录不输出任何东西
- 每n秒运行特定代码
- SQLAlchemy是否有与Django的get_or_create等价的函数?
- 如何将python datetime转换为字符串,具有可读格式的日期?
- 美丽的汤和提取div及其内容的ID
- 在Python中重置生成器对象
- 用Python构建最小的插件架构
- model.eval()在pytorch中做什么?
- Tensorflow 2.0:模块“Tensorflow”没有属性“Session”
- 从环境文件中读入环境变量
- 在OSX 10.11中安装Scrapy时,“OSError: [Errno 1]操作不允许”(El Capitan)(系统完整性保护)
- 如何删除熊猫数据帧的最后一行数据