Python Pandas JSON-stat spørring som gir både kommunenavn og kommunenummer (id)

# -*- coding: utf-8 -*-
# Hvordan lage JSON-stat spørring som gir både kommunenavn og kommunenummer (id)
# Ligger også som Jupyter notebook på https://github.com/janbrus/ssb-api-python-examples
# Bruker pyjstat og pandas. Pandas lastes som del av pyjstat

from pyjstat import pyjstat
import requests

# URL med tabellens metadata, som vi skal poste spørringen mot
POST_URL = 'https://data.ssb.no/api/v0/no/table/07459'

# Spørring - kan også tas fra konsoll
json_q = {"query":[{"code":"Region","selection":{"filter":"item","values":["0301","1103","5001"]}},
                   {"code":"Kjonn","selection":{"filter":"item","values":["1","2"]}},
                   {"code":"Alder","selection":{"filter":"item","values":["000","001","002"]}},
                   {"code":"ContentsCode","selection":{"filter":"item","values":["Personer1"]}},
                   {"code":"Tid","selection":{"filter":"item","values":["2019","2020","2021"]}}
                  ],
          "response":{"format":"json-stat2"}}

# poster spørringen
res = requests.post(POST_URL, json=json_q)

# Leser JSON-stat resultatet med biblioteket pyjstat
# Lagrer det som datasett ds.
ds = pyjstat.Dataset.read(res.text)


# Se datasettet ds
ds

# Henter noen overordnete metadata fra JSON-stat datasettet
tittel = ds['label']
print(tittel)

# Sist Oppdatert som GMT
last_update = ds['updated']
print(last_update)

# Henter kilde
source = ds['source']
print(source)

# Leser resultatet til en dataframe
df = pyjstat.Dataset.read(res.text)

#Vi må lage to dataframes, en med tekst og en med ID. Pyjstat kun tillater enten/eller
befolkning = ds.write('dataframe')
befolkning_id = ds.write('dataframe', naming='id')

# lager en ny kolonne med både kommunenummer og navn slått sammen
befolkning['kommune'] = befolkning_id['Region'] + ' ' + befolkning['region']

# lager en ny dataframe som bare har med kolonnene vi ønsker, i ny rekkefølge. Merk doble [[ ]]
befolkning_ny = befolkning[['kommune', 'kjønn', 'alder', 'år', 'value']]
print(befolkning_ny)


# ### Kommunereformen 2020 - sammenslåtte tidsserier

# Merk at spørringen i eksempelet over bruker rene kommunenummer, og ikke K-koder tall for sammenslåtte kommuner i tidsserier.
# En spørring som inkluderer tidsserier for kommuner som er berørt av kommunereformen, kan ikke benytte "item". 
# K-koder må ha agg: og navnet på aggregeringen KommSummer istedet, "filter": "agg:KommSummer". 
# Benytter også "agg:FemAarigGruppering" på alder.
# Eksempel på en spørring for Oslo og Moss. Tallene for Oslo blir de samme som om jeg hadde brukt 0301,
# mens tidsserien for K-3002 Moss inkluderer kommunene som inngår i nye Moss, dvs. tidligere 0104 Moss og 0136 Rygge.

json_q1 = {"query":
           [{"code":"Region","selection":{"filter":"agg:KommSummer","values":["K-0301","K-3002"]}},
            {"code":"Kjonn","selection":{"filter":"item","values":["1","2"]}},
            {"code":"Alder","selection":{"filter": "agg:FemAarigGruppering", "values":["F00-04", "F05-09"]}},
            {"code":"ContentsCode","selection":{"filter":"item","values":["Personer1"]}},
            {"code":"Tid","selection":{"filter":"item","values":["2019","2020","2021"]}}
           ],
           "response":{"format":"json-stat2"}}

# samme med ny spørring
res1 = requests.post(POST_URL, json=json_q1)
ds1 = pyjstat.Dataset.read(res1.text)
befolkning1 = ds1.write('dataframe')
befolkning_id1 = ds1.write('dataframe', naming='id')
print(befolkning1)
# (...)