Source code for pgsi_analyzer.models.carbon
"""
Carbon footprint calculation from energy consumption data.
This module provides functions to calculate carbon dioxide equivalent (CO₂e)
emissions from energy consumption data using configurable carbon intensity factors.
"""
import pandas as pd
from pathlib import Path
from typing import Union, Optional
[docs]
def calculate_carbon_footprint(
energy_csv_path: Union[str, Path],
output_path: Optional[Union[str, Path]] = None,
carbon_intensity: float = 0.000475
) -> pd.DataFrame:
"""
Calculate carbon footprint from energy consumption data.
Converts energy values (in microjoules) to carbon dioxide equivalent (CO₂e)
in grams using a configurable carbon intensity factor.
Args:
energy_csv_path: Path to CSV file containing energy data.
Expected format: 'algorithm' column and method columns with energy in μJ.
output_path: Optional path to save the carbon footprint CSV.
If None, file is not written.
carbon_intensity: Carbon intensity factor in gCO₂e per Joule.
Default: 0.000475 (global average).
Returns:
DataFrame with carbon footprint data:
- 'algorithm' column
- Method columns with '_CO2e_g' suffix (carbon in grams)
Raises:
FileNotFoundError: If ``energy_csv_path`` does not exist.
ValueError: If the input CSV is missing the ``algorithm`` column.
OSError: If ``output_path`` is provided but cannot be created/written.
Examples:
>>> df = calculate_carbon_footprint("results/energy_combined.csv")
>>> "algorithm" in df.columns
True
>>> df = calculate_carbon_footprint(
... "results/energy_combined.csv",
... output_path="results/carbon_footprint.csv",
... carbon_intensity=0.000475,
... )
"""
# Convert to Path if string
energy_path = Path(energy_csv_path) if isinstance(energy_csv_path, str) else energy_csv_path
if not energy_path.exists():
raise FileNotFoundError(f"Energy CSV file not found: {energy_path}")
# Read energy data
energy_df = pd.read_csv(energy_path)
if 'algorithm' not in energy_df.columns:
raise ValueError("CSV must contain an 'algorithm' column")
# Create carbon footprint DataFrame
carbon_df = pd.DataFrame()
carbon_df['algorithm'] = energy_df['algorithm']
# Calculate carbon for each method column
method_columns = [col for col in energy_df.columns if col != 'algorithm']
for method_col in method_columns:
carbon_col = f"{method_col}_CO2e_g"
# Convert μJ to J, then multiply by carbon intensity
carbon_df[carbon_col] = (
energy_df[method_col] * 1e-6 * carbon_intensity
).round(6)
# Save to file if output path provided
if output_path is not None:
output = Path(output_path) if isinstance(output_path, str) else output_path
output.parent.mkdir(parents=True, exist_ok=True)
carbon_df.to_csv(output, index=False)
return carbon_df