""" Data processing logic voor het glucose-dashboard. Bewust gescheiden van app.py: Streamlit-UI-code kun je niet zomaar los unit-testen (die heeft een draaiende Streamlit-context nodig). Door de logica (inladen, aggregeren) in een los module te zetten, kun je die logica wel gewoon met pytest testen, en blijft app.py alleen de UI-laag. """ from pathlib import Path import pandas as pd DATA_PATH = Path(__file__).parent / "data" / "glucose_readings.csv" def load_data(path: Path = DATA_PATH) -> pd.DataFrame: """Laad de ruwe metingen in. Verwacht kolommen: 'timestamp' (parsebaar als datetime) en 'glucose_value' (numeriek). Vervang deze functie later door je eigen databron (database, CGM-export, API-call, etc.) — de rest van de app blijft dan ongewijzigd werken. """ df = pd.read_csv(path, parse_dates=["timestamp"]) return df def filter_by_date(df: pd.DataFrame, selected_date) -> pd.DataFrame: """Filter de dataset op een enkele kalenderdag.""" return df[df["timestamp"].dt.date == selected_date] def hourly_average(df: pd.DataFrame) -> pd.DataFrame: """Groepeer per uur (0-23) en bereken de gemiddelde waarde. Geeft een DataFrame terug met kolommen 'hour' en 'glucose_value', één rij per uur waarin daadwerkelijk data zit. """ if df.empty: return pd.DataFrame(columns=["hour", "glucose_value"]) working = df.copy() working["hour"] = working["timestamp"].dt.hour result = ( working.groupby("hour")["glucose_value"] .mean() .round(1) .reset_index() .sort_values("hour") ) return result