climate-toolkit 0.1.0__tar.gz → 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {climate_toolkit-0.1.0/climate_toolkit.egg-info → climate_toolkit-0.2.0}/PKG-INFO +117 -38
- climate_toolkit-0.1.0/PKG-INFO → climate_toolkit-0.2.0/README.md +111 -75
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/__init__.py +9 -3
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/calculate_hazards/ensemble_hazards.py +3 -1
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/calculate_hazards/hazards.py +66 -19
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/cli.py +12 -5
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/climate_statistics/ensemble_statistics.py +3 -1
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/climate_statistics/statistics.py +55 -48
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/climatology/heat_stress.py +2 -1
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/climatology/human_heat_stress.py +27 -6
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/climatology/long_term_climatology.py +72 -25
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/climatology/spei.py +3 -3
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/climatology/xclim_reference.py +1 -1
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/compare_datasets/compare_datasets.py +32 -16
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/compare_periods/ensemble_periods.py +4 -2
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/compare_periods/periods.py +20 -9
- climate_toolkit-0.2.0/climate_toolkit/fetch_data/backend_policy.py +118 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/cache_inventory.py +34 -1
- climate_toolkit-0.2.0/climate_toolkit/fetch_data/direct_cloud.py +664 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/fetch_data.py +74 -18
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/gee_xee_batch.py +5 -5
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/preprocess_data/preprocess_data.py +12 -4
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/runtime_notes.py +9 -1
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/source_data.py +34 -4
- climate_toolkit-0.2.0/climate_toolkit/fetch_data/source_data/sources/agera_5.py +5 -0
- climate_toolkit-0.2.0/climate_toolkit/fetch_data/source_data/sources/era5_land.py +14 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/gee.py +7 -5
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/utils/config.yaml +1 -1
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/utils/models.py +18 -4
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/utils/settings.py +11 -3
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/xee_common.py +2 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/transform_data/data_dictionary.yaml +5 -1
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/transform_data/transform_data.py +10 -0
- climate_toolkit-0.2.0/climate_toolkit/pipeline.py +540 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/season_analysis/ensemble.py +3 -1
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/season_analysis/seasons.py +35 -24
- climate_toolkit-0.2.0/climate_toolkit/visualization/__init__.py +35 -0
- climate_toolkit-0.2.0/climate_toolkit/visualization/io.py +18 -0
- climate_toolkit-0.2.0/climate_toolkit/visualization/labels.py +21 -0
- climate_toolkit-0.2.0/climate_toolkit/visualization/styles.py +34 -0
- climate_toolkit-0.2.0/climate_toolkit/visualization/text.py +13 -0
- climate_toolkit-0.2.0/climate_toolkit/visualization/timelines.py +32 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/weather_station/compare.py +18 -6
- climate_toolkit-0.1.0/README.md → climate_toolkit-0.2.0/climate_toolkit.egg-info/PKG-INFO +154 -37
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit.egg-info/SOURCES.txt +16 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit.egg-info/requires.txt +8 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/pyproject.toml +24 -1
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_cli_dispatch.py +2 -2
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_climatology_output.py +3 -3
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_compare_datasets_source_policy.py +7 -7
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_compare_periods_baseline.py +5 -5
- climate_toolkit-0.2.0/tests/test_direct_cloud.py +500 -0
- climate_toolkit-0.2.0/tests/test_direct_pipeline_integration.py +385 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_distribution_artifacts.py +32 -2
- climate_toolkit-0.2.0/tests/test_era5_land_access_probe.py +127 -0
- climate_toolkit-0.2.0/tests/test_era5_land_migration.py +110 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_fetch_pipeline.py +10 -6
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_ghcn_daily_station.py +10 -10
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_hazard_thresholds.py +12 -12
- climate_toolkit-0.2.0/tests/test_hazards_nex_model_scenario.py +88 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_historical_workers_surface.py +12 -12
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_human_heat_stress.py +4 -4
- climate_toolkit-0.2.0/tests/test_notebook_magics.py +43 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_pipeline.py +87 -15
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_season_analysis_ensemble_fixed.py +8 -8
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_seasons_nex_gddp.py +3 -3
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_spei_cli.py +2 -2
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_statistics_source_policy.py +20 -21
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_thi.py +1 -1
- climate_toolkit-0.2.0/tests/test_visualization.py +124 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_xclim_reference_cli.py +2 -2
- climate_toolkit-0.1.0/climate_toolkit/fetch_data/source_data/sources/agera_5.py +0 -15
- climate_toolkit-0.1.0/climate_toolkit/pipeline.py +0 -307
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/LICENSE +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/_resources.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/calculate_hazards/__init__.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/calculate_hazards/crop_water_balance_params.json +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/climate_statistics/__init__.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/climatology/__init__.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/climatology/_cli_common.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/climatology/vpd.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/compare_datasets/__init__.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/compare_periods/__init__.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/crop_calendar/__init__.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/crop_calendar/ggcmi.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/crop_calendar/registry.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/data/__init__.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/data/ggcmi_phase3/__init__.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/data/ggcmi_phase3/crop_calendar.parquet +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/data/ggcmi_phase3/crop_calendar_manifest.json +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/__init__.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/multi_site.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/nex_gddp_batch.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/preprocess_data/__init__.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/__init__.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/chirps.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/chirts.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/era_5.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/gee_xee.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/ghcn_daily.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/gsod.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/imerg.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/nasa_power.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/nex_gddp.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/nex_gddp_xee.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/soil_grid.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/tamsat.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/terraclimate.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/utils/__init__.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/transform_data/__init__.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/gee_check.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/season_analysis/__init__.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/season_analysis/season_identity.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/weather_station/__init__.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/weather_station/custom_station.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/weather_station/dem.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/weather_station/download.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/weather_station/ghcn_daily.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/weather_station/gsod.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/weather_station/overrides.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/weather_station/station_selector.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit.egg-info/dependency_links.txt +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit.egg-info/entry_points.txt +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit.egg-info/top_level.txt +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/setup.cfg +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_api_smoke.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_auto_season_alignment_report.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_cache_inventory.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_climatology_typer_cli.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_crop_registry_hazards.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_ensemble_hazards_aggregation.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_ensemble_hazards_import.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_ensemble_statistics_scenario_validation.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_era_lte_workflow.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_fetch_climate_data_usability.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_fetch_model_resolution.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_gee_check.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_gee_no_auto_auth.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_gee_xee_batch.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_ggcmi_crop_calendar.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_install_shape.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_lazy_package_roots.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_matplotlib_not_stubbed.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_multi_site_contract.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_nasa_power_cache.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_nex_gddp_batch.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_nex_gddp_behavior.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_nex_gddp_xee_poc.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_package_import_hygiene.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_package_resources.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_packaging_metadata.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_preprocess_imports.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_season_identity.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_soil_grid_cache.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_spei.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_station_verbose_kwarg.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_tamsat_logging.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_vpd.py +0 -0
- {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_xee_common.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: climate-toolkit
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: Climate toolkit for location-based climate, season, climatology, hazard, and projection analysis.
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
Project-URL: Homepage, https://github.com/CGIAR-Climate-Data-Hub/climate-toolkit
|
|
@@ -29,6 +29,11 @@ Requires-Dist: typer<1,>=0.12
|
|
|
29
29
|
Requires-Dist: xarray>=2024.6
|
|
30
30
|
Requires-Dist: xclim<1,>=0.60
|
|
31
31
|
Requires-Dist: xee<0.2,>=0.1
|
|
32
|
+
Provides-Extra: cloud
|
|
33
|
+
Requires-Dist: zarr<4,>=3; python_version >= "3.12" and extra == "cloud"
|
|
34
|
+
Requires-Dist: icechunk<3,>=2.3; python_version >= "3.12" and extra == "cloud"
|
|
35
|
+
Requires-Dist: fsspec[http]>=2025.3; python_version >= "3.12" and extra == "cloud"
|
|
36
|
+
Requires-Dist: dask[array]>=2025.3; python_version >= "3.12" and extra == "cloud"
|
|
32
37
|
Provides-Extra: api
|
|
33
38
|
Requires-Dist: fastapi>=0.110.0; extra == "api"
|
|
34
39
|
Requires-Dist: uvicorn>=0.29.0; extra == "api"
|
|
@@ -38,14 +43,18 @@ Dynamic: license-file
|
|
|
38
43
|
|
|
39
44
|
# Climate Data Toolkit
|
|
40
45
|
|
|
41
|
-
A unified toolkit for retrieving climate data from various global datasets such as CHIRPS,
|
|
46
|
+
A unified toolkit for retrieving climate data from various global datasets such as CHIRPS, ERA5-Land, TerraClimate, IMERG, TAMSAT, CHIRTS-ERA5, ERA5, NEX-GDDP, NASA POWER, CMIP6 and SoilGrids.
|
|
42
47
|
|
|
43
48
|
[](https://CGIAR-Climate-Data-Hub.github.io/climate-toolkit/about/) — what the toolkit is, who it's for, and how to get involved (also in [français](https://CGIAR-Climate-Data-Hub.github.io/climate-toolkit/fr/about/) / [español](https://CGIAR-Climate-Data-Hub.github.io/climate-toolkit/es/about/)).
|
|
44
49
|
|
|
45
50
|
[](https://CGIAR-Climate-Data-Hub.github.io/climate-toolkit/) — full documentation: getting started, workflows, and API reference.
|
|
46
51
|
|
|
52
|
+
[](https://pypi.org/project/climate-toolkit/) — published on PyPI: `pip install climate-toolkit`.
|
|
53
|
+
|
|
47
54
|
[](https://colab.research.google.com/github/CGIAR-Climate-Data-Hub/climate-toolkit/blob/main/examples/climate_toolkit_colab.ipynb) — try the toolkit live in your browser, no install needed.
|
|
48
55
|
|
|
56
|
+
[](https://colab.research.google.com/github/CGIAR-Climate-Data-Hub/climate-toolkit/blob/main/examples/era_lte_colab.ipynb) — ERA LTE workflow: validate toolkit rainfall against ERA field records and explore yield vs climate, with plots.
|
|
57
|
+
|
|
49
58
|
<p>
|
|
50
59
|
<a href="https://www.mcknight.org/programs/global-foods/"><img src="docs/assets/logos/mcknight.jpg" alt="The McKnight Foundation" height="44"></a>
|
|
51
60
|
|
|
@@ -59,11 +68,11 @@ Funded by the [McKnight Foundation CRFS programme](https://www.mcknight.org/prog
|
|
|
59
68
|
## API Dataset Badges
|
|
60
69
|
|
|
61
70
|
[](https://data.chc.ucsb.edu/products/CHIRPS-2.0/)
|
|
62
|
-
[](https://developers.google.com/earth-engine/datasets/catalog/ECMWF_ERA5_LAND_DAILY_AGGR)
|
|
63
72
|
[](http://www.climatologylab.org/terraclimate.html)
|
|
64
73
|
[](https://gpm.nasa.gov/data/imerg)
|
|
65
74
|
[](https://www.tamsat.org.uk/)
|
|
66
|
-
[](https://www.chc.ucsb.edu/data/chirts-era5)
|
|
67
76
|
[](https://cds.climate.copernicus.eu/cdsapp#!/dataset/reanalysis-era5-single-levels)
|
|
68
77
|
[](https://www.nccs.nasa.gov/services/data-collections/land-based-products/nex-gddp)
|
|
69
78
|
[](https://power.larc.nasa.gov/)
|
|
@@ -76,23 +85,54 @@ Funded by the [McKnight Foundation CRFS programme](https://www.mcknight.org/prog
|
|
|
76
85
|
|
|
77
86
|
The Climate Toolkit offers a unified, programmatic interface to:
|
|
78
87
|
|
|
79
|
-
- Retrieve climate data from CHIRPS,
|
|
88
|
+
- Retrieve climate data from CHIRPS, ERA5-Land, TerraClimate, IMERG, TAMSAT, CHIRTS-ERA5, ERA5, NEX-GDDP, NASA POWER, CMIP6 and SoilGrids
|
|
80
89
|
- Compute rainfall statistics, anomalies, and hazard indicators
|
|
81
90
|
- Compare climate trends over historical and seasonal periods
|
|
82
91
|
|
|
83
92
|
For user-facing historical daily climate work, the default module policy is
|
|
84
|
-
`chirps_v3_daily_rnl +
|
|
85
|
-
|
|
93
|
+
`chirps_v3_daily_rnl + era5_land`: CHIRPS v3 Daily RNL supplies precipitation.
|
|
94
|
+
The `era5_land` key reads ERA5-Land and supplies temperature plus companion variables such as humidity, wind,
|
|
86
95
|
and solar radiation. If a direct single-source historical fallback is needed,
|
|
87
|
-
prefer `
|
|
96
|
+
prefer `era5_land`. Keep `era_5` available for compatibility, diagnostics, and
|
|
88
97
|
comparison work, but do not treat it as the primary recommended source.
|
|
89
98
|
|
|
99
|
+
`era5_land` is the canonical key for `ECMWF/ERA5_LAND/DAILY_AGGR`.
|
|
100
|
+
The former `agera_5` and `agera5` spellings still select that same ERA5-Land
|
|
101
|
+
product and now emit a visible deprecation warning. They never selected the
|
|
102
|
+
separate Copernicus AgERA5 product. Compatibility aliases remain through 0.2.x;
|
|
103
|
+
new code, defaults and reports use `era5_land`. Existing `agera_5` cache directories
|
|
104
|
+
are reused without changing their scientific content.
|
|
105
|
+
|
|
106
|
+
For **no-GEE access**, install the cloud extra on Python 3.12+ (`pip install
|
|
107
|
+
'climate-toolkit[cloud]'` or `uv sync --extra cloud`). CHIRPS v3 RNL can use
|
|
108
|
+
Dynamical and Hugging Face, with provider failover. Pair it with `chirts_era5`
|
|
109
|
+
for daily temperature through recent dates. Use `--no-gee` on the unified CLI
|
|
110
|
+
or `with climate_toolkit.backend_policy(allow_gee=False):` around Python
|
|
111
|
+
workflows; historical `auto` then uses this direct pair. Explicit providers,
|
|
112
|
+
cache provenance, QC and limits: [direct cloud access](docs/direct_cloud_access.md).
|
|
113
|
+
Direct reads share source chunks across up to five missing years per batch and
|
|
114
|
+
save annual progress for retries. CHIRTS-ERA5's independent CHC backup remains
|
|
115
|
+
under [validation](analysis/issues/issue_179_chc_backup_investigation.md).
|
|
116
|
+
ERA5-Land's official CDS cloud stores require a separate CDS key; that work is
|
|
117
|
+
[shelved](analysis/issues/issue_180_era5_land_access.md) and they are not used by
|
|
118
|
+
the toolkit. The current no-GEE auto pair supplies rainfall and Tmax/Tmin.
|
|
119
|
+
|
|
120
|
+
For the complete fetch → climatology → statistics → hazards → comparison workflow,
|
|
121
|
+
`run_pipeline` accepts `precip_source`, `temp_source` and `allow_gee=False`, and
|
|
122
|
+
exports per-site reports with provenance. See the
|
|
123
|
+
[full pipeline example](docs/direct_cloud_access.md#full-pipeline).
|
|
124
|
+
|
|
125
|
+
`chirts` (1983–2016) is deprecated in favor of `chirts_era5` for new work.
|
|
126
|
+
Legacy requests retain their original scientific meaning and caches; the old
|
|
127
|
+
product is no longer an automatic fallback. The direct pair supplies Tmax/Tmin
|
|
128
|
+
and rainfall, not humidity, wind or radiation.
|
|
129
|
+
|
|
90
130
|
TAMSAT remains available for completeness and Africa-focused precipitation
|
|
91
131
|
comparison work, but it is currently fragile and should not be treated as a
|
|
92
132
|
default or relied on for production workflows. It is precipitation-only, must
|
|
93
133
|
be paired with a temperature source for most analysis modules, and current
|
|
94
134
|
public access via JASMIN has shown slow performance and intermittent SSL /
|
|
95
|
-
download failures in live testing. Prefer `chirps_v3_daily_rnl +
|
|
135
|
+
download failures in live testing. Prefer `chirps_v3_daily_rnl + era5_land` for
|
|
96
136
|
normal user workflows.
|
|
97
137
|
|
|
98
138
|
> **Using it as a Python library?** See the
|
|
@@ -155,6 +195,14 @@ If you see:
|
|
|
155
195
|
|
|
156
196
|
### Installation
|
|
157
197
|
|
|
198
|
+
Just want to use the package? Install from PyPI:
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
pip install climate-toolkit
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
To develop the toolkit or run the `examples/` scripts, set up from a clone instead:
|
|
205
|
+
|
|
158
206
|
1. Clone repository
|
|
159
207
|
|
|
160
208
|
```bash
|
|
@@ -196,6 +244,17 @@ If you see:
|
|
|
196
244
|
uv run pytest -q
|
|
197
245
|
```
|
|
198
246
|
|
|
247
|
+
CI tests the base package on Python 3.10 and the `cloud` and `api` extras on
|
|
248
|
+
Python 3.12. To run the cloud-provider and pipeline tests locally:
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
uv sync --locked --group dev --extra cloud --extra api --python 3.12
|
|
252
|
+
uv run pytest -q
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
Distribution checks install the base wheel and source archive in fresh
|
|
256
|
+
environments; Python 3.12+ also checks a fresh `cloud` wheel installation.
|
|
257
|
+
|
|
199
258
|
3. Fallback setup with `venv + pip`
|
|
200
259
|
|
|
201
260
|
macOS / Linux:
|
|
@@ -275,7 +334,7 @@ commands through `uv run --env-file .env ...`.
|
|
|
275
334
|
|
|
276
335
|
| Variable | Required for | Notes |
|
|
277
336
|
|----------|--------------|-------|
|
|
278
|
-
| `GCP_PROJECT_ID` |
|
|
337
|
+
| `GCP_PROJECT_ID` | Earth Engine-backed routes (ERA5-Land via `era5_land`, ERA5, NEX-GDDP, GEE historical) | Your real Google Cloud **Project ID** — see [Earth Engine setup](#earth-engine-setup). `GOOGLE_CLOUD_PROJECT` / `EE_PROJECT_ID` are accepted as fallbacks. |
|
|
279
338
|
| `EARTHDATA_USERNAME` / `EARTHDATA_PASSWORD` | Sources still using Earthdata-backed access | Optional; only needed by those sources. |
|
|
280
339
|
|
|
281
340
|
Earth Engine authentication itself is stored separately (via
|
|
@@ -392,12 +451,14 @@ docker compose down --remove-orphans
|
|
|
392
451
|
|
|
393
452
|
### Release strategy
|
|
394
453
|
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
-
|
|
398
|
-
|
|
399
|
-
-
|
|
400
|
-
|
|
454
|
+
- Published on **PyPI** as [`climate-toolkit`](https://pypi.org/project/climate-toolkit/) —
|
|
455
|
+
`pip install climate-toolkit`.
|
|
456
|
+
- Releases are automated via **Trusted Publishing** (OIDC, no stored tokens):
|
|
457
|
+
publishing a GitHub Release builds the package and uploads it to PyPI. Mark a
|
|
458
|
+
Release as a pre-release to route it to TestPyPI as a rehearsal instead. See
|
|
459
|
+
[`RELEASING.md`](RELEASING.md).
|
|
460
|
+
- Versions follow [semantic versioning](https://semver.org); PyPI versions are
|
|
461
|
+
immutable, so each publish needs a new version number.
|
|
401
462
|
|
|
402
463
|
Reference note:
|
|
403
464
|
|
|
@@ -408,7 +469,7 @@ Reference note:
|
|
|
408
469
|
For historical daily climate workflows, start with:
|
|
409
470
|
|
|
410
471
|
- precipitation: `chirps_v3_daily_rnl`
|
|
411
|
-
- temperature + companion variables: `
|
|
472
|
+
- temperature + companion variables: `era5_land`
|
|
412
473
|
|
|
413
474
|
For most higher-level modules, `--source auto` or `--source paired` will route
|
|
414
475
|
to this historical default behavior.
|
|
@@ -459,7 +520,7 @@ Main entry point:
|
|
|
459
520
|
Key options:
|
|
460
521
|
|
|
461
522
|
- `--source`: exact source key such as `chirps_v3_daily_rnl`, `chirps_v2`,
|
|
462
|
-
`
|
|
523
|
+
`era5_land`, `era_5`, `nex_gddp`, `nasa_power`
|
|
463
524
|
- `--stage`: `raw`, `transformed`, `preprocessed`
|
|
464
525
|
- `--variables`: comma-separated toolkit variable names
|
|
465
526
|
- `--output`: optional output file
|
|
@@ -490,7 +551,7 @@ Livestock THI source support:
|
|
|
490
551
|
|
|
491
552
|
| Source | Status | Notes |
|
|
492
553
|
| --- | --- | --- |
|
|
493
|
-
| `
|
|
554
|
+
| `era5_land` | supported | humidity derived from dewpoint + air temperature in current fetch pipeline |
|
|
494
555
|
| `nasa_power` | supported | humidity available from current NASA POWER fetch path |
|
|
495
556
|
| `ghcn_daily` | supported when available | uses station humidity when `RHAV` exists for chosen station and window |
|
|
496
557
|
| `gsod` | supported when available | uses station humidity when humidity field exists for chosen station and window |
|
|
@@ -501,7 +562,7 @@ Livestock THI source support:
|
|
|
501
562
|
| `chirps_v3_daily_rnl` | not supported | precipitation-only source |
|
|
502
563
|
| `imerg` | not supported | precipitation-only source |
|
|
503
564
|
| `tamsat` | not supported | no humidity data |
|
|
504
|
-
| `chirts` | not supported | temperature-only
|
|
565
|
+
| `chirts_era5`, deprecated `chirts` | not supported | temperature-only sources; humidity must come from a companion product |
|
|
505
566
|
|
|
506
567
|
Python users can inspect same support map directly:
|
|
507
568
|
|
|
@@ -541,7 +602,7 @@ from climate_toolkit.climatology import (
|
|
|
541
602
|
|
|
542
603
|
print(describe_human_heat_method()["metric"])
|
|
543
604
|
print(describe_human_heat_source_support())
|
|
544
|
-
print(build_human_heat_source_bundle(source="paired", precip_source="chirps_v3_daily_rnl", temp_source="
|
|
605
|
+
print(build_human_heat_source_bundle(source="paired", precip_source="chirps_v3_daily_rnl", temp_source="era5_land"))
|
|
545
606
|
```
|
|
546
607
|
|
|
547
608
|
Dedicated method guide:
|
|
@@ -577,7 +638,7 @@ climate-toolkit-seasons \
|
|
|
577
638
|
--end-year=2020 \
|
|
578
639
|
--source=paired \
|
|
579
640
|
--precip-source=chirps_v3_daily_rnl \
|
|
580
|
-
--temp-source=
|
|
641
|
+
--temp-source=era5_land \
|
|
581
642
|
--fixed-season="03-01:05-31"
|
|
582
643
|
```
|
|
583
644
|
|
|
@@ -593,7 +654,7 @@ climate-toolkit-stats \
|
|
|
593
654
|
--end-year=2020 \
|
|
594
655
|
--source=paired \
|
|
595
656
|
--precip-source=chirps_v3_daily_rnl \
|
|
596
|
-
--temp-source=
|
|
657
|
+
--temp-source=era5_land \
|
|
597
658
|
--fixed-season="03-01:05-31"
|
|
598
659
|
```
|
|
599
660
|
|
|
@@ -650,6 +711,23 @@ such as `total_seconds` and `mean_model_seconds`.
|
|
|
650
711
|
- `climate-toolkit-hazards`
|
|
651
712
|
- `climate-toolkit-hazards-ensemble`
|
|
652
713
|
|
|
714
|
+
NEX-GDDP hazards (`--source nex_gddp`, also `evaluate_hazards(..., source="nex_gddp")`)
|
|
715
|
+
accept `--model` / `--scenario`. `--scenario` defaults to `historical` when the
|
|
716
|
+
requested window ends before 2015, so pre-2015 windows work without extra flags
|
|
717
|
+
(a window that crosses 2015 needs an explicit scenario — no single NEX-GDDP
|
|
718
|
+
scenario spans the historical/SSP boundary):
|
|
719
|
+
|
|
720
|
+
```bash
|
|
721
|
+
env GCP_PROJECT_ID=YOUR_PROJECT_ID climate-toolkit-hazards \
|
|
722
|
+
maize \
|
|
723
|
+
--location=-0.776,37.66 \
|
|
724
|
+
--date-from 1995-01-01 \
|
|
725
|
+
--date-to 2013-12-31 \
|
|
726
|
+
--source nex_gddp \
|
|
727
|
+
--model GFDL-ESM4 \
|
|
728
|
+
--fixed-season '10-17:01-09'
|
|
729
|
+
```
|
|
730
|
+
|
|
653
731
|
### Weather stations
|
|
654
732
|
|
|
655
733
|
- `climate-toolkit-weather-station-download`
|
|
@@ -685,7 +763,7 @@ climate-toolkit-weather-station-compare \
|
|
|
685
763
|
--grid-source paired \
|
|
686
764
|
--grid-source nasa_power \
|
|
687
765
|
--precip-source chirps_v3_daily_rnl \
|
|
688
|
-
--temp-source
|
|
766
|
+
--temp-source era5_land \
|
|
689
767
|
--variables precipitation,max_temperature,min_temperature \
|
|
690
768
|
--output outputs/weather_station/nairobi_station_vs_grid.json
|
|
691
769
|
```
|
|
@@ -758,19 +836,20 @@ climate-toolkit-climatology \
|
|
|
758
836
|
--location="-1.286,36.817" \
|
|
759
837
|
--start-year=1991 \
|
|
760
838
|
--end-year=2020 \
|
|
761
|
-
--source=
|
|
839
|
+
--source=era5_land
|
|
762
840
|
```
|
|
763
841
|
|
|
764
842
|
Important source notes:
|
|
765
843
|
|
|
766
|
-
- `
|
|
767
|
-
|
|
768
|
-
|
|
844
|
+
- `chirps_v3_daily_rnl` and `chirts_era5` prefer direct public cloud access with
|
|
845
|
+
Python 3.12+ and the `cloud` extra. Use `--no-gee` to prohibit GEE fallback.
|
|
846
|
+
- `era5_land`, `era_5`, `chirps_v2`, deprecated `chirts`, `imerg` and other
|
|
847
|
+
GEE-only routes need Earth Engine auth plus `GCP_PROJECT_ID`.
|
|
769
848
|
- `era_5` daily coverage currently ends on `2020-07-09` in this package. Use
|
|
770
|
-
`
|
|
849
|
+
`era5_land` for a full `1991-2020` climatology window, or stop ERA5 at `2019`.
|
|
771
850
|
- `chirps_v2` / `chirps_v3_daily_rnl` are precipitation-only, so climatology
|
|
772
851
|
will omit temperature outputs.
|
|
773
|
-
- `chirts`
|
|
852
|
+
- `chirts_era5` and deprecated `chirts` are temperature-only, so climatology omits precipitation outputs.
|
|
774
853
|
|
|
775
854
|
SPEI and xclim helpers are library functions, not standalone console scripts.
|
|
776
855
|
Use them from Python after fetching/preprocessing climate data. VPD helpers use
|
|
@@ -921,7 +1000,7 @@ window, and variable set.
|
|
|
921
1000
|
For example, a live three-site, one-year benchmark on June 13, 2026 using:
|
|
922
1001
|
|
|
923
1002
|
- `chirps_v3_daily_rnl` cold cache: about 22 seconds
|
|
924
|
-
- `
|
|
1003
|
+
- `era5_land` with precipitation, temperature, humidity, wind, and solar cold cache: about 78 seconds
|
|
925
1004
|
- either source from warm cache: about 0.75 seconds
|
|
926
1005
|
|
|
927
1006
|
If you want cache reuse across sessions, pass a stable project-local
|
|
@@ -935,7 +1014,7 @@ Repeat runs using same cache can be near-instant.
|
|
|
935
1014
|
Observed live examples:
|
|
936
1015
|
|
|
937
1016
|
- `chirps_v3_daily_rnl`, 3 sites, 1 year, cold cache: about `22s`
|
|
938
|
-
- `
|
|
1017
|
+
- `era5_land`, 3 sites, 1 year, cold cache with companion variables: about `78s`
|
|
939
1018
|
- warm-cache rerun for same requests: about `0.75s`
|
|
940
1019
|
|
|
941
1020
|
For project work, prefer stable cache roots under `outputs/cache/...`.
|
|
@@ -971,7 +1050,7 @@ it.
|
|
|
971
1050
|
Use `tamsat` only as optional precipitation partner, not primary recommended
|
|
972
1051
|
historical source.
|
|
973
1052
|
|
|
974
|
-
- pair it with temperature source such as `
|
|
1053
|
+
- pair it with temperature source such as `era5_land`
|
|
975
1054
|
- expect slower runs and possible download instability
|
|
976
1055
|
- use as comparison / sensitivity source, not dependable default
|
|
977
1056
|
|
|
@@ -1365,7 +1444,7 @@ climate-toolkit-weather-station-compare \
|
|
|
1365
1444
|
--grid-source paired \
|
|
1366
1445
|
--grid-source nasa_power \
|
|
1367
1446
|
--precip-source chirps_v3_daily_rnl \
|
|
1368
|
-
--temp-source
|
|
1447
|
+
--temp-source era5_land \
|
|
1369
1448
|
--variables precipitation,max_temperature,min_temperature \
|
|
1370
1449
|
--output outputs/weather_station/nairobi_station_vs_grid_2011_2020.json
|
|
1371
1450
|
```
|
|
@@ -1378,8 +1457,8 @@ Comparison intent:
|
|
|
1378
1457
|
|
|
1379
1458
|
Current grid-source notes:
|
|
1380
1459
|
|
|
1381
|
-
- better independence: `
|
|
1382
|
-
- partly station-informed: `chirps_v2`, `chirps_v3_daily_rnl`, `chirts`, `paired`, `terraclimate`, `auto`
|
|
1460
|
+
- better independence: `era5_land`, `era_5`, `nasa_power`, `imerg`
|
|
1461
|
+
- partly station-informed: `chirps_v2`, `chirps_v3_daily_rnl`, `chirts_era5`, `chirts`, `paired`, `terraclimate`, `auto`
|
|
1383
1462
|
- comparison output warns when selected grid source is not fully independent from station-based validation
|
|
1384
1463
|
|
|
1385
1464
|
Output layers include:
|
|
@@ -1409,7 +1488,7 @@ climate-toolkit-stats \
|
|
|
1409
1488
|
--end-year=2020 \
|
|
1410
1489
|
--source=paired \
|
|
1411
1490
|
--precip-source=chirps_v3_daily_rnl \
|
|
1412
|
-
--temp-source=
|
|
1491
|
+
--temp-source=era5_land
|
|
1413
1492
|
```
|
|
1414
1493
|
|
|
1415
1494
|
To overlay your own station observations, add the override flags and replace
|
|
@@ -1423,7 +1502,7 @@ climate-toolkit-stats \
|
|
|
1423
1502
|
--end-year=2020 \
|
|
1424
1503
|
--source=paired \
|
|
1425
1504
|
--precip-source=chirps_v3_daily_rnl \
|
|
1426
|
-
--temp-source=
|
|
1505
|
+
--temp-source=era5_land \
|
|
1427
1506
|
--custom-station-file <REPLACE_WITH_YOUR_STATION.csv> \
|
|
1428
1507
|
--custom-station-vars precipitation,max_temperature,min_temperature \
|
|
1429
1508
|
--custom-station-name "My station"
|