Pandas Pytables警告和性能缓慢

4

我一直在使用pandas和pytables来测试一些大型金融数据集,但遇到了一个真正的障碍:

当将数据存储在pytables文件中时,pandas似乎将多维数据存储在极长的行中,而不是列中。

试试这个:

from pandas import *
df = DataFrame({'col1':randn(100000000),'col2':randn(100000000)})
store = HDFStore('test.h5')
store['data'] = df    #should be a warning here about exceeding the maximum recommended rowsize
store.handle

输出:

File(filename=test7.h5, title='', mode='a', rootUEP='/', filters=Filters(complevel=0, shuffle=False, fletcher32=False))
/ (RootGroup) ''
/data (Group) ''
/data/axis0 (Array(2,)) ''
  atom := StringAtom(itemsize=4, shape=(), dflt='')
  maindim := 0
  flavor := 'numpy'
  byteorder := 'irrelevant'
  chunkshape := None
/data/axis1 (Array(100000000,)) ''
  atom := Int64Atom(shape=(), dflt=0)
  maindim := 0
  flavor := 'numpy'
  byteorder := 'little'
  chunkshape := None
/data/block0_items (Array(2,)) ''
  atom := StringAtom(itemsize=4, shape=(), dflt='')
  maindim := 0
  flavor := 'numpy'
  byteorder := 'irrelevant'
  chunkshape := None
/data/block0_values (Array(2, 100000000)) ''
  atom := Float64Atom(shape=(), dflt=0.0)
  maindim := 0
  flavor := 'numpy'
  byteorder := 'little'
  chunkshape := None

我不是完全确定,但我认为结合错误信息,Array(2,100000000) 表示一个有 2 行和 100,000,000 列的二维数组。这也是在 HDFView 中显示的方式。
在某些情况下,我一直遇到极差的性能(例如,data['ticks'].head() 要花费 10 秒),这是它的问题吗?

1
请修复http://github.com/pydata/pandas/pull/1834和http://github.com/pydata/pandas/issues/1824。数据现在是以列为单位保存的吗?对于时间序列数据,像q/kdb+等一样以列方式保存是否最优?除了它是PyTables之外,我真的找不到有关HDFStore如何保存数据的其他信息。 - Konsta
它目前以一种相当奇怪的方式存储,尝试查看您创建的HDF5存储的句柄以获取更多信息,或在HDFView中查看它。 - John_C
1个回答

4
我已经在GitHub上关联了这个问题:

http://github.com/pydata/pandas/issues/1824

我个人之前并不知道这个问题,而且实际上对于PyTables或HDF5(无论是哪一个罪魁祸首)出现这样的问题感到有点失望。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接