2

選択しようとしている pandas HDFStore があります。大きな np.array の id を持つ 2 つのタイムスタンプの間でデータを選択したいと思います。次のコードは機能しますが、リスト内のメンバーシップを照会した場合にのみメモリを大量に消費します。datetimeindex と範囲を使用すると、メモリ使用量が 95% 少なくなります。

#start_ts, end_ts are timestamps
#instruments is an array of python objects

not_memory_efficient = adj_data.select("US", [Term("date",">=", start_ts),
                              Term("date", "<=", end_ts),
                              Term("id", "=", instruments)])
memory_efficient = adj_data.select("US", [Term("date",">=", start_ts),
                              Term("date", "<=", end_ts),)

HDFStore でこれを行うメモリ効率の良い方法はありますか? インデックスを「sec_id」に設定する必要がありますか? (chunksize オプションを使用して自分で連結することもできますが、これはちょっとハックのようです。)

編集:

hdfstore は、pd.HDFStore によってデータフレームを作成し、このように格納することによって作成されます。さっき間違えた

def write_data(country_data, store_file):
    for country in country_data:
        if len(country_data[country]) == 0:
            continue
        df = pd.concat(country_data[country], ignore_index=True)
        country_data[country] = []
        store_file.append(country, df, format="t")

リクエストに応じて、このテーブルの ptdump を次に示します: https://gist.github.com/MichaelWS/7980846 また、df を次に示します: https://gist.github.com/MichaelWS/7981451

4

2 に答える 2

3

他のユーザーのためにこれを記念するため。

HDFStore では、特定の列がインデックスでない場合、後でクエリを実行するために、特定の列を data_columns として指定する必要があります。

ドキュメントはこちら

フレームを作成する

In [23]: df = DataFrame(dict(date = pd.date_range('20130101',periods=10), id = list('abcabcabcd'), C = np.random.randn(10)))


In [28]: df
Out[28]: 
          C                date id
0  0.605701 2013-01-01 00:00:00  a
1  0.451346 2013-01-02 00:00:00  b
2  0.479483 2013-01-03 00:00:00  c
3 -0.012589 2013-01-04 00:00:00  a
4 -0.028552 2013-01-05 00:00:00  b
5  0.737100 2013-01-06 00:00:00  c
6 -1.050292 2013-01-07 00:00:00  a
7  0.137444 2013-01-08 00:00:00  b
8 -0.327491 2013-01-09 00:00:00  c
9 -0.660220 2013-01-10 00:00:00  d

[10 rows x 3 columns]

data_columns なしで hdf に保存

In [24]: df.to_hdf('test.h5','df',mode='w',format='table')

0.13 はこのエラーを報告します (0.12 は黙って無視します)。

In [25]: pd.read_hdf('test.h5','df',where='date>20130101 & date<20130105 & id=["b","c"]')
 ValueError: The passed where expression: date>20130101 & date<20130105 & id=["b","c"]
            contains an invalid variable reference
            all of the variable refrences must be a reference to
            an axis (e.g. 'index' or 'columns'), or a data_column
            The currently defined references are: index,columns

すべての列をデータ列として設定します (列の特定のリストにすることもできます)

In [26]: df.to_hdf('test.h5','df',mode='w',format='table',data_columns=True)

In [27]: pd.read_hdf('test.h5','df',where='date>20130101 & date<20130105 & id=["b","c"]')
Out[27]: 
          C                date id
1  0.451346 2013-01-02 00:00:00  b
2  0.479483 2013-01-03 00:00:00  c

[2 rows x 3 columns]

ptdump -av以下は、ファイルのテーブル ノードです。

/df/table (Table(10,)) ''
  description := {
  "index": Int64Col(shape=(), dflt=0, pos=0),
  "C": Float64Col(shape=(), dflt=0.0, pos=1),
  "date": Int64Col(shape=(), dflt=0, pos=2),
  "id": StringCol(itemsize=1, shape=(), dflt='', pos=3)}
  byteorder := 'little'
  chunkshape := (2621,)
  autoindex := True
  colindexes := {
    "date": Index(6, medium, shuffle, zlib(1)).is_csi=False,
    "index": Index(6, medium, shuffle, zlib(1)).is_csi=False,
    "C": Index(6, medium, shuffle, zlib(1)).is_csi=False,
    "id": Index(6, medium, shuffle, zlib(1)).is_csi=False}
  /df/table._v_attrs (AttributeSet), 19 attributes:
   [CLASS := 'TABLE',
    C_dtype := 'float64',
    C_kind := ['C'],
    FIELD_0_FILL := 0,
    FIELD_0_NAME := 'index',
    FIELD_1_FILL := 0.0,
    FIELD_1_NAME := 'C',
    FIELD_2_FILL := 0,
    FIELD_2_NAME := 'date',
    FIELD_3_FILL := '',
    FIELD_3_NAME := 'id',
    NROWS := 10,
    TITLE := '',
    VERSION := '2.7',
    date_dtype := 'datetime64',
    date_kind := ['date'],
    id_dtype := 'string8',
    id_kind := ['id'],
    index_kind := 'integer']

注意すべき重要なことは、data_columns が「説明」で分離されており、インデックスとして設定されていることです。

于 2013-12-16T14:33:17.487 に答える