在笔记本中,将大型csv文件上传以便使用Python Pandas的最快方法是什么?
在笔记本中,将大型csv文件上传以便使用Python Pandas的最快方法是什么?
我正在尝试上传一个大小为250MB的csv文件,基本上是4百万行和6列的时间序列数据(每分钟1个)。通常的过程是:
location = r'C:\Users\Name\Folder_1\Folder_2\file.csv' df = pd.read_csv(location)
这个过程需要大约20分钟!非常初步的,我探索了以下选项:
我想知道是否有人比较过这些选项(或更多),有一个明显的赢家。如果没有人回答,我将来会发布我的结果。我现在没有时间。
你可以使用datatable来加载csv文件,然后将其转换为pandas dataframe,它比使用pandas read_csv()函数加载要快得多。
import datatable as dt dt_df = dt.fread(csv_file) pd_df = dt_df.to_pandas()
在一个1 Go的csv文件上,pandas read_csv需要约34分钟的时间,而datatable fread只需要40秒,这是一个巨大的差距(快了51倍)。
你也可以直接使用datatable dataframe,而不需要转换为pandas dataframe(这取决于你想要的功能)。有关datatable的有用介绍:https://www.kaggle.com/sudalairajkumar/getting-started-with-python-datatable
这里是我进行 DF 读写比较的结果(形状:4000000 x 6,内存大小:183.1 MB,未压缩的 CSV 文件大小 - 492 MB)。
以下是存储格式的比较:(CSV
,CSV.gzip
,Pickle
,HDF5
[各种压缩]):
read_s write_s size_ratio_to_CSV storage CSV 17.900 69.00 1.000 CSV.gzip 18.900 186.00 0.047 Pickle 0.173 1.77 0.374 HDF_fixed 0.196 2.03 0.435 HDF_tab 0.230 2.60 0.437 HDF_tab_zlib_c5 0.845 5.44 0.035 HDF_tab_zlib_c9 0.860 5.95 0.035 HDF_tab_bzip2_c5 2.500 36.50 0.011 HDF_tab_bzip2_c9 2.500 36.50 0.011
读取
写入/保存
文件大小与未压缩 CSV 文件的比例
原始数据:
CSV:
In [68]: %timeit df.to_csv(fcsv) 1 loop, best of 3: 1min 9s per loop In [74]: %timeit pd.read_csv(fcsv) 1 loop, best of 3: 17.9 s per loop
CSV.gzip:
In [70]: %timeit df.to_csv(fcsv_gz, compression='gzip') 1 loop, best of 3: 3min 6s per loop In [75]: %timeit pd.read_csv(fcsv_gz) 1 loop, best of 3: 18.9 s per loop
Pickle:
In [66]: %timeit df.to_pickle(fpckl) 1 loop, best of 3: 1.77 s per loop In [72]: %timeit pd.read_pickle(fpckl) 10 loops, best of 3: 173 ms per loop
HDF (format='fixed'
) [默认]:
In [67]: %timeit df.to_hdf(fh5, 'df') 1 loop, best of 3: 2.03 s per loop In [73]: %timeit pd.read_hdf(fh5, 'df') 10 loops, best of 3: 196 ms per loop
HDF (format='table'
):
In [37]: %timeit df.to_hdf('D:\\temp\\.data\\37010212_tab.h5', 'df', format='t') 1 loop, best of 3: 2.6 s per loop In [38]: %timeit pd.read_hdf('D:\\temp\\.data\\37010212_tab.h5', 'df') 1 loop, best of 3: 230 ms per loop
HDF (format='table', complib='zlib', complevel=5
):
In [40]: %timeit df.to_hdf('D:\\temp\\.data\\37010212_tab_compress_zlib5.h5', 'df', format='t', complevel=5, complib='zlib') 1 loop, best of 3: 5.44 s per loop In [41]: %timeit pd.read_hdf('D:\\temp\\.data\\37010212_tab_compress_zlib5.h5', 'df') 1 loop, best of 3: 854 ms per loop
HDF (format='table', complib='zlib', complevel=9
):
In [36]: %timeit df.to_hdf('D:\\temp\\.data\\37010212_tab_compress_zlib9.h5', 'df', format='t', complevel=9, complib='zlib') 1 loop, best of 3: 5.95 s per loop In [39]: %timeit pd.read_hdf('D:\\temp\\.data\\37010212_tab_compress_zlib9.h5', 'df') 1 loop, best of 3: 860 ms per loop
HDF (format='table', complib='bzip2', complevel=5
):
In [42]: %timeit df.to_hdf('D:\\temp\\.data\\37010212_tab_compress_bzip2_l5.h5', 'df', format='t', complevel=5, complib='bzip2') 1 loop, best of 3: 36.5 s per loop In [43]: %timeit pd.read_hdf('D:\\temp\\.data\\37010212_tab_compress_bzip2_l5.h5', 'df') 1 loop, best of 3: 2.5 s per loop
HDF (format='table', complib='bzip2', complevel=9
):
In [42]: %timeit df.to_hdf('D:\\temp\\.data\\37010212_tab_compress_bzip2_l9.h5', 'df', format='t', complevel=9, complib='bzip2') 1 loop, best of 3: 36.5 s per loop In [43]: %timeit pd.read_hdf('D:\\temp\\.data\\37010212_tab_compress_bzip2_l9.h5', 'df') 1 loop, best of 3: 2.5 s per loop
PS:我无法在 Windows 笔记本上测试 feather
DF 信息:
In [49]: df.shape Out[49]: (4000000, 6) In [50]: df.info()RangeIndex: 4000000 entries, 0 to 3999999 Data columns (total 6 columns): a datetime64[ns] b datetime64[ns] c datetime64[ns] d datetime64[ns] e datetime64[ns] f datetime64[ns] dtypes: datetime64[ns](6) memory usage: 183.1 MB In [41]: df.head() Out[41]: a b c \ 0 1970-01-01 00:00:00 1970-01-01 00:01:00 1970-01-01 00:02:00 1 1970-01-01 00:01:00 1970-01-01 00:02:00 1970-01-01 00:03:00 2 1970-01-01 00:02:00 1970-01-01 00:03:00 1970-01-01 00:04:00 3 1970-01-01 00:03:00 1970-01-01 00:04:00 1970-01-01 00:05:00 4 1970-01-01 00:04:00 1970-01-01 00:05:00 1970-01-01 00:06:00 d e f 0 1970-01-01 00:03:00 1970-01-01 00:04:00 1970-01-01 00:05:00 1 1970-01-01 00:04:00 1970-01-01 00:05:00 1970-01-01 00:06:00 2 1970-01-01 00:05:00 1970-01-01 00:06:00 1970-01-01 00:07:00 3 1970-01-01 00:06:00 1970-01-01 00:07:00 1970-01-01 00:08:00 4 1970-01-01 00:07:00 1970-01-01 00:08:00 1970-01-01 00:09:00
文件大小:
{ .data } » ls -lh 37010212.* /d/temp/.data -rw-r--r-- 1 Max None 492M May 3 22:21 37010212.csv -rw-r--r-- 1 Max None 23M May 3 22:19 37010212.csv.gz -rw-r--r-- 1 Max None 214M May 3 22:02 37010212.h5 -rw-r--r-- 1 Max None 184M May 3 22:02 37010212.pickle -rw-r--r-- 1 Max None 215M May 4 10:39 37010212_tab.h5 -rw-r--r-- 1 Max None 5.4M May 4 10:46 37010212_tab_compress_bzip2_l5.h5 -rw-r--r-- 1 Max None 5.4M May 4 10:51 37010212_tab_compress_bzip2_l9.h5 -rw-r--r-- 1 Max None 17M May 4 10:42 37010212_tab_compress_zlib5.h5 -rw-r--r-- 1 Max None 17M May 4 10:36 37010212_tab_compress_zlib9.h5
结论:
Pickle
和HDF5
都更快,但HDF5
更加方便——你可以在内部存储多个表/框架,在读取数据时可以进行条件处理(查看read_hdf()中的where
参数),你还可以使用压缩存储你的数据(zlib
更快,bzip2
提供更好的压缩比率),等等。
注意: 如果你能够构建/使用feather-format
的话——相比于HDF5
和Pickle
,它应该更快。
附言: 不要将Pickle用于大的数据框,否则你可能会遇到SystemError: error return without exception set错误消息。这也在这里和这里有描述。