53 lines
1.6 KiB
Python
53 lines
1.6 KiB
Python
"""
|
|
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
|