From b26ac8165a9e76ffecd9634dbdd5f3967ada80cd Mon Sep 17 00:00:00 2001 From: Ross Wait Date: Thu, 11 Jan 2024 20:52:23 -0800 Subject: [PATCH 1/3] Testing git push --- streamlit_app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/streamlit_app.py b/streamlit_app.py index 7a0ed1272052..2335ff9177f6 100644 --- a/streamlit_app.py +++ b/streamlit_app.py @@ -4,7 +4,7 @@ import streamlit as st """ -# Welcome to Streamlit! +# Welcome to Streamlit, Ross! Edit `/streamlit_app.py` to customize this app to your heart's desire :heart:. If you have any questions, checkout our [documentation](https://docs.streamlit.io) and [community From 0390ce06dd7c1282b7f330ccf2756573cbed12a6 Mon Sep 17 00:00:00 2001 From: Ross Wait Date: Fri, 12 Jan 2024 07:45:07 +0000 Subject: [PATCH 2/3] Basic comparative line chart --- .cache.sqlite | Bin 0 -> 86016 bytes requirements.txt | 3 ++ streamlit_app.py | 102 +++++++++++++++++++++++++++++++---------------- 3 files changed, 70 insertions(+), 35 deletions(-) create mode 100644 .cache.sqlite diff --git a/.cache.sqlite b/.cache.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..663bd2762e8f5290a8fb253d679b056b2ecb2183 GIT binary patch literal 86016 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 literal 0 HcmV?d00001 diff --git a/requirements.txt b/requirements.txt index 502d7d1a0d19..86168e91e6de 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,6 @@ altair pandas streamlit +openmeteo_requests +requests_cache +retry_requests \ No newline at end of file diff --git a/streamlit_app.py b/streamlit_app.py index 2335ff9177f6..60b9387d7881 100644 --- a/streamlit_app.py +++ b/streamlit_app.py @@ -2,39 +2,71 @@ import numpy as np import pandas as pd import streamlit as st +import openmeteo_requests +import requests_cache +from datetime import date +from retry_requests import retry -""" -# Welcome to Streamlit, Ross! - -Edit `/streamlit_app.py` to customize this app to your heart's desire :heart:. -If you have any questions, checkout our [documentation](https://docs.streamlit.io) and [community -forums](https://discuss.streamlit.io). - -In the meantime, below is an example of what you can do with just a few lines of code: -""" - -num_points = st.slider("Number of points in spiral", 1, 10000, 1100) -num_turns = st.slider("Number of turns in spiral", 1, 300, 31) - -indices = np.linspace(0, 1, num_points) -theta = 2 * np.pi * num_turns * indices -radius = indices - -x = radius * np.cos(theta) -y = radius * np.sin(theta) - -df = pd.DataFrame({ - "x": x, - "y": y, - "idx": indices, - "rand": np.random.randn(num_points), -}) - -st.altair_chart(alt.Chart(df, height=700, width=700) - .mark_point(filled=True) - .encode( - x=alt.X("x", axis=None), - y=alt.Y("y", axis=None), - color=alt.Color("idx", legend=None, scale=alt.Scale()), - size=alt.Size("rand", legend=None, scale=alt.Scale(range=[1, 150])), - )) +DATE_RANGE = st.date_input("Time range", value=[date(2020, 10, 1), date.today()]) + +def get_season_from_date(datetime): + date = datetime.date() + season = date.year if date.month > 9 else date.year - 1 + return season + +def get_season_start_date_from_season(season): + return date(season, 10, 1) + +def get_day_season_rank(datetime): + date = datetime.date() + delta = date - get_season_start_date_from_season(get_season_from_date(datetime)) + return delta.days + +# Setup the Open-Meteo API client with cache and retry on error +cache_session = requests_cache.CachedSession('.cache', expire_after = -1) +retry_session = retry(cache_session, retries = 5, backoff_factor = 0.2) +openmeteo = openmeteo_requests.Client(session = retry_session) + +# Make sure all required weather variables are listed here +# The order of variables in hourly or daily is important to assign them correctly below +url = "https://archive-api.open-meteo.com/v1/archive" +params = { + "latitude": 37.7749, + "longitude": -122.4194, + "start_date": DATE_RANGE[0], + "end_date": DATE_RANGE[1], + "daily": "precipitation_sum", + "precipitation_unit": "inch", + "timezone": "America/Los_Angeles" +} + +responses = openmeteo.weather_api(url, params=params) + +# Process first location. Add a for-loop for multiple locations or weather models +response = responses[0] + +daily = response.Daily() +daily_precipitation_sum = daily.Variables(0).ValuesAsNumpy() + +daily_data = {"date": pd.date_range( + start = pd.to_datetime(daily.Time(), unit = "s"), + end = pd.to_datetime(daily.TimeEnd(), unit = "s"), + freq = pd.Timedelta(seconds = daily.Interval()), + inclusive = "left" +)} +daily_data["precipitation_sum"] = daily_precipitation_sum + +daily_dataframe = pd.DataFrame(data = daily_data) +daily_dataframe["date"] = daily_dataframe["date"].apply(lambda x: pd.to_datetime(x)) +daily_dataframe["season_date"] = daily_dataframe["date"].apply(get_day_season_rank) +daily_dataframe["season"] = daily_dataframe["date"].apply(lambda x: str(get_season_from_date(x))) +daily_dataframe["Cumulative_Precip"] = daily_dataframe.groupby('season')['precipitation_sum'].cumsum() +st.dataframe(daily_dataframe) + +st.altair_chart(alt.Chart(daily_dataframe, height=700, width=700) + .mark_line().encode( + x='season_date', + y='Cumulative_Precip', + color='season' + ) +) From 62a4514d3bca3e3531903c8028cb32a0c7af1bf7 Mon Sep 17 00:00:00 2001 From: Ross Wait Date: Sun, 14 Jan 2024 22:38:11 +0000 Subject: [PATCH 3/3] Rolling rainfall --- .cache.sqlite | Bin 86016 -> 90112 bytes streamlit_app.py | 33 ++++++++++++++++++++++++++------- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/.cache.sqlite b/.cache.sqlite index 663bd2762e8f5290a8fb253d679b056b2ecb2183..087b961c1d60966a034690129909a204d205d744 100644 GIT binary patch delta 352 zcmZozz}j$tb%Hdj00RSq*hB?;MuCk9OXRtD`93i4U+2%``>>fu;Sryx2(vDuNpgz0 znQ5Y>rKPd4p?Ojg?_^f}|8l(i2N?MO@PFt3#Q&E61^;9Id;B-~ukfGeKgEBP|G;KN zgL(X{EX)jyyv;}LrysRvwC7-A>|x+I#n=OsYhaXJXUxm0d&h$T-Sh^Qslwuu7akI2 z?GR>QXqnFF$!O1`@U_^UfnkEICai(WWrgwWXnlf(Oe$bQAj*XK+ zMTpZ5nY&kxEE#j`Omj}Mn{6#*B6#y^+FKLI`l U0SL+f2+FfDFu(}6%18k=2M{185dZ)H diff --git a/streamlit_app.py b/streamlit_app.py index 60b9387d7881..efe18842b766 100644 --- a/streamlit_app.py +++ b/streamlit_app.py @@ -7,6 +7,12 @@ from datetime import date from retry_requests import retry +st.set_page_config( + page_title="San Francisco Rainfall", +) + +st.title("San Francisco Rainfall") + DATE_RANGE = st.date_input("Time range", value=[date(2020, 10, 1), date.today()]) def get_season_from_date(datetime): @@ -22,6 +28,10 @@ def get_day_season_rank(datetime): delta = date - get_season_start_date_from_season(get_season_from_date(datetime)) return delta.days +def get_day_in_season(datetime): + return datetime.strftime("%b %d") + + # Setup the Open-Meteo API client with cache and retry on error cache_session = requests_cache.CachedSession('.cache', expire_after = -1) retry_session = retry(cache_session, retries = 5, backoff_factor = 0.2) @@ -58,15 +68,24 @@ def get_day_season_rank(datetime): daily_dataframe = pd.DataFrame(data = daily_data) daily_dataframe["date"] = daily_dataframe["date"].apply(lambda x: pd.to_datetime(x)) -daily_dataframe["season_date"] = daily_dataframe["date"].apply(get_day_season_rank) +daily_dataframe["x_rank"] = daily_dataframe["date"].apply(get_day_season_rank) +daily_dataframe["Day"] = daily_dataframe["date"].apply(get_day_in_season) daily_dataframe["season"] = daily_dataframe["date"].apply(lambda x: str(get_season_from_date(x))) -daily_dataframe["Cumulative_Precip"] = daily_dataframe.groupby('season')['precipitation_sum'].cumsum() -st.dataframe(daily_dataframe) +daily_dataframe["Cumulative Rainfall (Inches)"] = daily_dataframe.groupby('season')['precipitation_sum'].cumsum() +daily_dataframe["14 Day Rolling Rainfall (Inches)"] = daily_dataframe.groupby('season')['precipitation_sum'].rolling(window=14,min_periods=14).sum().reset_index(0,drop=True) + +st.altair_chart(alt.Chart(daily_dataframe, height=700, width=700, title="Cumulative Seasonal Rainfall") + .mark_line().encode( + x=alt.X('Day', sort=alt.EncodingSortField(field="x_rank", op="min")), + y='Cumulative Rainfall (Inches)', + color='season', + ) +) -st.altair_chart(alt.Chart(daily_dataframe, height=700, width=700) +st.altair_chart(alt.Chart(daily_dataframe, height=700, width=700, title="14 Day Rolling Rainfall") .mark_line().encode( - x='season_date', - y='Cumulative_Precip', - color='season' + x=alt.X('Day', sort=alt.EncodingSortField(field="x_rank", op="min")), + y='14 Day Rolling Rainfall (Inches)', + color='season', ) )