Scaffolding inteligente para proyectos de datos en Python — ETL, hexagonal y ML pipeline
Project description
forja · dfg
Scaffolding inteligente para proyectos de datos en Python.
pip install forja
dfg init mi_proyecto
forja detecta el dominio de tu proyecto por nombre, propone una arquitectura en capas y genera el scaffold completo — listo para correr con Docker y Postgres en segundos.
Por qué forja
La mayoría de los proyectos de datos empiezan igual: una carpeta con scripts sueltos, un notebook que creció demasiado y queries incrustadas en funciones. forja propone una estructura desde el día uno que escala sin reescribir.
- Sin ORM. SQL crudo en repositorios. Tus queries son visibles y debuggeables.
- Sin magia. La configuración vive en
dataforge.toml. Nada oculto. - Aditivo.
dfg addnunca toca archivos existentes, solo crea nuevos. - ML-ready. Arquitectura
mlincluida: features, modelos, evaluación y cross-validation por defecto.
Instalación
pip install forja
Requiere Python ≥ 3.10 y Docker (para Postgres local).
Inicio rápido
# 1. Crear proyecto — el wizard detecta el dominio automáticamente
dfg init sistema_pacientes
# 2. Entrar al proyecto
cd sistema_pacientes
# 3. Levantar Postgres local
docker compose up -d
# 4. Instalar dependencias del proyecto
pip install -e ".[dev]"
# 5. Copiar variables de entorno
cp .env.example .env
# 6. Aplicar migraciones iniciales
dfg migrate
# 7. Verificar
dfg status
Wizard de dominio
Al ejecutar dfg init, el clasificador detecta automáticamente el dominio del proyecto a partir de su nombre y propone la arquitectura más adecuada. El ejemplo a continuación muestra cómo funciona con un proyecto de genómica — pero el wizard aplica igual para cualquiera de los 9 dominios disponibles:
dfg init analisis_genomico
Dominio Confianza
Bioinformática / Omics 94% ██████████████████ ● alta
Dominio detectado: Bioinformática. ¿Cambiar? [y/N]:
Arquitectura: ETL pipeline — sources / transforms / repositories / pipelines (recomendada)
¿Cambiar arquitectura? [y/N]:
Dominios disponibles: health, finance, logistics, ecommerce, education, climate, social_science, bioinformatics, generic.
El clasificador funciona en español e inglés. Si la confianza es baja, el wizard muestra todas las opciones para que elijas manualmente.
Arquitecturas
ETL pipeline
Para proyectos orientados a ingesta, transformación y análisis de datos.
src/<proyecto>/
├── sources/ # Fetchers: HTTP, APIs, archivos, DBs externas
├── dtos/ # Pydantic schemas — contratos entre capas
├── transforms/ # Funciones puras: limpieza, normalización
├── repositories/ # SQL crudo con psycopg3
├── services/ # Orquestación
├── pipelines/ # Jobs ETL ejecutables con `dfg run`
└── db/ # Pool de conexiones
Hexagonal (ports & adapters)
Para sistemas con dominio rico, reglas de negocio y múltiples adaptadores.
src/<proyecto>/
├── domain/
│ ├── entities/
│ └── ports/ # Interfaces (Protocols)
├── application/
│ └── use_cases/
└── infrastructure/
├── db/
└── repositories/
ML Pipeline
ETL completo más capas de Machine Learning. Framework-agnostic.
src/<proyecto>/
├── sources/ # Ingesta (igual que ETL)
├── transforms/ # Limpieza + feature engineering
├── features/ # Feature store ligero
├── models/ # Predictor Protocol — sklearn, XGBoost, PyTorch: todos sirven
├── evaluation/ # Métricas + cross-validation por defecto
├── pipelines/
│ ├── training.py # train/val/test split → CV → fit → evaluar → guardar
│ └── inference.py # cargar modelo → predecir → persistir
└── repositories/ # Persistencia opcional
dfg init detector_fraude --arch ml
cd detector_fraude
pip install -e ".[dev,ml]"
Comandos
Scaffolding
dfg init <nombre> # Crear proyecto con wizard
dfg init <nombre> --domain finance # Forzar dominio
dfg init <nombre> --arch ml # Forzar arquitectura
dfg classify <nombre> # Clasificar dominio sin crear archivos
Dentro de un proyecto
dfg status # Info del proyecto actual
dfg add entity "Paciente (nombre, edad, diagnostico)" # DTO + repo + migración SQL
dfg add source api_hl7 # Nuevo fetcher
dfg add pipeline ingestion_diaria # Nuevo pipeline
dfg migrate # Aplicar migraciones pendientes
dfg migrate --dry-run # Ver qué correría sin aplicar
dfg migrate --to 003_add_index.sql # Aplicar hasta un archivo específico
dfg run ingestion_diaria # Ejecutar pipeline
dfg run training # Ejecutar pipeline de entrenamiento ML
dfg run --list # Ver pipelines disponibles
Generación de entidades
dfg add entity infiere tipos SQL y Python desde la definición en lenguaje natural:
dfg add entity "Transaccion (monto, moneda, estado, cliente_id, procesado_at)"
Genera:
dtos/transaccion.py— modelo Pydantic con tipos inferidosrepositories/transaccion_repository.py— CRUD con SQL crudomigrations/001_create_transacciones.sql— migración versionada
Inferencia automática: _id → FK, _at → TIMESTAMPTZ, estado → ENUM detectado por contexto de dominio, monto → NUMERIC.
Migraciones
forja gestiona migraciones con una tabla _dataforge_migrations en tu base de datos:
dfg migrate # aplica todas las pendientes en orden
dfg migrate --dry-run # muestra el plan sin tocar la DB
Cada archivo .sql en migrations/ se aplica exactamente una vez. Si una falla, hace rollback solo de esa migración — las anteriores quedan intactas.
Estructura de un proyecto generado
mi_proyecto/
├── dataforge.toml # Manifest del proyecto
├── pyproject.toml
├── docker-compose.yml # Postgres 16 local
├── Makefile # make db / make test / make train
├── .env.example
├── src/mi_proyecto/ # Package Python
├── migrations/ # *.sql versionados
├── notebooks/ # Exploración con Jupytext
└── tests/
Principios de diseño
- SQL crudo, siempre. Los repositorios escriben SQL directo. Sin ORM, sin magia, sin N+1 ocultos.
- DTOs en las fronteras. Los datos se validan al entrar y al salir, no dentro de la lógica.
- Cross-validation por defecto. En arquitectura ML, el scaffold ya incluye el helper de CV — el proyecto nace con buenas prácticas.
Predictores un Protocol. Cualquier objeto con.fit()y.predict()es un modelo válido.- Migraciones como código. Archivos SQL versionados, aplicados en orden, con tracking en la DB.
Licencia
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file forja-1.0.1.tar.gz.
File metadata
- Download URL: forja-1.0.1.tar.gz
- Upload date:
- Size: 72.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4cec9770dc20fc713c8364a132b0b2525076160cf7fdc639a62bf0c99d31ffe0
|
|
| MD5 |
481734de4feed8f3cf9f880b95518498
|
|
| BLAKE2b-256 |
8f4aa8b7913653eb118b62e77ddd532258a2c29763055651a6bd84ce82dd4829
|
File details
Details for the file forja-1.0.1-py3-none-any.whl.
File metadata
- Download URL: forja-1.0.1-py3-none-any.whl
- Upload date:
- Size: 107.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1e7de9af1eb85d34e1fb78a087be89d343d4f41b98362c6dde3282d0c3dd0985
|
|
| MD5 |
f6e1ed52879f0b9e3a4b36883e2afd6f
|
|
| BLAKE2b-256 |
20990165c28854edea085c021d99d5dbc3d444513ef421eb26a74c04e00ececf
|