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