Estructura Base para Proyectos de Ciencia de datos

Ultima actualización 7 / Ene / 2024

Poetry
Ruff
pre-commit

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)

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 Cookicutter:

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:

LinkProsContrasUltima actualización
Data Science TemplateElementos bien enfocados en proyectos de ciencia de datos y con elementos para el desarrollo de softwareFalta agregar Github Actions para automatizar tareas de CI/CD y algunas carpetas12/Jul/2023
cookiecutter-modern-datascienceElementos enfocados en proyectos de ciencia de datos y con elementos para el desarrollo de softwareNo tiene gestor de paquetes con poetry para evitar problemas con dependencias ni automatización de algunos procesos10/Ago/2022
cookiecutter-hypermodern-pythonElementos modernos para el desarrollo de proyectos en pythonNecesita ampliar la estructura de los folders para proyectos de ciencia de datos.3/Jun/2022
cookiecutter-cruft-poetry-tox-pre-commit-ci-cdConfiguración moderna de herramientas para el desarrollo de proyectos con pythonNo es especifico para proyectos de ciencia de datos, necesita ampliar la estructura de los folders22/Ago/2023
cookiecutter-data-sciencePlantilla muy usada con elementos enfocados en proyectos de ciencia de datosNo tiene configuración de desarrollo de software en python ni tiene gestor de paquetes con poetry, la ultima actualización fue hace varios años20/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ísticaLibreríaEstado
Lenguaje de programaciónPython version 3.8 o superior
Gestor de libreríasPoetry o pipenv
Gestor entornos virtualesPoetry o pipenv
TestingPytest
Gestor de hookspre-commit
Auto update pre-commitgithub actions
LinterRuff
Formateo de códigoRuff y Prettier
Check tipado estáticoMypy
Orden de importsRuff
Problemas en dependenciasdeptry
Cobertura de códigocoverage.py
Reporte cobertura de testcodecov
Actualización dependenciasDependabot
Seguridad y auditoriaBandit y Safety
Gestor de scaffoldingcruft o Cookiecutter copier
Configuración de proyectoOmegaConf o hydra
Actualización sintax pythonRuff
DocumentaciónMkDocs o Sphinx o pdoc
Librerías BasePandas, NumPy, scikit-learn, Jupyter
Scripts de configuraciónMakefile o just

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ísticaLibreríaEstado
Gestor de datosDVC
Validación de datosGreat Expectations o pandera
Gestor de experimentosMlFlow, weights & biases o Neptune
Gestor de modelosMlFlow
Gestor de pipelinesKedro , ZenML
Validación de train/testdeepcheck
Validación de integridad de datosdeepcheck
Validación de modelosdeepcheck

Referencias

Cookiecutter

Referencias de plantillas de proyectos con cookiecutter para ciencia de datos y para proyectos de software:

Cookiecutter Data Science

Cookiecutter with Poetry

Enviroments

Next