File size: 2,893 Bytes
9fc6b05
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import streamlit as st
import polars as pl
from datetime import datetime, timedelta
from utils.weather_api import fetch_weather 

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_multiple_cities(start_date, end_date, variable, timezone_selection):
    city_data = {}
    for city, coords in locations.items():
        df = fetch_weather(coords, start_date, end_date, variable, timezone_selection)
        city_data[city] = df.rename({variable: city})
    combined_df = city_data[list(city_data.keys())[0]].select("datetime")
    for city, data in city_data.items():
        combined_df = pl.concat([combined_df, data.select(city)], how="horizontal")
    return combined_df

def calculate_summary_metrics(df):
    avg_values = df.select([pl.mean(city).alias(city) for city in df.columns if city != "datetime"])
    max_values = df.select([pl.max(city).alias(city) for city in df.columns if city != "datetime"])
    min_values = df.select([pl.min(city).alias(city) for city in df.columns if city != "datetime"])

    avg_summary = avg_values.row(0)
    max_summary = max_values.row(0)
    min_summary = min_values.row(0)
    return avg_summary, max_summary, min_summary

def main():
    st.title("Compare Weather Metrics Across BYU Locations 📊")
    
    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())
    selected_variable_label = st.sidebar.selectbox("Select Weather Variable", weather_variables.keys())
    timezone_selection = st.sidebar.radio("Select Time Zone", ["America/Denver", "Pacific/Honolulu"])
    selected_variable = weather_variables[selected_variable_label]
    
    if start_date and end_date:
        with st.spinner("Fetching weather data across all BYU locations..."):
            combined_data = fetch_multiple_cities(start_date, end_date, selected_variable, timezone_selection)
                
        st.write(f"### {selected_variable_label} Data Across Locations")
        st.dataframe(combined_data)
        
        avg_summary, max_summary, min_summary = calculate_summary_metrics(combined_data)

        st.subheader("Key Performance Indicators (KPIs)")
        kpi_cols = st.columns(len(locations))
        for idx, city in enumerate(locations):
            with kpi_cols[idx]:
                st.metric(f"{city} - Avg", f"{avg_summary[idx]:.2f}")
                st.metric(f"{city} - Max", f"{max_summary[idx]:.2f}")
                st.metric(f"{city} - Min", f"{min_summary[idx]:.2f}")

if __name__ == "__main__":
    main()