Python Pandas med ferdig CSV-datasett. 10 prognoser, plot med Plotly

#!/usr/bin/env python
# coding: utf-8
# Ligger også som Jupyter notebook på https://github.com/janbrus/ssb-api-python-examples

# # Hente CSV fra SSB API til Pandas
# ## Konjunkturtendensene (KT) prognoser
# ### Henter datasett  [Utvalgte prognoser](https://data.ssb.no/api/v0/dataset/934516) som CSV  fra SSBs API:ferdige datasett

# Importerer Python pandas for å kunne lage dataframe
import pandas as pd


# pd.read_csv() henter innholdet fra API-et og legger det i dataframe df.
# De norske datasettene her er semikolonseparert og med komma som desimaltegn.
# CSV er ikke UTF-8, så vi må angi parameteren encoding for å få æøå riktig.
df = pd.read_csv("https://data.ssb.no/api/v0/dataset/934516.csv?lang=no", sep=';', decimal=',', encoding = "ISO-8859-1" )

# Sjekker at datatypen Pandas dataframe
df.info()


# 12 første linjer av datasettet
df.head(12)


# Evt. enkel endring til datoformat. Ikke strengt nødvendig. Ta vekk kommentaren når du skjønner hva som skjer.
#df['år'] = pd.to_datetime(df['år'], format='%Y', errors='coerce')


# Lager linjediagrammer med Pandas plot. Vi angir x og y aksen og grupperer med .groupby
df.groupby('statistikkvariabel').plot(x='år',
	y='12880: Makroøkonomiske hovedstørrelser. Regnskap og prognoser, etter år og statistikkvariabel', figsize=(12, 6), color ='g')


# For å få alle linjene i en figur i Pandas plot er det best å pivotere tabellen. Oppretter derfor en ny dataframe df2, med år som index.
df2 = df.pivot(index='år', columns='statistikkvariabel',
               values='12880: Makroøkonomiske hovedstørrelser. Regnskap og prognoser, etter år og statistikkvariabel')

# df2 er 'wide' i stedet for 'long'
df2

# Pandas plot av df2 med størrelse, datamarkør og tittel som parametre
df2.plot(figsize=(16, 10), marker='v', title='Konjunkturtendensene, prognoser, 4 år')


# ### Plot med [Plotly](https://plotly.com/python/). Her bruker jeg det enklere Plotly express.
#
import plotly.express as px  # px her er standard angivelse for Plotly express. Har ikke noe å gjøre med Statistikkbank px

fig = px.line(df, x='år', y='12880: Makroøkonomiske hovedstørrelser. Regnskap og prognoser, etter år og statistikkvariabel')

# Merk at her er input den opprinnelige df, som er 'long'. Det blir ikke bra, uten gruppering.
fig.show()

# Plotly Express har argumentet 'line_group', for gruppering. Her legger jeg også på tittel og tekst til y-aksen.
px.line(df, x=('år'), y='12880: Makroøkonomiske hovedstørrelser. Regnskap og prognoser, etter år og statistikkvariabel',
              color='statistikkvariabel',
              line_group='statistikkvariabel',
              title='Konjunkturtendensene, utvalgte prognoser 4 år',
              labels={'12880: Makroøkonomiske hovedstørrelser. Regnskap og prognoser, etter år og statistikkvariabel':'Endring / Nivå'})


# ### Med Plotly Express > 4.8
# Etter vedrsjon versjon 4.8, 26. mai 2020 støttes nå wide'.
# Nå kan vi lage samme plot med df2 som er 'wide'

df2.head(2)
fig2 = px.line(df2, x=df2.index, y=df2.columns, line_group='statistikkvariabel')
fig2.show()


# Det er nå mulig å sette plotly som Pandas .plot, istedet for Matplotlib
pd.options.plotting.backend = "plotly"

# Da fungerer Plotly plot av df2, uten parametre
df2.plot()

# med Plotly template
df2.plot.area(facet_col='statistikkvariabel', facet_col_wrap=2, template='none', )

# Et tips til slutt: Prøv å lage ditt eget datasett i stedet. Du kan også benytte det rikere JSON-stat og biblioteket pyjstat framfor CSV.