Workshop - Daten zwischen Projekten in OpenRefine abgleichen
Daten können zwischen OpenRefine Projekten abgeglichen werden. In diesem Tutorial zeigen wir wie das funktioniert.
Einführung
cross()
in der OpenRefine Dokumentation.cross()
im OpenRefine Wiki.
Dieser Workshop wurde zuletzt getestet mit OpenRefine Version 3.8.2.
Im Artikel Gemeinsam an OpenRefine-Projekten arbeiten haben wir verschiedene Varianten, Daten zwischen OpenRefine Projekten abzugleichen, besprochen und verglichen. In diesem Tutorial fokussieren wir uns auf die Funktion cross() in OpenRefine, ohne über Alternativen und zukünftige Entwicklungen zu spekulieren.
Vorbereitung: Projekt erstellen
Die folgenden Dateien jeweils in ein OpenRefine-Projekt laden.
Staedte in BWStaedte in BW - Geokoordinaten💾 Wir benötigen die folgenden Dateien (Rechtsklick und “Ziel speichern unter…”):
In der Datei für das Projekt “Staedte in BW” sind Informationen aus Wikidata und der GND zu den 25 bevölkerungsreichsten Städten in Baden-Württemberg gesammelt.
In der Datei für das Projekte “Staedte in BW - Geokoordinaten” sind Geokoordinaten für Städte in Baden Württemberg gesammelt. Mit diesen beiden Projekten testen wir in den folgenden Aufgaben den Datenabgleich.
Aufgabe 1: Daten via Name abgleichen
Im Projekt “Staedte in BW” wollen wir die passenden Geokoordinaten für die einzelnen Städte aus dem Projekt “Staedte in BW - Geokoordinaten” nachladen. Dafür gehen wir im Projekt “Staedte in BW” über “Stadt" "Edit column" "Add column based on this column…” und verwenden den folgenden GREL Ausdruck.
cell.cross(
"Staedte in BW - Geokoordinaten",
"Name")
.cells["Geokoordinaten (WGS 84)"]
.value[0]
Dabei benötigen wir den exakten Projektnamen des Projektes aus dem wir die Daten nachladen wollen (“Staedte in BW - Geokoordinaten”), die Spalte in dem anderen Projekt mit der unsere Spalte “Stadt” abgeglichen werden soll (“Name”) und den Namen der Spalte in dem anderen Projekt, die wir “nachladen” wollen (“Geokoordinaten (WGS 84)”). Der Dialog ist in Abbildung 1 gezeigt.
Aufgabe: in der Vorschau in Abbildung 1 ist zu sehen, dass für “Freiburg im Breisgau” keine Daten nachgeladen werden konnten. Warum ist das so? Gibt es noch weitere “problematischen” Einträge? Was bedeutet das für einen Abgleich über “Namen”?
Lösung:
- Im Projekt “Staedte in BW - Geokoordinaten” sind die Namen der Städte “Freiburg im Breisgau” und “Esslingen am Neckar” abgekürzt.
- Ein Abgleich über Namen scheitert manchmal an unterschiedlichen Schreibweisen.
- Wenn möglich also besser eindeutige IDs verwenden.
- Siehe auch Gemeinsam an OpenRefine-Projekten arbeiten für weitere Details und mögliche Lösungsstrategien.
Aufgabe 2: Daten via ID abgleichen
Wir wiederholen die Aufgabe mit einem Abgleich über die Spalte “GND-ID”.
Aufgabe: Laden Sie im Projekt “Staedte in BW” die Spalte “Geokoordinaten (WGS 84)” aus dem Projekt “Staedte in BW - Geokoordinaten” über einen Abgleich mit der Spalte “GND-ID” nach.
Lösung:
Dafür gehen wir im Projekt “Staedte in BW” über “GND-ID” “Edit column” “Add column based on this column…” und verwenden den folgenden GREL Ausdruck.
cell.cross(
"Staedte in BW - Geokoordinaten",
"GND ID")
.cells["Geokoordinaten (WGS 84)"]
.value[0]
Aufgabe 3: Zeilen nachladen
OpenRefine arbeitet Spalten orientiert und erlaubt daher nur das Hinzufügen oder Nachladen von zusätzlichen Spalten. Manchmal möchte man einzelne Zeilen zum Beispiel aus einem anderen OpenRefine Projekt nachladen. Hier ist der einfachste Weg beide Projekte zu exportieren und in einem neuen Projekt gemeinsam zu importieren.
In seltenen Fällen ist dies unpraktisch, da man beispielsweise die Bearbeitungshistorie erhalten, oder nur einen Teil der Daten übernehmen möchte.
Daher nutzen wir hier die Funktion cross()
um Zeilen aus einem anderen Projekt nachzuladen.
Projekte erstellen
Wir verwenden noch einmal die CSV-Dateien 01_kretschmann-kabinett-frauen.csv
und 01_kretschmann-kabinett-maenner.csv
aus Aufgabe 2 in 01 Projekte in OpenRefine laden und verwalten.
Kretschmann Kabinett Frauen als CSVKretschmann Kabinett Maenner als CSV💾 Wir benötigen die folgenden zwei Dateien (Rechtsklick und “Ziel speichern unter…”):
Diesmal laden wir die Daten jeweils in ein eigenes Projekt mit dem Namen “Kretschmann Kabinett III - Frauen” bzw. “Kretschmann Kabinett III - Männer”.
Projekt 2: Spalte Abgleich erstellen
In dem Projekt “Kretschmann Kabinett III - Männer” erstellen wir via “Geschlecht" "Edit column" "Add column based on this column…” und dem folgenden GREL Ausdruck eine neue Spalte mit dem Titel “Abgleich”.
row.index
Über diese Spalte steuern wir, wie die beiden Projekte zusammengeführt werden sollen. So kann der Wert der Spalte “Abgleich” für Zeilen, die nicht übertragen werden sollen, wieder entfernt, bzw. gar nicht erst gesetzt werden.
Projekt 1: Spalte Abgleich erstellen
In dem Projekt “Kretschmann Kabinett III - Frauen” erstellen wir ebenfalls via “Geschlecht" "Edit column" "Add column based on this column…” und dem folgenden GREL Ausdruck eine neue Spalte mit dem Titel “Abgleich”.
with(7, rowsInProject,
with(6, rowsToLoad,
if(row.index + 1 == rowsInProject,
"," + forRange(0, rowsToLoad, 1, v, v).join(","),
""
)
)
)
Dieser GREL Ausdruck schreibt nur in die letzte Zeile eine Aufzählung der Zeilennummern aus dem Projekt “Kretschmann Kabinett III - Männer”.
Da wir (aktuell) nicht automatisch ermitteln können, wie viele Zeilen das aktuelle bzw. das abzugleichende Projekt hat, müssen wir diese Informationen via den Variablen rowsInProject
und rowsToLoad
selbst setzen.
Das Ergebnis der Operation ist in Abbildung 2 gezeigt.
Projekt 1: Neue Zeilen erstellen
Anschließend erzeugen wir die neuen Zeilen via
“Abgleich"
"Edit Cells"
"Split multi-valued cells…” auf dem Komma ,
als Trennzeichen.
Das Ergebnis ist in Abbildung 3 gezeigt.
Projekt 1: Daten nachladen
Dann können wir mit dem folgenden GREL Ausdruck über “ALL" "Transform…” die zusätzlichen Zeilen nachladen. In dem folgenden Dialog können wir auch auswählen, auf welchen Spalten der GREL Ausdruck angewendet werden soll, und so auch nur spezifische Spalten nachladen. Das Ergebnis ist in Abbildung 4 gezeigt.
if(isNonBlank(row.cells["Abgleich"].value),
row.cells["Abgleich"].cross("Kretschmann Kabinett III - Männer", "Abgleich").cells[columnName].value[0],
value
)
Fazit
Mit der Funktion cross()
können ziemlich komfortabel Daten zwischen unterschiedlichen OpenRefine Projekten abgeglichen werden.
Natürlich kann sie auch dazu verwendet werden Datenspalten innerhalb eines Projektes zu vergleichen.
Die Funktion kann jedoch nur eindeutige Werte zusammenführen.
Schon kleinste Abweichungen wie zusätzliche Leerzeichen oder Abkürzungen sorgen für einen fehlenden Abgleich der einzelnen Zeilen.
Umso wichtiger ist ein sorgfältiges Arbeiten und die Verwendung von eindeutigen Identifikatoren.
Im nächsten Teil beschäftigen wir uns weiter mit Facets in OpenRefine.