Skip to content

Fix/839 unit magic for low and high emissions #844

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
""" add codecarbon version
"""add codecarbon version

Revision ID: 298059b19bde
Revises: edcd10edf11d
Expand Down
19 changes: 17 additions & 2 deletions codecarbon/viz/components.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@
from dash import dash_table as dt
from dash import dcc, html

from codecarbon.viz.units import (
EmissionUnit,
get_emissions_unit,
extends_emissions_units,
)


class Components:
def __init__(self):
Expand Down Expand Up @@ -656,15 +662,24 @@ def get_project_time_series_figure(project_data: dt.DataTable):
def get_project_emissions_bar_chart_figure(project_data: dt.DataTable):
# Note: necessary to both convert to pandas and replace null values for hover value
project_data = pd.DataFrame(project_data)
project_data = extends_emissions_units(project_data)
project_data = project_data.replace(np.nan, "", regex=True)
unit = get_emissions_unit(project_data)
hover_data = {c: True for c in project_data.columns}
bar = (
px.bar(
project_data,
y="emissions",
y=(
f"emissions_in_{unit}"
if unit != EmissionUnit.KILOGRAM
else "emissions"
),
hover_data=hover_data,
labels={
"emissions": "Carbon Equivalent (KgCO2eq)",
"index": "Entry",
"emissions": "Carbon Equivalent (kgCO2eq)",
"emissions_in_g": "Carbon Equivalent (gCO2eq)",
"emissions_in_t": "Carbon Equivalent (tCO2eq)",
"energy_consumed": "Energy Consumed (kWh)",
"timestamp": "Timestamp",
"project_name": "Project Name",
Expand Down
23 changes: 23 additions & 0 deletions codecarbon/viz/units.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import pandas as pd
from enum import Enum


class EmissionUnit(str, Enum):
GRAM = "g"
KILOGRAM = "kg"
TON = "t"


def get_emissions_unit(data: pd.DataFrame) -> EmissionUnit:
unit = EmissionUnit.KILOGRAM
if (data.emissions < 1).all():
unit = EmissionUnit.GRAM
if (data.emissions > 1000).all():
unit = EmissionUnit.TON
return unit


def extends_emissions_units(data: pd.DataFrame) -> pd.DataFrame:
data["emissions_in_g"] = data.emissions * 1000
data["emissions_in_t"] = data.emissions / 1000
return data
2 changes: 1 addition & 1 deletion tests/test_viz_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ def test_get_project_data(emissions_data: pd.DataFrame):


def test_get_global_emissions_choropleth_data(
global_energy_mix_data: Dict[str, Dict[str, Any]]
global_energy_mix_data: Dict[str, Dict[str, Any]],
):
viz_data = data.Data()
choropleth_data = viz_data.get_global_emissions_choropleth_data(
Expand Down
29 changes: 29 additions & 0 deletions tests/test_viz_units.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import pandas as pd
import pytest

from codecarbon.viz import units


@pytest.mark.parametrize(
["data", "expected_unit"],
[
(pd.DataFrame({"emissions": [0.05, 0.564]}), units.EmissionUnit.GRAM),
(pd.DataFrame({"emissions": [0.1, 2]}), units.EmissionUnit.KILOGRAM),
(pd.DataFrame({"emissions": [2, 1001]}), units.EmissionUnit.KILOGRAM),
(pd.DataFrame({"emissions": [1001, 2004]}), units.EmissionUnit.TON),
],
)
def test_get_emissions_unit(
data: pd.DataFrame, expected_unit: units.EmissionUnit
) -> None:
assert units.get_emissions_unit(data) == expected_unit


def test_extends_emissions_units() -> None:
data = pd.DataFrame({"emissions": [0.5]})
result = units.extends_emissions_units(data)
assert result.equals(
pd.DataFrame(
{"emissions": [0.5], "emissions_in_g": [500.0], "emissions_in_t": [0.0005]}
)
)
Loading