Editeringsrammeverket
Hva er Editeringsrammeverket?
Editeringsrammeverket er et Python-bibliotek som hjelper deg lage en editeringsapplikasjon for å se gjennom dataene dine og hvis nødvendig korrigere feilaktige verdier. Rammeverket er utviklet i SSB.
Målet er at rammeverket skal være fleksibelt og gjenbrukbart. Det vi kaller variabelvelgeren er en sentral del av rammeverket. Kort fortalt koordinerer den skjermbildene i applikasjonen og sørger for at alt henger sammen.
Rammeverket krever noe montering. Dette er grunnen til at det heter Editeringsrammeverk og ikke Editeringsløsning.
Gjenbruk som hovedprinsipp
Rammeverket tilrettelegger for gjenbruk på to måter:
Modulbasert Rammeverket inneholder moduler/komponenter som kan gjenbrukes. Disse krever litt ulike grader av tilpasning, alt fra null tilpasning til at dataene dine må settes opp på en spesifikk måte.
Standardisert oppsett for kode Man må følge et standard oppsett for hvordan koden kan struktureres. Se contributing.md for detaljer.
Disse prinsippene bidrar til å redusere personavhengighet og samle mest mulig vedlikeholdsarbeid på ett sted. I tillegg kan en felles struktur gjøre det enklere å lære av hverandre og utvide med mer felles funksjonalitet.
Rammeverket er ikke låst til en spesifikk lagringsteknologi eller datastruktur: Så lenge du kan få dataene dine inn i en pandas dataframe kan du bruke rammeverket.
Men noen moduler forutsetter foreløpig en spesifikk datastruktur lagret i eimerdb.
Hva trenger jeg å kunne?
Du må ha litt python kompetanse, men hvor komfortabel du må være med python avhenger av hvor kompliserte behov du har.
Grovt sett kan kompetansekravet deles i tre nivåer.
Nivå 1: Gjenbruk av ferdigbygde moduler er tilstrekkelig. Nivå 2: Noen skreddersydde tabeller, figurer eller skjermbilder kreves. Nivå 3: Du har behov for skreddersydd funksjonalitet og egne moduler.
Kompleksiteten reduseres om du:
- kan bruke eimerdb for å lagre dataene dine.
- har enkle data:
- få variabler
- flat struktur
- ingen repeterende verdier (hver variabel kun forekommer 1 gang for hver observasjon)
- kan følge anbefalt datastruktur.
- kan gjenbruke eksisterende moduler.
Kompleksitet økes om:
- samme variabel kan ha mellom 0 og uendelig antall verdier for samme enhet
- Eks. en bedrift kan ha gjort 0 eller mange investeringer og rapporterer opplysninger for hver enkelt investering, som skal behandles enkeltvis.
- datene har flere nivåer.
- dataene har kompliserte/sammensatte sammenhenger mellom variabler.
- du har behov for skreddersydde og sammensatte moduler
Hvordan kan jeg ta det i bruk?
Det er noen forutsetninger før du kan sette igang med rammeverket. Det viktigste er at du må forberede dataene dine slik at de er klare for editering: altså at maskinelle/automatiske rettinger skal være gjort og dataene er strukturert på en måte som gjør at det er lett å bearbeide.
Eksempelkoden viser hvordan man tar i bruk rammeverket for å editere en dataframe. Begynn med å installere pakken ssb-dash-framework og eventuelle andre pakker som mangler. Kodeeksemplene nedenfor er også tilgjengelig som en egen notebook: editering_demo.ipynb.
Importer pakker
from ssb_dash_framework import main_layout
from ssb_dash_framework import app_setup
from ssb_dash_framework import set_variables
from ssb_dash_framework import EditingTableTab # Tab modulen
from ssb_dash_framework import EditingTableWindow # Vindu modulen
from ssb_dash_framework import apply_edits
import pandas as pd
import numpy as np
import os
import uuid
from datetime import datetime, timezone
from fagfunksjoner import next_version_pathLes inn data
filsti_data = '/buckets/produkt/editering/editering_test_v1.parquet'
df = pd.read_parquet(
filsti_data
)
filsti_logg = '/buckets/produkt/editering/logg/prosessdata/prosess-editering_test_v1.jsonl'
try: os.makedirs('/buckets/produkt/editering/logg/prosessdata') # lag mappe for logg
except: passKlargjøre data
Løsningen avhenger av at man har en uuid-kolonne i dataframen. Dette er for å forsikre at riktig rad blir endret.
if 'uuid' not in df.columns: df['uuid'] = [uuid.uuid4() for _ in range(len(df))]Kjør app
App setup
port = 8070
service_prefix = os.getenv("JUPYTERHUB_SERVICE_PREFIX", "/")
domain = os.getenv("JUPYTERHUB_HTTP_REFERER", None)
theme = "cosmo" # sjekk ut flere temaer: https://www.dash-bootstrap-components.com/docs/themes/explorer/
app = app_setup(port, service_prefix, theme)
app_timestamp = datetime.now()Velg variabler
set_variables(["orgnr","aar"]) # Dette gjør at orgnr og aar er tilgjengelig i applikasjonen din.
start_verdier = { # Valgfritt å ha med, men kan være praktisk for brukervennlighet. Puttes inn i main_layout() funksjonen.
"orgnr": "971526920",
"aar": "2020"
}
# Definer get_data funkjson
def get_data(orgnr,aar):
return df[(df['orgnr'] == orgnr) & (df['aar']==aar)]
enhetstabell = EditingTableTab(
label="Eksempel 1: Fiktiv data",
inputs=["orgnr", "aar"], # evt. start_verdier.keys()
states=[],
get_data_func=get_data,
update_table_func=lambda x, *_: x ,
output="aar",
log_filepath = filsti_logg,
)
tab_list = [
enhetstabell,
]
window_list = []
app.layout = main_layout(window_list, tab_list, default_values = start_verdier, )
if __name__ == "__main__":
app.run(
port=port,
jupyter_server_url=domain,
jupyter_mode="tab",
)EditingTableTab() tar imot parameteret justify_edit. Standardverdien er True. Dersom man ikke vil gi begrunnelse når man editerer setter man den til False. Vær vi må spore endringer i dataene. Dette innebærer at vi må loggføre endringene - blant annet med begrunnelse for editering.
Gjør endringer i datasettet
Påfør endringer fra logg
logg = pd.read_json(filsti_logg, lines = True)
print(logg)
df_editert = apply_edits(df, filsti_logg, app_timestamp)Sjekk hva som har blitt endret
pd.concat([df,df_editert]).drop_duplicates(keep=False)Lagre det editerte datasettet
filsti_data_neste_versjon = next_version_path(filsti_data)
print(filsti_data_neste_versjon)
df.to_parquet(filsti_data_neste_versjon)Hvor er dokumentasjonen?
Nedenfor er en oversikt over dokumentasjonen for Editeringsrammeverket. Det er strukturert slik at dokumentasjon som er tett knyttet til selve koden er i repoet, mens dokumentasjon om hvordan du tilrettelegger data o.l. er på Confluence.
For konkret bruk av biblioteket og koden er det best å se på dokumentasjonen i repoet og i koden, enten ved å se på denne siden eller se direkte i repoet github repoet. Hvis du sjekker i repoet, ta gjerne en tur innom docs/ mappen.
Vi har demoer som du kan se på, og som kan kjøres med dapla-felles tilgangen i Dapla Lab. Du kan finne demoene her.
Hvis du vil teste hvordan det er å lage en editeringsapplikasjon så kan du bruke de samme dataene som demoene bruker.
Vi har skrevet en veiledning for hvordan du kan tilpasse Altinn 3 data til å passe editeringsrammeverket som du kan se på Confluence.
- Noen moduler forutsetter at dataene dine er i eimerdb og følger foreslått datastruktur.
- Om du ikke har en Altinn 3 undersøkelse kan veiledningen fortsatt være nyttig for å se en foreslått struktur på dataene.
- Strukturen på dataene kan følges uavhengig av om du har dataene dine i parquet filer, eimerdb eller andre lagringsteknologier.
Er Editeringsrammeverket ferdig?
Vi mener at Editeringsrammeverket er klart til at det kan tas i bruk og at det er fleksibelt nok til å være nyttig for mange som skal legge over statistikken sin til Dapla.
Vi mener også at strukturen vi har lagt opp til gjør det mulig å utvide funksjonalitet, lage egne moduler, skreddersy og tilpasse i stor nok grad til at de aller fleste kan tilpasse det til egne behov. - Det kan kreve litt ekstra innsats, men det vil kreve mer innsats å starte fra ingenting enn å starte fra rammeverket. - Om ny funksjonalitet legges til i rammeverket vil du ha lettere for å gjenbruke om du allerede har tilpasset deg kodestrukturen i editeringsrammeverket.
Samtidig kan vi nok aldri si at rammeverket er ferdig. Det vil alltid være muligheter til å utvide, lage ny funksjonalitet, nye moduler og rom for forbedring. Behov kan forandre seg over tid, nye kan dukke opp og gamle behov kan bli irrelevante.
Hvis du ønsker å bidra ønskes det velkommen, enten om det er å fikse på dokumentasjonen eller lage hele moduler.
Hvor kan jeg få hjelp?
Det er supert om du stiller spørsmål og deler erfaringer eller tips på Viva kanalen vår.
For hjelp kan du også kontakte støtteteamene.