2016-08-30 4 views
0

これに似た質問がありますが、私のデータフレームがHDFStoreの内部にある場合を処理するものはありません。キー/値のペアのリストを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に割り当てることもできます。私はどういうわけかこの方法でメモリーを節約するという誤った考え方をしていました。おそらく私もそれについて間違っています。

+0

「タイムスタンプ/キー/値」データセットのサンプルを提供できますか?どのような形式でそれらを入手していますか? – MaxU

+0

私はそれを意図的に少し愚かにした。データそのものは、バイオメトリックセンサーを使用して人体から取得したタイムスタンプおよび測定値を含むプロトタイプレコードの繰り返し可能なものです。私が望むのは、メトリックごとのデータフレームです。タイムラインとタイムスタンプにインデックスされた値の2つの基本的な列です。次に、これらのデータフレームをすべて1つのHDFStoreに配置します。私の選択ではなく、研究者が望むものです。 – izak

答えて

0

私はいくつかの説明を得るためにコメントしたいと思いますが、まだ担当者はいません。もう少し文脈がなければ、あなたのアプローチが賢明であるかどうかは私が言うのは難しいですが、私はほとんどすべての場合にノーと言う傾向があります。反復可能オブジェクトのリスト

  • を考える:私は間違っているんだけど、あなたが何をしようとしていることであるなら、私を修正してあなたがHDFStore、二つのDFのを望む[(timeA, key1, value1), (timeB, key1, value2), (timeC, key2, value1)]
  • 場所:
    • 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 

私はかなり行数とリソースの両方でこれを行うより効率的な方法があると確信していますが、これが私を最も無邪気なものとして襲っています。 dataTuplesオブジェクトが巨大な場合(> = RAMなど)、私の答えは変更する必要があります。

一般的に言えば、ここでのアイデアは、ストアに書き込む前に各データフレームを完全に作成することです。私がここまで仕上げているので、あなたもあなたが選んだことをやることができることを認識しています。欠けている部分は、追加を可能にするtable formatで店を指定する必要があります。確かに、一度に1つの行を追加することは、おそらく良い考えではありません。

+0

私は疑わしいものを確認します。他の構造でデータフレームを収集し、後でそれらをHDFに入れます。私はそれを避けようとしていました。なぜなら、数百メガバイトのデータセットについて話しているからです。ああ、最初に動作させ、後でそれを改善してください。 – izak

+0

まあ、MBについて話しているのですが、比較的近代的なコンピュータを使っているなら問題はありません。フィルタリングするストアキーがたくさんある場合は、それが問題になる可能性があります。あなたが考えていた行に沿って、[追加](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.HDFStore.append.html#pandas.HDFStore.append)か[put ](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.HDFStore.put.html#pandas.HDFStore.put)メソッドを使用してください。これらの場合、1行のdfを作成してセル値そのものではなく、それらのメソッドに渡します – StarFox

関連する問題