1

質問: pandas HDFStore オブジェクトで複数の列を反復できるジェネレーターを作成するにはどうすればよいですか?

pandas HDFStore オブジェクトのラッパー クラスを作成しようとしています。私が実装しようとしている機能の 1 つは、特定のチャンクサイズで HDFStore 内の列のグループを反復処理する機能です。多くの機械学習アルゴリズムは動作可能on-lineで、すべてのデータを一度に必要とするわけではありません。

私の最初の試みは、ジェネレーター関数を作成し、HDFStore の select メソッドに start および stop 引数を渡すことでした。

def iterate(self, key, chunksize=50000):
    node = self.store.get_node(key)
    nrows = node.table.nrows
    current = 0
    while current < nrows:
        yield self.store.select(key, start=current, stop=current+chunksize)
        current += chunksize

これは正常に機能し、ストアに格納されている単一の列を反復処理できます。テストのために、すべての列を独自のテーブルに格納していることに注意してください。

私の次のステップは、 を使用して、この概念を複数のテーブルから複数の列に拡張することでしたHDFStore.select_as_multiple。docstring にはありませんがselect_as_multiple、start および stop 引数も受け入れるようです。

>>> store.select_as_multiple(keys='MachineID', start=0, stop=50000)

<class 'pandas.core.frame.DataFrame'>
Int64Index: 50000 entries, 0 to 49999
Data columns:
MachineID    50000  non-null values
dtypes: int64(1)

要求どおり、50,000 行のみが返されました。ただし、複数のキー/列を渡すと、メソッドはすべての行を引き戻します。

>>> store.select_as_multiple(keys=['MachineID','YearMade'], start=0, stop=50000)

<class 'pandas.core.frame.DataFrame'>
Int64Index: 401125 entries, 0 to 1124
Data columns:
MachineID    401125  non-null values
YearMade     401125  non-null values
dtypes: int64(2)

select_as_multipleすべての行ではなく、指定した範囲の行を引き戻すために使用することはできますか?

バージョン情報:

>>> pd.__version__
'0.10.1'

>>> tables.__version__
'2.4.0'
4

1 に答える 1

2

基になる選択に開始/停止を渡さないため、機能しません。かなり簡単に修正できます。

また、イテレータサポートを追加することを意味しており、関数を盗みます:)

完了 https://github.com/pydata/pandas/issues/3078

ドキュメントがありますが、基本的には次のとおりです。

for df in store.select('df',chunksize=10000):
    print df
于 2013-03-17T18:55:44.103 に答える