Dar*_*aut 50 python pandas parquet feather pyarrow
两者都是用于数据分析系统的柱状(磁盘)存储格式.两者都集成在Apache Arrow(用于python的pyarrow包)中,旨在与Arrow对应作为柱状内存分析层.
两种格式有何不同?
在可能的情况下,你是否总是喜欢使用羽毛?
附录
我在这里找到了一些提示https://github.com/wesm/feather/issues/188,但考虑到这个项目的年龄,它可能有点过时了.
不是一个严肃的速度测试,因为我只是倾倒并加载一个完整的Dataframe,但如果您之前从未听说过这些格式,那么会给您一些印象:
# IPython
import numpy as np
import pandas as pd
import pyarrow as pa
import pyarrow.feather as feather
import pyarrow.parquet as pq
import fastparquet as fp
df = pd.DataFrame({'one': [-1, np.nan, 2.5],
'two': ['foo', 'bar', 'baz'],
'three': [True, False, True]})
print("pandas df to disk ####################################################")
print('example_feather:')
%timeit feather.write_feather(df, 'example_feather')
# 2.62 ms ± 35.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
print('example_parquet:')
%timeit pq.write_table(pa.Table.from_pandas(df), 'example.parquet')
# 3.19 ms ± 51 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
print()
print("for comparison:")
print('example_pickle:')
%timeit df.to_pickle('example_pickle')
# 2.75 ms ± 18.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
print('example_fp_parquet:')
%timeit fp.write('example_fp_parquet', df)
# 7.06 ms ± 205 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
print('example_hdf:')
%timeit df.to_hdf('example_hdf', 'key_to_store', mode='w', table=True)
# 24.6 ms ± 4.45 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
print()
print("pandas df from disk ##################################################")
print('example_feather:')
%timeit feather.read_feather('example_feather')
# 969 µs ± 1.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
print('example_parquet:')
%timeit pq.read_table('example.parquet').to_pandas()
# 1.9 ms ± 5.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
print("for comparison:")
print('example_pickle:')
%timeit pd.read_pickle('example_pickle')
# 1.07 ms ± 6.21 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
print('example_fp_parquet:')
%timeit fp.ParquetFile('example_fp_parquet').to_pandas()
# 4.53 ms ± 260 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
print('example_hdf:')
%timeit pd.read_hdf('example_hdf')
# 10 ms ± 43.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
# pandas version: 0.22.0
# fastparquet version: 0.1.3
# numpy version: 1.13.3
# pandas version: 0.22.0
# pyarrow version: 0.8.0
# sys.version: 3.6.3
# example Dataframe taken from https://arrow.apache.org/docs/python/parquet.html
Run Code Online (Sandbox Code Playgroud)
Wes*_*ney 73
Parquet格式专为长期存储而设计,其中Arrow更适合短期或临时存储(在1.0.0版本发布后,Arrow可能更适合长期存储,因为二进制格式将稳定)
Parquet比Feather更昂贵,因为它具有更多的编码和压缩层.羽毛是未经修改的原始柱状箭头记忆.我们可能会在将来为Feather添加简单的压缩.
由于字典编码,RLE编码和数据页面压缩,Parquet文件通常比Feather文件小得多
Parquet是分析的标准存储格式,由许多不同的系统支持:Spark,Hive,Impala,各种AWS服务,以及BigQuery未来等等.因此,如果您正在进行分析,Parquet是一个很好的选择作为参考存储格式多个系统查询
您展示的基准测试将会非常嘈杂,因为您读取和写入的数据非常小.您应该尝试压缩至少100MB或更高的1GB数据以获得更多信息性基准,例如http://wesmckinney.com/blog/python-parquet-multithreading/
希望这可以帮助
Art*_*tra 18
我还将在镶木地板和羽毛之间的比较中包括不同的压缩方法,以检查导入/导出速度及其使用的存储量。
\n我建议为想要更好的 csv 替代方案的普通用户提供两种选择:
\n两者都是比所有类别(I/O 速度和存储)中的普通 csv 文件更好的选择。
\n我分析了以下格式:
\nimport zipfile\nimport pandas as pd\nfolder_path = (r"...\\\\intraday")\nzip_path = zipfile.ZipFile(folder_path + "\\\\AAPL.zip") \ntest_data = pd.read_csv(zip_path.open('AAPL.csv'))\n\n\n# EXPORT, STORAGE AND IMPORT TESTS\n# ------------------------------------------\n# - FORMAT .csv \n\n# export\n%%timeit\ntest_data.to_csv(folder_path + "\\\\AAPL.csv", index=False)\n# 12.8 s \xc2\xb1 399 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n\n# storage\n# AAPL.csv exported using python.\n# 169.034 KB\n\n# import\n%%timeit\ntest_data = pd.read_csv(folder_path + "\\\\AAPL.csv")\n# 1.56 s \xc2\xb1 14.1 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n\n# ------------------------------------------\n# - FORMAT zipped .csv \n\n# export\n%%timeit\ntest_data.to_csv(folder_path + "\\\\AAPL.csv")\n# 12.8 s \xc2\xb1 399 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n# OBSERVATION: this does not include the time I spent manually zipping the .csv\n\n# storage\n# AAPL.csv zipped with .zip "normal" compression using 7-zip software.\n# 36.782 KB\n\n# import\nzip_path = zipfile.ZipFile(folder_path + "\\AAPL.zip")\n%%timeit\ntest_data = pd.read_csv(zip_path.open('AAPL.csv'))\n# 2.31 s \xc2\xb1 43.9 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n\n# ------------------------------------------\n# - FORMAT .feather using "zstd" compression.\n\n# export\n%%timeit\ntest_data.to_feather(folder_path + "\\\\AAPL.feather", compression='zstd')\n# 460 ms \xc2\xb1 13.3 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n\n# storage\n# AAPL.feather exported with python using zstd\n# 54.924 KB\n\n# import\n%%timeit\ntest_data = pd.read_feather(folder_path + "\\\\AAPL.feather")\n# 310 ms \xc2\xb1 11.4 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n\n# ------------------------------------------\n# - FORMAT .feather using "lz4" compression.\n# Only works installing with pip, not with conda. Bad sign.\n\n# export\n%%timeit\ntest_data.to_feather(folder_path + "\\\\AAPL.feather", compression='lz4')\n# 392 ms \xc2\xb1 14.6 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n\n# storage\n# AAPL.feather exported with python using "lz4"\n# 79.668 KB \n\n# import\n%%timeit\ntest_data = pd.read_feather(folder_path + "\\\\AAPL.feather")\n# 255 ms \xc2\xb1 4.79 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n\n# ------------------------------------------\n# - FORMAT .parquet using compression "snappy"\n\n# export\n%%timeit\ntest_data.to_parquet(folder_path + "\\\\AAPL.parquet", compression='snappy')\n# 2.82 s \xc2\xb1 47.9 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n\n# storage\n# AAPL.parquet exported with python using "snappy"\n# 62.383 KB\n\n# import\n%%timeit\ntest_data = pd.read_parquet(folder_path + "\\\\AAPL.parquet")\n# 701 ms \xc2\xb1 19.8 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n\n# ------------------------------------------\n# - FORMAT .parquet using compression "gzip"\n\n# export\n%%timeit\ntest_data.to_parquet(folder_path + "\\\\AAPL.parquet", compression='gzip')\n# 10.8 s \xc2\xb1 77.6 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n\n# storage\n# AAPL.parquet exported with python using "gzip"\n# 37.595 KB\n\n# import\n%%timeit\ntest_data = pd.read_parquet(folder_path + "\\\\AAPL.parquet")\n# 1.18 s \xc2\xb1 80.9 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n\n# ------------------------------------------\n# - FORMAT .parquet using compression "brotli"\n\n# export\n%%timeit\ntest_data.to_parquet(folder_path + "\\\\AAPL.parquet", compression='brotli')\n# around 5min each loop. I did not run %%timeit on this one.\n\n# storage\n# AAPL.parquet exported with python using "brotli"\n# 29.425 KB \n\n# import\n%%timeit\ntest_data = pd.read_parquet(folder_path + "\\\\AAPL.parquet")\n# 1.04 s \xc2\xb1 72 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\nRun Code Online (Sandbox Code Playgroud)\n观察结果:
\nconda“zstd”压缩方法安装依赖项。| 归档时间: |
|
| 查看次数: |
14083 次 |
| 最近记录: |