Langes und breites Tabellenformat

In dieser Aufgabe werden wir den Zusammenhang von Lebenserwartung und Fruchtbarkeit untersuchen. Dazu werden wir einen Scatterplot für das Jahr 2015 anfertigen.

Schritt 1

Lade die Datei gapminder_fertility.csv in pandas.

import pandas as pd

fert = pd.read_csv('gapminder_total_fertility.csv', index_col=0)

Schritt 2

Verfahre genauso mit der Datei gapminder_lifeexpectancy.xlsx. Speichere es in einem DataFrame mit dem Namen life.

Du benötigst dazu die Funktion pd.read_excel.

Schritt 3

Prüfe ob beide Tabellen die gleiche Größe haben

print(life.shape)

Wenn sie nicht die gleiche Größe haben, ist das nicht schlimm.

Schritt 4

Betrachte die Spalten der beiden Tabellen:

fert.columns

und

life.columns

Die eine Tabelle hat Strings als Spalten, die andere Integer-Zahlen. Um die Tabellen sinnvoll zusammenführen zu können, sollten beide das gleiche Format haben. Dazu erzeugen wir uns eine Liste mit den Jahrgängen als Integers.

ncol = [int(x) for x in fert.columns]

und setzen diese Liste als neue Spaltennamen ein:

fert.set_axis(axis=1, labels=ncol)

Prüfe mit fert.columns, ob die Umwandlung erfolgreich war.

Schritt 5

Verbinde beide Tabellen mit der Funktion merge. Durch die Einstellung left_index=True, right_index=True werden Zeilen mit gleichem Index zusammengeführt.

df = life.merge(fert, left_index=True, right_index=True)

Betrachte df.columns. Was ist passiert?

Schritt 6

Um schönere Spaltennamen zu erhalten, kannst Du Dir auch einen hierarchischen Index basteln. Dazu wandeln wir beide Tabellen in ein langes Tabellenformat um:

sfert = fert.stack()
slife = life.stack()

Die beiden Variablen sfert und slife sind nun vom Type pd.Series. Mehrere Series lassen sich über ein Dictionary in ein pd.DataFrame umwandeln:

d = {'fertility': sfert, 'lifeexp': slife}
df2 = pd.DataFrame(data=d)

Diese riesige Tabelle lässt sich leichter in ein beliebiges Format bringen, wenn wir zunächst alle Indizes (Zeilen und Spalten) als Zeilenindizes aufstapeln:

df3 = df2.stack()

Zum Schluß können wir aus der langen wieder eine breite Tabelle machen. Dazu erzeugen wir aus der ersten und dritten Ebene des Index (den Ländernamen und den Eigenschaften) neue Spalten:

df4 = df3.unstack((0,2))

Die Null steht für das jeweils erste Element des Index, mit 1 würden die Jahreszahlen in die Spalten rutschen.

Nun sollte df4 eine Tabelle sein, in der links die Jahreszahlen stehen und oben die Lebenserwartung und Fruchtbarkeit für alle Länder.

Schritt 7

Nun kannst Du gezielt Spalten auswählen und plotten:

import pylab as plt
df4[['Germany', 'France', 'Sweden']].plot()

Du kannst auch einen Scatterplot erzeugen, um Korrelationen zu suchen. Dazu ziehen wir uns die Spalten, nach denen wir plotten möchten aus df3:

df5 = df3.unstack(2)
df5.plot.scatter('fertility', 'lifeexp', s=0.1)

Wir können durch die Operationen stack und unstack auch einen Jahrgang auswählen. So wird die Graphik etwas übersichtlicher:

df6 = df3.unstack(1)  # Jahre als Spalten
df6 = df6[1950]       # nur ein Jahrgang
df6 = df6.unstack(1)  # Eigenschaften als Spalten
df6.plot.scatter('fertility', 'lifeexp', s=0.1)

Schritt 8

Das Ganze bietet noch etwas Raum für Verschönerungen. Beispielsweise kannst Du jedem Land eine andere Farbe geben:

cmap = plt.get_cmap('tab20').colors
df6.plot.scatter('fertility', 'lifeexp', s=0.1, c=cmap)

oder für die Größen der Punkte eine dritte Spalte verwenden, wenn Du eine hast:

df6.plot.scatter('fertility', 'lifeexp', s=df6['population'])

results matching ""

    No results matching ""