Einige Felder können je dataprovider_id mehrere unterschiedliche Werte haben (z.B. durch Datenmischung). Dafür wird ein Solr JSON-Facet genutzt und anschließend client-seitig auf nvals > 1 sowie 32-stellige IDs gefiltert. Hinweis: unique(...) ist in Solr oft ein schneller, näherungsweiser Distinct-Count (für das Finden von Kandidaten meist ausreichend).
Quelltext anzeigen
import requestsimport pandas as pdimport json# Organization-Daten (ddb-institution) laden -> DataFrameurl_org ="https://api.deutsche-digitale-bibliothek.de/2/search/index/organization/select"params_org = {"q": "type:ddb-institution OR type:ddb-aggregator","fl": "id,label","rows": 10000,"wt": "json",}resp_org = requests.get(url_org, params=params_org, timeout=300)resp_org.raise_for_status()data_org = resp_org.json()docs = data_org.get("response", {}).get("docs", [])def _as_list(value):if value isNone:return []# Solr liefert bei *_fct i.d.R. Listen; zur Sicherheit wird auch ein Scalar zu einer Liste normalisiertreturn value ifisinstance(value, list) else [value]df_org = pd.DataFrame({"id": [d.get("id") for d in docs],"label": [_as_list(d.get("label")) for d in docs],})# df_org
Quelltext anzeigen
url ="https://api.deutsche-digitale-bibliothek.de/2/search/index/search/select"params = {"q": "*:*","rows": 0,"wt": "json","json.facet": json.dumps({"providers": {"type": "terms","field": "dataprovider_id","limit": -1,"mincount": 1,"facet": {# distinct count (i.d.R. HLL/approx, dafür schnell)"nvals": "unique(dataprovider_fct)" },"sort": "nvals desc" } })}j = requests.get(url, params=params, timeout=300).json()buckets = j["facets"]["providers"]["buckets"]# Nur auffällige Fälleauffaellig = [b for b in buckets if b.get("nvals", 0) >1]# -> DataFramedf_auffaellig = pd.DataFrame([ {"dataprovider_id": str(b.get("val", "")),"dataprovider_fct_nvalues": int(b.get("nvals", 0) or0), }for b in auffaellig])ifnot df_auffaellig.empty:# nur 32-stellige IDs behalten, falls df_auffaellig nicht leer istifnot df_auffaellig.empty: df_auffaellig = df_auffaellig[df_auffaellig["dataprovider_id"].str.len() ==32].copy()# Label aus df_org anreichern (falls df_org existiert) df_auffaellig = ( df_auffaellig .merge(df_org[["id", "label"]], left_on="dataprovider_id", right_on="id", how="left") .drop(columns=["id"]) ) display(df_auffaellig)else:print("Keine Mehrfachwerte gefunden!👍")
dataprovider_id
dataprovider_fct_nvalues
label
0
7A5GWWGTIAUDXLN6JNTFKKZUM27GCGGI
2
[Staatliche Kunstsammlungen Dresden. GRASSI Mu...
1
ZCXCMB7WXARQK27QKZY6ZQSH23D4YEOA
2
[Queer*Feministische Bibliothek und Archiv LIE...
Variante: Mehrfachwerte in sector_fct
Gleiche Logik wie oben, aber für sector_fct (Sektor-Klassifikation). Ergebnis: df_auffaellig, angereichert mit label aus df_join.
Quelltext anzeigen
url ="https://api.deutsche-digitale-bibliothek.de/2/search/index/search/select"params = {"q": "*:*","rows": 0,"wt": "json","json.facet": json.dumps({"providers": {"type": "terms","field": "dataprovider_id","limit": -1,"mincount": 1,"facet": {# distinct count (i.d.R. HLL/approx, dafür schnell)"nvals": "unique(sector_fct)" },"sort": "nvals desc" } })}j = requests.get(url, params=params, timeout=300).json()buckets = j["facets"]["providers"]["buckets"]# Nur auffällige Fälleauffaellig = [b for b in buckets if b.get("nvals", 0) >1]# -> DataFramedf_auffaellig = pd.DataFrame([ {"dataprovider_id": str(b.get("val", "")),"sector_fct_nvalues": int(b.get("nvals", 0) or0), }for b in auffaellig])# nur 32-stellige IDs behalten, falls df_auffaellig nicht leer istifnot df_auffaellig.empty: df_auffaellig = df_auffaellig[df_auffaellig["dataprovider_id"].str.len() ==32].copy()# Label aus df_org anreichern (falls df_org existiert) df_auffaellig = ( df_auffaellig .merge(df_org[["id", "label"]], left_on="dataprovider_id", right_on="id", how="left") .drop(columns=["id"]) ) display(df_auffaellig) else:print("Keine Mehrfachwerte gefunden!👍")