python - read_csv - Escribiendo iterativamente a tiendas HDF5 en Pandas
read text pandas python (2)
Tan pronto como se ejecute la declaración, por ejemplo,
store[''df''] = df
. Elclose
simplemente cierra el archivo real (que se cerrará para usted si el proceso existe, pero imprimirá un mensaje de advertencia)Lea la sección http://pandas.pydata.org/pandas-docs/dev/io.html#storing-in-table-format
En general, no es una buena idea colocar
.h5
nodos en un archivo.h5
. Probablemente desee agregar y crear un número menor de nodos.Simplemente puede iterar a través de su
.csv
ystore/append
uno por uno. Algo como:for f in files: df = pd.read_csv(f) df.to_hdf(''file.h5'',f,df)
Sería de una manera (creando un nodo separado para cada archivo)
No agregable: una vez que lo escribe, solo puede recuperarlo todo de una vez, por ejemplo, no puede seleccionar una subsección
Si tienes una mesa, entonces puedes hacer cosas como:
pd.read_hdf(''my_store.h5'',''a_table_node'',[''index>100''])
que es como una consulta de base de datos, solo obtiene parte de los datos
Por lo tanto, una tienda no se puede agregar ni consultar, mientras que una tabla es a la vez .
Pandas tiene los siguientes ejemplos sobre cómo almacenar Series
, DataFrames
y Panels
en archivos HDF5:
Preparar algunos datos:
In [1142]: store = HDFStore(''store.h5'')
In [1143]: index = date_range(''1/1/2000'', periods=8)
In [1144]: s = Series(randn(5), index=[''a'', ''b'', ''c'', ''d'', ''e''])
In [1145]: df = DataFrame(randn(8, 3), index=index,
......: columns=[''A'', ''B'', ''C''])
......:
In [1146]: wp = Panel(randn(2, 5, 4), items=[''Item1'', ''Item2''],
......: major_axis=date_range(''1/1/2000'', periods=5),
......: minor_axis=[''A'', ''B'', ''C'', ''D''])
......:
Guárdalo en una tienda:
In [1147]: store[''s''] = s
In [1148]: store[''df''] = df
In [1149]: store[''wp''] = wp
Inspecciona lo que hay en la tienda:
In [1150]: store
Out[1150]:
<class ''pandas.io.pytables.HDFStore''>
File path: store.h5
/df frame (shape->[8,3])
/s series (shape->[5])
/wp wide (shape->[2,5,4])
Cerrar la tienda:
In [1151]: store.close()
Preguntas:
En el código anterior, ¿ cuándo se escriben los datos en el disco ?
Digamos que quiero agregar miles de grandes marcos de datos que viven en archivos
.csv
a un solo archivo.h5
. Tendría que cargarlos y agregarlos al archivo.h5
uno por uno, ya que no puedo permitirme tenerlos todos en la memoria a la vez, ya que ocuparían demasiada memoria. ¿Es esto posible con HDF5? ¿Cuál sería la forma correcta de hacerlo?La documentación de Pandas dice lo siguiente:
"Estas tiendas no se pueden agregar una vez que se escriben (aunque simplemente se eliminan y se vuelven a escribir). Tampoco se pueden consultar ; se deben recuperar en su totalidad".
¿Qué significa no apelable ni cuestionable ? Además, ¿no debería decir una vez cerrado en lugar de escrito ?
Respondiendo a la pregunta 2, con pandas 0.18.0 puedes hacer:
store = pd.HDFStore(''compiled_measurements.h5'')
for filepath in file_iterator:
raw = pd.read_csv(filepath)
store.append(''measurements'', raw, index=False)
store.create_table_index(''measurements'', columns=[''a'', ''b'', ''c''], optlevel=9, kind=''full'')
store.close()
Basado en this parte de los documentos.
Dependiendo de la cantidad de datos que tenga, la creación del índice puede consumir enormes cantidades de memoria. Los documentos de PyTables describen los valores de optlevel .