Selected work

Sales Analytics Pipeline

Messy sales. Consistent reports.

SALESCUSTOMERSCLEAN + JOINWEEKLYCUSTOMERSCATEGORIESLOYALTY

The starting point.

Inconsistent prices, dates and customer keys can quietly distort revenue. Reports need clear cleaning rules and a shared transaction population before their totals can be compared.

What I built.

I consolidated my sales-analysis and containerisation assignments into one runnable pipeline. I added local sample configuration, duplicate-customer protection, ISO year/week grouping and regression checks for reporting errors.

Follow the flow.

01 / Read

Load the supplied sales and customer teaching inputs locally; Azure Blob transfers are optional.

98customer-matched transactionsIncluded teaching sample · 122 input sales rows

The included teaching sample contains 122 sales rows. Cleaning retains 102 transactions, of which 98 match customers. All four reports use that matched population; weekly, customer and category revenue totals reconcile.

Decisions that matter.

  1. 01

    Protect the join before aggregation.

    Two customer rows with the same normalized email would inflate sales after a join. The pipeline refuses duplicate customer keys instead of producing plausible but incorrect totals.

  2. 02

    Reconcile one reporting population.

    All summaries use the same matched transactions. Tests compare their revenue totals, and weekly grouping includes the ISO year so different years cannot merge into the same week.

  3. 03

    Make the first run easy to inspect.

    The default run uses included teaching inputs and writes local reports without cloud credentials. Docker and CI exercise that path; cloud transfers remain an optional extension.

The work is open.

Implementation, decisions, and review history.

Python / pandas / CSV / Parquet / Docker / pytest / Ruff / GitHub Actions

NYC Taxi Databricks Lakehouse

Let’s build
something real.

Working-student opportunities / 16 hrs a week / Amsterdam