Python分层numpymemmap数据集

hierarchical-memmap-format的Python项目详细描述


HMF(Hierarchical Memmap Format)是一个Python包,它提供与PyTables相似的用户API,但使用Numpy memmap作为数据存储。它还支持从Pandas dataframe中轻松获取数据,并支持并行写入以提高写入速度。在

安装

pip install hierarchical-memmap-format

入门

hmfapi在很大程度上受PyTables的启发,因此支持HDF5的两个重要功能,因为它们允许用户编写自组织和自文档的数据。我们将通过一个例子来说明这些想法。在

首先,我们需要导入包:

^{pr2}$

为了开始使用HMF,我们必须调用open_file方法,该方法要么创建一个新目录,要么从现有目录中读取,我们通过mode参数确定。请注意,尽管它被称为open“file”,但该词松散地用于表示“directory”。因此,我们必须通过root_path参数为方法提供指向根目录的所需路径,其中所有数据都将写入:

f=HMF.open_file('myRoot',mode='w+')

目前,支持的模式是w+r+w+打开一个目录进行写入。如果它不存在,它会创建一个新目录,如果它存在,它会删除该目录的内容。r+用于读取和写入,如果现有目录已存在,则将读取该目录的内容。在

一旦完成数据写入(读写过程如下所述),调用close方法将所有数据保存在磁盘上是非常重要的:

f.close()

写入组和数组

这里我们将演示HMF的自组织特性。使用单个“文件”处理程序,用户可以轻松地使用分层文件系统写入数据。如果您已经熟悉HDF5,这将更容易理解。在

f.set_group('/groupA')# the path must start with root "/"

这段代码将创建一个“目录”或“节点”,groupA,我们可以在其中编写数组或进一步的组。用户也可以同时创建嵌套目录:

f.set_group('/group1/groupA/groupZ')

我们可以使用set_array方法编写数组:

array=np.arange(9)f.set_array('/groupA/array1',array)

您不需要提前创建组。如果groupA不存在,上面的代码也将创建groupA。另外,最重要的是,上面的代码将创建一个到数组的内存映射,您可以找到关于here的更多信息

可以使用get_groupget_array方法检索组和数组。例如,下面的代码将检索写入的数组数据:

memmap_obj=f.get_array('/groupA/array1')

返回的对象是先前创建的numpy memmap对象。同样,一旦您完成了数据的编写,不要忘记调用close!在

f.close()

写入节点属性

这里我们将演示HMF的自文档特性。对于那些熟悉HDF5的人来说,这一点也不奇怪。HMF允许用户为每个节点赋予属性,无论是组节点还是数组节点。让我们尝试从上面给groupA节点赋予一些属性。在

f.set_node_attr('/groupA',key='someAttribute',value='attributeValue')

属性的键和值都可以是任意Python对象。在

然后可以使用get_node_attr方法检索属性:

f.set_node_attr('/groupA',key='someAttribute')

因此,HMF允许用户通过允许用户轻松地读写与每个节点相关联的伴随信息来写入自描述的数据。在

与熊猫一起使用

最后,HMF有一个API,可以轻松地从Pandas数据帧中提取数组memmap。此外,这种写入模式将并行执行,即所有可写数组都将并行写入。让我们看一个例子,从头开始。在

importnumpyasnpimportpandasaspddata=np.arange(10*3).reshape((10,3))pdf=pd.DataFrame(data=data,columns=['a','b','c'])f=HMF.open_file('pandasExample',mode='w+')

首先将数据帧介绍给HMF,如下所示:

f.from_pandas(pdf)

然后可以从数据帧逐个“注册”数组:

f.register_array('arrayA',['b','c'])f.register_array('arrayB',['a','b'])

最后调用close保存数据:

f.close()

现在,您可以使用常规方法检索memmap对象:

f.get_array('/arrayA')

在当有许多数组要一次写入时,并行写入的能力就非常突出,如果有一组数组由groupby参数确定,则是这种情况。让我们再举一个具有groups列的dataframe示例:

importnumpyasnpimportpandasaspddata=np.arange(10*3).reshape((10,3))pdf=pd.DataFrame(data=data,columns=['a','b','c'])group_col=['Aaa','Aaa','Aaa','Bbb','Bbb','Bbb','Ccc','Ccc','Ccc','Ccc']pdf['groups']=group_colf=HMF.open_file('pandasExample',mode='w+')

然后可以指定groupby

f.from_pandas(pdf,groupby='groups')# You can also specify "orderby" in order to sort the array by a particular column!f.register_array('arrayA',['b','c'])f.register_array('arrayB',['a','b'])f.close()

现在,当您获得数组时,组已经被自动创建,由groupby列的值定义:

f.get_array('/Aaa/arrayA')# get arrayA for partition group "Aaa"f.get_array('/Ccc/arrayB')# get arrayB for partition group "Ccc"

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Switch语句,用于根据用户输入确定字母等级(十进制)   使用rich:datascroller更改页面后,java actionListener无法在rich:dataTable中工作   使用Azure AD帐户时java强制密码更改问题   java如何在flink中模拟异步操作   java如何将整数格式化为两个小数?   基于javascript条件访问amazon lamda结果?   java成本/从源节点到目标节点的所有可能路径的距离   java为什么我的光标在NextLine()之后的错误行上?   java Gridlayout未根据约束调整大小   windows使用特殊路径名在java中加载文件   如何在java上使用selenium在移动浏览器中滑动   Java中字符串类的成员使用了哪种utf8编码?   java删除截击缓存   java Musicg库不适用于mp3、rm、wma