Repository: owid/etl
Pull request #4121: 📊 climate: Fix climate change explorer
Author: login: pabloarosado
Created: 2025-03-13T09:38:27Z | Merged: 2025-03-14T07:06:57Z

* Transition [climate change impacts](https://ourworldindata.org/explorers/climate-change) csv-based manually created explorer [into an ETL export/explorer](http://staging-site-data-climate-change-explorer/admin/explorers/preview/climate-change).
* Ensure explorer/mdim config cites only steps that are in the DAG as dependencies of the current step.

@lucasrodes there's no need to inspect the metadata changes (this is not a very prominent explorer, and I have basically copied things from the old into the new explorer, adjusting a few minor things, and just changed one missing indicator). But please have a look at the changes in `PathFinder`. I ensured that paths added to config should be in the DAG (but I'm not sure if there is a better way to achieve that). Thanks!



Diff:
diff --git a/dag/archive/climate.yml b/dag/archive/climate.yml
index 65e9078d264..3772e30549a 100644
--- a/dag/archive/climate.yml
+++ b/dag/archive/climate.yml
@@ -990,3 +990,8 @@ steps:
   #
   data://garden/climate/2025-01-21/surface_temperature_analysis:
     - data://meadow/climate/2025-01-21/surface_temperature_analysis
+  #
+  # Climate change impacts data explorer.
+  #
+  data://explorers/climate/latest/climate_change_impacts:
+    - data://garden/climate/2025-01-21/climate_change_impacts
diff --git a/dag/climate.yml b/dag/climate.yml
index 45fdbd61001..9c3f1c665ef 100644
--- a/dag/climate.yml
+++ b/dag/climate.yml
@@ -48,7 +48,6 @@ steps:
     - data://garden/climate/2025-01-07/surface_temperature
   data://grapher/climate/2025-01-07/surface_global_monthly_anomaly_all_countries:
     - data://garden/climate/2025-01-07/surface_temperature
-
   #
   # Copernicus Climate Change Service - Precipitation.
   #
@@ -62,13 +61,11 @@ steps:
   #
   # Climate change impacts data explorer.
   #
-  data://explorers/climate/latest/climate_change_impacts:
-    - data://garden/climate/2025-01-21/climate_change_impacts
-
+  export://explorers/climate/latest/climate_change:
+    - data://grapher/climate/2025-01-21/climate_change_impacts_monthly
+    - data://grapher/climate/2025-01-21/climate_change_impacts_annual
+    - data://grapher/met_office_hadley_centre/2025-01-21/near_surface_temperature
 
-  #
-  # Weekly area burnt and emissions data on wildfires.
-  #
   #
   # Global Wildfire Information System - Monthly burned area.
   #
diff --git a/etl/collections/explorer_migration.py b/etl/collections/explorer_migration.py
index d286d337871..27d107e0439 100644
--- a/etl/collections/explorer_migration.py
+++ b/etl/collections/explorer_migration.py
@@ -558,4 +558,8 @@ def migrate_csv_explorer(explorer_path: Union[Path, str]):
         - [x] Otherwise, must be of length 2n+1
 - [ ] Columns
 - [ ] Graph
+- [ ] Function migrate_csv_explorer seems to have a few issues:
+    - [ ] Booleans are written as strings in the yaml.
+    - [ ] Field config.hideAnnotationFieldsInTitle is stored as a list, while it should probably be a boolean field.
+    - [ ] To avoid hardcoded paths, I suppose this function should write only table_name#indicator_name in config.
 """
diff --git a/etl/helpers.py b/etl/helpers.py
index 07991508884..e29fd880c70 100644
--- a/etl/helpers.py
+++ b/etl/helpers.py
@@ -214,7 +214,8 @@ class CurrentStepMustBeInDag(ExceptionFromDocstring):
 
 
 class NoMatchingStepsAmongDependencies(ExceptionFromDocstringWithKwargs):
-    """No steps found among dependencies of current ETL step, that match the given specifications."""
+    """No steps found among dependencies of current ETL step, that match the given specifications.
+    Add those missing datasets as dependencies of the current step in the DAG."""
 
 
 class MultipleMatchingStepsAmongDependencies(ExceptionFromDocstringWithKwargs):
diff --git a/etl/steps/data/garden/climate/2025-01-21/climate_change_impacts.meta.yml b/etl/steps/data/garden/climate/2025-01-21/climate_change_impacts.meta.yml
index 2a5bbd540b2..ce047a152e6 100644
--- a/etl/steps/data/garden/climate/2025-01-21/climate_change_impacts.meta.yml
+++ b/etl/steps/data/garden/climate/2025-01-21/climate_change_impacts.meta.yml
@@ -14,11 +14,166 @@ tables:
     variables:
       arctic_sea_ice_extent_min:
         title: Minimum Arctic sea ice extent
+        display:
+          name: September
+        presentation:
+          title_public: Minimum Arctic sea ice extent
       arctic_sea_ice_extent_max:
         title: Maximum Arctic sea ice extent
+        display:
+          name: February
+        presentation:
+          title_public: Maximum Arctic sea ice extent
       antarctic_sea_ice_extent_min:
         title: Minimum Antarctic sea ice extent
+        display:
+          name: February
+        presentation:
+          title_public: Minimum Antarctic sea ice extent
       antarctic_sea_ice_extent_max:
         title: Maximum Antarctic sea ice extent
+        display:
+          name: September
+        presentation:
+          title_public: Maximum Antarctic sea ice extent
+      ocean_heat_content_csiro_700m:
+        title: Annual average ocean heat content for the 0-700 meters layer, according to CSIRO
+        display:
+          name: CSIRO
+        presentation:
+          title_public: Annual average ocean heat content for the 0-700 meters layer, according to CSIRO
+      ocean_heat_content_iap_700m:
+        title: Annual average ocean heat content for the 0-700 meters layer, according to IAP
+        display:
+          name: IAP
+        presentation:
+          title_public: Annual average ocean heat content for the 0-700 meters layer, according to IAP
+      ocean_heat_content_mri_700m:
+        title: Annual average ocean heat content for the 0-700 meters layer, according to MRI/JMA
+        display:
+          name: MRI/JMA
+        presentation:
+          title_public: Annual average ocean heat content for the 0-700 meters layer, according to MRI/JMA
+      ocean_heat_content_noaa_700m:
+        title: Annual average ocean heat content for the 0-700 meters layer, according to NOAA
+        display:
+          name: NOAA
+        presentation:
+          title_public: Annual average ocean heat content for the 0-700 meters layer, according to NOAA
+      ocean_heat_content_iap_2000m:
+        title: Annual average ocean heat content for the 0-2000 meters layer, according to IAP
+        display:
+          name: IAP
+        presentation:
+          title_public: Annual average ocean heat content for the 0-2000 meters layer, according to IAP
+      ocean_heat_content_noaa_2000m:
+        title: Annual average ocean heat content for the 0-2000 meters layer, according to NOAA
+        display:
+          name: NOAA
+        presentation:
+          title_public: Annual average ocean heat content for the 0-2000 meters layer, according to NOAA
+      ocean_heat_content_mri_2000m:
+        title: Annual average ocean heat content for the 0-2000 meters layer, according to MRI/JMA
+        display:
+          name: MRI/JMA
+        presentation:
+          title_public: Annual average ocean heat content for the 0-2000 meters layer, according to MRI/JMA
+      co2_concentration:
+        title: Annual concentration of atmospheric carbon dioxide
+        display:
+          name: Annual average
+        presentation:
+          title_public: Annual concentration of atmospheric carbon dioxide
+      ch4_concentration:
+        title: Annual concentration of atmospheric methane
+        display:
+          name: Annual average
+        presentation:
+          title_public: Annual concentration of atmospheric methane
+      n2o_concentration:
+        title: Annual concentration of atmospheric nitrous oxide
+        display:
+          name: Annual average
+        presentation:
+          title_public: Annual concentration of atmospheric nitrous oxide
   climate_change_impacts_monthly:
     title: Climate Change Impacts - Monthly
+    variables:
+      sea_level_church_and_white_2011:
+        title: Global sea level according to Church and White (2011)
+        display:
+          name: Church and White
+        presentation:
+          title_public: Global sea level according to Church and White (2011)
+      sea_level_uhslc:
+        title: Global sea level according to UHSLC
+        display:
+          name: University of Hawaii
+        presentation:
+          title_public: Global sea level according to UHSLC
+      sea_level_average:
+        title: Global sea level as an average of Church and White (2011) and UHSLC data
+        display:
+          name: Average
+        presentation:
+          title_public: Global sea level as an average of Church and White (2011) and UHSLC data
+      land_ice_mass_nasa:
+        title: Cumulative change in mass in the ice sheets, according to NASA/JPL
+        display:
+          name: Seasonal variation
+        presentation:
+          title_public: Cumulative change in mass in the ice sheets, according to NASA/JPL
+      cumulative_ice_mass_change_imbie:
+        title: Cumulative change in mass in the ice sheets, according to IMBIE
+        display:
+          name: Combined measurements
+        presentation:
+          title_public: Cumulative change in mass in the ice sheets, according to IMBIE
+      snow_cover_extent:
+        title: Monthly measurement of the area covered by snow
+        display:
+          name: Snow cover
+        presentation:
+          title_public: Monthly measurement of the area covered by snow
+      snow_cover_extent_yearly_average:
+        title: Rolling yearly average of the area covered by snow
+        display:
+          name: Annual average
+        presentation:
+          title_public: Rolling yearly average of the area covered by snow
+      co2_concentration:
+        title: Monthly concentration of atmospheric carbon dioxide
+        display:
+          name: Monthly average
+        presentation:
+          title_public: Monthly concentration of atmospheric carbon dioxide
+      co2_concentration_yearly_average:
+        title: Rolling yearly average of the concentration of atmospheric carbon dioxide
+        display:
+          name: Annual average
+        presentation:
+          title_public: Rolling yearly average of the concentration of atmospheric carbon dioxide
+      ch4_concentration:
+        title: Monthly concentration of atmospheric methane
+        display:
+          name: Monthly average
+        presentation:
+          title_public: Monthly concentration of atmospheric methane
+      ch4_concentration_yearly_average:
+        title: Rolling yearly average of the concentration of atmospheric methane
+        display:
+          name: Annual average
+        presentation:
+          title_public: Rolling yearly average of the concentration of atmospheric methane
+      n2o_concentration:
+        title: Monthly concentration of atmospheric nitrous oxide
+        display:
+          name: Monthly average
+        presentation:
+          title_public: Monthly concentration of atmospheric nitrous oxide
+      n2o_concentration_yearly_average:
+        title: Rolling yearly average of the concentration of atmospheric nitrous oxide
+        display:
+          name: Annual average
+        presentation:
+          title_public: Rolling yearly average of the concentration of atmospheric nitrous oxide
diff --git a/etl/steps/data/garden/climate/2025-01-21/sea_surface_temperature.meta.yml b/etl/steps/data/garden/climate/2025-01-21/sea_surface_temperature.meta.yml
index 41722225c2b..17d3c5378af 100644
--- a/etl/steps/data/garden/climate/2025-01-21/sea_surface_temperature.meta.yml
+++ b/etl/steps/data/garden/climate/2025-01-21/sea_surface_temperature.meta.yml
@@ -26,7 +26,7 @@ tables:
     variables:
       sea_temperature_anomaly:
         title: Monthly sea surface temperature anomalies
-        description_short: The difference of average sea surface temperatures compared to the mean from 1861-1890, in degrees Celcius. This is measured at a depth of 20 centimeters.
+        description_short: The difference of average sea surface temperatures compared to the mean from 1861-1890, in degrees Celsius. This is measured at a depth of 20 centimeters.
         description_key:
         - Temperature anomalies show how many degrees Celsius temperatures have changed compared to the 1861-1890 period. This baseline period is commonly used to highlight the changes in temperature since pre-industrial times, prior to major human impacts.
         - The data includes separate measurements for the Northern and Southern Hemispheres, which helps researchers analyze regional differences.
diff --git a/etl/steps/data/garden/met_office_hadley_centre/2025-01-21/near_surface_temperature.meta.yml b/etl/steps/data/garden/met_office_hadley_centre/2025-01-21/near_surface_temperature.meta.yml
index 9869058588f..221f017440e 100644
--- a/etl/steps/data/garden/met_office_hadley_centre/2025-01-21/near_surface_temperature.meta.yml
+++ b/etl/steps/data/garden/met_office_hadley_centre/2025-01-21/near_surface_temperature.meta.yml
@@ -30,7 +30,7 @@ tables:
         title: Global average temperature anomaly relative to 1861-1890
         short_unit: °C
         unit: degrees Celsius
-        description_short: TThe difference in average land-sea surface temperature compared to the 1861-1890 mean, in degrees Celsius.
+        description_short: The difference in average land-sea surface temperature compared to the 1861-1890 mean, in degrees Celsius.
 
       upper_limit:
         title: Upper bound of the annual temperature anomaly (95% confidence interval)
diff --git a/etl/steps/export/explorers/climate/latest/climate_change.config.yml b/etl/steps/export/explorers/climate/latest/climate_change.config.yml
new file mode 100644
index 00000000000..b6db966d566
--- /dev/null
+++ b/etl/steps/export/explorers/climate/latest/climate_change.config.yml
@@ -0,0 +1,337 @@
+definitions:
+  common_views:
+    - config:
+        relatedQuestionUrl: https://ourworldindata.org/explorers/climate-change
+        relatedQuestionText: "Data explorer: how is the Earth's climate changing?"
+
+config:
+  explorerTitle: Climate Change Impacts
+  isPublished: true
+  entityType: region
+  explorerSubtitle: Explore the impacts of global climate change.
+  selection:
+    - World
+    - Antarctica
+    - Gulkana Glacier
+    - Lemon Creek Glacier
+    - North America
+    - South Cascade Glacier
+    - Wolverine Glacier
+    - Hawaii
+    - Arctic Ocean
+  subNavId: co2
+  subNavCurrentId: climate-impacts
+  wpBlockId: '45009'
+  hasMapTab: false
+  hideAnnotationFieldsInTitle: true
+
+dimensions:
+  - slug: metric
+    name: Metric
+    choices:
+      - slug: temperature_anomaly
+        name: Temperature anomaly
+      - slug: sea_surface_temperature_anomaly
+        name: Sea surface temperature anomaly
+      - slug: ocean_heat_content__top_700m
+        name: Ocean heat content (top 700m)
+      - slug: ocean_heat_content__top_2000m
+        name: Ocean heat content (top 2000m)
+      - slug: ocean_ph
+        name: Ocean pH
+      - slug: sea_level_rise
+        name: Sea level rise
+      - slug: arctic_sea_ice_extent
+        name: Arctic sea ice extent
+      - slug: antarctic_sea_ice_extent
+        name: Antarctic sea ice extent
+      - slug: mass_balance_of_ice_sheets
+        name: Mass balance of ice sheets
+      - slug: mass_balance_of_u_s__glaciers
+        name: Mass balance of U.S. Glaciers
+      - slug: snow_cover
+        name: Snow cover
+      - slug: co2_concentrations
+        name: CO₂ concentrations
+      - slug: ch4_concentrations
+        name: CH₄ concentrations
+      - slug: n2o_concentrations
+        name: N₂O concentrations
+    presentation:
+      type: dropdown
+  - slug: long_run_series
+    name: Long-run series
+    choices:
+      - slug: false
+        name: 'false'
+      - slug: true
+        name: 'true'
+    presentation:
+      type: checkbox
+views:
+  - dimensions:
+      metric: temperature_anomaly
+      long_run_series: false
+    indicators:
+      y:
+        - catalogPath: near_surface_temperature#temperature_anomaly
+    config:
+      title: 'Global warming: annual temperature anomaly'
+      yScaleToggle: false
+      yAxisMin: auto
+      baseColorScheme: owid-distinct
+      type: LineChart
+      hasMapTab: false
+  - dimensions:
+      metric: sea_surface_temperature_anomaly
+      long_run_series: false
+    indicators:
+      y:
+        - catalogPath: climate_change_impacts_monthly#sea_temperature_anomaly
+    config:
+      title: 'Global warming: monthly sea surface temperature anomaly'
+      subtitle: |-
+        This is measured at a nominal depth of 20cm, and given relative to the average temperature from the period of 1961 - 1990.
+      yScaleToggle: false
+      yAxisMin: auto
+      baseColorScheme: owid-distinct
+      type: LineChart
+      hasMapTab: false
+  - dimensions:
+      metric: ocean_heat_content__top_700m
+      long_run_series: false
+    indicators:
+      y:
+        - catalogPath: climate_change_impacts_annual#ocean_heat_content_csiro_700m
+        - catalogPath: climate_change_impacts_annual#ocean_heat_content_iap_700m
+        - catalogPath: climate_change_impacts_annual#ocean_heat_content_mri_700m
+        - catalogPath: climate_change_impacts_annual#ocean_heat_content_noaa_700m
+    config:
+      title: "Global warming: heat content in the top 700 meters of the world's oceans"
+      subtitle: |-
+        Ocean heat content is measured relative to the 1971–2000 average, which is set at zero for reference. It is measured in 10²² joules. For reference, 10²² joules are equal to approximately 17 times the amount of energy used globally every year.
+      yScaleToggle: false
+      yAxisMin: auto
+      baseColorScheme: owid-distinct
+      type: LineChart
+      hasMapTab: false
+      note: |-
+        Heat content is shown for four sources: Commonwealth Scientific and Industrial Research Organisation (CSIRO); Institute of Atmospheric Physics (IAP); National Oceanic and Atmospheric Administration (NOAA); and Meteorological Research Institute (MRI).
+  - dimensions:
+      metric: ocean_heat_content__top_2000m
+      long_run_series: false
+    indicators:
+      y:
+        - catalogPath: climate_change_impacts_annual#ocean_heat_content_iap_2000m
+        - catalogPath: climate_change_impacts_annual#ocean_heat_content_noaa_2000m
+        - catalogPath: climate_change_impacts_annual#ocean_heat_content_mri_2000m
+    config:
+      title: "Global warming: heat content in the top 2,000 meters of the world's oceans"
+      subtitle: |-
+        Ocean heat content is measured relative to the 1971–2000 average, which is set at zero for reference. It is measured in 10²² joules. For reference, 10²² joules are equal to approximately 17 times the amount of energy used globally every year.
+      yScaleToggle: false
+      yAxisMin: auto
+      baseColorScheme: owid-distinct
+      type: LineChart
+      hasMapTab: false
+      note: |-
+        Heat content is shown for four sources: Commonwealth Scientific and Industrial Research Organisation (CSIRO); Institute of Atmospheric Physics (IAP); National Oceanic and Atmospheric Administration (NOAA); and Meteorological Research Institute (MRI).
+  - dimensions:
+      metric: ocean_ph
+      long_run_series: false
+    indicators:
+      y:
+        - catalogPath: climate_change_impacts_monthly#ocean_ph
+        - catalogPath: climate_change_impacts_monthly#ocean_ph_yearly_average
+    config:
+      title: 'Ocean acidification: mean seawater pH'
+      subtitle: Mean seawater pH is shown based on in-situ measurements of pH from the Aloha station in Hawaii.
+      yScaleToggle: false
+      yAxisMin: auto
+      baseColorScheme: owid-distinct
+      type: LineChart
+      hasMapTab: false
+      hideAnnotationFieldsInTitle: true
+  - dimensions:
+      metric: sea_level_rise
+      long_run_series: false
+    indicators:
+      y:
+        - catalogPath: climate_change_impacts_monthly#sea_level_church_and_white_2011
+        - catalogPath: climate_change_impacts_monthly#sea_level_uhslc
+        - catalogPath: climate_change_impacts_monthly#sea_level_average
+    config:
+      title: Sea level rise
+      subtitle: |-
+        Global mean sea level rise is measured relative to the 1993 - 2008 average sea level. This is shown as three series: the widely-cited Church & White dataset; the University of Hawaii Sea Level Center (UHLSC); and the average of the two.
+      yScaleToggle: false
+      yAxisMin: auto
+      baseColorScheme: owid-distinct
+      type: LineChart
+      hasMapTab: false
+  - dimensions:
+      metric: arctic_sea_ice_extent
+      long_run_series: false
+    indicators:
+      y:
+        - catalogPath: climate_change_impacts_annual#arctic_sea_ice_extent_max
+        - catalogPath: climate_change_impacts_annual#arctic_sea_ice_extent_min
+    config:
+      title: 'Climate change: Arctic sea ice extent'
+      subtitle: The minimum and maximum sea ice extent typically occur in February and September each year.
+      yScaleToggle: false
+      yAxisMin: '0'
+      baseColorScheme: owid-distinct
+      type: LineChart
+      hasMapTab: false
+  - dimensions:
+      metric: antarctic_sea_ice_extent
+      long_run_series: false
+    indicators:
+      y:
+        - catalogPath: climate_change_impacts_annual#antarctic_sea_ice_extent_min
+        - catalogPath: climate_change_impacts_annual#antarctic_sea_ice_extent_max
+    config:
+      title: 'Climate change: Antarctic sea ice extent'
+      subtitle: The minimum and maximum sea ice extent typically occur in February and September each year.
+      yScaleToggle: false
+      yAxisMin: '0'
+      baseColorScheme: owid-distinct
+      type: LineChart
+      hasMapTab: false
+  - dimensions:
+      metric: mass_balance_of_ice_sheets
+      long_run_series: false
+    indicators:
+      y:
+        - catalogPath: climate_change_impacts_monthly#land_ice_mass_nasa
+        - catalogPath: climate_change_impacts_monthly#cumulative_ice_mass_change_imbie
+    config:
+      title: 'Climate change: change in mass of ice sheets'
+      subtitle: |-
+        Cumulative change in mass of ice sheets, measured relative to a base year of 2002. For reference, 1,000 billion metric tons is equal to about 260 cubic miles of ice—enough to raise sea level by about 3 millimeters.
+      yScaleToggle: false
+      yAxisMin: '-5200'
+      baseColorScheme: owid-distinct
+      type: LineChart
+      hasMapTab: false
+      note: Combined measurements are based on more than 20 different studies that have been combined for each region.
+  - dimensions:
+      metric: mass_balance_of_u_s__glaciers
+      long_run_series: false
+    indicators:
+      y:
+        - catalogPath: climate_change_impacts_annual#mass_balance_us_glaciers
+    config:
+      title: 'Climate change: change of mass of US glaciers'
+      subtitle: |-
+        Cumulative mass balance of U.S. reference glaciers, relative to the base year 1965. This is given in meters of water equivalent, which represent changes in the average thickness of a glacier.
+      yScaleToggle: false
+      yAxisMin: '-50'
+      baseColorScheme: owid-distinct
+      type: LineChart
+      hasMapTab: false
+  - dimensions:
+      metric: snow_cover
+      long_run_series: false
+    indicators:
+      y:
+        - catalogPath: climate_change_impacts_monthly#snow_cover_extent
+        - catalogPath: climate_change_impacts_monthly#snow_cover_extent_yearly_average
+    config:
+      title: Snow cover in North America
+      subtitle: |-
+        This metric measures the area covered by snow, based on an analysis of weekly maps. These data cover all of North America (including Greenland).
+      yScaleToggle: false
+      yAxisMin: '0'
+      baseColorScheme: owid-distinct
+      type: LineChart
+      hasMapTab: false
+  - dimensions:
+      metric: co2_concentrations
+      long_run_series: false
+    indicators:
+      y:
+        - catalogPath: climate_change_impacts_monthly#co2_concentration
+        - catalogPath: climate_change_impacts_monthly#co2_concentration_yearly_average
+    config:
+      title: Global atmospheric CO₂ concentration
+      subtitle: Atmospheric carbon dioxide (CO₂) concentration is measured in parts per million (ppm).
+      yScaleToggle: false
+      yAxisMin: '320'
+      baseColorScheme: owid-distinct
+      type: LineChart
+      hasMapTab: false
+  - dimensions:
+      metric: ch4_concentrations
+      long_run_series: false
+    indicators:
+      y:
+        - catalogPath: climate_change_impacts_monthly#ch4_concentration
+        - catalogPath: climate_change_impacts_monthly#ch4_concentration_yearly_average
+    config:
+      title: Global atmospheric methane concentration
+      subtitle: Atmospheric methane (CH₄) concentration is measured in parts per billion (ppb).
+      yScaleToggle: false
+      yAxisMin: '1600'
+      baseColorScheme: owid-distinct
+      type: LineChart
+      hasMapTab: false
+  - dimensions:
+      metric: n2o_concentrations
+      long_run_series: false
+    indicators:
+      y:
+        - catalogPath: climate_change_impacts_monthly#n2o_concentration
+        - catalogPath: climate_change_impacts_monthly#n2o_concentration_yearly_average
+    config:
+      title: Global atmospheric nitrous oxide concentration
+      subtitle: Atmospheric nitrous oxide (N₂O) concentration is measured in parts per billion (ppb).
+      yScaleToggle: false
+      yAxisMin: '300'
+      baseColorScheme: owid-distinct
+      type: LineChart
+      hasMapTab: false
+  - dimensions:
+      metric: co2_concentrations
+      long_run_series: true
+    indicators:
+      y:
+        - catalogPath: climate_change_impacts_annual#co2_concentration
+    config:
+      title: Global atmospheric CO₂ concentration
+      subtitle: |-
+        Atmospheric carbon dioxide (CO₂) concentration is measured in parts per million (ppm). Long-term trends in CO₂ concentrations can be measured at high-resolution using preserved air samples from ice cores.
+      yScaleToggle: false
+      yAxisMin: '150'
+      baseColorScheme: owid-distinct
+      type: LineChart
+      hasMapTab: false
+  - dimensions:
+      metric: ch4_concentrations
+      long_run_series: true
+    indicators:
+      y:
+        - catalogPath: climate_change_impacts_annual#ch4_concentration
+    config:
+      title: Global atmospheric methane concentration
+      subtitle: Atmospheric methane (CH₄) concentration is measured in parts per billion (ppb).
+      yScaleToggle: false
+      yAxisMin: '550'
+      baseColorScheme: owid-distinct
+      type: LineChart
+      hasMapTab: false
+  - dimensions:
+      metric: n2o_concentrations
+      long_run_series: true
+    indicators:
+      y:
+        - catalogPath: climate_change_impacts_annual#n2o_concentration
+    config:
+      title: Global atmospheric nitrous oxide concentration
+      subtitle: Atmospheric nitrous oxide (N₂O) concentration is measured in parts per billion (ppb).
+      yScaleToggle: false
+      yAxisMin: '250'
+      baseColorScheme: owid-distinct
+      type: LineChart
+      hasMapTab: false
diff --git a/etl/steps/export/explorers/climate/latest/climate_change.py b/etl/steps/export/explorers/climate/latest/climate_change.py
new file mode 100644
index 00000000000..3a6bfc5758a
--- /dev/null
+++ b/etl/steps/export/explorers/climate/latest/climate_change.py
@@ -0,0 +1,23 @@
+"""Load grapher datasets and create an explorer tsv file."""
+
+from etl.helpers import PathFinder
+
+# Get paths and naming conventions for current step.
+paths = PathFinder(__file__)
+
+
+def run() -> None:
+    #
+    # Load inputs.
+    #
+    # Load grapher config from YAML
+    config = paths.load_explorer_config()
+
+    # Create explorer
+    ds_explorer = paths.create_explorer(config=config, explorer_name="climate-change")
+
+    #
+    # Save outputs.
+    #
+    # Write explorer tsv file to owid-content.
+    ds_explorer.save(tolerate_extra_indicators=True)


Reviews:
user: login: lucasrodes
body: Nice job! Very cool to see a migration <3

One note on your suggestions for `PathFinder`: Checking that paths makes sense can't actually be done until we call `create_explorer`, which is where we make sure that catalog paths are complete (they can come in the reduced shape like `table#indicator`).

Other than this, LGTM!
state: CHANGES_REQUESTED
author_association: MEMBER
submitted_at: 2025-03-14T02:11:14Z

Review comments:
diff_hunk: @@ -591,6 +627,15 @@ def load_config(self, filename: Optional[str] = None, path: Optional[str | Path]
         elif path is None:
             path = self.config_path
         config = catalog.utils.dynamic_yaml_to_dict(catalog.utils.dynamic_yaml_load(path))
+
+        # Extract all indicators mentioned in the config.
+        indicators = extract_indicators_from_config(config=config)
+        # List their corresponding datasets.
+        datasets = sorted(set(["data://" + "/".join(indicator.split("/")[:-1]) for indicator in indicators]))
+        # Ensure that their datasets are included as dependencies of the current step.
+        if not set(datasets) <= self.dependencies:
+            raise NoMatchingStepsAmongDependencies(step_name=self.step_name)
path: etl/helpers.py
user: login: lucasrodes
body: I think this won't work in cases where the catalog path is not complete (i.e. use `table_name#column`). Note that that is often the case (and actually the recommended way).

There is a sanity check on this later in `create_explorer`, which tries to expand the catalog paths so they are complete based on the given dependencies (see function `process_views`). It'll fail if it can't do it (e.g. no step with that table name).

Hence, I suggest to drop this bit


created_at: 2025-03-14T02:07:38Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,337 @@
+definitions:
+  common_views:
+    - config:
+        relatedQuestionUrl: https://ourworldindata.org/explorers/climate-change
+        relatedQuestionText: "Data explorer: how is the Earth's climate changing?"
+
+config:
+  explorerTitle: Climate Change Impacts
+  isPublished: true
+  entityType: region
+  explorerSubtitle: Explore the impacts of global climate change.
+  selection:
+    - World
+    - Antarctica
+    - Gulkana Glacier
+    - Lemon Creek Glacier
+    - North America
+    - South Cascade Glacier
+    - Wolverine Glacier
+    - Hawaii
+    - Arctic Ocean
+  subNavId: co2
+  subNavCurrentId: climate-impacts
+  wpBlockId: '45009'
+  hasMapTab: false
+  hideAnnotationFieldsInTitle: true
+
+dimensions:
+  - slug: metric
+    name: Metric
+    choices:
+      - slug: temperature_anomaly
+        name: Temperature anomaly
+      - slug: sea_surface_temperature_anomaly
+        name: Sea surface temperature anomaly
+      - slug: ocean_heat_content__top_700m
+        name: Ocean heat content (top 700m)
+      - slug: ocean_heat_content__top_2000m
+        name: Ocean heat content (top 2000m)
+      - slug: ocean_ph
+        name: Ocean pH
+      - slug: sea_level_rise
+        name: Sea level rise
+      - slug: arctic_sea_ice_extent
+        name: Arctic sea ice extent
+      - slug: antarctic_sea_ice_extent
+        name: Antarctic sea ice extent
+      - slug: mass_balance_of_ice_sheets
+        name: Mass balance of ice sheets
+      - slug: mass_balance_of_u_s__glaciers
+        name: Mass balance of U.S. Glaciers
+      - slug: snow_cover
+        name: Snow cover
+      - slug: co2_concentrations
+        name: CO₂ concentrations
+      - slug: ch4_concentrations
+        name: CH₄ concentrations
+      - slug: n2o_concentrations
+        name: N₂O concentrations
+    presentation:
+      type: dropdown
+  - slug: long_run_series
+    name: Long-run series
+    choices:
+      - slug: false
+        name: 'false'
+      - slug: true
+        name: 'true'
+    presentation:
+      type: checkbox
+views:
+  - dimensions:
+      metric: temperature_anomaly
+      long_run_series: false
+    indicators:
+      y:
+        - catalogPath: grapher/met_office_hadley_centre/2025-01-21/near_surface_temperature/near_surface_temperature#temperature_anomaly
path: etl/steps/export/explorers/climate/latest/climate_change.config.yml
user: login: lucasrodes
body: maybe you can consider removing the `grapher/met_office_hadley_centre/2025-01-21/near_surface_temperature/` bit for all indicators? Could help automate future updates.
created_at: 2025-03-14T02:07:59Z
author_association: MEMBER

PR comments:
user: login: owidbot
created_at: 2025-03-13T09:40:09Z
body: <b>Quick links (staging server)</b>:
[Site Dev](http://staging-site-data-climate-change-explorer/) | [Site Preview](https://data-climate-change-explorer.owid.pages.dev/) | [Admin](http://staging-site-data-climate-change-explorer/admin) | [Wizard](http://staging-site-data-climate-change-explorer/etl/wizard/) | [Docs](http://staging-site-data-climate-change-explorer/etl/docs/)
|--------------------------------|----------------------------------|---|---|---|

**Login**: `ssh owid@staging-site-data-climate-change-explorer`

<!--grapher-start-->

<!--grapher-end-->
<!--chart-diff-start-->
<details open>
<summary><a href="http://staging-site-data-climate-change-explorer/etl/wizard/?page=chart-diff"><b>chart-diff</b></a>: ✅</summary>
<ul>
    <li>2/2 reviewed charts</li>
    <li>Modified: 2/2</li>
    <li>New: 0/0</li>
    <li>Rejected: 0</li>
    <li>Data changes: 0</li>
    <li>Metadata changes: 2</li>
    
</ul>
</details>
<!--chart-diff-end-->
<!--data-diff-start-->
<details>
<summary><b>data-diff</b>: ❌ Found differences</summary>

```diff
= Dataset garden/cdc/latest/measles_cases
  = Table measles_cases
    ~ Column cases (changed metadata)
-       -     date_accessed: '2025-03-14'
        ?                              ^
+       +     date_accessed: '2025-03-13'
        ?                              ^
    ~ Column outbreaks_n (changed metadata)
-       -     date_accessed: '2025-03-14'
        ?                              ^
+       +     date_accessed: '2025-03-13'
        ?                              ^
    ~ Column states_with_cases (changed metadata)
-       -     date_accessed: '2025-03-14'
        ?                              ^
+       +     date_accessed: '2025-03-13'
        ?                              ^
= Dataset garden/climate/2025-01-21/climate_change_impacts
  = Table climate_change_impacts_annual
    ~ Column antarctic_sea_ice_extent_max (changed metadata)
+       + display:
+       +   name: September
+       +   title_public: Maximum Antarctic sea ice extent
    ~ Column antarctic_sea_ice_extent_min (changed metadata)
+       + display:
+       +   name: February
+       +   title_public: Minimum Antarctic sea ice extent
    ~ Column arctic_sea_ice_extent_max (changed metadata)
+       + display:
+       +   name: February
+       +   title_public: Maximum Arctic sea ice extent
    ~ Column arctic_sea_ice_extent_min (changed metadata)
+       + display:
+       +   name: September
+       +   title_public: Minimum Arctic sea ice extent
    ~ Column ch4_concentration (changed metadata)
-       - title: Long-run CH₄ concentration
+       + title: Annual concentration of atmospheric methane
+       + display:
+       +   name: Annual average
+       +   title_public: Annual concentration of atmospheric methane
    ~ Column co2_concentration (changed metadata)
-       - title: Long-run CO₂ concentration
+       + title: Annual concentration of atmospheric carbon dioxide
+       + display:
+       +   name: Annual average
+       +   title_public: Annual concentration of atmospheric carbon dioxide
    ~ Column n2o_concentration (changed metadata)
-       - title: Long-run N₂O concentration
+       + title: Annual concentration of atmospheric nitrous oxide
+       + display:
+       +   name: Annual average
+       +   title_public: Annual concentration of atmospheric nitrous oxide
    ~ Column ocean_heat_content_csiro_700m (changed metadata)
+       + display:
+       +   name: CSIRO
+       +   title_public: Annual average ocean heat content for the 0-700 meters layer, according to CSIRO
    ~ Column ocean_heat_content_iap_2000m (changed metadata)
+       + display:
+       +   name: IAP
+       +   title_public: Annual average ocean heat content for the 0-2000 meters layer, according to IAP
    ~ Column ocean_heat_content_iap_700m (changed metadata)
+       + display:
+       +   name: IAP
+       +   title_public: Annual average ocean heat content for the 0-700 meters layer, according to IAP
    ~ Column ocean_heat_content_mri_2000m (changed metadata)
+       + display:
+       +   name: MRI/JMA
+       +   title_public: Annual average ocean heat content for the 0-2000 meters layer, according to MRI/JMA
    ~ Column ocean_heat_content_mri_700m (changed metadata)
+       + display:
+       +   name: MRI/JMA
+       +   title_public: Annual average ocean heat content for the 0-700 meters layer, according to MRI/JMA
    ~ Column ocean_heat_content_noaa_2000m (changed metadata)
+       + display:
+       +   name: NOAA
+       +   title_public: Annual average ocean heat content for the 0-2000 meters layer, according to NOAA
    ~ Column ocean_heat_content_noaa_700m (changed metadata)
+       + display:
+       +   name: NOAA
+       +   title_public: Annual average ocean heat content for the 0-700 meters layer, according to NOAA
  = Table climate_change_impacts_monthly
    ~ Column ch4_concentration (changed metadata)
+       + display:
+       +   name: Monthly average
+       +   title_public: Monthly concentration of atmospheric methane
    ~ Column ch4_concentration_yearly_average (changed metadata)
+       + display:
+       +   name: Annual average
+       +   title_public: Rolling yearly average of the concentration of atmospheric methane
    ~ Column co2_concentration (changed metadata)
+       + display:
+       +   name: Monthly average
+       +   title_public: Monthly concentration of atmospheric carbon dioxide
    ~ Column co2_concentration_yearly_average (changed metadata)
+       + display:
+       +   name: Annual average
+       +   title_public: Rolling yearly average of the concentration of atmospheric carbon dioxide
    ~ Column cumulative_ice_mass_change_imbie (changed metadata)
+       + display:
+       +   name: Combined measurements
+       +   title_public: Cumulative change in mass in the ice sheets, according to IMBIE
    ~ Column land_ice_mass_nasa (changed metadata)
+       + display:
+       +   name: Seasonal variation
+       +   title_public: Cumulative change in mass in the ice sheets, according to NASA/JPL
    ~ Column n2o_concentration (changed metadata)
+       + display:
+       +   name: Monthly average
+       +   title_public: Monthly concentration of atmospheric nitrous oxide
    ~ Column n2o_concentration_yearly_average (changed metadata)
+       + display:
+       +   name: Annual average
+       +   title_public: Rolling yearly average of the concentration of atmospheric nitrous oxide
    ~ Column sea_level_average (changed metadata)
+       + display:
+       +   name: Average
+       +   title_public: Global sea level as an average of Church and White (2011) and UHSLC data
    ~ Column sea_level_church_and_white_2011 (changed metadata)
+       + display:
+       +   name: Church and White
+       +   title_public: Global sea level according to Church and White (2011)
    ~ Column sea_level_uhslc (changed metadata)
+       + display:
+       +   name: University of Hawaii
+       +   title_public: Global sea level according to UHSLC
    ~ Column sea_temperature_anomaly (changed metadata)
-       -   The difference of average sea surface temperatures compared to the mean from 1861-1890, in degrees Celcius. This is measured at a depth of 20 centimeters.
        ?                                                                                                         ^
+       +   The difference of average sea surface temperatures compared to the mean from 1861-1890, in degrees Celsius. This is measured at a depth of 20 centimeters.
        ?                                                                                                         ^
    ~ Column snow_cover_extent (changed metadata)
+       + display:
+       +   name: Snow cover
+       +   title_public: Monthly measurement of the area covered by snow
    ~ Column snow_cover_extent_yearly_average (changed metadata)
+       + display:
+       +   name: Annual average
+       +   title_public: Rolling yearly average of the area covered by snow
= Dataset garden/climate/2025-01-21/sea_surface_temperature
  = Table sea_surface_temperature_annual
  = Table sea_surface_temperature
    ~ Column sea_temperature_anomaly (changed metadata)
-       -   The difference of average sea surface temperatures compared to the mean from 1861-1890, in degrees Celcius. This is measured at a depth of 20 centimeters.
        ?                                                                                                         ^
+       +   The difference of average sea surface temperatures compared to the mean from 1861-1890, in degrees Celsius. This is measured at a depth of 20 centimeters.
        ?                                                                                                         ^
= Dataset garden/health/latest/measles_long_run
  = Table measles_long_run
    ~ Column case_rate (changed metadata)
-       -     date_accessed: '2025-03-14'
        ?                              ^
+       +     date_accessed: '2025-03-13'
        ?                              ^
    ~ Column case_rate_static (changed metadata)
-       -     date_accessed: '2025-03-14'
        ?                              ^
+       +     date_accessed: '2025-03-13'
        ?                              ^
    ~ Column cases (changed metadata)
-       -     date_accessed: '2025-03-14'
        ?                              ^
+       +     date_accessed: '2025-03-13'
        ?                              ^
    ~ Column cases_static (changed metadata)
-       -     date_accessed: '2025-03-14'
        ?                              ^
+       +     date_accessed: '2025-03-13'
        ?                              ^
= Dataset garden/met_office_hadley_centre/2025-01-21/near_surface_temperature
  = Table near_surface_temperature
    ~ Column temperature_anomaly (changed metadata)
-       - description_short: TThe difference in average land-sea surface temperature compared to the 1861-1890 mean, in degrees Celsius.
        ?                    -
+       + description_short: The difference in average land-sea surface temperature compared to the 1861-1890 mean, in degrees Celsius.
= Dataset garden/oecd/2025-02-19/official_development_assistance
  = Table official_development_assistance
-   - Column i_a_8_2_refugees_other_provider_countries_net_disbursements
-   - Column oda_indonor_grant_equivalents
-   - Column oda_indonor_grant_equivalents_share_oda
-   - Column oda_indonor_net_disbursements
-   - Column oda_indonor_net_disbursements_share_oda
-   - Column oda_overseas_grant_equivalents
-   - Column oda_overseas_grant_equivalents_share_oda
-   - Column oda_overseas_net_disbursements
-   - Column oda_overseas_net_disbursements_share_oda
  = Table dac2a


Legend: +New  ~Modified  -Removed  =Identical  Details
Hint: Run this locally with etl diff REMOTE data/ --include yourdataset --verbose --snippet
```

Automatically updated datasets matching _weekly_wildfires|excess_mortality|covid|fluid|flunet|country_profile|garden/ihme_gbd/2019/gbd_risk_ are not included
</details>
<!--data-diff-end-->

_Edited: 2025-03-14 07:00:16 UTC_
_Execution time: 5.75 seconds_
author_association: CONTRIBUTOR
user: login: pabloarosado
created_at: 2025-03-14T07:02:10Z
body: Hey @lucasrodes thanks, that makes sense. I was confused and worried about having paths in the config. I'm happy that this is taken care of in `create_explorer`. Then, to avoid hardcoded paths, the migration function `migrate_csv_explorer` could write only `table_names#indicator_names` by default.
author_association: CONTRIBUTOR