1

Python、特に HDF5 を使用した Pandas が、時系列モデリングを行うのに適切な環境であるかどうかを調査しています...結果として、これらのいずれについても (まだ!) 経験がほとんどありません。愚かな質問を許してください。

端的に言えば、ダミー データを HDF5 ファイルに挿入する最も基本的な処理を行っても、いくつか問題が発生しました。別の投稿で提供されたコードに従っていましたが、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()

以下に貼り付けたように、ぶら下がっている行へのコールスタックを取得しました。この行は 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 行) をループしていることに気付きました。最初のループは正常に実行され、ハングするのは 2 番目のループです。さらに、GenericStorer.write_array()次のスタックダウンで呼び出されるメソッドはvalue.dtype.type == 'numpy.float64'、最初のパスではありますがvalue.dtype.type == 'numpy.object'、2 番目のパスでは、io/pytables.py の 1785 行目の別の分岐につながります。EDIT:最初のパスは〜800メガファイルを書き込んでいるので、予想される出力ファイルのほとんどのように見えます。

最後に、これがアーキテクチャ/ソフトウェア フレーバーに関連する場合。私は以下を実行しています:

マシン: 仮想マシン、1 CPU、4Gb RAM、64 ビット
OS : Red Hat Enterprise Linux 6 (64 ビット)
ソフトウェア: Python、Pandas、PyTables など、数日前から anaconda 経由でインストール。関連するバージョン番号が上記のスクリプトに (コメントとして!) 印刷されていることを願っていますが、他のバージョン番号が適切かどうか教えてください。

ジェームズの助けのためのTIA

4

1 に答える 1

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、文字列のようなオブジェクト (インデックス/列インデックスなど) がピクルされます (tables型が決定され、ネイティブ形式で書き込まれるのとは対照的に)。あなたのバックトレースは、ピクルスで失敗したことを示していますが、これは奇妙です。おそらく、Red Hat Linux にはいくつかの制限があり、PyTables 2.4 (または pandas) のバグである可能性があります。私はそれを再現できません。

pandas 0.12、PyTables 3.0.0 にアップグレードして、それが持続するかどうかを確認します。

いずれにせよ、Tableフォーマットは問題なく機能し、どのイベントでも多くの利点を提供します。こちらを参照してください

于 2013-08-16T12:49:04.010 に答える