Update app.py
Browse files
app.py
CHANGED
|
@@ -6,16 +6,16 @@ import plotly.graph_objects as go
|
|
| 6 |
import gradio as gr
|
| 7 |
from datetime import datetime
|
| 8 |
|
| 9 |
-
# Constants
|
| 10 |
NASA_DATA_URL = "https://data.giss.nasa.gov/gistemp/tabledata_v4/GLB.Ts+dSST.csv"
|
| 11 |
CURRENT_YEAR = datetime.now().year
|
| 12 |
MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
|
| 13 |
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
|
| 14 |
|
| 15 |
def load_and_process_data():
|
| 16 |
-
"""Load and process NASA temperature data
|
| 17 |
try:
|
| 18 |
-
# Read NASA data
|
| 19 |
df = pd.read_csv(
|
| 20 |
NASA_DATA_URL,
|
| 21 |
skiprows=1,
|
|
@@ -23,18 +23,12 @@ def load_and_process_data():
|
|
| 23 |
engine='python'
|
| 24 |
)
|
| 25 |
|
| 26 |
-
# Clean and reshape data
|
| 27 |
df = df[df['Year'] >= 1880]
|
| 28 |
-
|
| 29 |
-
# Select only year and month columns (new format uses month names)
|
| 30 |
df = df[['Year'] + MONTHS]
|
| 31 |
|
| 32 |
-
# Melt to long format
|
| 33 |
-
df = df.melt(
|
| 34 |
-
id_vars='Year',
|
| 35 |
-
var_name='Month',
|
| 36 |
-
value_name='Anomaly'
|
| 37 |
-
)
|
| 38 |
|
| 39 |
# Convert month names to numeric values
|
| 40 |
month_map = {name: f"{i:02d}" for i, name in enumerate(MONTHS, 1)}
|
|
@@ -43,11 +37,12 @@ def load_and_process_data():
|
|
| 43 |
# Create date column
|
| 44 |
df['Date'] = pd.to_datetime(
|
| 45 |
df['Year'].astype(str) + '-' + df['Month_Num'],
|
| 46 |
-
format='%Y-%m'
|
|
|
|
| 47 |
)
|
| 48 |
|
| 49 |
# Clean and process anomalies
|
| 50 |
-
df = df.dropna(subset=['Anomaly'])
|
| 51 |
df['Anomaly'] = df['Anomaly'].astype(float)
|
| 52 |
df['Decade'] = (df['Year'] // 10) * 10
|
| 53 |
|
|
@@ -62,7 +57,7 @@ def load_and_process_data():
|
|
| 62 |
print(f"Data loading error: {e}")
|
| 63 |
return pd.DataFrame()
|
| 64 |
|
| 65 |
-
#
|
| 66 |
|
| 67 |
def create_dashboard():
|
| 68 |
"""Create Gradio dashboard with fixed components"""
|
|
@@ -70,74 +65,80 @@ def create_dashboard():
|
|
| 70 |
|
| 71 |
with gr.Blocks(title="NASA Climate Viz", theme=gr.themes.Soft()) as demo:
|
| 72 |
gr.Markdown("# 🌍 Earth's Surface Temperature Analysis")
|
|
|
|
| 73 |
|
| 74 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 75 |
|
| 76 |
with gr.Tab("Time Series Analysis"):
|
| 77 |
gr.Markdown("## Global Temperature Anomalies Over Time")
|
| 78 |
with gr.Row():
|
| 79 |
-
show_uncertainty = gr.Checkbox(label="Show Uncertainty Bands")
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
label="Year Range",
|
| 86 |
-
step=1,
|
| 87 |
-
interactive=True,
|
| 88 |
-
range=True # This creates dual-handle range slider
|
| 89 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 90 |
time_series = gr.Plot()
|
| 91 |
|
| 92 |
with gr.Tab("Decadal Heatmap"):
|
| 93 |
gr.Markdown("## Monthly Anomalies by Decade")
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
|
| 99 |
-
|
| 100 |
-
|
| 101 |
-
|
| 102 |
-
|
| 103 |
-
)
|
| 104 |
heatmap = gr.Plot()
|
| 105 |
|
| 106 |
# ... [other tabs remain unchanged] ...
|
| 107 |
|
| 108 |
-
#
|
| 109 |
-
|
| 110 |
-
|
| 111 |
-
|
| 112 |
-
|
| 113 |
-
|
| 114 |
-
|
| 115 |
-
|
| 116 |
-
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
outputs=time_series
|
| 125 |
-
)
|
| 126 |
|
| 127 |
-
|
| 128 |
-
|
| 129 |
-
|
| 130 |
-
|
| 131 |
-
|
|
|
|
|
|
|
| 132 |
|
| 133 |
# Initial renders
|
| 134 |
demo.load(
|
| 135 |
-
fn=lambda:
|
| 136 |
outputs=time_series
|
| 137 |
)
|
| 138 |
|
| 139 |
demo.load(
|
| 140 |
-
fn=lambda:
|
| 141 |
outputs=heatmap
|
| 142 |
)
|
| 143 |
|
|
|
|
| 6 |
import gradio as gr
|
| 7 |
from datetime import datetime
|
| 8 |
|
| 9 |
+
# Constants
|
| 10 |
NASA_DATA_URL = "https://data.giss.nasa.gov/gistemp/tabledata_v4/GLB.Ts+dSST.csv"
|
| 11 |
CURRENT_YEAR = datetime.now().year
|
| 12 |
MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
|
| 13 |
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
|
| 14 |
|
| 15 |
def load_and_process_data():
|
| 16 |
+
"""Load and process NASA temperature data"""
|
| 17 |
try:
|
| 18 |
+
# Read NASA data
|
| 19 |
df = pd.read_csv(
|
| 20 |
NASA_DATA_URL,
|
| 21 |
skiprows=1,
|
|
|
|
| 23 |
engine='python'
|
| 24 |
)
|
| 25 |
|
| 26 |
+
# Clean and reshape data
|
| 27 |
df = df[df['Year'] >= 1880]
|
|
|
|
|
|
|
| 28 |
df = df[['Year'] + MONTHS]
|
| 29 |
|
| 30 |
+
# Melt to long format
|
| 31 |
+
df = df.melt(id_vars='Year', var_name='Month', value_name='Anomaly')
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
|
| 33 |
# Convert month names to numeric values
|
| 34 |
month_map = {name: f"{i:02d}" for i, name in enumerate(MONTHS, 1)}
|
|
|
|
| 37 |
# Create date column
|
| 38 |
df['Date'] = pd.to_datetime(
|
| 39 |
df['Year'].astype(str) + '-' + df['Month_Num'],
|
| 40 |
+
format='%Y-%m',
|
| 41 |
+
errors='coerce'
|
| 42 |
)
|
| 43 |
|
| 44 |
# Clean and process anomalies
|
| 45 |
+
df = df.dropna(subset=['Anomaly', 'Date'])
|
| 46 |
df['Anomaly'] = df['Anomaly'].astype(float)
|
| 47 |
df['Decade'] = (df['Year'] // 10) * 10
|
| 48 |
|
|
|
|
| 57 |
print(f"Data loading error: {e}")
|
| 58 |
return pd.DataFrame()
|
| 59 |
|
| 60 |
+
# Visualization functions remain the same as before
|
| 61 |
|
| 62 |
def create_dashboard():
|
| 63 |
"""Create Gradio dashboard with fixed components"""
|
|
|
|
| 65 |
|
| 66 |
with gr.Blocks(title="NASA Climate Viz", theme=gr.themes.Soft()) as demo:
|
| 67 |
gr.Markdown("# 🌍 Earth's Surface Temperature Analysis")
|
| 68 |
+
gr.Markdown("### Visualization of NASA's Global Temperature Data")
|
| 69 |
|
| 70 |
+
with gr.Row():
|
| 71 |
+
gr.Markdown(f"""
|
| 72 |
+
**Data Source**: [NASA Goddard Institute for Space Studies](https://data.giss.nasa.gov/gistemp/)
|
| 73 |
+
**Last Update**: {CURRENT_YEAR}
|
| 74 |
+
**Base Period**: 1951-1980
|
| 75 |
+
""")
|
| 76 |
|
| 77 |
with gr.Tab("Time Series Analysis"):
|
| 78 |
gr.Markdown("## Global Temperature Anomalies Over Time")
|
| 79 |
with gr.Row():
|
| 80 |
+
show_uncertainty = gr.Checkbox(label="Show Uncertainty Bands", value=False)
|
| 81 |
+
|
| 82 |
+
with gr.Row():
|
| 83 |
+
min_year = gr.Slider(
|
| 84 |
+
1880, CURRENT_YEAR, value=1950,
|
| 85 |
+
label="Start Year", step=1
|
|
|
|
|
|
|
|
|
|
|
|
|
| 86 |
)
|
| 87 |
+
max_year = gr.Slider(
|
| 88 |
+
1880, CURRENT_YEAR, value=CURRENT_YEAR,
|
| 89 |
+
label="End Year", step=1
|
| 90 |
+
)
|
| 91 |
+
|
| 92 |
time_series = gr.Plot()
|
| 93 |
|
| 94 |
with gr.Tab("Decadal Heatmap"):
|
| 95 |
gr.Markdown("## Monthly Anomalies by Decade")
|
| 96 |
+
with gr.Row():
|
| 97 |
+
min_decade = gr.Slider(
|
| 98 |
+
1880, CURRENT_YEAR, value=1950,
|
| 99 |
+
label="Start Decade", step=10
|
| 100 |
+
)
|
| 101 |
+
max_decade = gr.Slider(
|
| 102 |
+
1880, CURRENT_YEAR, value=CURRENT_YEAR,
|
| 103 |
+
label="End Decade", step=10
|
| 104 |
+
)
|
|
|
|
| 105 |
heatmap = gr.Plot()
|
| 106 |
|
| 107 |
# ... [other tabs remain unchanged] ...
|
| 108 |
|
| 109 |
+
# Helper functions for updates
|
| 110 |
+
def update_time_series(show_unc, min_yr, max_yr):
|
| 111 |
+
filtered = df[(df['Year'] >= min_yr) & (df['Year'] <= max_yr)]
|
| 112 |
+
return create_time_series_plot(filtered, show_unc)
|
| 113 |
+
|
| 114 |
+
def update_heatmap(min_dec, max_dec):
|
| 115 |
+
return create_heatmap(df, (min_dec, max_dec))
|
| 116 |
+
|
| 117 |
+
# Event handling
|
| 118 |
+
inputs = [show_uncertainty, min_year, max_year]
|
| 119 |
+
for component in inputs:
|
| 120 |
+
component.change(
|
| 121 |
+
update_time_series,
|
| 122 |
+
inputs=inputs,
|
| 123 |
+
outputs=time_series
|
| 124 |
+
)
|
|
|
|
|
|
|
| 125 |
|
| 126 |
+
decade_inputs = [min_decade, max_decade]
|
| 127 |
+
for component in decade_inputs:
|
| 128 |
+
component.change(
|
| 129 |
+
update_heatmap,
|
| 130 |
+
inputs=decade_inputs,
|
| 131 |
+
outputs=heatmap
|
| 132 |
+
)
|
| 133 |
|
| 134 |
# Initial renders
|
| 135 |
demo.load(
|
| 136 |
+
fn=lambda: update_time_series(False, 1950, CURRENT_YEAR),
|
| 137 |
outputs=time_series
|
| 138 |
)
|
| 139 |
|
| 140 |
demo.load(
|
| 141 |
+
fn=lambda: update_heatmap(1950, CURRENT_YEAR),
|
| 142 |
outputs=heatmap
|
| 143 |
)
|
| 144 |
|