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_path
Editering av enkel dataframe
Imports
Les inn data
= '/buckets/produkt/editering/editering_test_v1.parquet' filsti_data
= pd.read_parquet(
df
filsti_data )
= '/buckets/produkt/editering/logg/prosessdata/prosess-editering_test_v1.jsonl'
filsti_logg try: os.makedirs('/buckets/produkt/editering/logg/prosessdata') # lag mappe for logg
except: pass
Klargjøre data
Editeringen 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
= 8070
port = os.getenv("JUPYTERHUB_SERVICE_PREFIX", "/")
service_prefix = os.getenv("JUPYTERHUB_HTTP_REFERER", None)
domain = "cosmo" # sjekk ut flere temaer: https://www.dash-bootstrap-components.com/docs/themes/explorer/
theme = app_setup(port, service_prefix, theme)
app = datetime.now() app_timestamp
Velg variabler
"orgnr","aar"]) # Dette gjør at orgnr og aar er tilgjengelig i applikasjonen din.
set_variables([= { # Valgfritt å ha med, men kan være praktisk for brukervennlighet. Puttes inn i main_layout() funksjonen.
start_verdier "orgnr": "971526920",
"aar": "2020"
}
# Definer get_data funkjson
def get_data(orgnr,aar):
return df[(df['orgnr'] == orgnr) & (df['aar']==aar)]
= EditingTableTab(
enhetstabell ="Enhetstabell",
label=["orgnr", "aar"], # evt. start_verdier.keys()
inputs=[],
states=get_data,
get_data_func=lambda x, *_: x ,
update_table_func="aar",
output= filsti_logg,
log_filepath =False
justify_edit
)
= [
tab_list
enhetstabell,
]= []
window_list
= main_layout(window_list, tab_list, default_values = start_verdier, )
app.layout
if __name__ == "__main__":
app.run(=port,
port=domain,
jupyter_server_url="tab",
jupyter_mode )
Påføre endringer fra logg
= pd.read_json(filsti_logg, lines = True)
logg
print(logg)
= apply_edits(df, filsti_logg, app_timestamp) df_editert
Sjekk hva som har blitt endret
=False) pd.concat([df,df_editert]).drop_duplicates(keep
Lagre det editerte datasettet
= next_version_path(filsti_data)
filsti_data_neste_versjon print(filsti_data_neste_versjon)
df.to_parquet(filsti_data_neste_versjon)