I recently completed a Master of Data Science at the University of Western Australia.
I like working through the whole problem: checking the data, deciding how to model it, building the API or dashboard around it, and then testing the parts that can fail.
I am currently looking at roles around:
- Data Engineering
- Data Analytics / BI
- AI Engineering
- IoT / AIoT
- Applied Machine Learning
An IoT water-monitoring prototype that started as a university team project.
The original hardware used an ESP32, flow sensor, presence sensor, and water-contact sensor. My later work focused mainly on the monitoring logic, backend, simulator, dashboard, tests, and deployment setup.
The current software uses MQTT for sensor messages, FastAPI and MongoDB on the backend, WebSocket updates for the React dashboard, Telegram alerts, and device offline detection.
Tech: ESP32, MQTT, Python, FastAPI, MongoDB, WebSocket, React, Docker
A job-application helper that compares a job description with my portfolio data, retrieves evidence for each requirement, and drafts a cover letter from that evidence.
I used LangGraph for the drafting flow, ChromaDB for retrieval, FastAPI for the backend, and React for the frontend. The draft goes through a critic step and then pauses for human review before it can be approved.
The repo also includes checks for citation validity, missing-skill leakage, structured-output failures, retrieval quality, and the draft revision loop.
Tech: Python, LangGraph, OpenAI API, ChromaDB, FastAPI, React, Docker, GitHub Actions
A cyber-risk data project built from CISA KEV, FIRST EPSS, and NVD data.
The pipeline uses PySpark for Bronze/Silver/Gold processing, DuckDB and dbt for analytics, and a Random Forest model for a retrospective ranking task: given mature CVEs, rank which ones are more likely to receive a CISA KEV designation within 180 days of NVD publication.
The API returns an uncalibrated triage score rather than calling it an exploitation probability. I also added a retrieval-assisted remediation rule engine that combines a small local knowledge base with CVE-specific rules. It does not use a generative model for remediation text.
The repo includes SHAP, MLflow, Docker, Terraform, CI checks, a FastAPI service, and a Streamlit dashboard. The AWS Terraform is validated in CI, but I do not describe it as deployed because I have not applied that infrastructure.
Tech: Python, PySpark, dbt, DuckDB, scikit-learn, MLflow, SHAP, FastAPI, Docker, Terraform, AWS
A demand-forecasting project using more than 3 million historical retail records.
I used chronological backtesting and horizon-safe lag features so the model does not learn from future sales by accident. The XGBoost model reached a pooled WAPE of 12.78%, around 24.5% better than the best baseline in the same backtest setup.
I also connected the forecasts to a simple replenishment calculation with lead time, safety stock, inbound inventory, minimum order quantity, and case-pack rounding. The project has a Streamlit dashboard, a FastAPI service, a Tableau dashboard, tests, CI, and an AWS Elastic Beanstalk deployment of the API.
Tech: Python, pandas, XGBoost, FastAPI, Streamlit, Tableau, Docker, AWS
A data engineering and BI project using U.S. Bureau of Transportation Statistics flight data.
The current pilot covers January 2024: 547,271 scheduled flight segments. The pipeline validates the raw extract, cleans it with Python, writes Parquet, loads a PostgreSQL star schema, checks the warehouse again, and exposes SQL views used by a Power BI report.
While testing the loader I found and fixed a transaction bug where a row-count mismatch was being detected after the load had already committed. I also added validation for bad HHMM values and warehouse-required fields.
Tech: Python, pandas, PostgreSQL, SQL, Parquet, Power BI, pytest, GitHub Actions
A Steam game search and recommendation project that combines hard filters with semantic ranking.
Queries can include price, review score, platform, release year, play mode, and game concepts. Hard constraints are applied before ranking, so a semantically similar game cannot come back if it breaks an explicit requirement.
I added Traditional Chinese query support and regression tests for several language edge cases, including Chinese text next to English platform names and ambiguous phrases such as coop in chicken coop.
Tech: Python, sentence-transformers, pandas, semantic search, Streamlit, pytest
Data: Python, SQL, PostgreSQL, pandas, PySpark, dbt, DuckDB, Parquet
Machine learning: scikit-learn, XGBoost, time-series forecasting, feature engineering, SHAP, MLflow
AI applications: RAG, LangGraph, vector search, structured outputs, evaluation, FastAPI
IoT: ESP32, MQTT, sensor data processing, WebSocket, device monitoring
Engineering: Docker, GitHub Actions, Terraform, AWS, REST APIs, Linux
BI / visualisation: Power BI, Tableau, Streamlit
- IoT edge and device monitoring
- Cloud data pipelines
- Local LLM deployment
- MLOps and model monitoring
GitHub: github.com/momo840505