nakas's picture
Update app.py
5bed1bd verified
raw
history blame
3.89 kB
import gradio as gr
import pandas as pd
import numpy as np
from datetime import datetime
def parse_wind(wind_str):
if pd.isna(wind_str):
return np.nan, np.nan
try:
if 'G' in str(wind_str):
speed, gust = str(wind_str).split('G')
return float(speed), float(gust)
return float(wind_str), np.nan
except:
return np.nan, np.nan
def process_weather_data(data_str):
# Split the data into lines and remove empty lines
lines = [line.strip() for line in data_str.split('\n') if line.strip()]
# Find the start of actual data (after headers)
start_idx = 0
for i, line in enumerate(lines):
if 'Date/Time' in line:
start_idx = i + 1
break
# Process the data lines
data = []
for line in lines[start_idx:]:
parts = line.split('\t')
if len(parts) >= 8:
try:
date_str = parts[0].strip()
temp = float(parts[1]) if parts[1].strip() else np.nan
dew_point = float(parts[2]) if parts[2].strip() else np.nan
humidity = float(parts[3]) if parts[3].strip() else np.nan
wind_chill = float(parts[4]) if parts[4].strip() else np.nan
wind_speed, wind_gust = parse_wind(parts[6])
snow_depth = float(parts[7]) if parts[7].strip() else np.nan
data.append({
'datetime': pd.to_datetime(date_str),
'temperature': temp,
'dew_point': dew_point,
'humidity': humidity,
'wind_chill': wind_chill,
'wind_speed': wind_speed,
'wind_gust': wind_gust,
'snow_depth': snow_depth
})
except:
continue
df = pd.DataFrame(data)
# Calculate statistics
stats = {
'Temperature Range': f"{df['temperature'].min():.1f}°F to {df['temperature'].max():.1f}°F",
'Average Temperature': f"{df['temperature'].mean():.1f}°F",
'Max Wind Speed': f"{df['wind_speed'].max():.1f} mph",
'Max Wind Gust': f"{df['wind_gust'].max():.1f} mph",
'Average Humidity': f"{df['humidity'].mean():.1f}%",
'Max Snow Depth': f"{df['snow_depth'].max():.1f} inches"
}
# Create plots
temp_fig = gr.Plot()
df.plot(x='datetime', y=['temperature', 'wind_chill'],
title='Temperature and Wind Chill Over Time',
figsize=(12, 6))
temp_fig.pyplot()
wind_fig = gr.Plot()
df.plot(x='datetime', y=['wind_speed', 'wind_gust'],
title='Wind Speed and Gusts Over Time',
figsize=(12, 6))
wind_fig.pyplot()
stats_html = "<div style='font-size: 16px; line-height: 1.5;'>"
for key, value in stats.items():
stats_html += f"<p><strong>{key}:</strong> {value}</p>"
stats_html += "</div>"
return stats_html, temp_fig, wind_fig
# Create the Gradio interface
with gr.Blocks(title="Weather Data Analysis") as demo:
gr.Markdown("# Weather Data Analysis")
gr.Markdown("Paste weather data from weather.gov/wrh/timeseries in the format shown below:")
with gr.Row():
input_text = gr.Textbox(
label="Weather Data",
placeholder="Paste weather data here...",
lines=10
)
analyze_btn = gr.Button("Analyze Weather Data")
with gr.Row():
stats_output = gr.HTML(label="Statistics")
with gr.Row():
temp_plot = gr.Plot(label="Temperature Plot")
wind_plot = gr.Plot(label="Wind Plot")
analyze_btn.click(
fn=process_weather_data,
inputs=[input_text],
outputs=[stats_output, temp_plot, wind_plot]
)
if __name__ == "__main__":
demo.launch()