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.
Files changed (159) hide show
  1. {climate_toolkit-0.1.0/climate_toolkit.egg-info → climate_toolkit-0.2.0}/PKG-INFO +117 -38
  2. climate_toolkit-0.1.0/PKG-INFO → climate_toolkit-0.2.0/README.md +111 -75
  3. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/__init__.py +9 -3
  4. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/calculate_hazards/ensemble_hazards.py +3 -1
  5. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/calculate_hazards/hazards.py +66 -19
  6. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/cli.py +12 -5
  7. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/climate_statistics/ensemble_statistics.py +3 -1
  8. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/climate_statistics/statistics.py +55 -48
  9. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/climatology/heat_stress.py +2 -1
  10. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/climatology/human_heat_stress.py +27 -6
  11. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/climatology/long_term_climatology.py +72 -25
  12. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/climatology/spei.py +3 -3
  13. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/climatology/xclim_reference.py +1 -1
  14. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/compare_datasets/compare_datasets.py +32 -16
  15. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/compare_periods/ensemble_periods.py +4 -2
  16. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/compare_periods/periods.py +20 -9
  17. climate_toolkit-0.2.0/climate_toolkit/fetch_data/backend_policy.py +118 -0
  18. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/cache_inventory.py +34 -1
  19. climate_toolkit-0.2.0/climate_toolkit/fetch_data/direct_cloud.py +664 -0
  20. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/fetch_data.py +74 -18
  21. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/gee_xee_batch.py +5 -5
  22. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/preprocess_data/preprocess_data.py +12 -4
  23. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/runtime_notes.py +9 -1
  24. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/source_data.py +34 -4
  25. climate_toolkit-0.2.0/climate_toolkit/fetch_data/source_data/sources/agera_5.py +5 -0
  26. climate_toolkit-0.2.0/climate_toolkit/fetch_data/source_data/sources/era5_land.py +14 -0
  27. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/gee.py +7 -5
  28. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/utils/config.yaml +1 -1
  29. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/utils/models.py +18 -4
  30. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/utils/settings.py +11 -3
  31. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/xee_common.py +2 -0
  32. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/transform_data/data_dictionary.yaml +5 -1
  33. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/transform_data/transform_data.py +10 -0
  34. climate_toolkit-0.2.0/climate_toolkit/pipeline.py +540 -0
  35. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/season_analysis/ensemble.py +3 -1
  36. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/season_analysis/seasons.py +35 -24
  37. climate_toolkit-0.2.0/climate_toolkit/visualization/__init__.py +35 -0
  38. climate_toolkit-0.2.0/climate_toolkit/visualization/io.py +18 -0
  39. climate_toolkit-0.2.0/climate_toolkit/visualization/labels.py +21 -0
  40. climate_toolkit-0.2.0/climate_toolkit/visualization/styles.py +34 -0
  41. climate_toolkit-0.2.0/climate_toolkit/visualization/text.py +13 -0
  42. climate_toolkit-0.2.0/climate_toolkit/visualization/timelines.py +32 -0
  43. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/weather_station/compare.py +18 -6
  44. climate_toolkit-0.1.0/README.md → climate_toolkit-0.2.0/climate_toolkit.egg-info/PKG-INFO +154 -37
  45. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit.egg-info/SOURCES.txt +16 -0
  46. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit.egg-info/requires.txt +8 -0
  47. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/pyproject.toml +24 -1
  48. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_cli_dispatch.py +2 -2
  49. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_climatology_output.py +3 -3
  50. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_compare_datasets_source_policy.py +7 -7
  51. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_compare_periods_baseline.py +5 -5
  52. climate_toolkit-0.2.0/tests/test_direct_cloud.py +500 -0
  53. climate_toolkit-0.2.0/tests/test_direct_pipeline_integration.py +385 -0
  54. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_distribution_artifacts.py +32 -2
  55. climate_toolkit-0.2.0/tests/test_era5_land_access_probe.py +127 -0
  56. climate_toolkit-0.2.0/tests/test_era5_land_migration.py +110 -0
  57. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_fetch_pipeline.py +10 -6
  58. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_ghcn_daily_station.py +10 -10
  59. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_hazard_thresholds.py +12 -12
  60. climate_toolkit-0.2.0/tests/test_hazards_nex_model_scenario.py +88 -0
  61. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_historical_workers_surface.py +12 -12
  62. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_human_heat_stress.py +4 -4
  63. climate_toolkit-0.2.0/tests/test_notebook_magics.py +43 -0
  64. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_pipeline.py +87 -15
  65. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_season_analysis_ensemble_fixed.py +8 -8
  66. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_seasons_nex_gddp.py +3 -3
  67. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_spei_cli.py +2 -2
  68. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_statistics_source_policy.py +20 -21
  69. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_thi.py +1 -1
  70. climate_toolkit-0.2.0/tests/test_visualization.py +124 -0
  71. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_xclim_reference_cli.py +2 -2
  72. climate_toolkit-0.1.0/climate_toolkit/fetch_data/source_data/sources/agera_5.py +0 -15
  73. climate_toolkit-0.1.0/climate_toolkit/pipeline.py +0 -307
  74. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/LICENSE +0 -0
  75. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/_resources.py +0 -0
  76. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/calculate_hazards/__init__.py +0 -0
  77. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/calculate_hazards/crop_water_balance_params.json +0 -0
  78. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/climate_statistics/__init__.py +0 -0
  79. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/climatology/__init__.py +0 -0
  80. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/climatology/_cli_common.py +0 -0
  81. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/climatology/vpd.py +0 -0
  82. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/compare_datasets/__init__.py +0 -0
  83. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/compare_periods/__init__.py +0 -0
  84. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/crop_calendar/__init__.py +0 -0
  85. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/crop_calendar/ggcmi.py +0 -0
  86. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/crop_calendar/registry.py +0 -0
  87. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/data/__init__.py +0 -0
  88. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/data/ggcmi_phase3/__init__.py +0 -0
  89. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/data/ggcmi_phase3/crop_calendar.parquet +0 -0
  90. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/data/ggcmi_phase3/crop_calendar_manifest.json +0 -0
  91. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/__init__.py +0 -0
  92. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/multi_site.py +0 -0
  93. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/nex_gddp_batch.py +0 -0
  94. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/preprocess_data/__init__.py +0 -0
  95. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/__init__.py +0 -0
  96. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/chirps.py +0 -0
  97. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/chirts.py +0 -0
  98. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/era_5.py +0 -0
  99. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/gee_xee.py +0 -0
  100. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/ghcn_daily.py +0 -0
  101. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/gsod.py +0 -0
  102. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/imerg.py +0 -0
  103. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/nasa_power.py +0 -0
  104. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/nex_gddp.py +0 -0
  105. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/nex_gddp_xee.py +0 -0
  106. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/soil_grid.py +0 -0
  107. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/tamsat.py +0 -0
  108. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/terraclimate.py +0 -0
  109. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/source_data/sources/utils/__init__.py +0 -0
  110. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/fetch_data/transform_data/__init__.py +0 -0
  111. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/gee_check.py +0 -0
  112. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/season_analysis/__init__.py +0 -0
  113. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/season_analysis/season_identity.py +0 -0
  114. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/weather_station/__init__.py +0 -0
  115. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/weather_station/custom_station.py +0 -0
  116. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/weather_station/dem.py +0 -0
  117. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/weather_station/download.py +0 -0
  118. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/weather_station/ghcn_daily.py +0 -0
  119. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/weather_station/gsod.py +0 -0
  120. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/weather_station/overrides.py +0 -0
  121. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit/weather_station/station_selector.py +0 -0
  122. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit.egg-info/dependency_links.txt +0 -0
  123. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit.egg-info/entry_points.txt +0 -0
  124. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/climate_toolkit.egg-info/top_level.txt +0 -0
  125. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/setup.cfg +0 -0
  126. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_api_smoke.py +0 -0
  127. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_auto_season_alignment_report.py +0 -0
  128. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_cache_inventory.py +0 -0
  129. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_climatology_typer_cli.py +0 -0
  130. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_crop_registry_hazards.py +0 -0
  131. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_ensemble_hazards_aggregation.py +0 -0
  132. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_ensemble_hazards_import.py +0 -0
  133. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_ensemble_statistics_scenario_validation.py +0 -0
  134. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_era_lte_workflow.py +0 -0
  135. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_fetch_climate_data_usability.py +0 -0
  136. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_fetch_model_resolution.py +0 -0
  137. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_gee_check.py +0 -0
  138. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_gee_no_auto_auth.py +0 -0
  139. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_gee_xee_batch.py +0 -0
  140. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_ggcmi_crop_calendar.py +0 -0
  141. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_install_shape.py +0 -0
  142. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_lazy_package_roots.py +0 -0
  143. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_matplotlib_not_stubbed.py +0 -0
  144. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_multi_site_contract.py +0 -0
  145. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_nasa_power_cache.py +0 -0
  146. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_nex_gddp_batch.py +0 -0
  147. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_nex_gddp_behavior.py +0 -0
  148. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_nex_gddp_xee_poc.py +0 -0
  149. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_package_import_hygiene.py +0 -0
  150. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_package_resources.py +0 -0
  151. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_packaging_metadata.py +0 -0
  152. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_preprocess_imports.py +0 -0
  153. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_season_identity.py +0 -0
  154. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_soil_grid_cache.py +0 -0
  155. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_spei.py +0 -0
  156. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_station_verbose_kwarg.py +0 -0
  157. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_tamsat_logging.py +0 -0
  158. {climate_toolkit-0.1.0 → climate_toolkit-0.2.0}/tests/test_vpd.py +0 -0
  159. {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.1.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, AGERA5, TerraClimate, IMERG, TAMSAT, CHIRTS, ERA5, NEX-GDDP, NASA POWER, CMIP6 and SoilGrids.
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
  [![About](https://img.shields.io/badge/about-the%20project-blue)](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
  [![Documentation](https://img.shields.io/badge/docs-climate--toolkit-2ea44f)](https://CGIAR-Climate-Data-Hub.github.io/climate-toolkit/) — full documentation: getting started, workflows, and API reference.
46
51
 
52
+ [![PyPI](https://img.shields.io/pypi/v/climate-toolkit)](https://pypi.org/project/climate-toolkit/) — published on PyPI: `pip install climate-toolkit`.
53
+
47
54
  [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](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
+ [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](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
  &nbsp;&nbsp;&nbsp;&nbsp;
@@ -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
  [![CHIRPS](https://img.shields.io/badge/CHIRPS-Precipitation_4.8-blue)](https://data.chc.ucsb.edu/products/CHIRPS-2.0/)
62
- [![AgERA5](https://img.shields.io/badge/AgERA5-Agriculture_Climate_4.8-brightgreen)](https://data.mcc.tu-berlin.de/agera5/)
71
+ [![ERA5-Land](https://img.shields.io/badge/ERA5--Land-Reanalysis-brightgreen)](https://developers.google.com/earth-engine/datasets/catalog/ECMWF_ERA5_LAND_DAILY_AGGR)
63
72
  [![TerraClimate](https://img.shields.io/badge/TerraClimate-Water_Balance_4.7-lightgrey)](http://www.climatologylab.org/terraclimate.html)
64
73
  [![IMERG](https://img.shields.io/badge/IMERG-Global_Precipitation_4.7-green)](https://gpm.nasa.gov/data/imerg)
65
74
  [![TAMSAT](https://img.shields.io/badge/TAMSAT-Africa_Precipitation_4.7-yellowgreen)](https://www.tamsat.org.uk/)
66
- [![CHIRTS](https://img.shields.io/badge/CHIRTS-Temperature_4.7-blueviolet)](https://data.chc.ucsb.edu/products/CHIRTSdaily/)
75
+ [![CHIRTS-ERA5](https://img.shields.io/badge/CHIRTS--ERA5-Temperature-blueviolet)](https://www.chc.ucsb.edu/data/chirts-era5)
67
76
  [![ERA5](https://img.shields.io/badge/ERA5-Reanalysis_Climate_4.2-orange)](https://cds.climate.copernicus.eu/cdsapp#!/dataset/reanalysis-era5-single-levels)
68
77
  [![NEX-GDDP](https://img.shields.io/badge/NEX--GDDP-Climate_Projections_4.1-blue)](https://www.nccs.nasa.gov/services/data-collections/land-based-products/nex-gddp)
69
78
  [![NASA POWER](https://img.shields.io/badge/NASA_POWER-Solar_Temp_Global_4.0-lightblue)](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, AGERA5, TerraClimate, IMERG, TAMSAT, CHIRTS, ERA5, NEX-GDDP, NASA POWER, CMIP6 and SoilGrids
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 + agera_5`: CHIRPS v3 Daily RNL supplies precipitation and
85
- AgERA5 supplies temperature plus companion variables such as humidity, wind,
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 `agera_5`. Keep `era_5` available for compatibility, diagnostics, and
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 + agera_5` for
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` | All Earth Engine-backed sources (AgERA5, 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. |
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
- Current decision:
396
-
397
- - GitHub releases only for now
398
- - no direct PyPI publish yet
399
- - TestPyPI can come later once auth-heavy runtime expectations, install docs,
400
- and wheel smoke behavior stay stable across contributor machines
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: `agera_5`
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
- `agera_5`, `era_5`, `nex_gddp`, `nasa_power`
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
- | `agera_5` | supported | humidity derived from dewpoint + air temperature in current fetch pipeline |
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 source |
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="agera_5"))
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=agera_5 \
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=agera_5 \
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 agera_5 \
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=agera_5
839
+ --source=era5_land
762
840
  ```
763
841
 
764
842
  Important source notes:
765
843
 
766
- - `agera_5`, `era_5`, `chirps_v2`, `chirps_v3_daily_rnl`, `chirts`, `imerg`,
767
- and similar historical gridded sources are Earth Engine-backed in this
768
- toolkit. They need Earth Engine auth plus `GCP_PROJECT_ID`.
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
- `agera_5` for a full `1991-2020` climatology window, or stop ERA5 at `2019`.
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` is temperature-only, so climatology will omit precipitation outputs.
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
- - `agera_5` with precipitation, temperature, humidity, wind, and solar cold cache: about 78 seconds
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
- - `agera_5`, 3 sites, 1 year, cold cache with companion variables: about `78s`
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 `agera_5`
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 agera_5 \
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: `agera_5`, `era_5`, `nasa_power`, `imerg`
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=agera_5
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=agera_5 \
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"