<jupyter_start><jupyter_text>Logisk imputeringLogisk imputering er å tilordne en variabel en verdi utledet fra logiske regler:- Hvis betingelse er sann, så skal verdi A settes: when(betingelse, A)- Hvis  betingelse er sann, så skal verdi A settes, hvis ikke, så skal verdi B settes: when(betingelse, A).otherwise(B)  Funksjoner for logisk imputeringDet er blitt laget tre funksjonene i Pyspark som henholdsvis endrer en negativ verdi til tallet 0, en negativ verdi til positiv verdi, og en missingverdi til tallet 0. Selve koden finnes i neste paragraf og eksempler på hvordan de brukes finnes lenger ned i noten: set_neg_to_zero(df, col_names): set_neg_to_plus(df, col_names): set_miss_to_zero(df, col_names):<jupyter_code>def set_neg_to_zero(df, col_names):
    for col_name in col_names:
            df = df.withColumn(col_name, F.when(df[col_name]<0, F.lit(0))\
            .otherwise(df[col_name]))
    return df
    
def set_neg_to_plus(df, col_names):
    for col_name in col_names:
            df = df.withColumn(col_name, F.when(df[col_name]<0, F.abs(df[col_name]))\
            .otherwise(df[col_name]))
    return df
    
def set_miss_to_zero(df, col_names):
    for col_name in col_names:
        df = df.withColumn(col_name, F.when(df[col_name].isNull(), F.lit(0))\
        .otherwise(df[col_name]))
    return df<jupyter_output><empty_output><jupyter_text>Importere biblioteker (kode)<jupyter_code>from pyspark.sql import DataFrame
import pyspark.sql.functions as F<jupyter_output><empty_output><jupyter_text>Hente eksempeldata (kode)<jupyter_code>df_areal = spark.read.path("/felles/veiledning/pyspark/eksempler/areal")
df_bnp = spark.read.path("/felles/veiledning/pyspark/eksempler/bnp")
df_innbyggerantall_2020 = spark.read.path("/felles/veiledning/pyspark/eksempler/innbyggerantall/2020")
df_innbyggerantall_2018 = spark.read.path("/felles/veiledning/pyspark/eksempler/innbyggerantall/2018")<jupyter_output><empty_output><jupyter_text>Koble innbyggerantall på arealdatasett (koblingsnøkkel er Landkode) til bruk for å illustrere logisk imputering (kode)<jupyter_code>df_areal_lite = df_areal.select('Landkode','Areal').withColumnRenamed('Landkode','Lkode')
df_areal_innbyggerantall_20 = df_areal_lite.join(df_innbyggerantall_2020.select('Landkode','Innbyggerantall'), df_areal_lite.Lkode == df_innbyggerantall_2020.Landkode, how='left')
df_areal_innbyggerantall_20.show()<jupyter_output><empty_output><jupyter_text>Erstatte missing-verdier i innbyggertall med null ved bruk av logisk betingelse (kode)<jupyter_code>df_areal_innbyggerantall_imp = df_areal_innbyggerantall_20.withColumn('Innbyggere', F.when(df_areal_innbyggerantall_20['Innbyggerantall'].isNull(),F.lit(0)).otherwise(df_areal_innbyggerantall_20['Innbyggerantall']))
df_areal_innbyggerantall_imp.filter(df_areal_innbyggerantall_imp.Innbyggerantall.isNull()).show()<jupyter_output><empty_output><jupyter_text>Erstatte missing-verdier i innbyggertall ved bruk av funksjonen set_miss_to_zero (kode)<jupyter_code>df_areal_innbyggerantall_imp2 = set_miss_to_zero(df_areal_innbyggerantall_20, ['Innbyggerantall'])
df_areal_innbyggerantall_imp2.filter(df_areal_innbyggerantall_imp2.Lkode.isin(['RO','GL','CZ','SK'])).show()<jupyter_output><empty_output><jupyter_text>Erstatte negativ verdi i bnp med 0 ved bruk av logisk regel (kode)<jupyter_code>df_bnp_imp = df_bnp.withColumn('BNPimp', F.when(df_bnp['BNP']<0,F.lit(0)).otherwise(df_bnp['BNP']))
df_bnp_imp.filter(df_bnp_imp['BNP'] < 0).show()<jupyter_output><empty_output><jupyter_text>Erstatte negativ verdi i bnp med 0 ved bruk av funksjonen set_neg_to_zero (kode)<jupyter_code>df_bnp_imp2 = set_neg_to_zero(df_bnp,['BNP'])
df_bnp_imp2.filter(df_bnp_imp2.Landkode.isin(['PT','SI'])).show()<jupyter_output><empty_output><jupyter_text>Erstatte negativ verdi av bnp med absoluttverdien ved bruk av logisk regel (kode)<jupyter_code>df_bnp_imp_abs = df_bnp.withColumn('BNPpos',F.when(df_bnp['BNP']<0, F.abs(df_bnp['BNP']))\
            .otherwise(df_bnp['BNP']))
df_bnp_imp_abs.filter(df_bnp_imp2.Landkode.isin(['PT','SI'])).show()<jupyter_output><empty_output><jupyter_text>Erstatte negativ verdi med absoluttverdien ved bruk av funksjonen set_neg_to_plus (kode)<jupyter_code>df_bnp_imp_abs2 = set_neg_to_plus(df_bnp,['BNP'])
df_bnp_imp_abs2.filter(df_bnp_imp2.Landkode.isin(['PT','SI'])).show()<jupyter_output><empty_output><jupyter_text>Lage datasett til bruk i eksempel på historisk imputering.Først lages et mindre datasett over innbyggerantall i fire land i 2020. Deretter kobles et datsett med tall fra 2020 og et med tall fra 2018 sammen i neste paragraf. Variablene på datasettet fra 2018 gis nye navn.<jupyter_code>df_innbyggerantall_2020_lite = df_innbyggerantall_2020.select(df_innbyggerantall_2020.columns).filter(df_innbyggerantall_2020.Landkode.isin(['FO','SE','BE','DK']))
df_innbyggerantall_2020_lite.show()
df_innbyggere_2018 = df_innbyggerantall_2018.withColumnRenamed('Innbyggerantall','Innbyggerantall_2018').withColumnRenamed('År','Årstall').withColumnRenamed('Kilde','Kilde_2018').withColumnRenamed('Landkode','Landkode_2018')
df_innbyggere_2020_2018 = df_innbyggerantall_2020_lite.join(df_innbyggere_2018, 'Land', 'left')
df_innbyggere_2020_2018.show()<jupyter_output><empty_output><jupyter_text>Til slutt lages et nytt datasett der verdier fra variablene fra 2018-datasettet er satt inn for verdiene der innbyggerantallet var 0.Samtidig settes årstallet lik 2018 der vi har imputert 2018-tall og kilden endres til kilden fra 2018.<jupyter_code>df_midl = df_innbyggere_2020_2018.withColumn('Innbyggere', F.when(df_innbyggere_2020_2018['Innbyggerantall'] <= 0, df_innbyggere_2020_2018['Innbyggerantall_2018']).otherwise(df_innbyggere_2020_2018['Innbyggerantall']))\
                                 .withColumn('Aar', F.when(df_innbyggere_2020_2018['Innbyggerantall'] <= 0, df_innbyggere_2020_2018['Årstall']).otherwise(df_innbyggere_2020_2018['År'])) \
                                 .withColumn('Kilde_ny', F.when(df_innbyggere_2020_2018['Innbyggerantall'] <= 0, df_innbyggere_2020_2018['Kilde_2018']).otherwise(df_innbyggere_2020_2018['Kilde']))
    
df_innbyggere_imp = df_midl.select(['Land','Innbyggere','Aar','Kilde_ny']).withColumnRenamed('Innbyggere','Innbyggerantall').withColumnRenamed('Aar','År').withColumnRenamed('Kilde_ny','Kilde')
df_innbyggere_imp.show(10,False)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11717521233092168, 'fraction_numerical': 0.03916325888644228, 'mean_word_length': 7.956338028169014, 'pattern_counts': {'":': 0, '<': 57, '<?xml version=': 0, '>': 49, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '12', 'dir': 'jupyter-structured-clean-dedup', 'id': '332979', 'license': 'CC0-1.0', 'n_tokens_mistral': 2793, 'n_tokens_neox': 2534, 'n_words': 367, 'path': 'notebooks/Funksjoner i klargjøring/Logisk imputering.ipynb', 'repo_name': 'statisticsnorway/kurs-ssb-dapla-veileder', 'size': '6358'}