Ultima actualización 7 / Ene / 2024
Los proyectos de ciencia de datos a menudo se caracterizan por su complejidad y su naturaleza exploratoria. Esto puede dificultar la organización y el mantenimiento del código y los datos. Una estructura de proyecto bien definida puede ayudar a los científicos de datos a mejorar la calidad de su trabajos, usar estándares de desarrollo de software industrial, así como a facilitar la colaboración y ser escalable.
Inicialmente estos proyectos empiezan con notebooks de Jupyter, y luego de un proceso de iteración y refinamiento, se convierten en scripts de Python. Sin embargo, los notebooks de Jupyter son una herramienta de exploración y no son adecuados para el desarrollo de software (con buenas practicas de desarrollo de software). Por lo tanto, es importante que los científicos de datos tengan una estructura de proyecto que les permita iterar rápidamente en la experimentación y luego desarrollar los procesos completos (pipelines) con scripts de Python.
Para evitar la fatiga por decisiones y tener que crear una estructura de un proyecto de ciencia de datos desde cero, es recomendable utilizar una plantilla de proyecto que contenga las herramientas de software y la estructura de carpetas necesarias para desarrollar proyectos de ciencia de datos de forma eficiente, reproducible y con buenas practicas de desarrollo de software.
Definición objetivo:
Un proyecto de ciencia de datos tiene como objetivo resolver un problema en base a análisis de datos (Análisis descriptivo), comprensión de relaciones en los datos (Análisis inferencial) y crear un modelo de predicción (Puede ser un modelo de Machine Learning!).
Este modelo de predicción a nivel productivo es un producto de software y como tal se debe gestionar como un proyecto de software.
Como usar esta plantilla (Project Template)
Si quieres actualizar regularmente tu proyecto con los cambios de la plantilla original se recomienda usar Cruft
Estos cambios pueden ser actualizaciones en las versiones de las librerías, nuevos folders o herramientas para usar en el proyecto.
Cruft (Recomendado)
- Instalar Cruft
pip install cruft
- Crear un proyecto basado en la plantilla:
cruft create https://github.com/JoseRZapata/data-science-project-template
- Cuando sea necesario actualizar el proyecto con los cambios de la plantilla:
En el Root del proyecto donde se encuentra el archivo .cruft.json
ejecutar:
cruft update
Cookiecutter
Instalar Cookiecutter:
pip install cookiecutter
Crear un proyecto basado en la plantilla:
cookiecutter gh:JoseRZapata/data-science-project-template
Proyectos de referencia
Tabla comparativa de las plantillas de proyectos de referencia:
Link | Pros | Contras | Ultima actualización |
---|---|---|---|
Data Science Template | Elementos bien enfocados en proyectos de ciencia de datos y con elementos para el desarrollo de software | Falta agregar Github Actions para automatizar tareas de CI/CD y algunas carpetas | 12/Jul/2023 |
cookiecutter-modern-datascience | Elementos enfocados en proyectos de ciencia de datos y con elementos para el desarrollo de software | No tiene gestor de paquetes con poetry para evitar problemas con dependencias ni automatización de algunos procesos | 10/Ago/2022 |
cookiecutter-hypermodern-python | Elementos modernos para el desarrollo de proyectos en python | Necesita ampliar la estructura de los folders para proyectos de ciencia de datos. | 3/Jun/2022 |
cookiecutter-cruft-poetry-tox-pre-commit-ci-cd | Configuración moderna de herramientas para el desarrollo de proyectos con python | No es especifico para proyectos de ciencia de datos, necesita ampliar la estructura de los folders | 22/Ago/2023 |
cookiecutter-data-science | Plantilla muy usada con elementos enfocados en proyectos de ciencia de datos | No tiene configuración de desarrollo de software en python ni tiene gestor de paquetes con poetry, la ultima actualización fue hace varios años | 20/Mar/2021 |
Características de la plantilla de proyecto base para ciencia de datos
En base a mi experiencia y otras referencias algunas de las características que debería tener un proyecto base para ciencia de datos son:
- Gestión de dependencias con Poetry: Poetry es un gestor de dependencias moderno para Python que simplifica el proceso de instalación y gestión de dependencias.
- Hooks de pre-commit con pre-commit: pre-commit es una herramienta que permite a los desarrolladores ejecutar automáticamente scripts antes de realizar un commit. Esto puede ayudar a garantizar que el código cumpla con los estándares de calidad del proyecto.
- Calidad de código:
- Ruff: es una herramienta que encuentra y corrige errores de uso de Python, ademas actualmente ya reemplaza a Black que formatea el código y ayuda a garantizar que el código tenga un estilo uniforme.
- Mypy es un verificador de tipos estáticos para Python que ayuda a encontrar errores antes de que se ejecute el código.
- Deptry es una herramienta que encuentra dependencias redundantes en los proyectos de Python.
- Pruebas unitarias y cobertura de pruebas con PyTest y Codecov:
- PyTest es una librería para pruebas unitarias para Python.
- Codecov es una herramienta que proporciona informes de cobertura de pruebas en el código.
- CI/CD con GitHub Actions: GitHub Actions es una plataforma de automatización de flujos de trabajo que permite a los desarrolladores automatizar tareas como la compilación, las pruebas y la implementación del código.
- Documentación: Generar documentación estática del proyecto.
- Plantilla de proyecto: Se necesita de librerías que permitan crear proyectos a partir de plantilla con carpetas y archivos de configuración.
- Cruft permite crear proyecto a partir de un cookiecutter y ademas actualizar el proyecto con los cambios de la plantilla original.
- Cookiecutter permite crear proyectos a partir de plantillas sin actualizaciones.
- Scripts configuración: Scripts para configurar el proyecto y el entorno de desarrollo, cuando se inicia el proyecto y para comandos repetitivos, por ejemplo Makefile.
Lo que no tiene la plantilla de proyecto base para ciencia de datos:
pypi:No se va a utilizar pypi para publicar los paquetes, ya que se crearan modelos de machine learning y transformaciones de datos.nox,tox:No se va necesitar pruebas en diferentes versiones de python, los desarrollos solo usaran versión de python.
Base inicial
Para lograr esto voy a creare una plantilla de proyecto base para ciencia de datos con los siguientes elementos:
Característica | Librería | Estado |
---|---|---|
Lenguaje de programación | Python version 3.8 o superior | ✅ |
Gestor de librerías | Poetry o | ✅ |
Gestor entornos virtuales | Poetry o | ✅ |
Testing | Pytest | ✅ |
Gestor de hooks | pre-commit | ✅ |
Auto update pre-commit | github actions | ✅ |
Linter | Ruff | ✅ |
Formateo de código | Ruff y Prettier | |
Check tipado estático | Mypy | ✅ |
Orden de imports | Ruff | ✅ |
Problemas en dependencias | deptry | |
Cobertura de código | coverage.py | ✅ |
Reporte cobertura de test | codecov | ✅ |
Actualización dependencias | Dependabot | ✅ |
Seguridad y auditoria | Bandit y Safety | ✅ |
Gestor de scaffolding | cruft o Cookiecutter | ✅ |
Configuración de proyecto | OmegaConf o hydra | ✅ |
Actualización sintax python | Ruff | ✅ |
Documentación | MkDocs o Sphinx o pdoc | |
Librerías Base | Pandas, NumPy, scikit-learn, Jupyter | |
Scripts de configuración | Makefile o | ✅ |
Actualmente Ruff reemplaza a flake8, [black], pyupgrade y [isort] que formatean el código y ayudan a garantizar que el código tenga un estilo uniforme. Ruff es muy rápido y esta escrito en Rust
Elementos adicionales de MLOps
Adicionalmente, para lograr una estructura de proyecto base para ciencia de datos que permita la implementación de MLOps, se buscara incluir los siguientes elementos:
Librerías para un proyecto de Machine Learning
Característica | Librería | Estado |
---|---|---|
Gestor de datos | DVC | ❓ |
Validación de datos | Great Expectations o pandera | ❓ |
Gestor de experimentos | MlFlow, weights & biases o Neptune | ❓ |
Gestor de modelos | MlFlow | ❓ |
Gestor de pipelines | Kedro , ZenML | ❓ |
Validación de train/test | deepcheck | ❓ |
Validación de integridad de datos | deepcheck | ❓ |
Validación de modelos | deepcheck | ❓ |
Referencias
- Build a Reproducible and Maintainable Data Science Project - Online Book
- Hypermodern Python Tooling - Book
- Any Machine Learning Project is a Software Project First
- Hypermodernizing python legacy code
- https://kedro.org/
- I move from pipenv to poetry in 2023 - Am I right ?
- Hypermodern Python Cookiecutter
- Pipx: Safely Install Packages Globally
Cookiecutter
Referencias de plantillas de proyectos con cookiecutter para ciencia de datos y para proyectos de software:
Cookiecutter Data Science
- https://drivendata.github.io/cookiecutter-data-science/
- https://github.com/crmne/cookiecutter-modern-datascience
- https://github.com/khuyentran1401/data-science-template
- https://github.com/TeoZosa/cookiecutter-cruft-poetry-tox-pre-commit-ci-cd
- https://khuyentran1401.github.io/reproducible-data-science/structure_project/introduction.html
- https://github.com/aws-samples/python-data-science-template
Cookiecutter with Poetry
- https://cjolowicz.github.io/posts/hypermodern-python-01-setup/
- Hypermodern Python Cookiecutter
- https://github.com/fpgmaas/cookiecutter-poetry
- https://github.com/PythonBiellaGroup/Bear