Data analyst who builds | Python, SQL, ML, AI systems | MSc Business Analytics and Data Science @ IE University, Madrid
🇮🇪 International 400m sprinter for Ireland (PB 46.95s, European U23 relay finalist)
I take messy real world data, turn it into something a person can act on, and check my own numbers before anyone else has to.
Most of what I build starts with a raw source like CRM records, bank transactions, SEC filings, stock fundamentals, Kaggle datasets or my own training logs. It ends with something a team can use: a forecast, a dashboard, an alert or a ranked list. I build quickly with AI coding tools, then spend the time I save on tests and validation. Two of the projects below were rebuilt after I found errors in my own earlier results, and I published what I found.
- Studying: MSc Business Analytics and Data Science at IE, Madrid. Available for roles from August 2027.
- Building: a tool that drafts security questionnaire answers from a vendor's public trust pages, with a citation for every answer and a flagged gap wherever the evidence is missing
- Learning: Spanish (A2, working toward B1)
Each project follows the same shape: what goes in, what I do to it, what comes out.
🏦 aml-transaction-monitoring-dbt · anti money laundering rules and a model, scored honestly
In: IBM's synthetic AMLworld bank transactions: 5.1M transactions over 18 days, 0.10% of them laundering, with labels.
Transformation: dbt and DuckDB models turn raw transactions into account level labels and features per time window. Five SQL detection rules (fan in and out, structuring, pass through, cycles, baseline anomaly) are tuned on days 1 to 7, then scored on days 8 to 18 and on a second dataset I never tuned on. A gradient boosted model is compared with them at equal alert volume. 26 models, 105 tests, CI on a committed sample.
Out: the best rule (fan in and out) lifts precision about 10x over the base rate at 5 alerts per 1,000 accounts. The model beats the rules on the first dataset (24.5% precision at that volume after I removed four features that proxy the simulator, 35.4% with them) but is only level with fan in and out on the second. So the rules are a baseline, not a detector, and the data is synthetic.
Authorship: Claude Code wrote the SQL, tests and scripts. I specified the project, designed the evaluation and reviewed the results. The repo README says so.
Stack: Python, SQL, dbt, DuckDB, scikit-learn, GitHub Actions
🤖 medalist · an AI agent that enters ML competitions on its own
In: a competition bundle (training data, target column, scoring metric, fixed cross validation folds)
Transformation: an AI agent designs and runs experiments. The harness around it enforces the rules the agent can't be trusted to keep itself: a holdout set carved off before the agent sees any data, fixed folds, a time and experiment budget, and a SQLite ledger of every run.
Out: a valid submission and a written report. On Kaggle Playground S6E3 (4,143 teams) it reached an estimated top 15.8% in 17 experiments with no human input.
Stack: Python, LightGBM, XGBoost, CatBoost, SQLite, pytest (139 tests), GitHub Actions
📈 TradeMetrics · portfolio analytics you can check line by line
In: daily portfolio values, a trade log and benchmark prices. The repo uses synthetic data; my own account stays private.
Transformation: computes Sharpe with confidence intervals, Sortino, CAPM alpha and beta, Value at Risk, and long and short FIFO profit and loss net of commissions.
Out: a single file HTML report, plus a notebook that proves every metric against simulated data where the true answer is known in advance.
Why it exists: my first version got Sortino, alpha, VaR and FIFO wrong. I rebuilt it test first (79 tests) and removed the Sharpe ratio I used to quote, because one year of returns can't support it.
Stack: Python, pandas, NumPy, SciPy, pytest, Jupyter, GitHub Actions
🏃 OptimalAthlete · the model that taught me about data leakage
In: training sessions, wellness metrics and race results for 400m sprinters
Transformation: builds 12 features over real calendar windows, trains Random Forest and XGBoost, and scores them with walk forward validation against a simple "recent average" baseline.
Out: a Streamlit dashboard and an honest verdict. My first version claimed R² of 0.84. When I audited it, the model was recognising which athlete was racing, not predicting form. I retracted the number and built a demo: on data with zero signal, the old method still reports R² of 0.906.
Stack: Python, sklearn, XGBoost, SQLAlchemy, Streamlit, Plotly, pytest (31 tests), GitHub Actions
🔎 GrowthHog · a weekly screener for 170+ growth stocks
In: fundamentals, prices and news from Polygon, with FMP and yfinance as fallbacks
Transformation: computes 8 trailing twelve month metrics, puts each company in a lifecycle stage (Early, Hypergrowth, Scaling, Maturing) and reweights its score to match. Sanity caps and a cyclical sector adjustment stop one off events from looking like quality.
Out: a 0 to 100 score per company, an HTML report and a Dash dashboard, refreshed weekly on cron
Stack: Python, pandas, Dash, Polygon API, Anthropic API
The code for these is private because it runs on client data. Happy to walk through any of them.
Fund Recs, Dublin · fund reconciliation FinTech · GTM Systems and Analytics Intern, 2026
- Churn early warning: product telemetry + CRM + revenue records → the company's first account by month table → a Kibana dashboard showing how far ahead usage drops signal revenue decline
- Pipeline forecast: 707 resolved CRM deals → a forecast rebuilt in SQL → adopted by the CRO
- Compliance answers: internal policy and due diligence documents → a RAG system → answers in seconds instead of a manual search
Leaving Cert Plus · EdTech for Ireland's school leaving exams · freelance AI and technical consultant, 2026 to now
- Maths verification engine: AI generated exam questions → a deterministic checker validates each one → only verified questions reach students (content costs down about 50%)
- Content pipelines: three AI generation pipelines for information subjects, languages and maths
- Email CRM: replaced Mailchimp with a custom EU hosted CRM (platform costs down 60%+)
Side build: an SEC filing monitor that watches EDGAR for new filings, flags odd lot tender offers and sends Telegram alerts. Deployed on Railway.


