From be9382c9a4131f60264f1cc9219b2b25bf502aa9 Mon Sep 17 00:00:00 2001 From: Walter Gussmann Date: Sat, 30 Jun 2018 10:39:26 +0200 Subject: [PATCH] Update 'README.md' --- README.md | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 99 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 07faf1e..8531c53 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,101 @@ # Wechselkurse -Tägliche Abfrage der Wechselkurse bei der europäischen Zentralbank - Speicherung in einer Datenbank \ No newline at end of file +Die europäische Zentralbank veröffentlicht jeden Werkag gegen 16.30 Uhr unter der URL http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml die Tageskurse wichtiger Währungen. Diese XML-Datei kann heruntergeladen und ausgewertet werden. + +Das Projekt verwendet für die Datenauswertung die Programmiersprache python. Die Daten werden in einer MySQL-Datenbank gespeichert. Für die Darstellung wird ein Webserver (Apache2) verwendet. Die grafische Anzeige basiert auf https://d3js.org/d3.v3.min.js. +![https://github.com/wagu1/wechselkurse/blob/master/img/kursentwicklung.png](http://) + +Python-Programm + +Vorbemerkung: Das Pythonprogramm läuft hier auf demselben Server wie MySQL. + +Zuerst müssen die aktuellen Kurse von der Seite http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml abgerufen werden. Außerdem wird das aktuelle Datum ausgelesen. + +import MySQLdb +import requests +from xml.etree import ElementTree as ET + +# -------------------------------------------------------------------- +# Globale Variable +# -------------------------------------------------------------------- +root = 0 +namespaces = 0 +datum = 0 + +# -------------------------------------------------------------------- +# Kurse abrufen +# -------------------------------------------------------------------- +def getValues(): + global root + global namespaces + global datum + r = requests.get('http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml', stream=True) + tree = ET.parse(r.raw) + root = tree.getroot() + namespaces = {'ex': 'http://www.ecb.int/vocabulary/2002-08-01/eurofxref'} + + zeit = root.find('.//ex:Cube[@time]', namespaces=namespaces) + datum = zeit.attrib['time'] + print("aktuelles Datum = " + datum) + +Nun kann für Testzwecke der Kurs einer Währung mit der Funktion getKurs(waehrung) ausgelesen und angezeigt werden: + +# -------------------------------------------------------------------- +# liefert zu einer Währung den passenden Kurs +# -------------------------------------------------------------------- +def getKurs(waehrung): + match = root.find('.//ex:Cube[@currency="{}"]'.format(waehrung.upper()), namespaces=namespaces) + if match is not None: + print("Währung=" + waehrung + " Kurs=" + match.attrib['rate']) + return match.attrib['rate'] + else: + print("kein Eintrag gefunden") + return 0 + +Im nächsten Schritt werden alle Kurse in eine Datenbank eingetragen. Dazu muss eine Verbindung zu einer Datenbank hergestellt werden. Die hier verwendete MySQL-Datenbank hat eine Tabelle kurse mit folgender Struktur: + ++----------+--------------+------+-----+---------+----------------+ +| Field | Type | Null | Key | Default | Extra | ++----------+--------------+------+-----+---------+----------------+ +| id | int(11) | NO | PRI | NULL | auto_increment | +| datum | date | YES | | NULL | | +| waehrung | varchar(10) | YES | | NULL | | +| kurs | decimal(8,4) | YES | | NULL | | ++----------+--------------+------+-----+---------+----------------+ + +Verbindung zu Datenbank wechselkurse: + +# open database connection +db = MySQLdb.connect("localhost",,,"wechselkurse" ) + +Alle Kurse eines Tages in Datenbank eintragen + +# -------------------------------------------------------------------- +# fügt alle Kurse in die Datenbank ein +# Vor.: datum gibt es noch nicht +# -------------------------------------------------------------------- +def saveData(datum): + for cube in root.findall('.//ex:Cube[@currency]', namespaces=namespaces): + insertData(datum, cube.attrib['currency'], cube.attrib['rate']) + +# -------------------------------------------------------------------- +# fügt einen neuen Datensatz der Tabelle kurse hinzu +# wenn kurs=0 ist, dann ist nichts passiert +# -------------------------------------------------------------------- +def insertData(zeit, waehrung, kurs): + if kurs == 0: + return + + # Prepare SQL query to INSERT a record into the database. + sql = "INSERT INTO kurse (datum,waehrung,kurs) \ + VALUES ('%s', '%s', '%s' )" % (zeit, waehrung, kurs) + print(sql) + try: + cursor = db.cursor() + cursor.execute(sql) + db.commit() + print("Kurs hinzugefügt") + except: + # Rollback in case there is any error + db.rollback() + print("ERROR insertData")