Konvertere tid fra kategori til datoformat, vist på ukentlige konkurser

#!/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")