首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用熊猫的“大数据”工作流

使用熊猫的“大数据”工作流
EN

Stack Overflow用户
提问于 2013-01-10 16:20:32
回答 15查看 345.5K关注 0票数 1.2K

几个月来,我一直在努力想出这个问题的答案,同时学习熊猫。我的日常工作使用SAS,这是很好的,因为它的核心支持。然而,SAS作为一个软件是可怕的,因为许多其他原因。

有一天,我希望用蟒蛇和熊猫来代替我对SAS的使用,但我目前缺乏一个大型数据集的核心工作流程。我说的不是需要分布式网络的“大数据”,而是文件太大,无法容纳内存,但足够小到适合于硬盘驱动器。

我的第一个想法是使用HDFStore在磁盘上保存大型数据集,并只将所需的数据块拉到数据文件中进行分析。其他人提到MongoDB是一种更容易使用的替代方案。我的问题是:

完成以下工作的最佳实践工作流是什么?

  1. 将平面文件加载到永久的磁盘上数据库结构中
  2. 查询该数据库以检索数据以输入熊猫数据结构
  3. 在处理熊猫的碎片后更新数据库

现实世界的例子将是非常感谢的,特别是谁使用大熊猫的“大数据”。

编辑--一个我希望它如何工作的例子:

  1. 迭代地导入一个大型平面文件并将其存储在永久的磁盘上数据库结构中。这些文件通常太大,无法在内存中使用。
  2. 为了使用Pandas,我想读取这些数据的子集(通常一次只有几列),这些数据可以放在内存中。
  3. 我将通过对所选列执行各种操作来创建新列。
  4. 然后,我将不得不将这些新列附加到数据库结构中。

我正在努力寻找一种最佳实践的方法来执行这些步骤。阅读有关熊猫和比目表的链接,似乎增加一个新的专栏可能是一个问题。

编辑--专门回答杰夫的问题:

  1. 我正在建立消费者信用风险模型。数据类型包括电话、SSN和地址特征、财产价值、犯罪记录、破产等贬损信息等。我每天使用的数据集平均有1,000到2,000个混合数据类型的字段:数字和字符数据的连续变量、名义变量和序数变量。我很少追加行,但我确实执行了许多创建新列的操作。
  2. 典型的操作包括使用条件逻辑将几个列组合成一个新的复合列。例如,if var1 > 2 then newvar = 'A' elif var2 = 4 then newvar = 'B'。这些操作的结果是为数据集中的每条记录创建一个新列。
  3. 最后,我想将这些新列添加到磁盘上的数据结构中.我会重复第2步,使用交叉数据和描述性统计来探索数据,试图找到与模型的有趣、直观的关系。
  4. 一个典型的项目文件通常大约是1GB。文件被组织成这样一种方式:一行由使用者数据的记录组成。每一行对于每条记录都有相同的列数。永远都是这样。
  5. 在创建新列时,我很少会逐行子集。但是,在创建报表或生成描述性统计信息时,我通常会在行上进行子集。例如,我可能想为一个特定的业务创造一个简单的频率,比如说零售信用卡。要做到这一点,除了我想报告的任何列之外,我只选择那些业务=零售的记录。但是,在创建新列时,我将提取所有数据行,并且只提取操作所需的列。
  6. 建模过程要求我分析每一列,使用某些结果变量寻找有趣的关系,并创建描述这些关系的新的复合列。我探索的列通常是在小集合中完成的。例如,我将集中讨论一组例如20列,只处理属性值,并观察它们与贷款违约的关系。一旦对这些内容进行了探索,并创建了新的列,然后我将转到另一组专栏,比如大学教育,并重复这个过程。我正在做的是创建候选变量来解释我的数据和某些结果之间的关系。在这个过程的最后,我应用了一些学习技巧,用这些复合列创建了一个等式。

我很少会将行添加到数据集中。我几乎总是创建新的列(统计/机器学习术语中的变量或特性)。

EN

回答 15

Stack Overflow用户

回答已采纳

发布于 2013-01-10 22:57:22

我经常以这种方式使用数十in的数据,例如,我在磁盘上有通过查询读取的表、创建数据和追加数据。

关于如何存储数据的几个建议,值得阅读医生们在这个线程的后期

将影响数据存储方式的详细信息,如:

尽可能多地详细说明,我可以帮助你发展一个结构。

  1. 数据的大小、行的#、列、列类型;您是附加行还是只是列?
  2. 典型的操作会是什么样子。例如,对列执行查询,以选择一组行和特定列,然后执行操作(内存中),创建新列,保存这些列。 (举个玩具例子可以让我们提出更具体的建议。)
  3. 经过处理之后,你会做什么?第二步是临时的,还是可重复的?
  4. 输入平面文件:多少,粗略的总大小( Gb )。这些记录是如何组织的?每个字段包含不同的字段,还是每个文件中的所有字段都有一些记录?
  5. 您是否根据标准选择过行(记录)子集(例如,选择字段A>5的行)?然后做一些事情,或者你只是选择字段A,B,C与所有的记录(然后做些什么)?
  6. 您是否“在”您的所有列(分组)上工作,或者是否有一个很好的比例,您可能只用于报告(例如,您希望将数据保存在一起,但在最终结果时间之前不需要使用该列的明确性)?

解决方案

确保安装了。

阅读逐块迭代文件多表查询

由于pytable被优化为按行操作(这就是您所查询的),我们将为每一组字段创建一个表。这样就可以很容易地选择一小组字段(这将与一个大表一起工作,但这样做更有效。)我想我将来也许能解决这个问题.无论如何,这更直观):

(以下是伪码。)

代码语言:javascript
运行
复制
import numpy as np
import pandas as pd

# create a store
store = pd.HDFStore('mystore.h5')

# this is the key to your storage:
#    this maps your fields to a specific group, and defines 
#    what you want to have as data_columns.
#    you might want to create a nice class wrapping this
#    (as you will want to have this map and its inversion)  
group_map = dict(
    A = dict(fields = ['field_1','field_2',.....], dc = ['field_1',....,'field_5']),
    B = dict(fields = ['field_10',......        ], dc = ['field_10']),
    .....
    REPORTING_ONLY = dict(fields = ['field_1000','field_1001',...], dc = []),

)

group_map_inverted = dict()
for g, v in group_map.items():
    group_map_inverted.update(dict([ (f,g) for f in v['fields'] ]))

读取文件并创建存储(本质上是执行append_to_multiple所做的):

代码语言:javascript
运行
复制
for f in files:
   # read in the file, additional options may be necessary here
   # the chunksize is not strictly necessary, you may be able to slurp each 
   # file into memory in which case just eliminate this part of the loop 
   # (you can also change chunksize if necessary)
   for chunk in pd.read_table(f, chunksize=50000):
       # we are going to append to each table by group
       # we are not going to create indexes at this time
       # but we *ARE* going to create (some) data_columns

       # figure out the field groupings
       for g, v in group_map.items():
             # create the frame for this group
             frame = chunk.reindex(columns = v['fields'], copy = False)    

             # append it
             store.append(g, frame, index=False, data_columns = v['dc'])

现在文件中有了所有的表(实际上,如果您愿意,可以将它们存储在单独的文件中,您就必须将文件名添加到group_map中,但这可能是不必要的)。

这是获取列和创建新列的方法:

代码语言:javascript
运行
复制
frame = store.select(group_that_I_want)
# you can optionally specify:
# columns = a list of the columns IN THAT GROUP (if you wanted to
#     select only say 3 out of the 20 columns in this sub-table)
# and a where clause if you want a subset of the rows

# do calculations on this frame
new_frame = cool_function_on_frame(frame)

# to 'add columns', create a new group (you probably want to
# limit the columns in this new_group to be only NEW ones
# (e.g. so you don't overlap from the other tables)
# add this info to the group_map
store.append(new_group, new_frame.reindex(columns = new_columns_created, copy = False), data_columns = new_columns_created)

当您准备好接受post_processing时:

代码语言:javascript
运行
复制
# This may be a bit tricky; and depends what you are actually doing.
# I may need to modify this function to be a bit more general:
report_data = store.select_as_multiple([groups_1,groups_2,.....], where =['field_1>0', 'field_1000=foo'], selector = group_1)

关于data_columns,您实际上不需要定义ANY data_columns;它们允许您根据列对行进行子选择。例如,类似:

代码语言:javascript
运行
复制
store.select(group, where = ['field_1000=foo', 'field_1001>0'])

在最后的报表生成阶段,它们可能是您最感兴趣的(从本质上说,数据列与其他列是分离的,如果定义了很多,这可能会对效率产生一定的影响)。

你也可能想:

  • 创建一个函数,该函数接受字段列表,查找groups_map中的组,然后选择这些组并将结果连接起来,从而得到结果框架(本质上这就是select_as_multiple所做的)。这样结构对你来说就很透明了。
  • 某些数据列的索引(使行的细分速度更快)。
  • 启用压缩。

你有问题时告诉我!

票数 711
EN

Stack Overflow用户

发布于 2013-12-19 19:46:48

我认为上面的答案缺少一个简单的方法,我发现这是非常有用的。

当文件太大,无法在内存中加载时,我会将文件分解为多个较小的文件(行或科尔)。

例句:如果30天的交易数据是30 1GB大小的,我每天把它分解成一个1GB大小的文件。随后,我分别处理每个文件,并在最后聚合结果。

最大的优点之一是它允许并行处理文件(多个线程或进程)。

另一个优点是文件操作(比如在示例中添加/删除日期)可以通过常规的shell命令来完成,这在更高级/复杂的文件格式中是不可能的。

这种方法并不涵盖所有的场景,但在许多场景中非常有用。

票数 167
EN

Stack Overflow用户

发布于 2016-03-23 20:30:53

在这个问题两年后,现在出现了一种“核心外”大熊猫:达斯克。太棒了!虽然它不支持所有的熊猫功能,但你可以用它做更多的事情。更新:在过去两年中,它一直得到维护,并且有大量的用户社区与Dask合作。

而现在,四年后的问题,有另一个高性能的‘核外’熊猫在瓦埃克斯。它“使用内存映射、零内存复制策略和延迟计算以获得最佳性能(没有内存浪费)”。它可以处理数十亿行的数据集,并且不将它们存储到内存中(甚至可以对次优硬件进行分析)。

票数 121
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14262433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档