<filename>ssb_fellesfunksjoner_360/sporre.py
# AUTOGENERATED! DO NOT EDIT! File to edit: 03_sporre.ipynb (unless otherwise specified).

__all__ = ['avled_tverrvar']

# Cell
#dapla
def avled_tverrvar(codeprefix, coderange, lettercodes, df):

    """
    Denne funksjonen sjekker en bred range av kode-kolonner, og slår disse sammen til en oppsummeringskolonne.\n
    Forutsetningen er at det er lignende svaralternativer på ulike spørsmål som man skal gå gjennom og at de "Or-es", dvs True på 1 er True på den avledete variabelen.\n
    F.eks. 17 spørsmål om fjernsynskanaler, hvor man spør etter 21 ulike programtyper. Og man ønsker å svare på: 'Så denne personen på denne typen program i det hele tatt?'\n


    Parameters
    ----------
    first "codeprefix" : string\n
        Første parameter er en string som er prefikset til kolonnene, feks. 'fje10_'
    second "coderange" : integer\n
        Andre parameter er ett tall som sier hvor mange kolonner som er nummerert.
        Om du sender 17 så vil den ta alle tallene som er 1-17 og da lage kolonneheadere som 'fje10_17x'
    third "lettercodes" : dict\n
        Det tredje parameteret skal være en dict, som forteller om hvilket svaralternativ skal bli til hvilken nye kolonne.
        feks. 'a' : 'tvsport', hvor svaralternativ 'a' på alle kanaler, skal bli 'eller'-t til en avledet variabelkolonne 'tvsport'
    fourth "df" : Pandas Dataframe\n
        Det fjerde parameteret skal være dataframen som vi opererer på.

    Returns
    -------
    DataFrame\n
        Returnerer dataframen som kom inn, med ny avledet kolonne.

    Raises
    ------
    ValueError\n
        Om noen av variablene inn ikke stemmer med forventede typer.
        Om dataframen er 0 rader lang.
    KeyError\n
        Om noen av kolonnene det letes i, ikke finnes.
        Om noen av kolonnene som burde vært opprettet, ikke er der på slutten av funksjonen.
    """

    # Imports, do we trust the user?
    import pandas as pd

    # Typechecking
    if not isinstance(codeprefix, str):
        raise ValueError('Første variabel må være en string som er prefikset til koden, feks "fje10_"')
    if not isinstance(coderange, int):
        raise ValueError('Andre variabel må være en integer som sier hvor langt kodene går fra 1, feks. 1-17 så skal den være 17.')
    if not isinstance(lettercodes, dict):
        raise ValueError('Tredje variabel må være en dictionary som linker bokstaver til kolonne-header-variabler. Feks. {"a" : "tvsport"} osv.')
    if not isinstance(df, pd.DataFrame):
        raise ValueError('Fjerde variabel må være hoveddataframen som skal opereres på.')
    # Om dataframen er tom, så er det jo ikke vits å gjøre noe
    if not len(df):
        raise ValueError('Dataframen i fjerde varabel er tom, da er det jo ikke noe poeng å gjøre dette...')


    # Loop gjennom dictionary av koder -> variabel
    for key, item in lettercodes.items():
        # Lag en liste for hver av nummerene i rangen, legg til en kode formatert med range-nummer og bokstavnøkkel i listen vi initierte over
        check = [f'{codeprefix}{i}{key}' for i in range(1, coderange+1)]

        # Sjekk om alle kolonnene vi skal se i faktisk er i dataframen
        if not all(elem in df.columns for elem in check):
            raise KeyError(f'Finner ikke alle kolonnen i listen i dataframen:\n{check}')

        # Potensiell kode for å sjekke noen av kolonnene inneholder True,
        # om de gjør det, sett ny kolonne samme som "item" (tvsport feks) til True
        df.loc[df[check].any(), item] = True

    # Test at alle kolonnene i dict-items er nå i dataframen?
    if not all(elem in df.columns for elem in lettercodes.values()):
        raise KeyError(f'Finner ikke igjen alle kolonnene som nå burde ligget i dataframen:\n{lettercodes.values()}')

    return df
<filename>ssb_fellesfunksjoner_360/sporre.py
# AUTOGENERATED! DO NOT EDIT! File to edit: 03_sporre.ipynb (unless otherwise specified).

__all__ = ['avled_tverrvar']

# Cell
#dapla
def avled_tverrvar(codeprefix, coderange, lettercodes, df):

    """
    Denne funksjonen sjekker en bred range av kode-kolonner, og slår disse sammen til en oppsummeringskolonne.\n
    Forutsetningen er at det er lignende svaralternativer på ulike spørsmål som man skal gå gjennom og at de "Or-es", dvs True på 1 er True på den avledete variabelen.\n
    F.eks. 17 spørsmål om fjernsynskanaler, hvor man spør etter 21 ulike programtyper. Og man ønsker å svare på: 'Så denne personen på denne typen program i det hele tatt?'\n


    Parameters
    ----------
    first "codeprefix" : string\n
        Første parameter er en string som er prefikset til kolonnene, feks. 'fje10_'
    second "coderange" : integer\n
        Andre parameter er ett tall som sier hvor mange kolonner som er nummerert.
        Om du sender 17 så vil den ta alle tallene som er 1-17 og da lage kolonneheadere som 'fje10_17x'
    third "lettercodes" : dict\n
        Det tredje parameteret skal være en dict, som forteller om hvilket svaralternativ skal bli til hvilken nye kolonne.
        feks. 'a' : 'tvsport', hvor svaralternativ 'a' på alle kanaler, skal bli 'eller'-t til en avledet variabelkolonne 'tvsport'
    fourth "df" : Pandas Dataframe\n
        Det fjerde parameteret skal være dataframen som vi opererer på.

    Returns
    -------
    DataFrame\n
        Returnerer dataframen som kom inn, med ny avledet kolonne.

    Raises
    ------
    ValueError\n
        Om noen av variablene inn ikke stemmer med forventede typer.
        Om dataframen er 0 rader lang.
    KeyError\n
        Om noen av kolonnene det letes i, ikke finnes.
        Om noen av kolonnene som burde vært opprettet, ikke er der på slutten av funksjonen.
    """

    # Imports, do we trust the user?
    import pandas as pd

    # Typechecking
    if not isinstance(codeprefix, str):
        raise ValueError('Første variabel må være en string som er prefikset til koden, feks "fje10_"')
    if not isinstance(coderange, int):
        raise ValueError('Andre variabel må være en integer som sier hvor langt kodene går fra 1, feks. 1-17 så skal den være 17.')
    if not isinstance(lettercodes, dict):
        raise ValueError('Tredje variabel må være en dictionary som linker bokstaver til kolonne-header-variabler. Feks. {"a" : "tvsport"} osv.')
    if not isinstance(df, pd.DataFrame):
        raise ValueError('Fjerde variabel må være hoveddataframen som skal opereres på.')
    # Om dataframen er tom, så er det jo ikke vits å gjøre noe
    if not len(df):
        raise ValueError('Dataframen i fjerde varabel er tom, da er det jo ikke noe poeng å gjøre dette...')


    # Loop gjennom dictionary av koder -> variabel
    for key, item in lettercodes.items():
        # Lag en liste for hver av nummerene i rangen, legg til en kode formatert med range-nummer og bokstavnøkkel i listen vi initierte over
        check = [f'{codeprefix}{i}{key}' for i in range(1, coderange+1)]

        # Sjekk om alle kolonnene vi skal se i faktisk er i dataframen
        if not all(elem in df.columns for elem in check):
            raise KeyError(f'Finner ikke alle kolonnen i listen i dataframen:\n{check}')

        # Potensiell kode for å sjekke noen av kolonnene inneholder True,
        # om de gjør det, sett ny kolonne samme som "item" (tvsport feks) til True
        df.loc[df[check].any(), item] = True

    # Test at alle kolonnene i dict-items er nå i dataframen?
    if not all(elem in df.columns for elem in lettercodes.values()):
        raise KeyError(f'Finner ikke igjen alle kolonnene som nå burde ligget i dataframen:\n{lettercodes.values()}')

    return df
# AUTOGENERATED! DO NOT EDIT! File to edit: 03_sporre.ipynb (unless otherwise specified). # Cell #dapla Denne funksjonen sjekker en bred range av kode-kolonner, og slår disse sammen til en oppsummeringskolonne.\n     Forutsetningen er at det er lignende svaralternativer på ulike spørsmål som man skal gå gjennom og at de "Or-es", dvs True på 1 er True på den avledete variabelen.\n     F.eks. 17 spørsmål om fjernsynskanaler, hvor man spør etter 21 ulike programtyper. Og man ønsker å svare på: 'Så denne personen på denne typen program i det hele tatt?'\n       Parameters     ----------     first "codeprefix" : string\n         Første parameter er en string som er prefikset til kolonnene, feks. 'fje10_'     second "coderange" : integer\n         Andre parameter er ett tall som sier hvor mange kolonner som er nummerert.         Om du sender 17 så vil den ta alle tallene som er 1-17 og da lage kolonneheadere som 'fje10_17x'     third "lettercodes" : dict\n         Det tredje parameteret skal være en dict, som forteller om hvilket svaralternativ skal bli til hvilken nye kolonne.         feks. 'a' : 'tvsport', hvor svaralternativ 'a' på alle kanaler, skal bli 'eller'-t til en avledet variabelkolonne 'tvsport'     fourth "df" : Pandas Dataframe\n         Det fjerde parameteret skal være dataframen som vi opererer på.      Returns     -------     DataFrame\n         Returnerer dataframen som kom inn, med ny avledet kolonne.      Raises     ------     ValueError\n         Om noen av variablene inn ikke stemmer med forventede typer.         Om dataframen er 0 rader lang.     KeyError\n         Om noen av kolonnene det letes i, ikke finnes.         Om noen av kolonnene som burde vært opprettet, ikke er der på slutten av funksjonen. # Imports, do we trust the user? # Typechecking # Om dataframen er tom, så er det jo ikke vits å gjøre noe # Loop gjennom dictionary av koder -> variabel # Lag en liste for hver av nummerene i rangen, legg til en kode formatert med range-nummer og bokstavnøkkel i listen vi initierte over # Sjekk om alle kolonnene vi skal se i faktisk er i dataframen # Potensiell kode for å sjekke noen av kolonnene inneholder True, # om de gjør det, sett ny kolonne samme som "item" (tvsport feks) til True # Test at alle kolonnene i dict-items er nå i dataframen?