En este momento estoy importando un CSV
marco de datos bastante grande cada vez que ejecuto el script. ¿Existe una buena solución para mantener ese marco de datos constantemente disponible entre ejecuciones para que no tenga que pasar todo el tiempo esperando que se ejecute el script?
317
Respuestas:
La forma más fácil es encurtirlo usando
to_pickle
:Luego puedes volver a cargarlo usando:
Nota: antes de 0.11.1
save
yload
eran la única forma de hacerlo (ahora están en desuso a favorto_pickle
yread_pickle
respectivamente).Otra opción popular es usar HDF5 ( pytables ) que ofrece tiempos de acceso muy rápidos para grandes conjuntos de datos:
Las estrategias más avanzadas se discuten en el libro de cocina .
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 de Python / texto pesado (vea esta pregunta ).
fuente
Aunque ya hay algunas respuestas, encontré una buena comparación en la que intentaron varias formas de serializar Pandas DataFrames: almacenar eficientemente Pandas DataFrames .
Ellos comparan:
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:
El código fuente de la prueba a la que se refieren está disponible en línea . Como 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 categóricos , la serialización es mucho más rápida. En su prueba aproximadamente 10 veces más rápido (también vea 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
usa una representación ASCII imprimible, que genera conjuntos de datos más grandes. Sin embargo, como se puede ver en el gráfico, utilice el formato de datos binarios más reciente (versión 2,pickle-p2
) tiene tiempos de carga mucho más bajos.Algunas otras referencias:
numpy.fromfile
es el más rápido.fuente
.to_pickle()
(que usa almacenamiento binario) contra.to_hdf()
(sin compresión). El objetivo era la velocidad, el tamaño del archivo para HDF era 11x Pickle y el tiempo de carga fue 5x Pickle. Mis datos fueron ~ 5k archivos de ~ 7k filas x 6 cols cada uno, en su mayoría numéricos.Si entiendo correctamente, ya está usando,
pandas.read_csv()
pero le gustaría acelerar el proceso de desarrollo para que no tenga que cargar el archivo cada vez que edite su script, ¿es así? Tengo algunas recomendaciones:puede cargar solo una parte del archivo CSV utilizando
pandas.read_csv(..., nrows=1000)
para cargar solo el bit superior de la tabla, mientras realiza el desarrollouse ipython para una sesión interactiva, de modo que mantenga la tabla de pandas en la memoria mientras edita y recarga su script.
convertir el csv a una tabla HDF5
uso actualizado
DataFrame.to_feather()
ypd.read_feather()
para almacenar datos en el formato binario de plumas 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 datos de cadena).También puede interesarle esta respuesta en stackoverflow.
fuente
to_feather
qué funcionaría bien en datos de cadena? Yo como punto de referenciato_pickle
yto_feature
en mi trama de datos numéricos y de la salmuera es aproximadamente 3 veces más rápido.¡Pickle funciona bien!
fuente
.pkl
como se sugiere en la respuesta de @Andy Haydens.Puede usar el archivo de formato de pluma. Es extremadamente rapido.
fuente
R
utilizando lafeather
biblioteca.Pandas DataFrames tiene la
to_pickle
función que es útil para guardar un DataFrame:fuente
Como ya se mencionó, hay diferentes opciones y formatos de archivo ( HDF5 , JSON , CSV , parquet , SQL ) para almacenar un marco de datos. Sin embargo,
pickle
no es un ciudadano de primera clase (dependiendo de su configuración), porque:pickle
Es un riesgo potencial de seguridad. Forme la documentación de Python para pickle :pickle
es lento. Encuentre aquí y aquí puntos de referencia.Dependiendo de su configuración / uso, ambas limitaciones no se aplican, pero no recomendaría
pickle
como la persistencia predeterminada para los marcos de datos de pandas.fuente
Los formatos de archivo Numpy son bastante rápidos para datos numéricos
Prefiero usar archivos numpy ya que son rápidos y fáciles de trabajar. Aquí hay un punto de referencia simple para guardar y cargar un marco de datos con 1 columna de 1 millón de puntos.
usando la
%%timeit
función mágica de ipythonla salida es
cargar los datos nuevamente en un marco de datos
la salida es
¡NO ESTÁ MAL!
CONTRAS
Hay un problema si guarda el archivo numpy con python 2 y luego intenta abrirlo con python 3 (o viceversa).
fuente
https://docs.python.org/3/library/pickle.html
Los formatos de protocolo de pickle:
La versión 0 del protocolo es el protocolo original "legible para humanos" y es compatible con versiones anteriores de Python.
La versión 1 del protocolo es un formato binario antiguo que también es compatible con versiones anteriores de Python.
La versión 2 del protocolo se introdujo en Python 2.3. Proporciona una preparación mucho más eficiente de las clases de estilo nuevo. Consulte la PEP 307 para obtener información sobre las mejoras aportadas por el protocolo 2.
Se agregó la versión 3 del protocolo en Python 3.0. Tiene soporte explícito para objetos de bytes y Python 2.x no puede desenredarlo. Este es el protocolo predeterminado y el protocolo recomendado cuando se requiere compatibilidad con otras versiones de Python 3.
Se agregó la versión 4 del protocolo en Python 3.4. Agrega soporte para objetos muy grandes, decapado de más tipos de objetos y algunas optimizaciones de formato de datos. Consulte PEP 3154 para obtener información sobre las mejoras aportadas por el protocolo 4.
fuente
compatibilidad de pyarrow entre versiones
El movimiento general ha sido a pyarrow / feather (advertencias de desaprobación de pandas / msgpack). Sin embargo, tengo un desafío con pyarrow con transitorios en la especificación. Los datos serializados con pyarrow 0.15.1 no se pueden deserializar con 0.16.0 ARROW-7961 . Estoy usando la serialización para usar redis, así que tengo que usar una codificación binaria.
He vuelto a probar varias opciones (usando el cuaderno jupyter)
Con los siguientes resultados para mi marco de datos (en
out
variable jupyter)la pluma y el parquet no funcionan para mi marco de datos. Voy a seguir usando pyarrow. Sin embargo, lo complementaré con pepinillo (sin compresión). Al escribir en caché, almacene los formularios serializados de pyarrow y pickle. Al leer desde la memoria caché de reserva para encurtir si falla la deserialización de pyarrow.
fuente
El formato depende de su caso de uso.
La comparación de los formatos de archivo pandas se encuentra en este video .
fuente