Skip to content
Merged
17 changes: 15 additions & 2 deletions dashboard/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,10 @@ def update(
ctrl.figure_update(fig)


@state.change("experiment")
@state.change(
"experiment",
"experiment_date_range",
)
def update_on_change_experiment(**kwargs):
# skip if triggered on server ready (all state variables marked as modified)
if len(state.modified_keys) == 1:
Expand Down Expand Up @@ -361,14 +364,24 @@ def gui_setup():
# add toolbar components
with layout.toolbar:
vuetify.VSpacer()
# experiment selector
vuetify.VSelect(
v_model=("experiment",),
label="Experiments",
items=(experiments,),
dense=True,
hide_details=True,
prepend_icon="mdi-atom",
style="max-width: 250px",
style="max-width: 250px; margin-right: 14px;",
)
# date range selector for experiment filtering
vuetify.VDateInput(
v_model=("experiment_date_range",),
label="Date range",
multiple="range",
dense=True,
hide_details=True,
style="max-width: 250px; margin-right: 14px;",
)
# set up router view
with layout.content:
Expand Down
3 changes: 3 additions & 0 deletions dashboard/state_manager.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from pathlib import Path
from trame.app import get_server
from trame.widgets import vuetify3 as vuetify


EXPERIMENTS_PATH = Path.cwd().parent / "experiments/"
Expand All @@ -8,6 +9,7 @@
server = get_server(client_type="vue3")
state = server.state
ctrl = server.controller
vuetify.enable_lab() # Enable Labs components


def initialize_state():
Expand All @@ -23,6 +25,7 @@ def initialize_state():
][0]
print(f"Setting default experiment to {default_experiment}...")
state.experiment = default_experiment
state.experiment_date_range = []
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If the config.yaml file contains a section

date_filter:
  date:
    $gte: 2024-03-28 00:00:00
    $lte: 2024-03-28 23:59:59.999000

will experiment_date_range be initialized with these values in the dashboad?

# ML model
state.model_type = "Neural Network (single)"
state.model_training = False
Expand Down
38 changes: 37 additions & 1 deletion dashboard/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,44 @@ def load_variables(experiment):
@timer
def load_data(db):
print("Loading data from database...")
# build date filter if date range is set
date_filter = {}
if state.experiment_date_range:
# convert to naive datetime to match database format
start_date = (
pd.to_datetime(state.experiment_date_range[0].to_datetime())
.to_pydatetime()
.replace(hour=0, minute=0, second=0)
)
end_date = pd.to_datetime(state.experiment_date_range[-1].to_datetime())
# VDateInput returns exclusive end date for date ranges, but single-date selection has len=1
if len(state.experiment_date_range) == 1:
# single date selection: use the end date as-is
end_date = end_date.replace(hour=23, minute=59, second=59)
else:
# date range selection: subtract 1 day from exclusive end date
end_date = (
(end_date - pd.Timedelta(days=1))
.to_pydatetime()
.replace(hour=23, minute=59, second=59)
)
# remove timezone info to match naive datetime in database
start_date = (
start_date.replace(tzinfo=None) if start_date.tzinfo else start_date
)
end_date = end_date.replace(tzinfo=None) if end_date.tzinfo else end_date
date_filter = {
"date": {
"$gte": start_date,
"$lte": end_date,
}
}
print(date_filter)
print(f"Filtering data between {start_date.date()} and {end_date.date()}...")
# load experiment and simulation data points in dataframes
exp_data = pd.DataFrame(db[state.experiment].find({"experiment_flag": 1}))
exp_data = pd.DataFrame(
db[state.experiment].find({**{"experiment_flag": 1}, **date_filter})
)
sim_data = pd.DataFrame(db[state.experiment].find({"experiment_flag": 0}))
# Store '_id', 'date' as string
for key in ["_id", "date"]:
Expand Down