Spaces:
Sleeping
Sleeping
| 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)") | |