Data Science Resources
Data Science & Hydrological Projects
Explore my work at the intersection of hydrology, environmental science, and data analysis. These projects demonstrate how modern data science techniques can be applied to solve complex water resources engineering problems.
Blog Posts
Graphing a Water Balance — a Python Port of Tony Ladson's R Method
A Python port of Tony Ladson’s waterfall-chart method for visualising an urban catchment water balance — plus a check the original R script doesn’t run: does...
Reading a Skew-T Log-P Diagram: The Chart Behind Every Severe Weather Warning
Every BOM severe weather and thunderstorm outlook leans on a chart most engineers have never been taught to read. Here’s what it actually shows, and a worked...
Why Rainbow Colour Scales Mislead — a Python Follow-up to Tony Ladson's Post
‘Don’t use rainbow colourmaps’ is good advice usually delivered as an assertion. This is the same advice with the receipts — a measurable reason a jet colour...
Python Packages for Hydrology — a Companion to Tony Ladson's R Roundup
Tony Ladson’s 2017 roundup of R packages for hydrology is a genuinely useful map of that ecosystem. This is the Python-side equivalent — independently resear...
Stochastic Rainfall Generation with pyraingen: A Practitioner's Evaluation
pyraingen promises stochastic daily/subdaily rainfall generation with IFD constraining — a genuinely useful way to explore rainfall behaviour beyond a single...
Fitting a Probability Model to POT Data — a Python Port of Tony Ladson's R Method
Tony Ladson’s R blog has quietly taught a lot of Australian hydrologists how to actually do this stuff in code. This is a validated Python port of his method...
Fitting Non-linear Models in Python: Confidence vs. Prediction Intervals
R’s nls() doesn’t give you confidence or prediction intervals the way lm() does for linear models — you have to do the propagation yourself, or reach for ano...
How Big Is 1 in 2000? Framing Extreme Probabilities for Clients and Regulators
The human mind isn’t built to distinguish a 1 in 100 chance from a 1 in 2000 chance — they both just feel ‘rare’. A time-based framing that actually works, v...
Was That Flood an Outlier? A Python Diagnostic for Non-Stationarity in Flood Frequency Analysis
‘Unprecedented’ gets used loosely after a big flood. Fitting a stationary distribution to the historical record, running a trend test, and checking what AEP ...
Better Line Graphs for Hydrologic Data — a Python Port of Tony Ladson's R Method
A sequential colour palette is the wrong tool for distinguishing unrelated categories — it implies a ranking that isn’t there and gives the least contrast ex...
Screening ARR 2019 Temporal Patterns for Embedded Burst Errors
Running 10 ARR temporal patterns is standard practice. Some contain a specific, recognisable error pattern that produces physically unrealistic flood peaks. ...
Areal Reduction Factors in Python — a Port of Tony Ladson's ARR 2019 Method
An earlier attempt at this post stalled on a missing long-duration equation, 10 regional coefficient sets, and an interpolation rule that isn’t obvious from ...
AI Doesn't Remove the Judgment Calls in Climate Science — It Just Makes Them Easier to Miss
A benchmark of AI rainfall-downscaling models found no single model performed best across every metric or region — a precise, checkable illustration of a big...
AI Flood Forecasting Is Arriving Fast — Here's What a Practitioner Should Actually Check
Google’s Flood Hub and DeepMind’s GraphCast both landed with genuinely impressive claims. Six years running DELFT-FEWS in an operational flood centre suggest...
Sampling ARR 2019 Loss Distributions in Python — A URBS Pre-Processor
ARR 2019 recommends Monte Carlo simulation treating initial loss as a random variable. Most practitioners still use fixed median values because the sampling ...
Is Nash-Sutcliffe Efficiency Enough? A Python Comparison of Calibration Metrics for Australian Flood Models
Automated calibration routinely produces high NSE values on models that are physically unrealistic. This post implements NSE, KGE, PBIAS, and peak flow bias ...
Baseflow Separation Using the Lyne-Hollick Filter — A Python Implementation
The standard Australian baseflow separation method exists only in R. This post provides a validated Python translation, applied to the Ladson reference examp...
Open-Source Flood Frequency Analysis for ARR 2019: My pyextremes Fork
I’ve extended the pyextremes Python library to support ARR 2019 / Bulletin 17C–compliant at-site flood frequency analysis — adding LP3, Multiple Grubbs-Beck ...
Australia's Rainfall Is Getting More Intense — And the Regional Variation Matters
A 7.2% per °C average increase in extreme rainfall intensity across Australia conceals enormous regional variation — from 21.3% in the monsoonal north to 1.4...
The Death of the 'Average' Year: Why Hydroclimatic Whiplash Is Making Seasonal Predictability Obsolete
France went from managing a multi-year structural water deficit to a nationwide flood emergency in a single weather event. The lesson for Australian dam oper...
France's Flood Crisis Reveals a Critical Engineering Blind Spot: Hydro-Climatic Whiplash
France endured 37 consecutive days of rain — the longest unbroken streak since 1959. But the mechanism driving the disaster isn’t the rainfall total. It’s th...
The Water Bankruptcy Framework: Are We Managing Crisis or Permanent Failure?
The UN University’s ‘water bankruptcy’ concept reframes persistent water insecurity as structural failure rather than temporary crisis. For Australian practi...
Visualising 130 Years of Australian Rainfall Intensity Change in Python
I replicated Ed Hawkins’ climate stripes style using the Simple Daily Intensity Index and the SILO Patched Point Dataset to show how rainfall intensity is sh...
Glen Canyon Dam and the Infrastructure Designed for a World That No Longer Exists
Lake Powell dropped within 30 feet of minimum power pool in 2023. The River Outlet Works — the last remaining release mechanism at low levels — experiences d...
2,450mm in 40 Days: When Rainfall Records Don't Just Break — They Shatter
Grazalema, Spain recorded 2,449mm in 40 days and 512.5mm in a single 24-hour period. What does this mean for the IFD curves we design infrastructure around?
The Silent Drawdown: Is Evaporation Eating Our Water Security?
The past three years — 2024, 2023, and 2025 — were the three hottest years on record. For Australian dam operators and water planners, one under-examined con...
Exploring Frontier Relationships in 16,437 Calibrated Australian URBS Models
What happens when you plot rainfall, catchment area and peak flow for 55,000 print locations from Terry Malone’s calibrated Australian URBS dataset? A fronti...
Reading the 2024 Kedron Brook Flood Study: What the Data Says About 2022 Flood AEPs
The 2024 Kedron Brook Flood Study (Brisbane City Council) provides a rare opportunity to see a rigorous Bayesian flood frequency analysis applied to a well-i...
Automating Flood Model Post-Processing with Python
Post-processing TUFLOW results used to take hours. Here’s how a few Python scripts changed that — and what I learned building them.
North Queensland's 2024/25 Wet Season: Tracking Record Cumulative Rainfall at Ingham, Paluma and Townsville
Three coastal gauges in North Queensland — Ingham, Paluma and Townsville — all came in at or close to maximum accumulation for the 2024/25 water year. The Ro...
Why Continuous Simulation Beats Design Storms for Flood Risk
Design storms have served the industry well, but they carry embedded assumptions that continuous simulation exposes. Here’s why the shift matters.
The Unknown Pleasures of Brisbane Rainfall: 136 Years of Weekly Data
Joy Division’s Unknown Pleasures album cover — stacked ridgeline plots of pulsar radio data — is one of the most iconic scientific visualisations ever repurp...
136 Years of Rainfall at the Gabba: What the Data Says About Brisbane Test Cricket
The Australia v India Brisbane Test Match prompted me to pull 136 years of SILO rainfall data for the Gabba and ask: what fraction of days in late November a...
A Practitioner's Primer on Bayesian Flood Frequency Analysis
Bayesian methods for flood frequency analysis are no longer academic curiosities. Here’s what they offer and when they’re worth the extra effort.
Delft-FEWS Model Adapter Development
Delft FEWS Proof of Concept Model adapter
Peak Over Threshold Analysis
Peak over Threshold
First Blog Post
Markdown Style Guide
Bayesian Inference Example - Using Python
Bayesian Coin Toss example code
Technical Expertise
Programming & Data Analysis
- Python: Pandas, NumPy, SciPy, Matplotlib, Seaborn
- R: Statistical modeling and data visualization
- Database Technologies: SQL, Data warehousing concepts
Hydrological Modeling
- Continuous Simulation: GoldSim, WaterRIDE
- Event-Based Modeling: TUFLOW, MIKE FLOOD, HEC-RAS
- Conceptual Models: RORB, URBS
Data Visualization
- Interactive dashboards with Tableau
- Custom visualizations with Python and R
- GIS mapping and spatial analysis
Publications & Presentations
- “Python the lingua franca of FEWS” - Presentation at Delft FEWS User Day Melbourne 2019
- Technical reports on flood risk assessment methodologies
- Internal documentation on innovative modeling approaches
Open Source Contributions
I contribute to the water resources engineering community through:
- Code repositories for model adapters and utilities
- Technical documentation and tutorials
- Participation in professional forums and discussions
For collaboration on water resources projects, please contact me.