<jupyter_start><jupyter_text>Hente tabeller med datokonvertering Eksempel KonkursDenne 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<jupyter_code># Her importerer vi ulike pakker
import requests
import pandas as pd
from pyjstat import pyjstat  # pyjstat er for behandling av JSON-stat<jupyter_output><empty_output><jupyter_text>URL til tabellens metadata i PxWebApi, som vi skal poste spørringene mot<jupyter_code>tabid = "12972" 
lang = "no" # kan også være "en"
url1 = "https://data.ssb.no/api/v0/" + lang + "/table/" + tabid;<jupyter_output><empty_output><jupyter_text>Vi spør etter Antall konkurser og antall ansatte pr uke, for alle næringer.<jupyter_code>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"
  }
}<jupyter_output><empty_output><jupyter_text>Generell funksjon for å identifisere frekvens slik at vi kan konvertere til datoformat og sette [**Pandas PeriodIndex**](https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.htmltime-span-representation)<jupyter_code>#identifiserer frekvens, konverterer til datoformat og setter Periodindex
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
    
# funksjon for å konvertere til datoformat og sette en Pandas PeriodIndex.        
def setPeriodIndex(frekvens, frek_no, freq_en, fmt, df):
    if frekvens in ['kvartal', 'quarter']:
        # erstatter K med Q, konverterer til datoformat og setter frekensen til Pandas PeriodIndex. 
        # Pandas forstår engelske frekevenskoder, men SSB bruker norske
        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']:
        # må legge til '-0' for å få ukenr. til å bli mnd-dag
        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)<jupyter_output><empty_output><jupyter_text>Her poster vi spørringen<jupyter_code>res1 = requests.post(url1, json=query1)<jupyter_output><empty_output><jupyter_text>Leser JSON-stat resultatet med biblioteket pyjstat<jupyter_code>ds1 = pyjstat.Dataset.read(res1.text)<jupyter_output><empty_output><jupyter_text>Skriver resultatet til en Pandas dataframe<jupyter_code>df1 = ds1.write('dataframe')<jupyter_output><empty_output><jupyter_text>Viser tre først og tre siste i df1<jupyter_code>df1.head(3)
df1.tail(3)<jupyter_output><empty_output><jupyter_text>Setter uke som index-kolonnne<jupyter_code>df1.set_index('uke')
df1.index<jupyter_output><empty_output><jupyter_text>Figur med Pandas plot<jupyter_code>df1.plot(x='uke', y='value', figsize=(12, 6), color='#1a9d49', title="Antall konkurser pr uke, x som kategori")<jupyter_output><empty_output><jupyter_text>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. *Ser at uke konverteringen gir feil dato. Python 3.8 introduserer isocalendar(), som sannsynligvis gir beste løsning. Forslag mottas med takk.*<jupyter_code>dateConv(df1)<jupyter_output>INFO:numexpr.utils:NumExpr defaulting to 4 threads.<jupyter_text>Nå har vi fått en Pandas PeriodIndex<jupyter_code>df1.index
df1.info()<jupyter_output><class 'pandas.core.frame.DataFrame'>
PeriodIndex: 123 entries, 2009-01-06/2009-01-12 to 2020-06-30/2020-07-06
Freq: W-MON
Data columns (total 5 columns):
 #   Column              Non-Null Count  Dtype 
---  ------              --------------  ----- 
 0   region              123 non-null    object
 1   næring              123 non-null    object
 2   statistikkvariabel  123 non-null    object
 3   uke                 123 non-null    object
 4   value               123 non-null    int64 
dtypes: int64(1), object(4)
memory usage: 5.8+ KB<jupyter_text>Nytt plot med datokonvertert x-akse<jupyter_code>df1.plot()<jupyter_output><empty_output><jupyter_text>Øker størrelsen på figuren og setter SSB-farger<jupyter_code>df1.plot(figsize=(16, 6), color='#1a9d49', title="Antall konkurser pr uke, med datokonvertering")<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.12156928775888197, 'fraction_numerical': 0.022731099511702307, 'mean_word_length': 3.183098591549296, 'pattern_counts': {'":': 19, '<': 56, '<?xml version=': 0, '>': 56, 'https://': 3, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '14', 'dir': 'jupyter-structured-clean-dedup', 'id': '305380', 'license': 'Apache-2.0', 'n_tokens_mistral': 2289, 'n_tokens_neox': 2169, 'n_words': 488, 'path': 'konkurs-datokonv.ipynb', 'repo_name': 'janbrus/ssb-api-python-examples', 'size': '5939'}