diff --git a/src/adjuster.py b/src/adjuster.py new file mode 100644 index 0000000..e0f643c --- /dev/null +++ b/src/adjuster.py @@ -0,0 +1,80 @@ +""" This page shows the current adjuster values """ +import os +import pandas as pd + +import plotly.graph_objects as go + +from nowcasting_datamodel.read.read_metric import read_latest_me_national +from nowcasting_datamodel.connection import DatabaseConnection +from nowcasting_datamodel.models import MetricValueSQL, MetricSQL, MLModelSQL +import streamlit as st + + +def adjuster_page(): + """Main page for status""" + + st.markdown( + f'

{"Adjuster"}

', + unsafe_allow_html=True, + ) + + url = 'https://www.notion.so/openclimatefix/Adjuster-cae707fbac0a440895f8aacec2a7b55c?pvs=4' + st.markdown(f'Link to Notion page', unsafe_allow_html=True) + + connection = DatabaseConnection(url=os.environ["DB_URL"], echo=True) + with connection.get_session() as session: + # get all the models with adjust values + model_names = get_model_names_with_adjuster_values(session) + + # Add dropdown to select GSP region + model_name = st.sidebar.selectbox("Select a models", model_names, index=0) + + # get adjust values + metric_values = read_latest_me_national( + session=session, + model_name=model_name, + ) + + # format + metric_values = [ + [metric_value.value, metric_value.time_of_day, metric_value.forecast_horizon_minutes] + for metric_value in metric_values + ] + + metric_values_df = pd.DataFrame( + columns=["value", "time_of_day", "forecast_horizon_minutes"], data=metric_values + ) + + # pivot to make in 2d data ofr time_of_day vs forecast_horizon_minutes + metric_values_df = metric_values_df.pivot( + index="time_of_day", columns="forecast_horizon_minutes", values="value" + ) + + fig = go.Figure( + data=go.Heatmap( + z=metric_values_df.values, x=metric_values_df.columns, y=metric_values_df.index + ), + layout=go.Layout( + title=go.layout.Title(text=f"Adjuster Value for {model_name}"), + xaxis=go.layout.XAxis(title=go.layout.xaxis.Title(text="Forecast Horizon [minutes]")), + yaxis=go.layout.YAxis(title=go.layout.yaxis.Title(text="Time of day")), + ), + ) + + # add + st.plotly_chart(fig, theme="streamlit") + + +def get_model_names_with_adjuster_values(session, metric_name: str = "Half Hourly ME"): + """Get model name with adjuster values""" + # start main query + query = session.query(MetricValueSQL) + query = query.join(MetricSQL) + query = query.join(MLModelSQL) + query = query.distinct(MLModelSQL.name) + # filter on metric name + query = query.filter(MetricSQL.name == metric_name) + # get all results + metric_values = query.all() + model_names = [metric_value.model.name for metric_value in metric_values] + return model_names diff --git a/src/main.py b/src/main.py index 311d236..4a2b86c 100644 --- a/src/main.py +++ b/src/main.py @@ -32,6 +32,7 @@ from users import user_page from nwp_page import nwp_page from satellite_page import satellite_page +from adjuster import adjuster_page st.get_option("theme.primaryColor") st.set_page_config(layout="wide", page_title="OCF Dashboard") @@ -282,6 +283,7 @@ def metric_page(): "API Users": user_page, "NWP": nwp_page, "Satellite": satellite_page, + "Adjuster": adjuster_page, } demo_name = st.sidebar.selectbox("Choose a page", page_names_to_funcs.keys())