2016-10-15 8 views
2

Я пытаюсь запросить таблицу с несколькими индексами в хранилище HDF в pandas, но это не удается при использовании запроса по индексу и data_columns в одно и то же время. Это происходит только тогда, когда data_columns=True. Любая идея, если это ожидается, или как избежать, если я не хочу явно указывать data_columns?Проблемы с запросом таблицы multiindex в HDF при использовании data_columns

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

import pandas as pd 
import numpy as np 

file_path = 'D:\\test_store.h5' 
np.random.seed(1234) 
pd.set_option('display.max_rows',4) 
# simulate some data 
index = pd.MultiIndex.from_product([np.arange(10000,10200), 
            pd.date_range('19800101',periods=500)], 
            names=['id','date']) 
df = pd.DataFrame(dict(id2=np.random.randint(0, 1000, size=len(index)), 
         w=np.random.randn(len(index))), 
        index=index).reset_index().set_index(['id', 'date']) 

# store the data 
store = pd.HDFStore(file_path,mode='a',complib='blosc', complevel=9) 
store.append('df_dc_None', df, data_columns=None) 
store.append('df_dc_explicit', df, data_columns=['id2', 'w']) 
store.append('df_dc_True', df, data_columns=True) 
store.close() 

# query the data 
start = '19810201' 
print(pd.read_hdf(file_path,'df_dc_None', where='date>start & id=10000')) 
print(pd.read_hdf(file_path,'df_dc_True', where='id2>500')) 
print(pd.read_hdf(file_path,'df_dc_explicit', where='date>start & id2>500')) 
try: 
    print(pd.read_hdf(file_path,'df_dc_True', where='date>start & id2>500')) 
except ValueError as err: 
    print(err) 

ответ

2

Это интересный вопрос, на самом деле!

Я не могу объяснить следующее различие (почему мы должны индексировать столбцы индексируются при использовании data_columns=None (по умолчанию из-за docstring метода HDFStore.append), и мы не имеем их индексировать при использовании data_columns=True):

In [114]: store.get_storer('df_dc_None').table 
Out[114]: 
/df_dc_None/table (Table(100000,), shuffle, blosc(9)) '' 
    description := { 
    "index": Int64Col(shape=(), dflt=0, pos=0), 
    "values_block_0": Int32Col(shape=(1,), dflt=0, pos=1), 
    "values_block_1": Float64Col(shape=(1,), dflt=0.0, pos=2), 
    "date": Int64Col(shape=(), dflt=0, pos=3), 
    "id": Int64Col(shape=(), dflt=0, pos=4)} 
    byteorder := 'little' 
    chunkshape := (1820,) 
    autoindex := True 
    colindexes := { 
    "date": Index(6, medium, shuffle, zlib(1)).is_csi=False, 
    "id": Index(6, medium, shuffle, zlib(1)).is_csi=False, 
    "index": Index(6, medium, shuffle, zlib(1)).is_csi=False} 

In [115]: store.get_storer('df_dc_True').table 
Out[115]: 
/df_dc_True/table (Table(100000,), shuffle, blosc(9)) '' 
    description := { 
    "index": Int64Col(shape=(), dflt=0, pos=0), 
    "values_block_0": Int64Col(shape=(1,), dflt=0, pos=1), 
    "values_block_1": Int64Col(shape=(1,), dflt=0, pos=2), 
    "id2": Int32Col(shape=(), dflt=0, pos=3), 
    "w": Float64Col(shape=(), dflt=0.0, pos=4)} 
    byteorder := 'little' 
    chunkshape := (1820,) 
    autoindex := True 
    colindexes := { 
    "w": Index(6, medium, shuffle, zlib(1)).is_csi=False, 
    "index": Index(6, medium, shuffle, zlib(1)).is_csi=False, 
    "id2": Index(6, medium, shuffle, zlib(1)).is_csi=False} 

ПРИМЕЧАНИЕ: обратите внимание на colindexes на выход выше.

Но используя следующий простой хак можно «исправить» это:

In [116]: store.append('df_dc_all', df, data_columns=df.head(1).reset_index().columns) 

In [118]: store.get_storer('df_dc_all').table 
Out[118]: 
/df_dc_all/table (Table(100000,), shuffle, blosc(9)) '' 
    description := { 
    "index": Int64Col(shape=(), dflt=0, pos=0), 
    "id": Int64Col(shape=(), dflt=0, pos=1), 
    "date": Int64Col(shape=(), dflt=0, pos=2), 
    "id2": Int32Col(shape=(), dflt=0, pos=3), 
    "w": Float64Col(shape=(), dflt=0.0, pos=4)} 
    byteorder := 'little' 
    chunkshape := (1820,) 
    autoindex := True 
    colindexes := { 
    "w": Index(6, medium, shuffle, zlib(1)).is_csi=False, 
    "date": Index(6, medium, shuffle, zlib(1)).is_csi=False, 
    "id": Index(6, medium, shuffle, zlib(1)).is_csi=False, 
    "index": Index(6, medium, shuffle, zlib(1)).is_csi=False, 
    "id2": Index(6, medium, shuffle, zlib(1)).is_csi=False} 

проверка:

In [119]: pd.read_hdf(file_path,'df_dc_all', where='date>start & id2>500') 
Out[119]: 
        id2   w 
id date 
10000 1981-02-02 935 0.245637 
     1981-02-04 994 0.291287 
...    ...  ... 
10199 1981-05-11 680 -0.370745 
     1981-05-12 812 -0.880742 

[10121 rows x 2 columns] 
+1

Спасибо за хака, я подозреваю, что это не должно быть. Я поднял вопрос с пандами, посмотрю, что они говорят. Наверное, мы можем закрыть это здесь. –

+0

@MMCM_, да, интересно, что скажут об этом основной команде Pandas - я буду следить за вашей проблемой на GitHub ... – MaxU

+0

похоже, что они исправит это. –