diff --git a/experimental/analyse_av_populasjon.py b/experimental/analyse_av_populasjon.py index f25c18c..f201987 100644 --- a/experimental/analyse_av_populasjon.py +++ b/experimental/analyse_av_populasjon.py @@ -3,6 +3,12 @@ # ## Pakker og tilganger +import sys +sys.path.insert(0, '..') + +import Droplister.hjelpefunksjoner as hjfunk +from functions.hjelpefunksjoner import lagre_excel + # + import pandas as pd @@ -28,7 +34,6 @@ # - - aar4 = '2022' aar2 = aar4[-2:] @@ -38,7 +43,7 @@ def rapport_df(df): display(df.sample(2)) -# ## Innlasting av filer +# # Innlasting av filer sti_akt = f"/ssb/stamme01/fylkhels/speshelse/aktivitet/{aar4}/masterfil/aktivitet_masterfil_{aar4}.parquet" sti_rgn0x = f"/ssb/stamme01/fylkhels/speshelse/regnskap/{aar4}/masterfil/helse0x_masterfil_{aar4}.parquet" @@ -52,15 +57,37 @@ def rapport_df(df): # ---- +# # Bearbeiding av filer + +HF, RHF, phob, rfss, rfss2, rfss3, rapporteringsenheter = hjfunk.hent_enheter_fra_klass( + aar4 +) + +rfs = pd.concat([rfss, rfss2, rfss3], ignore_index=True) + +rfs['FORETAKSTYPE'] = 'Støtteforetak' + +HF['FORETAKSTYPE'] = 'HF' + +phob['FORETAKSTYPE'] = 'Oppdrag' + +RHF['FORETAKSTYPE'] = 'RHF' + +foretakstyper = pd.concat([RHF, HF, phob, rfs], ignore_index=True).drop(columns=['HELSEREGION', 'NAVN_KLASS']).rename(columns={'ORGNR_FORETAK': 'ORGNR_FRTK'}) + +# ## Aktivitet + akt = ( akt .rename(columns={'ORGNR': 'ORGNR_FRTK'}) .drop(columns=['NAVN', 'HELSEREGION', 'RHF', 'REGION', 'ORGNR_REGION']) ) +akt['FORETAKSTYPE'] = akt['FORETAKSTYPE'].str.upper() + rapport_df(akt) -# --- +# ## Regnskap skjema0X # Merknader: # - LAB, PTR, PBF, ADM finnes ikke de andre filene. -> tas ut @@ -70,220 +97,217 @@ def rapport_df(df): # Funn: # - Tre like kolonner: ORGNR_DELREG, ORG_NR og ORGNR -rgn0x[rgn0x['ORGNR_DELREG'] != rgn0x['ORGNR']] +# + +# LAB, PTR, PBF, ADM finnes ikke de andre filene. -> tas ut + +tjenester_tas_ut = [ + "LAB", + "PTR", + "PBF", + "ADM", +] +rgn0x = rgn0x[~rgn0x['funksjon'].isin(tjenester_tas_ut)].copy() +# - -rgn0x.columns +rgn0x = rgn0x[["ORGNR", "funksjon", "TOT_UTG"]].rename( + columns={"ORGNR": "ORGNR_FRTK", "funksjon": "TJENESTE", "TOT_UTG": "TOT_UTG_0X"} +) -rgn0x[[kol for kol in rgn0x if kol.__contains__("ORG")]].sample(4) +rgn0x = rgn0x.groupby(['ORGNR_FRTK', 'TJENESTE']).sum().reset_index() -rgn0x = ( - rgn0x[['ORGNR', 'funksjon', 'TOT_UTG']] - .rename(columns={'ORGNR': 'ORGNR_FRTK'}) +rgn0x = pd.merge( + rgn0x, + foretakstyper, + on='ORGNR_FRTK', + how='left' ) rapport_df(rgn0x) # --- +# ## Regnskap skjema39 + # Merknad (skjema39) # - Hvis `SN07_1 == 86.107`, skal `funksjon`/`TJENESTE` være `REH` -# - Gjør en groupby på ORGNR_FORETAK og TJENESTE. Summer TOT_UTG +# - Gjør en groupby på ORGNR_FORETAK og funksjon. Summer TOT_UTG # # Funn: # - Noen 'ORGNR_REGION' == 'H06' -rgn39[[kol for kol in rgn39 if kol.__contains__("ORG")]].sample(4) - -rgn39 - -rgn39 = ( - rgn39[['ORGNR', 'funksjon', 'TOT_UTG']] - .rename(columns={'ORGNR': 'ORGNR_VIRK', 'funksjon': 'TJENESTE', 'TOT_UTG': 'REGNSKAP_TOT_UTG'}) -) - -rapport_df(rgn39) - -# --- - -# Merknad personell -# - - -per = ( - per[['ORGNR_FORETAK', 'TJENESTE', 'AARSVERK']] - .rename(columns={'ORGNR_FORETAK': 'ORGNR_FRTK'}) - .groupby(['ORGNR_FRTK', 'TJENESTE']).sum() - .reset_index() -) - -per = per - -rapport_df(per) - -master_join = pd.merge( - akt, - rgn0x, - how='outer', - on='' -) - - - - - - - - - - - - - -# + -def lag_sql_str(arr): - s = "(" - for nr in arr: - s += "'" + str(nr) + "'," - s = s[:-1] + ")" - return s - -def les_sql(sql_spørring, tilkobling): - """ - Utfører en SQL-spørring og returnerer en DataFrame hvor kolonnenavnene er i store bokstaver. - - Parametere: - - sql_spørring (str): SQL-spørringen som skal utføres. - - tilkobling (SQLAlchemy connection): Databaseforbindelsen som skal brukes for spørringen. - - Returnerer: - - DataFrame: Resultatet av SQL-spørringen med kolonnenavnene i store bokstaver. - """ - from sqlalchemy import text - # Utfør SQL-spørringen - df = pd.read_sql_query(text(sql_spørring), tilkobling) - - # Konverter kolonnenavnene til store bokstaver - df.columns = [col.upper() for col in df.columns] - - return df - +# Hvis `SN07_1 == 86.107`, skal `funksjon`/`TJENESTE` være `REH` +m_86107 = rgn39['SN07_1'] == '86.107' +rgn39.loc[m_86107, 'funksjon'] = "REH" -# - +# ### Henter ORGNR_FRTK fra VOF +# (106 missing) -len(orgnr_foretak_liste) +sql_str = hjfunk.lag_sql_str(rgn39[rgn39.ORGNR_FORETAK.isna()].ORGNR.unique()) +sporring_bed = f""" + SELECT FORETAKS_NR, ORGNR + FROM DSBBASE.SSB_BEDRIFT + WHERE STATUSKODE = 'B' AND ORGNR IN {sql_str} +""" +vof_bdr = hjfunk.les_sql(sporring_bed, conn).rename(columns={'ORGNR': 'ORGNR_VIRK'}) # + -sql_str = lag_sql_str(orgnr_foretak_liste) +sql_str = hjfunk.lag_sql_str(vof_bdr.FORETAKS_NR.to_list()) sporring_for = f""" - SELECT FORETAKS_NR, ORGNR, NAVN + SELECT FORETAKS_NR, ORGNR FROM DSBBASE.SSB_FORETAK - WHERE STATUSKODE = 'B' AND ORGNR IN {sql_str} + WHERE STATUSKODE = 'B' AND FORETAKS_NR IN {sql_str} """ -vof_for = les_sql(sporring_for, conn) +vof_for = hjfunk.les_sql(sporring_for, conn).rename(columns={'ORGNR': 'ORGNR_FRTK'}) # - -vof_for = vof_for.rename(columns={'ORGNR': 'ORGNR_FRTK', 'NAVN': 'NAVN_FRTK'}) - - - -sporring_bed = f""" - SELECT FORETAKS_NR, ORGNR, NAVN, KARAKTERISTIKK, SN07_1, SB_TYPE - FROM DSBBASE.SSB_BEDRIFT - WHERE STATUSKODE = 'B' AND ORGNR IN {sql_str} -""" -vof_bdr = les_sql(sporring_bed, conn) - -vof_bdr = vof_bdr.rename(columns={'ORGNR': 'ORGNR_VIRK', 'NAVN': 'NAVN_VIRK'}) - - - - - -koblede_enheter = vof_for_orgnr_un + vof_bdr_orgnr_un - -set(orgnr_foretak_liste) - set(koblede_enheter) - -# Enheter jeg ikke får koblet med VoF: -# - FALCK NORGE AS AVD OSLO GRENSEVEIEN 82 med organisasjonsnummer 918 997 202 ble slettet 03.10.2023 -# - ALERIS ÅLESUND med organisasjonsnummer 919 729 333 ble slettet 28.03.2023 -# - NORSK ARBEIDSHELSE AS AVD SANDEFJORD med organisasjonsnummer 923 568 662 ble slettet 10.01.2023 -# - NORSK ARBEIDSHELSE AS AVD FREDRIKSTAD med organisasjonsnummer 923 569 022 ble slettet 10.01.2023 -# - LEGEVAKTEN med organisasjonsnummer 984 293 518 ble slettet 15.01.2013 -# - ALFA KURS OG BEHANDLINGSSENTER AS med organisasjonsnummer 997 764 773 ble slettet 06.07.2023 -# - '999999994' - Ingen opplysninger -# - '999999995' - Ingen opplysninger -# - - +oppslag = pd.merge( + vof_bdr, + vof_for, + on='FORETAKS_NR', + how='left', +).drop(columns=['FORETAKS_NR']) +rgn39 = rgn39[["ORGNR", "TOT_UTG", "funksjon", "ORGNR_FORETAK", 'ID']].rename( + columns={ + "ORGNR": "ORGNR_VIRK", + "ORGNR_FORETAK": "ORGNR_FRTK", + "funksjon": "TJENESTE", + "TOT_UTG": "TOT_UTG_39", + "ID": "FORETAKSTYPE" + } +) +rgn39 = pd.merge( + rgn39, + oppslag, + on='ORGNR_VIRK', + how='left', + suffixes=("_skj39", "_vof") +) +import numpy as np +rgn39["ORGNR_FRTK"] = np.where( + rgn39["ORGNR_FRTK_skj39"].notnull(), + rgn39["ORGNR_FRTK_skj39"], + rgn39["ORGNR_FRTK_vof"], +) -# + -# fornummer = pd.Series(vof_for["FORETAKS_NR"]).array +rgn39.drop(columns=["ORGNR_FRTK_skj39", "ORGNR_FRTK_vof"], inplace=True) -# sporring_bed = f""" -# SELECT FORETAKS_NR, ORGNR, NAVN, KARAKTERISTIKK, SN07_1, SB_TYPE -# FROM DSBBASE.SSB_BEDRIFT -# WHERE STATUSKODE = 'B' AND FORETAKS_NR IN {sql_str} -# """ -# vof_bdr = les_sql(sporring_bed, conn) -# - -# Henter organisasjons- og foretaksnummer fra Virksomhets- og foretaksregisteret (VoF) og samler disse i én tabell kalt ```vof``` -# + -vof_for = vof_for.rename(columns={"NAVN": "NAVN_FORETAK", - "ORGNR": "ORGNR_FORETAK"}) +rgn39 = ( + rgn39.groupby(["ORGNR_FRTK", "TJENESTE", "FORETAKSTYPE"]) + .TOT_UTG_39.sum() + .reset_index() + .sort_values(["ORGNR_FRTK", "TJENESTE"]) +) -vof_bdr = vof_bdr.rename(columns={"ORGNR": "ORGNR_BEDRIFT"}) -vof_bdr["KARAKTERISTIKK"] = vof_bdr["KARAKTERISTIKK"].fillna("") -vof_bdr["NAVN_BEDRIFT"] = vof_bdr["NAVN"] + " " + vof_bdr["KARAKTERISTIKK"] +rgn39['FORETAKSTYPE'] = rgn39['FORETAKSTYPE'].replace("PRIVATE", "PRIVAT") -vof_bdr = vof_bdr.drop(columns=["NAVN", "KARAKTERISTIKK"]) +rapport_df(rgn39) -vof = pd.merge(vof_bdr, vof_for, how="left", on="FORETAKS_NR") -vof = vof.drop(columns=["FORETAKS_NR"]) +# ## Personell -rapporteringsenheter["ORGNR_FORETAK"] = rapporteringsenheter["ORGNR_FORETAK"].apply(str) -rapporteringsenheter_vof = pd.merge( - vof, rapporteringsenheter, how="left", on="ORGNR_FORETAK" +per = ( + per[['ORGNR_FRTK', 'TJENESTE_KODE', 'AARSVERK', 'FORETAKSTYPE']] + .groupby(['ORGNR_FRTK', 'TJENESTE_KODE', 'FORETAKSTYPE']).sum() + .reset_index() + .rename(columns={'TJENESTE_KODE': 'TJENESTE'}) ) -# - -# # Koble masterfiler med 24xx +per['FORETAKSTYPE'] = per['FORETAKSTYPE'].str.upper() -akt +rapport_df(per) -rgn39 +# # Merge alle fire mastertabeller på foretak -per.groupby("TJENESTE").sum(numeric_only=True) +dfs = [akt, rgn39, rgn0x, per] +import functools as ft +df_final = ft.reduce( + lambda left, right: pd.merge( + left, right, on=["ORGNR_FRTK", "TJENESTE", "FORETAKSTYPE"], how="outer" + ), + dfs, +) +df_final.columns +(df_final.ORGNR_FRTK == "").sum() +df_final = df_final.groupby(['ORGNR_FRTK', 'TJENESTE', 'FORETAKSTYPE']).sum().reset_index() +# + +sql_str = hjfunk.lag_sql_str(df_final.ORGNR_FRTK.unique()) +sporring_for = f""" + SELECT ORGNR, NAVN + FROM DSBBASE.SSB_FORETAK + WHERE STATUSKODE = 'B' AND ORGNR IN {sql_str} +""" +foretak_navn = hjfunk.les_sql(sporring_for, conn).rename(columns={'ORGNR': 'ORGNR_FRTK'}) +# - +df_final = pd.merge( + df_final, + foretak_navn, + on='ORGNR_FRTK', + how='left' +).copy() +df_final['TOT_UTG'] = df_final['TOT_UTG_39'] + df_final['TOT_UTG_0X'] +df_final = df_final[ + [ + "ORGNR_FRTK", + 'NAVN', + "TJENESTE", + "FORETAKSTYPE", + "UTSKRIVNINGER", + "OPPHOLDSDOGN", + "OPPHOLDSDAGER", + "POLIKLINIKK", + "DOGNPLASSER", + "SENGEDOGN", + "TOT_UTG", + "AARSVERK", + ] +] +verdi_kol = [ + "UTSKRIVNINGER", + "OPPHOLDSDOGN", + "OPPHOLDSDAGER", + "POLIKLINIKK", + "DOGNPLASSER", + "SENGEDOGN", + "TOT_UTG", + "AARSVERK", +] +df_final['sum_verdier_rad'] = round(df_final[verdi_kol].apply(abs).sum(axis=1), 1) +pd.options.display.float_format = '{:.1f}'.format +excel_ark = { + 'Populasjonsanalyse': df_final +} +lagre_excel(excel_ark, "/ssb/stamme01/fylkhels/speshelse/felles/populasjon/populasjonsanalyse.xlsx") @@ -297,32 +321,29 @@ def les_sql(sql_spørring, tilkobling): +# # Koble masterfiler med 24xx +# + +# sporring = f""" +# SELECT * +# FROM DSBBASE.DLR_ENHET_I_DELREG +# WHERE DELREG_NR IN ('24{aar2}') +# """ +# SFU_data = hjfunk.les_sql(sporring, conn) +# print(f"Rader: {SFU_data.shape[0]}\nKolonner: {SFU_data.shape[1]}") +# SFU_data.info() -# # Aktivitet: masterfil +# + +# pop = SFU_data.ORGNR.copy() +# - -# Spørsmål: -# - Det er 18 virksomheter uten ORGNR og NAVN. -# - Dubletter på ORGNR -rapporteringsvar_akt = ["UTSKRIVNINGER", "OPPHOLDSDOGN", "OPPHOLDSDAGER", "POLIKLINIKK", "DOGNPLASSER", "SENGEDOGN"] -akt -akt_gruppering = akt[['ORGNR_FORETAK'] + rapporteringsvar_akt].groupby(['ORGNR_FORETAK']).sum().reset_index().copy() -akt_gruppering['sum'] = akt_gruppering.sum(axis=1, numeric_only=True) -akt_gruppering -print("ORGNR som ikke har rapportert noe i 2022:") -akt_gruppering[akt_gruppering['sum'] == 0]['ORGNR_FORETAK'].to_numpy() -# Funn: -# - 922569738 SNUOM PSYKISK HELSE AS -# - 941455077 MEDI 3 AS -# - 971427396 STIFTELSEN NORDRE AASEN -# - 976724895 PTØ NORGE diff --git a/functions/hjelpefunksjoner.py b/functions/hjelpefunksjoner.py new file mode 100644 index 0000000..5e4f8cb --- /dev/null +++ b/functions/hjelpefunksjoner.py @@ -0,0 +1,52 @@ +import pandas as pd +import os + +def lagre_excel(dfs, sti, inkluder_indeks=False): + """ + Lagrer en eller flere DataFrames i en Excel-fil på den angitte banen (sti). + + Args: + dfs (dict): En dictionary der nøklene er arknavn og verdiene er DataFrames som skal lagres i Excel-filen. + sti (str): Stien til Excel-filen der DataFrames skal lagres. + inkluder_indeks (bool): Hvis True, inkluderer DataFrame-indeksen i Excel-filen. + + Eksempel: + For å lagre to DataFrames 'df1' og 'df2' i en Excel-fil 'eksempel.xlsx' på stien '/sti/til/fil/eksempel.xlsx': + + >>> import pandas as pd + >>> data1 = {'A': [1, 2, 3], 'B': [4, 5, 6]} + >>> data2 = {'X': [7, 8, 9], 'Y': [10, 11, 12]} + >>> df1 = pd.DataFrame(data1) + >>> df2 = pd.DataFrame(data2) + >>> dataframes = {'Ark1': df1, 'Ark2': df2} + >>> sti_til_fil = '/sti/til/fil/eksempel.xlsx' + >>> lagre_excel(dataframes, sti_til_fil) + + Funksjonen vil opprette en Excel-fil på '/sti/til/fil/eksempel.xlsx' og lagre 'df1' i 'Ark1'-arket og 'df2' i 'Ark2'-arket i filen. + Merk: + Arknavn som er lengre enn 30 tegn vil bli forkortet automatisk. + """ + # Opprett mappen hvis den ikke eksisterer + mappe_sti = os.path.dirname(sti) + if not os.path.exists(mappe_sti): + try: + os.makedirs(mappe_sti) + print(f"Opprettet mappen: {mappe_sti}") + except Exception as e: + print(f"Kunne ikke opprette mappen: {e}") + raise + + try: + with pd.ExcelWriter(sti, engine='openpyxl') as writer: + for arknavn, df in dfs.items(): + # Forkort arknavn hvis nødvendig + arknavn = (arknavn[:27] + '...') if len(arknavn) > 30 else arknavn + + df.to_excel(writer, sheet_name=arknavn, index=inkluder_indeks) + print(f"Arkfanen '{arknavn}' er lagret i filen.") + + except Exception as e: + print(f"Feil oppstod ved lagring av Excel-fil: {e}") + raise + + print(f"Excel-filen er lagret på sti: {sti}")