pandas.HDFStore: как мне изменить "data_columns" для существующего хранилища? Я хотел бы добавить индекс для столбца не в столбцах данных

Я создал большой (120 ГБ; 1 миллиард строк) файл HDF5 с помощью панд. После первоначального создания файла hdf, я добавил в файл так:

with pd.get_store(path_output) as hdf_output:
  for i in range(BIG_LOOP):
    df = ...
    hdf_output.append('all', df, data_columns=[])

Я специально установил data_columns=[], чтобы избежать индексации во время создания. Теперь, когда у меня есть файл HDF, я бы хотел добавить индексы к нескольким столбцам (скажем, columns_to_index=['A', 'B', 'C'])

Каким-то образом, согласно ptdump у меня есть data_columns:=['A'] на данный момент, но я не помню, как это случилось. (Возможно, исходный df был написан с другим параметром (я последовательно добавлял в hdfstore в течение нескольких дней и, возможно, что-то изменил). В любом случае, независимо от того, как это было создано, я бы хотел проиндексировать дополнительные колонны.

Просто звоню mystore.create_table_index('all', columns=['A', 'B', 'C'], optlevel=9, kind='full') не работает, по-видимому. В первый раз, когда я запустил его, он сжался в течение часа и добавил 2 ГБ к размеру файла (проверка метаданных показывает, что размер порции был увеличен), но у меня нет всех 3 индексов (только индекс для "А"). Как я могу сгенерировать индекс для всех 3 столбцов?

Я также заметил эту строку в ptdump - меня беспокоит то, что у меня есть "non_index_axes" для элементов, которые я хочу проиндексировать: non_index_axes := [(1, ['A', 'B', 'C'])]

Если не представляется возможным создать индекс в пандах, я был бы признателен за совет, как сделать это непосредственно в Pytables. (например, нужно ли мне сначала удалить какие-либо существующие индексы? и как мне изменить "non_index_axes" и "data_coumns")

Изменить: Предвосхищая вопросы о моем случае использования, вот общая картина того, что я пытаюсь сделать:

  1. Прочитайте в 120 ГБ данных из файлов CSV. Каждый файл представляет один день финансовых данных и состоит из 100000 строк, около дюжины столбцов в строке. Я просто храню каждую строку последовательно в файле HDF5. Я бы хотел, чтобы этот начальный этап прошел быстро, поэтому я отключил индексирование. В настоящее время я читаю и анализирую каждый файл CSV за 6 секунд, а сохранение в файл HDF5, как указано выше, занимает всего 1,5 секунды.

  2. Индексируйте несколько (не все) столбцов для поддержки различных запросов, таких как получение всех элементов с заданной строкой в ​​столбце 1 и датой из столбца 2 в определенном диапазоне.

  3. Со временем я каждый день буду анализировать новый файл CSV и добавлять его в файл HDF5. Я ожидаю, что индексы продолжат обновляться.

  4. (В зависимости от моих шаблонов доступа порядок, в котором я храню строки (в настоящее время, по дате), может по-прежнему оставаться наилучшим порядком для поиска. Мне также может понадобиться сортировка по другому столбцу в большинстве запросов, и в этом случае я думаю, Мне нужно будет заново отсортировать таблицу после того, как каждый файл CSV будет проанализирован и добавлен.)

В настоящее время я застрял на шаге 2, генерируя индексы столбцов.

1 ответ

Решение

Я бы сделал это немного по-другому - взгляните на этот небольшой пример:

for chunk in ...  # reading data in chunks:
    # specify `data_columns`, but don't index (`index=False`)
    hdf_output.append('all', chunk, data_columns=[cols_to_index], index=False)

# index columns explicitly     
hdf_output.create_table_index(hdf_key, columns=cols_to_index, optlevel=9, kind='full')
Другие вопросы по тегам