dapla-statbank-client
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:
- hente filbeskrivelse
- validere data lokalt mot en filbeskrivelse
- laste tabeller for publisering
- lese inn publiserte data fra Statistikkbanken API
- lese inn upublisert data fra intern Statistikkbank
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
= StatbankClient() # Ber om lastebruker og lastepassord
stat_client
= "06339"
tabell = stat_client.get_description(tableid=tabell)
filbeskrivelse 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
= StatbankClient(
stat_client ="2050-01-01",
date=True,
overwrite=2
approve
)
"deltabellfilnavn.dat" : df_06399},
stat_client.transfer({"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
= StatbankClient(
stat_client ="2050-01-01",
date=True,
overwrite=2
approve
)
= {"kargrs01fylker1.dat" : df_07495_fylker,
data_07495 "kargrs01landet1.dat" : df_07495_landet,}
="07495") stat_client.transfer(data_07495, tableid
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
= StatbankClient()
stat_client
# Hente filbeskrivelse
= "07495"
tabell = stat_client.get_description(tableid=tabell)
filbeskrivelse
# Pakk datasettet i dictionaryen (navnet på deltabellen ligger i filbeskrivelsen)
= filbeskrivelse.transferdata_template(df_07495)
data_07495
# For å ta vare på endringene, så må du skrive tilbake til datasettet i dictionaryen
= filbeskrivelse.round_data(data_07495) data_07495
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
= StatbankClient()
stat_client
# Hente filbeskrivelse
= "07495"
tabell = stat_client.get_description(tableid=tabell)
filbeskrivelse
# Pakk deltabeller i en dict før validering
= filbeskrivelse.transferdata_template(df_07495)
data_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
= apidata_all("06339", include_id=True) df_06339
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': [{'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'}}
query
= apidata("https://i.ssb.no/pxwebi/api/v0/no/prod_24v_intern/START/be/be01/folkemengde/Rd0002Aa",
df_folkemengde
query,= True
include_id )
Intern statistikkbank
SSB-brukere kan hente data fra SSBs interne Statistikkbank:
Notebook
from statbank import apidata
= "https://i.ssb.no/pxwebi/api/v0/no/prod_24v_intern/START/be/be01/folkemengde/Rd0002Aa"
uri
= {'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'}}
query
= apidata(uri, query, include_id = True) df_folkemengde