Tägliche Abfrage der Wechselkurse bei der europäischen Zentralbank - Speicherung in einer Datenbank
Go to file
Walter Gussmann a071097293 manuelle Auswertung 2018-07-14 13:44:28 +02:00
html Upload files to 'html' 2018-06-30 10:47:13 +02:00
img Upload files to 'img' 2018-06-30 10:44:25 +02:00
python Upload files to 'python' 2018-06-30 10:46:50 +02:00
README.md manuelle Auswertung 2018-07-14 13:44:28 +02:00

README.md

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.

Beispielausgabe

Python-Programm

Neue Version: manuelle Auswertung der XML-Datei

Struktur der XML-Datei:

<Cube>
   <Cube time='2018-07-13'>
   <Cube currency='USD' rate='1.1643'/>
   <Cube currency='JPY' rate='131.04'/>
   ...
</Cube>

Idee:

- Zerlege diese Datei bei '<Cube ' --> Array 
- Bearbeite alle Einträge des Arrays:
-    wenn der String mit 'time' beginnt, dann merke 'xxxx-xx-xx' als Datum
-    wenn der String mit 'currency' beginnt, dann merke die Einträge
          'USD' als Key und '1.1643' als Value in einem assoziativen Array   
- Speichere diese Daten in der Datenbank

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",<username>,<password>,"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")