https://nr24.sched.com/event/1d4kv/so-schwer-ist-es-nicht-datenbanken-fur-journalistinnen
Je größer die Datenmengen, desto wichtiger ist, dass sie konsistent und gut zu handhaben sind. In der Tech-Welt verwendet man deshalb Datenbanken, um Tabellen zu managen. Durch die Welt der Journalist*innen flattern dagegen noch zu oft lose Excel- und CSV-Dateien.
Deshalb wollen wir Datasette zeigen – direkt zum Mitmachen und Anfassen. Datasette ist ein Schweizer Taschenmesser für die Arbeit mit Daten: Man kann damit Daten verwalten und analysieren, abfragen, visualisieren und mit anderen teilen. Der Vorteil: Die Daten sind in einer Datenbank gespeichert und nicht in einer flüchtigen Excel- oder CSV-Tabelle.
Exporte in verschiedenste Formate sind natürlich trotzdem jederzeit möglich. Außerdem gibt es eine riesige Palette von Plugins, um Daten beispielsweise in Diagrammen, Karten oder sogar auf Dashboards zu visualisieren, effizient zu durchsuchen oder mit für Datenbanken außergewöhnlichen Formaten wie Bildern umzugehen.
So wird Datasette zum vielfältigen Werkzeug – das im Browser läuft, aber auf dem eigenen Rechner. Damit ist es auch für sensible Datensätze geeignet. Genauso kann es auf einem Server installiert werden und damit auch die gemeinsame Arbeit an einem Datensatz ermöglichen.
Wir bieten einen Hands-on-Workshop an, und zeigen, wie ihr Datasette auf dem eigenen Rechner zum Laufen bringt, Daten importiert und anseht, Plugins installiert, Daten visualisiert, Daten abfragt und auswertet und ihm Team an Daten arbeitet. Die Voraussetzungen dafür: ein eigener Rechner, installiertes Python 3 oder ein Github-Account und das Wissen, was die Kommandozeile ist.
- datasette installieren
- erstellen aus mehreren csv-Dateien eine Datenbank
- Datenbank erkunden, filtern, SQL abfragen
- datasette mit Plugins erweitern
Ein paar simple Erklärungen:
- eine Datenbank sind mehrere Tabellen, die miteinander in Zusammenhang stehen (können).
- strukturierte Sammlung von Daten
- der Zweck ist die Organisation, das Speichern und das Abrufen von Daten
Es gibt viele verschiedene Datenbanksysteme, zu den bekanntesten gehören MySQL
, Postgres
oder sqlite
, mit der wir arbeiten.
Der Vorteil von sqlite
: Die ganze Datenbank ist nur eine einzige Datei.
Die datasette ist eine Software, um Daten zu erkunden und zu veröffentlichen.
Sie basiert auf einer sqlite
-Datenbank und es existieren eine Reihe von Erweiterungen, etwa um Daten zu visualisieren.
Und - nicht zu vernachlässigen - es gibt sehr gute Anleitungen.
Wer's auch benutzt: Bellingcat, hier zu sehen: https://www.bellingcat.com/news/rest-of-world/2022/04/01/food-delivery-leak-unmasks-russian-security-agents/
Die Eingabeaufforderung, dieses schwarze Fenster mit heller Schrift...
Aber keine Angst: Nur der Kommunikationsweg mit dem Computer ist ein anderer. Texteingaben statt Klicks.
- Github-Repo br-data/nr24-datasette forken (= in das eigene Github kopieren)
- Einen Codespace bei Github erstellen: Auf
Code
(grüner Button) -> TabCodespaces
->Create codespace on ...
- Dann öffnet sich ein neuer Tab und darin befindet sich eine Entwicklungsumgebung, die auf dem Editor VS Code basiert
- Unten befindet sich ein Tab
Terminal
, dort installieren wir datasette:
pipx install datasette
Prüfen, ob es geklappt hat:
datasette --version
Datasette braucht das Plugin datasette-codespace, um in und mit Github Codespaces arbeiten zu können:
datasette install datasette-codespaces
Simon Willison hat auch ein CLI-Tool geschrieben, um mit sqlite
-Datenbank zu arbeiten. Es heißt sqlite-utils
.
Installation
pipx install sqlite-utils
https://datasette.io/plugins/datasette-explain
Wir haben da was vorbereitet...
Daten zu Abgeordneten des Bundestags.
Anleitung, um eine Datenbank zu erstellen: https://datasette.io/tutorials/clean-data
https://sqlite-utils.datasette.io/en/stable/cli.html#inserting-csv-or-tsv-data
Wir benutzen insert
Befehl, um eine CSV-Tabelle als eine Tabelle in eine Datenbank zu schreiben: https://sqlite-utils.datasette.io/en/stable/cli.html#inserting-csv-or-tsv-data
sqlite-utils insert mdbs.db mdb data/mdbs.csv --csv --detect-types --pk=mdb_id
sqlite-utils insert mdbs.db rel_mdb_ausschuesse data/rel_mdbs_ausschuesse.csv --csv --detect-types --pk=mdb_id --pk=ausschuss_id
sqlite-utils insert mdbs.db ausschuesse data/ausschuesse.csv --csv --detect-types --pk=ausschuss_id
sqlite-utils insert mdbs.db adresses data/mdb_addresses.csv --csv --detect-types
Vorschau auf der Kommandozeile:
sqlite-utils schema mdbs.db
Kommando: datasette pfad_zur_datenbank
datasette mdbs.db
Beispiel 1: Wo sind die Wahlkreisbüros aller direkt gewählten CSU-Abgeordneten (und wie viele gibt es)?
select * from mdb
left join mdb
on mdb.mdb_id = adresses.mdb_id
where partei = "CSU" and mdb.mandatsart = "Direktwahl"
zum Zählen:
select count(*) from mdb
left join mdb
on mdb.mdb_id = adresses.mdb_id
where partei = "CSU" and mdb.mandatsart = "Direktwahl"
Beispiel 2: Wer sind die Obleute im Ausschuss für Arbeit und Soziales?
select * from rel_mdb_ausschuesse
left join mdb
on rel_mdb_ausschuesse.mdb_id = mdb.mdb_id
left join ausschuesse
on rel_mdb_ausschuesse.ausschuss_id = ausschuesse.ausschuss_id
where funktion = "O."
and rel_mdb_ausschuesse.ausschuss_id = "a11"
Liste aller vorhandenen Plugins: https://datasette.io/plugins
https://datasette.io/plugins/datasette-render-image-tags
Installieren und danach datasette neu starten
datasette install datasette-render-image-tags
https://datasette.io/plugins/datasette-cluster-map
Wenn sich etwa Koordinaten in den Tabellen befinden, werden sie automatisch auf eine Karte gezeichnet, solange wie Standardnamen haben wie lat
, long
.
Erst das Paket installieren, dann wieder datasette starten und die Tabelle öffnen mit den Koordinaten:
datasette install datasette-cluster-map
datasette mdbs.db
https://datasette.io/plugins/datasette-plot
datasette install datasette-plot
Nach der Installation gibt es einen "Show Plot"-Button an jeder Tabelle und dort kann man sich was zurecht klicken.
Aber Vorsicht: Plotten kann man Vieles – ob es Sinn ergibt, muss man selbst prüfen.
Lohnt sich so gut wie immer: Alles durchsuchbar machen mit einer Suchleiste oben
https://docs.datasette.io/en/stable/full_text_search.html
In der DB mdbs.db und der Tabelle mdb die Spalten name wahlkreis_name fraktion mandatsart
durchsuchbar machen:
sqlite-utils enable-fts mdbs.db mdb name wahlkreis_name fraktion mandatsart
Data loves metadata. Any time you run Datasette you can optionally include a JSON file with metadata about your databases and tables. Datasette will then display that information in the web UI.
https://docs.datasette.io/en/stable/metadata.html
Über eine bestimmte Datei kann man datasette weiter konfiguieren, entweder als json
oder yaml
- Geschmackssache.
Beispiele:
- Beschreibungen der Datenbank, einzelnen Tabellen oder Spalten hinterlegen
- Wichtige Abfragen hinterlegen, die dann wie Tabellen anzusteuern sind
Um die datasette mit diesen Konfigurationen zu starten, muss man mit dem --metadata
-Parameter auf die Datei verweisen.
datasette mdbs.db --metadata metadata.json
So sieht die metadata.json
aus für eine Recherche zum Jugendschutzfilter JusProg, zusammen mit netzpolitik.org: https://www.tagesschau.de/investigativ/br-recherche/jugendschutzfilter-aufklaerungsseiten-100.html
{
"title": "JusProg",
"description": "In dieser Datenbank befinden sich die Alterszuordnungen der JusProg-Software von 6,4 Millionen de-Domains.",
"databases": {
"jusprog_datasette": {
"tables": {
"api_responses": {
"description_html": "Die Ergebnisse von JusProg für jede Domain. Verteilungen der einzelnen Spalten und Details auch unter <a href='https://interaktiv.brdata-dev.de/jusprog-analyse/inspect-age-check-data.html'>mehr</a> ",
"columns": {
"url": "Geprüfte Domain",
"age": "Mindestalter für die URL, die JusProg-API zurückgibt (von JusProg)",
"timestamp": "Wann wir Domain geprüft haben"
}
},
"age_changes": {
"description_html": "Domains, bei denen wir eine Änderung der Alterseinstufung festellen konnten."
},
"google_test": {
"description_html": "Test von Google-Ergebnissen bestimmter Suchanfragen. "
}
},
"queries": {
"blocked_domains": {
"sql": "select * from api_responses where age >= 18;"
}
}
}
},
"plugins": {
"datasette-render-html": {
"columns": ["url", "domain", "url_clean"]
},
"datasette-render-timestamps": {
"format": "%Y-%m-%d-%H:%M:%S"
}
}
}
Eine der Abfrage als sogenannte "canned query" in der metadata.json
hinterlegen.
Das Geburtstdatum der MdB's steht so in den Ausgangsdaten: 07.07.1986
- so wird das nicht von der sqlite
als Datum erkannt.
Mit der convert
-Funktion von sqlite-utils
können wir die Angaben in echte Zeitangaben umwandeln.
sqlite-utils convert mdbs.db mdb geburtsdatum 'r.parsedatetime(value, dayfirst=True)'
Mehr dazu:
- https://datasette.io/tutorials/clean-data
- https://sqlite-utils.datasette.io/en/stable/cli.html#sqlite-utils-convert-recipes
- datasette.io
- Verschiedenste Tutorials: https://datasette.io/tutorials/
- SQL-Cheatsheet: https://pbs.twimg.com/media/GSiaz9SXcAAY_y2?format=jpg&name=medium
- Advanced SQL stuff: https://use-the-index-luke.com