- π§ Analytics Engineer β transforming raw data into reliable, well-structured pipelines and models
- π Passionate about clean data architecture, good documentation, and making data trustworthy
- π± Currently learning: dbt Β· Microsoft Fabric Β· Databricks Β· Python & Data Pipelines Β· Claude & AI
- π¬ Ask me about Analytics Engineering, SQL, dbt, Power BI and data modelling
- π Writing about data & tech on Shift with Jo
Transform & Model
Platforms
Tools
Capstone project β Data Engineering track, Data Girls Bootcamp 2026.
An end-to-end ETL pipeline that extracts a credit score dataset from Kaggle, cleans and transforms it with pandas, and loads the result into a Databricks Unity Catalog Volume via the Files API.
- Transform: handles corrupted/sentinel values, PII pseudonymization (hashing + reversible ID mapping), type casting, range checks, and outlier/missing-value treatment β with the target column always kept untouched
- Orchestration: Apache Airflow running in Docker, backed by a Postgres metadata database so DAG run history and the admin user survive container rebuilds
- Scheduling: a daily DAG with automatic retries and a failure callback that logs which task/run failed and where to find the logs
- Documentation: every data-quality and architectural decision is explained and justified in the README
Python pandas Airflow Docker Postgres Databricks
Capstone project β dbt/Analytics Engineering course.
A dbt project built on Snowflake from scratch: a medallion-architecture pipeline (raw β staging/bronze β silver) over real public aviation data (~72K airports, ~44K runways, and user comments from OurAirports, joined on the airport_ident ICAO code).
- Incremental models: built to process new/changed data efficiently rather than full-rebuild every run
- Snapshots: slowly changing dimensions (SCD Type 2) tracked via dbt's built-in snapshot feature
- Layered testing: generic, domain-specific, cross-model, and singular tests, extended with
dbt-expectations, plus test-failure persistence for debugging - Documentation:
doc()blocks, full model/column descriptions, and an interconnection overview tying the whole DAG together - Environment: managed with
uvfor reproducible Python/dbt tooling
dbt-core Snowflake dbt-expectations SQL uv
Three independent, self-contained data projects, cleaning, static reporting, and a live BI dashboard; each solving the same class of e-commerce/CRM problem with a different final delivery format.
A portfolio repo where every project lives in its own folder with no shared code, its own dataset, and its own README, so eacendently.
- Sales data cleaning: Streamlit app + CLI that diagnoses and fixes a CRM sales export, leaked status fields, flagged/contet capitalization and accentuation, mixed date formats, revenue as BR/US-formatted text, with genuinely missing or unparseable values left untouched and surfaced for manual review, never invented.
- Static analytics report: a CSV β JSON β HTML pipeline that computes e-commerce KPIs (revenue trends, category/brand bregaps, geographic distribution) into small intermediate JSON files and renders a single static report, keeping the ~3,000-row sales table out of memory/context all at once.
- Live analytics dashboard: a multi-page Streamlit dashboard over the same dataset served from a Supabase (Postgres) database read-only via the
anonkey β Sales, Price Positioning, and Customers pages each backed by a pure, unit-tested KPI module, with every formula and data-quality caveat documented.
Python pandas Streamlit Supabase pytest


