在学习大熊猫的过程中,我试图解决这个问题的答案已有好几个月了.我使用SAS进行日常工作,这非常适合它的核心支持.然而,由于其他许多原因,SAS作为一款软件非常糟糕.
有一天,我希望用python和pandas替换我对SAS的使用,但我目前缺乏大型数据集的核心工作流程.我不是在谈论需要分布式网络的"大数据",而是说文件太大而无法容纳在内存中,但又足够小以适应硬盘驱动器.
我的第一个想法是用于HDFStore在磁盘上保存大型数据集,并仅将我需要的部分拉入数据帧进行分析.其他人提到MongoDB是一种更容易使用的替代品.我的问题是:
有哪些最佳实践工作流程可用于完成以下任务:
真实世界的例子将非常受欢迎,尤其是那些在"大数据"上使用熊猫的人.
编辑 - 我希望如何工作的示例:
我正在尝试找到执行这些步骤的最佳实践方法.阅读关于pandas和pytables的链接似乎附加一个新列可能是个问题.
编辑 - 特别回应杰夫的问题:
if var1 > 2 then newvar = 'A' elif var2 = 4 then newvar = 'B'.这些操作的结果是我的数据集中每条记录的新列.我很少会在数据集中添加行.我几乎总是会创建新的列(统计/机器学习用语中的变量或特征).
在python/numpy中编写蒙特卡罗粒子模拟器(布朗运动和光子发射).我需要将模拟输出(>> 10GB)保存到文件中,然后在第二步中处理数据.与Windows和Linux的兼容性非常重要.
粒子数(n_particles)为10-100.时间步数(time_size)的数量是~10 ^ 9.
模拟有3个步骤(下面的代码是针对全内存版本):
模拟(并存储)一个emission速率数组(包含许多几乎为0的元素):
n_particlesx time_size),float32,大小80GB计算counts数组,(来自泊松过程的随机值,具有先前计算的速率):
shape(n_particlesx time_size),uint8,大小20GB
counts = np.random.poisson(lam=emission).astype(np.uint8)
Run Code Online (Sandbox Code Playgroud)查找计数的时间戳(或索引).计数几乎总是0,因此时间戳数组将适合RAM.
# Loop across the particles
timestamps = [np.nonzero(c) for c in counts]
Run Code Online (Sandbox Code Playgroud)我做了一次步骤1,然后重复步骤2-3很多次(~100次).将来我可能需要在计算之前预处理emission(应用cumsum或其他功能)counts.
我有一个内存实现工作,我试图了解实现可以扩展到(更多)更长时间模拟的核外版本的最佳方法.
我需要将数组保存到文件中,我想使用单个文件进行模拟.我还需要一种"简单"的方式来存储和调用模拟参数字典(标量).
理想情况下,我想要一个文件支持的numpy数组,我可以预先分配和填充块.然后,我希望numpy数组方法(max,, cumsum...)透明地工作,只需要一个chunksize关键字来指定每次迭代加载多少数组.
更好的是,我想要一个Numexpr,它不是在缓存和RAM之间运行,而是在RAM和硬盘之间运行.
作为第一个选项,我开始尝试pyTables,但我对它的复杂性和抽象(与numpy不同)不满意.此外,我目前的解决方案(如下所示)是UGLY,效率不高.
所以我寻求答案的选择是
实现一个具有所需功能的numpy数组(如何?)
以更智能的方式使用pytable(不同的数据结构/方法)
使用另一个库:h5py,blaze,pandas ......(到目前为止我还没有尝试过任何一个).
我将模拟参数保存在'/parameters'组中:每个参数都转换为numpy数组标量.详细的解决方案,但它的工作原理.
我保存emission为Extensible …