Skriptverantwortung, Datenfluss, Pipeline-Korrekturen, CI/CD und Datenqualitaets-Baseline.
| Script | Zweck | Input | Output |
|---|---|---|---|
scripts/explore.py |
Datenexploration, Strukturdiagnostik | data/source/*.xlsx |
data/reports/exploration-report.md |
scripts/validate.py |
Validierung, Qualitaetschecks | data/source/*.xlsx |
data/reports/validation-report.md |
scripts/transform.py |
Transformation nach JSON-LD (RiC-O + m3gim) | data/source/*.xlsx |
data/output/m3gim.jsonld |
scripts/build-views.py |
View-spezifische Aggregationen | JSON-LD | data/output/views/*.json |
scripts/reconcile.py |
Wikidata-Reconciliation (100%-Match, P31-Verifikation, Caching) | XLSX-Indizes | data/output/wikidata-reconciliation.json |
scripts/export-wikidata-csv.py |
Wikidata-CSVs fuer Google-Sheets-Import | wikidata-reconciliation.json | data/output/wikidata-csvs/*.csv (5 Dateien) |
scripts/audit-data.py |
Alignment-Pruefung XLSX vs JSON-LD vs Views | XLSX + JSON-LD + Views | Konsolenreport |
- XLSX-Export aus Google Sheets nach
data/source/(git-getrackt fuer Reproduzierbarkeit) - Exploration + Validierung (
explore.py,validate.py) → Reports - Modelltransformation (
transform.py) →data/output/m3gim.jsonld - View-Aggregation (
build-views.py) →data/output/views/partitur.json(einzige konsumierte View-Datei; matrix/kosmos/sankey werden zwar generiert, aber seit Session 25 nicht mehr git-getrackt — Frontend aggregiert on-the-fly via aggregator.js). Neu (Session 25):extract_auftritte()extrahiert ~60 Auftrittsereignisse in 3 Passes (strukturiert → Programmhefte/Plakate → Rezensionen), 4 Kategorien (engagement/festspiel/gastspiel/konzert).mobilitaet[]hat jetztkontext-Felder. - Bereitstellung:
main()kopiert automatisch partitur.json, matrix.json, kosmos.json nachdocs/data/(Session 25, kein manuelles Copy mehr noetig)
Hinweis: Pipeline-Skripte referenzieren aktuell noch
data/google-spreadsheet/als SHEETS_DIR. Migration aufdata/source/steht aus.
- Spaltennamen-Normalisierung:
df.columns = [c.lower().strip() ...]nachpd.read_excel()in transform.py und validate.py - Bearbeitungsstand-Werte:
vollstaendig/Erledigt → abgeschlossen,begonnen → begonnen,zurueckgestellt → zurueckgestellt - Store:
unprocessedIds(Set) — Records ohne Links UND ohne Bearbeitungsstand - Session 19: Mojibake in validate.py VOCAB + KOMPOSIT_TYPEN gefixt (doppelte UTF-8-Kodierung)
- Session 19:
normalize_bearbeitungsstand()in validate.py eingefuehrt (Fuzzy-Matching wie transform.py) - Session 19:
is_komposit_typ()verbessert — Input-Wert vor Vergleich.replace(" ", "")
reconcile.py implementiert mit:
- 100%-Match-Strategie (Wikidata Search API)
- P31-Verifikation (instance-of-Check gegen erwarteten Typ)
- Caching fuer wiederholte Laeufe
- MIN_NAME_LENGTH=3 (Einbuchstaben-/Zweibuchstaben-Namen werden uebersprungen)
- Ergebnis: 171 Matches ueber Personen, Orte, Organisationen, Werke
- Offen: Ergebnisse in Google Sheets uebertragen
- Kein aktiver Workflow (
.github/workflows/build-views.ymlin Session 17 entfernt — erzeugte Merge-Konflikte) - Pipeline wird lokal ausgefuehrt, Ergebnisse manuell committet
- Reaktivierung moeglich wenn Dritte Daten updaten sollen
| Datei | Format | Status |
|---|---|---|
m3gim.jsonld |
JSON-LD | Primaere Datenquelle fuer Archiv + Indizes + Client-Aggregation (Matrix, Kosmos, Zeitfluss) |
partitur.json |
JSON | Biografische Masterdaten fuer alle 4 D3-Views + Prototyp-Seiten (Lebensphasen, Orte, Mobilitaet mit kontext, auftritte[] mit 60 Events, Netzwerk, Repertoire, Dokumente) |
matrix.json |
JSON | Nicht mehr git-getrackt — Frontend aggregiert on-the-fly (Session 25) |
kosmos.json |
JSON | Nicht mehr git-getrackt — Frontend aggregiert on-the-fly (Session 25) |
sankey.json |
JSON | Nicht mehr git-getrackt — Legacy, nie konsumiert (Session 25) |
Audit-Stand: 2026-02-25 (282 Objekte, 1.246 effektive Verknuepfungen, 4 Indizes).
- 8 Verknuepfungen ohne Archivsignatur: Davon 3 mit echten Daten (Cox/person, Wien/ort, Basel/ort). Gehen in Pipeline verloren → Signaturen nachtragen.
- 5 Verknuepfungen ohne Typ (NIM_004 Folio 32): Ohne Typ kann Pipeline Relationstyp nicht bestimmen → Typ-Spalte nachtragen.
- PL_07 Duplikat: Signatur
UAKUG/NIM/PL_07erscheint doppelt → Im Sheet bereinigen.
- Bearbeitungsstand fehlt bei 213/282 Objekten. Tippfehler ("vollstaedig"). Pipeline normalisiert Case, nicht Tippfehler.
- Nur 62/282 Objekte (22%) haben Verknuepfungen. Schwerpunkt: NIM_003, NIM_004, NIM_007.
- 4 Objekte ohne Dokumenttyp, 3 Objekte ohne Titel.
- Header-Shifts in 3/4 Indizes (Org, Ort, Werk): Erste Datenzeile wird als Header gelesen. Pipeline korrigiert via HEADER_SHIFTS-Mapping, aber erste Datenzeile geht verloren → Echte Header einfuegen.
- Folio-Spalte ohne Header: Pandas liest als
Unnamed: 2→ Headerfoliosetzen.
- Wikidata-IDs fehlten bei 97% der Index-Eintraege. Update:
reconcile.pyhat 171 Matches gefunden — noch in Sheets uebertragen. - Sprache nur bei 74/282 Objekten erfasst (26%).
- Case-Inkonsistenzen (lower/strip)
- Excel-Datetime-Artefakte (Zeitanteil)
- 45 Leerzeilen + 1 Template-Zeile (uebersprungen)
- Komposit-Typen (dekomponiert)
- Header-Shifts (HEADER_SHIFTS-Mapping)
- Mojibake in validate.py (Session 19: VOCAB + KOMPOSIT_TYPEN korrigiert)
- Bearbeitungsstand-Varianten (Session 19:
normalize_bearbeitungsstand()fuzzy-matched)
- Header-Shifts in 3 Indizes korrigieren
- Folio-Spalte benennen
- PL_07 Duplikat bereinigen
- Bearbeitungsstand-Schreibweise vereinbaren
- Verknuepfungen: Signatur und Typ immer ausfuellen
- Bearbeitungsstand pflegen
- Fehlende Dokumenttypen und Titel nachtragen
- Wikidata-Ergebnisse in Google Sheets uebertragen (171 Matches vorhanden)
- Verknuepfungs-Fortschritt pruefen (Ziel: >50% verknuepfte Objekte)