dapla-statbank-client

Sist endret

April 4, 2025

dapla-statbank-client er en Python-pakke som lar SSB-ere laste inn og hente ut data fra Statistikkbanken fra Dapla Lab1. Pakken tilbyr ulik funksjonalitet som gjør det enkelt å jobbe mot Statistikkbanken:

Tilgangsstyring

Tilgang til funksjonalitet i Statistikkbanken styres av brukernavn (“lastebruker”) og passord (“lastepassord”) som brukeren må oppgi. Tilgang til data som skal lastes inn i banken krever at man representerer teamet som har tilgang til dataene når man starter Dapla Lab.

Statistikkbanken har en prod- og testdatabase. Brukere har tilgang til å publisere til begge deler fra Dapla Lab sitt prod-miljø. Fra Daplas testmiljø, kan man kun publisere til Statistikkbankens testdatabase.

Forberedelser

For å bruke dapla-statbank-client i Dapla Lab eller prodsonen må man opprette et ssb-project og installere pakken på følgende måte:

Terminal
poetry add dapla-statbank-client

Funksjonalitet

I denne delen beskrives den viktigste funksjonalitet som tilbys i dapla-statbank-client. Det finnes også noe funksjonalitet som kun er beskrevet her.

Filbeskrivelse

Man kan hente ut filbeskrivelsen til en statistikkbanktabell fra Statistikkbanken med følgende kode:

Notebook
from statbank import StatbankClient
stat_client = StatbankClient()  # Ber om lastebruker og lastepassord

tabell = "06339"
filbeskrivelse = stat_client.get_description(tableid=tabell)
print(filbeskrivelse)

I eksempelet over henter vi filbeskrivelsen til statistikkbanktabell 06339 og printer den ut. Beskrivelse-objektet inneholder alle formelle krav til dataene som kan lastes inn i denne tabellen.

Laste tabeller

Man kan laste data inn i Statistikkbankens databaser med dapla-statbank-client. Dataene som skal lastes inn må sendes inn som en dictionary med deltabellnavn som nøkler, og Pandas dataframes som verdier. Under er et eksempel på at en tabell lastes for publisering 1. januar 2050:

Notebook
from statbank import StatbankClient

stat_client = StatbankClient(
    date="2050-01-01",
    overwrite=True,
    approve=2
)

stat_client.transfer({"deltabellfilnavn.dat" : df_06399},
                     "06339")

I eksempelet over ser vi også at vi sender inn parametere, om vi ønsker at eksisterende tabeller skal overskrives, og at godkjenning skal skje Just-in-Time. I tillegg har vi spesifiser en publiseringsdato (merk at statbanken kun godtar publiseringer en viss antall måneder frem i tid).

Under er et eksempel på lasting av flere deltabeller samtidig.

Notebook
from statbank import StatbankClient
stat_client = StatbankClient(
    date="2050-01-01",
    overwrite=True,
    approve=2
)

data_07495 = {"kargrs01fylker1.dat" : df_07495_fylker,
              "kargrs01landet1.dat" : df_07495_landet,}

stat_client.transfer(data_07495, tableid="07495")

Avrunding av desimaltall

Metoden round_data() lar brukeren avrunde desimaltall iht filbeskrivelsen til en statistikkbanktabell. Dette kan være nyttig siden, antall desimaler som skal beholdes ligger markert i filbeskrivelsen, og R og Python håndterer avrunding annerledes enn det mange forventer (se boks under).

I eksempelet under har vi en dataframe med navn data_07495 som inneholder data som skal lastes i Statistikkbanken. For å avrunde denne og lagre endringene, så lagrer vi resultatet tilbake til den opprinnelige dictionaryen’n. Ved dags dato er det smart å runde av ETTER man validerer, siden validate() ikke tar høyde for at dataene kan være avrundet allerede.

Notebook
from statbank import StatbankClient
stat_client = StatbankClient()

# Hente filbeskrivelse
tabell = "07495"
filbeskrivelse = stat_client.get_description(tableid=tabell)

# Pakk datasettet i dictionaryen (navnet på deltabellen ligger i filbeskrivelsen)
data_07495 = filbeskrivelse.transferdata_template(df_07495)

# For å ta vare på endringene, så må du skrive tilbake til datasettet i dictionaryen
data_07495 = filbeskrivelse.round_data(data_07495)
Avrunding i Python og R

Avrunding av desimaltall i Python og R gjøres mot nærmeste partall. Dvs. at 2,5 blir avrundet til 2, og 1,5 blir også avrundet til 22. Dette er ulikt hvordan tall blir avrundet i SAS og Excel, der 2,5 blir til 3, og 1,5 blir til 2. Bruker man round_data() i dapla-statbank-client så er det sistnevnte metode som benyttes.

Laste til test

Statistikkbanken har et test-miljø som kan benyttes hvis man ønsker. Det er åpnet for å laste til Statistikkbankens test-miljøet fra både Dapla Lab prod og Dapla Lab test.

Hvis man ønsker å laste til Statistikkbankens test-miljø fra Dapla Lab prod, så må man eksplisitt angi dette i argumententet til StatbankClient(use_db='TEST'). Det er derimot ikke mulig å laste til Statistikkbankens prod-miljø fra Dapla Lab test.

Validering

Metoden validate() lar brukeren validere en dataframe mot en filbeskrivelsen. Dette er nyttig siden man kan få tilbakemelding om eventuelle feil før man sender over data til Statistikkbanken. Spesielt er dette interessant under utvikling av en statistikkbanklevering i nytt kodespråk, hvor validate() kan gi deg tilbakemelding på hva du har gjort feil hittils med formen på dataene.

Notebook
from statbank import StatbankClient
stat_client = StatbankClient()

# Hente filbeskrivelse
tabell = "07495"
filbeskrivelse = stat_client.get_description(tableid=tabell)

# Pakk deltabeller i en dict før validering
data_07495 = filbeskrivelse.transferdata_template(df_07495)

# Vi tar ikke vare på valideringene, men de kan raise errors, eller printes ut.
filbeskrivelse.validate(data_07495)

Publiserte tabeller

Man kan hente ut publiserte data fra Statistikkbankens åpne API med dapla-statbank-client. apidata_all() henter all data i tabellen, uten å spesifisere noe filter:

Notebook
from statbank import apidata_all

df_06339 = apidata_all("06339", include_id=True)

Hvis man spesifiserer include_id=True så fletter funksjonen id-kolonner (variabel-koder) for klassifikasjonsvariablene etter “label-kolonner”.

Man kan også spesifisere akkurat hvilken informasjon man ønsker fra en tabell, dette “query” objektet kan man kopiere ut av statstikkbankens nettsider, etter å ha filtrert en tabell så ligger det under “API-spørring for denne tabellen” i det andre feltet. Dette kan du copy-paste ut og assigne til variabelen “query” her. I følgende kodebit henter vi også fra intern statbank (upublisert?) ved å spesifisere hele adressen, ikke kun numerisk statbank-id.

Notebook
from statbank import apidata

query = {'query': [{'code': 'Region', 'selection': {'filter': 'vs:Landet', 'values': ['0']}}, {'code': 'Alder', 'selection': {'filter': 'vs:AldGrupp19', 'values': ['000', '001', '002', '003', '004', '005', '006', '007', '008', '009', '010', '011', '012', '013', '014', '015', '016', '017', '018', '019', '020', '021', '022', '023', '024', '025', '026', '027', '028', '029', '030', '031', '032', '033', '034', '035', '036', '037', '038', '039', '040', '041', '042', '043', '044', '045', '046', '047', '048', '049', '050', '051', '052', '053', '054', '055', '056', '057', '058', '059', '060', '061', '062', '063', '064', '065', '066', '067', '068', '069', '070', '071', '072', '073', '074', '075', '076', '077', '078', '079', '080', '081', '082', '083', '084', '085', '086', '087', '088', '089', '090', '091', '092', '093', '094', '095', '096', '097', '098', '099', '100', '101', '102', '103', '104', '105', '106', '107', '108', '109', '110', '111', '112', '113', '114', '115', '116', '117', '118', '119+']}}, {'code': 'Statsbrgskap', 'selection': {'filter': 'vs:Statsborgerskap', 'values': ['000']}}, {'code': 'Tid', 'selection': {'filter': 'item', 'values': ['2022']}}], 'response': {'format': 'json-stat2'}}

df_folkemengde = apidata("https://i.ssb.no/pxwebi/api/v0/no/prod_24v_intern/START/be/be01/folkemengde/Rd0002Aa",
                         query,
                         include_id = True
)

Intern statistikkbank

SSB-brukere kan hente data fra SSBs interne Statistikkbank:

Notebook
from statbank import apidata

uri = "https://i.ssb.no/pxwebi/api/v0/no/prod_24v_intern/START/be/be01/folkemengde/Rd0002Aa"

query = {'query': [{'code': 'Region', 'selection': {'filter': 'vs:Landet', 'values': ['0']}}, {'code': 'Alder', 'selection': {'filter': 'vs:AldGrupp19', 'values': ['000', '001', '002', '003', '004', '005', '006', '007', '008', '009', '010', '011', '012', '013', '014', '015', '016', '017', '018', '019', '020', '021', '022', '023', '024', '025', '026', '027', '028', '029', '030', '031', '032', '033', '034', '035', '036', '037', '038', '039', '040', '041', '042', '043', '044', '045', '046', '047', '048', '049', '050', '051', '052', '053', '054', '055', '056', '057', '058', '059', '060', '061', '062', '063', '064', '065', '066', '067', '068', '069', '070', '071', '072', '073', '074', '075', '076', '077', '078', '079', '080', '081', '082', '083', '084', '085', '086', '087', '088', '089', '090', '091', '092', '093', '094', '095', '096', '097', '098', '099', '100', '101', '102', '103', '104', '105', '106', '107', '108', '109', '110', '111', '112', '113', '114', '115', '116', '117', '118', '119+']}}, {'code': 'Statsbrgskap', 'selection': {'filter': 'vs:Statsborgerskap', 'values': ['000']}}, {'code': 'Tid', 'selection': {'filter': 'item', 'values': ['2022']}}], 'response': {'format': 'json-stat2'}}

df_folkemengde = apidata(uri, query, include_id = True)

Fotnoter

  1. Pakken fungerer også på treningsarenaen til Dapla; Jupyter i prodsonen↩︎

  2. Grunnen til at R og Python runder av desimaltall nærmeste partall er at det reduserer bias i en retning for en kolonne. Dersom alle tall rundes opp vil summen av en kolonne *dras oppover**. ↩︎