Proyecto de portafolio en Python para registrar ofertas laborales, extraer habilidades desde sus descripciones y generar reportes exportables que sirvan como insumo para análisis manual de CV, LinkedIn y portafolio.
Resuelve el problema que se presenta cuando se revisan muchas ofertas laborales, las habilidades solicitadas quedan dispersas en textos largos y se vuelven difíciles de comparar. Este proyecto centraliza las ofertas, detecta habilidades técnicas y blandas mediante un diccionario configurable, calcula estadísticas y genera reportes en formatos simples para análisis posterior. El sistema está pensado como una herramienta de apoyo: no evalúa automáticamente al candidato ni reemplaza el análisis manual.
- API backend con FastAPI.
- Persistencia inicial con SQLite y SQLAlchemy.
- Registro, listado, consulta y eliminación de ofertas.
- Importación masiva desde CSV.
- Extracción de habilidades con diccionario configurable.
- Estadísticas de habilidades detectadas.
- Exportación de reportes en Markdown y CSV.
- Reporte Markdown orientado a análisis manual con ChatGPT.
- Frontend mínimo con Streamlit para demo del MVP.
- Pruebas automatizadas con pytest.
- No hace scraping.
- No usa IA integrada dentro de la aplicación.
- No calcula match automático del candidato.
- No compara perfiles personales contra ofertas.
- No incluye autenticación.
- No incluye dashboard avanzado.
- Python 3.11+
- FastAPI
- SQLite
- SQLAlchemy
- Pydantic
- Streamlit
- httpx
- pytest
app/
main.py
database.py
models.py
schemas.py
crud.py
routers/
offers.py
statistics.py
exports.py
services/
skill_extractor.py
statistics_service.py
export_service.py
skill_dictionary.json
frontend/
streamlit_app.py
tests/
docs/
sample_data/
README.md
requirements.txt
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtSi tu sistema expone Python 3 como python, también puedes usar:
python -m venv .venvsource .venv/bin/activate
uvicorn app.main:app --reloadLa API queda disponible en:
http://127.0.0.1:8000
Documentación interactiva:
http://127.0.0.1:8000/docs
En otra terminal:
source .venv/bin/activate
streamlit run frontend/streamlit_app.pyStreamlit normalmente queda disponible en:
http://localhost:8501
El frontend consume el backend usando API_BASE_URL. Si no se define, usa http://127.0.0.1:8000.
API_BASE_URL=http://127.0.0.1:8000 streamlit run frontend/streamlit_app.pyEl proyecto incluye un CSV de ejemplo:
sample_data/offers_sample.csv
Flujo recomendado:
- Levanta el backend.
- Levanta el frontend Streamlit.
- Importa
sample_data/offers_sample.csv. - Revisa la lista de ofertas y estadísticas.
- Exporta el reporte para ChatGPT.
Guía completa:
docs/demo.md
Crear una oferta:
curl -X POST http://127.0.0.1:8000/offers \
-H "Content-Type: application/json" \
-d '{
"title": "Backend Developer",
"company": "Acme",
"location": "Remote",
"modality": "Remote",
"source": "LinkedIn",
"url": "https://example.com/job",
"target_area": "Backend",
"raw_description": "We need Python, FastAPI, PostgreSQL, Docker and strong communication."
}'Importar ofertas desde CSV:
curl -X POST http://127.0.0.1:8000/offers/import-csv \
-F "file=@sample_data/offers_sample.csv"Consultar estadísticas:
curl http://127.0.0.1:8000/statistics/skillsExportar reportes:
curl http://127.0.0.1:8000/exports/markdown
curl http://127.0.0.1:8000/exports/csv
curl http://127.0.0.1:8000/exports/chatgpt-reportColumnas soportadas:
title,company,location,modality,source,url,target_area,raw_descriptionCampos obligatorios:
titlecompanyraw_description
Las filas con campos obligatorios vacíos se omiten y se reportan en la respuesta del importador.
El diccionario configurable está en:
app/services/skill_dictionary.json
Categorías iniciales:
languagesbackenddatabasesdevopstestingsoft_skills
python3 -m pytest- Añadir filtros por área objetivo, modalidad y fuente.
- Añadir endpoints para consultar habilidades detectadas por oferta.
- Mejorar normalización de sinónimos y variantes de habilidades.
- Añadir migraciones con Alembic.
- Evaluar Docker en una fase posterior.