我正在探索Python,特别是带有HDF5的Pandas,是否适合进行一些时间序列建模......其结果是我几乎没有任何经验(还有!)这些请原谅任何愚蠢的问题。
为了减少追逐,我甚至在将最基本的虚拟数据插入到HDF5文件中时遇到了一些问题。我正在跟踪another post中提供的代码,但是当我以storer格式编写代码时,代码执行就会挂起。我还没有尝试过表格格式,我想先让它工作。我正在运行以下文件。
test_put.py:
from IPython.core.debugger import Tracer; debugStart = Tracer()
import pandas as pd
import numpy as np
import tables
print "Pandas version: " + pd.__version__ # 0.11.0
print "NumPy version: " + np.__version__ # 1.7.1
print "Tables version: " + tables.__version__ # 2.4.0
df = pd.DataFrame(np.random.randn(1000 * 1000, 100),
index=range(int(1000 * 1000)),
columns=['E%03d' % i for i in xrange(100)])
for x in range(20):
df['String%03d' % x] = 'string%03d' % x
def test_storer_put():
store = pd.HDFStore('test_put.h5','w')
debugStart()
store['df'] = df
store.close()
def test_table_put():
store = pd.HDFStore('test_put.h5','w')
store.put('df',df,table=True)
store.close()
test_storer_put()
在ipython中使用ipdb我在下面粘贴的挂线上有一个调用堆栈。这行是调用cPickle,我假设它是某种编译库。我不能再进入这一行(使用“s”),因此我不会想到问题是什么。
~/test_put.py(20)test_storer_put()
18 store = pd.HDFStore('test_put.h5','w')
19 debugStart()
---> 20 store['df'] = df
21 store.close()
22
~/anaconda/lib/python2.7/site-packages/pandas/io/pytables.py(241)__setitem__()
239
240 def __setitem__(self, key, value):
--> 241 self.put(key, value)
242
243 def __delitem__(self, key):
~/anaconda/lib/python2.7/site-packages/pandas/io/pytables.py(536)put()
534 table
535 """
--> 536 self._write_to_group(key, value, table=table, append=append, **kwargs)
537
538 def remove(self, key, where=None, start=None, stop=None):
~/anaconda/lib/python2.7/site-packages/pandas/io/pytables.py(871)_write_to_group()
869 raise ValueError('Compression not supported on non-table')
870
--> 871 s.write(obj = value, append=append, complib=complib, **kwargs)
872 if s.is_table and index:
873 s.create_index(columns = index)
~/anaconda/lib/python2.7/site-packages/pandas/io/pytables.py(2005)write()
2003 blk = data.blocks[i]
2004 # I have no idea why, but writing values before items fixed #2299
-> 2005 self.write_array('block%d_values' % i, blk.values)
2006 self.write_index('block%d_items' % i, blk.items)
2007
~/anaconda/lib/python2.7/site-packages/pandas/io/pytables.py(1799)write_array()
1797 vlarr = self._handle.createVLArray(self.group, key,
1798 _tables().ObjectAtom())
-> 1799 vlarr.append(value)
1800 elif value.dtype.type == np.datetime64:
1801 self._handle.createArray(self.group, key, value.view('i8'))
~/anaconda/lib/python2.7/site-packages/tables/vlarray.py(462)append()
460 atom = self.atom
461 if not hasattr(atom, 'size'): # it is a pseudo-atom
--> 462 sequence = atom.toarray(sequence)
463 statom = atom.base
464 else:
~/anaconda/lib/python2.7/site-packages/tables/atom.py(1000)toarray()
998
999 def toarray(self, object_):
-> 1000 buffer_ = self._tobuffer(object_)
1001 array = numpy.ndarray( buffer=buffer_, dtype=self.base.dtype,
1002 shape=len(buffer_) )
> ~/anaconda/lib/python2.7/site-packages/tables/atom.py(1112)_tobuffer()
1110
1111 def _tobuffer(self, object_):
-> 1112 return cPickle.dumps(object_, cPickle.HIGHEST_PROTOCOL)
1113
1114 def fromarray(self, array):
悬挂线范围内的参数是:
ipdb> a
self = ObjectAtom()
object_ = [['string000' 'string001' 'string002' ..., 'string017' 'string018'
'string019']
['string000' 'string001' 'string002' ..., 'string017' 'string018'
'string019']
['string000' 'string001' 'string002' ..., 'string017' 'string018'
'string019']
...,
['string000' 'string001' 'string002' ..., 'string017' 'string018'
'string019']
['string000' 'string001' 'string002' ..., 'string017' 'string018'
'string019']
['string000' 'string001' 'string002' ..., 'string017' 'string018'
'string019']]
在单步执行代码时,我注意到BlockManagerStorer.write()
方法(大约是上面调用堆栈的一半)循环遍历2组数据块(2002到2006行)。第一个循环运行正常,它是挂起的第二个循环。此外,在下一个堆栈中调用的GenericStorer.write_array()
方法在第一次传递中具有value.dtype.type == 'numpy.float64'
但在第二次传递中value.dtype.type == 'numpy.object'
导致在io / pytables的第1785行上的不同分支。 py被采取。 编辑: 第一遍是写一个~800 Meg文件,因此它似乎是大部分预期的输出文件。
最后,如果这是与架构/软件相关的风格。我正在运行以下内容:
计算机:虚拟机,1个CPU,4Gb RAM,64位
OS :Red Hat Enterprise Linux 6(64位)
软件:几天前通过anaconda安装的Python,Pandas,PyTables等。希望在上面的脚本中打印相关的版本号(作为评论!),但如果其他人合适,请告诉我。
TIA提供任何帮助 詹姆斯
答案 0 :(得分:1)
我测试了你的确切配置,除了我使用debian / squeeze
OS: Linux 2.6.32-5-amd64 #1 SMP Sun Sep 23 10:07:46 UTC 2012 x86_64
In [4]: print "Pandas version: " + pd.__version__ # 0.11.0
Pandas version: 0.11.0
In [5]: print "NumPy version: " + np.__version__ # 1.7.1
NumPy version: 1.7.1
In [6]: print "Tables version: " + tables.__version__ # 2.4.0
Tables version: 2.4.0
在storer
上,对类似字符串的对象(例如索引/列索引)进行pickle(与tables
相反,其中确定类型并以原生格式写入)。你的回溯表明它在泡菜中失败了,这很奇怪;可能在red hat linux上有一些限制,可能是PyTables 2.4(或pandas)中的一个错误。我不能重现那个。
我会尝试升级到pandas 0.12,PyTables 3.0.0并查看它是否仍然存在。
无论如何,Table
格式应该对您有用,并且在任何情况下都有很多优势,请参阅here