import streamlit as st import pandas as pd import altair as alt import json import os from datetime import datetime # ------------------------------- # App Config and Title # ------------------------------- st.set_page_config(page_title="Climate Clock Observatory", layout="wide") st.title("🌍 Real-Time Climate Clock Observatory") # ------------------------------- # Show Last Updated Timestamp # ------------------------------- try: file_stats = os.stat("climate_data.json") last_updated = datetime.fromtimestamp(file_stats.st_mtime).strftime("%Y-%m-%d %H:%M:%S") st.caption(f"🕒 Data last updated: {last_updated}") except: st.caption("🕒 Last updated time not available") # ------------------------------- # Refresh Button # ------------------------------- if st.button("🔁 Refresh Data"): with st.spinner("Refreshing data..."): st.experimental_rerun() # ------------------------------- # Load Climate Data from JSON # ------------------------------- try: with open("climate_data.json", "r") as f: clock = json.load(f) except Exception as e: st.error("❌ Failed to load climate data.") st.stop() # ------------------------------- # 1️⃣ CO₂ Budget Depletion Projection # ------------------------------- st.header("1️⃣ CO₂ Budget Depletion Projection") co2_data = clock.get("co2", {}) co2_remaining = float(co2_data.get("remaining", 0)) co2_rate = float(co2_data.get("rate", 0)) years = list(range(datetime.now().year, datetime.now().year + 10)) remaining_budget = [max(co2_remaining - i * co2_rate, 0) for i in range(10)] co2_df = pd.DataFrame({"Year": years, "Remaining CO₂ Budget (Gt)": remaining_budget}) co2_chart = alt.Chart(co2_df).mark_line(point=True).encode( x='Year:O', y='Remaining CO₂ Budget (Gt):Q', tooltip=['Year', 'Remaining CO₂ Budget (Gt)'] ).properties(width=700) st.altair_chart(co2_chart, use_container_width=True) # ------------------------------- # 2️⃣ Global Energy Mix Donut Chart # ------------------------------- st.header("2️⃣ Global Energy Mix – Renewables vs Others") renew_data = clock.get("renewables", {}) renew_percent = float(renew_data.get("percentage", 0)) energy_df = pd.DataFrame({ "Type": ["Renewables", "Other"], "Percentage": [renew_percent, 100 - renew_percent] }) energy_chart = alt.Chart(energy_df).mark_arc(innerRadius=50).encode( theta="Percentage:Q", color="Type:N", tooltip=["Type", "Percentage"] ).properties(width=400, height=400) st.altair_chart(energy_chart, use_container_width=True) # ------------------------------- # 3️⃣ Lifeline Metrics Bar Chart # ------------------------------- st.header("3️⃣ Lifeline Metrics – Positive Contributions") lifelines = clock.get("lifelines", []) lifeline_df = pd.DataFrame([ {"Label": item.get("label", ""), "Value": float(item.get("value", 0))} for item in lifelines ]) lifeline_chart = alt.Chart(lifeline_df).mark_bar().encode( x=alt.X("Label:N", sort="-y"), y="Value:Q", tooltip=["Label", "Value"] ).properties(width=700) st.altair_chart(lifeline_chart, use_container_width=True) # ------------------------------- # 4️⃣ Time Left to 1.5°C Threshold # ------------------------------- st.header("4️⃣ Time Left to 1.5°C Threshold") deadline = clock.get("deadline", {}) time_parts = deadline.get("time_left", "0:0:0:0:0").split(":") try: years, months, days = int(time_parts[0]), int(time_parts[1]), int(time_parts[2]) st.success(f"⏳ Estimated time before 1.5°C threshold: {years} years, {months} months, {days} days") except: st.warning("⚠️ Could not parse climate deadline.") # ------------------------------- # 5️⃣ CO₂ Budget Simulator with Slider # ------------------------------- st.header("5️⃣ CO₂ Budget Simulator – What If We Reduce Emissions?") st.markdown("📉 Use the slider below to simulate reduced annual emissions and visualize its impact.") new_rate = st.slider( "New Annual CO₂ Emission Rate (Gt/year)", min_value=10.0, max_value=45.0, value=co2_rate, step=0.5 ) sim_years = [] sim_budget = [] current_budget = co2_remaining year = datetime.now().year while current_budget > 0 and len(sim_years) < 20: sim_years.append(year) sim_budget.append(current_budget) current_budget -= new_rate year += 1 sim_df = pd.DataFrame({ "Year": sim_years, "Projected CO₂ Budget (Gt)": sim_budget }) sim_chart = alt.Chart(sim_df).mark_line(point=True).encode( x="Year:O", y="Projected CO₂ Budget (Gt):Q", tooltip=["Year", "Projected CO₂ Budget (Gt)"] ).properties(width=700) st.altair_chart(sim_chart, use_container_width=True) # ------------------------------- # Footer # ------------------------------- st.markdown("---") st.caption("Made by Sanidhya and Group Members | Data from Climate Clock API (cached sample)")