Итеративно записывая в магазины 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 гласит следующее:
"Эти магазины не являются добавочными после написания (хотя вы просто удалить их и переписать). Они также не являются запросами; они должны быть полностью восстановлены".
Что это означает, что недоступен и не запрашивается? Кроме того, не следует ли говорить один раз закрытый вместо написанный?
Ответы
Ответ 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.