

from sqlalchemy import create_engine, types
import pandas as pd
import numpy as np

def create_connection():
    engine = create_engine(
        'mysql+pymysql://qvanderlinden:XEMFj9Y8ErKyyY6df2MK@dev.kurtosis.nl/venster_voor_bedrijfsvoering'
    )
    return engine

# Add calculations into new table

def add_calculated_columns():
    engine = create_connection()
    table_name = 'VVB_vragenlijst'
    
    # Loading data from MySQL table into Pandas DataFrame
    query = f"SELECT * FROM {table_name}"
    df = pd.read_sql(query, engine)

    #######################################################
    #   VRAGENLIJST VOORBEREKENINGEN
    #######################################################

    # v_apparaatskosten_per_inwoner
    df['v_apparaatskosten_per_inwoner'] = (
        df['werkelijke_apparaatskosten'].fillna(0) / df['aantal_inwoners'].fillna(0)
    ).round(4)

    # v_flexibiliteit_organisatie
    df['v_flexibiliteit_organisatie'] = (
        (df['aantal_fte_bepaalde_tijd'].fillna(0) + df['aantal_externe_inhuur_fte'].fillna(0)) / 
        (df['werkelijke_bezetting'].fillna(0) + df['aantal_externe_inhuur_fte'].fillna(0))
    ).round(4)

    # v_controleberekening_apparaatskosten
    df['v_controleberekening_apparaatskosten'] = (
        (df['totale_ict_kosten'].fillna(0) + df['totale_kosten_inhuur'].fillna(0) + df['totale_loonsom'].fillna(0) +
        df['huisvestingskosten_kantoorruimte'].fillna(0) + df['uitgaven_opleiding_ontwikkeling'].fillna(0)) -
        (df['ict_kosten_personeelskosten'].fillna(0) + df['ict_kosten_inhuur_uitbesteding'].fillna(0))
    ).round(4)

    # v_formatieve_omvang_fte_per_1000_inwoners
    df['v_formatieve_omvang_fte_per_1000_inwoners'] = (
        (df['formatieve_omvang'].fillna(0) / df['aantal_inwoners'].fillna(0)) * 1000
    ).round(4)

    # v_gemiddelde_loonsom_per_fte
    df['v_gemiddelde_loonsom_per_fte'] = (
        df['totale_loonsom'].fillna(0) / df['werkelijke_bezetting'].fillna(0)
    ).round(4)

    # v_ict_kosten_per_inwoner
    df['v_ict_kosten_per_inwoner'] = (
        df['totale_ict_kosten'].fillna(0) / df['aantal_inwoners'].fillna(0)
    ).round(4)

    # v_ict_kosten_per_medewerker
    df['v_ict_kosten_per_medewerker'] = (
        df['totale_ict_kosten'].fillna(0) / 
        (df['totaal_medewerkers'].fillna(0) + df['aantal_externe_inhuur_personen'].fillna(0))
    ).round(4)

    # v_optelsom_fte_salarisschalen
    df['v_optelsom_fte_salarisschalen'] = (
        df['aantal_fte_salarisschaal_1_6'].fillna(0) + df['aantal_fte_salarisschaal_7_9'].fillna(0) +
        df['aantal_fte_salarisschaal_10_12'].fillna(0) + df['aantal_fte_salarisschaal_13_hoger'].fillna(0) +
        df['aantal_fte_salarisschaal_onbekend'].fillna(0)
    ).round(4)

    # v_overige_ict_kosten
    df['v_overige_ict_kosten'] = (
        df['totale_ict_kosten'].fillna(0) - (
            df['ict_kosten_personeelskosten'].fillna(0) + df['ict_kosten_inhuur_uitbesteding'].fillna(0) + 
            df['ict_kosten_software'].fillna(0) + df['ict_kosten_hardware'].fillna(0) + 
            df['ict_kosten_telefonie_datacommunicatie'].fillna(0) + df['ict_kosten_afschrijvingen'].fillna(0)
        )
    ).round(4)

    # v_percentage_aanstellingen_bepaalde_tijd
    df['v_percentage_aanstellingen_bepaalde_tijd'] = (
        df['aantal_fte_bepaalde_tijd'].fillna(0) / df['werkelijke_bezetting'].fillna(0)
    ).round(4)

    # v_percentage_apparaatskosten
    df['v_percentage_apparaatskosten'] = (
        df['werkelijke_apparaatskosten'].fillna(0) / df['totaal_exploitatierekening'].fillna(0)
    ).round(4)

    # v_percentage_bedrijfsvoering
    df['v_percentage_bedrijfsvoering'] = (
        (
            df['formatieve_omvang_financien_toezicht_controle'].fillna(0) + 
            df['formatieve_omvang_p_o_hrm'].fillna(0) + 
            df['formatieve_omvang_inkoopfunctie'].fillna(0) + 
            df['formatieve_omvang_communicatiefunctie'].fillna(0) + 
            df['formatieve_omvang_juridische_zaken'].fillna(0) + 
            df['formatieve_omvang_ict'].fillna(0) + 
            df['formatieve_omvang_facilitaire_zaken'].fillna(0) + 
            df['formatieve_omvang_div'].fillna(0)
        ) / df['formatieve_omvang'].fillna(0)  # To avoid division by zero
    ).round(4)

    # v_percentage_bezetting
    df['v_percentage_bezetting'] = (
        df['werkelijke_bezetting'].fillna(0) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    # v_percentage_datafunctie
    df['v_percentage_datafunctie'] = (
        df['formatieve_omvang_datafuncties'].fillna(0) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    # v_percentage_externe_inhuur
    df['v_percentage_externe_inhuur'] = (
        df['totale_kosten_inhuur'].fillna(0) / 
        (df['totale_loonsom'].fillna(0) + df['totale_kosten_inhuur'].fillna(0))
    ).round(4)

    df['v_percentage_externe_inhuur'] = df['v_percentage_externe_inhuur'].replace(0, np.nan)
    df['v_percentage_externe_inhuur'] = df['v_percentage_externe_inhuur'].replace(1, np.nan)

    # v_percentage_huisvestingskosten
    df['v_percentage_huisvestingskosten'] = (
        df['huisvestingskosten_kantoorruimte'].fillna(0) / df['werkelijke_apparaatskosten'].fillna(0)
    ).round(4)

    # v_percentage_ict_kosten_exclusief_procesautomatisering
    df['v_percentage_ict_kosten_exclusief_procesautomatisering'] = (
        df['totale_ict_kosten'].fillna(0) / df['werkelijke_apparaatskosten'].fillna(0)
    ).round(4)

    # v_percentage_ict_kosten_inclusief_procesautomatisering
    df['v_percentage_ict_kosten_inclusief_procesautomatisering'] = (
        df['totale_ict_kosten_inclusief_procesautomatisering'].fillna(0) / df['werkelijke_apparaatskosten'].fillna(0)
    ).round(4)

    # v_percentage_instroom
    df['v_percentage_instroom'] = (
        df['medewerkers_in_dienst'].fillna(0) / df['totaal_medewerkers'].fillna(0)
    ).round(4)

    # v_percentage_medewerkers_met_afstand_tot_arbeidsmarkt
    df['v_percentage_medewerkers_met_afstand_tot_arbeidsmarkt'] = (
        df['aantal_medewerkers_met_afstand_tot_arbeidsmarkt_op_31_dec'].fillna(0) / df['totaal_medewerkers'].fillna(0)
    ).round(4)

    # v_percentage_overheadkosten_excl_ict
    df['v_percentage_overheadkosten_excl_ict'] = (
        (
            (
                (
                    (
                        (
                            df['formatieve_omvang_leidinggevenden_hele_organisatie'].fillna(0) +
                            df['formatieve_omvang_financien_toezicht_controle'].fillna(0) +
                            df['formatieve_omvang_p_o_hrm'].fillna(0) +
                            df['formatieve_omvang_inkoopfunctie'].fillna(0) +
                            df['formatieve_omvang_communicatiefunctie'].fillna(0) +
                            df['formatieve_omvang_juridische_zaken'].fillna(0) +
                            df['formatieve_omvang_bestuurszaken'].fillna(0) +
                            df['formatieve_omvang_facilitaire_zaken'].fillna(0) +
                            df['formatieve_omvang_managementondersteuning_hele_organisatie'].fillna(0) +
                            df['formatieve_omvang_div'].fillna(0)
                        ) - 
                        df['formatieve_omvang_leidinggevenden_bedrijfsvoering'].fillna(0) -
                        df['formatieve_omvang_managementondersteuning_bedrijfsvoering'].fillna(0)
                    ) * 
                    (df['totale_loonsom'].fillna(0) / df['werkelijke_bezetting'].fillna(0))
                ) +
                df['kosten_inhuur_uitbesteding_overhead'].fillna(0)
            ) / 
            df['werkelijke_apparaatskosten'].fillna(0)).round(4))


    # v_percentage_uitgaven_opleiding_ontwikkeling
    df['v_percentage_uitgaven_opleiding_ontwikkeling'] = (
        df['uitgaven_opleiding_ontwikkeling'].fillna(0) / df['totale_loonsom'].fillna(0)
    ).round(4)

    # v_percentage_uitstroom
    df['v_percentage_uitstroom'] = (
        df['medewerkers_vertrokken'].fillna(0) / df['totaal_medewerkers'].fillna(0)
    ).round(4)

    # v_ruimtebeslag_kantoorruimte_per_fte
    df['v_ruimtebeslag_kantoorruimte_per_fte'] = (
        df['verhuurbaar_vloeroppervlak'].fillna(0) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    # v_som_medewerkers_leeftijdscategorie
    df['v_som_medewerkers_leeftijdscategorie'] = (
        df['medewerkers_tot_35_jaar'].fillna(0) + 
        df['medewerkers_35_45_jaar'].fillna(0) + 
        df['medewerkers_45_55_jaar'].fillna(0) + 
        df['medewerkers_55_ouder'].fillna(0)
    ).round(4)

    # v_span_of_control
    df['v_span_of_control'] = (
        (df['totaal_medewerkers'] - df['aantal_leidinggevende_medewerkers_op_31_dec']) / 
        df['aantal_leidinggevende_medewerkers_op_31_dec']
    ).round(4)

    # v_te_servicen_medewerkers
    df['v_te_servicen_medewerkers'] = (
        df['totaal_medewerkers'].fillna(0) + df['aantal_externe_inhuur_personen'].fillna(0)
    ).round(4)

    # v_totaal_fte_bedrijfsvoering
    df['v_totaal_fte_bedrijfsvoering'] = (
        df['formatieve_omvang_financien_toezicht_controle'].fillna(0) + 
        df['formatieve_omvang_p_o_hrm'].fillna(0) + 
        df['formatieve_omvang_inkoopfunctie'].fillna(0) + 
        df['formatieve_omvang_communicatiefunctie'].fillna(0) + 
        df['formatieve_omvang_juridische_zaken'].fillna(0) + 
        df['formatieve_omvang_ict'].fillna(0) + 
        df['formatieve_omvang_facilitaire_zaken'].fillna(0) + 
        df['formatieve_omvang_div'].fillna(0)
    ).round(4)

    # v_totaal_fte_overhead
    df['v_totaal_fte_overhead'] = (
        df['formatieve_omvang_leidinggevenden_hele_organisatie'].fillna(0) + 
        df['formatieve_omvang_financien_toezicht_controle'].fillna(0) + 
        df['formatieve_omvang_p_o_hrm'].fillna(0) + 
        df['formatieve_omvang_inkoopfunctie'].fillna(0) + 
        df['formatieve_omvang_communicatiefunctie'].fillna(0) + 
        df['formatieve_omvang_juridische_zaken'].fillna(0) + 
        df['formatieve_omvang_bestuurszaken'].fillna(0) + 
        df['formatieve_omvang_ict'].fillna(0) + 
        df['formatieve_omvang_facilitaire_zaken'].fillna(0) + 
        df['formatieve_omvang_managementondersteuning_hele_organisatie'].fillna(0) + 
        df['formatieve_omvang_div'].fillna(0) - 
        df['formatieve_omvang_leidinggevenden_bedrijfsvoering'].fillna(0) - 
        df['formatieve_omvang_managementondersteuning_bedrijfsvoering'].fillna(0)
    ).round(4)

    # v_totale_ict_kosten_categorien
    df['v_totale_ict_kosten_categorien'] = (
        df['ict_kosten_personeelskosten'].fillna(0) + 
        df['ict_kosten_inhuur_uitbesteding'].fillna(0) + 
        df['ict_kosten_software'].fillna(0) + 
        df['ict_kosten_hardware'].fillna(0) + 
        df['ict_kosten_afschrijvingen'].fillna(0) + 
        df['ict_kosten_telefonie_datacommunicatie'].fillna(0)
    ).round(4)

    # v_percentage_overheadformatie
    df['v_percentage_overheadformatie'] = (
        (
            df['formatieve_omvang_financien_toezicht_controle'].fillna(0) +
            df['formatieve_omvang_leidinggevenden_hele_organisatie'].fillna(0) +
            df['formatieve_omvang_p_o_hrm'].fillna(0) +
            df['formatieve_omvang_inkoopfunctie'].fillna(0) +
            df['formatieve_omvang_communicatiefunctie'].fillna(0) +
            df['formatieve_omvang_juridische_zaken'].fillna(0) +
            df['formatieve_omvang_bestuurszaken'].fillna(0) +
            df['formatieve_omvang_ict'].fillna(0) +
            df['formatieve_omvang_facilitaire_zaken'].fillna(0) +
            df['formatieve_omvang_managementondersteuning_hele_organisatie'].fillna(0) +
            df['formatieve_omvang_div'].fillna(0) -
            df['formatieve_omvang_leidinggevenden_bedrijfsvoering'].fillna(0) -
            df['formatieve_omvang_managementondersteuning_bedrijfsvoering'].fillna(0)
        ) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    df['v_percentage_overheadformatie'] = df['v_percentage_overheadformatie'].replace(0, np.nan)


    # v_totale_overheadkosten_excl_ict
    df['v_totale_overheadkosten_excl_ict'] = (
        (
            (
                df['formatieve_omvang_leidinggevenden_hele_organisatie'].fillna(0) + 
                df['formatieve_omvang_financien_toezicht_controle'].fillna(0) + 
                df['formatieve_omvang_p_o_hrm'].fillna(0) + 
                df['formatieve_omvang_inkoopfunctie'].fillna(0) + 
                df['formatieve_omvang_communicatiefunctie'].fillna(0) + 
                df['formatieve_omvang_juridische_zaken'].fillna(0) + 
                df['formatieve_omvang_bestuurszaken'].fillna(0) + 
                df['formatieve_omvang_facilitaire_zaken'].fillna(0) + 
                df['formatieve_omvang_managementondersteuning_hele_organisatie'].fillna(0) + 
                df['formatieve_omvang_div'].fillna(0) - 
                df['formatieve_omvang_leidinggevenden_bedrijfsvoering'].fillna(0) - 
                df['formatieve_omvang_managementondersteuning_bedrijfsvoering'].fillna(0)
            ) * (df['totale_loonsom'].fillna(0) / df['werkelijke_bezetting'].fillna(0))
        ) + df['kosten_inhuur_uitbesteding_overhead'].fillna(0)
    ).round(4)

    # v_uitgaven_verbonden_partijen_per_inwoner
    df['v_uitgaven_verbonden_partijen_per_inwoner'] = (
        df['totale_kosten_verbonden_partijen'].fillna(0) / df['aantal_inwoners'].fillna(0)
    ).round(4)

    # v_uitgaven_verbonden_partijen_tov_totale_begroting
    df['v_uitgaven_verbonden_partijen_tov_totale_begroting'] = (
        df['totale_kosten_verbonden_partijen'].fillna(0) / df['totaal_exploitatierekening'].fillna(0)
    ).round(4)

    # v_werkplekindex
    df['v_werkplekindex'] = (
        df['beschikbare_werkplekken'].fillna(0) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    # v_werkplekken_per_te_servicen_medewerker
    df['v_werkplekken_per_te_servicen_medewerker'] = (
        df['beschikbare_werkplekken'].fillna(0) / 
        (df['totaal_medewerkers'].fillna(0) + df['aantal_externe_inhuur_personen'].fillna(0))
    ).round(4)

    # Dashboard Calculations
    df['d_short_long_ratio'] = (
    (df['totaal_medewerkers'].fillna(0) - (df['dienstverband_korter_dan_3_jaar'].fillna(0) + df['dienstverband_10_jaar_of_langer'].fillna(0))) / df['totaal_medewerkers'].fillna(0)
    ).round(4)

    df['d_long_ratio'] = (
        df['dienstverband_10_jaar_of_langer'].fillna(0) / df['totaal_medewerkers'].fillna(0)
    ).round(4)

    df['d_short_ratio'] = (
        df['dienstverband_korter_dan_3_jaar'].fillna(0) / df['totaal_medewerkers'].fillna(0)
    ).round(4)

    df['d_safety_cost_ratio'] = (
        df['totale_kosten_veiligheidsregio_verbonden_partij'].fillna(0) / df['totaal_exploitatierekening'].fillna(0)
    ).round(4)

    df['d_other_party_cost_ratio'] = (
        (df['totale_kosten_verbonden_partijen'].fillna(0) - df['totale_kosten_omgevingsdienst_verbonden_partij'].fillna(0) - df['totale_kosten_veiligheidsregio_verbonden_partij'].fillna(0) - df['totale_kosten_GGD_verbonden_partij'].fillna(0)) / df['totaal_exploitatierekening'].fillna(0)
    ).round(4)

    df['d_env_service_cost_ratio'] = (
        df['totale_kosten_omgevingsdienst_verbonden_partij'].fillna(0) / df['totaal_exploitatierekening'].fillna(0)
    ).round(4)

    df['d_health_service_cost_ratio'] = (
        df['totale_kosten_GGD_verbonden_partij'].fillna(0) / df['totaal_exploitatierekening'].fillna(0)
    ).round(4)

    df['d_ext_hire_ratio'] = (
        df['aantal_externe_inhuur_personen'].fillna(0) / df['v_te_servicen_medewerkers'].fillna(0)
    ).round(4)

    df['d_internal_abs'] = (
        df['v_te_servicen_medewerkers'].fillna(0) - df['aantal_externe_inhuur_personen'].fillna(0)
    ).round(4)

    df['d_non_ext_hire_ratio'] = (
        1 - df['aantal_externe_inhuur_personen'].fillna(0) / df['v_te_servicen_medewerkers'].fillna(0)
    ).round(4)

    df['d_software_cost_ratio'] = (
        df['ict_kosten_software'].fillna(0) / df['v_te_servicen_medewerkers'].fillna(0)
    ).round(4)

    df['d_hardware_cost_ratio'] = (
        df['ict_kosten_hardware'].fillna(0) / df['v_te_servicen_medewerkers'].fillna(0)
    ).round(4)

    df['d_deprec_cost_ratio'] = (
        df['ict_kosten_afschrijvingen'].fillna(0) / df['v_te_servicen_medewerkers'].fillna(0)
    ).round(4)

    df['d_outsource_cost_ratio'] = (
        df['ict_kosten_inhuur_uitbesteding'].fillna(0) / df['v_te_servicen_medewerkers'].fillna(0)
    ).round(4)

    df['d_other_ict_cost_ratio'] = (
        df['v_overige_ict_kosten'].fillna(0) / df['v_te_servicen_medewerkers'].fillna(0)
    ).round(4)

    df['d_ict_staff_cost_ratio'] = (
        df['ict_kosten_personeelskosten'].fillna(0) / df['v_te_servicen_medewerkers'].fillna(0)
    ).round(4)

    df['d_telecom_cost_ratio'] = (
        df['ict_kosten_telefonie_datacommunicatie'].fillna(0) / df['v_te_servicen_medewerkers'].fillna(0)
    ).round(4)

    # Department ratios
    df['d_comm_ratio'] = (
        df['formatieve_omvang_communicatiefunctie'].fillna(0) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    df['d_div_ratio'] = (
        df['formatieve_omvang_div'].fillna(0) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    df['d_facilities_ratio'] = (
        df['formatieve_omvang_facilitaire_zaken'].fillna(0) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    df['d_finance_ratio'] = (
        df['formatieve_omvang_financien_toezicht_controle'].fillna(0) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    df['d_procure_ratio'] = (
        df['formatieve_omvang_inkoopfunctie'].fillna(0) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    df['d_legal_ratio'] = (
        df['formatieve_omvang_juridische_zaken'].fillna(0) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    df['d_hrm_ratio'] = (
        df['formatieve_omvang_p_o_hrm'].fillna(0) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    df['d_ict_ratio'] = (
        df['formatieve_omvang_ict'].fillna(0) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    df['d_gov_support_ratio'] = (
        df['formatieve_omvang_bestuurszaken'].fillna(0) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    df['d_line_manager_ratio'] = (
        (df['formatieve_omvang_leidinggevenden_hele_organisatie'].fillna(0) - df['formatieve_omvang_leidinggevenden_bedrijfsvoering'].fillna(0)) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    df['d_mgmt_support_ratio'] = (
        (df['formatieve_omvang_managementondersteuning_hele_organisatie'].fillna(0) - df['formatieve_omvang_managementondersteuning_bedrijfsvoering'].fillna(0)) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    # Salary scale ratios
    df['d_salary_1_6_ratio'] = (
        df['aantal_fte_salarisschaal_1_6'].fillna(0) / df['v_optelsom_fte_salarisschalen'].fillna(0)
    ).round(4)

    df['d_salary_10_12_ratio'] = (
        df['aantal_fte_salarisschaal_10_12'].fillna(0) / df['v_optelsom_fte_salarisschalen'].fillna(0)
    ).round(4)

    df['d_salary_13_up_ratio'] = (
        df['aantal_fte_salarisschaal_13_hoger'].fillna(0) / df['v_optelsom_fte_salarisschalen'].fillna(0)
    ).round(4)

    df['d_salary_7_9_ratio'] = (
        df['aantal_fte_salarisschaal_7_9'].fillna(0) / df['v_optelsom_fte_salarisschalen'].fillna(0)
    ).round(4)

    df['d_unknown_salary_ratio'] = (
        df['aantal_fte_salarisschaal_onbekend'].fillna(0) / df['v_optelsom_fte_salarisschalen'].fillna(0)
    ).round(4)

    # Age category ratios
    df['d_under_35_ratio'] = (
        df['medewerkers_tot_35_jaar'].fillna(0) / df['v_som_medewerkers_leeftijdscategorie'].fillna(0)
    ).round(4)

    df['d_over_55_ratio'] = (
        df['medewerkers_55_ouder'].fillna(0) / df['v_som_medewerkers_leeftijdscategorie'].fillna(0)
    ).round(4)

    df['d_age_35_45_ratio'] = (
        df['medewerkers_35_45_jaar'].fillna(0) / df['v_som_medewerkers_leeftijdscategorie'].fillna(0)
    ).round(4)

    df['d_age_45_55_ratio'] = (
        df['medewerkers_45_55_jaar'].fillna(0) / df['v_som_medewerkers_leeftijdscategorie'].fillna(0)
    ).round(4)

    
    # Sort the DataFrame by VVB_id and year to ensure proper alignment
    df = df.sort_values(by=['VVB_id', 'year'])
    # Calculate last year's formatieve_omvang
    df['lastyear_formatieve_omvang'] = df.groupby('VVB_id')['formatieve_omvang'].shift(1)
    # Calculate mutatie_formatie
    df['d_mutatie_formatie'] = (df['formatieve_omvang'] - df['lastyear_formatieve_omvang']) / df['lastyear_formatieve_omvang']
    # Replace infinite values with NaN (this can occur if lastyear_formatieve_omvang is 0)
    df['d_mutatie_formatie'].replace([float('inf'), -float('inf')], float('nan'), inplace=True)

    # Sanity Check: Replace infinity values with NaN
    df = df.replace([np.inf, -np.inf], np.nan)
    
    # Select only the required columns
    df_subset = df[['VVB_id', 'year',
    'd_short_long_ratio',
    'd_long_ratio',
    'd_short_ratio',
    'd_safety_cost_ratio',
    'd_other_party_cost_ratio',
    'd_env_service_cost_ratio',
    'd_health_service_cost_ratio',
    'd_ext_hire_ratio',
    'd_internal_abs',
    'd_non_ext_hire_ratio',
    'd_software_cost_ratio',
    'd_hardware_cost_ratio',
    'd_deprec_cost_ratio',
    'd_outsource_cost_ratio',
    'd_other_ict_cost_ratio',
    'd_ict_staff_cost_ratio',
    'd_telecom_cost_ratio',
    'd_comm_ratio',
    'd_div_ratio',
    'd_facilities_ratio',
    'd_finance_ratio',
    'd_procure_ratio',
    'd_legal_ratio',
    'd_hrm_ratio',
    'd_gov_support_ratio',
    'd_line_manager_ratio',
    'd_mgmt_support_ratio',
    'd_salary_1_6_ratio',
    'd_salary_10_12_ratio',
    'd_salary_13_up_ratio',
    'd_salary_7_9_ratio',
    'd_unknown_salary_ratio',
    'd_under_35_ratio',
    'd_over_55_ratio',
    'd_age_35_45_ratio',
    'd_age_45_55_ratio',
    'd_ict_ratio',
    'd_mutatie_formatie',
    'v_apparaatskosten_per_inwoner',
    'v_flexibiliteit_organisatie',
    'v_controleberekening_apparaatskosten',
    'v_formatieve_omvang_fte_per_1000_inwoners',
    'v_gemiddelde_loonsom_per_fte',
    'v_ict_kosten_per_inwoner',
    'v_ict_kosten_per_medewerker',
    'v_optelsom_fte_salarisschalen',
    'v_overige_ict_kosten',
    'v_percentage_aanstellingen_bepaalde_tijd',
    'v_percentage_apparaatskosten',
    'v_percentage_bedrijfsvoering',
    'v_percentage_bezetting',
    'v_percentage_datafunctie',
    'v_percentage_externe_inhuur',
    'v_percentage_huisvestingskosten',
    'v_percentage_ict_kosten_exclusief_procesautomatisering',
    'v_percentage_ict_kosten_inclusief_procesautomatisering',
    'v_percentage_instroom',
    'v_percentage_medewerkers_met_afstand_tot_arbeidsmarkt',
    'v_percentage_overheadformatie',
    'v_percentage_overheadkosten_excl_ict',
    'v_percentage_uitgaven_opleiding_ontwikkeling',
    'v_percentage_uitstroom',
    'v_ruimtebeslag_kantoorruimte_per_fte',
    'v_som_medewerkers_leeftijdscategorie',
    'v_span_of_control',
    'v_te_servicen_medewerkers',
    'v_totaal_fte_bedrijfsvoering',
    'v_totaal_fte_overhead',
    'v_totale_ict_kosten_categorien',
    'v_totale_overheadkosten_excl_ict',
    'v_uitgaven_verbonden_partijen_per_inwoner',
    'v_uitgaven_verbonden_partijen_tov_totale_begroting',
    'v_werkplekindex',
    'v_werkplekken_per_te_servicen_medewerker']]

    column_names = list(df_subset.columns)
    
    # Create dtype dictionary
    dtype = {col: types.FLOAT for col in column_names}
    dtype['VVB_id'] = types.INTEGER
    dtype['year'] = types.INTEGER
    
    # Saving the updated DataFrame back to the database
    df_subset.to_sql(name='VVB_calculations', con=engine, if_exists='replace', index=False, dtype=dtype)

    pd.set_option('display.max_columns', None)  # Show all columns
    pd.set_option('display.width', None)        # Adjust the width to fit the content

    # Filter the DataFrame for the specified conditions
    filtered_df = df[(df['year'] == 2023) & (df['VVB_id'] == 6036)]

    # Specify the columns you want to display
    columns_to_display2 = ['werkelijke_apparaatskosten', 'aantal_inwoners']

    # Display the filtered rows with the specified columns
    print(filtered_df[columns_to_display2])

if __name__ == '__main__':
    add_calculated_columns()
