使用pickle而不是excel来存储pandas数据帧而不是IO还有其他原因吗



我正在创建一个熊猫数据集的小数据集。我认为这比试图将其改进为SQLite要好。

我正在选择数据集的格式。对于我的初始加载,与使用Excel相比,它将文件大小减少了45%。但因为它很小,所以只有585KB的45%。当comapred为CSV时,它只是稍微小一点。

我认为Excel使我对数据有一定的灵活性,我愿意付出IO的代价。我是不是错过了泡菜的一些优势?

我刚刚重新运行了性能测试。msgpackfeatherparquet已经改变接口或被移除从而不再工作。

我的用例更多地是关于在Redis缓存中使用哪种串行化格式来缓存数据帧。没有明确的赢家

  1. 使用pickle是有效的,但您会收到panda的弃用警告,并且确实保持了向后兼容性。这是一种仅python的串行化格式
  2. 使用pyarrow提供了更多的可移植性,可以在python、java、…中使用。。。。但是,它不能在ARROW-7961版本之间保持向后兼容性
  3. 是否再次压缩是基于空间/时间权衡的决定

我继续使用pyarrow,并对此感到满意。但是,如果发现暂时的向后兼容性问题,我的代码将自动切换到pickle

import sys, pickle, zlib, warnings, io
import pyarrow as pa
t = list(pd.date_range(dt.datetime(2020,1,1), dt.datetime(2020,1,3), freq='min'))
uh = [random.randint(0,50) for e in t]
out = pd.DataFrame({"timestamp":t, "user_holding":uh})
class foocls:
def pyarrow(out): return pa.serialize(out).to_buffer().to_pybytes()
#     def msgpack(out): return out.to_msgpack()
def pickle(out): return pickle.dumps(out)
#     def feather(out): return out.to_feather(path=io.BytesIO())
#     def parquet(out): return out.to_parquet(io.BytesIO())
warnings.filterwarnings("ignore")
for c in foocls.__dict__.values():
sbreak = True
try:
c(out)
print(c.__name__, "before serialization", sys.getsizeof(out))
print(c.__name__, sys.getsizeof(c(out)))
%timeit -n 50 c(out)
print(c.__name__, "zlib", sys.getsizeof(zlib.compress(c(out))))
%timeit -n 50 zlib.compress(c(out))
except TypeError as e:
if "not callable" in str(e): sbreak = False
else: raise
except (ValueError) as e: print(c.__name__, "ERROR", e)
finally: 
if sbreak: print("=+=" * 30)        
warnings.filterwarnings("default")

输出

pyarrow before serialization 46256
pyarrow 51901
630 µs ± 59.9 µs per loop (mean ± std. dev. of 7 runs, 50 loops each)
pyarrow zlib 20041
2.72 ms ± 53.2 µs per loop (mean ± std. dev. of 7 runs, 50 loops each)
=+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+=
pickle before serialization 46256
pickle 47166
96.7 µs ± 5.02 µs per loop (mean ± std. dev. of 7 runs, 50 loops each)
pickle zlib 19276
1.95 ms ± 25.3 µs per loop (mean ± std. dev. of 7 runs, 50 loops each)
=+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+==+=

最新更新