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.
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") 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") 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) |
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) |
MEMO |
Führe die Mittelung über verschieden lange Perioden aus und überlege dir, welches die Vor- und Nachteile der Ausgleichung von Schwankungen sind. |
AUFGABEN |
|