CFT — Climate Forecasting Toolbox
A Python-based tool for statistical climate forecasting, developed by the SADC Climate Services Centre (CSC).
Table of Contents
- Introduction
- Modules
- Requirements
- Installation
- Usage — GUI
- Usage — without GUI
- Credits
- Development History
Introduction
CFT is a Python-based tool for statistical climate forecasting. From version 5, it consists of five modules:
| Module | Since | Description |
|---|---|---|
| Download | v6.0 (CDS support added) | Downloads predictor/predictand data from CDS, IRIDL, and JMA |
| Forecast | updated in v5 | Builds and cross-validates statistical seasonal forecast models |
| Zoning | v3 | Spatial regionalization of station data into forecast zones |
| Verification | v4 | Forecast skill verification |
| Synthesis | v4 | Synthesis of forecast outputs |
Modules
Download module
Downloads the following data types:
- Gridded predictors from CDS — SST, GPH, rainfall, and air temperature, from all models available on CDS as of July 2026 (except UKMO)
- Gridded predictand from CDS — rainfall and temperature from the CDS ERA5 dataset
- Gridded predictors from IRIDL (legacy) — SST
- Gridded predictand from IRIDL (legacy) — CHIRPS precipitation
- Gridded forecast/hindcast data from IRIDL (legacy) — SST, precipitation, and geopotential height, for three NMME models operational as of August 2025
- Teleconnection indices from JMA (chosen for lowest latency) — IOD, Niño3, Niño4
Data are downloaded to a user-selected directory and converted to a format ingestible by the rest of CFT.
Forecast module
Predictand types: gridded data, or station data
Predictor types:
- Observed teleconnection indices
- Observed gridded data (SST)
- Forecasted gridded fields (not yet implemented)
Forecast output levels:
- Grid — if the predictand is gridded
- Zones — if the predictand is gridded or station data; data are spatially aggregated into a zonal average and the forecast is generated for that average
- Points — if the predictand is station data
Pre-processing approaches:
| Approach | Description | Applicable to |
|---|---|---|
| PCR | Gridded predictor is reduced to Principal Components (EOFs), used as predictors in the statistical model | Gridded predictor, any predictand |
| CCA | Canonical components derived jointly from predictor and predictand | — |
| None | No dimensionality reduction | Gridded predictor, any predictand |
Statistical models: OLS regression, MLP regression, Decision Trees, Random Forest, Lasso regression, Ridge regression
Forecast types: deterministic, and tercile probabilistic. The tercile forecast is also presented as a 4-category forecast, splitting the normal category into normal-to-above and normal-to-below (no probabilities are allocated to these two split categories).
Cross-validation: all forecasts are cross-validated, using either leave-one-out or k-fold. Skill indices are calculated from out-of-fold predictions:
- ROC score (above / below / normal)
- RPSS
- Correlation
- Heidke skill score (highest-probability category)
- Ignorance score
- Reliability score
- Brier skill score
- 2AFC
Calibration: probabilistic forecasts are calibrated via quantile mapping — a quantile transform is developed from overlapping hindcast and observed predictand data, then applied to both hindcast and forecast.
Other modules — Zoning, Verification, Synthesis
The zoning module was adapted to run under the v5 environment in v5.1.
Note: the verification and synthesis modules have not yet been updated to the same extent as the modules above, and aren't documented in detail here yet. (more to follow)
Requirements
- Python 3.12 (recommended for v6.0)
- All Python package dependencies are installed automatically via pip — see
pyproject.tomlfor the full list. Notably:numpy,pandas,geopandas,xarray,rioxarray,scipy,shapely,rasterio,rasterstats,scikit-learn,netCDF4,cftime,geocube,GDAL,matplotlib,cartopy,PyQt5,cdsapi.
Installation
1. Set up a Python environment
Installation should be done into a dedicated Python environment. You'll need one of:
- Anaconda (full framework, >1GB)
- Miniforge (installs both Conda and Mamba)
- Micromamba (lightweight; for advanced users)
Once installed, create a dedicated environment:
mamba create --name cft-env python=3.12
2. Install GDAL first, separately
pip does not reliably handle the GDAL system library, so it must be pre-installed via conda/mamba before installing the sadc-cft package itself:
mamba activate cft-env
mamba install -c conda-forge gdal=3.13.2
3. Install CFT with pip
pip install sadc-cft
4. Confirm the installation
python -m cft
This should launch the main CFT GUI.
Usage — GUI
Activate the environment first, as always:
mamba activate cft-env
Launch the main GUI:
cft
or equivalently:
python -m cft
Launch an individual module directly (forecast, verification, synthesis, zoning, download):
forecast-tool
or equivalently:
python -m cft.forecast
(substitute download-tool / verification-tool / synthesis-tool / zoning-tool, or cft.download / cft.verification / cft.synthesis / cft.zoning, as needed)
Usage — without GUI
Individual components can be called directly from Python, without launching any GUI:
from cft.functions.functions_forecast import computeModelNoGui
computeModelNoGui(config)
where config is a dictionary of forecast model settings, for example:
config = {
'rootDir': '../test',
'predictorYear': 2026,
'predictorMonth': 'Jun',
'fcstTargetSeas': 'Aug-Oct',
'fcstTargetYear': 2026,
'climEndYr': 2015,
'climStartYr': 1994,
'predictorExtents': {
'minLon': -180.0,
'maxLon': 180.0,
'minLat': -60.0,
'maxLat': 60.0,
},
'predictorFileName': '/work/code/csc/cft/test/GPH850_System9_CDS_Jun_s300s200e150e250_1981-2026.nc',
'predictorVar': 'z',
'predictorCode': 'z',
'crossval': 'KF',
'preproc': 'PCR',
'regression': 'OLS',
'timeAggregation': 'mean',
'predictandFileName': '../test/PRCP_CHIRPSp25_IRIDL_Aug-Oct_s340s200e150e250_1981-2025.nc',
'predictandVar': 'prcp',
'predictandCategory': 'temperature',
'predictandMissingValue': '-999',
'zonesFile': None,
'zonesAttribute': 'Name',
'zonesAggregate': False,
'regridPredictand': False,
'overlayFile': '../gis/sadc/gadm41_ZAF_1.json',
}
(more to follow...)
Credits
- Piotr Wolski (wolski@csag.uct.ac.za)
- Sunshine Gamedze (sgamedze@sadc.int)
Original developer (2017–2022): Thembani Moitlhobogi
Development History
- 2010–2017: original version developed under funding from the SADC CSC project SARCIS-DR.
- 2023–2025: development funded under the SADC CSC ClimSA project.
- November 2022: code ported from the original personal repo (taxmanyana/cft) to the institutional repo, sadc-csc/cft.
- Current version: developed under funding from the First Rains project.
Source code: maintained at github.com/sadc-csc since v4.0.0. From v6.0.0, also available as a pip package: pypi.org/project/sadc-cft.
Metadata
Release files for sadc-cft 6.0.14
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sadc_cft-6.0.14.tar.gz | 114.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sadc_cft-6.0.14-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 233.6 kB
Release files / sadc_cft-6.0.14.tar.gz
| Download URL | sadc_cft-6.0.14.tar.gz |
|---|---|
| Size | 114.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c76694e052d61cd304153b2629d433b77d9c2c2b87ed097cbce6b25a0513858e
|
|
BLAKE2b-256 checksum How to use checksums |
503f6af2ab189faf6e5441e4c76f73c35e50489fb7d7e157707cc9f3abe5ad8f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.13
|
Release files / sadc_cft-6.0.14-py3-none-any.whl
| Download URL | sadc_cft-6.0.14-py3-none-any.whl |
|---|---|
| Size | 119.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
152f9ee9199c668e24a69e3684f6ac25c41cc693529218e451fdc7b98d631928
|
|
BLAKE2b-256 checksum How to use checksums |
604ce154a89859a4fb55fb988c61940708e5875115fc3a8fec1c4336b77a3dec
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.13
|