Im Folgenden werde ich probieren die These: " Die besten Schachspieler repräsentieren Nationen, in denen durchschnittlich sehr viel Alkohol konsumiert wird." zu überprüfen.
Dazu habe ich folgende Daten zusammengeführt.
Zum Schluss werde ich eine Auswertung präsentieren!
import requests
r = requests.get('https://github.com/plotly/datasets/raw/master/2010_alcohol_consumption_by_country.csv')
f = open('alcohol.csv', 'wb')
f.write(r.content)
f.close()
Ich habe ein CSV File zum durschnittlichen Alkoholkonsum im Jahr 2010 in Litern/pro Kopf in den jeweiligen Ländern ausgewählt. Zudem habe ich mich für die dynamische Umsetzung entschieden.
%load_ext sql
Durch das Laden der SQL-Extensions wird mir das Verwenden von SQL Befehlen in den darauffolgenden Zeilen ermöglicht.
%sql sqlite:///shop.db
Verbindung zu einer SQLite Datanbank; hier die Shop.db
%sql drop table if exists alcohol;
Kontrolle ob eine Datenbank mit diesem Namen schon existiert.In den nächsten Schritten wird die CSV Datenbank zu einer Tabelle umgewandelt.
import sqlite3
import pandas
conn = sqlite3.connect('shop.db')
pandas.read_csv('alcohol.csv').to_sql('alcohol', conn, index = False)
%%sql
select * from alcohol;
Wiedergabe in einer Tabelle. Die CSV Datei wurde erfolgreich importiert! Es handelt sich hier um den durchschnittlichen Alkoholkonsum der jeweiligen Länder, gemessen in Litern/pro Kopf und pro Jahr in 2010.
Als nächstes widmen wir uns den RDF Daten, die ich aus der DBpedia erhalten habe.Ich verwende dabei den SparQLWrapper.Der SparQL Endpoint besitzt eine URL.
from SPARQLWrapper import SPARQLWrapper, JSON, CSV
sparql = SPARQLWrapper("http://dbpedia.org/sparql")
sparql.setQuery("""
SELECT distinct ?name ?country ?value ?title ?birthday
WHERE {
?x a dbo:ChessPlayer .
?x dbo:country ?federation.
?x dbo:birthDate ?birthday.
?federation rdfs:label ?country .
?x dbo:title ?title.
?x rdfs:label ?name.
?x <http://dbpedia.org/property/peakrating> ?value.
FILTER (?value > 2650).
FILTER(lang(?name) = "en")
FILTER(lang(?country) = "en")
}
ORDER BY ?value
Limit 20
""")
sparql.setReturnFormat(JSON)
players = sparql.query().convert()
for res in players["results"]["bindings"]:
print(res["name"]["value"],' ',
res["value"]["value"],'',
res["country"]["value"],'',
res["title"]["value"],'',
res["birthday"]["value"])
Der Spaltenname Name besteht aus Vor-und Nachname. Bei Value handelt es sich um das höchste Rating (peakrating), dass jener Spieler besitzt,bzw. besessen hat. In diesem Zusammenhang war es ebenfalls wichtig das Geburtsdatum Birthday zu verwenden.Dies liegt daran, dass das Fide Ratingsystem erst seit 1970 existiert. Spieler, die in dieser Query sehr früh geboren sind, könnten deshalb ein geschätztes Rating besitzen. Durch den verwendeten Filter von einem Peakrating von über 2650 ist die Wahrscheinlichkeit sehr hoch, dass es sich bei sehr vielen Spielern in der Kategorie Titel um einem Großmeister handelt.Die Vorraussetzungen für diesen Titel sind ein Rating von über 2500 und 3 Großmeisternormen. Um diese Query später mit meinem CSV-File zu verbinden ist natürlich das Land ebenfalls sehr wichtig. Bei dem Land handelt es sich jedoch nicht um das Land dessen, Staatsangehörigkeit der Spieler besitzt, sondern um die Federation für die er an internationalen Wettkämpfen teilnimmt.
Es wurde ein Limit auf 20 Spieler festgesetzt. Damit die Tabelle übersichtlicher aussieht, wurden im Print-Befehlt der Python-for-Schleife Abstände eingefügt.
1) In der DBpedia steht leider nicht nach jedem Titel bspw. Grandmaster das Jahr in welchem der Titel diesem Spieler anerkannt wurde, nachdem er die notwendigen Bedingungen dafür erfüllt hatte.
2) Es wird das Geburtsdatum in zwei unterschiedlichen Schreibweisen präsentiert. Ich habe mich mehrere Stunden lang damit befasst, dies zu korrigieren jedoch ohne Erfolg. **Somit kann man festhalten, dass die noch zu erledigen ist!
3) Im Schach gibt es sowohl Titel für Damen als auch Titel für Herren. Aufgrund der Tatsache, dass die Anforderungen für Titel für Herren höher sind, ist es möglich für Damen auch Herrentitel zu erreichen. Dies ist umgekehrt nicht möglich! Ebenso handelt es sich bei den Ländern um Federationen, die die/der SchachspielerIN repräsentiert. So kann es auch im Verlauf eines Schachspielers durchaus sein, dass er mehrere Federationen repräsentiert hat. Bei DBpedia werden alle Federationen aufgezählt, anstatt das die aktuellste dargestellt wird. So kommst es dazu, dass es möglich ist,dass durch diese Query ein Name mehrmals vorkommt.
Extrembeispiel: Alissa Michailowna Galljamowa
Die ehmalige Doppel Vize-Weltmeisterin verfügt sowohl über den Damen-Großmeistertitel abgekürzt WGM und über den männlichen Internationalen Meistertitel IM.Zudem hat sie 3 Federationen repräsentiert: Russland,Ukraine und die Sowjetunion . Dadurch kommt ihr Name häufiger in der Query zum Vorschein.
f = open("schach.csv", "w")
f.write("name;value;country;title;birthday\n")
for res in players["results"]["bindings"]:
f.write(res["name"]["value"] + ";" + res["value"]["value"] + ";" + res["country"]["value"] + ";" + res["title"]["value"] + ";" + res["birthday"]["value"] + "\n")
f.close()
Das CSV-File schach-csv wird zum Schreiben geöffnet.Anschließend wird name,value,country,title,birthday eingefügt.Aus dem RDF-File wird ein CSV-File. Anschließend kann man damit ähnlich wie bei dem Alkohol-CSV-File arbeiten.
%%sql
drop table if exists schach;
Es wird wieder überprüft ob die schach Datei schon existiert.
pandas.read_csv('schach.csv', delimiter=";").to_sql('schach', conn, index = False)
Anschließend wird die CSV-Datei über das Pandas wieder eingelesen.Durch Select wird sie mit einem Limit von 20 Resultaten in einer Tabelle wiedergegeben.
%%sql
select * from schach limit 20;
Zum Schluss werden die beiden Files duch den join Befehl zusammengeführt. Alles funktioniert! Jedoch wurde nach Alkohol in Litern sortiert. Um die Stärke der Spieler zu kennzeichnen, war es mir jedoch wichtig diese nach dem Rating zu ordnen.
%%sql
Select name,value,title,birthday,location,alcohol
from alcohol join schach on alcohol.location = schach.country
order by value;
Anhand der ausgewählten Stichprobe lässt sich die These bestätigen, da ersichtlich wird, dass die meisten Schachspieler ein Land repräsentieren, welches entweder einen Wert, der nah an 10l oder höher als 10l pro Jahr besitzt.