2010-10-26 15 views
6

Recientemente me encontré con Pytables y me pareció genial. Está claro que son superiores a un formato csv para conjuntos de datos muy grandes. Estoy ejecutando algunas simulaciones usando Python. La salida no es tan grande, digamos 200 columnas y 2000 filas.Pytables vs. CSV para archivos que no son muy grandes

Si alguien tiene experiencia con ambos, ¿puede sugerir qué formato sería más conveniente a largo plazo para esos conjuntos de datos que no son muy grandes? Pytables tiene capacidades de manipulación de datos y navegación de los datos con Vitables, pero el navegador no tiene tanta funcionalidad como, por ejemplo, Excel, que se puede usar para CSV. De manera similar, ¿encuentra uno mejor que el otro para importar y exportar datos, si trabaja principalmente en python? ¿Es uno más conveniente en términos de organización de archivos? Cualquier comentario sobre problemas como estos sería útil.

Gracias.

+1

Probablemente dependa de lo que esté haciendo con los datos, es decir, cómo define la conveniencia. ¿Quiere usted 1. Ver los datos con un buen editor visual siempre que lo desee? 2. ¿Puede verificar los datos visualmente y luego pasarlos a otro programa? Si quiere la primera y necesita esa funcionalidad para 'ver' los datos, entonces el formato csv probablemente no sea una mala elección. Dado 2, las pytables probablemente sean buenas. En cualquier caso, sus datos son pequeños, ¿por qué no guardar ambos? – Marm0t

Respuesta

5

¿Ha considerado las matrices de Numpy?

Las PyTables son maravillosas cuando sus datos son demasiado grandes para caber en la memoria, pero una matriz 200x2000 de flotantes de 8 bytes solo requiere aproximadamente 3MB de memoria. Así que creo que las PyTables pueden ser exageradas.

Puede guardar matrices numpy a archivos usando np.savetxt o np.savez (por compresión), y puede leerlos de archivos con np.loadtxt o np.load.

Si tiene muchas de estas matrices para almacenar en el disco, entonces le sugiero que utilice una base de datos en lugar de numpy .npz archivos. Por cierto, para almacenar una matriz 200x2000 en una base de datos, sólo tiene 3 columnas de las tablas: fila, columna, valor:

import sqlite3 
import numpy as np 

db = sqlite3.connect(':memory:') 
cursor = db.cursor() 
cursor.execute('''CREATE TABLE foo 
        (row INTEGER, 
        col INTEGER, 
        value FLOAT, 
        PRIMARY KEY (row,col))''') 
ROWS=4 
COLUMNS=6 
matrix = np.random.random((ROWS,COLUMNS)) 
print(matrix) 
# [[ 0.87050721 0.22395398 0.19473001 0.14597821 0.02363803 0.20299432] 
# [ 0.11744885 0.61332597 0.19860043 0.91995295 0.84857095 0.53863863] 
# [ 0.8.52689885 0.05861043 0.71784406 0.20222138 0.63094807] 
# [ 0.01309897 0.45391578 0.04950273 0.93040381 0.41150517 0.66263562]] 

# Store matrix in table foo 
cursor.executemany('INSERT INTO foo(row, col, value) VALUES (?,?,?) ', 
        ((r,c,value) for r,row in enumerate(matrix) 
           for c,value in enumerate(row))) 

# Retrieve matrix from table foo 
cursor.execute('SELECT value FROM foo ORDER BY row,col') 
data=zip(*cursor.fetchall())[0] 
matrix2 = np.fromiter(data,dtype=np.float).reshape((ROWS,COLUMNS)) 
print(matrix2) 
# [[ 0.87050721 0.22395398 0.19473001 0.14597821 0.02363803 0.20299432] 
# [ 0.11744885 0.61332597 0.19860043 0.91995295 0.84857095 0.53863863] 
# [ 0.8.52689885 0.05861043 0.71784406 0.20222138 0.63094807] 
# [ 0.01309897 0.45391578 0.04950273 0.93040381 0.41150517 0.66263562]] 

Si usted tiene muchos de estos 200x2000 matrices, sólo tiene una columna más tabla para especificar qué matriz.

+0

Esto suena interesante. No sé mucho sobre las bases de datos, pero investigaré esto y publicaré de nuevo. Lo que no me queda claro de su ejemplo es que cómo se están asignando las coordenadas de cada valor en la matriz de 2000 filas x 200 columnas a la tabla de la base de datos. Trataré de resolver eso. – Curious2learn

+0

No creo que use una columna 'id' separada para la clave principal. la fila/columna hace una clave primaria mucho mejor, ya que realmente es la identificación para ese bit de datos. para una matriz de 2000x2000, incluso podría ser inteligente y empacar tanto la fila como la columna en la misma columna de enteros, algo así como 'row << 16 + col'. – SingleNegationElimination

+0

@TokenMacGuy: ¡Gracias! – unutbu

0

Estas no son opciones "exclusivas".

Necesita ambos.

CSV es solo un formato de intercambio de datos. Si usa Pytables, aún necesita importar y exportar en formato CSV.

+0

¿Puedes por favor elaborar? No necesito crear archivos CSV para usar las tablas. ¡Gracias! – Curious2learn

+0

Debe crear CSV para intercambiar datos con aplicaciones que solo aceptan CSV. Hojas de cálculo, por ejemplo. –

2

En lo que respecta a la importación/exportación, PyTables usa un formato de archivo estandarizado llamado HDF5. Muchos paquetes de software científico (como MATLAB) tienen soporte integrado para HDF5, y la API C no es terrible. Por lo tanto, cualquier información que necesite exportar o importar a uno de estos idiomas simplemente puede guardarse en archivos HDF5.

PyTables agrega algunos atributos propios, pero estos no deberían perjudicarlo. Por supuesto, si almacena objetos de Python en el archivo, no podrá leerlos en otro lugar.

Lo bueno de los archivos CSV es que son legibles por humanos. Sin embargo, si necesita almacenar algo que no sean números simples en ellos y comunicarse con otros, tendrá problemas. Recibo archivos CSV de personas de otras organizaciones, y he notado que los humanos no somos buenos para asegurarnos de que las citas de cuerdas se hagan correctamente. Es bueno que el analizador de CSV de Python sea tan flexible como lo es. Otro problema es que los números de coma flotante no se pueden almacenar exactamente en texto usando formato decimal. Sin embargo, suele ser lo suficientemente bueno.

+0

¡Gracias por los comentarios! Diría que con ViTables, incluso las PyTables se vuelven legibles para los humanos. – Curious2learn

+0

ViTables es genial. PERO, es un poco doloroso de instalar (hasta tal vez recientemente). –

+0

flotantes * puede * almacenarse exactamente en decimal ascii, pero requiere bastantes dígitos decimales para hacerlo. Sin embargo, a menudo este no es el valor predeterminado para el formato de cadenas de flotantes. – SingleNegationElimination

1

Creo que es muy difícil conseguir pytables y csv .. pyTable es una estructura de datos ehile CSV es un formato de intercambio de datos.

1

Esto es realmente muy relacionado con otra respuesta que he proporcionado en relación con los archivos CSV de lectura/escritura w/numpy:

Python: how to do basic data manipulation like in R?

Usted debe definitivamente uso numpy, no importa qué otra cosa! La facilidad de indexación, etc. supera con creces el costo de la dependencia adicional (bueno, eso creo). PyTables, por supuesto, también depende del numpy.

De lo contrario, realmente depende de su aplicación, su hardware y su audiencia. Sospecho que leer en archivos csv del tamaño del que se habla no importará en términos de velocidad en comparación con PyTables. Pero si eso es una preocupación, ¡escribe un punto de referencia! Lee y escribe algunos datos aleatorios 100 veces. O, si los tiempos de lectura importan más, escriba una vez, lea 100 veces, etc.

Sospecho que PyTables superará a SQL. SQL funcionará en consultas complejas de tablas múltiples (especialmente si realiza las mismas con frecuencia), pero incluso en consultas de tablas de una sola tabla (denominadas "desnormalizadas"), las tablas es difícil de superar en términos de velocidad. No puedo encontrar una referencia para el receso de la mano, pero es posible que pueda cavar algo que mina si los enlaces aquí:

http://www.pytables.org/moin/HowToUse#HintsforSQLusers

supongo ejecutar el rendimiento para que en esta etapa, pálido en comparación con el rendimiento del codificador. ¡Entonces, sobre todo, elija algo que tenga más sentido para usted!

Otros puntos:

Al igual que con SQL, PyTables tiene una función de deshacer. Los archivos CSV no tendrán esto, pero puede mantenerlos en control de versiones, y su VCS no necesita ser demasiado inteligente (los archivos CSV son texto).

En una nota relacionada, los archivos CSV serán mucho más grandes que los formatos binarios (sin duda puede escribir sus propias pruebas para esto).

2

Una gran ventaja para PyTables es el almacenamiento de metadatos, como variables, etc. Si ejecuta las simulaciones más a menudo con diferentes parámetros, almacene los resultados como una entrada de matriz en el archivo h5.

Lo usamos para almacenar datos de medición + secuencias de comandos de experimento para obtener los datos para que todo sea independiente.

BTW: si necesita examinar rápidamente un archivo hdf5, puede utilizar HDFView. Es una aplicación Java gratis del HDFGroup. Es fácil de instalar.

Cuestiones relacionadas