如何使用熊猫加快加载数据?

时间:2019-11-22 11:40:58

标签: python pandas

我正在使用熊猫和木星笔记本。我正在读取700MB的CSV文件,加载需要69秒。出于测试目的,这是可以接受的,因为我只需要加载一次,并且在笔记本实例的整个过程中它会保留在内存中。

pd.read_csv(path, names=['Date','Time','Seconds','Counts','Pressure'], dtype='unicode')

我试图使用与python可执行文件相同的代码,这使得测试真的很困难,因为每次对程序进行更改时,我都需要等待69秒才能加载数据。我该如何加快读取CSV文件的速度?

5 个答案:

答案 0 :(得分:4)

您可以为此目的使用dask module

import dask.dataframe
data = dask.dataframe.read_csv("your.csv")

Dask比普通的熊猫read_csv快得多,因为它利用了并行处理并且不会将整个数据加载到内存中。该article from Eric Brown是对其潜在用途的很好入门。

答案 1 :(得分:2)

您可以使用

使用镶木地板格式
df.to_parquet('file.parquet')
pd.read_parquet('file.parquet')

您将需要安装fastparquetpyarrow软件包。

请注意,并不是所有的Python类型都可以理解,因此您需要数据具有标准类型,例如numpy dtypes。

答案 2 :(得分:1)

我在这里看到了多种选择:

  • 如果测试足以使用全部数据的一部分,则可以在nrows中指定pd.read_csv参数。
  • 通过dtype参数为要解析的所有列和/或要解析的日期指定parse_dates参数。
  • 一次将csv文件转换为parquetfeather格式,将来这些格式将更快地加载-它们都需要pyarrow安装,如前所述。
  • 我个人从未使用过Dask模块,因此我不能说。

答案 3 :(得分:1)

在此处放置另一种可能的解决方案,不需要其他软件包。

基本上,只有您第一次真正解析整个CSV;然后将解析数据的压缩副本保存在磁盘上。从第二次开始,您仅加载缓存。

这可能会节省时间,因为解压缩会占用大量CPU,但是磁盘上的压缩文件会更小。

类似的东西:

import tempfile
from pathlib import Path

import numpy as np


def lazy_read(path, force_reload=False):
    cache = Path(tempfile.gettempdir()) / 'mycache.npz'
    if cache.is_file() and not force_reload:
        print('Loading from cache...', end=' ')
        data = np.load(cache)['data']
    else:
        print('Reading file...', end=' ')
        data = pd.read_csv(path, names=['Date','Time','Seconds','Counts','Pressure'], dtype='unicode')
        np.savez_compressed(cache, data=data)
    print('Done.')
    return data


if __name__ == '__main__':
    lazy_read(path)

答案 4 :(得分:0)

您可以使用模块Modin
它是一个可以与dask和ray一起使用的库,它的功能与熊猫相同。您可以轻松地从Modin数据框转到pandas数据框并使用pandas函数。
该模块仍在积极开发中