Python for samfunnsøkonomi

Forelesningsnotater - Espen Sirnes

6 - pandas, filtrering, logikk og betingelser

Logikk og betingelser

Noe av det vi gjør oftest når vi programmerer er å teste om en betingelse er sann eller usann. Når testen er utført, kan programmet velge riktig vei å gå i fortsettelsen. Slik testing kalles "logikk". Vi har allerede i innledningen vært inne på variabeltypen som avgjør om en test er sann eller usann, typen bool.

Sann eller usann (True og False) brukes som oftest sammen med en if-betingelse, slik som dette:

Eksempel 1:

In [1]:
if False:
    print("Hei")
else:
    print("Hå")

Vanligvis vil if-setningen inneholde en test som ikke er helt åpenbar, og som avhenger av input i en funksjon eller en variabel som er definert et annet sted i koden. Her er et eksempel på det første:

Eskempel 2:

In [2]:
import numpy as np

def did_I_win(s0,s1):
    if s1>s0:
        return "won!"
    else:
        return "lost" 

PricePaid=100
StockPriceToday=int(np.random.rand()*200)
print(
    f"Bought for: {PricePaid}\n"
    f"Worth today: {StockPriceToday}\n"
    f"You {did_I_win(PricePaid,StockPriceToday)}"
)
Bought for: 100
Worth today: 152
You won!

Ofte vil du ønske å sammenligne ulike datasett, for eksempel to numpy-rekker. Dersom du skal ha en if-betingelse, må du imidlertid huske på at for å få ett svar på en sammenligning mellom to numpy-rekker, så må du angi på hvilken måte de skal sammenlignes. I utgangspunktet vil en slik sammenligning bare gi resultatet fra en sammenligning av hvert element i de to rekkene. Resultatet av sammenligningen er altså ikke en bolsk verdi (bool) men en ny rekke. En slik sammenligning vil derfor føre til en feil:

Eksempel 2:

In [3]:
a=np.array([1,2,3])
b=np.array([3,2,1])
print(a>b)
if a>b:
    print('a was bigger than b')
[False False  True]
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[3], line 4
      2 b=np.array([3,2,1])
      3 print(a>b)
----> 4 if a>b:
      5     print('a was bigger than b')

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

I stedet må vi angi hvordan den elementvise sammenligningen skal sammenfattes i et sant/usant-resultat. Vi kan da velge mellom å kreve at alle elementene er sanne med numpyfunksjonen all(), eller at minst ett av elementene er sanne medany().

Eksempel 3:

In [4]:
if np.any(a>b):
    print('There were elements in a where the corresponding element in b was smaller')
    
    
a=np.array([101,102,103])
if np.all(a>b):
    print('All elements in a were bigger than the corresponding element in b')
There were elements in a where the corresponding element in b was smaller
All elements in a were bigger than the corresponding element in b

Ofte vil du ha bruk for å bruke flere vilkår for testen, der du enten krever at alle må være sanne, eller at det holder at én er sann, eller en kombinasjon. Det oppnår vi med and og or.

Et annet nyttig nøkkelord for logiske tester er in. Dette brukes på alt fra å finne ut om et objekt er i en liste eller annen datastruktur, til om en delstreng er i en streng. Her er et eksempel som bruker alle disse nøkkelordene i if og elif-setninger:

Eksempel 4:

In [5]:
animal='lion'

cats=['lion','tiger','puma','lynx']
mammals=['human','bear','cat','whale','mouse']+cats

if (animal in cats) and (animal in mammals):
    print(f"{animal} is a cat and a mammal")
elif (not animal in cats) and (animal in mammals):
    print(f"{animal} is not a cat, but it is a mammal")
elif (animal in cats) and (not animal in mammals):
    print(f"{animal} is a cat, but not a mammal")   
else:
    print(f"{animal} is neither a cat nor a mammal")
lion is a cat and a mammal

Legg merke til elif over. De er if-setninger som er knyttet til if-setningen over. Koden til en elif-setning kjøres dersom hverken if-setningen eller noen elif-setninger over har blitt tilfredsstilt.

Eksempel med datasett

Vanligvis vil slike tester ligge inne i kode der det ikke er helt åpenbart hva variabelen du tester er. Dette er illustrert i eksemplet under, der variabelen bestemmes av innholdet i datasettet "schooling-gdp.csv". Vi starter med å hente inn datasettet og plotte BNP per capita mot Utdanning:

Eksempel 5:

In [6]:
import pandas as pd
df=pd.read_csv('./data/schooling-gdp.csv')
df.plot.scatter('BNP_per_capita','Utdanning')
Out[6]:
<AxesSubplot: xlabel='BNP_per_capita', ylabel='Utdanning'>

Vi ser at sammenhengen virker mer usikker for når utdanningsnivået og BNP per capita er høyt. Vi kan derfor bruke en if-setning til å kun ta med land med BNP per capita høyere enn 20000. Vi kan da kjøre en løkke som enten legger til True eller False i en liste include som identifiserer de radene i df som vi ønsker å ta med.

Når vi har denne listen, kan vi plukke de radene med True ved å sette listen i klammeparentes etter df, altså df[include]:

Eksempel 6:

In [11]:
include = []
for index, (country,code,gdp_cap,edu,pop) in df.iterrows():
    if gdp_cap>20000:
        include.append(True)
    else:
        include.append(False)
    
df_filtered=df[include]
df_filtered.plot.scatter('BNP_per_capita','Utdanning')
Out[11]:
<AxesSubplot: xlabel='BNP_per_capita', ylabel='Utdanning'>

Som vi ser, ser det ut til å være er det liten sammenheng mellom BNP per capita og utdanningsnivå for disse observasjonene.

Det finnes imidlertid en enklere måte å velge ut variabler i pandas. Du kan rett og slett sette betingelsen rett i klammeparentesen ved å referere til datarammen og den variablen det gjelder. Det vil for eksempel si df[df['BNP_per_capita']>20000]. Koden blir da en god del enklere:

In [13]:
df[df['BNP_per_capita']>20000].plot.scatter('BNP_per_capita','Utdanning')
Out[13]:
<AxesSubplot: xlabel='BNP_per_capita', ylabel='Utdanning'>

Titlon

I eksemplet over leser Pandas dataene fra en fiil, men Pandas kan også hente data direkte fra en database på nettet. Vi skal først se hvordan vi kan hente data fra titlon.uit.no. Dette er en database som inneholder informasjon om aksjer, derviater og obligasjoner handlet på Oslo Børs Euronext.

Det første vi må gjøre er å hente en pakke som kan kommunisere med serveren. Vi skal bruke pymysql. Den er i utgangspunktet ikke installert her på uit's jupyter-server, så det må vi gjøre selv. Det gjør du slik:

Åpne konsollen og skriv pip install pymysql

For å hente data gjør du følgende:

https://titlon.uit.no/ ligger det børsinformasjon fra Oslo Børs. For å hente data fra Titlon gjør du følgende:

  1. gå inn på https://titlon.uit.no/
  2. trykk på "DOWNLOAD"
  3. logg inn (om du får en feilmelding etter innlogging følger du bare lenken over på nytt)
  4. Velg en aksje og trykk på "Generate script", og velg fanen til høyre "Python (MYSQL)"
  5. lim innholdet inn under

Eksempel 7:

LES INSTRUKSJONENE OVER! KODEN UNDER KAN IKKE KJØRES UTEN VIDERE.

In [17]:
import pandas as pd
#Query script for MySQL client
import pymysql
con = pymysql.connect(host='titlon.uit.no', 
                    user="user@domain.no", 
                    password="W4wuZGUaJ!wxvxrZd5%AF", 
                    database='OSE')  
crsr=con.cursor()
crsr.execute("""
	SELECT  * FROM `OSE`.`equity` 
	WHERE (`ISIN` = 'NO0010279474') 
	AND year(`Date`) >= 2000
	ORDER BY `Name`,`Date`
""")
r=crsr.fetchall()
df=pd.DataFrame(list(r), columns=[i[0] for i in crsr.description])
df
Out[17]:
Date SecurityId CompanyId Symbol ISIN Name BestBidPrice BestAskPrice Open High ... lnDeltaOBX NOWA_DayLnrate bills_3month_Lnrate Sector IN_OSEBX Equity Debt Earnings debt_ratio PE
0 2007-06-22 66992 8380 TFSO NO0010279474 24Seven Technology Group 13.40 13.50 13.50 13.50 ... 0.000000 0.000215 0.000198 Information Technology 0 9915000.0 13167000.0 -19778000.0 0.570445 -9.05332
1 2007-06-25 66992 8380 TFSO NO0010279474 24Seven Technology Group 12.75 13.15 13.50 13.50 ... -0.004561 0.000214 0.000199 Information Technology 0 9915000.0 13167000.0 -19778000.0 0.570445 -8.81860
2 2007-06-27 66992 8380 TFSO NO0010279474 24Seven Technology Group 12.75 13.50 13.00 13.00 ... -0.015125 0.000213 0.000199 Information Technology 0 9915000.0 13167000.0 -19778000.0 0.570445 -8.71801
3 2007-06-28 66992 8380 TFSO NO0010279474 24Seven Technology Group 12.50 13.00 13.00 13.00 ... 0.025671 0.000213 0.000202 Information Technology 0 9915000.0 13167000.0 -19778000.0 0.570445 -8.71801
4 2007-07-03 66992 8380 TFSO NO0010279474 24Seven Technology Group 12.50 13.00 13.00 13.00 ... 0.002780 0.000213 0.000203 Information Technology 0 9915000.0 13167000.0 -19778000.0 0.570445 -8.71801
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
803 2013-06-21 66992 8380 TFSO NO0010279474 24Seven Technology Group 1.70 2.00 1.81 1.81 ... 0.000669 0.000074 0.000066 Information Technology 0 5498000.0 60706000.0 -20093000.0 0.916954 -2.19938
804 2013-06-24 66992 8380 TFSO NO0010279474 24Seven Technology Group 1.82 1.94 1.94 1.94 ... -0.029773 0.000074 0.000066 Information Technology 0 5498000.0 60706000.0 -20093000.0 0.916954 -2.50989
805 2013-06-25 66992 8380 TFSO NO0010279474 24Seven Technology Group 2.00 2.05 1.94 2.00 ... 0.017821 0.000072 0.000067 Information Technology 0 5498000.0 60706000.0 -20093000.0 0.916954 -2.58751
806 2013-06-26 66992 8380 TFSO NO0010279474 24Seven Technology Group 1.95 2.05 2.00 2.05 ... 0.010697 0.000072 0.000067 Information Technology 0 5498000.0 60706000.0 -20093000.0 0.916954 -2.58751
807 2013-06-27 66992 8380 TFSO NO0010279474 24Seven Technology Group 1.80 2.00 1.90 2.00 ... -0.001409 0.000072 0.000067 Information Technology 0 5498000.0 60706000.0 -20093000.0 0.916954 -2.58751

808 rows × 53 columns

Koden leser inn dataene til en pandas dataframe, eller dataramme. Denne er kalt df her. Om vi ser nærmere på koden, så ser vi at den gjør følgende:

  1. lager et objekt con som representerer forbindelsen med databasen. Denne lages ved å bruke connect()-funksjonen til pymysql, som er en pakke for å hente data fra MySQL-databaser. Input er navn på server, brukernavn, passord (automatisk generert) og navn på database.

  2. lager en streng sql med kommandoen til databasen, i SQL-språk

  3. lager en dataframe som kalles df ved å bruke read_sql_query-funksjonen i pandas

Før vi fortsetter er det kanskje greit å forklare hva SQL er. SQL er et språk laget spesifikt for å hente ut data fra dataabaser. Nesten alle databaser er SQL-basert. Syntaksen kan virke litt knotete, men kan være lurt å lære seg dette språket. En god SQL-spørring kan spare deg for mye programmering senere. Dette er imidlertid ikke et kurs i SQL, så vi går ikke nærmere inn på denne syntaksen her.

I tabellen vi henter, over, mangler endel variabler fordi det ikke er plass. For å se navnet på alle variablene kan du bruke keys()-funksjonen til datarammen:

Eksempel 8:

In [18]:
df.keys()
Out[18]:
Index(['Date', 'SecurityId', 'CompanyId', 'Symbol', 'ISIN', 'Name',
       'BestBidPrice', 'BestAskPrice', 'Open', 'High', 'Low', 'Close',
       'OfficialNumberOfTrades', 'OfficialVolume', 'UnofficialNumberOfTrades',
       'UnofficialVolume', 'VolumeWeightedAveragePrice', 'Price',
       'AdjustedPrice', 'Dividends', 'LDividends', 'CorpAdj', 'DividendAdj',
       'Currency', 'Description', 'CountryCode', 'SumAnnualDividends',
       'NumberOfShares', 'CompanyOwnedShares', 'OutstandingShares', 'Exchange',
       'NOKPerForex', 'mktcap', 'OSEBXmktshare_prevmnth',
       'OSEBXAlpha_prevmnth', 'OSEBXBeta_prevmnth', 'SMB', 'HML', 'LIQ', 'MOM',
       'DividendPriceRatio', 'lnDeltaP', 'lnDeltaOSEBX', 'lnDeltaOBX',
       'NOWA_DayLnrate', 'bills_3month_Lnrate', 'Sector', 'IN_OSEBX', 'Equity',
       'Debt', 'Earnings', 'debt_ratio', 'PE'],
      dtype='object')

En dataframe ligner litt på en oppslagsliste. Du henter frem variabelen du vil bruke ved hjelp av hakeparenteser. I Titlondatabasen er avkastningen lnDeltaP, så la oss ta en kikk på på den:

Eksempel 9:

In [19]:
df['lnDeltaP']
Out[19]:
0      0.000000
1     -0.026268
2     -0.011472
3      0.000000
4      0.000000
         ...   
803   -0.162519
804    0.132060
805    0.030459
806    0.000000
807    0.000000
Name: lnDeltaP, Length: 808, dtype: float64

Det viser seg at i aksjemarkedet, så har aksjene en tendens til å bevege seg i samme retning. Går børsen først ned, så vil det gjelde de aller fleste aksjene på børsen. Gjennomsnittetlig avkastning for alle børsens aksjer måles av børsindeksen. I Titlon er børsindeksen lagt inn som en variabel for hvert selskap under navnet lnDeltaOSEBX. La oss derfor undersøke om det stemmer at det er en nær sammenheng mellom Equinors kurs og børsindeksen, ved hjelp av matplotlib:

Eksempel 10:

In [20]:
df.plot.scatter('lnDeltaP','lnDeltaOSEBX')
Out[20]:
<AxesSubplot: xlabel='lnDeltaP', ylabel='lnDeltaOSEBX'>

Du kan finne informasjon om andre aksjer enn Equinor om du vil. Koden under kjører en SQL-spørring som henter navnene på alle selskap i databasen etter 2018. Om du vil hente ut et annet selskap, kan du velge blant disse

Eksempel 11:

In [21]:
sql="SELECT distinct `Name`,`ISIN`,`SecurityId`,CompanyId FROM equity WHERE Year(`Date`)>2018 ORDER BY `Name`"
companies = pd.read_sql_query(sql, con)
companies
C:\Users\esi000\AppData\Local\Temp\ipykernel_30656\3887746134.py:2: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.
  companies = pd.read_sql_query(sql, con)
Out[21]:
Name ISIN SecurityId CompanyId
0 2020 Bulkers BMG9156K1018 1304857 12720
1 5th Planet Games DK0060945467 1301972 12440
2 ABG Sundal Collier Holding NO0003021909 6085 2017
3 Adevinta NO0010844038 1304655 12701
4 Adevinta ser. A NO0010843998 1304652 12701
... ... ... ... ...
236 XACT OBX Bear SE0009723000 69842 7918
237 XACT OBX Bull SE0009723034 69843 7918
238 XXL NO0010716863 1301298 12357
239 Yara International NO0010208051 56559 7760
240 Zalaris NO0010708910 1301140 12310

241 rows × 4 columns

Lage graf med flere serier, der alle har startverdi 100

La oss se nærmere på tre av selskapene, og plott dem sammen. Vi bruker en SQL WHERE-betingelse til å begrense utvalget til de tre selskapene som er nevnt og til datoer etter 2000. Så tar vi også med i SQL-setningen en sortering på dato:

Eksempel 12:

In [22]:
sql=("SELECT distinct Name,date, AdjustedPrice FROM equity "
    "WHERE (Name='Equinor' OR Name='Tomra Systems' OR Name='DNB') "
    "AND `Date`>'2000-01-01'"
    "ORDER BY `Date`")

Vi kan nå kjøre denne spørringen mot Titlon:

Eksempel 13:

In [23]:
df=pd.read_sql_query(sql, con)
df
C:\Users\esi000\AppData\Local\Temp\ipykernel_30656\1427550990.py:1: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.
  df=pd.read_sql_query(sql, con)
Out[23]:
Name date AdjustedPrice
0 DNB 2000-01-03 13.5376
1 Tomra Systems 2000-01-03 48.2225
2 DNB 2000-01-04 13.0850
3 Tomra Systems 2000-01-04 47.5133
4 DNB 2000-01-05 12.6735
... ... ... ...
15376 Equinor 2020-11-26 143.7500
15377 Tomra Systems 2020-11-26 382.8000
15378 DNB 2020-11-27 163.5500
15379 Equinor 2020-11-27 146.8500
15380 Tomra Systems 2020-11-27 386.1000

15381 rows × 3 columns

Dataene ligger nå i "lengdeformat". Det vil si at selskapene ligger etterhverandre i en lang tabell. Om vi ønsker å sammenligne utviklingen kan det være en fordel å få prisene i hvert selskap i en egen kolonne. Det gjør vi slik:

Eksempel 14:

In [24]:
df=df.pivot(index='date', columns='Name', values='AdjustedPrice')
df
Out[24]:
Name DNB Equinor Tomra Systems
date
2000-01-03 13.5376 NaN 48.2225
2000-01-04 13.0850 NaN 47.5133
2000-01-05 12.6735 NaN 46.0950
2000-01-06 12.5500 NaN 45.3859
2000-01-07 12.5500 NaN 46.6269
... ... ... ...
2020-11-23 159.0000 141.25 370.2000
2020-11-24 163.8000 148.65 371.6000
2020-11-25 164.1000 145.75 376.8000
2020-11-26 162.5000 143.75 382.8000
2020-11-27 163.5500 146.85 386.1000

5248 rows × 3 columns

Equinor ble imidlertid ikke børsnotert før i 2001. I alle observasjoner før børsnoteringen står det derfor NaN, hvilket betyr "ingen observasjon". For å kunne sammenligne må alle tre aksjene være observert på hver dato. Vi kan oppnå dette med funksjonen dropna():

Eksempel 15:

In [25]:
df=df.dropna()
df
Out[25]:
Name DNB Equinor Tomra Systems
date
2001-06-18 17.8950 28.1166 117.493
2001-06-19 17.9867 28.5241 108.236
2001-06-20 18.3997 28.9315 108.948
2001-06-21 18.2620 28.5241 103.608
2001-06-22 18.3079 28.3203 100.759
... ... ... ...
2020-11-23 159.0000 141.2500 370.200
2020-11-24 163.8000 148.6500 371.600
2020-11-25 164.1000 145.7500 376.800
2020-11-26 162.5000 143.7500 382.800
2020-11-27 163.5500 146.8500 386.100

4885 rows × 3 columns

Vi ser nå at de tomme cellene er borte. Equinor ble altså børsnotert 18. juni 2001.

For å kunne sammenligne selskapenes utvikling bedre, bør de starte på samme tidspunkt. For å gjøre det deler vi alle observasjonene på den første. For å dele observasjoner på noe, bruker vi div()-funksjonen til datarammen. Vi skal dele på første rad, som er df.iloc[0]. Så multipliserer vi det hele med 100:

Eksempel 16:

In [26]:
df=100*df.div(df.iloc[0])
df
Out[26]:
Name DNB Equinor Tomra Systems
date
2001-06-18 100.000000 100.000000 100.000000
2001-06-19 100.512434 101.449322 92.121233
2001-06-20 102.820341 102.898288 92.727226
2001-06-21 102.050852 101.449322 88.182275
2001-06-22 102.307348 100.724483 85.757449
... ... ... ...
2020-11-23 888.516345 502.372264 315.082601
2020-11-24 915.339480 528.691236 316.274161
2020-11-25 917.015926 518.377044 320.699957
2020-11-26 908.074881 511.263809 325.806644
2020-11-27 913.942442 522.289324 328.615322

4885 rows × 3 columns

Vi ser nå at alle aksjene starter på 100 den datoen Equinor ble børsnotert. Hvilet selskap har vært det beste å investere i? Hvilket har vært verst?

Vi kan nå plotte utviklingen. Når vi jobber med pandas, er det best å bruke den innebygde plot()-funksjonen i pakken. Da får vi automatisk riktige etiketter:

Eksempel 17:

In [27]:
ax=df.plot()
ax.legend(loc='upper left',frameon=False)
Out[27]:
<matplotlib.legend.Legend at 0x287b00bce50>

Eurostat

Eurostat er en veldig nyttig kilde til data. De har et stort utvalg av data på europeiske land. De har laget en egen pakke til python som ikke overraskende heter eurostat. Denne pakken er heller ikke installert i utgangspunktet på jupyter.uit.no. Dere må derfor åpne "Terminal" og kjøre pip install eurostat for å kjøre den.

For å se hvilke tabeller som er der, henter vi innholdsfortegnelsen (table of contents) med funksjonen get_toc_df. Det gir oss en pandas dataramme:

Eksempel 18:

In [28]:
import eurostat
toc = eurostat.get_toc_df()
toc
Out[28]:
title code type last update of data last table structure change data start data end
0 Passengers (excluding cruise passengers) trans... MAR_PA_QM_MT dataset 2023-08-28T23:00:00+0200 2023-08-28T23:00:00+0200 2003-Q1 2023-Q1
1 Passengers (excluding cruise passengers) trans... MAR_PA_QM_NL dataset 2010-02-26T23:00:00+0100 2023-07-28T23:00:00+0200 1997-Q1 2022-Q4
2 Passengers (excluding cruise passengers) trans... MAR_PA_QM_NO dataset 2023-10-17T23:00:00+0200 2023-10-17T23:00:00+0200 2002-Q1 2022-Q4
3 Passengers (excluding cruise passengers) trans... MAR_PA_QM_PL dataset 2023-09-12T11:00:00+0200 2023-09-12T11:00:00+0200 2004-Q1 2023-Q1
4 Passengers (excluding cruise passengers) trans... MAR_PA_QM_PT dataset 2023-09-19T11:00:00+0200 2023-09-19T11:00:00+0200 2000-Q1 2023-Q1
... ... ... ... ... ... ... ...
7547 Percentage of letters delivered on-time (USP u... POST_CUBE1_X$POST_QOS_1 dataset 2023-05-23T08:18:37Z 2023-05-10T10:54:33Z None None
7548 Postal services POST_CUBE1_X dataset 2023-05-23T08:18:37Z 2023-05-10T10:54:33Z 2012 2021
7549 Number of enterprises providing postal services POST_CUBE1_X$NUM701 dataset 2023-05-23T08:18:37Z 2023-05-10T10:54:33Z None None
7550 Access points (USP under direct or indirect d... POST_CUBE1_X$POST_ACC_1 dataset 2023-05-23T08:18:37Z 2023-05-10T10:54:33Z None None
7551 Domestic postal traffic, letter mail and parce... POST_CUBE1_X$POST_DTR_1 dataset 2023-05-23T08:18:37Z 2023-05-10T10:54:33Z None None

7552 rows × 7 columns

Du kan finne hvor mange tabeller det er med len(toc), og det er i skrivende stund over ti tusen tabeller. Det blir litt krevende å lete gjennom alle, så vi ønsker derfor å begrense antall tabeller til de som er relevante. Anta at vi ønsker å se på utviklingen i BNP per innbygger for landene som er med i statistikken. Nærmere bestemt, vi ønsker å finne alle tabeller der 'GDP per capita' er i tittelen.

BNP per innbygger er hvor mye hver person i landet i gjennomsnitt produserer i løpet av ett år.

Vi gjør dette ved å lage følgende "list comprehension": ['GDP per capita' in i for i in toc['title']]. Elementene i denne listen er sant (True) dersom 'GDP per capita' er i tittelen, og usant (false) om det ikke er i tittelen.

Eksempel 19:

In [29]:
gdp_in_toc_list=['GDP per capita' in i for i in toc['title']]

Vi kan så velge de elementene hvor betingelsen er sann ved å sette listen inn i en klammeparentes etter innholdsfortegnelsen, toc[gdp_in_toc_list]. Kun de elementene i innholdsfortegnelsen der det står sant (True) i listen, tas da med.

Eksempel 20:

In [30]:
#collecting only the tables where 'GDP per capita' is in the name
toc_gdp=toc[gdp_in_toc_list]
toc_gdp
Out[30]:
title code type last update of data last table structure change data start data end
6611 GDP per capita in PPS TEC00114 dataset 2023-06-21T23:00:00+0200 2023-06-21T23:00:00+0200 2011 2022
7067 Real GDP per capita SDG_08_10 dataset 2023-10-20T11:00:00+0200 2023-10-20T11:00:00+0200 2000 2022
7097 Purchasing power adjusted GDP per capita SDG_10_10 dataset 2023-06-21T23:00:00+0200 2023-06-21T23:00:00+0200 2000 2022

La oss nå se på tabellen "Purchasing power adjusted GDP per capita", som har kode 'sdg_10_10'. Da bruker vi funksjonen get_data_df med tabellkoden som argument:

Eksempel 21:

In [31]:
gdp_data = eurostat.get_data_df('sdg_10_10')
gdp_data
Out[31]:
freq na_item ppp_cat unit geo\TIME_PERIOD 2000 2001 2002 2003 2004 ... 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022
0 A CV_VI_HAB GDP PC EA19 45.9 44.2 43.2 41.6 41.8 ... 43.3 43.7 44.8 44.1 42.7 41.5 39.9 42.8 44.4 44.5
1 A CV_VI_HAB GDP PC EA20 47.6 45.7 44.5 42.9 43.0 ... 44.1 44.7 45.8 44.9 43.5 42.3 40.6 43.6 44.9 44.8
2 A CV_VI_HAB GDP PC EU27_2007 49.8 48.0 46.8 45.2 44.9 ... 43.0 43.1 44.1 43.2 41.8 40.5 38.7 40.9 NaN NaN
3 A CV_VI_HAB GDP PC EU27_2020 51.8 49.9 48.5 46.8 46.5 ... 44.4 44.6 45.5 44.6 43.1 41.7 39.8 42.1 43.2 42.8
4 A CV_VI_HAB GDP PC EU28 50.6 48.8 47.5 45.8 45.5 ... 43.5 43.7 44.6 43.7 42.2 41.1 39.6 NaN NaN NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
88 A VI_PPS_EU27_2020_HAB GDP PC SI 81.0 82.0 83.0 85.0 88.0 ... 83.0 83.0 83.0 84.0 86.0 87.0 89.0 89.0 90.0 92.0
89 A VI_PPS_EU27_2020_HAB GDP PC SK 51.0 53.0 55.0 57.0 59.0 ... 78.0 78.0 79.0 73.0 71.0 70.0 71.0 72.0 71.0 68.0
90 A VI_PPS_EU27_2020_HAB GDP PC TR 43.0 39.0 38.0 39.0 42.0 ... 62.0 65.0 68.0 66.0 66.0 63.0 59.0 61.0 63.0 69.0
91 A VI_PPS_EU27_2020_HAB GDP PC UK 120.0 120.0 120.0 123.0 124.0 ... 111.0 111.0 111.0 109.0 108.0 106.0 104.0 100.0 101.0 100.0
92 A VI_PPS_EU27_2020_HAB GDP PC US 164.0 160.0 156.0 159.0 161.0 ... 147.0 148.0 148.0 142.0 140.0 140.0 136.0 138.0 143.0 141.0

93 rows × 28 columns

Tabellen inneholder imidlertid endel data vi ikke ønsker å ha med. For det første ønsker vi kun å ta med tilfellene der feltet "na_item" er lik 'EXP_PPS_EU27_2020_HAB', for det andre er her dataene til hvert enkelt land ligger. Dette gjør vi på samme måte som over med listen gdp_data['na_item']=='EXP_PPS_EU27_2020_HAB', som er sann når "na_item" er lik 'EXP_PPS_EU27_2020_HAB'. Setter vi inn denne listen i klammeparentes etter gdp_data får vi en filtrert liste:

Eksempel 22:

In [32]:
gdp_data = gdp_data[gdp_data['na_item']=='EXP_PPS_EU27_2020_HAB']
gdp_data
Out[32]:
freq na_item ppp_cat unit geo\TIME_PERIOD 2000 2001 2002 2003 2004 ... 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022
5 A EXP_PPS_EU27_2020_HAB GDP PC AL 3200.0 3600.0 3800.0 4100.0 4400.0 ... 7600.0 8100.0 8400.0 8400.0 8800.0 9200.0 9500.0 9200.0 10300.0 12000.0
6 A EXP_PPS_EU27_2020_HAB GDP PC AT 24400.0 24600.0 25600.0 26400.0 27600.0 ... 34600.0 35000.0 35900.0 36600.0 37200.0 38600.0 39400.0 37500.0 39800.0 44100.0
7 A EXP_PPS_EU27_2020_HAB GDP PC BA NaN NaN NaN NaN NaN ... 8000.0 8100.0 8500.0 8900.0 9200.0 9800.0 10200.0 9900.0 11100.0 12500.0
8 A EXP_PPS_EU27_2020_HAB GDP PC BE 23100.0 23800.0 24800.0 25400.0 26200.0 ... 31500.0 32200.0 33200.0 33800.0 34600.0 35600.0 36800.0 35700.0 39000.0 42200.0
9 A EXP_PPS_EU27_2020_HAB GDP PC BG 5300.0 5800.0 6400.0 6900.0 7500.0 ... 12000.0 12600.0 13200.0 13900.0 14700.0 15600.0 16600.0 16600.0 18600.0 20700.0
10 A EXP_PPS_EU27_2020_HAB GDP PC CH 30200.0 31000.0 31500.0 31600.0 32600.0 ... 44500.0 45400.0 46900.0 46800.0 46800.0 47900.0 47900.0 46400.0 50400.0 54300.0
11 A EXP_PPS_EU27_2020_HAB GDP PC CY 17700.0 18900.0 19300.0 19900.0 21200.0 ... 22000.0 21600.0 22900.0 24900.0 26400.0 27600.0 29100.0 27100.0 29400.0 32300.0
12 A EXP_PPS_EU27_2020_HAB GDP PC CZ 13500.0 14600.0 15000.0 16000.0 17100.0 ... 22200.0 23300.0 24400.0 25100.0 26700.0 27900.0 29200.0 28000.0 29700.0 32000.0
13 A EXP_PPS_EU27_2020_HAB GDP PC DE 22800.0 23700.0 24200.0 24800.0 25900.0 ... 32500.0 33700.0 34200.0 35100.0 36500.0 37400.0 37900.0 37000.0 39000.0 41200.0
14 A EXP_PPS_EU27_2020_HAB GDP PC DK 23800.0 24400.0 25100.0 25300.0 26900.0 ... 33700.0 34300.0 35300.0 36100.0 38000.0 39000.0 39500.0 39900.0 43000.0 48100.0
15 A EXP_PPS_EU27_2020_HAB GDP PC EA19 21100.0 22000.0 22600.0 23100.0 23800.0 ... 28200.0 28700.0 29600.0 30300.0 31400.0 32300.0 33200.0 31600.0 34000.0 36700.0
16 A EXP_PPS_EU27_2020_HAB GDP PC EA20 20900.0 21800.0 22500.0 22900.0 23700.0 ... 28000.0 28500.0 29400.0 30200.0 31200.0 32100.0 33100.0 31500.0 33900.0 36600.0
17 A EXP_PPS_EU27_2020_HAB GDP PC EE 7800.0 8500.0 9500.0 10700.0 11800.0 ... 19800.0 20700.0 21000.0 21700.0 23300.0 24700.0 25800.0 25800.0 28800.0 30700.0
18 A EXP_PPS_EU27_2020_HAB GDP PC EL 16200.0 17300.0 18500.0 19600.0 20800.0 ... 18800.0 19100.0 19200.0 19100.0 19600.0 20100.0 20600.0 18600.0 20700.0 23900.0
19 A EXP_PPS_EU27_2020_HAB GDP PC ES 17900.0 19000.0 20000.0 20600.0 21400.0 ... 23400.0 24000.0 25100.0 25900.0 27200.0 27600.0 28500.0 24900.0 27000.0 29800.0
20 A EXP_PPS_EU27_2020_HAB GDP PC EU27_2007 18900.0 19800.0 20400.0 21000.0 21900.0 ... 26500.0 27100.0 28000.0 28600.0 29700.0 30600.0 31600.0 30100.0 NaN NaN
21 A EXP_PPS_EU27_2020_HAB GDP PC EU27_2020 18400.0 19200.0 19900.0 20300.0 21200.0 ... 26000.0 26600.0 27500.0 28200.0 29300.0 30300.0 31300.0 30000.0 32500.0 35200.0
22 A EXP_PPS_EU27_2020_HAB GDP PC EU28 18800.0 19700.0 20400.0 20900.0 21800.0 ... 26400.0 27000.0 27900.0 28500.0 29600.0 30500.0 31500.0 30000.0 NaN NaN
23 A EXP_PPS_EU27_2020_HAB GDP PC FI 22200.0 23000.0 23400.0 23800.0 25500.0 ... 29900.0 29900.0 30500.0 31200.0 32700.0 33600.0 34200.0 34300.0 36300.0 38400.0
24 A EXP_PPS_EU27_2020_HAB GDP PC FR 21700.0 22800.0 23400.0 23100.0 23700.0 ... 28500.0 28800.0 29400.0 29800.0 30500.0 31400.0 33100.0 31400.0 33800.0 35800.0
25 A EXP_PPS_EU27_2020_HAB GDP PC HR 8900.0 9600.0 10500.0 11200.0 12000.0 ... 16000.0 16000.0 16800.0 17600.0 18700.0 19600.0 20800.0 19500.0 22600.0 25700.0
26 A EXP_PPS_EU27_2020_HAB GDP PC HU 9800.0 10900.0 11900.0 12700.0 13300.0 ... 17700.0 18400.0 19300.0 19400.0 20300.0 21600.0 22900.0 22400.0 24400.0 27300.0
27 A EXP_PPS_EU27_2020_HAB GDP PC IE 25100.0 27000.0 28900.0 29800.0 31700.0 ... 34600.0 36700.0 49700.0 49800.0 53600.0 57500.0 59300.0 61600.0 70800.0 82100.0
28 A EXP_PPS_EU27_2020_HAB GDP PC IS 24700.0 26400.0 26700.0 26900.0 29000.0 ... 32000.0 33000.0 35400.0 37200.0 38200.0 38800.0 39300.0 35600.0 38600.0 44900.0
29 A EXP_PPS_EU27_2020_HAB GDP PC IT 22500.0 23200.0 23500.0 23900.0 24100.0 ... 26200.0 26100.0 26700.0 28000.0 28800.0 29400.0 30200.0 28300.0 30900.0 33700.0
30 A EXP_PPS_EU27_2020_HAB GDP PC JP 22700.0 23100.0 23500.0 24100.0 25200.0 ... 28500.0 28300.0 29400.0 28200.0 28500.0 28700.0 28000.0 27400.0 28400.0 29700.0
31 A EXP_PPS_EU27_2020_HAB GDP PC LT 7000.0 7800.0 8600.0 9900.0 10600.0 ... 19300.0 20200.0 20700.0 21500.0 23200.0 24700.0 26400.0 26300.0 29000.0 31500.0
32 A EXP_PPS_EU27_2020_HAB GDP PC LU 45700.0 46400.0 48000.0 49300.0 52800.0 ... 72600.0 75200.0 77600.0 78500.0 78900.0 78900.0 78700.0 78500.0 87000.0 91900.0
33 A EXP_PPS_EU27_2020_HAB GDP PC LV 6700.0 7500.0 8300.0 9100.0 10000.0 ... 16300.0 17100.0 18000.0 18600.0 19700.0 20900.0 21700.0 21600.0 23300.0 25900.0
34 A EXP_PPS_EU27_2020_HAB GDP PC ME NaN NaN NaN NaN NaN ... 10700.0 11000.0 11700.0 12600.0 13500.0 14600.0 15700.0 13400.0 15500.0 17500.0
35 A EXP_PPS_EU27_2020_HAB GDP PC MK 5100.0 5000.0 5200.0 5400.0 5900.0 ... 9200.0 9600.0 10000.0 10500.0 10800.0 11400.0 11900.0 11300.0 13700.0 14700.0
36 A EXP_PPS_EU27_2020_HAB GDP PC MT 15300.0 15300.0 16100.0 17200.0 17600.0 ... 23300.0 24600.0 26900.0 27600.0 29800.0 30900.0 32400.0 29400.0 33100.0 36000.0
37 A EXP_PPS_EU27_2020_HAB GDP PC NL 26500.0 27500.0 28200.0 28000.0 29300.0 ... 35500.0 35300.0 36200.0 36300.0 37800.0 39200.0 39700.0 39200.0 42000.0 45300.0
38 A EXP_PPS_EU27_2020_HAB GDP PC NO 30700.0 31300.0 31200.0 31800.0 34900.0 ... 48600.0 47500.0 43700.0 41200.0 44400.0 47600.0 46100.0 42700.0 54300.0 74800.0
39 A EXP_PPS_EU27_2020_HAB GDP PC PL 8900.0 9200.0 9700.0 10100.0 10900.0 ... 17300.0 17900.0 19000.0 19300.0 20300.0 21500.0 22800.0 22900.0 25100.0 28000.0
40 A EXP_PPS_EU27_2020_HAB GDP PC PT 15700.0 16200.0 16700.0 17100.0 17500.0 ... 20200.0 20600.0 21300.0 22000.0 22700.0 23700.0 24600.0 22900.0 24400.0 27200.0
41 A EXP_PPS_EU27_2020_HAB GDP PC RO 4900.0 5300.0 5900.0 6200.0 7300.0 ... 14200.0 14800.0 15500.0 16600.0 18500.0 20000.0 21800.0 21800.0 24000.0 27100.0
42 A EXP_PPS_EU27_2020_HAB GDP PC RS 5000.0 5400.0 5900.0 6300.0 6900.0 ... 10600.0 10500.0 10700.0 11000.0 11400.0 12000.0 12800.0 12800.0 14300.0 15500.0
43 A EXP_PPS_EU27_2020_HAB GDP PC SE 24600.0 24800.0 25300.0 26100.0 27700.0 ... 33400.0 33800.0 35300.0 35000.0 35700.0 36300.0 37200.0 36800.0 40000.0 42300.0
44 A EXP_PPS_EU27_2020_HAB GDP PC SI 14900.0 15700.0 16600.0 17300.0 18600.0 ... 21600.0 22100.0 22700.0 23600.0 25100.0 26500.0 27800.0 26800.0 29200.0 32500.0
45 A EXP_PPS_EU27_2020_HAB GDP PC SK 9400.0 10300.0 10900.0 11600.0 12400.0 ... 20200.0 20800.0 21600.0 20700.0 20700.0 21300.0 22100.0 21600.0 22900.0 24100.0
46 A EXP_PPS_EU27_2020_HAB GDP PC TR 7900.0 7600.0 7600.0 7900.0 8900.0 ... 16100.0 17300.0 18600.0 18500.0 19400.0 19200.0 18500.0 18300.0 20300.0 24300.0
47 A EXP_PPS_EU27_2020_HAB GDP PC UK 22000.0 23100.0 23800.0 24900.0 26200.0 ... 28900.0 29600.0 30600.0 30700.0 31700.0 32000.0 32500.0 30000.0 32900.0 35100.0
48 A EXP_PPS_EU27_2020_HAB GDP PC US 30100.0 30700.0 31100.0 32400.0 34000.0 ... 38300.0 39400.0 40600.0 40000.0 40900.0 42300.0 42700.0 41600.0 46500.0 49700.0

44 rows × 28 columns

Videre ønsker vi å fjerne de definisjonene av EU vi ikke trenger, som er 'EA18','EA19','EU27_2007','EU27_2020','EA18' og 'EA18'. Vi bruker samme teknikk, vi lager en liste som inneholder True og False, avhengig om en betingelse er oppfylt.

Feltet vi nå skal filtrere ut fra er "geo\time", som innholder landkodene. Siden vi ikke bare skal sjekke om én streng er i denne kolonnen, men om flere mulige kandidater er det, kan vi ikke bruke "list comprehension" som over. Vi bruker i stedet en pandas-funksjon isin (is in), som tar en liste med "ting" vi ikke vil ha i feltet som argument.

Eksempel 23:

In [33]:
unwanted=gdp_data['geo\\TIME_PERIOD'].isin(['EA18','EA19','EU27_2007','EU27_2020','EA18','EA18'])

Men vi vil ikke ha unwanted, så vi tar kun med tilfellene der unwanted==False. I tillegg endrer vi kollonnenavnet for land til noe mer gjenkjennelig.

Eksempel 24:

In [34]:
gdp_data_fltrd = gdp_data[unwanted==False]
gdp_data_fltrd = gdp_data_fltrd.rename(columns={'geo\\TIME_PERIOD':'country'})

La oss se på utviklingen i BNP justert for kjøpekraft siden Angela Merkel tiltrådte som forbundskansler i 2005. Vi velger ut kolonnene 2005 til 2020, i tillegg til kolonnen 'geo\time' med landkodene, som skal stå først. Vi gjør det ved å lage en liste med de kolonnene vi ønsker å hente ut fra gdp_data. Vi lager da to lister som vi slår sammen:

Liste 1: Vi starter med navnet til første kolonne 'geo\time', som vi lager om til en liste med ett element ved hjelp av klammeparenteser: ['geo\\time'].

Liste 2: Vi bruker så den innebygde range() til å generere fra 2005 til 2020, og konverterer resultatet til en liste: list(range(2005,2021).

Summen av disse to listene blir da en liste med 'geo\time' først og så årstallene.

Eksempel 25:

In [35]:
gdp_data_fltrd
Out[35]:
freq na_item ppp_cat unit country 2000 2001 2002 2003 2004 ... 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022
5 A EXP_PPS_EU27_2020_HAB GDP PC AL 3200.0 3600.0 3800.0 4100.0 4400.0 ... 7600.0 8100.0 8400.0 8400.0 8800.0 9200.0 9500.0 9200.0 10300.0 12000.0
6 A EXP_PPS_EU27_2020_HAB GDP PC AT 24400.0 24600.0 25600.0 26400.0 27600.0 ... 34600.0 35000.0 35900.0 36600.0 37200.0 38600.0 39400.0 37500.0 39800.0 44100.0
7 A EXP_PPS_EU27_2020_HAB GDP PC BA NaN NaN NaN NaN NaN ... 8000.0 8100.0 8500.0 8900.0 9200.0 9800.0 10200.0 9900.0 11100.0 12500.0
8 A EXP_PPS_EU27_2020_HAB GDP PC BE 23100.0 23800.0 24800.0 25400.0 26200.0 ... 31500.0 32200.0 33200.0 33800.0 34600.0 35600.0 36800.0 35700.0 39000.0 42200.0
9 A EXP_PPS_EU27_2020_HAB GDP PC BG 5300.0 5800.0 6400.0 6900.0 7500.0 ... 12000.0 12600.0 13200.0 13900.0 14700.0 15600.0 16600.0 16600.0 18600.0 20700.0
10 A EXP_PPS_EU27_2020_HAB GDP PC CH 30200.0 31000.0 31500.0 31600.0 32600.0 ... 44500.0 45400.0 46900.0 46800.0 46800.0 47900.0 47900.0 46400.0 50400.0 54300.0
11 A EXP_PPS_EU27_2020_HAB GDP PC CY 17700.0 18900.0 19300.0 19900.0 21200.0 ... 22000.0 21600.0 22900.0 24900.0 26400.0 27600.0 29100.0 27100.0 29400.0 32300.0
12 A EXP_PPS_EU27_2020_HAB GDP PC CZ 13500.0 14600.0 15000.0 16000.0 17100.0 ... 22200.0 23300.0 24400.0 25100.0 26700.0 27900.0 29200.0 28000.0 29700.0 32000.0
13 A EXP_PPS_EU27_2020_HAB GDP PC DE 22800.0 23700.0 24200.0 24800.0 25900.0 ... 32500.0 33700.0 34200.0 35100.0 36500.0 37400.0 37900.0 37000.0 39000.0 41200.0
14 A EXP_PPS_EU27_2020_HAB GDP PC DK 23800.0 24400.0 25100.0 25300.0 26900.0 ... 33700.0 34300.0 35300.0 36100.0 38000.0 39000.0 39500.0 39900.0 43000.0 48100.0
16 A EXP_PPS_EU27_2020_HAB GDP PC EA20 20900.0 21800.0 22500.0 22900.0 23700.0 ... 28000.0 28500.0 29400.0 30200.0 31200.0 32100.0 33100.0 31500.0 33900.0 36600.0
17 A EXP_PPS_EU27_2020_HAB GDP PC EE 7800.0 8500.0 9500.0 10700.0 11800.0 ... 19800.0 20700.0 21000.0 21700.0 23300.0 24700.0 25800.0 25800.0 28800.0 30700.0
18 A EXP_PPS_EU27_2020_HAB GDP PC EL 16200.0 17300.0 18500.0 19600.0 20800.0 ... 18800.0 19100.0 19200.0 19100.0 19600.0 20100.0 20600.0 18600.0 20700.0 23900.0
19 A EXP_PPS_EU27_2020_HAB GDP PC ES 17900.0 19000.0 20000.0 20600.0 21400.0 ... 23400.0 24000.0 25100.0 25900.0 27200.0 27600.0 28500.0 24900.0 27000.0 29800.0
22 A EXP_PPS_EU27_2020_HAB GDP PC EU28 18800.0 19700.0 20400.0 20900.0 21800.0 ... 26400.0 27000.0 27900.0 28500.0 29600.0 30500.0 31500.0 30000.0 NaN NaN
23 A EXP_PPS_EU27_2020_HAB GDP PC FI 22200.0 23000.0 23400.0 23800.0 25500.0 ... 29900.0 29900.0 30500.0 31200.0 32700.0 33600.0 34200.0 34300.0 36300.0 38400.0
24 A EXP_PPS_EU27_2020_HAB GDP PC FR 21700.0 22800.0 23400.0 23100.0 23700.0 ... 28500.0 28800.0 29400.0 29800.0 30500.0 31400.0 33100.0 31400.0 33800.0 35800.0
25 A EXP_PPS_EU27_2020_HAB GDP PC HR 8900.0 9600.0 10500.0 11200.0 12000.0 ... 16000.0 16000.0 16800.0 17600.0 18700.0 19600.0 20800.0 19500.0 22600.0 25700.0
26 A EXP_PPS_EU27_2020_HAB GDP PC HU 9800.0 10900.0 11900.0 12700.0 13300.0 ... 17700.0 18400.0 19300.0 19400.0 20300.0 21600.0 22900.0 22400.0 24400.0 27300.0
27 A EXP_PPS_EU27_2020_HAB GDP PC IE 25100.0 27000.0 28900.0 29800.0 31700.0 ... 34600.0 36700.0 49700.0 49800.0 53600.0 57500.0 59300.0 61600.0 70800.0 82100.0
28 A EXP_PPS_EU27_2020_HAB GDP PC IS 24700.0 26400.0 26700.0 26900.0 29000.0 ... 32000.0 33000.0 35400.0 37200.0 38200.0 38800.0 39300.0 35600.0 38600.0 44900.0
29 A EXP_PPS_EU27_2020_HAB GDP PC IT 22500.0 23200.0 23500.0 23900.0 24100.0 ... 26200.0 26100.0 26700.0 28000.0 28800.0 29400.0 30200.0 28300.0 30900.0 33700.0
30 A EXP_PPS_EU27_2020_HAB GDP PC JP 22700.0 23100.0 23500.0 24100.0 25200.0 ... 28500.0 28300.0 29400.0 28200.0 28500.0 28700.0 28000.0 27400.0 28400.0 29700.0
31 A EXP_PPS_EU27_2020_HAB GDP PC LT 7000.0 7800.0 8600.0 9900.0 10600.0 ... 19300.0 20200.0 20700.0 21500.0 23200.0 24700.0 26400.0 26300.0 29000.0 31500.0
32 A EXP_PPS_EU27_2020_HAB GDP PC LU 45700.0 46400.0 48000.0 49300.0 52800.0 ... 72600.0 75200.0 77600.0 78500.0 78900.0 78900.0 78700.0 78500.0 87000.0 91900.0
33 A EXP_PPS_EU27_2020_HAB GDP PC LV 6700.0 7500.0 8300.0 9100.0 10000.0 ... 16300.0 17100.0 18000.0 18600.0 19700.0 20900.0 21700.0 21600.0 23300.0 25900.0
34 A EXP_PPS_EU27_2020_HAB GDP PC ME NaN NaN NaN NaN NaN ... 10700.0 11000.0 11700.0 12600.0 13500.0 14600.0 15700.0 13400.0 15500.0 17500.0
35 A EXP_PPS_EU27_2020_HAB GDP PC MK 5100.0 5000.0 5200.0 5400.0 5900.0 ... 9200.0 9600.0 10000.0 10500.0 10800.0 11400.0 11900.0 11300.0 13700.0 14700.0
36 A EXP_PPS_EU27_2020_HAB GDP PC MT 15300.0 15300.0 16100.0 17200.0 17600.0 ... 23300.0 24600.0 26900.0 27600.0 29800.0 30900.0 32400.0 29400.0 33100.0 36000.0
37 A EXP_PPS_EU27_2020_HAB GDP PC NL 26500.0 27500.0 28200.0 28000.0 29300.0 ... 35500.0 35300.0 36200.0 36300.0 37800.0 39200.0 39700.0 39200.0 42000.0 45300.0
38 A EXP_PPS_EU27_2020_HAB GDP PC NO 30700.0 31300.0 31200.0 31800.0 34900.0 ... 48600.0 47500.0 43700.0 41200.0 44400.0 47600.0 46100.0 42700.0 54300.0 74800.0
39 A EXP_PPS_EU27_2020_HAB GDP PC PL 8900.0 9200.0 9700.0 10100.0 10900.0 ... 17300.0 17900.0 19000.0 19300.0 20300.0 21500.0 22800.0 22900.0 25100.0 28000.0
40 A EXP_PPS_EU27_2020_HAB GDP PC PT 15700.0 16200.0 16700.0 17100.0 17500.0 ... 20200.0 20600.0 21300.0 22000.0 22700.0 23700.0 24600.0 22900.0 24400.0 27200.0
41 A EXP_PPS_EU27_2020_HAB GDP PC RO 4900.0 5300.0 5900.0 6200.0 7300.0 ... 14200.0 14800.0 15500.0 16600.0 18500.0 20000.0 21800.0 21800.0 24000.0 27100.0
42 A EXP_PPS_EU27_2020_HAB GDP PC RS 5000.0 5400.0 5900.0 6300.0 6900.0 ... 10600.0 10500.0 10700.0 11000.0 11400.0 12000.0 12800.0 12800.0 14300.0 15500.0
43 A EXP_PPS_EU27_2020_HAB GDP PC SE 24600.0 24800.0 25300.0 26100.0 27700.0 ... 33400.0 33800.0 35300.0 35000.0 35700.0 36300.0 37200.0 36800.0 40000.0 42300.0
44 A EXP_PPS_EU27_2020_HAB GDP PC SI 14900.0 15700.0 16600.0 17300.0 18600.0 ... 21600.0 22100.0 22700.0 23600.0 25100.0 26500.0 27800.0 26800.0 29200.0 32500.0
45 A EXP_PPS_EU27_2020_HAB GDP PC SK 9400.0 10300.0 10900.0 11600.0 12400.0 ... 20200.0 20800.0 21600.0 20700.0 20700.0 21300.0 22100.0 21600.0 22900.0 24100.0
46 A EXP_PPS_EU27_2020_HAB GDP PC TR 7900.0 7600.0 7600.0 7900.0 8900.0 ... 16100.0 17300.0 18600.0 18500.0 19400.0 19200.0 18500.0 18300.0 20300.0 24300.0
47 A EXP_PPS_EU27_2020_HAB GDP PC UK 22000.0 23100.0 23800.0 24900.0 26200.0 ... 28900.0 29600.0 30600.0 30700.0 31700.0 32000.0 32500.0 30000.0 32900.0 35100.0
48 A EXP_PPS_EU27_2020_HAB GDP PC US 30100.0 30700.0 31100.0 32400.0 34000.0 ... 38300.0 39400.0 40600.0 40000.0 40900.0 42300.0 42700.0 41600.0 46500.0 49700.0

41 rows × 28 columns

In [36]:
chosen_columns=['country']+[str(i) for i in range(2005,2021)]
chosen_columns
Out[36]:
['country',
 '2005',
 '2006',
 '2007',
 '2008',
 '2009',
 '2010',
 '2011',
 '2012',
 '2013',
 '2014',
 '2015',
 '2016',
 '2017',
 '2018',
 '2019',
 '2020']

Vi kan nå velge ut kun disse kolonnene ved å velge samtlige rader fra gdp_data.loc, og kolonnene angitt av listen:

Eksempel 26:

In [37]:
gdp_data_fltrd2 = gdp_data_fltrd[chosen_columns]

Så ønsker vi videre å kategorisere observasjonene ut fra landkode, og ikke rekkefølge. Vi setter derfor 'geo\time' som indeks:

Eksempel 27:

In [38]:
gdp_data_fltrd2=gdp_data_fltrd2.set_index('country')
gdp_data_fltrd2
Out[38]:
2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020
country
AL 4800.0 5200.0 5800.0 6400.0 6700.0 7300.0 7600.0 7800.0 7600.0 8100.0 8400.0 8400.0 8800.0 9200.0 9500.0 9200.0
AT 28700.0 29900.0 31100.0 32100.0 30900.0 31800.0 33100.0 34300.0 34600.0 35000.0 35900.0 36600.0 37200.0 38600.0 39400.0 37500.0
BA 5600.0 6300.0 6900.0 7400.0 7200.0 7400.0 7700.0 7800.0 8000.0 8100.0 8500.0 8900.0 9200.0 9800.0 10200.0 9900.0
BE 27200.0 28000.0 29000.0 29400.0 28500.0 30100.0 30500.0 31200.0 31500.0 32200.0 33200.0 33800.0 34600.0 35600.0 36800.0 35700.0
BG 8300.0 9000.0 10000.0 10900.0 10500.0 11100.0 11700.0 12100.0 12000.0 12600.0 13200.0 13900.0 14700.0 15600.0 16600.0 16600.0
CH 33800.0 36500.0 39900.0 41500.0 39800.0 41100.0 42800.0 43900.0 44500.0 45400.0 46900.0 46800.0 46800.0 47900.0 47900.0 46400.0
CY 22700.0 23900.0 26000.0 27000.0 25600.0 25400.0 24900.0 23600.0 22000.0 21600.0 22900.0 24900.0 26400.0 27600.0 29100.0 27100.0
CZ 18100.0 19000.0 20700.0 21600.0 20900.0 21000.0 21600.0 21600.0 22200.0 23300.0 24400.0 25100.0 26700.0 27900.0 29200.0 28000.0
DE 26400.0 27600.0 29100.0 29800.0 28300.0 30000.0 31700.0 32000.0 32500.0 33700.0 34200.0 35100.0 36500.0 37400.0 37900.0 37000.0
DK 28000.0 29700.0 30800.0 32000.0 30500.0 32500.0 33100.0 33100.0 33700.0 34300.0 35300.0 36100.0 38000.0 39000.0 39500.0 39900.0
EA20 24600.0 25800.0 27100.0 27700.0 26200.0 27000.0 27700.0 27700.0 28000.0 28500.0 29400.0 30200.0 31200.0 32100.0 33100.0 31500.0
EE 13600.0 15300.0 17500.0 17700.0 15400.0 16300.0 18300.0 19200.0 19800.0 20700.0 21000.0 21700.0 23300.0 24700.0 25800.0 25800.0
EL 20900.0 22700.0 23100.0 23900.0 22900.0 21100.0 19100.0 18400.0 18800.0 19100.0 19200.0 19100.0 19600.0 20100.0 20600.0 18600.0
ES 22600.0 24400.0 25600.0 25800.0 24200.0 24000.0 23700.0 23400.0 23400.0 24000.0 25100.0 25900.0 27200.0 27600.0 28500.0 24900.0
EU28 22600.0 23800.0 25000.0 25700.0 24400.0 25300.0 25900.0 26100.0 26400.0 27000.0 27900.0 28500.0 29600.0 30500.0 31500.0 30000.0
FI 26200.0 27400.0 29900.0 31100.0 28700.0 29500.0 30500.0 30200.0 29900.0 29900.0 30500.0 31200.0 32700.0 33600.0 34200.0 34300.0
FR 25000.0 25800.0 26900.0 27200.0 26200.0 27200.0 27900.0 27800.0 28500.0 28800.0 29400.0 29800.0 30500.0 31400.0 33100.0 31400.0
HR 12700.0 14000.0 15400.0 16300.0 15300.0 15200.0 15700.0 15800.0 16000.0 16000.0 16800.0 17600.0 18700.0 19600.0 20800.0 19500.0
HU 14000.0 14600.0 15100.0 16100.0 15600.0 16500.0 17200.0 17200.0 17700.0 18400.0 19300.0 19400.0 20300.0 21600.0 22900.0 22400.0
IE 33100.0 35200.0 36900.0 34200.0 31300.0 32700.0 33600.0 34300.0 34600.0 36700.0 49700.0 49800.0 53600.0 57500.0 59300.0 61600.0
IS 30600.0 31500.0 32800.0 33700.0 31500.0 30100.0 30500.0 31000.0 32000.0 33000.0 35400.0 37200.0 38200.0 38800.0 39300.0 35600.0
IT 24600.0 25700.0 26800.0 27400.0 25900.0 26400.0 27000.0 26600.0 26200.0 26100.0 26700.0 28000.0 28800.0 29400.0 30200.0 28300.0
JP 26300.0 26700.0 27600.0 27400.0 25300.0 26700.0 27000.0 27800.0 28500.0 28300.0 29400.0 28200.0 28500.0 28700.0 28000.0 27400.0
LT 11900.0 13100.0 15100.0 16100.0 13700.0 15200.0 17100.0 18200.0 19300.0 20200.0 20700.0 21500.0 23200.0 24700.0 26400.0 26300.0
LU 56300.0 62700.0 67100.0 70500.0 65500.0 68300.0 70200.0 71300.0 72600.0 75200.0 77600.0 78500.0 78900.0 78900.0 78700.0 78500.0
LV 11400.0 12600.0 14400.0 15200.0 12900.0 13400.0 14300.0 15700.0 16300.0 17100.0 18000.0 18600.0 19700.0 20900.0 21700.0 21600.0
ME NaN 8300.0 9800.0 10700.0 9800.0 10300.0 10800.0 10200.0 10700.0 11000.0 11700.0 12600.0 13500.0 14600.0 15700.0 13400.0
MK 6400.0 6900.0 7400.0 8200.0 8300.0 8600.0 8700.0 8800.0 9200.0 9600.0 10000.0 10500.0 10800.0 11400.0 11900.0 11300.0
MT 18300.0 18500.0 19800.0 20600.0 20100.0 21700.0 21600.0 22300.0 23300.0 24600.0 26900.0 27600.0 29800.0 30900.0 32400.0 29400.0
NL 30800.0 32600.0 34700.0 36000.0 33600.0 34100.0 34700.0 34900.0 35500.0 35300.0 36200.0 36300.0 37800.0 39200.0 39700.0 39200.0
NO 39300.0 43200.0 44300.0 48200.0 42000.0 44100.0 46500.0 48600.0 48600.0 47500.0 43700.0 41200.0 44400.0 47600.0 46100.0 42700.0
PL 11400.0 12000.0 13300.0 14200.0 14400.0 15600.0 16700.0 17200.0 17300.0 17900.0 19000.0 19300.0 20300.0 21500.0 22800.0 22900.0
PT 18600.0 19600.0 20300.0 20700.0 20000.0 20600.0 19900.0 19500.0 20200.0 20600.0 21300.0 22000.0 22700.0 23700.0 24600.0 22900.0
RO 7900.0 9200.0 10800.0 13000.0 12600.0 13100.0 14000.0 14600.0 14200.0 14800.0 15500.0 16600.0 18500.0 20000.0 21800.0 21800.0
RS 7500.0 8100.0 8900.0 9800.0 9500.0 9700.0 10200.0 10300.0 10600.0 10500.0 10700.0 11000.0 11400.0 12000.0 12800.0 12800.0
SE 28000.0 30000.0 32300.0 32700.0 30400.0 32000.0 33200.0 33500.0 33400.0 33800.0 35300.0 35000.0 35700.0 36300.0 37200.0 36800.0
SI 19500.0 20400.0 21800.0 23000.0 20800.0 21100.0 21600.0 21400.0 21600.0 22100.0 22700.0 23600.0 25100.0 26500.0 27800.0 26800.0
SK 13600.0 15000.0 16700.0 18300.0 17300.0 19100.0 19600.0 19900.0 20200.0 20800.0 21600.0 20700.0 20700.0 21300.0 22100.0 21600.0
TR 9800.0 10800.0 11700.0 12400.0 11700.0 13100.0 14600.0 15200.0 16100.0 17300.0 18600.0 18500.0 19400.0 19200.0 18500.0 18300.0
UK 26800.0 27600.0 28100.0 28500.0 26500.0 27700.0 27800.0 28300.0 28900.0 29600.0 30600.0 30700.0 31700.0 32000.0 32500.0 30000.0
US 36100.0 36800.0 37900.0 37600.0 35600.0 36800.0 37200.0 38100.0 38300.0 39400.0 40600.0 40000.0 40900.0 42300.0 42700.0 41600.0

Vi skal nå "rebasere" tallene slik at alle starter på 100. Vi må først sørge for at hvert årstall er en observasjon/rad, og ikke en kolonne. Vi gjør det med pandasfunksjonen transpose(). Den bytter om på rader og kolonner:

Eksempel 28:

In [39]:
gdp_data_fltrd3=gdp_data_fltrd2.transpose()
gdp_data_fltrd3
Out[39]:
country AL AT BA BE BG CH CY CZ DE DK ... PL PT RO RS SE SI SK TR UK US
2005 4800.0 28700.0 5600.0 27200.0 8300.0 33800.0 22700.0 18100.0 26400.0 28000.0 ... 11400.0 18600.0 7900.0 7500.0 28000.0 19500.0 13600.0 9800.0 26800.0 36100.0
2006 5200.0 29900.0 6300.0 28000.0 9000.0 36500.0 23900.0 19000.0 27600.0 29700.0 ... 12000.0 19600.0 9200.0 8100.0 30000.0 20400.0 15000.0 10800.0 27600.0 36800.0
2007 5800.0 31100.0 6900.0 29000.0 10000.0 39900.0 26000.0 20700.0 29100.0 30800.0 ... 13300.0 20300.0 10800.0 8900.0 32300.0 21800.0 16700.0 11700.0 28100.0 37900.0
2008 6400.0 32100.0 7400.0 29400.0 10900.0 41500.0 27000.0 21600.0 29800.0 32000.0 ... 14200.0 20700.0 13000.0 9800.0 32700.0 23000.0 18300.0 12400.0 28500.0 37600.0
2009 6700.0 30900.0 7200.0 28500.0 10500.0 39800.0 25600.0 20900.0 28300.0 30500.0 ... 14400.0 20000.0 12600.0 9500.0 30400.0 20800.0 17300.0 11700.0 26500.0 35600.0
2010 7300.0 31800.0 7400.0 30100.0 11100.0 41100.0 25400.0 21000.0 30000.0 32500.0 ... 15600.0 20600.0 13100.0 9700.0 32000.0 21100.0 19100.0 13100.0 27700.0 36800.0
2011 7600.0 33100.0 7700.0 30500.0 11700.0 42800.0 24900.0 21600.0 31700.0 33100.0 ... 16700.0 19900.0 14000.0 10200.0 33200.0 21600.0 19600.0 14600.0 27800.0 37200.0
2012 7800.0 34300.0 7800.0 31200.0 12100.0 43900.0 23600.0 21600.0 32000.0 33100.0 ... 17200.0 19500.0 14600.0 10300.0 33500.0 21400.0 19900.0 15200.0 28300.0 38100.0
2013 7600.0 34600.0 8000.0 31500.0 12000.0 44500.0 22000.0 22200.0 32500.0 33700.0 ... 17300.0 20200.0 14200.0 10600.0 33400.0 21600.0 20200.0 16100.0 28900.0 38300.0
2014 8100.0 35000.0 8100.0 32200.0 12600.0 45400.0 21600.0 23300.0 33700.0 34300.0 ... 17900.0 20600.0 14800.0 10500.0 33800.0 22100.0 20800.0 17300.0 29600.0 39400.0
2015 8400.0 35900.0 8500.0 33200.0 13200.0 46900.0 22900.0 24400.0 34200.0 35300.0 ... 19000.0 21300.0 15500.0 10700.0 35300.0 22700.0 21600.0 18600.0 30600.0 40600.0
2016 8400.0 36600.0 8900.0 33800.0 13900.0 46800.0 24900.0 25100.0 35100.0 36100.0 ... 19300.0 22000.0 16600.0 11000.0 35000.0 23600.0 20700.0 18500.0 30700.0 40000.0
2017 8800.0 37200.0 9200.0 34600.0 14700.0 46800.0 26400.0 26700.0 36500.0 38000.0 ... 20300.0 22700.0 18500.0 11400.0 35700.0 25100.0 20700.0 19400.0 31700.0 40900.0
2018 9200.0 38600.0 9800.0 35600.0 15600.0 47900.0 27600.0 27900.0 37400.0 39000.0 ... 21500.0 23700.0 20000.0 12000.0 36300.0 26500.0 21300.0 19200.0 32000.0 42300.0
2019 9500.0 39400.0 10200.0 36800.0 16600.0 47900.0 29100.0 29200.0 37900.0 39500.0 ... 22800.0 24600.0 21800.0 12800.0 37200.0 27800.0 22100.0 18500.0 32500.0 42700.0
2020 9200.0 37500.0 9900.0 35700.0 16600.0 46400.0 27100.0 28000.0 37000.0 39900.0 ... 22900.0 22900.0 21800.0 12800.0 36800.0 26800.0 21600.0 18300.0 30000.0 41600.0

16 rows × 41 columns

Vi kan nå "rebasere". Vi gjør det ved å bruke pandasfunksjonen div(), som deler alle observasjonene på argumentet. Vi ønsker å dele på første rad (år 2005), som er gdp_data.iloc[0]:

Eksempel 29:

In [40]:
gdp_data_fltrd4=100*gdp_data_fltrd3.div(gdp_data_fltrd3.iloc[0])
gdp_data_fltrd4
Out[40]:
country AL AT BA BE BG CH CY CZ DE DK ... PL PT RO RS SE SI SK TR UK US
2005 100.000000 100.000000 100.000000 100.000000 100.000000 100.000000 100.000000 100.000000 100.000000 100.000000 ... 100.000000 100.000000 100.000000 100.000000 100.000000 100.000000 100.000000 100.000000 100.000000 100.000000
2006 108.333333 104.181185 112.500000 102.941176 108.433735 107.988166 105.286344 104.972376 104.545455 106.071429 ... 105.263158 105.376344 116.455696 108.000000 107.142857 104.615385 110.294118 110.204082 102.985075 101.939058
2007 120.833333 108.362369 123.214286 106.617647 120.481928 118.047337 114.537445 114.364641 110.227273 110.000000 ... 116.666667 109.139785 136.708861 118.666667 115.357143 111.794872 122.794118 119.387755 104.850746 104.986150
2008 133.333333 111.846690 132.142857 108.088235 131.325301 122.781065 118.942731 119.337017 112.878788 114.285714 ... 124.561404 111.290323 164.556962 130.666667 116.785714 117.948718 134.558824 126.530612 106.343284 104.155125
2009 139.583333 107.665505 128.571429 104.779412 126.506024 117.751479 112.775330 115.469613 107.196970 108.928571 ... 126.315789 107.526882 159.493671 126.666667 108.571429 106.666667 127.205882 119.387755 98.880597 98.614958
2010 152.083333 110.801394 132.142857 110.661765 133.734940 121.597633 111.894273 116.022099 113.636364 116.071429 ... 136.842105 110.752688 165.822785 129.333333 114.285714 108.205128 140.441176 133.673469 103.358209 101.939058
2011 158.333333 115.331010 137.500000 112.132353 140.963855 126.627219 109.691630 119.337017 120.075758 118.214286 ... 146.491228 106.989247 177.215190 136.000000 118.571429 110.769231 144.117647 148.979592 103.731343 103.047091
2012 162.500000 119.512195 139.285714 114.705882 145.783133 129.881657 103.964758 119.337017 121.212121 118.214286 ... 150.877193 104.838710 184.810127 137.333333 119.642857 109.743590 146.323529 155.102041 105.597015 105.540166
2013 158.333333 120.557491 142.857143 115.808824 144.578313 131.656805 96.916300 122.651934 123.106061 120.357143 ... 151.754386 108.602151 179.746835 141.333333 119.285714 110.769231 148.529412 164.285714 107.835821 106.094183
2014 168.750000 121.951220 144.642857 118.382353 151.807229 134.319527 95.154185 128.729282 127.651515 122.500000 ... 157.017544 110.752688 187.341772 140.000000 120.714286 113.333333 152.941176 176.530612 110.447761 109.141274
2015 175.000000 125.087108 151.785714 122.058824 159.036145 138.757396 100.881057 134.806630 129.545455 126.071429 ... 166.666667 114.516129 196.202532 142.666667 126.071429 116.410256 158.823529 189.795918 114.179104 112.465374
2016 175.000000 127.526132 158.928571 124.264706 167.469880 138.461538 109.691630 138.674033 132.954545 128.928571 ... 169.298246 118.279570 210.126582 146.666667 125.000000 121.025641 152.205882 188.775510 114.552239 110.803324
2017 183.333333 129.616725 164.285714 127.205882 177.108434 138.461538 116.299559 147.513812 138.257576 135.714286 ... 178.070175 122.043011 234.177215 152.000000 127.500000 128.717949 152.205882 197.959184 118.283582 113.296399
2018 191.666667 134.494774 175.000000 130.882353 187.951807 141.715976 121.585903 154.143646 141.666667 139.285714 ... 188.596491 127.419355 253.164557 160.000000 129.642857 135.897436 156.617647 195.918367 119.402985 117.174515
2019 197.916667 137.282230 182.142857 135.294118 200.000000 141.715976 128.193833 161.325967 143.560606 141.071429 ... 200.000000 132.258065 275.949367 170.666667 132.857143 142.564103 162.500000 188.775510 121.268657 118.282548
2020 191.666667 130.662021 176.785714 131.250000 200.000000 137.278107 119.383260 154.696133 140.151515 142.500000 ... 200.877193 123.118280 275.949367 170.666667 131.428571 137.435897 158.823529 186.734694 111.940299 115.235457

16 rows × 41 columns

Vi kan nå plotte resultatet med plot()-funksjonen i pandas. Vi velger gjennomsiktighet 0.3 og figurstørrelse 20x10. Etikettene plasseres øverst til venstre, uten ramme og i fire kolonner:

Eksempel 30:

In [41]:
ax=gdp_data_fltrd4.plot(alpha=0.3,figsize=(20, 10))
ax.legend(loc='upper left',frameon=False,ncol=4)
Out[41]:
<matplotlib.legend.Legend at 0x287b09c0410>

Som nevnt har vi valgt perioden fra 2005 fordi Angela Merkel tiltrådte da. Det kan derfor være en god idé å utheve Tysklands kurve. Vi skal gjøre det ved å øke linjevidden til 5 og ta bort gjennomsiktighet (alpha=1). For at det skal være enkelt å også utheve andre land, lager vi en funksjon som uthever land med et bestemt symbol. ax representerer grafen, og må også være et argument, slik at funksjonen kan operere på den. Her er funksjonen:

Eksempel 31:

In [42]:
def thick_line(symbol,ax):
    labels=[i._label for i in ax.lines]  #makes a list of symbols in the order of lines in the axis object
    i=labels.index(symbol)               #identifies at which position symbol is located
    ax.lines[i].set_linewidth(5)         #sets the line with of the line at position i to 5 
    ax.lines[i].set_alpha(1)             #removes transparancy of the line at position i to 5 

Funksjonen gjør følgende:

  1. Lager en liste med symbolene til linjene
  2. identifiserer hvor i listen symbol befinner seg
  3. setter linjevidden til denne linjen til 5
  4. Fjerner gjennomsiktigheten til denne linjen

Vi kan nå plotte grafen, etter å ha uthevet linjene til 'DE' (Tyskland) 'NO' (Norge) og 'EU28' (EU inkludert Storbritannia):

Eksempel 32:

In [43]:
thick_line('DE',ax)
thick_line('NO',ax)
thick_line('EU28',ax)
ax.legend(loc='upper left',frameon=False,ncol=4)
ax.figure
Out[43]:

Oppgaver:

  1. Hent ut to andre selskap fra titlon, og plott dem med scatter()-funksjonen for å se om det er en sammenheng mellom avkastningene.
In [ ]:
 
  1. Én av setningene i Eksempel 4 vil aldri bli tilfredsstilt, uansett hva du setter som animal. Hvorfor?
In [ ]:
 
  1. I eksempel 6, hva skjer om du fjerner or edu>10 fra koden? Forklar.
In [ ]:
 
  1. Hent data for et annet selskap (valgfritt) fra titlon.uit.no, og velg to andre variabler enn i Eksempel 17, og plott dem mot hverandre.
In [ ]:
 
  1. Hent en tabell om strømpris i eurostat, og lag en tilsvarende graf som i Eksempel 31 og 32 for den. Gjør slik:
    1. Sjekk hvilke tabeller som er tilgjengelig med toc[['Electricity' in i for i in toc['title']]] og finn koden i feltet 'code' til tabellen 'Electricity prices for household consumers - bi-annual data (from 2007 onwards)'.
    2. Hent tabellen som har denne koden
    3. Gjør følgende filtrering:
 el_data = el_data[((el_data['tax']=='I_TAX')
         &(el_data['currency']=='EUR')
         &(el_data['nrg_cons']=='KWH5000-14999'))]
In [ ]: