#!/usr/bin/env python
# coding: utf-8
# Jupyter notebook versjon ligger på https://github.com/janbrus/ssb-api-python-examples
# Hente tabeller med datokonvertering
# Eksempel Konkurs. Denne ukentlige tabellen for har et brudd i tidsserien fra 2010-2018.
# Den er egnet for å vise funksjonen for datokonvertering. Her vises figurer både med x-akse som kategorier og som dato.
# Kilde: [12972](https://www.ssb.no/statbank/table/12972) - Opna konkursar ukentleg
# Først importerer vi ulike pakker
import requests
import pandas as pd
from pyjstat import pyjstat # pyjstat er for behandling av JSON-stat
# ---- Start spørringer --- #
# URL til tabellenes metadata i PxWebApi, som vi skal poste spørringene mot
tabid = "12972"
lang = "no" # kan også være "en"
url1 = "https://data.ssb.no/api/v0/" + lang + "/table/" + tabid;
# Vi spør etter Antall konkurser og antall ansatte pr uke, for alle næringer.
query1 = {
"query": [
{
"code": "Region",
"selection": {
"filter": "item",
"values": [
"0N"
]
}
},
{
"code": "Naring",
"selection": {
"filter": "item",
"values": [
"00-99"
]
}
},
{
"code": "ContentsCode",
"selection": {
"filter": "item",
"values": [
"Konkursar"
]
}
},
{
"code": "Tid",
"selection": {
"filter": "all",
"values": [
"*"
]
}
}
],
"response": {
"format": "json-stat2"
}
}
# ---- Slutt spørringer--- #
# ---- Start funsjoner --- #
# Generell funksjon for å identifisere frekvens slik at vi kan konvertere til datoformat. Da kan vi kan sette Pandas RangeIndex
def dateConv(dataframe):
frekvens, frek_no, frek_en, fmt = findFrequency(dataframe)
setPeriodIndex(frekvens, frek_no, frek_en, fmt, dataframe)
#funksjon for frekvenser
def findFrequency(dataframe):
frekvenser = ['måned', 'kvartal', 'uke', 'år', 'year', 'quarter', 'month', 'week']
frek_no = '' #SSB bruker dessverre norske og ikke engelske frekvenskoder U - uke osv.
frek_en = '' #engelsk frekvens kode
fmt = '' # python datoformat
for w in frekvenser:
if w in dataframe.columns:
if w in ['måned', 'month']:
frek_no = 'M'
frek_en = 'M'
fmt = '%YM%m'
elif w in ['kvartal', 'quarter']:
frek_no = 'K'
frek_en = 'Q'
elif w in ['uke', 'week']:
frek_no = 'U';
frek_en = 'W'
fmt = '%YW%W-%w'
else:
frek_no = ''
frek_en = 'A'
return w, frek_no, frek_en, fmt
def setPeriodIndex(frekvens, frek_no, freq_en, fmt, df):
if frekvens in ['kvartal', 'quarter']:
# erstatter K med Q, konverterr til datoformat og setter frekensen til Pandas PeriodIndex
df.index = pd.PeriodIndex(pd.to_datetime(df[frekvens].str.replace(frek_no, freq_en), errors='coerce'), freq='Q-DEC')
elif frekvens in ['uke', 'week']:
df.index = pd.PeriodIndex(pd.to_datetime(df[frekvens].str.replace(frek_no, freq_en).add('-0'), format= fmt, errors='coerce'), freq='W-MON')
else:
df.index = pd.PeriodIndex(pd.to_datetime(df[frekvens], format= fmt, errors='coerce'), freq=freq_en)
# ---- Slutt funsjoner --- #
# Her poster vi spørringen
res1 = requests.post(url1, json=query1)
# Leser JSON-stat resultatet med biblioteket pyjstat
ds1 = pyjstat.Dataset.read(res1.text)
# Skriver resultatet til en Pandas dataframe
df1 = ds1.write('dataframe')
df1.head(3)
df1.tail(3)
df1.set_index('uke')
df1.index
df1.plot(x='uke', y='value', figsize=(12, 6), color='#1a9d49', title="Antall konkurser pr uke, x som kategori")
# Kaller funksjonen dateConv som konverterer til dato.
# Gjør en konvertering fra kategori til datoformat. Deretter settes denne som index med bruk av Pandas PeriodIndex
dateConv(df1)
# Nå har vi fått en Pandas PeriodIndex
df1.index
df1.info()
#lager figur
df1.plot()
# Øker størrelsen på figuren og setter SSB-farger
df1.plot(figsize=(16, 6), color='#1a9d49', title="Antall konkurser pr uke, med datokonvertering")