在学习大熊猫的过程中,我试图解决这个问题的答案已有好几个月了.我使用SAS进行日常工作,这非常适合它的核心支持.然而,由于其他许多原因,SAS作为一款软件非常糟糕.
有一天,我希望用python和pandas替换我对SAS的使用,但我目前缺乏大型数据集的核心工作流程.我不是在谈论需要分布式网络的"大数据",而是说文件太大而无法容纳在内存中,但又足够小以适应硬盘驱动器.
我的第一个想法是用于HDFStore在磁盘上保存大型数据集,并仅将我需要的部分拉入数据帧进行分析.其他人提到MongoDB是一种更容易使用的替代品.我的问题是:
有哪些最佳实践工作流程可用于完成以下任务:
真实世界的例子将非常受欢迎,尤其是那些在"大数据"上使用熊猫的人.
编辑 - 我希望如何工作的示例:
我正在尝试找到执行这些步骤的最佳实践方法.阅读关于pandas和pytables的链接似乎附加一个新列可能是个问题.
编辑 - 特别回应杰夫的问题:
if var1 > 2 then newvar = 'A' elif var2 = 4 then newvar = 'B'.这些操作的结果是我的数据集中每条记录的新列.我很少会在数据集中添加行.我几乎总是会创建新的列(统计/机器学习用语中的变量或特征).
我正在处理大型3D阵列,我经常需要以各种方式进行切片以进行各种数据分析.典型的"立方体"可以是~100GB(将来可能会变大)
似乎python中大型数据集的典型推荐文件格式是使用HDF5(h5py或pytables).我的问题是:使用HDF5存储和分析这些立方体而不是将它们存储在简单的平面二进制文件中是否有任何速度或内存使用效益?HDF5是否更适合表格数据,而不像我正在使用的大型数组?我看到HDF5可以提供很好的压缩,但我对处理速度和处理内存溢出更感兴趣.
我经常只想分析立方体的一个大的子集.pytables和h5py的一个缺点是,当我拿一个数组时,我总是得到一个numpy数组,用尽内存.但是,如果我切片平面二进制文件的numpy memmap,我可以得到一个视图,它将数据保存在磁盘上.因此,似乎我可以更轻松地分析我的数据的特定部分而不会超出我的记忆.
我已经探讨了pytables和h5py,到目前为止还没有看到我的目的的好处.
有没有足够的经验w/NetCDF和HDF5给出一些关于它们的优缺点作为存储科学数据的方式?
我已经使用过HDF5并希望通过Java进行读/写,但是接口本质上是C库的包装器,我发现这让人感到困惑,所以NetCDF看起来很吸引人,但我几乎一无所知.
编辑:我的应用程序"仅"用于数据记录,因此我得到一个具有自描述格式的文件.对我来说,重要的功能是能够添加任意元数据,具有快速写入访问权限以附加到字节数组,以及具有单写入器/多读取器并发(强烈首选但不是必须的.NetCDF文档说他们有SWMR但是没有不能说它们是否支持任何机制来确保两个作者不能同时打开同一个文件并带来灾难性后果.我喜欢HDF5的层次结构(特别是我喜欢有向无环图层次结构,比"常规"文件系统类层次结构更灵活),现在正在阅读NetCDF文档...如果它只允许一个数据集文件然后它可能不适合我.:(
更新 - 看起来像NetCDF-Java从netCDF-4文件读取,但只从不支持分层组的netCDF-3文件写入.织补.
更新2009年7月14日:我开始对Java中的HDF5感到非常不满.可用的库不是很好,它有一些主要的绊脚石,与Java的抽象层(复合数据类型)有关.C的一个很好的文件格式,但看起来我只是输了.> :(
我有关于HDF5性能和并发性的以下问题:
参考文献:
我试图从Python中读取hdf5文件中的数据.我可以使用读取hdf5文件h5py,但我无法弄清楚如何访问文件中的数据.
import h5py
import numpy as np
f1 = h5py.File(file_name,'r+')
Run Code Online (Sandbox Code Playgroud)
这有效,文件被读取.但是如何访问文件对象中的数据f1呢?
统计软件Stata允许将短文本片段保存在数据集中.这可以使用notes和/或完成characteristics.
这对我来说是一个很有价值的功能,因为它允许我保存各种信息,从提醒和待办事项列表到有关我如何生成数据的信息,甚至是特定变量的估算方法.
我现在正试图在Python 3.6中提出类似的功能.到目前为止,我已经在线查看了一些帖子,但这些帖子并没有完全解决我想做的事情.
一些参考文章包括:
对于小型NumPy数组,我得出结论,函数numpy.savez()和a 的组合dictionary可以在单个文件中充分存储所有相关信息.
例如:
a = np.array([[2,4],[6,8],[10,12]])
d = {"first": 1, "second": "two", "third": 3}
np.savez(whatever_name.npz, a=a, d=d)
data = np.load(whatever_name.npz)
arr = data['a']
dic = data['d'].tolist()
Run Code Online (Sandbox Code Playgroud)
但问题仍然存在:
是否有更好的方法可以将其他信息包含在包含NumPy数组或(大)的文件中Pandas DataFrame?
我在听到有关特定特别感兴趣的优点和缺点,你可能有例子的任何建议.依赖性越少越好.
我正在开发一个处理向文件夹添加元数据的开源项目.提供的(Python)API允许您浏览和访问元数据,就像它只是另一个文件夹一样.因为它只是另一个文件夹.
\folder\.meta\folder\somedata.json
Run Code Online (Sandbox Code Playgroud)
阅读Python和HDF5一书中的HDF5我在寻找使用它的好处与使用文件夹中的文件相比,但我遇到的大部分内容都谈到了分层文件格式在添加数据方面的简单性的好处通过其API:
>>> import h5py
>>> f = h5py.File("weather.hdf5")
>>> f["/15/temperature"] = 21
Run Code Online (Sandbox Code Playgroud)
或者它能够根据请求(例如随机访问)只读取它的某些部分,以及并行执行单个HDF5文件(例如,用于多处理)
您可以挂载HDF5文件,https://github.com/zjttoefs/hdfuse5
它甚至拥有强大而简单的群组和数据集的基础概念,来自wiki的内容如下:
将数据集替换为文件和组与文件夹,整个功能集听起来像文件夹中的文件已经完全能够做到.
对于我遇到的每一个好处,没有一个突出显示HDF5专属.
所以我的问题是,如果我要给你一个HDF5文件和一个文件夹,两个内容相同,哪种情况下HDF5更适合?
编辑:
得到了一些关于HDF5可移植性的回应.
这听起来很可爱,但我还没有给出一个例子,一个场景,其中一个HDF5可以用文件输出一个文件夹.当文件夹在任何计算机上可读时,为什么有人会考虑使用HDF5,任何文件系统,通过网络,支持"并行I/O",没有HDF5解释器的人可读.
我甚至可以说,带文件的文件夹比任何HDF5都便携得多.
编辑2:
Thucydides411刚刚举了一个可移植性问题的例子. /sf/answers/1995841991/
我认为我从这个帖子的答案中拿走的是HDF5非常适合当你需要文件和文件夹的组织结构时,就像上面的示例场景一样,有很多(数百万)小(~1个字节)数据结构; 喜欢个别数字或字符串.它通过提供一个"子文件系统"来支持文件系统所缺少的东西,这种文件系统有利于小型和多型,而不是少量和大型.
在计算机图形学中,我们使用它来存储几何模型和关于各个顶点的任意数据,这些数据似乎与它在科学界的使用非常吻合.
我有一个hdf5格式的文件.我知道它应该是一个矩阵,但我想阅读那个矩阵,R以便我可以研究它.我看到有一个h5r软件包可以帮助解决这个问题,但是我没有看到任何简单的阅读/理解教程.这样的教程是否可在线获取.具体来说,如何hdf5使用此包读取对象,以及如何实际提取矩阵?
UPDATE
我发现了一个rhdf5不属于CRAN但属于BioConductoR的软件包.界面相对容易理解文档和示例代码非常清楚.我可以毫无问题地使用它.我的问题似乎是输入文件.我想要读取的矩阵实际上存储在hdf5文件中python pickle.因此,每当我尝试打开它并通过R我获得它来访问它segmentation fault.我确实弄清楚如何将矩阵从内部保存python为tsv文件,现在问题得以解决.
import pandas as pd
dfs = pd.HDFStore('xxxxx.h5')
Run Code Online (Sandbox Code Playgroud)
抛出此错误:
"ImportError: HDFStore requires PyTables, "No module named tables" problem importing"
我试图安装PyTables,需要Cython.我安装了Cython 0.21,但它抛出了一个错误,说明Cython应该大于0.13
这是我得到的日志:
".. ERROR:: You need Cython 0.13 or greater to compile PyTables!
----------------------------------------
Cleaning up...
Command python setup.py egg_info failed with error code 1 in /private/tmp/pip_build_root/tables
Storing debug log for failure in /Users/nikhilsahai/Library/Logs/pip.log
Nikhils-MacBook-Pro:~ nikhilsahai$ sudo pip install cython
Requirement already satisfied (use --upgrade to upgrade): cython in /Library/Python/2.7/site-packages/Cython-0.21-py2.7-macosx-10.9-intel.egg
Cleaning up..."
Run Code Online (Sandbox Code Playgroud)
请指导我如何解决这个问题.
我做了很多统计工作,并使用Python作为我的主要语言.我使用的一些数据集虽然可以占用20GB的内存,但这使得使用numpy,scipy和PyIMSL中的内存函数对它们进行操作几乎是不可能的.统计分析语言SAS在这里具有很大的优势,因为它可以对来自硬盘的数据进行操作而不是严格的内存处理.但是,我想避免在SAS中编写大量代码(出于各种原因),因此我试图确定我使用Python的选项(除了购买更多的硬件和内存).
我应该澄清一下像map-reduce这样的方法对我的大部分工作都无济于事,因为我需要对完整的数据集进行操作(例如计算分位数或拟合逻辑回归模型).
最近我开始玩h5py并认为这是我发现允许Python像SAS一样操作磁盘上的数据(通过hdf5文件),同时仍然能够利用numpy/scipy/matplotlib等的最佳选择.我想听听是否有人在类似设置中使用Python和h5py以及他们发现了什么.有没有人能够在迄今为止由SAS主导的"大数据"设置中使用Python?
编辑:购买更多硬件/内存当然可以提供帮助,但从IT角度来看,当Python(或R或MATLAB等)需要在内存中保存数据时,我很难将Python出售给需要分析大量数据集的组织.SAS继续在这里有一个强大的卖点,因为虽然基于磁盘的分析可能会更慢,但您可以放心地处理大量数据集.因此,我希望Stackoverflow可以帮助我弄清楚如何降低使用Python作为主流大数据分析语言的感知风险.