0

これに似た質問がありますが、データフレームが HDFStore 内にある場合を処理するものはありません。

タイムスタンプ/キー/値アイテムのリストをデータフレームに変換し、タイムスタンプでそれぞれインデックス付けされた複数のデータフレームとして保存し、HDFStore に保存する必要があります。

コード例:

from pandas import HDFStore
from pandas import DataFrame
store = HDFStore('xxx', driver="H5FD_CORE")
for i, k, v in ((0, 'x', 5), (1, 'y', 6)):
    if k not in store:
        store[k] = DataFrame()
    store[k].set_value(i, 'value', v)

このコードの実行後、store['x']空のままになります。

>>> store['x']
Empty DataFrame
Columns: []
Index: []

したがって、それが持続しないのには明らかに何らかの理由があります。また、このようなものがどのように機能するのかがわからないことも確かです。HDFStore内のテーブル/データフレームに追加する方法を理解すれば、ロジックを確実に理解できます。

また、データフレームをメモリ内の何らかの辞書に保持し、最後にそれらを HDFStore に割り当てることもできます。私はどういうわけか、このようにすることでメモリを節約できるという誤った考えを持っていました。おそらくそれについても間違っています。

4

1 に答える 1

0

明確にするためにコメントしたいのですが、まだ担当者がいません。もう少し文脈がないと、あなたのアプローチが賢明かどうかを言うのは難しいですが、ほとんどすべての場合、ノーと言う傾向があります. 私が間違っている場合は修正してください。ただし、あなたがやろうとしていることは次のとおりです。

  • イテラブルのリストが与えられた場合:[(timeA, key1, value1), (timeB, key1, value2), (timeC, key2, value1)]
  • HDFStore に 2 つの df が必要です。
    • store[key1] = DataFrame([value1, value2], index=[timeA, timeB])
    • store[key2] = DataFrame([value1], index=[timeC])

正しい?

もしそうなら、私がお勧めするのは、次のように、ストアキーで何らかの「フィルタリング」を行い、データフレームを作成してから、データフレーム全体をストアに書き込むことです。

dataTuples = [(0, 'x', 5), (1, 'y', 6), ...]

# initializing the dict of lists, which will become a dict of df's
sortedByStoreKey = {storeKey: [] for idx, storeKey, val in dataTuples}

for idx, storeKey, val in dataTuples:
    sortedByStoreKey[storeKey].append([idx, storeKey]) # appending a 2-list to a list

# this can all be done with dict comprehensions but this is more legible imo
for storeKey, dfContents in sortedByStoreKey.items():
    df = pd.DataFrame(dfContents, columns=['time', 'value'])
    df['time'] = pd.to_datetime(df['time']) # make sure this is read as a pd.DatetimeIndex (as you said you wanted)
    df.set_index('time', inplace=True)
    sortedByStoreKey[storeKey] = df

# now we write full dataframes to HDFStore
with pd.HDFStore('xxx') as store:
    for storeKey, df in sortedByStoreKey.values():
         store[storeKey] = df

行数の点でもリソースの点でも、これを行うためのより効率的な方法があると確信していますが、これが最もpythonicだと思います。オブジェクトが巨大な場合dataTuples(>= RAM など)、答えを変更する必要があるかもしれません。

一般的に言えば、ここでの考え方は、ストアに書き込む前に各データフレームを完全に作成することです。私がここで仕上げているとき、私はあなたが選択したこともできることに気づきました.あなたが見逃しているのは、追加を可能にするテーブル形式でストアを指定する必要があることです. 確かに、一度に 1 行ずつ追加することは、おそらく良い考えではありません。

于 2016-08-30T19:39:23.753 に答える