Portfolio · Health Care Information Systems

Portafolio · Sistemas de Información de Salud

Work

Trabajo

Standards-based tools that turn raw clinical data into structured, interoperable, audit-ready records — HL7/FHIR interoperability, data-integrity validation, clinical safety guardrails, and human-subjects protection under GCP and HIPAA.

Herramientas basadas en estándares que convierten datos clínicos crudos en registros estructurados, interoperables y listos para auditoría — interoperabilidad HL7/FHIR, validación de integridad, salvaguardas de seguridad clínica y protección de sujetos humanos bajo GCP y HIPAA.

01

EVA CTMS Archive — clinical data ETL pipeline

Archivo EVA CTMS — pipeline ETL de datos clínicos

ProblemProblema
A decommissioned Clinical Trial Management System left ~9,925 documents in inconsistently named folders plus a separate 6,830-record patient database, with no archive structure. Everything had to be understood, cleaned, and validated before migration — without exposing patient data to an external AI or cloud service.Un CTMS desmantelado dejó ~9,925 documentos en carpetas con nombres inconsistentes y una base de 6,830 pacientes, sin estructura de archivo. Todo debía entenderse, limpiarse y validarse antes de migrar — sin exponer datos de pacientes a una IA o nube externa.
What I builtQué construí
A 10-stage local Python ETL pipeline: capture raw structure, crawl and classify every document, build a patient roster, clean the patient database, cross-validate documents against patients, generate a SharePoint build plan, and tag by study and deviation.Un pipeline ETL local de 10 etapas en Python: capturar la estructura, clasificar cada documento, construir un registro de pacientes, limpiar la base, validar documentos contra pacientes, generar el plan de SharePoint y etiquetar por estudio y desviación.
ImpactImpacto
Caught 1,791 documents (18%) whose filename patient IDs matched no real patient — before migration, not after. All processing local, PHI masked in every log, and a searchable SharePoint archive with the Patient Lookup and Deviation views staff asked for.Detectó 1,791 documentos (18%) cuyos IDs no coincidían con ningún paciente real — antes de migrar, no después. Todo local, PHI enmascarado en cada registro y un archivo SharePoint consultable con las vistas que el personal pedía.
  • Python
  • pandas
  • openpyxl
  • Regex
  • JSON/YAML
  • python-docx
  • SharePoint
02

Bilingual Patient Intake → FHIR R4

Admisión bilingüe de pacientes → FHIR R4

ProblemProblema
Language barriers at intake lead to incomplete histories and dirty data, and turning that data into something an EHR can read (FHIR) is usually a manual, error-prone step.Las barreras de idioma en la admisión generan historiales incompletos y datos sucios, y convertirlos en algo que un EHR pueda leer (FHIR) suele ser un paso manual y propenso a errores.
What I builtQué construí
An EN/ES intake form and a FastAPI service that validates every submission with a strict Pydantic v2 model, then maps it to Patient, Encounter, Coverage, Condition (SNOMED CT), AllergyIntolerance, and MedicationStatement resources.Un formulario EN/ES y un servicio FastAPI que valida cada envío con un modelo Pydantic v2 estricto y lo mapea a recursos Patient, Encounter, Coverage, Condition (SNOMED CT), AllergyIntolerance y MedicationStatement.
ImpactImpacto
Malformed data is rejected at the source with field-level errors. The bundle is self-contained (every reference resolves) and is checked against the official FHIR models by 80 automated tests at 100% coverage. The live demo runs that tested Python in the browser via Pyodide, so it needs no server.Los datos inválidos se rechazan en el origen con errores por campo. El bundle es autocontenido (cada referencia se resuelve) y lo verifican 80 pruebas automatizadas con 100% de cobertura contra los modelos FHIR oficiales. La demo ejecuta ese Python probado en el navegador con Pyodide, sin servidor.
  • Python
  • FastAPI
  • Pydantic v2
  • FHIR R4
  • SNOMED CT
  • pytest
Intake app showing the generated FHIR R4 bundle in Spanish
A Spanish-language submission returns a 9-resource FHIR R4 Bundle.
Un envío en español devuelve un Bundle FHIR R4 de 9 recursos.
03

HL7 v2.x Infectious Disease Parser

Analizador HL7 v2.x de enfermedades infecciosas

ProblemProblema
Legacy HL7 v2.x lab messages are black boxes for many public-health teams, and a wrong LOINC mapping silently misclassifies a result.Los mensajes HL7 v2.x son cajas negras para muchos equipos de salud pública, y un mapeo LOINC incorrecto clasifica mal un resultado sin avisar.
What I builtQué construí
A Python engine (ingestion → validation → transformation) that honors the delimiters each message declares, validates every segment through Pydantic v2 models, verifies LOINC check digits, and summarizes nine infectious-disease categories. A bilingual browser demo applies the same rules.Un motor en Python (ingesta → validación → transformación) que respeta los delimitadores de cada mensaje, valida cada segmento con modelos Pydantic v2, verifica dígitos de control LOINC y resume nueve categorías de enfermedades infecciosas. Una demo bilingüe aplica las mismas reglas.
ImpactImpacto
Every defect is reported with its exact location (e.g. PID-7, OBX[2]-5) instead of crashing. 81 tests at 99% coverage, and every LOINC code verified against loinc.org.Cada defecto se reporta con su ubicación exacta (p. ej. PID-7, OBX[2]-5) en lugar de fallar. 81 pruebas con 99% de cobertura y cada código LOINC verificado en loinc.org.
  • Python
  • Pydantic v2
  • pytest
  • LOINC
  • SNOMED CT
  • JavaScript
HL7 parser summarizing a four-analyte respiratory panel
A respiratory panel (COVID-19, Flu A/B, RSV) parsed into disease badges.
Un panel respiratorio (COVID-19, Influenza A/B, VSR) convertido en indicadores.
04

Pediatric CDS Dosage Calculator

Calculadora pediátrica de dosis (CDS)

ProblemProblema
Pediatric dosing errors are never events: every dose is weight-based, and a slipped decimal can mean a 10× overdose. Language gaps with caregivers add risk after discharge.Los errores de dosificación pediátrica son eventos que nunca deben ocurrir: toda dosis depende del peso y un decimal mal puesto puede significar una sobredosis de 10×. Las brechas de idioma con cuidadores añaden riesgo.
What I builtQué construí
A clinical decision support tool backed by a layered Python package (Pydantic v2, FastAPI): weight validation and unit conversion, mg/kg calculation, a hard stop above the maximum single dose, an 80% caution threshold, a daily-maximum cap, and instructions in English and Spanish.Una herramienta de soporte a la decisión clínica respaldada por un paquete Python por capas (Pydantic v2, FastAPI): validación y conversión de peso, cálculo mg/kg, parada estricta sobre la dosis máxima, umbral de precaución del 80%, tope diario e instrucciones en inglés y español.
ImpactImpacto
Unsafe doses can't be accepted silently, high-but-safe doses prompt a double check without alert fatigue, and Spanish-speaking families get the same instructions as English speakers. 58 tests at 100% coverage; the live demo runs the tested Python in the browser.Las dosis inseguras no pueden aceptarse en silencio, las dosis altas pero seguras piden una doble verificación sin fatiga de alertas, y las familias hispanohablantes reciben las mismas instrucciones. 58 pruebas con 100% de cobertura; la demo ejecuta el Python probado en el navegador.
  • Python
  • Pydantic v2
  • FastAPI
  • Pyodide
  • pytest
  • JSON i18n
Dosage calculator blocking a dose above the maximum safe limit
A dose above the medication maximum triggers a hard stop: DO NOT ADMINISTER.
Una dosis sobre el máximo activa una parada estricta: NO ADMINISTRAR.

Supporting tools

Herramientas de apoyo

Smaller, focused utilities for data portability and operations.

Utilidades enfocadas en portabilidad de datos y operaciones.

FHIR converter showing US Core Patient JSON

05 · US Core · FHIR R4

FHIR Patient Converter

Convertidor de pacientes FHIR

Validates intake data and converts it into US Core Patient resources: MRN typed with v2-0203, emergency-contact relationships coded in v3-RoleCode from English or Spanish text, and no empty arrays (a FHIR JSON rule). A batch CLI reports bad records without stopping the run. 53 tests.

Valida datos de admisión y los convierte en recursos Patient de US Core: MRN tipificado con v2-0203, relaciones de contacto codificadas en v3-RoleCode desde texto en inglés o español, y sin arreglos vacíos (regla de FHIR JSON). Un CLI por lotes reporta registros inválidos sin detenerse. 53 pruebas.

  • Python
  • Pydantic v2
  • US Core
  • pytest
  • JavaScript

06 · Biomedical equipment

BioMed Inventory Tracker

Rastreador de inventario biomédico

Tracks preventive-maintenance (PM) status for high-risk clinical assets to support Joint Commission and CMS compliance.

Rastrea el estado de mantenimiento preventivo (PM) de activos clínicos de alto riesgo para apoyar el cumplimiento de Joint Commission y CMS.

  • JavaScript
  • HTML
  • CSS

Core competencies

Competencias principales

DomainDominioSkills & standardsHabilidades y estándares
InteroperabilityInteroperabilidadHL7 FHIR R4 · HL7 v2.x · US Core profiles · JSON Schema
Clinical terminologyTerminología clínicaLOINC · SNOMED CT · ICD-10 · UCUM
Data engineeringIngeniería de datosPython (pandas, Pydantic v2) · ETL design · validation & cross-checks · pytest
DevelopmentDesarrolloFastAPI · JavaScript (ES6+) · API design · i18n / L10n · Git & CI
Clinical workflowFlujo clínicoCDS logic · PGHD intake · error reduction · WCAG 2.1
ComplianceCumplimientoHIPAA · ICH-GCP · human-subjects protection · PHI masking · audit trails

Hiring for clinical data work?

¿Buscas talento en datos clínicos?

I'm open to full-time ETL / data engineering and clinical data roles.

Estoy disponible para roles de ETL / ingeniería de datos y datos clínicos.