Spaces:
Sleeping
Sleeping
import json | |
import dash_bootstrap_components as dbc | |
import numpy as np | |
import pandas as pd | |
import plotly.express as px | |
from dash import dash_table as dt | |
from dash import dcc, html | |
class Components: | |
def __init__(self): | |
self.colorscale = [ | |
"rgb(0, 68, 27)", # greens | |
"rgb(0, 109, 44)", | |
"rgb(35, 139, 69)", | |
"rgb(65, 171, 93)", | |
"rgb(116, 196, 118)", | |
"rgb(161, 217, 155)", | |
"rgb(199, 233, 192)", | |
"rgb(229, 245, 224)", | |
"rgb(240, 240, 240)", # greys | |
"rgb(217, 217, 217)", | |
"rgb(189, 189, 189)", | |
"rgb(253, 208, 162)", # oranges | |
"rgb(253, 174, 107)", | |
"rgb(253, 141, 60)", | |
] # px.colors.sequential.Greens_r, | |
def get_header(): | |
return html.Div( | |
dbc.Container( | |
[ | |
html.H1("Carbon Footprint", style={"textAlign": "center"}), | |
html.P( | |
"Measure Compute Emissions", | |
style={"textAlign": "center", "paddingLeft": "0.5%"}, | |
className="lead", | |
), | |
], | |
fluid=True, | |
className="py-3", | |
), | |
className="p-3 mb-5 bg-light rounded-5", | |
) | |
def get_net_summary(): | |
return html.Div( | |
[ | |
html.H2("Across All Projects", style={"textAlign": "center"}), | |
html.H4( | |
[ | |
"Net Power Consumption : ", | |
html.Strong( | |
id="net_power_consumption", | |
style={"fontWeight": "normal", "color": "green"}, | |
), | |
], | |
style={"textAlign": "left", "float": "left"}, | |
), | |
html.H4( | |
[ | |
"Net Carbon Equivalent : ", | |
html.Strong( | |
id="net_carbon_equivalent", | |
style={"fontWeight": "normal", "color": "green"}, | |
), | |
], | |
style={"textAlign": "right", "float": "right"}, | |
), | |
], | |
style={"paddingLeft": "1.4%", "paddingRight": "1.4%"}, | |
) | |
def get_project_dropdown(df: pd.DataFrame): | |
projects = sorted(list(df["project_name"].unique())) | |
return html.Div( | |
dbc.Col( | |
[ | |
html.Br(), | |
html.H3("Select a Project", style={"textAlign": "left"}), | |
dcc.Dropdown( | |
id="project_name", | |
options=[{"label": i, "value": i} for i in projects], | |
value=projects[0], | |
), | |
], | |
style={"display": "inline-block"}, | |
) | |
) | |
def get_project_details(): | |
return html.Div( | |
[ | |
html.Br(), | |
html.Div( | |
[ | |
html.H3( | |
[ | |
"Infrastructure Hosted at ", | |
html.Strong( | |
id="project_infrastructure_location", | |
style={"fontWeight": "normal", "color": "green"}, | |
), | |
], | |
style={"float": "left"}, | |
) | |
] | |
), | |
html.Br(), | |
html.Br(), | |
html.Div( | |
[ | |
html.H4( | |
[ | |
"Power Consumption Across All Experiments : ", | |
html.Strong( | |
id="project_power_consumption", | |
style={"fontWeight": "normal", "color": "green"}, | |
), | |
], | |
style={"float": "left"}, | |
), | |
html.H4( | |
[ | |
"Last Run Power Consumption : ", | |
html.Strong( | |
id="last_run_power_consumption", | |
style={"fontWeight": "normal", "color": "green"}, | |
), | |
], | |
style={"float": "right"}, | |
), | |
] | |
), | |
html.Br(), | |
html.Div( | |
[ | |
html.H4( | |
[ | |
"Carbon Equivalent Across All Experiments : ", | |
html.Strong( | |
id="project_carbon_equivalent", | |
style={"color": "green", "fontWeight": "bold"}, | |
), | |
], | |
style={"float": "left"}, | |
), | |
html.H4( | |
[ | |
"Last Run Carbon Equivalent : ", | |
html.Strong( | |
id="last_run_carbon_equivalent", | |
style={"fontWeight": "normal", "color": "green"}, | |
), | |
], | |
style={"float": "right"}, | |
), | |
] | |
), | |
], | |
style={"paddingLeft": "1.4%", "paddingRight": "1.4%"}, | |
) | |
def get_exemplary_equivalents(): | |
return html.Div( | |
[ | |
html.Br(), | |
html.Br(), | |
html.Br(), | |
html.Br(), | |
html.Div( | |
[ | |
html.H2("Exemplary Equivalents", style={"textAlign": "center"}), | |
html.Br(), | |
html.P( | |
[ | |
html.Div( | |
[ | |
html.Img( | |
id="house_icon", | |
style={"height": "20%", "width": "50%"}, | |
), | |
html.Div( | |
[ | |
html.Strong( | |
id="household_fraction", | |
style={ | |
"color": "green", | |
"fontSize": 20, | |
"paddingLeft": "4%", | |
}, | |
), | |
html.H5( | |
"of weekly", | |
style={"paddingLeft": "3.5%"}, | |
), | |
html.H5( | |
"American", | |
style={"paddingLeft": "2.8%"}, | |
), | |
html.H5("household"), | |
html.H5( | |
"emissions", | |
style={"paddingLeft": "1.4%"}, | |
), | |
] | |
), | |
], | |
style={"float": "left", "width": "25%"}, | |
), | |
html.Div( | |
[ | |
html.Img( | |
id="car_icon", | |
style={ | |
"height": "43%", | |
"width": "28.5%", | |
# "paddingLeft": "2%", | |
}, | |
), | |
html.Div( | |
[ | |
html.Strong( | |
id="car_miles", | |
style={ | |
"color": "green", | |
"fontWeight": "bold", | |
"fontSize": 20, | |
}, | |
), | |
html.H5( | |
"driven", | |
style={"paddingLeft": "5.5%"}, | |
), | |
] | |
), | |
], | |
style={ | |
"float": "left", | |
"width": "50%", | |
"paddingLeft": 90, | |
}, | |
), | |
html.Div( | |
[ | |
html.Img( | |
id="tv_icon", | |
style={ | |
"height": "35%", | |
"width": "53%", | |
"paddingLeft": "5%", | |
}, | |
), | |
html.Div( | |
[ | |
html.Strong( | |
id="tv_time", | |
style={ | |
"color": "green", | |
"fontSize": 20, | |
"paddingLeft": "8%", | |
}, | |
), | |
html.H5( | |
"of 32-inch", | |
style={"paddingLeft": "5%"}, | |
), | |
html.H5( | |
"LCD TV", | |
style={"paddingLeft": "10%"}, | |
), | |
html.H5( | |
"watched", | |
style={"paddingLeft": "6.4%"}, | |
), | |
] | |
), | |
], | |
style={"float": "right", "width": "25%"}, | |
), | |
], | |
style={"paddingLeft": "20%", "paddingRight": "15%"}, | |
), | |
], | |
style={"display": "inline-block"}, | |
), | |
] | |
) | |
def get_cloud_emissions_comparison(): | |
return html.Div( | |
dbc.Col( | |
[ | |
html.Br(), | |
html.Br(), | |
html.H2( | |
[ | |
"Emissions Across ", | |
html.Strong( | |
id="cloud_provider_name", | |
style={"fontWeight": "normal", "color": "green"}, | |
), | |
" Regions", | |
], | |
style={"textAlign": "center", "marginLeft": "12%"}, | |
), | |
dcc.Graph(id="cloud_emissions_barchart"), | |
html.Br(), | |
html.Div( | |
id="cloud_recommendation", | |
style={"marginLeft": "12%", "textAlign": "center"}, | |
), | |
], | |
id="cloud_emissions_comparison_component", | |
), | |
style={"marginLeft": "-12%"}, | |
) | |
def get_cloud_emissions_barchart_figure( | |
self, cloud_emissions_barchart_data: pd.DataFrame | |
): | |
return ( | |
px.bar( | |
cloud_emissions_barchart_data, | |
x="region", | |
y="emissions", | |
hover_data=["region", "country_name", "emissions"], | |
color="emissions", | |
labels={ | |
"emissions": "Carbon Equivalent (KgCO2)", | |
"region": "Region", | |
"country_name": "Country", | |
}, | |
color_continuous_scale=self.colorscale, | |
height=500, | |
width=1400, | |
) | |
.update_xaxes(tickangle=45) | |
.update_layout(plot_bgcolor="rgb(255,255,255)") | |
) | |
def get_cloud_recommendation( | |
self, | |
on_cloud: str, | |
cloud_provider_name: str, | |
cloud_emissions_barchart_data: pd.DataFrame, | |
): | |
if on_cloud == "N": | |
return html.H4() | |
cloud_emissions_project_region = cloud_emissions_barchart_data.iloc[0, :] | |
cloud_emissions_minimum_region = cloud_emissions_barchart_data.iloc[1, :] | |
if ( | |
cloud_emissions_minimum_region.emissions | |
> cloud_emissions_project_region.emissions | |
): | |
return html.H4( | |
[ | |
f"Already running on {cloud_provider_name}'s least emissions region ", | |
html.Strong( | |
f"{cloud_emissions_project_region.region}", | |
style={"fontWeight": "normal", "color": "green"}, | |
), | |
] | |
) | |
return ( | |
html.H4( | |
[ | |
"Had this been run in ", | |
html.Strong( | |
f"{cloud_emissions_minimum_region.region}", | |
style={"fontWeight": "normal", "color": "green"}, | |
), | |
" region, ", | |
] | |
), | |
html.H4( | |
[ | |
"then the emitted carbon would have been ", | |
html.Strong( | |
f"{'{:.1f}'.format(cloud_emissions_minimum_region.emissions)} kg", | |
style={"fontWeight": "normal", "color": "green"}, | |
), | |
] | |
), | |
html.H4( | |
[ | |
"Reducing the current emissions by ", | |
html.Strong( | |
f"{'{:.1f}'.format(cloud_emissions_project_region.emissions - cloud_emissions_minimum_region.emissions)} kg", | |
style={"fontWeight": "normal", "color": "green"}, | |
), | |
] | |
), | |
) | |
def get_emissions_tab(): | |
return dcc.Tab( | |
label="Emissions Equivalent", | |
value="emissions_tab", | |
id="global_emissions", | |
children=[ | |
html.Div( | |
dbc.Col( | |
dcc.Graph(id="global_emissions_choropleth"), | |
style={"marginLeft": "-16%"}, | |
) | |
) | |
], | |
) | |
def get_energy_mix_tab(): | |
return dcc.Tab( | |
label="Energy Mix", | |
value="energy_mix_tab", | |
id="global_energy_mix", | |
children=[ | |
html.Div( | |
dbc.Col( | |
[ | |
html.Br(), | |
html.H4("Select Energy Source"), | |
dcc.Dropdown( | |
id="energy_type", | |
options=[ | |
{"label": "Fossil", "value": "fossil"}, | |
{ | |
"label": "Hydroelectricity", | |
"value": "hydroelectricity", | |
}, | |
{"label": "Nuclear", "value": "nuclear"}, | |
{"label": "Solar", "value": "solar"}, | |
{"label": "Wind", "value": "wind"}, | |
], | |
value="fossil", | |
), | |
dcc.Graph( | |
id="global_energy_mix_choropleth", | |
style={"marginLeft": "-16%"}, | |
), | |
] | |
) | |
) | |
], | |
) | |
def get_global_comparison(self): | |
return html.Div( | |
[ | |
html.Br(), | |
html.Br(), | |
html.H2( | |
"Global Benchmarks", | |
style={ | |
"textAlign": "center", | |
"paddingLeft": "15%", | |
"marginLeft": "-15%", | |
}, | |
), | |
html.Br(), | |
html.Br(), | |
dcc.Tabs( | |
id="global_benchmarks", | |
value="emissions_tab", | |
children=[self.get_emissions_tab(), self.get_energy_mix_tab()], | |
), | |
] | |
) | |
def get_global_emissions_choropleth_figure(self, choropleth_data): | |
return px.choropleth( | |
data_frame=choropleth_data, | |
locations="iso_code", | |
color="emissions", | |
hover_data=[ | |
"country", | |
"emissions", | |
"carbon_intensity", | |
"fossil", | |
"hydroelectricity", | |
"nuclear", | |
"solar", | |
"wind", | |
], | |
labels={ | |
"country": "Country", | |
"emissions": "Carbon Equivalent (KgCO2)", | |
"carbon_intensity": "Carbon Intensity (gCO2/kWh)", | |
"iso_code": "Country Code", | |
"fossil": "Fossil Energy(%)", | |
"hydroelectricity": "Hydroelectricity Energy (%)", | |
"nuclear": "Nuclear Energy (%)", | |
"solar": "Solar Energy (%)", | |
"wind": "Wind Energy (%)", | |
}, | |
width=1400, | |
height=600, | |
color_continuous_scale=self.colorscale, | |
) | |
def get_global_energy_mix_choropleth_figure(self, energy_type, choropleth_data): | |
energy_labels = { | |
"fossil": "Fossil Energy(%)", | |
"hydroelectricity": "Hydroelectricity Energy (%)", | |
"nuclear": "Nuclear Energy (%)", | |
"solar": "Solar Energy (%)", | |
"wind": "Wind Energy (%)", | |
} | |
return px.choropleth( | |
data_frame=choropleth_data, | |
locations="iso_code", | |
color=energy_type, | |
hover_data=["country", "emissions", energy_type], | |
labels={ | |
"country": "Country", | |
"emissions": "Carbon Equivalent (KgCO2)", | |
"iso_code": "Country Code", | |
energy_type: energy_labels[energy_type], | |
}, | |
width=1400, | |
height=600, | |
color_continuous_scale=( | |
list(reversed(self.colorscale)) | |
if energy_type == "low_carbon" | |
else self.colorscale | |
), | |
) | |
def get_regional_emissions_comparison(): | |
return html.Div( | |
dbc.Col( | |
[ | |
html.Br(), | |
html.Br(), | |
html.H2( | |
[ | |
"Emissions Across Regions in ", | |
html.Strong( | |
id="country_name", | |
style={"fontWeight": "normal", "color": "green"}, | |
), | |
], | |
style={"textAlign": "center", "marginLeft": "12%"}, | |
), | |
dcc.Graph(id="regional_emissions_comparison_choropleth"), | |
], | |
id="regional_emissions_comparison_component", | |
), | |
style={"marginLeft": "-12%"}, | |
) | |
def get_regional_emissions_choropleth_figure( | |
self, choropleth_data, country_iso_code: str | |
): | |
# add location_modes and scopes for other country codes | |
location_modes = {"usa": "USA-states", "can": "geojson-id"} | |
scopes = {"usa": "usa", "can": "north america"} | |
locations = {"usa": "region_code", "can": "cartodb_id"} | |
# formatting required for geojson data (not required for USA regional map) | |
if country_iso_code.lower() == "can": | |
with open("codecarbon/data/canada_provinces.geojson", "r") as geo: | |
mp = json.load(geo) | |
for choropleth in choropleth_data: | |
region_name = choropleth["region_code"] | |
choropleth["cartodb_id"] = [ | |
m["properties"]["cartodb_id"] | |
for m in mp["features"] | |
if m["properties"]["name"].lower() == region_name | |
][0] | |
else: | |
mp = None | |
# Get parameters, default to a blank world map if not in keys | |
location_mode = location_modes.get(country_iso_code.lower(), None) | |
scope = scopes.get(country_iso_code.lower(), "world") | |
location = locations.get(country_iso_code.lower(), None) | |
fig = px.choropleth( | |
data_frame=choropleth_data, | |
locations=location, | |
geojson=mp, | |
featureidkey="properties.cartodb_id", | |
locationmode=location_mode, | |
scope=scope, | |
color="emissions", | |
hover_data=["region_name", "emissions", "region_code"], | |
labels={ | |
"region_name": "Region", | |
"emissions": "Carbon Equivalent (KgCO2)", | |
"region_code": "Region Code", | |
}, | |
width=1400, | |
height=600, | |
color_continuous_scale=self.colorscale, | |
) | |
if country_iso_code.lower() != "usa": | |
fig.update_geos(fitbounds="locations", visible=True) | |
return fig | |
def get_project_time_series(): | |
return html.Div( | |
dbc.Col( | |
[ | |
html.Br(), | |
html.Br(), | |
html.H2("Emissions Timeline", style={"textAlign": "center"}), | |
dcc.Graph(id="project_time_series"), | |
] | |
), | |
style={"paddingLeft": "3%"}, | |
) | |
def get_project_emissions_bar_chart(): | |
return html.Div( | |
dbc.Col( | |
[ | |
html.Br(), | |
html.Br(), | |
html.H2("Emissions Detail", style={"textAlign": "center"}), | |
dcc.Graph(id="project_emissions_bar_chart"), | |
] | |
), | |
style={"paddingLeft": "3%"}, | |
) | |
def get_project_time_series_figure(project_data: dt.DataTable): | |
return ( | |
px.line( | |
project_data, | |
x="timestamp", | |
y="emissions", | |
hover_data=["emissions"], | |
labels={ | |
"emissions": "Carbon Equivalent (KgCO2eq)", | |
"timestamp": "Timestamp", | |
}, | |
) | |
.update_traces(line_color="green") | |
.update_layout(plot_bgcolor="rgb(255,255,255)") | |
) | |
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 = project_data.replace(np.nan, "", regex=True) | |
hover_data = {c: True for c in project_data.columns} | |
bar = ( | |
px.bar( | |
project_data, | |
y="emissions", | |
hover_data=hover_data, | |
labels={ | |
"emissions": "Carbon Equivalent (KgCO2eq)", | |
"energy_consumed": "Energy Consumed (kWh)", | |
"timestamp": "Timestamp", | |
"project_name": "Project Name", | |
"duration": "Duration", | |
"emissions_detail": "Emissions Detail", | |
"country_name": "Country Name", | |
"country_iso_code": "Country ISO Code", | |
"region": "Region", | |
"cloud_provider": "Cloud Provider", | |
"cloud_region": "Cloud Region", | |
}, | |
) | |
.update_traces(marker_color="green") | |
.update_layout(plot_bgcolor="rgb(255,255,255)") | |
) | |
return bar | |
def get_hidden_project_data(): | |
return html.Div(id="hidden_project_data", style={"display": "none"}) | |
def get_hidden_project_summary(): | |
return html.Div( | |
dcc.Store(id="hidden_project_summary"), style={"display": "none"} | |
) | |
def get_references(): | |
return html.Div( | |
[ | |
html.Br(), | |
html.Br(), | |
html.H2("References "), | |
html.Ul( | |
[ | |
html.Li( | |
html.A( | |
"Energy Usage Reports: Environmental awareness as part of algorithmic accountability", | |
href="https://arxiv.org/pdf/1911.08354.pdf", | |
) | |
), | |
html.Li( | |
html.A( | |
"Quantifying the Carbon Emissions of Machine Learning", | |
href="https://arxiv.org/pdf/1910.09700.pdf", | |
) | |
), | |
] | |
), | |
html.Br(), | |
html.Br(), | |
] | |
) | |