美文网首页数据分析
数据分析入门——使用HDF5

数据分析入门——使用HDF5

作者: koala_A | 来源:发表于2020-06-02 23:48 被阅读0次

    很久没有更过技术文章了。这两天抽空处理了一下金融历史数据,考虑到数据归档的需求,很偶然发现pandas支持HDF5的格式。HDF5格式的数据相对于csv格式主要有以下几个优势:

    1. 加载速度
    2. 可以自定义key进行数据分类管理
    3. 支持多种压缩方式,即便是压缩数据,在加载的时候依然比csv快很多
    4. 便于存取
    5. 更容易将数据迁移至hadoop

    先看代码

    import h5py
    
    hf_name = 'md2.h5'
    sd = pd.HDFStore("MD_ID2.h5", mode='a', complevel=9, complib='zlib')
    
    hf = h5py.File(hf_name, 'r')
    
    for key in hf.keys():
        n = int(key[0:8])
        if n < 20191009:
            continue
        else:
            k.logger.info('The correct key is: %s' % key)
            hdf = pd.read_hdf(hf_name, key=key)
            k.logger.info('Grouping by instrument_id……')
            g = hdf.groupby('instrument_id')
            k.logger.info('Groupby complete!')
            for name, group in g:
                key_name = name
                if '-' in name:
                    key_name = name.replace('-','_')
                k.logger.info('Storing %s into HDF5' % key_name)
                sd.put(key=key_name, value=group, format='table', append=True)
                k.logger.info('Store %s Complete!' % key_name)
            
    k.logger.info('%s import complete' % hf_name)
    sd.close()
    k.logger.info('File list : %s' % os.listdir())
    

    这个代码用到了h5py这个库,这个库主要是为了去查询hdf5文件中的key,因为我早先的hdf5文件是使用csv文件名作为key进行存储的,不便于查询,并且没有做压缩,存储大小和csv没有太大差别,由于数据量太大,这是一个非常大的开销,因此,我这段程序自动将原来hdf5中的数据那重来重新使用合约号作为hdf5文件的key进行存储,并使用了最高的压缩比,实现了过去10GB的一个文件压缩到了600多MB的效果。这里面关键参数如下:

    1. pd.HDFStore 方法中的complevel 和 complib。一个是指定压缩级别的,9应该是最高的,complib是压缩格式,这个不是特别明白,试了一下zlib效果还不错。
    2. pd.HDFStore的mode一定用a,是append的意思,可以往里面追加数据,对应的,在使用它的put方法是,也要记得写上append = True(我其实没试过不写会怎么样,不过写上肯定是没错)
    3. key的名字。key的名字是有一些要求的,不然会有warring,因此我这里面对于hdf5 的key的非法字符做了一下替换。

    遗留问题:每天数据差不多有1GB左右,所以这个程序在服务器上运行时候经常把服务器跑挂掉,这里面应该有不少值得优化的地方,尤其是内存管理方面。目前临时的做法是根据日志判断程序处理到那个key时死掉了,然后在if判断那里把序号加进去,下次重新运行时就可以从上次死掉的地方继续。

    相关文章

      网友评论

        本文标题:数据分析入门——使用HDF5

        本文链接:https://www.haomeiwen.com/subject/vpqezhtx.html