2016-10-15 1 views
2

Je tente d'interroger une table multi-index dans un magasin HDF pandas, mais elle échoue lors de l'utilisation d'une requête sur l'index et sur data_columns en même temps. Cela se produit uniquement lorsque data_columns=True. Toute idée si cela est prévu, ou comment éviter si je ne veux pas explicitement spécifier les colonnes data_columns?Problèmes lors de l'interrogation d'une table multi-index dans HDF lors de l'utilisation de data_columns

Voir l'exemple suivant, il semble qu'il ne reconnaît pas l'indice de référence valable:

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) 

Répondre

2

Il est une question intéressante, en effet!

Je ne peux pas expliquer la différence suivante (pourquoi nous avons des colonnes d'index indexés lors de l'utilisation data_columns=None (par défaut en raison de la docstring de la méthode HDFStore.append) et nous ne les avons pas indexé lors de l'utilisation 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} 

REMARQUE: faites attention à colindexes dans la sortie ci-dessus.

Mais en utilisant le hack simple suivant nous pouvons "réparer" ceci:

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} 

chèque:

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

Merci pour le hack, je soupçonne que ce n'est pas censé être comme ça. J'ai soulevé un problème avec les pandas, je verrai ce qu'ils disent. Je suppose que nous pouvons fermer celui-ci ici. –

+0

@MMCM_, oui, c'est intéressant ce que dira l'équipe de base de Pandas à ce sujet - je surveillerai votre problème sur GitHub ... – MaxU

+0

semble comme ils vont le réparer. –