BSL Notebook – Installationsguide och rutiner

Starta JupyterLab

Dubbelklicka på Starta_jupyterlab.bat i Scripts-mappen. JupyterLab öppnas automatiskt i Chrome på http://localhost:8888/lab

OBS: Om du kör från Proton Drive och får "Server Connection Error" mitt i sessionen – prova att flytta bsl_analys.ipynb till en lokal mapp (t.ex. C:\BSL\) och kör därifrån. Proton Drive-synkning kan störa JupyterLab vid autosave.

Exportera rapport

Dubbelklicka på Export_notebook.bat i Scripts-mappen. Kör hela notebooken och exporterar bsl_rapport_YYYY-MM-DD.html till Rapporter\-mappen, öppnar den i Chrome. Tar 2–4 minuter (kör om hela notebooken från scratch).


Daglig rutin

  1. Kör garmin_upload.py (och garmin_upload_gisela.py när Gisela har data)
  2. Kör bsl_upload.py (och bsl_upload_gisela.py om inmatning gjorts)
  3. Dubbelklicka Starta_jupyterlab.bat
  4. Öppna bsl_analys.ipynb
  5. Kernel → Restart & Run All
  6. Scrolla till avsnitt 15 (Nattgraf) och ändra NATT_DATUM vid behov
  7. Scrolla till avsnitt 15 (Daggraf) och ändra DAG_DATUM vid behov

Byta ut notebooken (när Claude levererar ny version)

  1. Högerklicka på bsl_analys.ipynb i JupyterLab filpanel → Close and Shutdown Notebook
  2. I File Explorer: döp om gamla filen till bsl_analys_DATUM.ipynb (säkerhetskopia)
  3. Kopiera in den nya filen som bsl_analys.ipynb
  4. Dubbelklicka på filen i JupyterLab för att öppna
  5. Kernel → Restart & Run All

OBS: Bara stänga fliken räcker inte – kerneln lever kvar. Alltid Close and Shutdown.


Samarbete med Claude

Ladda upp aktuell notebook

Ladda alltid upp din bsl_analys.ipynb när du startar en ny session med Claude om du vill göra ändringar. Annars jobbar Claude mot en gammal version.

Ladda upp kontextfiler i ny chatt


Notebook-struktur (per 2026-05-15, v3.19)

Cell Innehåll
0 Rubrik (version + ändringslogg)
1-2 Installation
3-4 Konfiguration + Supabase-anslutning
5-6 Hämta data (logg, hv, kost, iv, gp, gs, pollen) med paginering
7-8 Förbered analysdata: ps, natt_stats, df, kost-aggregering, pollen-merge
9-10 Aggregera huvudvark_log → df
11-12 Parametrar (FRÅN_DATUM, TILL_DATUM, RULLANDE_FÖNSTER, VISA_RULLANDE)
13-14 Hjälpfunktioner (rullande, filtrera_period, formatera_xaxel, rita_interventioner)
15-16 Graf 1 – Nattpuls + sömntid (egen_total från somnade/steg_upp/langd_uppvaknanden)
17-18 Graf 2 – Vilofas (puls <56) vs Garmin djupsömn
19-20 Graf 3 – Pulsavvikelser
21-22 Sammanfattning
23-24 BSL Sleep Score v4
25 Graf 5 – Sleep Score tidsserie
26-27 Graf 6 – Nattlig pulsstabilitet (SD p80) + Pulsro + Andel <50 bpm
28-29 Korrelationsanalys (15 faktorer inkl. 10 pollentyper)
30 Nästa steg
31-32 Graf 7 – Nattpuls vs pollen (POLLEN_NR = [1,2] etc)
33-34 Nattgraf (ändra NATT_DATUM, kör Shift+Enter)
35 (tom)
36 Markdown: Daggraf
37-38 Daggraf (ändra DAG_DATUM, kör Shift+Enter)
39 Markdown: Sektion 16
40 Graf 8 – Vikt
41 Graf 9 – Steg per dag
42 Graf 10 – Kalorier: förbrukning vs intag
43 Graf 11 – Proteinintag
44 Markdown: Sektion 17
45 Graf 12 – Dagtidspuls över tid (median + P5-P95 + aktiv andel)
46 Graf 13 – Zontrend dagtid 08-20 (Vila+Z1 / Z2-Z5, linjer)
47 Markdown: Sektion 18
48 Graf 14 – Nattzontrend 22-08 (Djup vila+Vila / Förhöjd+Vaken+Uppvaknande)
49-50 Diagnostik – täckning per user_id/datum/natt_datum i garmin_puls (v3.19)

Versionshistorik: - v3.17 (2026-05-13) – baseline med alla 14 grafer - v3.18 (2026-05-14) – USER_ID-filter på alla personliga tabeller (förberedelse för flera användare) - v3.19 (2026-05-15) – diagnostikcell sist (täckning per user_id/datum/natt_datum)


BSL Sleep Score v4

Komp Beskrivning Viktning
A Insomningslugn – puls <65 kl 22 1/6
B Störningsfrihet – timing-viktad (22-01 x2, 01-04 x1.5, 04-08 x1) 1/6
C Djupfas – andel puls <56 bpm 1/6
D Stabilitet – SD på lägsta 80% av pulsvärden (exkl. uppvakningspikar) 1/6
F Uppvaknanden – 0=1.0, 1-2=0.85, 3=0.50, 4+=0.20 1/6
G Sömntid – steg_upp minus somnade minus langd_uppvaknanden, mål 8h 1/6

Score = medel(A,B,C,D,F,G) × 5 → skala 0-5

Datum-konvention: Kvällen (22:00–) från dagen INNAN uppvakningsdatumet. Morgonen (–08:00) från uppvakningsdatumet.


Graf 7 – Nattpuls vs Pollen

Välj pollentyp med nummer i POLLEN_NR-parametern, kör cellen med Shift+Enter:

# 1=Gräs  2=Björk  3=Al  4=Sälg och viden  5=Hassel
# 6=Gråbo  7=Ek  8=Alm  9=Malörtsambrosia  10=Bok
POLLEN_NR = [1, 2]

Graf 12-13 – Dagtidszoner

Maxpuls för zonberäkning: MAXPULS = 170 (justeras när cykeldata finns). Dagtidsfönster: DAG_FONSTER_START = 8, DAG_FONSTER_SLUT = 20.

Graf 14 – Nattzoner

Zoner baserade på absolut puls (inte % av maxpuls): | Zon | bpm | Tolkning | |---|---|---| | Djup vila | <50 | Optimal restorativ sömn | | Vila | 50-55 | Bra sömnpuls | | Förhöjd | 56-62 | Lätt aktiverat | | Vaken/lätt | 63-75 | Klart aktiverat | | Uppvaknande | >75 | Vaken eller stress |


Tekniska lärdomar

Garmin-datavalidering

Daglig kontroll: Kolla nattgrafen varje morgon. Biologiskt rimlig puls = mjuka kurvor med enstaka toppar vid uppvaknanden. Kaotiska oscillationer eller abrupt avslut = varningstecken.

:44-sekunders artefakter (SpO2-sensor) Pulsvärden med sekund=44 i lokal_tid är artefakter. Filtreras automatiskt i garmin_upload.py.

Garmin skapar flera WELLNESS-filer per dag. Alla måste finnas i Indata-mappen för komplett data. Om förmiddagsdata saknas – kontrollera att alla filer för datumet är uppladdade.

Sleep Score-buggar att känna till (lösta i v2.4–v3.5): - datum-kolumner kan ha olika precision (datetime64[us] vs [ns]) – normaliseras till [ns] - F-komponenten kräver int(float(n_vak)) för numpy.float64 - Deduplicera scorer med drop_duplicates(subset=['datum'], keep='first')