9.7 KLIMADATENBANK

 

 

EINFÜHRUNG

 

Allgemein zugängliche Informationen, die im Internet gespeichert sind, lassen sich vielseitig verwenden, wenn du sie mit dem Computer dort holst und gezielt weiter verarbeitest. Zur lokalen Speicherung eignen sich Datenbanken viel besser als einfache Dateien oder die Tabellenkalkulation, da du auf Daten, die in Tabellen einer Datenbank gespeichert sind, mit leistungsfähigen Datenbank-Operationen eines Datenbank-Management-Systems (DBMS) zugreifen kannst.

 

 

KLIMADATEN AUS DEM INTERNET BEZIEHEN

 

Im Folgenden willst  du die Klimaveränderungen anhand von Luft- und Wassertemperaturen, die in den letzten über 100 Jahren in verschiedenen Regionen der Erde gesammelt wurden, untersuchen. Rohdaten findest du auf einer Website des Goddard Institute for Space Studies der NASA (GISS) unter http://data.giss.nasa.gov/gistemp. Suche nach LOTI (Land-Ocean Temperature Index) und lade die Datei unter "Zonal annual means" als TXT-Datei ZonAnn.txt herunter. (Du kannst die Datei mit dem Daten bis zum Jahr 2016 auch von hier herunterladen.)

Öffnest du die Datei mit irgendeinem Datei-Editor, so siehst du, dass die Temperaturwerte von 1881 bis heute zeilenweise gespeichert sind. Die Spalten enthalten die Temperaturabweichungen in 1/100 Grad Celsius (Anomalie) gegenüber dem Mittel in den Jahren 1951 - 1980 in verschiedenen Zonen der Welt.

 Glob  NHem  SHem  24N-90N  usw.
 global  Nördliche
 Hemisphäre
 Südliche
 Hemisphäre
 Zone in der geogr. Breite
  24° - 90° Nord
 

Um diese Daten in eine SQLite-Datenbank zu übernehmen,  erzeugst du die Datenbank climate.db, und speicherst dann das Jahr und die 14 Temperaturen als INTEGER. Für die Feldnamen wählst du Bezeichner ähnlich wie in der Originaldatei.

from sqlite3 import *

with connect("climate.db") as con:
    sql = """CREATE TABLE temp
             (Year INTEGER,
             Glob INTEGER,
             NHem INTEGER,
             SHem INTEGER,
             T24N_90N INTEGER,
             T24S_24N INTEGER,
             T90S_24S INTEGER,
             T64N_90N INTEGER,
             T44N_64N INTEGER,
             T24N_44N INTEGER,
             TEQU_24N INTEGER,
             T24S_EQU INTEGER,
             T44S_24S INTEGER,
             T64S_44S INTEGER,
             T90S_64S INTEGER)"""
    con.execute(sql)
print("Table created")
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

Um die Daten aus der Textdatei zu gelesen und in die Datenbank einzufügen, muss du die einzelnen Zeilenstrings etwas überarbeiten. Insbesondere verwendest du nur Zeilen, die mit einer Jahrzahl beginnen. Zuletzt schreibst du die Tabelle zur Kontrolle tabellarisch im Ausgabefenster aus.

from sqlite3 import *
from prettytable import printTable

fname = "ZonAnn.txt"

def insert(data):
    dataStr = ",".join(data) # create comma-separated string
    cursor = con.cursor()
    sql = "INSERT INTO temp"  + " VALUES (" + dataStr + ")"
    cursor.execute(sql)

with open(fname) as f:
    content = f.readlines()

with connect("climate.db") as con:
    for line in content:
        if not line[0:4].isdigit(): # skip non-data lines
            continue
        record = line.split()
        record = record[:-1] # remove last item (year)
        insert(record)

with connect("climate.db") as con:
    cursor = con.cursor()
    cursor.execute("SELECT * FROM temp")
    printTable(cursor, "r")
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

Im Ausgabefenster siehst du die Werte rechtsbündig in einer ansprechend formatierten Tabelle.

 

 

MEMO

 
Auch das Herunterladen der Daten könnte man leicht mit einem Python-Programm durchführen, wodurch sich ein vollautomatisches System ergäbe. Beim Importieren von Daten in eine Datenbank müssen das Datenformat oft mit etwas Stringverarbeitung angepasst werden [mehr... Dabei wird oft die Theorie der "Regulären Ausdrücke" (Regex) eingesetzt].

 

 

KLIMADATEN VERARBEITEN

 

Es ist interessant, den Temperaturverlauf  seit Messbeginn in einem GPanel grafisch darzustellen. Da die Temperaturen in 1/100 Grad gespeichert sind, musst du sie noch auf Grad Celsius umrechnen.

from sqlite3 import *
from gpanel import *

makeGPanel(1860, 2040, -2.5, 2.5)
drawGrid(1880, 2020, -2.0, 2, 14, 8, "darkgray")
title("Global Temperature Anomalie from 1880 to 2016")
text(1865, 2.2, "Deg (C)")
with connect("climate.db") as con:
    cursor = con.execute("SELECT Year, Glob FROM temp") 
    result = cursor.fetchall()
    for i in range(len(result)):
        year = int(result[i][0])
        temp = int(result[i][1]) / 100
        if year == 1880:
            pos(year, temp)
        else:
            draw(year, temp)
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)


 

 

MEMO

 

Die signifikante Zunahme der Temperatur seit ungefähr 1960 ist offensichtlich. Mache dir Gedanken darüber und orientiere dich im Internet, welches die Gründe sind und welche Auswirkungen sie haben könnte. 

 

 

AUSGLEICH VON SCHWANKUNGEN

 

Um die jährlichen Fluktuationen auszugleichen, stellt man oft den Mittelwert über eine bestimmte Periode, beispielsweise gemittelt über 10 Jahre dar. Dazu kopierst du am besten die Werte der 10 Jahresperioden in neue Listen xSmooth und ySmooth.

from sqlite3 import *
from gpanel import *

makeGPanel(1860, 2040, -2.5, 2.5)
drawGrid(1880, 2020, -2.0, 2, 14, 8, "darkgray")
title("Mean Global Temperature Anomalie from 1880 to 2016")
text(1865, 2.2, "Deg (C)")
with connect("climate.db") as con:
    cursor = con.execute("SELECT Year, Glob FROM temp") 
    result = cursor.fetchall()
    nbData = len(result)
    xval = [0] * nbData
    yval = [0] * nbData
    for n in range(nbData):
        xval[n] = int(result[n][0])
        yval[n] = float(result[n][1])
for n in range(nbData):
    if n == 0:
        pos(xval[n], yval[n] / 100)
    else:
        draw(xval[n], yval[n] / 100)

xSmooth = []
ySmooth = []        
period = 10
for n in range(nbData - period):
    total = 0
    for m in range(period):        
        total += yval[n + m]
    ySmooth.append(total / period)
    xSmooth.append(xval[n + period // 2])

setColor("red")
lineWidth(2)
for n in range(len(xSmooth)):
    if n == 0:
        pos(xSmooth[n], ySmooth[n] / 100)
    else:
        draw(xSmooth[n], ySmooth[n] / 100)
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)


 

 

MEMO

 

Führe die Mittelung über verschieden lange Perioden aus und überlege dir, welches die Vor- und Nachteile der Ausgleichung von Schwankungen sind.

 

 

AUFGABEN

 

1.


Führe eine lineare Regression der globalen Temperaturen zwischen 1960 und heute durch, und stelle die so erhaltene Trendlinie dar. Verwende dazu die im GPanel-Modul eingebaute Funktion linfit(X, Y).


2.


Untersuche den Verlauf der monatlichen Mittelwerte der Temperatur und Niederschlagsmenge an einem ausgewählten Ort der Schweiz seit 1864 bis heute. Verwende als Datenquelle
http://www.meteoschweiz.admin.ch/home/klima/vergangenheit/homogene-monatsdaten.html?region=Tabelle und dort beispielsweise für Bern: homog_mo_BER.txt. (Die Datei kann auch von hier heruntergeladen werden.)

a)

Erstelle eine Tabelle mit folgender Struktur:

 year  month  temperature  precipitation
 INTEGER  INTEGER  FLOAT  FLOAT

b)

Füge die Datenwerte in die Tabelle ein und stelle sie tabellarisch im Ausgabefenster dar.

c)

Stelle den Temperaturverlauf in den Jahren 1864 bis heute grafisch dar. Was stellst du fest?

d)

Zeichne in der gleichen Darstellung noch die Trendlinie (lineare Regression) ein.