Wechselkurse/README.md

4.3 KiB

Wechselkurse

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

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")