Spaces:
Running
Running
| import streamlit as st | |
| import polars as pl | |
| from datetime import datetime, timedelta | |
| from utils.weather_api import fetch_weather | |
| import matplotlib.pyplot as plt | |
| def main(): | |
| st.title("Compare Multiple Weather Variables Across BYU Locations 🌤️") | |
| locations = { | |
| "BYU Idaho": {"lat": 43.8145, "lon": -111.7833}, | |
| "BYU Hawaii": {"lat": 21.6419, "lon": -157.9267}, | |
| "BYU Provo": {"lat": 40.25, "lon": -111.65} | |
| } | |
| weather_variables = { | |
| "Temperature (°F)": "temperature_2m", | |
| "Wind Speed (mph)": "windspeed_10m", | |
| "Relative Humidity (%)": "relative_humidity_2m" | |
| } | |
| def fetch_all_variables(location, start_date, end_date, timezone_selection): | |
| dataframes = {} | |
| for label, variable in weather_variables.items(): | |
| try: | |
| df = fetch_weather(location, start_date, end_date, variable, timezone_selection) | |
| df = df.rename({variable: label}) | |
| dataframes[label] = df | |
| except Exception as e: | |
| st.error(f"Error fetching {label} data: {e}") | |
| return dataframes | |
| st.sidebar.header("User Input") | |
| start_date = st.sidebar.date_input("Start Date", datetime.now() - timedelta(days=15)) | |
| end_date = st.sidebar.date_input("End Date", datetime.now()) | |
| timezone_selection = st.sidebar.radio("Select Time Zone", ["America/Denver", "Pacific/Honolulu"]) | |
| if start_date and end_date: | |
| st.write("Fetching all weather variables for each BYU location...") | |
| all_data = {} | |
| for city, coords in locations.items(): | |
| st.write(f"Fetching data for **{city}**...") | |
| all_data[city] = fetch_all_variables(coords, start_date, end_date, timezone_selection) | |
| st.subheader("Combined Weather Data Across Cities and Variables") | |
| for city, dataframes in all_data.items(): | |
| st.write(f"**{city}**") | |
| datetime_df = dataframes[list(dataframes.keys())[0]].select("datetime") | |
| data_without_datetime = [df.drop("datetime") for df in dataframes.values()] | |
| combined_df = pl.concat([datetime_df] + data_without_datetime, how="horizontal") | |
| st.dataframe(combined_df) | |
| st.subheader(f"Visualizing Weather Variables for {city}") | |
| plt.figure(figsize=(10, 6)) | |
| for label in dataframes: | |
| plt.plot(combined_df["datetime"], combined_df[label], label=label) | |
| plt.xlabel("Datetime") | |
| plt.ylabel("Values") | |
| plt.title(f"Weather Variables for {city}") | |
| plt.legend() | |
| st.pyplot(plt) | |
| st.subheader("Boxplot of Weather Variables Across All Cities") | |
| plt.figure(figsize=(12, 8)) | |
| for i, city in enumerate(all_data.keys(), start=1): | |
| city_data = all_data[city] | |
| data_without_datetime = [df.drop("datetime") for df in city_data.values()] | |
| combined_city_df = pl.concat(data_without_datetime, how="horizontal").to_pandas() | |
| plt.boxplot(combined_city_df.values, | |
| labels=combined_city_df.columns, | |
| positions=[i + idx * 0.3 for idx in range(len(weather_variables))], | |
| widths=0.25) | |
| plt.title("Weather Variable Comparison") | |
| plt.ylabel("Values") | |
| plt.xticks(range(1, len(all_data.keys()) + 1), all_data.keys()) | |
| plt.grid(True) | |
| st.pyplot(plt) | |
| if __name__ == "__main__": | |
| main() | |