Skip to content

3lbits/SynthAMP

Repository files navigation

SynthAMP

Generator for syntetisk AMS-data — energi-/forbruksmålinger og spenningsmålinger som likner virkelige norske AMS-utleveringer. Tenkt som et utviklerverktøy for å fylle dev/test-miljøer med troverdig data uten å eksponere produksjonsdata.

Hva genereres

Energi (langt format)

Kolonne Beskrivelse
LOCATIONID Måler-ID
TIME Timestamp (timeoppløsning)
SERIE A+, A-, R+, R-
READING Kumulativ teller (kWh)
VOLUME Delta i intervallet (kWh)

Spenning (bredt format)

Kolonne Beskrivelse
LOCATIONID Måler-ID
TIME Timestamp (10/60 min)
L1_MIN/AVG/MAX Fase 1
L2_MIN/AVG/MAX Fase 2
L3_MIN/AVG/MAX Fase 3
SYMMETRY Usymmetri (%)

Kjøre

Docker (anbefalt)

docker compose up --build

Åpner web-UI på http://localhost:8000. API-spec på http://localhost:8000/docs.

Lokal utvikling

# Backend
pip install -e .
python -m synthamp.main

# Frontend (separat shell — dev-server med proxy mot localhost:8000)
cd frontend
npm install
npm run dev

CLI

synthamp list
synthamp generate --profile household --locations 50 \
  --start 2026-01-01T00:00 --end 2026-01-08T00:00 \
  --outages-per-year 2 --out-dir ./out
synthamp train --name min_profil --energy-csv ams.csv --voltage-csv spenning.csv

Trene på sensitive filer

Verktøyet leser dine sensitive AMS-filer (CSV) lokalt og ekstraherer et statistisk fingeravtrykk — døgnprofil, ukeprofil, sesongprofil, fordeling for spenning, reaktiv-ratio, utfallsrate. Resultatet lagres som en Profile-JSON. Rådata forlater aldri containeren — verktøyet verken logger eller persister rådata.

Etter trening velger du profilen i UI og genererer syntetisk data i samme mønster.

Sikkerhet og sensitiv data

Koden i dette repoet er fri for kraft- og personsensitiv data, og skal forbli det.

  • /data committes aldri. All input/output som kan være sensitiv lever der: importert NEMO-modell (/data/nemo), trente profiler (/data/profiles) og bakgrunnsjobber (/data/jobs). Katalogen er gitignorert og montert som et Docker-volum — den hører ikke hjemme i versjonskontroll.
  • Output kan være sensitivt selv om det er syntetisk. Laster du inn en ekte NEMO-modell med korrekte merkeytelser, blir generert data kraftsensitivt. Trener du en profil på et for smalt utvalg, kan den bli person-gjenkjennbar (overfitting). Klassifiser alltid resultatet ut fra hva du matet inn.
  • Rådata forlater aldri maskinen. Trening beholder kun et statistisk fingeravtrykk; rådata verken logges eller persisteres.
  • Ingen hemmeligheter i repoet. Tokens, nøkler og connection strings hører hjemme i miljøet (env-variabler / hemmelighetsstore), ikke i koden.

Før du pusher: sjekk at ingen *.csv, *.parquet, NEMO-RDF eller Profile-JSON er staged (git status).

API-endepunkter

Metode Sti Formål
GET /api/profiles List alle profiler (built-in + trente)
GET /api/profiles/{name} Hent full profil-definisjon
DELETE /api/profiles/{name} Slett trent profil
POST /api/profiles/train Tren ny profil fra opplastet CSV
POST /api/generate Generer datasett (CSV/JSON/Parquet via ?format=)
POST /api/generate/preview Lettvektsutdrag for charting
POST /api/validate Sammenlign syntetisk vs referanse (KS-test)
GET /api/health Helsesjekk

Eksempel: generer en uke for 100 husholdninger

# Bare energi-fil
curl -X POST 'http://localhost:8000/api/generate?format=csv&kind=energy' \
  -H 'Content-Type: application/json' \
  -d '{
    "locations": 100,
    "start": "2026-01-01T00:00:00",
    "end": "2026-01-08T00:00:00",
    "profile": "household",
    "production_ratio": 0.2,
    "outages_per_year": 3,
    "overvoltage_events_per_year": 8,
    "seed": 42
  }' > energy.csv

# Bare spenning-fil
curl -X POST 'http://localhost:8000/api/generate?format=csv&kind=voltage' ...  > voltage.csv

# Begge i én ZIP
curl -X POST 'http://localhost:8000/api/generate?format=csv&kind=both' ... > bundle.zip

kind=both med format=csv|parquet returnerer en ZIP med energy.csv + voltage.csv. Med format=json returneres et JSON-objekt med begge nøklene.

Innebygde profiler

Inspirert av ElHub forbruksprofiler — typiske norske nøkkelgrupper:

  • household — vanlig norsk husholdning, panelovn-dominert
  • household_heatpump — flatere døgnkurve, lavere vintertopp
  • cabin — fritidsbolig, helg- og høytidsspisser
  • industry_small — næring 07–17, låg helg
  • industry_continuous — kontinuerlig produksjon
  • prosumer_solar — husholdning + ~7 kWp sol

Validering

Last opp en referanse-CSV og kjør valideringen. Returnerer:

  • KS-statistikk på energifordeling (lav = god match)
  • Døgnprofil-korrelasjon (Pearson)
  • KS-statistikk på spenning (hvis tilgjengelig)
  • Kommentarer om hvor synthetic-data skiller seg

Arkitektur

synthamp/                   # Python-pakke
├── generator/              # Energi + spenning + hendelser (utfall, over/under)
├── profiles/               # Built-in + trent profil-lagring
├── training/               # CSV → statistisk profil
├── validation/             # KS-test + profil-korrelasjon
├── api.py                  # FastAPI
└── cli.py                  # synthamp CLI

frontend/                   # React + Vite, builds → /app/frontend i container

Lisens

Internt verktøy. Ingen ekstern lisens satt enda.

About

Syntetiske måledata

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors