Skip to content
Merged
108 changes: 108 additions & 0 deletions demo/control/control_app.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
# ---
# jupyter:
# jupytext:
# text_representation:
# extension: .py
# format_name: light
# format_version: '1.5'
# kernelspec:
# display_name: demo-ssb-dash
# language: python
# name: demo-ssb-dash
# ---

# +
import os # Nødvendig for oppsett

from control_code import DemoControls # For å kunne bruke kontroll-modulen

# Moduler importert fra biblioteket
# from ssb_dash_framework import HBMethod
from ssb_dash_framework import AggDistPlotterWindow
from ssb_dash_framework import AltinnControlViewWindow
from ssb_dash_framework import AltinnSkjemadataEditor
from ssb_dash_framework import FreeSearchTab
from ssb_dash_framework import app_setup
from ssb_dash_framework import main_layout
from ssb_dash_framework import set_eimerdb_connection
from ssb_dash_framework import set_variables

# from egentilpassing.hb_method import hb_get_data


# Kobling til EimerDB som ligger i fellesbøtta.
set_eimerdb_connection(
"ssb-dapla-felles-data-produkt-prod",
"produksjonstilskudd_altinn3",
)
selected_time_units = ["aar"] # Tidsenheten(e) til dataene

# Basic app-oppsett
port = 8070
service_prefix = os.getenv("JUPYTERHUB_SERVICE_PREFIX", "/")
domain = os.getenv("JUPYTERHUB_HTTP_REFERER", None)
app = app_setup(port, service_prefix, "lumen", logging_level="debug", log_to_file=True)

# VARIABLER: Velg hvilke variabler appen skal bruke. Default values er valgfritt, men anbefalt.
set_variables(
[
"aar",
"ident",
"statistikkvariabel",
"altinnskjema",
"valgt_tabell",
"refnr",
]
)
default_values = {
"aar": "2023",
"statistikkvariabel": "fulldyrket",
"valgt_tabell": "skjemadata_hoved",
"altinnskjema": "RA-7357",
}

# Uncomment this if you have access to the VoF shared bucket.
# bof_module = BofInformationTab(
# variableselector_foretak_name="ident"
# )

# Legg in alle tabene i denne lista
tab_list = [
AltinnSkjemadataEditor(time_units=selected_time_units, variable_connection={}),
FreeSearchTab(),
# bof_module # Uncomment this if you have access to the VoF shared bucket.
]

# MODALENE: Lag en liste med alle modalene
# hb = HBMethod(
# database=conn,
# hb_get_data_func=hb_get_data,
# selected_state_keys=["aar", "statistikkvariabel"],
# selected_ident="ident",
# variable="verdi",
# )

# visualiseringsbyggermodul = VisualizationBuilder(conn)
# datafangstmodalen = AltinnDataCaptureWindow(
# time_units=selected_time_units
# )
aggdistplotter = AggDistPlotterWindow(selected_time_units)

controls = AltinnControlViewWindow(
time_units=["aar"], control_dict={"RA-7357": DemoControls}
)

# MODALENE: Lag en liste med alle modalene
modal_list = [
# datafangstmodalen,
aggdistplotter,
controls,
# hb,
# visualiseringsbyggermodul,
]

# Denne linja genererer layouten til hele appen. Her legges listene med valgt innhold for modalene, fanene og variablene.
app.layout = main_layout(modal_list, tab_list, default_values=default_values)

if __name__ == "__main__":
app.run(debug=True, port=port, jupyter_server_url=domain, jupyter_mode="tab")
119 changes: 119 additions & 0 deletions demo/control/control_code.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
# ---
# jupyter:
# jupytext:
# cell_metadata_filter: -papermill,tags
# custom_cell_magics: kql
# text_representation:
# extension: .py
# format_name: percent
# format_version: '1.3'
# jupytext_version: 1.16.2
# kernelspec:
# display_name: .venv
# language: python
# name: python3
# ---


import eimerdb as db
import pandas as pd

# %% metadata={}
from ssb_dash_framework import ControlFrameworkBase
from ssb_dash_framework import register_control

conn = db.EimerDBInstance(
"ssb-dapla-felles-data-produkt-prod",
"produksjonstilskudd_altinn3",
)


class DemoControls(ControlFrameworkBase):
def __init__(
self,
time_units: list[int | str],
applies_to_subset: dict[str, int | str],
) -> None:
super().__init__(time_units, applies_to_subset)

@register_control(
kontrollid="nye",
kontrolltype="I",
beskrivelse="Nye enheter for året",
kontrollerte_variabler=["ident"],
sorteringsvariabel="fulldyrket",
sortering="ASC",
)
def control_nye(self):
aar = int(self.applies_to_subset["aar"][0])

df = conn.query("SELECT * FROM skjemamottak")

enheter_fjoraar = list(df.loc[df["aar"] == aar - 1]["ident"].unique())

nye_enheter = df.loc[(df["aar"] == aar) & (~df["ident"].isin(enheter_fjoraar))]
ikke_nye_enheter = df.loc[
(df["aar"] == aar) & (df["ident"].isin(enheter_fjoraar))
]

nye_enheter["utslag"] = True
ikke_nye_enheter["utslag"] = False

df = pd.concat([nye_enheter, ikke_nye_enheter])
df["verdi"] = 0

return df[["aar", "skjema", "ident", "refnr", "utslag", "verdi"]]

@register_control(
kontrollid="diff",
kontrolltype="S",
beskrivelse="Stor differanse mot fjoråret",
kontrollerte_variabler=["fulldyrket"],
sorteringsvariabel="fulldyrket",
sortering="ASC",
)
def control_diff(self):
aar = int(self.applies_to_subset["aar"][0])
df = conn.query("SELECT * FROM skjemadata_hoved")
df = df.loc[df["variabel"] == "fulldyrket"]
diff_df = df.loc[(df["aar"].isin([aar, aar - 1]))]
diff_df = diff_df.pivot(
index=["ident", "variabel"], columns="aar", values="verdi"
).reset_index()
diff_df[aar - 1] = diff_df[aar - 1].astype(float)
diff_df[aar] = diff_df[aar].astype(float)
diff_df = diff_df.loc[(diff_df[aar - 1] > 0) & (diff_df[aar] > 0)]

diff_df["differanse"] = diff_df[aar] - diff_df[aar - 1]
diff_df["prosent_endring"] = (diff_df["differanse"] / diff_df[aar - 1]) * 100

diff_df["utslag"] = False
diff_df.loc[(abs(diff_df["prosent_endring"]) > 100), "utslag"] = True

diff_df["aar"] = aar
diff_df["skjema"] = "RA-7357"
diff_df["kontrollid"] = "diff"
diff_df["verdi"] = diff_df["prosent_endring"].astype(int)

diff_df = diff_df.merge(
df.loc[df["aar"] == aar][["ident", "refnr"]], on="ident"
)
return diff_df[
["aar", "skjema", "ident", "refnr", "kontrollid", "utslag", "verdi"]
]


if __name__ == "__main__":

test = DemoControls(
time_units=["aar"],
applies_to_subset={"aar": 2024, "skjema": "RA-7357"},
conn=conn,
)

test.register_all_controls()
test.execute_controls()

print(conn.query("SELECT * FROM kontroller"))

print(conn.query("SELECT * FROM kontrollutslag"))
Loading
Loading