with - save dataframe python
ptrepack sortby necesita índice ''completo'' (2)
Estoy tratando de ptrepackar un archivo HDF que se creó con pandas HDFStore interfaz de pytables. El índice principal del marco de datos era el tiempo, pero hice algunas columnas más data_columns
para poder filtrar los datos en el disco a través de estos data_columns.
Ahora me gustaría ordenar el archivo HDF por una de esas columnas (porque la selección es demasiado lenta para mi gusto, archivo de 84 GB), usando ptrepack con la opción sortby
como sortby
:
()[maye@luna4 .../nominal]$ ptrepack --chunkshape=auto --propindexes --complevel=9 --complib=blosc --sortby=clat C9.h5 C9_sorted.h5
y recibo el mensaje de error:
() [maye @ luna4 ... / nominal] $ Problemas al hacer la copia de ''C9.h5: /'' a ''C9_sorted.h5: /'' El error fue ->: Field
clat
debe haber asociado un índice ''completo'' en tabla/df/table (Table(390557601,)) ''''
. El archivo de destino se ve así: C9_sorted.h5 (Archivo) '''' Último modif .: ''Fri Jul 26 18:17:56 2013'' Árbol de objetos: / (RootGroup) '''' / df (Group) '''' / df / table ( Table (0,), shuffle, blosc (9)) ''''Trazabilidad (llamada más reciente): Archivo "/ usr / local / epd / bin / ptrepack", línea 10, en sys.exit (main ()) Archivo "/usr/local/epd/lib/python2.7/site -packages / tables / scripts / ptrepack.py ", línea 480, en main upgradeflavors = upgradeflavors) Archivo" /usr/local/epd/lib/python2.7/site-packages/tables/scripts/ptrepack.py ", línea 225, en copyChildren raise RuntimeError ("Compruebe que los nombres de los nodos no sean" RuntimeError: compruebe que los nombres de los nodos no estén duplicados en el destino y, de ser así, agregue el indicador --overwrite-nodes si lo desea. En particular, pague atención que el rootUEP no te está engañando.
¿Esto significa que no puedo ordenar un archivo HDF por una columna de índice porque no son índices "completos"?
Aquí hay un ejemplo completo.
Crea el marco con data_column. Restablece el índice a un índice completo. Usa ptrepack para ordenarlo.
In [16]: df = DataFrame(randn(10,2),columns=list(''AB'')).to_hdf(''test.h5'',''df'',data_columns=[''B''],mode=''w'',table=True)
In [17]: store = pd.HDFStore(''test.h5'')
In [18]: store
Out[18]:
<class ''pandas.io.pytables.HDFStore''>
File path: test.h5
/df frame_table (typ->appendable,nrows->10,ncols->2,indexers->[index],dc->[B])
In [19]: store.get_storer(''df'').group.table
Out[19]:
/df/table (Table(10,)) ''''
description := {
"index": Int64Col(shape=(), dflt=0, pos=0),
"values_block_0": Float64Col(shape=(1,), dflt=0.0, pos=1),
"B": Float64Col(shape=(), dflt=0.0, pos=2)}
byteorder := ''little''
chunkshape := (2730,)
autoIndex := True
colindexes := {
"index": Index(6, medium, shuffle, zlib(1)).is_CSI=False,
"B": Index(6, medium, shuffle, zlib(1)).is_CSI=False}
In [20]: store.create_table_index(''df'',columns=[''B''],optlevel=9,kind=''full'')
In [21]: store.get_storer(''df'').group.table
Out[21]:
/df/table (Table(10,)) ''''
description := {
"index": Int64Col(shape=(), dflt=0, pos=0),
"values_block_0": Float64Col(shape=(1,), dflt=0.0, pos=1),
"B": Float64Col(shape=(), dflt=0.0, pos=2)}
byteorder := ''little''
chunkshape := (2730,)
autoIndex := True
colindexes := {
"index": Index(6, medium, shuffle, zlib(1)).is_CSI=False,
"B": Index(9, full, shuffle, zlib(1)).is_CSI=True}
In [22]: store.close()
In [25]: !ptdump -avd test.h5
/ (RootGroup) ''''
/._v_attrs (AttributeSet), 4 attributes:
[CLASS := ''GROUP'',
PYTABLES_FORMAT_VERSION := ''2.0'',
TITLE := '''',
VERSION := ''1.0'']
/df (Group) ''''
/df._v_attrs (AttributeSet), 14 attributes:
[CLASS := ''GROUP'',
TITLE := '''',
VERSION := ''1.0'',
data_columns := [''B''],
encoding := None,
index_cols := [(0, ''index'')],
info := {''index'': {}},
levels := 1,
nan_rep := b''nan'',
non_index_axes := [(1, [''A'', ''B''])],
pandas_type := b''frame_table'',
pandas_version := b''0.10.1'',
table_type := b''appendable_frame'',
values_cols := [''values_block_0'', ''B'']]
/df/table (Table(10,)) ''''
description := {
"index": Int64Col(shape=(), dflt=0, pos=0),
"values_block_0": Float64Col(shape=(1,), dflt=0.0, pos=1),
"B": Float64Col(shape=(), dflt=0.0, pos=2)}
byteorder := ''little''
chunkshape := (2730,)
autoindex := True
colindexes := {
"index": Index(6, medium, shuffle, zlib(1)).is_csi=False,
"B": Index(9, full, shuffle, zlib(1)).is_csi=True}
/df/table._v_attrs (AttributeSet), 15 attributes:
[B_dtype := b''float64'',
B_kind := [''B''],
CLASS := ''TABLE'',
FIELD_0_FILL := 0,
FIELD_0_NAME := ''index'',
FIELD_1_FILL := 0.0,
FIELD_1_NAME := ''values_block_0'',
FIELD_2_FILL := 0.0,
FIELD_2_NAME := ''B'',
NROWS := 10,
TITLE := '''',
VERSION := ''2.6'',
index_kind := b''integer'',
values_block_0_dtype := b''float64'',
values_block_0_kind := [''A'']]
Data dump:
[0] (0, [1.10989047288066], 0.396613633081911)
[1] (1, [0.0981650001268093], -0.9209780702446433)
[2] (2, [-0.2429293157073629], -1.779366453624283)
[3] (3, [0.7305529521507728], 1.243565083939927)
[4] (4, [-0.1480724789512519], 0.5260130757651649)
[5] (5, [1.2560020435792643], 0.5455842491255144)
[6] (6, [1.20129355706986], 0.47930635538027244)
[7] (7, [0.9973598999689721], 0.8602929579025727)
[8] (8, [-0.40070941088441786], 0.7622228032635253)
[9] (9, [0.35865804118145655], 0.29939126149826045)
Esta es otra forma de crear un índice completamente ordenado (en lugar de escribirlo de esta manera)
In [23]: !ptrepack --sortby=B test.h5 test_sorted.h5
In [26]: !ptdump -avd test_sorted.h5
/ (RootGroup) ''''
/._v_attrs (AttributeSet), 4 attributes:
[CLASS := ''GROUP'',
PYTABLES_FORMAT_VERSION := ''2.1'',
TITLE := '''',
VERSION := ''1.0'']
/df (Group) ''''
/df._v_attrs (AttributeSet), 14 attributes:
[CLASS := ''GROUP'',
TITLE := '''',
VERSION := ''1.0'',
data_columns := [''B''],
encoding := None,
index_cols := [(0, ''index'')],
info := {''index'': {}},
levels := 1,
nan_rep := b''nan'',
non_index_axes := [(1, [''A'', ''B''])],
pandas_type := b''frame_table'',
pandas_version := b''0.10.1'',
table_type := b''appendable_frame'',
values_cols := [''values_block_0'', ''B'']]
/df/table (Table(10,)) ''''
description := {
"index": Int64Col(shape=(), dflt=0, pos=0),
"values_block_0": Float64Col(shape=(1,), dflt=0.0, pos=1),
"B": Float64Col(shape=(), dflt=0.0, pos=2)}
byteorder := ''little''
chunkshape := (2730,)
/df/table._v_attrs (AttributeSet), 15 attributes:
[B_dtype := b''float64'',
B_kind := [''B''],
CLASS := ''TABLE'',
FIELD_0_FILL := 0,
FIELD_0_NAME := ''index'',
FIELD_1_FILL := 0.0,
FIELD_1_NAME := ''values_block_0'',
FIELD_2_FILL := 0.0,
FIELD_2_NAME := ''B'',
NROWS := 10,
TITLE := '''',
VERSION := ''2.6'',
index_kind := b''integer'',
values_block_0_dtype := b''float64'',
values_block_0_kind := [''A'']]
Data dump:
[0] (2, [-0.2429293157073629], -1.779366453624283)
[1] (1, [0.0981650001268093], -0.9209780702446433)
[2] (9, [0.35865804118145655], 0.29939126149826045)
[3] (0, [1.10989047288066], 0.396613633081911)
[4] (6, [1.20129355706986], 0.47930635538027244)
[5] (4, [-0.1480724789512519], 0.5260130757651649)
[6] (5, [1.2560020435792643], 0.5455842491255144)
[7] (8, [-0.40070941088441786], 0.7622228032635253)
[8] (7, [0.9973598999689721], 0.8602929579025727)
[9] (3, [0.7305529521507728], 1.243565083939927)
He probado varias de las opciones que Jeff menciona en nuestras charlas habladas más arriba.
Por favor, eche un vistazo a este cuaderno, con suerte lo ayudará a tomar decisiones relevantes para su almacenamiento de datos: http://nbviewer.ipython.org/810bd0720bb1732067ff La esencia del cuaderno está aquí: https://gist.github.com / michaelaye / 810bd0720bb1732067ff
Mis principales conclusiones:
- Usar index = False tiene varios efectos impresionantes: 1. Reduce el tamaño del archivo HDF resultante. 2. Crea el HDFFile mucho más rápido. 3. Aun así, ptdump y storer (). Group.table print-out no muestra ningún índice, la pantalla de la tienda todavía muestra indexadores y columnas de datos (probablemente esto sea ignorancia de la maquinaria de las pytables de mi lado).
- Crear un índice a través de store.create_table_index () no hace nada aún con la velocidad de selección de datos a través de una de las columnas de datos.
- Este índice TIENE que ser un índice ''completo'', de modo que el ptrepack posterior con --sortby no se libera. Pero NO tiene que ser un índice de nivel 9. El nivel predeterminado 6 está bien, y no parece influir significativamente en la velocidad de selección de datos. ¿Tal vez lo haría con muchas columnas?
- El uso de --propindexes casi duplica el tiempo de ptrepacking con una ligera mejora en la velocidad de selección de datos.
- El uso de compresión y --propindexs es solo un poco más lento que con --propindex solo, mientras que el tamaño de los datos (al menos en este ejemplo) no disminuye drásticamente.
- La velocidad de selección de datos no parece ser muy diferente al haber usado la compresión.
- la aceleración para este ejemplo de 1 mio. líneas de 2 columnas de datos aleatorios con solo usar --sortby sin --propindexes es aproximadamente factor 5 después de ordenar para la columna de selección.
Para completar, el resumen ultracorto de comandos:
df = pd.DataFrame(randn(1e6,2),columns=list(''AB'')).to_hdf(''test.h5'',''df'',
data_columns=list(''AB''),mode=''w'',table=True,index=False)
store = pd.HDFStore(''test.h5'')
store.create_table_index(''df'',columns=[''B''], kind=''full'')
store.close()
Y en el caparazón:
ptrepack --chunkshape=auto --sortby=B test.h5 test_sorted.h5