source.utils.carbon_utils

Utilities for carbon emissions calculations and conversions.

  1# source/utils/carbon_utils.py
  2"""
  3Utilities for carbon emissions calculations and conversions.
  4"""
  5from pathlib import Path
  6import pandas as pd
  7
  8
  9def kg_co2_to_car_distance(kg_co2: float) -> dict:
 10    """
 11    Convert CO2 emissions to equivalent car distance traveled.
 12
 13    Based on average European car emissions: 120 g CO₂/km (0.12 kg CO₂/km)
 14
 15    Parameters
 16    ----------
 17    kg_co2 : float
 18        CO2 emissions in kilograms
 19
 20    Returns
 21    -------
 22    dict
 23        Dictionary with distance in meters and kilometers
 24    """
 25    # Average European car: 120 g CO₂/km = 0.12 kg CO₂/km
 26    CO2_PER_KM = 0.12
 27
 28    distance_km = kg_co2 / CO2_PER_KM
 29    distance_m = distance_km * 1000
 30
 31    return {"distance_km": distance_km, "distance_m": distance_m}
 32
 33
 34def format_car_distance(kg_co2: float) -> str:
 35    """
 36    Format car distance in a human-readable way.
 37
 38    Parameters
 39    ----------
 40    kg_co2 : float
 41        CO2 emissions in kilograms
 42
 43    Returns
 44    -------
 45    str
 46        Formatted string with appropriate units
 47    """
 48    distances = kg_co2_to_car_distance(kg_co2)
 49
 50    if distances["distance_km"] >= 1:
 51        return f"{distances['distance_km']:.2f} km"
 52    else:
 53        return f"{distances['distance_m']:.1f} m"
 54
 55
 56def format_car_distance_meters_only(kg_co2: float) -> str:
 57    """
 58    Format car distance in meters only (for table display).
 59
 60    Parameters
 61    ----------
 62    kg_co2 : float
 63        CO2 emissions in kilograms
 64
 65    Returns
 66    -------
 67    str
 68        Distance in meters without units
 69    """
 70    distances = kg_co2_to_car_distance(kg_co2)
 71    return f"{distances['distance_m']:.1f}"
 72
 73
 74def get_total_emissions(emissions_csv_path: str) -> dict:
 75    """
 76    Calculate total accumulated CO2 emissions from emissions CSV file.
 77
 78    Parameters
 79    ----------
 80    emissions_csv_path : str or Path
 81        Path to the emissions.csv file generated by CodeCarbon
 82
 83    Returns
 84    -------
 85    dict
 86        Dictionary containing:
 87        - 'total_kg': Total emissions in kg CO₂eq
 88        - 'total_g': Total emissions in g CO₂eq
 89        - 'car_distance_km': Equivalent car distance in km
 90        - 'car_distance_m': Equivalent car distance in m
 91        - 'car_distance_formatted': Human-readable car distance
 92        - 'num_sessions': Number of tracked sessions
 93    """
 94    emissions_file = Path(emissions_csv_path)
 95
 96    if not emissions_file.exists():
 97        return {
 98            "total_kg": 0.0,
 99            "total_g": 0.0,
100            "car_distance_km": 0.0,
101            "car_distance_m": 0.0,
102            "car_distance_formatted": "0 m",
103            "num_sessions": 0,
104        }
105
106    try:
107        df = pd.read_csv(emissions_file)
108
109        if "emissions" not in df.columns or len(df) == 0:
110            return {
111                "total_kg": 0.0,
112                "total_g": 0.0,
113                "car_distance_km": 0.0,
114                "car_distance_m": 0.0,
115                "car_distance_formatted": "0 m",
116                "num_sessions": 0,
117            }
118
119        # Sum all emissions
120        total_kg = df["emissions"].sum()
121        total_g = total_kg * 1000
122
123        # Calculate car distance
124        car_distances = kg_co2_to_car_distance(total_kg)
125
126        return {
127            "total_kg": total_kg,
128            "total_g": total_g,
129            "car_distance_km": car_distances["distance_km"],
130            "car_distance_m": car_distances["distance_m"],
131            "car_distance_formatted": format_car_distance(total_kg),
132            "num_sessions": len(df),
133        }
134
135    except Exception as e:
136        print(f"Error reading emissions file: {e}")
137        return {
138            "total_kg": 0.0,
139            "total_g": 0.0,
140            "car_distance_km": 0.0,
141            "car_distance_m": 0.0,
142            "car_distance_formatted": "0 m",
143            "num_sessions": 0,
144        }
145
146
147def format_total_emissions_display(emissions_csv_path: str) -> str:
148    """
149    Format total emissions for display in UI.
150
151    Parameters
152    ----------
153    emissions_csv_path : str or Path
154        Path to the emissions.csv file
155
156    Returns
157    -------
158    str
159        Formatted HTML string for display
160    """
161    data = get_total_emissions(emissions_csv_path)
162
163    output_string = f"""\
164        <div style="display: flex; justify-content: space-between; \
165            width: 100%;">
166        <span>🌱 <strong>Carbon Footprint Tracker</strong> \
167            <em>(use this interactive demo responsibly)</em></span>
168        <span>🚗 {data['car_distance_formatted']} | 🌍 \
169            {data['total_g']:.2f}g CO₂</span>
170        </div>"""
171    return output_string
def kg_co2_to_car_distance(kg_co2: float) -> dict:
10def kg_co2_to_car_distance(kg_co2: float) -> dict:
11    """
12    Convert CO2 emissions to equivalent car distance traveled.
13
14    Based on average European car emissions: 120 g CO₂/km (0.12 kg CO₂/km)
15
16    Parameters
17    ----------
18    kg_co2 : float
19        CO2 emissions in kilograms
20
21    Returns
22    -------
23    dict
24        Dictionary with distance in meters and kilometers
25    """
26    # Average European car: 120 g CO₂/km = 0.12 kg CO₂/km
27    CO2_PER_KM = 0.12
28
29    distance_km = kg_co2 / CO2_PER_KM
30    distance_m = distance_km * 1000
31
32    return {"distance_km": distance_km, "distance_m": distance_m}

Convert CO2 emissions to equivalent car distance traveled.

Based on average European car emissions: 120 g CO₂/km (0.12 kg CO₂/km)

Parameters
  • kg_co2 (float): CO2 emissions in kilograms
Returns
  • dict: Dictionary with distance in meters and kilometers
def format_car_distance(kg_co2: float) -> str:
35def format_car_distance(kg_co2: float) -> str:
36    """
37    Format car distance in a human-readable way.
38
39    Parameters
40    ----------
41    kg_co2 : float
42        CO2 emissions in kilograms
43
44    Returns
45    -------
46    str
47        Formatted string with appropriate units
48    """
49    distances = kg_co2_to_car_distance(kg_co2)
50
51    if distances["distance_km"] >= 1:
52        return f"{distances['distance_km']:.2f} km"
53    else:
54        return f"{distances['distance_m']:.1f} m"

Format car distance in a human-readable way.

Parameters
  • kg_co2 (float): CO2 emissions in kilograms
Returns
  • str: Formatted string with appropriate units
def format_car_distance_meters_only(kg_co2: float) -> str:
57def format_car_distance_meters_only(kg_co2: float) -> str:
58    """
59    Format car distance in meters only (for table display).
60
61    Parameters
62    ----------
63    kg_co2 : float
64        CO2 emissions in kilograms
65
66    Returns
67    -------
68    str
69        Distance in meters without units
70    """
71    distances = kg_co2_to_car_distance(kg_co2)
72    return f"{distances['distance_m']:.1f}"

Format car distance in meters only (for table display).

Parameters
  • kg_co2 (float): CO2 emissions in kilograms
Returns
  • str: Distance in meters without units
def get_total_emissions(emissions_csv_path: str) -> dict:
 75def get_total_emissions(emissions_csv_path: str) -> dict:
 76    """
 77    Calculate total accumulated CO2 emissions from emissions CSV file.
 78
 79    Parameters
 80    ----------
 81    emissions_csv_path : str or Path
 82        Path to the emissions.csv file generated by CodeCarbon
 83
 84    Returns
 85    -------
 86    dict
 87        Dictionary containing:
 88        - 'total_kg': Total emissions in kg CO₂eq
 89        - 'total_g': Total emissions in g CO₂eq
 90        - 'car_distance_km': Equivalent car distance in km
 91        - 'car_distance_m': Equivalent car distance in m
 92        - 'car_distance_formatted': Human-readable car distance
 93        - 'num_sessions': Number of tracked sessions
 94    """
 95    emissions_file = Path(emissions_csv_path)
 96
 97    if not emissions_file.exists():
 98        return {
 99            "total_kg": 0.0,
100            "total_g": 0.0,
101            "car_distance_km": 0.0,
102            "car_distance_m": 0.0,
103            "car_distance_formatted": "0 m",
104            "num_sessions": 0,
105        }
106
107    try:
108        df = pd.read_csv(emissions_file)
109
110        if "emissions" not in df.columns or len(df) == 0:
111            return {
112                "total_kg": 0.0,
113                "total_g": 0.0,
114                "car_distance_km": 0.0,
115                "car_distance_m": 0.0,
116                "car_distance_formatted": "0 m",
117                "num_sessions": 0,
118            }
119
120        # Sum all emissions
121        total_kg = df["emissions"].sum()
122        total_g = total_kg * 1000
123
124        # Calculate car distance
125        car_distances = kg_co2_to_car_distance(total_kg)
126
127        return {
128            "total_kg": total_kg,
129            "total_g": total_g,
130            "car_distance_km": car_distances["distance_km"],
131            "car_distance_m": car_distances["distance_m"],
132            "car_distance_formatted": format_car_distance(total_kg),
133            "num_sessions": len(df),
134        }
135
136    except Exception as e:
137        print(f"Error reading emissions file: {e}")
138        return {
139            "total_kg": 0.0,
140            "total_g": 0.0,
141            "car_distance_km": 0.0,
142            "car_distance_m": 0.0,
143            "car_distance_formatted": "0 m",
144            "num_sessions": 0,
145        }

Calculate total accumulated CO2 emissions from emissions CSV file.

Parameters
  • emissions_csv_path (str or Path): Path to the emissions.csv file generated by CodeCarbon
Returns
  • dict: Dictionary containing:
    • 'total_kg': Total emissions in kg CO₂eq
    • 'total_g': Total emissions in g CO₂eq
    • 'car_distance_km': Equivalent car distance in km
    • 'car_distance_m': Equivalent car distance in m
    • 'car_distance_formatted': Human-readable car distance
    • 'num_sessions': Number of tracked sessions
def format_total_emissions_display(emissions_csv_path: str) -> str:
148def format_total_emissions_display(emissions_csv_path: str) -> str:
149    """
150    Format total emissions for display in UI.
151
152    Parameters
153    ----------
154    emissions_csv_path : str or Path
155        Path to the emissions.csv file
156
157    Returns
158    -------
159    str
160        Formatted HTML string for display
161    """
162    data = get_total_emissions(emissions_csv_path)
163
164    output_string = f"""\
165        <div style="display: flex; justify-content: space-between; \
166            width: 100%;">
167        <span>🌱 <strong>Carbon Footprint Tracker</strong> \
168            <em>(use this interactive demo responsibly)</em></span>
169        <span>🚗 {data['car_distance_formatted']} | 🌍 \
170            {data['total_g']:.2f}g CO₂</span>
171        </div>"""
172    return output_string

Format total emissions for display in UI.

Parameters
  • emissions_csv_path (str or Path): Path to the emissions.csv file
Returns
  • str: Formatted HTML string for display