Подтвердить что ты не робот

Итеративно записывая в магазины HDF5 в Pandas

Pandas содержит следующие примеры хранения Series, DataFrames и Panels в файлах HDF5:

Подготовьте некоторые данные:

In [1142]: store = HDFStore('store.h5')

In [1143]: index = date_range('1/1/2000', periods=8)

In [1144]: s = Series(randn(5), index=['a', 'b', 'c', 'd', 'e'])

In [1145]: df = DataFrame(randn(8, 3), index=index,
   ......:                columns=['A', 'B', 'C'])
   ......:

In [1146]: wp = Panel(randn(2, 5, 4), items=['Item1', 'Item2'],
   ......:            major_axis=date_range('1/1/2000', periods=5),
   ......:            minor_axis=['A', 'B', 'C', 'D'])
   ......:

Сохраните его в хранилище:

In [1147]: store['s'] = s

In [1148]: store['df'] = df

In [1149]: store['wp'] = wp

Проверьте, что в магазине:

In [1150]: store
Out[1150]: 
<class 'pandas.io.pytables.HDFStore'>
File path: store.h5
/df            frame        (shape->[8,3])  
/s             series       (shape->[5])    
/wp            wide         (shape->[2,5,4])

Закройте магазин:

In [1151]: store.close()

Вопросы:

  • В приведенном выше коде , когда данные фактически записаны на диск?

  • Скажем, я хочу добавить тысячи больших файлов данных, живущих в файлах .csv, в один файл .h5. Мне нужно будет загрузить их и добавить их в файл .h5 один за другим, так как я не могу позволить себе их все в памяти сразу, так как они занимают слишком много памяти. Возможно ли это с HDF5? Каким будет правильный способ сделать это?

  • Документация Pandas гласит следующее:

    "Эти магазины не являются добавочными после написания (хотя вы просто удалить их и переписать). Они также не являются запросами; они должны быть полностью восстановлены".

    Что это означает, что недоступен и не запрашивается? Кроме того, не следует ли говорить один раз закрытый вместо написанный?

4b9b3361

Ответ 1

  • Как только вызывается выражение, например store['df'] = df. close просто закрывает фактический файл (который будет закрыт для вас, если процесс существует, но выведет предупреждение)

  • Прочтите раздел http://pandas.pydata.org/pandas-docs/dev/io.html#storing-in-table-format

    Как правило, не рекомендуется размещать LOT узлов в файле .h5. Возможно, вы захотите добавить и создать меньшее количество узлов.

    Вы можете просто перебирать свои .csv и store/append их по одному. Что-то вроде:

    for f in files:
      df = pd.read_csv(f)
      df.to_hdf('file.h5',f,df)
    

    Будет один способ (создание отдельного node для каждого файла)

  • Не добавляется - как только вы его запишете, вы можете получить его только сразу, например. вы не можете выбрать подраздел

    Если у вас есть таблица, вы можете делать такие вещи, как:

    pd.read_hdf('my_store.h5','a_table_node',['index>100'])
    

    который похож на запрос базы данных, только получая часть данных

    Таким образом, хранилище не является добавочным и не запрашивается, а таблица -.

Ответ 2

Отвечая на вопрос 2, pandas 0.18.0 вы можете сделать:

store = pd.HDFStore('compiled_measurements.h5')
for filepath in file_iterator:
    raw = pd.read_csv(filepath)
    store.append('measurements', raw, index=False)

store.create_table_index('measurements', columns=['a', 'b', 'c'], optlevel=9, kind='full')
store.close()

На основе этой части документов.

В зависимости от того, сколько данных у вас есть, создание индекса может потреблять огромные объемы памяти. В документах PyTables описываются значения optlevel.