Skip to main content
AquaScope logo

AquaScope

Open-source Python toolkit for water data, hydrology, and agricultural water management — with an AI engine that recommends and auto-executes research methodologies.

CI Pyodide PyPI version Python License: MIT DOI Code style: ruff Tests Live Explorer Demo – Runs in Your Browser

GitHub stars GitHub forks

🌊 Live Explorer Demo - Runs in Your Browser, No Install Required · Install · Examples · CLI · Features · Docs · Roadmap · Discussions

Support on Ko-fi if AquaScope helps your research.

🌐 Read this in: Français


AquaScope unifies 29 global water-data sources behind one Python schema, then layers a full scientific computing stack on top — from Bulletin 17C flood frequency to FAO-56 crop water requirements — wrapped in an AI engine that scores 26 research methodologies against your dataset and auto-executes 26 analysis pipelines. Validated against the CAMELS benchmark with 1,000+ tests.


🌍 Try it without installing anything

AquaScope Explorer: every public gauge we can reach on one map (45,919 stations from USGS, UK EA, Hub'Eau, PEGELONLINE, Ireland OPW and Taiwan CWA). Click one and get the observed record, flood frequency with confidence limits, flow duration and trend, computed in your browser by aquascope on Pyodide. The catalog behind it is an open GeoParquet dataset, Rekin226/aquascope-gauges, harvested weekly. Press Ask ✨ to type a question in plain language (bring your own key, Groq and Hugging Face are free): the model picks the tools, aquascope runs them in your browser, and the answer ends with the data used and the methods with citations. Not a Python user? The same files open in R, QGIS, DuckDB and Julia in place; integrations/qgis/ has a drag-and-drop layer definition.

Prefer an assistant? pip install "aquascope[mcp]" then claude mcp add aquascope -- aquascope mcp gives Claude (or any MCP client) find_stations, get_timeseries, analyze_station and flood_frequency over the same catalog and methods (docs).

✨ What you can do

  • 🌊 Pull water data from USGS, FAO AQUASTAT, FAO WaPOR, GEMStat, EU WFD, Copernicus ERA5, France Hub'Eau, Taiwan MOENV/WRA/Civil IoT/DataGov, Japan MLIT, Korea WAMIS, India WRIS, GRDC, CAMELS-CL, OpenMeteo, UN SDG 6, US Water Quality Portal — one unified Python API.
  • 📈 Run hydrological analyses — Bulletin 17C flood frequency (GEV / LP3 / Gumbel / non-stationary GEV / EMA), baseflow separation, rating curves, 22 hydrological signatures.
  • 🌾 Plan agricultural water — FAO-56 Penman-Monteith ET₀, crop water requirements for 23 crops, irrigation scheduling, soil water balance with auto-irrigation.
  • 🤖 Ask the AI engine — describe your goal in plain English and get a recommended methodology, scored against your dataset profile and auto-executed. LLM enhancement via OpenAI, Groq (free), HuggingFace (free), or local Ollama.
  • 📊 Visualise + report — 16 plot types, Q-Q / P-P diagnostics, Markdown / HTML reports with embedded figures, threshold alerts (WHO / EPA / EU WFD).
  • 🗺️ Spatial hydrology — DEM processing, D8 flow direction, watershed delineation, Strahler ordering.

For the full capability list see docs/features.md.

📊 Why AquaScope

AquaScope HEC-SSP R lmom Standalone collectors
Bulletin 17C FFA + EMA partial
Non-stationary GEV partial
Baseflow separation (Lyne-Hollick, Eckhardt)
FAO-56 Penman-Monteith ET₀ + crop water
29 unified data collectors per-source
AI methodology recommender (OpenAI / Groq / HF / Ollama)
Interactive Streamlit dashboard
Free, MIT, Python-native partial varies

⚡ Install

pip install aquascope              # core — collectors + hydrology
pip install "aquascope[all]"       # everything — ML, viz, spatial, dashboard

Feature-group extras:

pip install "aquascope[ml]"           # sklearn, xgboost, statsmodels
pip install "aquascope[viz]"          # matplotlib, seaborn, folium
pip install "aquascope[scientific]"   # xarray, netcdf4, h5py
pip install "aquascope[interop]"      # xarray + geopandas (collect as_xarray / as_geodataframe)
pip install "aquascope[spatial]"      # rasterio, geopandas, shapely
pip install "aquascope[dashboard]"    # streamlit
pip install "aquascope[forecast]"     # prophet, torch (for LSTM)

For development:

git clone https://github.com/Rekin226/aquascope.git
cd aquascope
pip install -e ".[all,dev]"

🚀 Examples

1. Flood frequency analysis (Bulletin 17C)

from aquascope.api import flood_analysis

result = flood_analysis(daily_discharge, method="gev", return_periods=[10, 50, 100])
print(result.return_periods)
# {10: 1840.2, 50: 2530.7, 100: 2870.4}
print(result.confidence_intervals)
# {10: (1690.4, 2010.6), 50: (2280.1, 2820.9), 100: (2540.6, 3260.5)}

Switch method to "lp3", "gumbel", "gev_lmoments", or "gpd". Non-stationary GEV (fit_nonstationary_gev) and Bulletin 17C EMA for censored records (expected_moments_algorithm) are available in aquascope.hydrology.flood_frequency.

2. Baseflow separation + hydrological signatures

from aquascope.api import baseflow_analysis, compute_all_signatures

bf  = baseflow_analysis(daily_discharge, method="eckhardt")   # or "lyne_hollick"
sig = compute_all_signatures(daily_discharge)

print(bf.bfi)                  # baseflow index, e.g. 0.42
print(sig.q5, sig.q95)         # high-flow / low-flow exceedances
print(sig.flashiness_index)    # Richards-Baker flashiness index

22 signatures across magnitude, variability, timing, recession, and flashiness — see docs/features.md.

3. Collect data from any of the 29 sources

from aquascope import find_stations
from aquascope.collectors import USGSCollector, AquastatCollector, WaPORCollector

# Which gauges measure discharge around Greater London? (USGS, UK EA, Hub'Eau,
# PEGELONLINE, Ireland OPW and Taiwan CWA expose station catalogs; more coming)
gauges = find_stations(bbox=(-0.5, 51.3, 0.3, 51.7), variable="discharge")
print(gauges[0].name, gauges[0].url)

usgs = USGSCollector()   # pass api_key=... for reliable access
flow = usgs.collect(days=7, bbox="-77.6,38.7,-76.9,39.1")   # Potomac basin, last week

aquastat = AquastatCollector()
egy_water = aquastat.collect(country_code="EGY", variable_ids=[4263, 4253, 4312])

wapor = WaPORCollector()
et = wapor.collect(
    bbox=(30.5, 29.8, 31.1, 30.2),
    variable="RET",
    start_date="2026-04-01",
    end_date="2026-07-31",
)

Every collector returns records in the same Pydantic schema, so downstream analyses don't care where the data came from. See docs/data_sources.md for the full list.

4. FAO-56 crop water requirements + soil water balance

from datetime import date
from aquascope.agri import (
    penman_monteith_daily,
    crop_water_requirement,
    SoilWaterBalance,
)
from aquascope.agri.water_balance import SoilProperties

# Reference ET (FAO-56 Penman-Monteith) — Cairo, July
eto = penman_monteith_daily(
    t_min=18.0, t_max=32.0, rh_min=40, rh_max=80,
    u2=2.0, rs=22.0, latitude=30.0, elevation=70, doy=180,
)

# Crop water requirement for maize from planting through harvest — eto_series is
# a daily ET₀ pd.Series (build one with penman_monteith_series on a weather DataFrame)
cwr = crop_water_requirement(eto_series, crop="maize", planting_date=date(2026, 4, 1))

# Soil water balance with auto-irrigation triggers — returns a daily DataFrame
soil    = SoilProperties(field_capacity=0.30, wilting_point=0.15, root_depth=1.0)
balance = SoilWaterBalance(soil).auto_irrigate(
    cwr["etc"], precip_series, efficiency=0.7,
)
print(balance["irrigation_mm"].sum())             # total irrigation applied (mm)
print(int(balance["irrigation_trigger"].sum()))   # number of deficit days

Notebook tutorial: agricultural water demand and irrigation scheduling.

5. AI methodology recommender

from aquascope.ai_engine import DatasetProfile, recommend

# Describe your dataset and goal — get ranked, scored methodologies
profile = DatasetProfile(
    parameters=["DO", "BOD5", "COD"],
    n_records=4_500,
    time_span_years=6.0,
    research_goal="detect long-term pollution trends with seasonality",
)
recs = recommend(profile)

for r in recs[:3]:
    print(f"{r.score:5.1f}  {r.methodology.id:<18}  {r.rationale[:46]}…")
#  55.9  trend_analysis      Your dataset includes bod5, cod, do which are…
#  54.6  lstm_forecasting    Your dataset includes bod5, cod, do which are…
#  54.6  arima_forecast      Your dataset includes bod5, cod, do which are…

Then auto-execute the top result with run_pipeline(recs[0].methodology.id, df).

6. Change-point detection + copula dependence

from aquascope.api import detect_changepoints, fit_copula

cps  = detect_changepoints(annual_runoff, method="pettitt")
cop  = fit_copula(rainfall, runoff, family="auto")    # AIC-selects Gaussian/Clayton/Gumbel/Frank
cp   = cps.changepoints[0]
print(cp.timestamp, cp.p_value)
print(cop.family, cop.parameter, cop.aic)

7. Bayesian regression with uncertainty quantification

from aquascope.api import bayesian_regression

# Annual rainfall → runoff with full posterior + convergence diagnostics
posterior = bayesian_regression(X=annual_precip, y=annual_runoff)

print(posterior.posterior_mean)
# {'beta_0': 12.4, 'beta_1': 0.82, 'sigma2': 41.6}

print(posterior.credible_intervals["beta_1"])
# (0.78, 0.86)        ← 95% credible interval on slope

print(posterior.r_hat)
# {'beta_0': 1.00, 'beta_1': 1.00, 'sigma2': 1.00}    ← Gelman–Rubin, converged

print(posterior.dic, posterior.effective_sample_size["beta_1"])
# 124.7  9842.0       ← model fit + effective sample size

Switch to MCMC with degree>1 for polynomial models, or pass prior_precision for informative priors. Conjugate linear, polynomial, and Metropolis-Hastings backends are all available.


💻 CLI

AquaScope ships a 27-command CLI (agri, basins, caravan, gym and playbooks carry subcommands) for the most common workflows:

# Find stations, then collect data
aquascope stations --bbox -0.5,51.3,0.3,51.7 --variable discharge --format geojson
aquascope harvest stations --out archive          # the open gauge catalog (GeoParquet)
aquascope basins at 48.85 2.35                    # the catchment of any point: area, climate, land cover, soils, dams (BasinATLAS)
aquascope basins similar 25.04 121.56             # gauged basins whose catchments look most like this point's (ungauged-site donors)
aquascope basins regionalize 52.29 -3.51          # estimated flow regime of an ungauged point from those donors, with the leave-one-out skill
aquascope assess 51.415 -0.308 --problem flood_risk   # what can be answered here: gauges in reach, catchment, which methods the record supports
aquascope caravan export --source uk_ea --out caravan_gb   # a Caravan-format large-sample dataset from the archive
aquascope gym run --basin uk_ea/013054a3-670e-49ee-afda-e0865a449197   # HydroGym: calibrate GR4J on a real basin as a gym episode
aquascope mcp                                     # serve the same tools to Claude / Cursor over MCP
aquascope ask "100-year flood of the Seine at Paris?"   # the analyst: tools + a cited Markdown report
aquascope ingest agency_export.csv --unit cfs     # any CSV/Excel -> clean daily series + QA report
aquascope collect --source usgs --days 365
aquascope collect --source wapor --bbox 30.5,29.8,31.1,30.2 --variable RET --start-date 2026-04-01

# Hydrological analysis
aquascope hydro --analysis flood-freq --file discharge.csv
aquascope hydro --analysis baseflow --file discharge.csv --method eckhardt

# Agriculture planning
aquascope agri plan --crop maize --planting-date 2026-04-01 --lat 30.0 --lon 31.25

# AI recommendation + natural-language problem solving
aquascope recommend --parameters DO,BOD5,COD --goal "pollution trend detection"
aquascope solve "Design flow for a road crossing, 100-year return period" --lat 51.415 --lon -0.308

# Interactive Streamlit dashboard — multipage workspace with 21 live sources,
# smart auto-insights, and fully interactive Plotly charts
aquascope dashboard

# Shell tab-completion
eval "$(aquascope completion bash)"   # add this to ~/.bashrc (or .zshrc / config.fish)

Run aquascope --help for the full command list.


🌍 Data sources at a glance

29 data collectors spanning four regions (highlights below, full list in the docs):

  • 🌎 Americas — USGS (streamflow + WQ), NOAA NWPS (US streamflow), Water Quality Portal (400+ agencies), CAMELS-CL (Chile), CAMELS-BR (Brazil)
  • 🌍 Europe — EU Water Framework Directive, Copernicus ERA5, France Hub'Eau, Germany PEGELONLINE, England's Environment Agency
  • 🌏 Asia-Pacific — Taiwan MOENV / WRA / Civil IoT / DataGov, Japan MLIT, Korea WAMIS, India WRIS
  • 🌐 Global — GEMStat (170 countries), UN SDG 6, OpenMeteo, FAO AQUASTAT, FAO WaPOR, GRDC (river discharge)

Full details, endpoints, and API-key requirements: docs/data_sources.md. Want to add your country's water service? See adding a data source.


🧪 Scientifically validated

  • 1,000+ tests — covering every collector, hydrology method, and pipeline (spatial and ARIMA tests require the optional [all] / [ml] extras)
  • CAMELS benchmark — a 10-catchment validation subset of the CAMELS dataset ships with the repo at data/camels_benchmark/ and runs as part of CI
  • Every method cited — equations, decision trees, and DOI references for all 26 methodologies live in the theory guide
  • JOSS paper in preparation — see paper.md and paper.bib

📚 Documentation

Resource What it covers
Features Full capability list — hydrology, agriculture, ML, spatial, I/O
Data sources All 29 sources, endpoints, API-key requirements
Theory guide Equations, DOI citations, decision trees for every method
Methodology matrix When to use which method
Architecture How AquaScope is structured internally
FAQ · Troubleshooting Common questions and fixes
Use cases Real-world applications and case studies
HydroGym A gym-style calibration environment over real basins, with baselines and a leaderboard
Integration guides xarray, QGIS, R interoperability
Contributing How to add a data source, methodology, or test

🤝 Contributing

We welcome contributions from the global water and agriculture research community. Highest-impact contributions right now:

  • New data source collectors — your country / region
  • New research methodologies — expand the AI recommender
  • New crop coefficients — extend the FAO Kc table
  • Jupyter tutorials and validation studies — compare against HEC-SSP, R packages, etc.

📌 Where to start

📍 Data sources wanted — help us map every country's water data 🌍 — our pinned meta-issue. Want your country in AquaScope? Start here.

New contributor? These good first issues are scoped with clear acceptance criteria — just comment to claim one:

Area Open issues
🌍 New data collectors Brazil · Canada · South Africa · Australia
🌾 Agriculture Kc for millet/cassava/chickpea · Kc for sorghum/groundnut/sugar beet
📈 Methodologies SPEI drought index · Budyko framework
📊 Visualization interactive Plotly hydrograph · double-mass curve
💻 CLI --output to JSON/CSV · shell completion
📚 Docs & tutorials Colab/Binder badges · groundwater notebook · agri irrigation notebook · translate the docs (zh/fr/ja)
🧪 Code quality & tests type annotations

Browse the full issue list or vote on what to build next in Discussions → Ideas.

See CONTRIBUTING.md, the adding a data source guide, and the adding a methodology guide.

🪜 The contributor ladder

We want contributors to grow, not vanish after one PR. There's a clear path: start with a good first issue, then graduate to a good second issue (a bigger self-contained piece that builds on what you learned), and after a few PRs in one area we'll invite you to help triage and review. See CONTRIBUTORS.md for details.

🙌 Contributors

Thanks to these wonderful people who make AquaScope possible (emoji key):

Abdoul Rachid Ouedraogo
Abdoul Rachid Ouedraogo

💻 📖 🚧
Vaishnavi Desai
Vaishnavi Desai

🔌
Karthick
Karthick

💻
sagiB74
sagiB74

⚠️
Karthik Laishetti
Karthik Laishetti

💻 🐛
Adam Jenkins
Adam Jenkins

🔌 💻 ⚠️
Steven Widjaja
Steven Widjaja

⚠️
Sai Raj Kasam
Sai Raj Kasam

💻
safiashaik04
safiashaik04

💻
Navaneeth Sankar
Navaneeth Sankar

📖 ⚠️
Taran
Taran

💻 ⚠️
Ahmed Baruwa
Ahmed Baruwa

💻 ⚠️
Anthony
Anthony

💻 ⚠️
James Boardman
James Boardman

💻 ⚠️ 📖 🐛
Khyati Tiwari
Khyati Tiwari

💻 🔣
PRAKSHAL BHAVINKUMAR BHANDARI
PRAKSHAL BHAVINKUMAR BHANDARI

📖
Osheun
Osheun

💻 ⚠️ 📖
Dipak Chaudhari
Dipak Chaudhari

💻 ⚠️
Sanchar127
Sanchar127

💻 ⚠️
hari
hari

💻
leatke
leatke

💻
Talia Pulsifer
Talia Pulsifer

💻 ⚠️

Your first merged PR puts you on this board, every kind of contribution counts. See CONTRIBUTORS.md.

📜 Citation

If you use AquaScope in your research, please cite:

@software{aquascope2026,
  title   = {AquaScope: Open-Source Water Data Aggregation, Hydrological Analysis, and Agricultural Water Management Toolkit},
  author  = {Ouédraogo, Abdoul Rachid},
  year    = {2026},
  url     = {https://github.com/Rekin226/aquascope},
  version = {0.14.0},
  doi     = {10.5281/zenodo.21903143},
  license = {MIT}
}

Machine-readable metadata lives in CITATION.cff; GitHub's "Cite this repository" button renders it in APA and BibTeX. Every tagged release is archived on Zenodo; 10.5281/zenodo.21903143 is the concept DOI that always resolves to the latest version (v0.13.0 is 10.5281/zenodo.22152064).

📄 License

MIT — see LICENSE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

aquascope-0.14.0.tar.gz (2.0 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

aquascope-0.14.0-py3-none-any.whl (977.2 kB view details)

Uploaded Python 3

File details

Details for the file aquascope-0.14.0.tar.gz.

File metadata

  • Download URL: aquascope-0.14.0.tar.gz
  • Upload date:
  • Size: 2.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for aquascope-0.14.0.tar.gz
Algorithm Hash digest
SHA256 8abf7fe43bf2906711e97d36536df23c9a8ac2d75a60142d5357603ac53cd769
MD5 73d575a551384e62a41fde08d4c8a0e9
BLAKE2b-256 248b474f0ab8984511799063a4cf546c76cfed40d48e51ba9b664041e93dbd8f

See more details on using hashes here.

Provenance

The following attestation bundles were made for aquascope-0.14.0.tar.gz:

Publisher: publish.yml on Rekin226/aquascope

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aquascope-0.14.0-py3-none-any.whl.

File metadata

  • Download URL: aquascope-0.14.0-py3-none-any.whl
  • Upload date:
  • Size: 977.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for aquascope-0.14.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b57289f2e68e8d7381d3f0d96e4a8cb1a53218c1f17efcc3c1f6701f2f868edf
MD5 aa101e220e8cf55180292131e5a1fccc
BLAKE2b-256 9e0dde0a0a1d829c4b313d5a2a1de1f408aa5392ad1a8f8d3e4293810d985aec

See more details on using hashes here.

Provenance

The following attestation bundles were made for aquascope-0.14.0-py3-none-any.whl:

Publisher: publish.yml on Rekin226/aquascope

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.15.1

2 files

This release

0.14.0 This release

2 files

0.13.0

2 files

0.12.0

2 files

0.11.0

2 files

0.10.0

2 files

0.9.0

2 files

0.8.1

2 files

0.8.0

2 files

0.7.0

2 files

0.6.0

2 files

0.5.0

2 files

0.4.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page