使用dask hdf/parquet的Python大型数据集功能工程工作流

使用dask hdf/parquet的Python大型数据集功能工程工作流,python,pandas,dask,hdf,feature-engineering,Python,Pandas,Dask,Hdf,Feature Engineering,关于这一点,我已经提出了一个很好的问题,但最好的答案现在已经有5年了,所以我认为2018年应该会有更好的选择 我目前正在为大于内存的数据集(使用合适的数据类型)寻找功能工程管道 初始文件是不适合内存的csv。以下是我的需要: 创建要素(主要在多列上使用groupby操作。) 将新功能合并到以前的数据(在磁盘上,因为它不适合内存) 对某些ML应用程序使用子集(或所有)列/索引 重复1/2/3(这是一个迭代过程,类似于第1天:创建4 功能,第2天:再创建4个…) 尝试使用拼花地板和dask: 首先,

关于这一点,我已经提出了一个很好的问题,但最好的答案现在已经有5年了,所以我认为2018年应该会有更好的选择

我目前正在为大于内存的数据集(使用合适的数据类型)寻找功能工程管道

初始文件是不适合内存的csv。以下是我的需要:
  • 创建要素(主要在多列上使用groupby操作。)
  • 将新功能合并到以前的数据(在磁盘上,因为它不适合内存)
  • 对某些ML应用程序使用子集(或所有)列/索引
  • 重复1/2/3(这是一个迭代过程,类似于第1天:创建4 功能,第2天:再创建4个…)
  • 尝试使用拼花地板和dask: 首先,我将大csv文件拆分为多个小“拼花”文件。这样,dask对于新特性的计算非常有效,但是,我需要将它们合并到初始数据集和atm中,我们不能向拼花文件添加新列。按块读取csv、合并并重新保存到多个拼花地板文件太耗时,因为特征工程在此项目中是一个迭代过程

    尝试使用HDF和dask: 然后我转向HDF,因为我们可以添加列,也可以使用特殊查询,它仍然是一个二进制文件存储。我再次将大csv文件拆分为多个HDF,基本特性使用相同的key='base',以便使用DASK的并发写入(HDF不允许)

    附件问题:指定数据列对于dask似乎没有用处,因为dask中没有“where”。读取\u hdf?

    与我预期的不同,我无法使用以下代码将新功能合并到多个小文件中:

    data = dd.read_hdf('./hdf/data-*.hdf', key='base')
    data['day_pow2'] = data['day']**2
    data['day_pow2'].to_hdf('./hdf/data-*.hdf', key='added', get=dask.threaded.get) 
    
    使用dask.threaded,我在2%之后得到“python停止工作”。 使用dask.multiprocessing.get,需要花费很长时间才能创建新文件


    <> P>什么是这个工作流最适合的工具(存储和处理)?< /P> < P>我将认真考虑使用数据库(索引访问)作为存储,甚至使用Apache Spice(以分布式/集群方式处理数据)和HIV/IMPRA作为后端…p> 我将只复制一份来自fastparquet的评论:从技术上讲,可以向现有的拼花数据集添加列,但这并没有在fastparquet中实现,也可能没有在任何其他拼花实现中实现


    为此编写代码可能不会太繁重(但目前还没有计划):调用是按顺序进行的,因此要编写的新列需要向下渗透到此函数,以及与页脚中元数据的当前第一个字节对应的文件位置。此外,模式需要单独更新(这很简单)。对于数据集的每个文件,都需要重复该过程。这不是问题的“答案”,但可能是有人想承担这个任务。

    我会认真考虑使用数据库作为存储……我在本地设置中工作,没有集群访问。SQLite是否合适?我担心读/写错误time@FlorianMutel,我至少会尝试MySQL,它更适合不适合RAM的DB…postgresql似乎是开源解决方案中最常见的。但是,您正在添加列,即演进模式,这对于传统数据库来说是一项复杂的操作。
    data = dd.read_hdf('./hdf/data-*.hdf', key='base')
    data['day_pow2'] = data['day']**2
    data['day_pow2'].to_hdf('./hdf/data-*.hdf', key='added', get=dask.threaded.get)