Python Pandas实践 HDF5高效二进制存储

关于HDF5

如果你需要处理多维数组,对性能有非常高的要求,需要在数据集上支持子集分片和部分I/O,需要用特征来给数据集做标记,对关系型特性没有要求,那么HDF5就是完美的选择[1]

HDF5是一种存储相同类型数值的大数组的机制,适用于可被层次性组织且数据集需要被元数据标记的数据模型。

它跟SQL风格的关系型数据库区别相当大,如果你需要在多个表上保持关系,或者想要在数据上进行JOIN,那么一个关系型数据库可能更适合你。又或者你需要在一台没有安装HDF5的机器上读取一个小型的1维数据集,那么CSV这样的文本格式是更合理的选择。

人们正在越来越多地将Python用于大数据集的快速可视化项目,在大规模计算中将Python作为一种高层粘合性语言来协助那些编译型语言如C和FORTRAN。现在一个数据集动不动就是上千GB甚至TB的数据需要处理,HDF5自身最大可以支持EB的规模。

HDF5 (Hierarchical Data Format) 由美国伊利诺伊大学厄巴纳-香槟分校 UIUC (University of Illinois at Urbana-Champaign) 开发,是一种常见的跨平台数据储存文件,可以存储不同类型的图像和数码数据,并且可以在不同类型的机器上传输,同时还有统一处理这种文件格式的函数库。

HDF5(Hierarchical Data Formal)是用于存储大规模数值数据的较为理想的存储格式,文件后缀名为h5,存储读取速度非常快,且可在文件内部按照明确的层次存储数据,同一个HDF5可以看做一个高度整合的文件夹,其内部可存放不同类型的数据。在Python中操纵HDF5文件的方式主要有两种,一是利用pandas中内建的一系列HDF5文件操作相关的方法来将pandas中的数据结构保存在HDF5文件中,二是利用h5py模块来完成从Python原生数据结构向HDF5格式的保存,本文就将针对pandas中读写HDF5文件的方法进行介绍。

Python版的HDF5工具包为h5py,安装比较简单,可以直接使用pip安装:

D:\Python>pip install -i https://pypi.tuna.tsinghua.edu.cn/simple h5py

如果已经安装过Pandas,通常默认依赖关系,则已经安装h5py,但是pytable,一般是没有安装,需要自行手动安装,如下所示:

D:\Python>pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tables
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting tables
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/....../tables-3.6.1-2-cp36-cp36m-win_amd64.whl (3.2MB)
    100% |████████████████████████████████| 3.2MB 2.8MB/s
Requirement already satisfied: numpy>=1.9.3 in d:\python\python36\lib\site-packages (from tables) (1.16.6+mkl)
Collecting numexpr>=2.6.2 (from tables)
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/....../numexpr-2.7.1-cp36-none-win_amd64.whl (90kB)
    100% |████████████████████████████████| 92kB 2.9MB/s
Installing collected packages: numexpr, tables
Successfully installed numexpr-2.7.1 tables-3.6.1

这是一个类似数据表字典的格式,可以将很多的数据帧(dataframe)保存在一个对象里面。每一个数据帧,都标有一个key,然后通过key来访问数据帧的数据。

在使用Pandas保存DataFrame数据表为HDF的时候(df.to_hdf(…)),如果不指定格式,那么我们数据中存在string类型的数据,就会报以下警告:

lib\site-packages\pandas\core\generic.py:2505: PerformanceWarning: 
your performance may suffer as PyTables will pickle object types that it cannot
map directly to c-types [inferred_type->mixed-integer,key->block2_values] [items->Index(['车号', '油品', '油罐号', '乙醇罐',......], dtype='object')]

  encoding=encoding,

数据不统一。比如数据中有int(比如nan)和str两种数据。

基于基本属性的rdbms包装器

pytable为构造 基于数据库的应用程序。包括一个相当优雅的 SQLQuery对象,它使复杂SQL的创建成为响应 使应用程序需求更容易,以及 类允许对数据库模式进行建模。

可以从实时数据库中读取mysql和postgresql架构。 可以从架构生成数据库。 不试图抽象出SQL语法中的差异。 提供可选的面向对象行包装器 定义字段的基本属性。

另外,在Keras中,模型的结构和权重数据是分开的:权重的文件格式是HDF5,这种格式保存数字矩阵效率很高。模型的结构用JSON或YAML导入导出。分层数据格式,版本5(HDF5)可以高效保存大实数矩阵,例如神经网络的权重。

Pandas实践HDF5存储代码

import pymongo
import pandas as pd

def get_data():
    client = pymongo.MongoClient('mongodb://localhost:27017')
    db = client["oildepot"]
    collection = db["TCS_OilCanHistory"]
          
    def function(key):
        CanStatus = {'出油':-1,'静止':0,'进油':1}
        
        return CanStatus.get(key)
       
    df = pd.DataFrame(list(collection.find({'OilStockCode':'K1060030002','MearsureTime':{'$gt':'2019/7/1'}},{'OilStockCode':1,'OilCanID':1,'OilCode':1,
                'WatchDensity':1,'MearsureTime':1,'WatchTemperature':1,'StandardDensity':1,'OilTemperature':1,'OilCanStatus':1,
                'LiquidLevel':1,'LiquidVolume':1,'VCF':1,'OilWeight':1,'FloatingRoofSpeed':1,'OutletPipeSpeed':1,'FlowRate':1,
                'InletPipeSpeed':1})))
    
    df.drop(['_id'],axis=1, inplace=True)
    #df['MearsureTime'].str[1:4]
    #按“.“截断时间字符串,取分割的第一个
    df.loc[:,'MearsureTime'] = df['MearsureTime'].str.split('.',expand=True)[0]
    #使用lambda表达式替换字符串为数值(油罐状态)
    df.loc[:,'OilCanStatus'] = df.apply(lambda x: function(x.OilCanStatus), axis = 1)
   
    df.rename(columns={'OilStockCode':'油库编码','OilCanID':'油罐编码','OilCode':'油品编码','WatchDensity':'视密度','MearsureTime':'采集时间',
                            'WatchTemperature':'视油温','StandardDensity':'密度','OilTemperature':'油温','OilCanStatus':'状态','LiquidLevel':'液位',
                            'LiquidVolume':'体积','VCF':'体积修正次数','OilWeight':'重量','FloatingRoofSpeed':'浮盘流速','OutletPipeSpeed':'出油管流度',
                            'FlowRate':'流速','InletPipeSpeed':'进油管流速'},inplace = True)
    
    return df
    
def main():
    df = get_data()
    df.to_hdf("E:/data/OilCan2020_1.h5", key='df', mode='w', complevel=9) #, format='table')
    df.to_csv('e:/data/OilCan2020_1.csv')
    
if __name__ == '__main__':
    main()

与csv格式对比,H5二进制压缩还是比较大的,缩减为csv的50%多。
在这里插入图片描述

Python工具ViTables可视化打开HDF5数据库

ViTables是PyTables家族的一个组成部分。它是一个用于浏览和编辑PyTables和HDF5格式文件的GUI。它是使用Python和PyQt5(Python绑定到Qt)开发的,因此它可以在任何支持这些组件的平台上运行。

ViTables功能包括在数据层次结构中轻松导航、显示真实数据及其相关元数据、简单但功能强大的多维数据浏览等等。

作为一个查看器,ViTables最大的优点之一就是它能够显示非常大的数据集。具有10亿行(及以上)的表的导航速度惊人,而且内存需求非常低。所以,如果你需要浏览大量的表格,不要犹豫,重要的是你的选择。

D:\Python>pip install -i https://pypi.tuna.tsinghua.edu.cn/simple vitables
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting vitables
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/....../ViTables-3.0.2-py3-none-any.whl (1.0MB)
    100% |████████████████████████████████| 1.0MB 2.8MB/s
Collecting PyQt5>=5.5.1 (from vitables)
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/....../PyQt5-5.15.1-5.15.1-cp35.cp36.cp37.cp38.cp39-none-win_amd64.whl (59.4MB)
    100% |████████████████████████████████| 59.4MB 118kB/s
Requirement already satisfied: numexpr>=2.0 in d:\python\python36\lib\site-packages (from vitables) (2.7.1)
Requirement already satisfied: tables>=3.0 in d:\python\python36\lib\site-packages (from vitables) (3.6.1)
Requirement already satisfied: numpy>=1.4.1 in d:\python\python36\lib\site-packages (from vitables) (1.16.6+mkl)
Requirement already satisfied: qtpy>=1.2.1 in d:\python\python36\lib\site-packages (from vitables) (1.9.0)
Collecting PyQt5-sip<13,>=12.8 (from PyQt5>=5.5.1->vitables)
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/....../PyQt5_sip-12.8.1-cp36-cp36m-win_amd64.whl (62kB)
    100% |████████████████████████████████| 71kB 2.0MB/s
Installing collected packages: PyQt5-sip, PyQt5, vitables
Successfully installed PyQt5-5.15.1 PyQt5-sip-12.8.1 vitables-3.0.2

首先PyQt 是必须要安装的,Pytables也还是必须的。

在命令行输入vitables h5文件地址,或者,启动ViTables再通过“File”菜单打开数据库。
在这里插入图片描述
参考:
[1]《《Python和HDF 5大数据应用》——1.2 HDF5到底是什么》 云栖社区 , 作者[美]Andrew Collette(科莱特),胡世杰 译 ,2017年
[2]《(数据科学学习手札63)利用pandas读写HDF5文件》 博客园 , 费弗里 ,2019年7月
[3]《通过Pandas批量快速读取MongoDB数据经验一则》 CSDN博客 , 肖永威 ,2020年10月

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肖永威

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值