File size: 11,011 Bytes
03065c3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
import streamlit as st
import pandas as pd
import plotly.express as px

# Path to the data file relative to the app.py file
DATA_PATH = "data.csv"
INSTRUCTIONS_PATH = "instructions.md"

GITHUB_LINK = "https://github.com/danielrosehill/Emissions-Monetisation-Calculator"


def load_data():
    try:
        df = pd.read_csv(DATA_PATH)
        return df
    except FileNotFoundError:
        st.error(
            f"Error: Could not find the data file at {DATA_PATH}. Please ensure the file exists."
        )
        return None


def load_instructions():
    try:
        with open(INSTRUCTIONS_PATH, "r") as f:
            return f.read()
    except FileNotFoundError:
        return "Error: Instructions file not found."


def format_currency(value, display_unit):
    if display_unit == "Millions":
        formatted_value = f"${value / 1_000_000:.2f} MN"
    elif display_unit == "Billions":
        formatted_value = f"${value / 1_000_000_000:.2f} BN"
    return formatted_value


def main():
    st.set_page_config(layout="wide")
    st.markdown("""
    <style>
    [data-testid="stHorizontalBlock"] {
        border: 1px solid #e6e6e6;
        border-radius: 5px;
        padding: 1em;
        margin-bottom: 1em;
    }
    </style>
    """, unsafe_allow_html=True)

    st.title("GHG Emissions Monetization Calculator")
    st.markdown(
        "This tool explores the potential financial implications of proposed greenhouse gas emissions costs. It accompanies a repository on Github and Hugging Face that aggregates proposals for the social cost of carbon."
    )
    st.markdown(
        "The social cost of carbon represents the economic damages associated with emitting one additional ton of carbon dioxide into the atmosphere."
    )
    st.markdown(
        "Detailed notes and instructions about the use of this calculator can be found in the Instructions tab."
    )
    st.markdown(
        "This calculator was developed by Daniel Rosehill in December 2024 (danielrosehill.com)."
    )


    # Load the data and instructions
    df = load_data()
    instructions = load_instructions()
    if df is None:
        return  # Don't proceed if data can't be loaded

    # Tabs for calculator, instructions and SCC proposals
    tabs = st.tabs(["Calculator", "Instructions", "SCC Chart", "SCC Details", "Data"])

    with tabs[0]:  # Calculator tab
        with st.container():
            st.markdown("### Input your emissions and proposal of interest")
            left, right = st.columns(2)

            with left:
                st.subheader("Input Values")
                st.markdown("Enter your company's greenhouse gas emissions:")
                scope1_emissions = st.number_input("Scope 1 Emissions", value=0.0)
                st.markdown("*(Direct emissions from owned or controlled sources)*")
                scope2_emissions = st.number_input("Scope 2 Emissions", value=0.0)
                st.markdown("*(Indirect emissions from the generation of purchased energy)*")
                scope3_emissions = st.number_input("Scope 3 Emissions", value=0.0)
                st.markdown("*(All other indirect emissions that occur in a company's value chain)*")
                unit_of_reporting = st.selectbox("Unit of Reporting", ["TCO2E", "MTCO2E"])
                proposal_names = df['proposal_with_date'].tolist()
                selected_proposal = st.selectbox("Social cost of carbon proposal", proposal_names)
                calculate_button = st.button("Calculate Monetized Emissions")
                
            with right:
                st.subheader("Calculated Values")
                if calculate_button:
                # Calculated emissions
                    scope1_2_emissions = scope1_emissions + scope2_emissions
                    all_scopes_emissions = (
                        scope1_emissions + scope2_emissions + scope3_emissions
                    )
                    st.markdown(
                        f"Scope 1 and 2 Emissions: {scope1_2_emissions:.2f} {unit_of_reporting}"
                    )
                    st.markdown(
                        f"All Scopes Emissions: {all_scopes_emissions:.2f} {unit_of_reporting}"
                    )

                # Find the value in USD per ton
                    selected_row = df[df['proposal_with_date'] == selected_proposal].iloc[0]
                    multiplier = selected_row['usd_proposed_value']

                    st.subheader("Monetized Emissions")
                    display_unit = st.radio("Display units", ["Millions", "Billions"])

                    if unit_of_reporting == "MTCO2E":
                        scope1_emissions = scope1_emissions * 1_000_000
                        scope2_emissions = scope2_emissions * 1_000_000
                        scope3_emissions = scope3_emissions * 1_000_000
                        all_scopes_emissions = all_scopes_emissions * 1_000_000

                # Monetization calculations
                    monetized_scope1 = scope1_emissions * multiplier
                    monetized_scope2 = scope2_emissions * multiplier
                    monetized_scope3 = scope3_emissions * multiplier
                    monetized_all_scopes = all_scopes_emissions * multiplier

                    st.markdown(f"Scope 1: {format_currency(monetized_scope1, display_unit)}")
                    st.markdown(f"Scope 2: {format_currency(monetized_scope2, display_unit)}")
                    st.markdown(f"Scope 3: {format_currency(monetized_scope3, display_unit)}")
                    st.markdown(
                        f"All Scopes: {format_currency(monetized_all_scopes, display_unit)}"
                    )

    with tabs[1]:  # Instructions tab
        st.markdown(instructions)

    with tabs[2]:  # SCC Chart tab
        st.subheader("Social Cost of Carbon Proposals")
        
        # Convert the 'date' column to datetime objects for proper sorting
        df['date'] = pd.to_datetime(df['date'])
        # Sort by date
        df = df.sort_values(by='date')

        # Create horizontal bar chart
        bar_fig = px.bar(
            df,
            x="usd_proposed_value",
            y="proposal_with_date",
            title="Social Cost of Carbon Proposals",
            labels={
                "usd_proposed_value": "USD Proposed Value",
                "proposal_with_date": "Proposal",
            },
            orientation='h',  # Set orientation to horizontal
             hover_data={
                "usd_proposed_value": True,
             }
        )
        bar_fig.update_traces(texttemplate='%{x:.2f}', textposition='outside')
        st.plotly_chart(bar_fig)

        # Create line chart with data points and custom hover text
        show_points = st.checkbox("Display Data Points", value = True)
        line_fig = px.line(
            df,
            x="date",
            y="usd_proposed_value",
            title="Trend of Social Cost of Carbon Proposals Over Time",
            labels={
                "usd_proposed_value": "USD Proposed Value",
                "date": "Date",
            },
           hover_data={
                "usd_proposed_value": False,
                "proposal_with_date": True,
            },
            
        )
        
        line_fig.update_traces(
            mode="lines+markers" if show_points else "lines",
            hovertemplate="<b>%{hovertext}</b>",  # Customize hover text
            text=df["proposal_with_date"], # Add the text data
            marker=dict(size=6) # Make the markers smaller
           
        )

        st.plotly_chart(line_fig)


    with tabs[3]:  # SCC Details tab
        st.subheader("Social Cost of Carbon Proposal Details")
        proposal_names = df["proposal_with_date"].tolist()
        selected_proposal = st.selectbox("Select a proposal", proposal_names)

        if selected_proposal:
            selected_row = df[df["proposal_with_date"] == selected_proposal].iloc[0]

            # Prepare data for the table
            col1, col2 = st.columns(2)
            with col1:
                st.markdown(" **Organization Name:**")
                st.markdown(" **Organization Description:**")
                st.markdown(" **Date:**")
                st.markdown(" **Country:**")
                st.markdown(" **ISO3:**")
                st.markdown(" **ISO2:**")
                st.markdown(" **HDI Value:**")
                st.markdown(" **HDI Category:**")
                st.markdown(" **Details:**")
            with col2:
                st.markdown(selected_row["organization_name"])
                st.markdown(selected_row["organization_description"])
                st.markdown(selected_row["date"].strftime('%Y-%m-%d'))
                st.markdown(selected_row["country"])
                st.markdown(selected_row["iso3"])
                st.markdown(selected_row["iso2"])
                st.markdown(str(selected_row["hdi_value"]))
                st.markdown(selected_row["hdi_category"])
                st.markdown(selected_row["details"])

            col3, col4 = st.columns(2)
            with col3:
                 st.markdown(" **Original Proposed Value:**")
                 st.markdown(" **Average Value:**")
                 st.markdown(" **USD Proposed Value:**")
                 st.markdown(" **USD Proposed Value (Empty CO2e):**")
                 st.markdown(" **USD Conversion Date:**")
                 st.markdown(" **Value Units:**")
                 st.markdown(" **Environmental Units:**")
                 st.markdown(" **Methodologies Used:**")
                 st.markdown(" **Calculation Scope:**")
                 st.markdown(" **Is Range:**")
            with col4:
                st.markdown(f"{selected_row['original_proposed_value']} {selected_row['original_currency_name']}")
                st.markdown(str(selected_row["average_value"]))
                st.markdown(str(selected_row["usd_proposed_value"]))
                st.markdown(str(selected_row['use_proposed_value_mtco2e']))
                st.markdown(str(selected_row["usd_conversion_date"]))
                st.markdown(selected_row["value_units"])
                st.markdown(selected_row["environmental_units"])
                st.markdown(selected_row["methodologies_used"])
                st.markdown(selected_row["calculation_scope"])
                st.markdown(str(selected_row["is_range"]))

    with tabs[4]: # Data Tab
        st.subheader("Data")
        st.dataframe(df)
        st.markdown("#### Download Data")
        
        def convert_df(df):
            return df.to_csv().encode('utf-8')
        
        csv = convert_df(df)
        st.download_button(
            label="Download data as CSV",
            data=csv,
            file_name='scc_data.csv',
            mime='text/csv',
        )
    
    st.markdown(f'<a href="{GITHUB_LINK}"><img src="https://img.shields.io/badge/View%20on%20GitHub-blue?logo=github"></a>', unsafe_allow_html=True)

if __name__ == "__main__":
    main()