Video Summary and Transcription
Los Jupyter Notebooks son importantes para la ciencia de datos, pero mantenerlos puede ser un desafío. La visualización de conjuntos de datos y el uso de herramientas de calidad de código como NBQA pueden ayudar a abordar estos desafíos. Herramientas como nbdime y Precommit pueden ayudar con el control de versiones y la calidad del código futuro. La configuración de NBQA y otras herramientas de calidad de código se puede hacer en el archivo PyProject.toml. NBQA se ha integrado en los flujos de trabajo de integración continua de varios proyectos. Se debe considerar mover el código de los notebooks a paquetes de Python según la necesidad de reproducibilidad y soluciones autocontenidas.
1. Introducción a Jupyter Notebooks
Discutiremos la importancia de Jupyter Notebooks y los desafíos de mantenerlos. Luego, demostraré un flujo de trabajo para mantener tus Jupyter Notebooks mantenibles.
Hola, amigos. Hoy estamos aquí para hablar sobre Jupyter Notebooks y cómo mantenerlos mantenibles. Comenzaremos con un ejemplo motivador, en el cual presentaré el caso de por qué podrías estar interesado en usar Jupyter Notebooks en primer lugar. Luego, abordaré un par de desafíos que las personas suelen mencionar al intentar mantener sus Jupyter Notebooks mantenibles.
El primero tiene que ver con el control de versiones, y cualquiera que haya intentado ver la diferencia entre dos notebooks usando git diff sabrá de qué estoy hablando. No es fácil. El segundo tiene que ver con la integración continua y, más específicamente, la falta de herramientas de calidad de código disponibles para ejecutar en Jupyter Notebooks.
Entonces, finalmente, demostraré un flujo de trabajo para mantener tus Jupyter Notebooks mantenibles. Vamos directo a nuestro ejemplo motivador. He preparado un flujo de trabajo de ciencia de datos bastante estándar aquí, absolutamente estándar. Lo recorreremos en un segundo. Ahora, podrías preguntarte por qué te estoy mostrando un flujo de trabajo de ciencia de datos absolutamente estándar, y ten paciencia, puede haber un giro al final, puede. Así que vamos a recorrerlo.
2. Analyzing Summary Statistics
Comenzamos leyendo cuatro archivos CSV utilizando Pandas read CSV. Imprimimos estadísticas resumidas para los cuatro conjuntos de datos, que muestran que son bastante similares.
Comenzamos leyendo cuatro archivos CSV utilizando Pandas read CSV, bastante estándar. Cada uno de ellos tiene dos columnas, x e y, bastante estándar. Luego, imprimiremos algunas estadísticas resumidas, por lo que imprimiremos la media de x, la media de y, la desviación estándar de x, la desviación estándar de y y la correlación entre x e y. Haremos esto para los cuatro conjuntos de data, aún bastante estándar.
Y luego, utilizando Scikit-learn, para cada uno de estos conjuntos de data ajustaremos un modelo de regresión lineal, también bastante estándar, e imprimiremos el error cuadrado medio, también absolutamente estándar.
Entonces, ¿dónde está el giro? Bueno, veamos qué sucede si ejecutamos esto usando Python. Correcto, mira eso. Si observamos lo que se ha impreso en la consola, veremos que la media de x es la misma para los cuatro conjuntos de data, pero también lo es la media de y, la desviación estándar de x, la desviación estándar de y, la correlación entre x e y, y el error cuadrado medio al ajustar un modelo de regresión lineal también es casi idéntico. Entonces, si observamos esto, podemos decir que los cuatro conjuntos de data deben ser bastante similares. Eso es lo que estas estadísticas resumidas nos están diciendo.
3. Analyzing Data Sets in Jupyter Notebooks
Intentemos hacer el análisis en un cuaderno de Jupyter en lugar de un script de Python. Visualizaremos los conjuntos de datos y las líneas de regresión lineal. Los gráficos revelan que los conjuntos de datos no son iguales, resaltando la importancia de la visualización. Los cuadernos de Jupyter pueden ser criticados por problemas de control de versiones, como se muestra en la diferencia después de un cambio trivial.
Ahora, intentemos hacer algo ligeramente diferente. Repitamos este análisis, pero en lugar de hacerlo en un script de Python, hagámoslo en un cuaderno de Jupyter. Haremos lo mismo. Simplemente leeremos estos conjuntos de data utilizando pandas.read.csv y ajustaremos un modelo de regresión lineal utilizando scikit-learn. Pero luego, en lugar de simplemente imprimir algunas estadísticas resumidas, visualizaremos nuestros conjuntos de data y también visualizaremos las líneas de regresión lineal, que habremos ajustado. Y debido a que acabamos de imprimir las estadísticas resumidas y eran las mismas para los cuatro conjuntos de data, esperamos que los cuatro gráficos se vean casi idénticos. Así que, vamos. Listos, preparados, ya.
Oh, ¿qué está pasando? Parece que tal vez estos cuatro conjuntos de data no son tan similares después de todo. Sin embargo, si contrastamos esto con lo que vimos hace un segundo cuando solo imprimimos algunos números en la consola, ahora podemos decir que los cuatro conjuntos de data no son realmente iguales. Simplemente tienen algunas características compartidas. Pero cuando solo nos basamos en números individuales como estadísticas resumidas, no podíamos decir eso. Sin embargo, es frustrantemente común ver flujos de trabajo de data science en los que las personas simplemente cargan los data, ajustan un modelo y luego imprimen algunos números sin molestarse en visualizarlo. Así que ese es el ejemplo motivador. Espero que este ejemplo motivador haya resaltado la importancia de visualizar tus data. Y los cuadernos de Jupyter son una excelente manera de hacerlo. Pero si los cuadernos de Jupyter son tan buenos, ¿por qué a veces son criticados? Bueno, dije antes que plantean un problema cuando se trata de control de versiones. Y para cualquiera que no haya intentado hacer eso antes, veamos juntos a qué me refiero. Guardemos el cuaderno tal como está. Y hagamos un commit. git commit run notebook. Ahora hagamos un cambio absolutamente trivial. Simplemente agreguemos una pequeña línea aquí que diga fig subplot title Data Frames. Ya sabes, un cambio realmente pequeño. Ejecutemos la celda nuevamente. Lo único que ha cambiado es que he agregado este título. Si esto fuera un script de Python y solo hubiéramos cambiado una línea de código, entonces si hiciéramos git diff, veríamos una diferencia realmente pequeña. Sin embargo, esto no es un script de Python. Es un cuaderno de Jupyter. Y así que si guardamos y hacemos git diff, mira lo que sucede.
4. Desafíos con Jupyter Notebooks y Soluciones
Nos encontramos con una diferencia horrenda entre los cuadernos, lo que me hace querer dejar de usar los cuadernos de Jupyter. Sin embargo, una herramienta especializada llamada nbdyme proporciona una vista visualmente agradable de la diferencia, lo que hace que los cuadernos de Jupyter sean más deseables. Otro desafío es la falta de herramientas de calidad de código para los cuadernos. Sin embargo, una herramienta llamada NBQA puede convertir los cuadernos en scripts de Python, ejecutar herramientas de calidad de código y reconstruir el cuaderno. Esto permite la integración continua y verificaciones de calidad de código en los cuadernos de Jupyter.
Obtenemos esta diferencia de imagen en bruto absolutamente horrenda e irrazonable. Miro esto y no tengo idea de lo que está sucediendo. Me hace querer dejar de usar los cuadernos de Jupyter para siempre. Sin embargo, todo está perdido, porque tal vez no sea tanto que los cuadernos de Jupyter no funcionen bajo control de versiones, tal vez solo necesitamos una herramienta más especializada.
Y una de esas herramientas, que les presentaré hoy, se llama nbdyme. La forma en que nbdyme funciona es que lo llamas desde la línea de comandos, como nbdiff-web, y luego, permíteme permitir eso, y obtendrás una URL que puedes abrir en tu navegador, y ahora obtenemos una vista visualmente agradable y fácil de entender de la diferencia entre los cuadernos. Ahora, si miramos esto, está absolutamente claro que solo ha cambiado una línea de código. También podemos comparar fácilmente la diferencia en las salidas y ver que solo ha cambiado el título. Esto es mucho más fácil de leer en comparación con lo que teníamos hace unos minutos. Esta diferencia absolutamente ilegible, ahora tenemos algo visualmente agradable que me hace querer usar los cuadernos de Jupyter nuevamente. Genial. Entonces no era que los cuadernos de Jupyter no funcionaran con el control de versiones. Era más que necesitábamos una herramienta especializada. Entonces ese es el primer desafío cuando se trata de los cuadernos de Jupyter que mencioné anteriormente. Ahora veamos el siguiente. Porque si estás manteniendo las cosas bajo control de versiones, es probable que no solo estés viendo la diferencia entre las versiones de tu código, también estarás ejecutando integración continua. Si estás acostumbrado a hacer integración continua en tus scripts de Python, es probable que estés acostumbrado a ejecutar una suite completa de linters y formateadores en tu código como black, isort, flake8, pyupgrade, mypy, la lista continúa. Si le dices a alguien que está acostumbrado a hacer eso que de repente tienen que cambiar a usar cuadernos de Jupyter, para los cuales no tendrán disponible esa gran suite de herramientas, entonces es posible que se sientan con razón como llorar. Pero ¿eso significa que todo está perdido, o nuevamente, significa que solo necesitamos una herramienta más especializada? Veamos. Necesitaríamos una herramienta que convierta temporalmente tu cuaderno en un script de Python y lo guarde en un directorio temporal, ejecute estas herramientas de calidad de código en él, reconstruya el cuaderno y pase la salida. Y una de esas herramientas, que les presentaré hoy, se llama NBQA. Veamos cómo funciona un poco. He preparado aquí un cuaderno para ustedes, que produce un gráfico bonito al final, que se toma de la galería de matplotlib, pero dentro de él he escrito un código intencionalmente distorsionado. Veamos qué sucede cuando ejecutamos NBQA y luego algunas herramientas de calidad de código en él. Puedes ejecutar NBQA desde la línea de comandos. De hecho, ni siquiera necesitas tener tu cuaderno abierto o tener una instancia de Jupyter ejecutándose. Entonces, veamos qué sucede. Vamos a formatearlo automáticamente usando black. Luego ordenemos las importaciones usando isort. Luego actualizaremos la sintaxis usando pyupgrade, y finalmente ejecutaremos flake8, que no modificará nuestro cuaderno.
5. Usando Precommit para la Calidad del Código Futuro
Eliminamos una importación no utilizada y usamos nb-dime para ver la diferencia entre los cuadernos. Las importaciones se ordenan, se elimina la importación no utilizada, se reemplaza el constructor obsoleto y se soluciona la indentación inconsistente. Para garantizar la calidad del código en el futuro, podemos usar la herramienta Precommit, que ejecuta automáticamente verificaciones de calidad del código y bloquea los commits si no pasan. Al habilitar pre-commit en nuestro espacio de trabajo, podemos asegurarnos de que nuestros cuadernos continúen pasando las verificaciones de calidad del código. Pre-commit también se puede utilizar durante la integración continua para validar los cambios entrantes.
Solo nos informará si hay alguna violación de la guía de estilo. Y, de hecho, nos dice que hay una importación que no se utiliza, Seaborn. Entonces, podemos abrir nuestro cuaderno nuevamente, eliminar esta importación no utilizada y ahora, veamos qué ha cambiado.
Para ver qué ha cambiado, vamos a hacer git diff, excepto que no vamos a hacer git diff. Acabo de decirte que deberíamos usar nb-dime para ver la diferencia entre los cuadernos. Entonces, vamos a usarlo. Abramos este enlace en nuestro navegador y ahora, veamos qué ha cambiado.
Entonces, en primer lugar, verás que las importaciones ahora se han ordenado gracias a isort. Esta importación no utilizada se ha eliminado gracias a flakeate. Este constructor obsoleto de este diccionario se ha reemplazado por uno más moderno gracias a pyupgrade. Esta indentación inconsistente se ha solucionado gracias a black y de repente, el estilo del código se siente mucho más uniforme y será más fácil mantener una calidad consistente. Será más fácil comparar las diferencias cuando diferentes personas lo hayan modificado, si el estilo es consistente.
Genial, excepto que no solo queremos que nuestro cuaderno tenga una cierta code quality hoy. Queremos asegurarnos de que se mantenga así en el futuro y una forma popular de hacerlo es a través de una herramienta llamada Precommit. La forma en que funciona Precommit es que necesitas un archivo .precommit config.yaml en el que especifiques los repositorios que alojan las herramientas de code quality que deseas ejecutar en tus archivos. Aquí estaré usando NVQA. Especificas una revisión, en este momento estoy poniendo 0.3.3, pero siempre debes verificar cuál es la última versión, y probablemente poner esa. Y luego especificas qué hooks quieres ejecutar. Así que ejecutaré nbqa-black, nbqa-iSort, nbqa-pyupgrade y nbqa-flake8. Esto es exactamente lo que teníamos antes, pero ahora lo he puesto en mi archivo pre-commit. Entonces, lo que sucederá ahora es que si hacemos un commit que incluya un cuaderno, pre-commit ejecutará todas estas verificaciones de code quality automáticamente y bloqueará nuestro commit si no pasan todas. Excepto, lo siento, necesitamos habilitar pre-commit en nuestro espacio de trabajo para que funcione. Entonces, hagamos un reset notebook. Ahora agreguémoslo nuevamente. Hagamos commit. Muy bien y ahora verás que ha ejecutado nuestras herramientas de code quality. Tuve que hacer esto dos veces para que todas pasaran y la segunda vez pre-commit nos permitió hacer el commit. Entonces, si usas pre-commit, te asegurarás de que no solo tus cuadernos pasen las verificaciones de code quality hoy, sino también que continúen pasando las verificaciones de code quality en el futuro. También puedes ejecutar pre-commit durante tu integración continua. Y así te asegurarás de que cualquier cambio entrante en tu repositorio pase.
6. Configurando NBQA y Herramientas de Calidad del Código
¿Es realmente tan simple como ejecutar nbqa black en tus cuadernos? He ocultado la complejidad en el archivo PyProject.toml, donde puedes configurar NBQA y otras herramientas de calidad del código. Puedes permitir que NBQA modifique tu cuaderno directamente especificándolo en la sección mutate. Se pueden agregar argumentos adicionales de línea de comandos en addopt.
¿Son realmente tan simples estas comprobaciones? ¿Es realmente tan simple como ejecutar nbqa black y luego puedes usar black en tus cuadernos de la misma manera que usarías normalmente black en tus scripts de Python? Tengo una confesión que hacer. En realidad, he ocultado un poco de complejidad en el archivo PyProject.toml. Puedes configurar NBQA completamente dentro de este archivo. Es el mismo archivo que puedes usar para configurar tu formateador black. Entonces, si alguna de tus herramientas utiliza archivos de configuración, puedes ponerlos aquí. Si quieres que alguna herramienta de calidad del código modifique tu cuaderno directamente, puedes indicárselo a NBQA aquí en la sección mutate. Observa que no he puesto flakate porque flakate solo analiza nuestro cuaderno sin modificarlo realmente. Y luego, si quieres pasar algún argumento adicional de línea de comandos,
7. Importancia de los Cuadernos Jupyter y Desafíos
Los cuadernos Jupyter son cruciales para la ciencia de datos, ya que permiten la visualización de datos, abordan los desafíos de mantenimiento y proporcionan herramientas de calidad de código a través de NB time y NBQA.
puedes ponerlos aquí en addopt. Genial. Entonces, en resumen, hemos visto cómo los cuadernos Jupyter desempeñan un papel integral en la ciencia de datos. Esto se debe a que te permiten visualizar tus datos lo que te ayuda a comprenderlo de una manera que simplemente imprimir algunas estadísticas de resumen en tu consola no lo hace. También vimos que los cuadernos Jupyter presentan algunos desafíos cuando se trata de mantenerlos. Específicamente, que es difícil ver la diferencia entre dos cuadernos. Y vimos cómo podemos abordar esto utilizando NB time. Y también que hay una falta de herramientas de calidad de código disponibles para los cuadernos Jupyter. Vimos cómo podemos mantener nuestras mismas herramientas de calidad de código de Python pero simplemente ejecutarlas en nuestros cuadernos Jupyter a través de NBQA. He incluido enlaces a las páginas de inicio de NB time y NBQA aquí así como a esta presentación. Eso es todo de mi parte. Ahora, por favor, sal y escribe un código mantenible.
Integración y Beneficios de NBQA
Hemos tenido a PyMC3, Alibi, SK time, Pandas profiling y NLP profiler utilizando NBQA como parte de sus flujos de trabajo de integración continua. Estamos considerando introducir una acción de GitHub para NBQA. nbdime tiene una integración de GitHub para revisar solicitudes de extracción. Es gratuito para proyectos de código abierto pero no para proyectos privados. NBQA es similar a integrar un IDE en un cuaderno Jupyter y agregarle algunos esteroides. Jeremy Howard describe los cuadernos Jupyter como una encarnación del entorno de programación literaria concebido por Donald Knuth. Cualquier herramienta que nos ayude a programar de manera más cómoda y mantenible dentro de un cuaderno sería bienvenida.
Cuaderno Jupyter. Bueno, bienvenidos. Vamos a pasar a las preguntas de nuestra audiencia. ¿Están listos? Claro, es bueno estar aquí. Muy bien. Primera pregunta. ¿Has presentado NBQA a los otros científicos de datos en tu lugar de trabajo? ¿Cuánto ha ayudado en su flujo de trabajo? Claro. Recientemente lo mencioné en el trabajo, por lo que la adopción es limitada. En este momento la mayoría de la adopción ha sido en el mundo de código abierto. Hemos tenido a PyMC3, Alibi, SK time, Pandas profiling y NLP profiler utilizándolo como parte de sus flujos de trabajo de integración continua. Sospecho que la mayoría de la adopción probablemente estará allí. Estamos considerando introducir una acción de GitHub y esperamos que eso ayude a despertar más interés y a llegar a más personas. Sí, ¿puedes ampliar eso? Porque mostraste cómo usarlo localmente pero se puede usar en GitHub en el futuro, ¿verdad? Sí, claro. En el futuro habrá una acción de GitHub. Esto se refiere específicamente a nbqa. La otra herramienta que mostré, nbdime, que solo para aclarar, no estoy afiliado a ella ni soy coautor, nbdime tiene una integración de GitHub que se puede utilizar para revisar solicitudes de extracción en GitHub. Algunas bibliotecas como pymc3 lo utilizan bastante. Es gratuito para proyectos de código abierto pero no para proyectos privados. Si quieres usarlo en tu lugar de trabajo, tendrás que argumentar a tu empleador por qué deberían pagarlo. Bueno, puedo ser muy convincente, así que eso no es un problema.
Siguiente pregunta. ¿Sería seguro decir que NBQA es similar a integrar un IDE en un cuaderno Jupyter y agregarle algunos esteroides? Me sorprende que nadie haya pensado en esto antes. Excelente trabajo. Oh, gracias. Eso es muy amable de tu parte. Me gustaría pensar en ello de esa manera. Creo... Estoy tratando de recordar su nombre. El tipo que hizo fast.ai, Jeremy Howard, describe los cuadernos Jupyter como una encarnación del entorno de programación literaria, que fue concebido por Donald Knuth, si no me equivoco. Y creo que es una lástima que muchas de las prácticas de desarrollo estándar, que están disponibles cuando programamos en scripts de Python, no estén tan fácilmente disponibles cuando programamos en cuadernos Jupyter. Y dado algunos de los beneficios que proporcionan al hacer ciencia de datos, creo que cualquier herramienta que nos ayude a programar de manera más cómoda y mantenible dentro de un cuaderno, me gustaría pensar que sería bienvenida.
Migración de código de un cuaderno a un paquete de Python
Al decidir si mover el código de un cuaderno Jupyter a un paquete de Python, considere la necesidad a largo plazo de reproducibilidad. Si el código forma parte de un informe o análisis que debe producirse de manera consistente a lo largo del tiempo, puede ser mejor mantenerlo en el cuaderno. Sin embargo, si desea una solución autocontenida o si el código no está directamente relacionado con la ciencia de datos, migrarlo a un paquete de Python podría ser más apropiado. Jeremy Howard y el equipo de Fast.AI tienen herramientas para crear paquetes a partir de cuadernos, aunque personalmente aún no las he utilizado.
De acuerdo. La siguiente pregunta es de nuestro miembro de la audiencia, Dido. ¿Alguna recomendación sobre cuándo mover el código de un cuaderno a un paquete de Python? Esa es una buena pregunta. Quiero decir, mi principal uso para los cuadernos es cuando tengo algún informe o algún análisis que no solo quiero poder producir hoy, sino también que quiero poder producir en un mes, dos meses a partir de ahora y saber que cuando intente producirlo nuevamente en dos meses, no se romperá de repente. Con este caso de uso en mente, típicamente no migraría lo que tengo en un cuaderno a un paquete de Python. Mi pensamiento habitual para crear un paquete de Python es cuando quiero algo más autocontenido que no sea parte de un análisis o algún modelo, mientras que el tipo de trabajo que hago en un cuaderno Jupyter está más relacionado con la puradata ciencia. Por lo tanto, típicamente no migraría un cuaderno a un script de Python. Sin embargo, Jeremy Howard y el equipo de Fast.AI tienen alguna forma de crear un paquete a partir de un cuaderno Jupyter. Son muy prolíficos en la cantidad de herramientas que lanzan. Por lo tanto, existe la posibilidad de hacerlo. Simplemente no es algo que haya utilizado aún en mi propio trabajo. De acuerdo. La siguiente pregunta es de Jordy VD. No sé si estás familiarizado con JavaScript, pero ¿conoces alguna alternativa en JavaScript para Jupyter notebook? No estoy familiarizado con JavaScript, me temo. Ah, bueno. Yo sí, pero no estoy tan familiarizado con Jupyter notebook. Así que no sé si voy a responder correctamente la pregunta de Jordy, pero Jordy, te recomendaría que si solo quieres probar rápidamente código, que es básicamente lo que entiendo que estás haciendo, ¿verdad? Con Jupyter notebook. Bueno, está bien, así que solo interrumpo eso, porque está en medio de una oración. Entonces algunas personas usan cuadernos solo para probar rápidamente código, pero me gustaría pensar que con la aparición de más y más herramientas de mantenimiento para cuadernos, pueden ser realmente como un entorno de desarrollo adecuado en lugar de algo para probar rápidamente algo. Uno de los preguntadores anteriores dijo que los estamos transformando en un entorno de desarrollo integrado y sí, me gustaría pensar que ese es el objetivo a largo plazo, pero no creo que hayamos llegado completamente allí todavía. De todos modos, continúa y termina tu respuesta. Sí, bueno, básicamente le diría a Jordi que mire Code Sandbox, eso es lo que siempre uso para estos escenarios, que es un sitio web muy bueno. Así que publicidad gratuita para Code Sandbox aquí, luego hay algunas personas, tres personas escribiendo sus preguntas ahora, así que veamos quién termina de escribir primero. Esto es más preguntas de las que esperaba. Alexander Schultz dice, gran charla, ahora tengo algunas cosas geniales para probar en mi propio trabajo, así que es un buen cumplido para ti. Gracias. Oh, y Jordi ya dio su opinión de que está usando Code Sandbox, y que son geniales. Genial. Otra pregunta de Soren, excelente forma de trabajar con el cuaderno Jupyter. ¿Es utilizable en el cuaderno de SageMaker? No estoy familiarizado con SageMaker, me temo. Si tienes tiempo, tal vez podrías describir brevemente qué es, si tienes alguna interfaz de línea de comandos disponible y si se guarda en el mismo formato que un cuaderno Jupyter, entonces supongo que podrías usarlo allí. Bueno, Soren, supongo que solo hay una cosa que puedes hacer. Si quieres saber más sobre SageMaker y la opción de trabajar con el cuaderno Jupyter allí, tendrás que ir a la sala de conferencias de Marco, que comenzará en unos pocos minutos. Entonces puedes profundizar hablando y discutiendo sobre el cuaderno Jupyter, Soren. Supongo que eso es todo el tiempo que tenemos ahora para preguntas y respuestas. Entonces como dije antes, Marco se dirigirá a la sala de conferencias en este momento. Si quieres unirte a Marco, simplemente encuentra el enlace debajo del reproductor en el sitio web, haz clic en la discusión... la sala de conferencias para Marco y puedes unirte a la conversación. Así que Marco, muchas gracias por tu charla y esta encantadora sesión de preguntas y respuestas. Muchas gracias.
Comments