JSON-stat til Pandas dataframe - funksjon

#!/usr/bin/env python
# coding: utf-8

# # JSON-stat til Pandas dataframe - funksjon
# Denne finnes også som notebook på https://github.com/janbrus/ssb-api-python-examples

import json
import pandas as pd
import requests
# pyjstat er biblioteket for å lese JSON-stat, 'pip install pyjstat'
from pyjstat import pyjstat

#########################################
# ## Alternativ 1, lim inn POST Url og JSON-spørring

# Lim in PostUrl som spørringen skal postes mot
postUrl = "https://data.ssb.no/api/v0/no/table/07459/"
# f.eks.
#postUrl = "https://data.ssb.no/api/v0/no/table/07459/"

# Spørringen og endepunktet til API-et hentes fra Statistikkbanken eller API-konsoll.
apiQuery = # lim inn spørringen din her

# Eksempel med minimalistisk spørring.
# Så enkel spørring er egentlig ikke anbefalt, med mindre du har forstått eliminasjon i Statistikkbanken.

#apiQuery = {
#      "query": [
#      ],
#      "response": {
#        "format": "json-stat2"
#      }
#    }

# Funksjon for å konvertere uttrekket til 2 dataframes, tar 2 paramtre
def apiToDataframe(postUrl, query):

    # postUrl som spørringen skal postes mot
    # Spørringen og endepunktet til API-et kan hentes fra Statistikkbanken.

    res = requests.post(postUrl, json=query)
    # legger resultat i ds. DS har i tillegg en del metadata
    ds = pyjstat.Dataset.read(res.text)
    # skriver resultatet til to dataframes
    # først dataframe med tekst
    df = ds.write('dataframe')
    # deretter dataframe med koder
    df_id = ds.write('dataframe', naming='id')
    # returnerer også ds i tilfelle en trenger metadata
    return df, df_id, ds
# slutt apiToDataframe

# Legger resultatet av apiToDataframe i tre variabler
df, df_id, ds = apiToDataframe(postUrl, apiQuery)

# Viser dataframe med tekst
df

# Dataframe med koder
df_id

# Hele datasettet som liste
ds

# Evt. Litt informasjon om pyjstat, eller hvorfor "from pyjstat import pyjstat"
# dir(pyjstat)

###################################################
# ## Alternativ 2
# ### Funksjon "jsqToTab" for å hente data via PxWebApi fra en lagret API-spørring på fil

# Leser filer på formen ssbapitable_03013.json, der 03013 er ID til tabellen.
# Eksempelet forutsetter at filen ligger i samme katalog.
# funksjon som tar id på lagret API-spørring som input
# lang kan angi språk, default er norsk
# funksjonen returnerer to dataframes, en med tekst og en med koder

def jsqToTab(qid, lang='no'):
    #
    savedApiQuery = json.load(open('ssbapi_table_' + qid + '.json'))
    # Vi finner spørringen og Tabell ID
    apiQuery = savedApiQuery['queryObj']
    tabId = savedApiQuery['tableIdForQuery']
    # PostUrl som spørringen skal postes mot
    # Spørringen og endepunktet til API-et kan hentes fra Statistikkbanken.
    postUrl = "https://data.ssb.no/api/v0/" + lang + "/table/" + tabId
    res = requests.post(postUrl, json=apiQuery)
    # legger resultat i ds
    ds = pyjstat.Dataset.read(res.text)
    # skriver resultatet til to dataframes
    df_id = ds.write('dataframe', naming='id')
    df = ds.write('dataframe')

    return df, df_id
# slutt jsqToTab

import os

df, df_id = jsqToTab("") #sett inn 5-sifret tabellID f.eks. 03013

df
df_id

# tilsvarende engelsk, endrer til 'en' i POST url
df1, df_id1 = jsqToTab("03013", 'en') #sett inn 5 sifret tabellID

df1
# df med koder er lik på norsk og engelsk
df_id1