Data Training Programme
April 2026
An intensive private data training programme covering industry tools and end-to-end workflows, with a showcase of select training deliverables.

Introduction
I completed an intensive private data training programme (Rockborne) covering industry tools and end-to-end workflows that my degree did not cover.
Below are selected deliverables from the programme which showcase the skills learnt as a result the programme.
Personal Note
This training sits inside an attract-train-deploy model: unpaid training up front, then placement with clients as a data consultant.
As of writing, I am still on the "advanced" track (self-learning while placements are found). I am also actively seeking a permanent data role outside this scheme.
About the Training
The programme was structured as instructor-led classes followed by projects for a particular tool or skill. This page covers a selection of those deliverables.
Tools and skills covered:
| Soft Skills (e.g. Data Storytelling) | Excel |
| Data Modelling & SQL (Postgres) | Tableau |
| Power BI | Python (Intermediate) |
| Machine Learning Basics | APIs and Web Scraping |
Projects were built for learning, but scoped to mimic client-style work:
- Researching the domain
- Version control (GitHub) for all code
- Documentation (data dictionaries, statements of work, use guidance)
- Presenting the project at the end (some live, some recorded)
More about the programme: Rockborne Attract-Train-Deploy.
Projects
UK Crime ELT & Power BI Dashboard
This started as a Rockborne two-parter: a (local) Python ETL over street-level crime data (enriched with population, deprivation, and economic activity), then a Power BI dashboard using the result. Grain throughout: area × force × year_month × crime_category.
The training pipeline had some honest limits (file stages on disk, Jupyter as orchestrator because the brief required it, not deployable). After the programme I rebuilt it as a more production-shaped ELT on Snowflake: land raw data first, transform in the warehouse.

What I rebuilt. Python extracts and loads (police.uk archives plus committed enrichments into bronze). dbt handles bronze → silver → gold in Snowflake (star schema plus a denormalised one-big-table for BI). Terraform provisions the database, schemas, warehouse, and stages. Bootstrap and monthly refresh run from the client or GitHub Actions.
Some source reality: police.uk switched their area codes mid-2023 (hard floor 2023-06), population lags crime months, and missing location codes become an UNKNOWN sentinel so force-level totals can stay honest. dbt tests assert uniqueness on the reporting grain.
The dashboard (training deliverable, presented live) was framed for a "time-poor, non-technical audience" (force leadership / crime analysis leads). UX is deliberately app-like: volume vs crimes-per-1k toggles, bookmarks, tooltips, and a global reset.
Fun Fact: The most crime-ridden place in south-east England is Brighton city centre (by far).

Holiday Inspiration App
This project had the coolest outcome. It's a Streamlit app where a user can input a description of what they'd like from a holiday, to get suggested destinations with useful information such as weather, activities, and safety information.

In short: it begins with a context-stuffing setup to have an LLM map a user description to a selection of three holiday destinations to choose from (out of a bespoke dataset of ~300 diverse locations). After destinations are chosen, the app loads weather/activities/safety via an IO layer backed by DuckDB. DuckDB is the source of truth: data is read from there first, and on a miss the IO layer fetches it (API or scraper), stores it, then returns it.
Here's a flowchart demonstrating how the application works at a high level:

For a real deployment I’d swap the in-container DuckDB file for a persistent database (e.g. Postgres) and add a TTL or scheduled refresh so cached API/scrape data doesn’t go stale. It works now because the cache starts empty after each cold start on Streamlit Community Cloud. A natural next step would be upgrading from context-stuffing to a proper retrieval-augmented generation (RAG) setup, which I'd like to explore but wasn't within the scope of this project. For more detail, take a look at the GitHub repo.
Note: The map feature will stop working when I turn off the GCP billing/API key one day.
Sports League Database
Designed and implemented a local relational database for a fictional football league. It served as a good refresher on data modelling (I only had one module on this at uni; see Database Theory & Design).
The schema itself was standard 3NF OLTP stuff (the ERD covers it). What I found more interesting was learning about where integrity and compliance should live.
I included a mix of constraints and triggers into Postgres for data integrity, including some business logic rules (such as disallowing red carded players to later score in a match) that afterwards I learnt wouldn't live there in a production design (they'd be upstream).
I also added an audit log and a player anonymisation procedure. That was the bit that connected most clearly to how this kind of system would need to behave under GDPR: scrub PII on request, keep the keys so historical match stats still work, and retain a trail of what changed.
Tableau Dashboard
This one was fairly simple. I was allowed to pick the data, so I sourced real Airbnb listings from Inside Airbnb and enriched them slightly with house price data for context. The framing: "if someone were considering opening an Airbnb in London, this could give them a feel for the market."

This was the first BI dashboard I made, so there are clear limitations: some metrics aren't reliable (take the last viz with a large grain of salt), and using line thickness for sample size is a weak choice for non-technical audiences. That said, it was a useful learning exercise, particularly when presenting it live.