数据分析

数据分析入门——使用HDF5

2020-06-02  本文已影响0人  koala_A

很久没有更过技术文章了。这两天抽空处理了一下金融历史数据,考虑到数据归档的需求,很偶然发现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判断那里把序号加进去,下次重新运行时就可以从上次死掉的地方继续。

上一篇 下一篇

猜你喜欢

热点阅读