【发布时间】:2021-07-02 09:11:45
【问题描述】:
在学习 pandas 的过程中,我已经尝试了数月来想出这个问题的答案。我在日常工作中使用 SAS,它的核心支持非常棒。然而,由于许多其他原因,SAS 作为一种软件很糟糕。
有一天我希望用 python 和 pandas 取代我对 SAS 的使用,但我目前缺乏大型数据集的核心工作流。我不是在谈论需要分布式网络的“大数据”,而是说文件太大而无法放入内存但又小到无法放入硬盘。
我的第一个想法是使用HDFStore 将大型数据集保存在磁盘上,并仅将我需要的部分拉入数据帧进行分析。其他人提到 MongoDB 是一种更易于使用的替代方案。我的问题是这样的:
完成以下工作的最佳实践工作流程有哪些:
- 将平面文件加载到永久的磁盘数据库结构中
- 查询该数据库以检索数据以输入 Pandas 数据结构
- 在 Pandas 中操作片段后更新数据库
非常感谢现实世界的例子,尤其是那些在“大数据”上使用 pandas 的人。
编辑——我希望它如何工作的一个例子:
- 反复导入大型平面文件并将其存储在永久的磁盘数据库结构中。这些文件通常太大而无法放入内存。
- 为了使用 Pandas,我想读取这些数据的子集(通常一次只有几列),这些数据可以放入内存中。
- 我将通过对选定列执行各种操作来创建新列。
- 然后我必须将这些新列附加到数据库结构中。
我正在尝试找到执行这些步骤的最佳实践方法。阅读有关 pandas 和 pytables 的链接似乎附加一个新列可能是个问题。
编辑——具体回答 Jeff 的问题:
- 我正在构建消费者信用风险模型。数据种类包括电话、SSN、地址特征;财产价值;犯罪记录、破产等贬损信息……我每天使用的数据集平均有近 1,000 到 2,000 个混合数据类型的字段:数字和字符数据的连续、名义和有序变量。我很少追加行,但我确实执行了许多创建新列的操作。
- 典型的操作包括使用条件逻辑将多个列组合成一个新的复合列。例如,
if var1 > 2 then newvar = 'A' elif var2 = 4 then newvar = 'B'。这些操作的结果是我的数据集中的每条记录都有一个新列。 - 最后,我想将这些新列附加到磁盘数据结构中。我会重复第 2 步,使用交叉表和描述性统计数据探索数据,试图找到有趣、直观的建模关系。
- 一个典型的项目文件通常约为 1GB。文件被组织成这样一种方式,其中一行包含消费者数据的记录。对于每条记录,每一行都有相同数量的列。情况永远如此。
- 在创建新列时我很少会按行进行子集化。但是,在创建报告或生成描述性统计数据时,对我来说,对行进行子集化是很常见的。例如,我可能想为特定业务线创建一个简单的频率,例如零售信用卡。为此,除了我想要报告的任何列之外,我只会选择那些业务范围 = 零售的记录。但是,在创建新列时,我会提取所有数据行,并且只提取操作所需的列。
- 建模过程要求我分析每一列,寻找与某些结果变量的有趣关系,并创建描述这些关系的新复合列。我探索的专栏通常是在小范围内完成的。例如,我将专注于一组 20 列仅处理财产价值的列,并观察它们与贷款违约的关系。一旦探索了这些并创建了新的专栏,我就会转到另一组专栏,比如大学教育,然后重复这个过程。我正在做的是创建候选变量来解释我的数据与某些结果之间的关系。在这个过程的最后,我应用了一些学习技术,从这些复合列中创建一个方程。
我很少会向数据集添加行。我几乎总是会创建新列(统计/机器学习用语中的变量或特征)。
【问题讨论】:
-
核心尺寸/全尺寸的比率是 1 %、10 % 吗?有没有关系——如果你可以将 cols 压缩到 int8,或者过滤掉嘈杂的行,那会改变你的计算思考循环从几小时到几分钟吗? (同时添加标签大数据。)
-
在可能的情况下存储 float32 而不是 float64 和 int8,应该是微不足道的(虽然不知道 float64 内部有哪些工具/函数)
-
你能把你的任务分成几块工作吗?
-
一个不错的 2019 年解决方案,用于对不适合内存的“中等”数据进行类似 pandas 的操作是 dask
-
有python+pandas的替代品,你可能想在刚开始的时候考虑看看。考虑一下 Python 是一种通用编程语言(不是用于数据处理和分析的 DSL)并且 pandas 是一个基于此的库的事实。我会考虑看 R 或 kdb。
标签: python mongodb pandas hdf5 large-data