Python - обновить таблицу HDF5 с помощью мультииндекс - PullRequest
0 голосов
/ 30 сентября 2019

Я хочу обновить данные в таблице HDF с мультииндексом. Одним из методов может быть перезапись существующего хранилища, но это может быть дорого для больших таблиц. Другой подход может быть следующим:

  • Удалить данные из хранилища HDF, где мультииндекс равен мультииндексу таблицы обновлений (=> store.remove)

  • Вставьте новые данные в HDF Store (=> store.append). Проблема в том, что я не могу найти способ выбора мультииндекса.

Мне нужно что-то вродеэто:

store.remove('table_name', where="index in df_update.index")

Есть ли способ выбрать мультииндекс из магазина HDF? Каков наиболее эффективный способ обновления и вставки данных в хранилище HDF с мультииндексом?

Вот рабочий пример, когда хранилище перезаписывается, что может быть дорого:

import numpy as np
import pandas as pd

# creating a dataframe
df = (pd.DataFrame({'symbol':    ['A','A','A','B','B','B','C','C','C','C'],
                    'date':    pd.date_range(pd.datetime.today(), periods=10).date.tolist(),
                    'A':    np.random.randint(10, 100, 10).astype(np.int64)*10,
                    'B':   np.random.randint(100, 1000, 10).astype(np.int64)*10})
                    .set_index(['symbol', 'date']))

# creating a HDF5 file
filename = 'test_file.h5'
store = pd.HDFStore(filename, mode='a', complib='blosc',complevel=9)

# adding dataframe to the HDF5 file
# data_columns can take a list of data types
store.put('table_name', df, format='table', data_columns=True, append=False)

# print the initial table
df_hdf = store['table_name']
print('original table:')
print(df_hdf)


# table to update and insert into existing data
df_update = (pd.DataFrame({'symbol':    ['A','A','A','B','B','B','C','C','C','C'],
                            'date':    pd.date_range(pd.datetime.today()+pd.Timedelta(days=2), periods=10).date.tolist(),
                            'A':    np.random.randint(1, 10, 10).astype(np.int64),
                            'B':    np.random.randint(1, 10, 10).astype(np.int64)})
                            .set_index(['symbol', 'date']))

# merge data into store            <<<< here is the upsert operation
store['table_name'] = df_update.combine_first(store['table_name'])

# print the updated table
df_hdf = store['table_name']
print('updated table:')
print(df_hdf)

# close HDF5 file
store.close()
...