Tengo un programa de modelado y puntaje que hace un uso intensivo de la DataFrame.isin
función de los pandas, buscando en las listas de Facebook "me gusta" registros de usuarios individuales para cada uno de unos pocos miles de páginas específicas. Esta es la parte del programa que consume más tiempo, más que las piezas de modelado o puntuación, simplemente porque solo se ejecuta en un núcleo, mientras que el resto se ejecuta en unas pocas docenas simultáneamente.
Aunque sé que podría dividir manualmente el marco de datos en fragmentos y ejecutar la operación en paralelo, ¿hay alguna forma directa de hacerlo automáticamente? En otras palabras, ¿hay algún tipo de paquete que reconozca que estoy ejecutando una operación fácilmente delegada y la distribuya automáticamente? Quizás eso es pedir demasiado, pero en el pasado ya me sorprendió lo que ya está disponible en Python, así que creo que vale la pena preguntar.
Cualquier otra sugerencia sobre cómo se podría lograr esto (¡incluso si no fuera por un paquete mágico de unicornio!) También sería apreciada. Principalmente, solo tratando de encontrar una manera de ahorrar 15-20 minutos por corrida sin pasar la misma cantidad de tiempo codificando la solución.
fuente
Respuestas:
Desafortunadamente, la paralelización aún no se implementa en los pandas. Puede unirse a este problema de Github si desea participar en el desarrollo de esta función.
No conozco ningún "paquete de unicornio mágico" para este propósito, así que lo mejor será escribir tu propia solución. Pero si aún no desea dedicar tiempo a eso y desea aprender algo nuevo, puede probar los dos métodos integrados en MongoDB (reducción de mapas y marco agg). Ver mongodb_agg_framework .
fuente
Creo que tu mejor apuesta sería Rosetta . Lo encuentro extremadamente útil y fácil. Comprueba sus métodos de pandas .
Puedes conseguirlo por pip .
fuente
Existe la
dask
biblioteca útil para trabajos paralelos numpy / pandasEnlace: https://github.com/blaze/dask
fuente
Hay una versión más común de esta pregunta con respecto a la paralelización en pandas función de aplicación de, así que esta es una pregunta refrescante :)
Primero , quiero mencionar más rápido ya que solicitó una solución "empaquetada", y aparece en la mayoría de las preguntas SO con respecto a la paralelización de pandas.
Pero.. todavía me gustaría compartir mi código personal para ello, ya que después de varios años de trabajar con DataFrame nunca encontré una solución de paralelización al 100% (principalmente para la función de aplicación) y siempre tuve que volver por mi " manual "código.
Gracias a usted, lo hice más genérico para admitir cualquier método DataFrame (teóricamente) por su nombre (por lo que no tendrá que mantener versiones para isin, apply, etc.).
Lo probé en las funciones "isin", "apply" e "isna" usando Python 2.7 y 3.6. Tiene menos de 20 líneas, y seguí la convención de nomenclatura de pandas como "subconjunto" y "njobs".
También agregué una comparación de tiempo con el código equivalente dask para "isin" y parece ~ X2 veces más lento que esta esencia.
Incluye 2 funciones:
df_multi_core : este es el que usted llama. Acepta:
_df_split : esta es una función auxiliar interna que debe colocarse globalmente en el módulo en ejecución (Pool.map es "dependiente de la ubicación"), de lo contrario, la ubicaría internamente.
Aquí está el código de mi esencia ( agregaré más pruebas de función de pandas allí):
A continuación, se muestra un código de prueba para un isin paralelo , que compara el rendimiento nativo, multinúcleo y básico. En una máquina I7 con 8 núcleos físicos, obtuve alrededor de X4 veces la aceleración. ¡Me encantaría saber lo que obtienes de tus datos reales!
fuente
isin
- parece que el fragmento de código es más efectivo con 'isin' - ~ X1.75 veces más rápido que Dask (en comparación con laapply
función que solo obtuvo un 5% más rápido que Dask)