Nuestro grupo de especialistas despúes de días de investigación y de recopilar de datos, dieron con la solución, nuestro deseo es que todo este artículo sea de utilidad para tu proyecto.
Solución:
La forma más fácil es encurtirlo usando to_pickle
:
df.to_pickle(file_name) # where to save it, usually as a .pkl
Luego puedes volver a cargarlo usando:
df = pd.read_pickle(file_name)
Nota: antes de 0.11.1 save
y load
eran la única manera de hacer esto (ahora están en desuso a favor de to_pickle
y read_pickle
respectivamente).
Otra opción popular es usar HDF5 (pytables) que ofrece tiempos de acceso muy rápidos para grandes conjuntos de datos:
import pandas as pd
store = pd.HDFStore('store.h5')
store['df'] = df # save it
store['df'] # load it
En el libro de cocina se analizan estrategias más avanzadas.
Desde 0.13 también hay msgpack que puede ser mejor para la interoperabilidad, como una alternativa más rápida a JSON, o si tiene datos pesados de objetos/texto de python (vea esta pregunta).
Aunque ya hay algunas respuestas, encontré una buena comparación en la que probaron varias formas de serializar Pandas DataFrames: Efficiently Store Pandas DataFrames.
Ellos comparan:
- salmuera: formato de datos ASCII original
- cPickle, una biblioteca C
- pickle-p2: utiliza el formato binario más reciente
- json: biblioteca json de biblioteca estándar
- json-no-index: como json, pero sin índice
- msgpack: alternativa binaria JSON
- CSV
- hdfstore: formato de almacenamiento HDF5
En su experimento, serializan un DataFrame de 1.000.000 de filas con las dos columnas probadas por separado: una con datos de texto y la otra con números. Su descargo de responsabilidad dice:
No debe confiar en que lo que sigue se generalice a sus datos. Debe mirar sus propios datos y ejecutar puntos de referencia usted mismo
El código fuente de la prueba a la que se refieren está disponible en línea. Dado que este código no funcionó directamente, hice algunos cambios menores, que puede obtener aquí: serialize.py Obtuve los siguientes resultados:
También mencionan que con la conversión de datos de texto a datos categóricos la serialización es mucho más rápida. En su prueba, unas 10 veces más rápido (ver también el código de prueba).
Editar: Los tiempos más altos para pickle que CSV pueden explicarse por el formato de datos utilizado. Por defecto pickle
utiliza una representación ASCII imprimible, que genera conjuntos de datos más grandes. Sin embargo, como se puede ver en el gráfico, pickle usando el formato de datos binarios más nuevo (versión 2, pickle-p2
) tiene tiempos de carga mucho más bajos.
Algunas otras referencias:
- En la pregunta La biblioteca Python más rápida para leer un archivo CSV hay una respuesta muy detallada que compara diferentes bibliotecas para leer archivos csv con un punto de referencia. El resultado es que para leer archivos csv
numpy.fromfile
es el más rápido - Otra prueba de serialización muestra que msgpack, ujson y cPickle son los más rápidos en la serialización.
Si entiendo bien, ya estás usando pandas.read_csv()
pero me gustaría acelerar el proceso de desarrollo para que no tenga que cargar el archivo cada vez que edite su script, ¿no es así? Tengo algunas recomendaciones:
-
podría cargar solo una parte del archivo CSV usando
pandas.read_csv(..., nrows=1000)
para cargar solo la parte superior de la tabla, mientras realiza el desarrollo -
use ipython para una sesión interactiva, de modo que mantenga la tabla pandas en la memoria mientras edita y recarga su script.
-
convertir el csv a una tabla HDF5
-
actualizado utilizar
DataFrame.to_feather()
ypd.read_feather()
para almacenar datos en el formato binario pluma compatible con R que es súper rápido (en mis manos, un poco más rápido quepandas.to_pickle()
en datos numéricos y mucho más rápido en string datos).
También podría estar interesado en esta respuesta en stackoverflow.
Si eres capaz, tienes la habilidad dejar una reseña acerca de qué te ha parecido esta crónica.