Browse Source

cats 1 and 2 in cc

Daniel Busch 4 months ago
parent
commit
182e178be8
3 changed files with 620 additions and 30 deletions
  1. 6 6
      src/faostat_data_primap/helper/definitions.py
  2. 393 0
      tests/unit/FAO_1.py
  3. 221 24
      tests/unit/test_conversion.py

+ 6 - 6
src/faostat_data_primap/helper/definitions.py

@@ -427,12 +427,12 @@ config_to_if = {
 # Definition of the domains and releases to be read
 domains_and_releases_to_read = {
     "2024": [
-        # ("farm_gate_agriculture_energy", "2024-11-14"),
-        # ("farm_gate_emissions_crops", "2024-11-14"),
-        # ("farm_gate_livestock", "2024-11-14"),
-        # ("land_use_drained_organic_soils", "2024-11-14"),
-        # ("land_use_fires", "2024-11-14"),
-        # ("land_use_forests", "2024-11-14"),
+        ("farm_gate_agriculture_energy", "2024-11-14"),
+        ("farm_gate_emissions_crops", "2024-11-14"),
+        ("farm_gate_livestock", "2024-11-14"),
+        ("land_use_drained_organic_soils", "2024-11-14"),
+        ("land_use_fires", "2024-11-14"),
+        ("land_use_forests", "2024-11-14"),
         ("pre_post_agricultural_production", "2024-11-14"),
     ]
 }

+ 393 - 0
tests/unit/FAO_1.py

@@ -0,0 +1,393 @@
+spec = {
+    "name": "FAO",
+    "title": "Food and Agriculture Organization of the United Nations (FAO) FAOSTAT data set categorisation",
+    "comment": "Needed to add FAOSTAT data to PRIMAP-hist",
+    "references": "",
+    "institution": "FAO",
+    "hierarchical": True,
+    "last_update": "2024-12-10",
+    "version": "2024",
+    "total_sum": True,
+    "canonical_top_level_category": "0",
+    "categories": {
+        "0": {
+            "title": "Total",
+            "comment": "All emissions and removals",
+            "children": [["1", "2"]],
+        },
+        "1": {
+            "title": "Crops",
+            "comment": "Crops",
+            "children": [["1.A", "1.B"]],
+            "info": {"gases": ["CH4", "N2O"]},
+        },
+        "2": {
+            "title": "Energy use in agriculture",
+            "comment": "Energy use in agriculture",
+            "children": [["2.A", "2.B", "2.C", "2.D", "2.E"]],
+            "info": {"gases": ["CH4", "N2O", "CO2"]},
+        },
+        "1.A": {
+            "title": "All crops",
+            "comment": "All crops",
+            "children": [
+                [
+                    "1.A.1",
+                    "1.A.2",
+                    "1.A.3",
+                    "1.A.4",
+                    "1.A.5",
+                    "1.A.6",
+                    "1.A.7",
+                    "1.A.8",
+                    "1.A.9",
+                    "1.A.10",
+                    "1.A.11",
+                    "1.A.12",
+                ]
+            ],
+            "info": {"gases": ["CH4", "N2O"]},
+        },
+        "1.A.1": {
+            "title": "Wheat",
+            "comment": "Wheat",
+            "info": {"gases": ["CH4", "N2O"]},
+            "children": [["1.A.1.a", "1.A.1.b"]],
+        },
+        "1.A.1.a.i": {
+            "title": "Wheat crop residues direct emissions",
+            "comment": "Wheat crop residues direct emissions",
+            "info": {"gases": ["N2O"]},
+        },
+        "1.A.1.a.ii": {
+            "title": "Wheat crop residues indirect emissions",
+            "comment": "Wheat crop residues indirect emissions",
+            "info": {"gases": ["N2O"]},
+        },
+        "1.A.1.a": {
+            "title": "Wheat crop residues",
+            "comment": "Wheat crop residues",
+            "info": {"gases": ["N2O"]},
+            "children": [["1.A.1.a.ii", "1.A.1.a.i"]],
+        },
+        "1.A.1.b": {
+            "title": "Wheat burning crop residues",
+            "comment": "Wheat burning crop residues",
+            "info": {"gases": ["CH4", "N2O"]},
+        },
+        "1.A.2": {
+            "title": "Rice",
+            "comment": "Rice",
+            "info": {"gases": ["CH4", "N2O"]},
+            "children": [["1.A.2.a", "1.A.2.b", "1.A.2.c"]],
+        },
+        "1.A.2.a.i": {
+            "title": "Rice crop residues direct emissions",
+            "comment": "Rice crop residues direct emissions",
+            "info": {"gases": ["N2O"]},
+        },
+        "1.A.2.a.ii": {
+            "title": "Rice crop residues indirect emissions",
+            "comment": "Rice crop residues indirect emissions",
+            "info": {"gases": ["N2O"]},
+        },
+        "1.A.2.a": {
+            "title": "Rice crop residues",
+            "comment": "Rice crop residues",
+            "info": {"gases": ["N2O"]},
+            "children": [["1.A.2.a.ii", "1.A.2.a.i"]],
+        },
+        "1.A.2.b": {
+            "title": "Rice burning crop residues",
+            "comment": "Rice burning crop residues",
+            "info": {"gases": ["CH4", "N2O"]},
+        },
+        "1.A.2.c": {
+            "title": "Rice cultivation",
+            "comment": "Rice cultivation",
+            "info": {"gases": ["CH4"]},
+        },
+        "1.A.3": {
+            "title": "Potatoes",
+            "comment": "Potatoes",
+            "info": {"gases": "N2O"},
+            "children": [["1.A.3.a"]],
+        },
+        "1.A.3.a.i": {
+            "title": "Potatoes crop residues direct emissions",
+            "comment": "Potatoes crop residues direct emissions",
+            "info": {"gases": ["N2O"]},
+        },
+        "1.A.3.a.ii": {
+            "title": "Potatoes crop residues indirect emissions",
+            "comment": "Potatoes crop residues indirect emissions",
+            "info": {"gases": ["N2O"]},
+        },
+        "1.A.3.a": {
+            "title": "Potatoes crop residues",
+            "comment": "Potatoes crop residues",
+            "info": {"gases": ["N2O"]},
+            "children": [["1.A.3.a.ii", "1.A.3.a.i"]],
+        },
+        "1.A.4": {
+            "title": "Millet",
+            "comment": "Millet",
+            "info": {"gases": "N2O"},
+            "children": [["1.A.4.a"]],
+        },
+        "1.A.4.a.i": {
+            "title": "Millet crop residues direct emissions",
+            "comment": "Millet crop residues direct emissions",
+            "info": {"gases": ["N2O"]},
+        },
+        "1.A.4.a.ii": {
+            "title": "Millet crop residues indirect emissions",
+            "comment": "Millet crop residues indirect emissions",
+            "info": {"gases": ["N2O"]},
+        },
+        "1.A.4.a": {
+            "title": "Millet crop residues",
+            "comment": "Millet crop residues",
+            "info": {"gases": ["N2O"]},
+            "children": [["1.A.4.a.ii", "1.A.4.a.i"]],
+        },
+        "1.A.5": {
+            "title": "Barley",
+            "comment": "Barley",
+            "info": {"gases": "N2O"},
+            "children": [["1.A.5.a"]],
+        },
+        "1.A.5.a.i": {
+            "title": "Barley crop residues direct emissions",
+            "comment": "Barley crop residues direct emissions",
+            "info": {"gases": ["N2O"]},
+        },
+        "1.A.5.a.ii": {
+            "title": "Barley crop residues indirect emissions",
+            "comment": "Barley crop residues indirect emissions",
+            "info": {"gases": ["N2O"]},
+        },
+        "1.A.5.a": {
+            "title": "Barley crop residues",
+            "comment": "Barley crop residues",
+            "info": {"gases": ["N2O"]},
+            "children": [["1.A.5.a.ii", "1.A.5.a.i"]],
+        },
+        "1.A.6": {
+            "title": "Maize (corn)",
+            "comment": "Maize (corn)",
+            "info": {"gases": ["CH4", "N2O"]},
+            "children": [["1.A.6.a", "1.A.6.b"]],
+        },
+        "1.A.6.a.i": {
+            "title": "Maize (corn) crop residues direct emissions",
+            "comment": "Maize (corn) crop residues direct emissions",
+            "info": {"gases": ["N2O"]},
+        },
+        "1.A.6.a.ii": {
+            "title": "Maize (corn) crop residues indirect emissions",
+            "comment": "Maize (corn) crop residues indirect emissions",
+            "info": {"gases": ["N2O"]},
+        },
+        "1.A.6.a": {
+            "title": "Maize (corn) crop residues",
+            "comment": "Maize (corn) crop residues",
+            "info": {"gases": ["N2O"]},
+            "children": [["1.A.6.a.ii", "1.A.6.a.i"]],
+        },
+        "1.A.6.b": {
+            "title": "Maize (corn) burning crop residues",
+            "comment": "Maize (corn) burning crop residues",
+            "info": {"gases": ["CH4", "N2O"]},
+        },
+        "1.A.7": {
+            "title": "Sugar cane",
+            "comment": "Sugar cane",
+            "info": {"gases": ["CH4", "N2O"]},
+            "children": [["1.A.7.a", "1.A.7.b"]],
+        },
+        "1.A.7.a.i": {
+            "title": "Sugar cane crop residues direct emissions",
+            "comment": "Sugar cane crop residues direct emissions",
+            "info": {"gases": ["N2O"]},
+        },
+        "1.A.7.a.ii": {
+            "title": "Sugar cane crop residues indirect emissions",
+            "comment": "Sugar cane crop residues indirect emissions",
+            "info": {"gases": ["N2O"]},
+        },
+        "1.A.7.a": {
+            "title": "Sugar cane crop residues",
+            "comment": "Sugar cane crop residues",
+            "info": {"gases": ["N2O"]},
+            "children": [["1.A.7.a.ii", "1.A.7.a.i"]],
+        },
+        "1.A.7.b": {
+            "title": "Sugar cane burning crop residues",
+            "comment": "Sugar cane burning crop residues",
+            "info": {"gases": ["CH4", "N2O"]},
+        },
+        "1.A.8": {
+            "title": "Beans, dry",
+            "comment": "Beans, dry",
+            "info": {"gases": "N2O"},
+            "children": [["1.A.8.a"]],
+        },
+        "1.A.8.a.i": {
+            "title": "Beans, dry crop residues direct emissions",
+            "comment": "Beans, dry crop residues direct emissions",
+            "info": {"gases": ["N2O"]},
+        },
+        "1.A.8.a.ii": {
+            "title": "Beans, dry crop residues indirect emissions",
+            "comment": "Beans, dry crop residues indirect emissions",
+            "info": {"gases": ["N2O"]},
+        },
+        "1.A.8.a": {
+            "title": "Beans, dry crop residues",
+            "comment": "Beans, dry crop residues",
+            "info": {"gases": ["N2O"]},
+            "children": [["1.A.8.a.ii", "1.A.8.a.i"]],
+        },
+        "1.A.9": {
+            "title": "Oats",
+            "comment": "Oats",
+            "info": {"gases": "N2O"},
+            "children": [["1.A.9.a"]],
+        },
+        "1.A.9.a.i": {
+            "title": "Oats crop residues direct emissions",
+            "comment": "Oats crop residues direct emissions",
+            "info": {"gases": ["N2O"]},
+        },
+        "1.A.9.a.ii": {
+            "title": "Oats crop residues indirect emissions",
+            "comment": "Oats crop residues indirect emissions",
+            "info": {"gases": ["N2O"]},
+        },
+        "1.A.9.a": {
+            "title": "Oats crop residues",
+            "comment": "Oats crop residues",
+            "info": {"gases": ["N2O"]},
+            "children": [["1.A.9.a.ii", "1.A.9.a.i"]],
+        },
+        "1.A.10": {
+            "title": "Rye",
+            "comment": "Rye",
+            "info": {"gases": "N2O"},
+            "children": [["1.A.10.a"]],
+        },
+        "1.A.10.a.i": {
+            "title": "Rye crop residues direct emissions",
+            "comment": "Rye crop residues direct emissions",
+            "info": {"gases": ["N2O"]},
+        },
+        "1.A.10.a.ii": {
+            "title": "Rye crop residues indirect emissions",
+            "comment": "Rye crop residues indirect emissions",
+            "info": {"gases": ["N2O"]},
+        },
+        "1.A.10.a": {
+            "title": "Rye crop residues",
+            "comment": "Rye crop residues",
+            "info": {"gases": ["N2O"]},
+            "children": [["1.A.10.a.ii", "1.A.10.a.i"]],
+        },
+        "1.A.11": {
+            "title": "Sorghum",
+            "comment": "Sorghum",
+            "info": {"gases": "N2O"},
+            "children": [["1.A.11.a"]],
+        },
+        "1.A.11.a.i": {
+            "title": "Sorghum crop residues direct emissions",
+            "comment": "Sorghum crop residues direct emissions",
+            "info": {"gases": ["N2O"]},
+        },
+        "1.A.11.a.ii": {
+            "title": "Sorghum crop residues indirect emissions",
+            "comment": "Sorghum crop residues indirect emissions",
+            "info": {"gases": ["N2O"]},
+        },
+        "1.A.11.a": {
+            "title": "Sorghum crop residues",
+            "comment": "Sorghum crop residues",
+            "info": {"gases": ["N2O"]},
+            "children": [["1.A.11.a.ii", "1.A.11.a.i"]],
+        },
+        "1.A.12": {
+            "title": "Soya beans",
+            "comment": "Soya beans",
+            "info": {"gases": "N2O"},
+            "children": [["1.A.12.a"]],
+        },
+        "1.A.12.a.i": {
+            "title": "Soya beans crop residues direct emissions",
+            "comment": "Soya beans crop residues direct emissions",
+            "info": {"gases": ["N2O"]},
+        },
+        "1.A.12.a.ii": {
+            "title": "Soya beans crop residues indirect emissions",
+            "comment": "Soya beans crop residues indirect emissions",
+            "info": {"gases": ["N2O"]},
+        },
+        "1.A.12.a": {
+            "title": "Soya beans crop residues",
+            "comment": "Soya beans crop residues",
+            "info": {"gases": ["N2O"]},
+            "children": [["1.A.12.a.ii", "1.A.12.a.i"]],
+        },
+        "1.B": {
+            "title": "Synthetic fertilisers",
+            "comment": "Synthetic fertilisers",
+            "info": {"gases": ["N2O"]},
+            "children": [["1.B.1", "1.B.2"]],
+        },
+        "1.B.1": {
+            "title": "Direct emissions",
+            "comment": "Direct emissions",
+            "info": {"gases": ["N2O"]},
+        },
+        "1.B.2": {
+            "title": "Indirect emissions",
+            "comment": "Indirect emissions",
+            "info": {"gases": ["N2O"]},
+            "children": [["1.B.2.a", "1.B.2.b"]],
+        },
+        "1.B.2.a": {
+            "title": "Indirect emissions that volatilise",
+            "comment": "Indirect emissions that volatilise",
+            "info": {"gases": ["N2O"]},
+        },
+        "1.B.2.b": {
+            "title": "Indirect emissions that leach",
+            "comment": "Indirect emissions that leach",
+            "info": {"gases": ["N2O"]},
+        },
+        "2.A": {
+            "title": "Natural gas",
+            "comment": "Natural gas",
+            "info": {"gases": ["CH4", "N2O", "CO2"]},
+        },
+        "2.B": {
+            "title": "Electricity",
+            "comment": "Electricity",
+            "info": {"gases": ["CH4", "N2O", "CO2"]},
+        },
+        "2.C": {
+            "title": "Coal",
+            "comment": "Coal",
+            "info": {"gases": ["CH4", "N2O", "CO2"]},
+        },
+        "2.D": {
+            "title": "Heat",
+            "comment": "Heat",
+            "info": {"gases": ["CH4", "N2O", "CO2"]},
+        },
+        "2.E": {
+            "title": "Petroleum",
+            "comment": "Petroleum",
+            "info": {"gases": ["CH4", "N2O", "CO2"]},
+        },
+    },
+}

+ 221 - 24
tests/unit/test_conversion.py

@@ -2,6 +2,27 @@ import climate_categories as cc
 import primap2 as pm2
 import pytest
 
+from src.faostat_data_primap.helper.paths import downloaded_data_path
+from src.faostat_data_primap.read import read_data
+
+
+def test_read(tmp_path):
+    domains_and_releases_to_read = [
+        # ("farm_gate_agriculture_energy", "2024-11-14"),
+        # ("farm_gate_emissions_crops", "2024-11-14"),
+        ("farm_gate_livestock", "2024-11-14"),
+        # ("land_use_drained_organic_soils", "2024-11-14"),
+        # ("land_use_fires", "2024-11-14"),
+        # ("land_use_forests", "2024-11-14"),
+        # ("pre_post_agricultural_production", "2024-11-14"),
+    ]
+
+    read_data(
+        domains_and_releases_to_read=domains_and_releases_to_read,
+        read_path=downloaded_data_path,
+        save_path=tmp_path,
+    )
+
 
 def test_yaml_to_python():
     cat = cc.from_yaml("FAO.yaml")
@@ -16,7 +37,86 @@ def test_python_to_yaml():
 
 
 def test_make_dict_comprehension_for_faster_typing():
+    spec = {
+        "name": "FAO",
+        "title": (
+            "Food and Agriculture Organization of the United Nations (FAO) "
+            "FAOSTAT data set categorisation"
+        ),
+        "comment": "Needed to add FAOSTAT data to PRIMAP-hist",
+        "references": "",
+        "institution": "FAO",
+        "hierarchical": True,
+        "last_update": "2024-12-10",
+        "version": "2024",
+        "total_sum": True,
+        "canonical_top_level_category": "0",
+    }
+
+    categories = {}
+    # 0. main categories
+    categories["0"] = {
+        "title": "Total",
+        "comment": "All emissions and removals",
+        "children": [["1", "2"]],  #  , "3", "4", "5", "6", "7"]],
+    }
+    children_1 = ["1.A", "1.B"]
+    children_2 = ["2.A", "2.B", "2.C", "2.D", "2.E"]
+    children_3 = [f"3.{i}" for i in "ABCDEFGHIJKLMNOPQR"]
+    children_4 = ["4.A"]
+    children_5 = ["5.A", "5.B"]
+    children_6 = ["6.A", "6.B", "6.C"]
+    children_7 = [f"3.{i}" for i in "ABCDEFGHIJKLM"]
+    main_categories = (
+        # category code, name and comment, gases, children
+        ("1", "Crops", ["CH4", "N2O"], children_1),
+        (
+            "2",
+            "Energy use in agriculture",
+            ["CH4", "N2O", "CO2"],
+            children_2,
+        ),
+        # ("3", "Livestock", ["CH4", "N2O"], children_3),
+        # ("4", "Forest", ["CO2"], children_4),
+        # (
+        #     "5",
+        #     "Drained organic soils",
+        #     ["N2O", "CO2"],
+        #     children_5,
+        # ),
+        # ("6", "Fires", ["CH4", "N2O", "CO2"], children_6),
+        # (
+        #     "7",
+        #     "Pre and post agricultural production",
+        #     ["CH4", "N2O", "CO2"],
+        #     children_7,
+        # ),
+    )
+    for code, name, gases, children in main_categories:
+        categories[code] = {
+            "title": name,
+            "comment": name,
+            "alternative_codes": code.replace(".", ""),
+            "children": [children],
+            "info": {"gases": gases},
+        }
+
+    # 1. crops
+    # all crops category
+    code_all_crops = "1.A"
+    codes_crops = [f"1.A.{i}" for i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]]
+    categories[code_all_crops] = {
+        "title": "All crops",
+        "comment": "All crops",
+        "alternative_codes": code_all_crops.replace(".", ""),
+        "children": [codes_crops],
+        "info": {"gases": ["CH4", "N2O"]},
+    }
+
     crops = [
+        "Wheat",
+        "Rice",
+        "Potatoes",
         "Millet",
         "Barley",
         "Maize (corn)",
@@ -27,43 +127,140 @@ def test_make_dict_comprehension_for_faster_typing():
         "Sorghum",
         "Soya beans",
     ]
-    letters = ["d", "e", "f", "g", "h", "i", "j", "k", "l"]
-    dict_crops = {}
-    for crop, letter in zip(crops, letters):
-        main_code = f"1.A.1.{letter}"
-        crop_residues_code = f"1.A.1.{letter}.i"
-        crop_residues_indirect_code = f"1.A.1.{letter}.i.2"
-        crop_residues_direct_code = f"1.A.1.{letter}.i.1"
-
-        dict_crops[main_code] = {
-            "title": crop,
-            "comment": crop,
-            "alternative_codes": main_code.replace(".", ""),
-            "children": [crop_residues_code],
-            "info": {"gases": ["CH4", "N2O"]},
+
+    crop_burnings = [
+        True,
+        True,
+        False,
+        False,
+        False,
+        True,
+        True,
+        False,
+        False,
+        False,
+        False,
+        False,
+    ]
+    rice_cultivations = [
+        False,
+        True,
+        False,
+        False,
+        False,
+        False,
+        False,
+        False,
+        False,
+        False,
+        False,
+        False,
+    ]
+
+    for crop, code, crop_burning, rice_cultivation in zip(
+        crops, codes_crops, crop_burnings, rice_cultivations
+    ):
+        # all crops have at least N2O emissions
+        gases_main = "N2O"
+
+        if crop_burning or rice_cultivation:
+            gases_main = ["CH4", "N2O"]
+
+        # all crops have at least crop residues as child
+        children_main = [f"{code}.a"]
+
+        if crop_burning:
+            children_main.append(f"{code}.b")
+
+        if rice_cultivation:
+            children_main.append(f"{code}.c")
+
+        categories[f"{code}"] = {
+            "title": f"{crop}",
+            "comment": f"{crop}",
+            "alternative_codes": [f"{code}".replace(".", "")],
+            "info": {"gases": gases_main},
+            "children": [children_main],
         }
 
-        dict_crops[crop_residues_direct_code] = {
+        # crop residues (every crop has it)
+        categories[f"{code}.a.i"] = {
             "title": f"{crop} crop residues direct emissions",
             "comment": f"{crop} crop residues direct emissions",
-            "alternative_codes": [crop_residues_direct_code.replace(".", "")],
-            "info": {"gases": ["CH4", "N2O"]},
+            "alternative_codes": [f"{code}.a".replace(".", "")],
+            "info": {"gases": ["N2O"]},
         }
 
-        dict_crops[crop_residues_indirect_code] = {
+        categories[f"{code}.a.ii"] = {
             "title": f"{crop} crop residues indirect emissions",
             "comment": f"{crop} crop residues indirect emissions",
-            "alternative_codes": [crop_residues_direct_code.replace(".", "")],
-            "info": {"gases": ["CH4", "N2O"]},
+            "alternative_codes": [f"{code}.a.i".replace(".", "")],
+            "info": {"gases": ["N2O"]},
         }
 
-        dict_crops[crop_residues_code] = {
+        categories[f"{code}.a"] = {
             "title": f"{crop} crop residues",
             "comment": f"{crop} crop residues",
-            "alternative_codes": [crop_residues_code.replace(".", "")],
-            "info": {"gases": ["CH4", "N2O"]},
-            "children": [[crop_residues_direct_code, crop_residues_indirect_code]],
+            "alternative_codes": [f"{code}.a".replace(".", "")],
+            "info": {"gases": ["N2O"]},
+            "children": [[f"{code}.a.ii", f"{code}.a.i"]],
+        }
+
+        if crop_burning:
+            categories[f"{code}.b"] = {
+                "title": f"{crop} burning crop residues",
+                "comment": f"{crop} burning crop residues",
+                "alternative_codes": [f"{code}.b".replace(".", "")],
+                "info": {"gases": ["CH4", "N2O"]},
+            }
+        if rice_cultivation:
+            categories[f"{code}.c"] = {
+                "title": "Rice cultivation",
+                "comment": "Rice cultivation",
+                "alternative_codes": [f"{code}.c".replace(".", "")],
+                "info": {"gases": ["CH4"]},
+            }
+
+    # synthetic fertilisers
+    codes_synthetic_fertilisers = ["1.B", "1.B.1", "1.B.2", "1.B.2.a", "1.B.2.b"]
+    names = [
+        "Synthetic fertilisers",
+        "Direct emissions",
+        "Indirect emissions",
+        "Indirect emissions that volatilise",
+        "Indirect emissions that leach",
+    ]
+    children_cats = [["1.B.1", "1.B.2"], None, ["1.B.2.a", "1.B.2.b"], None, None]
+
+    for code, name, child_cat in zip(codes_synthetic_fertilisers, names, children_cats):
+        categories[code] = {
+            "title": name,
+            "comment": name,
+            "alternative_codes": [code.replace(".", "")],
+            "info": {"gases": ["N2O"]},
         }
+        if child_cat:
+            categories[code]["children"] = [child_cat]
+
+    # 2. energy use
+    names = [
+        "Natural gas",
+        "Electricity",
+        "Coal",
+        "Heat",
+        "Petroleum",
+    ]
+    codes = children_2
+    for name, code in zip(names, codes):
+        categories[code] = {
+            "title": name,
+            "comment": name,
+            "alternative_codes": code.replace(".", ""),
+            "info": {"gases": ["CH4", "N2O", "CO2"]},
+        }
+
+    spec["categories"] = categories
+    cat = cc.HierarchicalCategorization.from_spec(spec.copy())
     pass