from matplotlib.pyplot import title
import streamlit as st
import pandas as pd
import altair as alt
import pydeck as pdk
import os
import glob
from wordcloud import WordCloud
import streamlit_analytics

path = os.path.dirname(__file__)

streamlit_analytics.start_tracking()

@st.cache
def load_gnd_top_daten(typ):
    gnd_top_df = pd.DataFrame()
    for file in glob.glob(f'{path}/../stats/title_gnd_{typ}_*.csv'):
        gnd_top_df = gnd_top_df.append(pd.read_csv(file, index_col=None))
    return gnd_top_df

def sachbegriff_cloud():
    #wordcloud der top 100 sachbegriffe eines auszuwählenden tages der letzten 10 werktage
    st.header('TOP 100 Sachbegriffe pro Tag')
    st.write('Wählen Sie ein Datum aus den letzten 10 Werktagen vor der letzten Aktualisierung der Daten des Dashboards und sehen Sie eine Wordcloud der 100 meistverwendeten GND-Sachbegriffe dieses Tages. Die Größe des Begriffes entspricht der Häufigkeit des Sachbegriffs.')
    files = glob.glob(f'{path}/../stats/*Ts-count.csv')
    daten = [x[-23:-13] for x in files]
    daten.sort()
    daten_filter = st.select_slider('Wählen Sie ein Datum', options=daten, value=daten[-1])

    df = pd.read_csv(f'{path}/../stats/{daten_filter}-Ts-count.csv')
    
    dict = df.to_dict(orient='records')
    worte = {}
    for record in dict:
        worte.update({record['sachbegriff']:record['count']})

    wc = WordCloud(background_color="white", max_words=100, width=2000, height=800, colormap='tab20')
    wc.generate_from_frequencies(worte)
    return st.image(wc.to_array())

def wirkungsorte():
    #ranking und karte der meistverwendeten wirkungsorte aller personen in der gnd
    df = pd.read_csv(f'{path}/wirkungsorte-top50.csv')
    df.drop(columns=['id'], inplace=True)
    df.rename(columns={'name': 'Name', 'count': 'Anzahl'}, inplace=True)

    st.header('TOP Wirkungsorte von GND-Personen')
    st.markdown('Von allen Personensätzen (Tp) weisen 782.682 Angaben zum Wirkungsort der jeweiligen Person auf.')

    #Balkendiagramm
    orte_filt = st.slider('Zeige Top …', min_value=3, max_value=len(df), value=10, step=1)
    graph_count = alt.Chart(df.nlargest(orte_filt, 'Anzahl', keep='all')).mark_bar().encode(
        alt.X('Name:N', sort='y'),
        alt.Y('Anzahl'),
        alt.Color('Name:N', legend=alt.Legend(columns=2)),
        tooltip=[alt.Tooltip('Name:N', title='Ort'), alt.Tooltip('Anzahl:Q', title='Anzahl')]
    )
    st.altair_chart(graph_count, use_container_width=True)

    #Karte
    INITIAL_VIEW_STATE = pdk.ViewState(
    latitude=50.67877877706058,
    longitude=8.129981238464392,
    zoom=4.5,
    max_zoom=16,
    bearing=0
    )

    scatterplotlayer = pdk.Layer(
    "ScatterplotLayer",
    df,
    pickable=True,
    opacity=0.5,
    stroked=True,
    filled=True,
    radius_min_pixels=1,
    radius_max_pixels=100,
    line_width_min_pixels=1,
    get_position='[lon, lat]',
    get_radius="Anzahl",
    get_fill_color=[255, 140, 0],
    get_line_color=[0, 0, 0]
)

    st.pydeck_chart(pdk.Deck(
    scatterplotlayer,
    initial_view_state=INITIAL_VIEW_STATE,
    map_style=pdk.map_styles.LIGHT,
    tooltip={"html": "<b>{Name}</b><br \>Wirkungsort von {Anzahl} Personen"}))

def wirkungsorte_musik():
    #nach jahrzehnten zwischen 1400 und 2010 gefilterte auswertung der GND-Musikwerke, Musik-Personen und Wikrungsorte und daraus abgeleitete Zentren der Musikkultur, dargestellt auf einer Karte
    musiker_orte = pd.read_csv(f'{path}/musiker_orte.csv', sep='\t', index_col='idn')
    st.header('Wirkungszentren der Musik 1400–2010')
    st.write('Eine Auswertung der veröffentlichten Titel von Musikern und deren Wirkungszeiten erlaubt Rückschlüsse auf die musikalischen Zentren, wie sie im Bestand der DNB repräsentiert sind.')
    limiter = st.slider('Jahresfilter', min_value=1400, max_value=int(musiker_orte['jahrzehnt'].max()), value=(1900), step=10)
    musik_filt= musiker_orte.loc[(musiker_orte['jahrzehnt'] == limiter)]
    musik_filt['norm']=(musik_filt['count']-musik_filt['count'].min())/(musik_filt['count'].max()-musik_filt['count'].min())
    #Karte
    INITIAL_VIEW_STATE = pdk.ViewState(
        latitude=50.67877877706058,
        longitude=8.129981238464392,
        zoom=4.5,
        max_zoom=16,
        bearing=0
    )

    musiker_scatter = pdk.Layer(
        "ScatterplotLayer",
        musik_filt,
        opacity=0.8,
        get_position='[lon, lat]',
        pickable=True,
        stroked=True,
        filled=True,
        radius_min_pixels=1,
        radius_max_pixels=100,
        radiusscale=100,
        line_width_min_pixels=1,
        get_radius="norm*50000",
        get_fill_color=[50, 168, 92],
        get_line_color=[39, 71, 51]
    )

    st.pydeck_chart(pdk.Deck(
    musiker_scatter,
    initial_view_state=INITIAL_VIEW_STATE,
    map_style=pdk.map_styles.LIGHT,
    tooltip={"html": "<b>{name}</b>"}))
    st.subheader(f'TOP 10 Wirkungszentren der {limiter}er')
    col1, col2 = st.beta_columns(2)
    i = 1
    for index, row in musik_filt.nlargest(10, 'norm').iterrows():
        if i <= 5:
            with col1:
                st.write(f'{i}. {row["name"]}')
        elif i > 5:
            with col2:
                st.write(f'{i}. {row["name"]}')
        i += 1

def gesamt_entity_count():
    #Gesamtzahl der GND-Entitäten
    with open(f"{path}/../stats/gnd_entity_count.csv", "r") as f:
        entities = f'{int(f.read()):,}'
    return st.write(f"GND-Entitäten gesamt: {entities.replace(',','.')}")

def relationen():
    #Top 10 der GND-Relationierungscodes
    rels = pd.read_csv(f'{path}/../stats/gnd_codes_all.csv', index_col=False)
    st.subheader('Relationen')
    st.write('GND-Datensätze können mit anderen Datensätzen verlinkt (»relationiert«) werden. Die Art der Verlinkung wird über einen Relationierungscode beschrieben. Hier sind die am häufigsten verwendeten Relationierungscodes zu sehen. Die Auflösung der wichtigsten Codes gibt es [hier](https://wiki.dnb.de/download/attachments/51283696/Codeliste_ABCnachCode_Webseite_2012-07.pdf).')
    rels_filt = st.slider('Zeige Top ...', 5, len(rels), 10, 1)
    relation_count = alt.Chart(rels.nlargest(rels_filt, 'count', keep='all')).mark_bar().encode(
        alt.X('code', title='Relationierungs-Code', sort='-y'),
        alt.Y('count', title='Anzahl'),
        alt.Color('code', sort='-y', title='Relationierungscode'),
        tooltip=[alt.Tooltip('count', title='Anzahl'), alt.Tooltip('code', title='Code')]
    )
    st.altair_chart(relation_count, use_container_width=True)

    with open(f"{path}/../stats/gnd_relation_count.csv", "r") as f:
        relations = f'{int(f.read()):,}'
    st.write(f"Relationen zwischen Entitäten gesamt: {relations.replace(',','.')}")

def systematik():
    #Ranking der meistverwendeten GND-Systematik-Notationen
    classification = pd.read_csv(f'{path}/../stats/gnd_classification_all.csv', index_col=False)
    st.subheader('Systematik')
    st.write('Die Entitäten der GND können in eine Systematik eingeordnet werden. Die Liste der möglichen Notationen gibt es [hier](http://www.dnb.de/gndsyst).')
    class_filt = st.slider('Zeige Top …', 5, len(classification), 10, 1)
    classification_count = alt.Chart(classification.nlargest(class_filt, 'count', keep='all')).mark_bar().encode(
        alt.X('id', title='Notation', sort='-y'),
        alt.Y('count', title='Anzahl'),
        alt.Color('name', sort='-y', title="Bezeichnung"),
        tooltip=[alt.Tooltip('id', title='Notation'), alt.Tooltip('name', title='Bezeichnung'), alt.Tooltip('count', title='Anzahl')]
    )
    return st.altair_chart(classification_count, use_container_width=True)

def systematik_ts():
    #Ranking der Systematik von Ts-Sätzen
    classification_ts = pd.read_csv(f'{path}/../stats/gnd_classification_Ts_all.csv', index_col=False)
    st.subheader('Systematik der Sachbegriffe')
    st.write('Die Entitäten der GND können in eine Systematik eingeordnet werden. Hier sind die Systematik-Notationen der Sachbegriffe (Ts) aufgetragen. Die Liste der möglichen Notationen gibt es [hier](http://www.dnb.de/gndsyst).')
    class_ts_filt = st.slider('Zeige TOP …', min_value=5, max_value=len(classification_ts), value=10, step=1)
    classification_ts_count = alt.Chart(classification_ts.nlargest(class_ts_filt, 'count', keep='all')).mark_bar().encode(
        alt.X('id:N', title='Notation', sort='-y'),
        alt.Y('count:Q', title='Anzahl'),
        alt.Color('name:N', sort='-y', title='Bezeichnung'),
        tooltip = [alt.Tooltip('id', title='Notation'), alt.Tooltip('name', title='Bezeichnung'), alt.Tooltip('count', title='Anzahl')]
    )
    return st.altair_chart(classification_ts_count, use_container_width=True)

def zeitverlauf():
    #zeitverlauf der erstellung der GND-Sätze ab Januar 1972
    created_at = pd.read_csv(f'{path}/../stats/gnd_created_at.csv', index_col='created_at', parse_dates=True, header=0, names=['created_at', 'count'])
    
    st.subheader('Zeitverlauf der GND-Datensatzerstellung')
    st.write('Auf einer Zeitleiste wird die Anzahl der monatlich erstellten GND-Sätze aufgetragen. Die ersten Sätze stammen aus dem Januar 1972')
    created_filt = st.slider('Zeitraum', 1972, 2021, (1972,2021), 1)
    created = alt.Chart(created_at[f'{created_filt[0]}':f'{created_filt[1]}'].reset_index()).mark_line().encode(
        alt.X('created_at:T', title='Erstelldatum'),
        alt.Y('count:Q', title='Sätze pro Monat'),
        tooltip=['count']
    )
    return st.altair_chart(created, use_container_width=True)

def entities():
    #GND-Entitäten nach Satzart und Katalogisierungslevel
    df = pd.read_csv(f'{path}/../stats/gnd_entity_types.csv', index_col=False, names=['entity','count'])
    df['level'] = df.entity.str[2:3]
    df.entity = df.entity.str[:2]

    if satzart == 'alle':

        entity_count = alt.Chart(df).mark_bar().encode(
            alt.X('sum(count)', title='Datensätze pro Katalogisierungslevel'),
            alt.Y('entity', title='Satzart'),
            alt.Color('level', title='Katalogisierungslevel'),
            tooltip=[alt.Tooltip('entity', title='Satzart'), alt.Tooltip( 'level', title='Katalogisierungslevel'), alt.Tooltip('count', title='Anzahl')]
        )
        st.subheader('Entitäten und Katalogisierungslevel')

    else:

        entity_count = alt.Chart(df.loc[df['entity'].str.startswith(satzart[:2])]).mark_bar().encode(
            alt.X('sum(count)', title='Datensätze pro Katalogisierungslevel'),
            alt.Y('entity', title='Satzart'),
            alt.Color('level', title='Katalogisierungslevel'),
            tooltip=[alt.Tooltip( 'level', title='Katalogisierungslevel'), alt.Tooltip('count', title='Anzahl')]
        )
        st.subheader(f'Katalogisierungslevel in Satzart {satzart}')
    st.write('Alle GND-Entitäten können in verschiedenen Katalogisierungsleveln (1-7) angelegt werden. Je niedriger das Katalogisierungslevel, desto verlässlicher die Daten, weil Sie dann von qualifizierten Personen erstellt bzw. überprüft wurden.')
    return st.altair_chart(entity_count, use_container_width=True)

def newcomer():
    #TOP 10 der Entitäten, die in den letzten 365 Tagen erstellt wurden
    if satzart == 'alle':
        st.subheader(f'TOP 10 GND-Newcomer')
        st.write('TOP 10 der GND-Entitäten, die in den letzten 365 Tagen angelegt wurden.')
        newcomer_daten = pd.read_csv(f'{path}/../stats/title_gnd_newcomer_top10.csv', index_col=None)

        newcomer = alt.Chart(newcomer_daten).mark_bar().encode(
            alt.X('gnd_id', title='Entitäten', sort='-y'),
            alt.Y('count', title='Anzahl'),
            alt.Color('name', sort='-y', title='Entität'),
            tooltip=[alt.Tooltip('name:N', title='Entität'), alt.Tooltip('bbg:N', title='Satzart'), alt.Tooltip('gnd_id:N', title='IDN'), alt.Tooltip('count:Q', title='Anzahl')]
        )

    else:
        st.subheader(f'TOP 10 {satzart} GND-Newcomer')
        st.write(f'TOP 10 der {satzart} Sätze, die in den letzten 365 Tagen angelegt wurden.')
        newcomer_daten = load_gnd_top_daten('newcomer_top10')

        newcomer = alt.Chart(newcomer_daten.loc[newcomer_daten['bbg'].str.startswith(satzart[:2], na=False)]).mark_bar().encode(
            alt.X('gnd_id:O', title='Entitäten', sort='-y'),
            alt.Y('count', title='Anzahl'),
            alt.Color('name', sort='-y', title='Entität'),
            tooltip=[alt.Tooltip('name:N', title='Entität'), alt.Tooltip('gnd_id:N', title='IDN'), alt.Tooltip('count:Q', title='Anzahl')]
        )
    st.altair_chart(newcomer, use_container_width=True)

def gnd_top():
    #TOP 10 GND-Entitäten in DNB-Titeldaten, nach Satzart gefiltert
    if satzart == 'alle':
        st.subheader(f'TOP 10 GND-Entitäten in DNB-Titeldaten')
        top_daten = pd.read_csv(f'{path}/../stats/title_gnd_top10.csv', index_col=None)

        gnd_top = alt.Chart(top_daten).mark_bar().encode(
            alt.X('gnd_id:N', title='Entitäten', sort='-y'),
            alt.Y('count:Q', title='Anzahl'),
            alt.Color('name:N', sort='-y', title='Entität'),
            tooltip=[alt.Tooltip('name:N', title='Entität'), alt.Tooltip('gnd_id:N', title='IDN'), alt.Tooltip('bbg:N', title='Satzart'), alt.Tooltip('count:Q', title='Anzahl')]
        )

    else:
        st.subheader(f'TOP 10 {satzart} in DNB-Titeldaten')
        top_daten = load_gnd_top_daten('top10')

        gnd_top = alt.Chart(top_daten.loc[top_daten['bbg'].str.startswith(satzart[:2], na=False)]).mark_bar().encode(
            alt.X('gnd_id:N', title='Entitäten', sort='-y'),
            alt.Y('count:Q', title='Anzahl'),
            alt.Color('name:N', sort='-y', title='Entität'),
            tooltip=[alt.Tooltip('name:N', title='Entität'), alt.Tooltip('gnd_id:N', title='IDN'), alt.Tooltip('count:Q', title='Anzahl')]
        )
    st.write('Verknüpfungen, die maschinell erzeugt wurden, aus Fremddaten stammen oder verwaist sind, wurden nicht in die Auswertung einbezogen. Eine detaillierte Auflistung der ausgewerteten Felder ist im [GitHub-Repository](https://git.io/JG5vN) dieses Dashboards dokumentiert.')
    st.altair_chart(gnd_top, use_container_width=True)

def dnb_links():
    #GND-Verknüpfungen in DNB Titeldaten
    if satzart == 'alle':
        #Anzahl GND-Verknüpfungen in DNB-Titeldaten
        with open(f"{path}/../stats/title_gnd_links.csv", "r") as f:
            links = f'{int(f.read()):,}'
        
        #GND-Entitäten maschinell verknüpft
        with open(f"{path}/../stats/title_gnd_links_auto.csv", "r") as f:
            auto_entites = int(f.read())

        #GND-Entitäten aus Fremddaten
        with open(f"{path}/../stats/title_gnd_links_ext.csv", "r") as f:
            fremd_entities = int(f.read())

        #Anzahl der intellktuell verknüpften GND-Entitäten in DNB-Titeldaten
        with open(f"{path}/../stats/title_gnd_links_unique.csv", "r") as f:
            uniques = int(f.read())
            uniques_str = f'{uniques:,}'

        #Durchschnittliche Anzahl an GND-Verknüpfungen pro DNB-Titeldatensatz
        with open(f"{path}/../stats/title_gnd_mean.csv", "r") as f:
            mean = str(round(float(f.read()),2)).replace('.',',')

        st.write(f"{links.replace(',','.')} intellektuell vergebene Verknüpfungen zu {uniques_str.replace(',','.')} GND-Entitäten in den DNB-Titeldaten. Durchschnittlich {mean} GND-Verknüpfungen pro DNB-Titeldatensatz")

        entity_df = pd.DataFrame.from_dict({"intellektuell verknüpfte Entitäten": uniques, "Entitäten aus automatischen Prozessen": auto_entites, "Entitäten aus Fremddaten": fremd_entities}, orient = "index").reset_index()
        entity_df = entity_df.rename(columns={"index":"Datenart", 0:"Anzahl"})
        st.subheader('Datenherkunft der GND-Entitäten in DNB-Titeldaten')
        st.write('Weniger als ein Drittel der GND-Entitäten in DNB-Titeldaten wurde in intellektuellen Erschließungsprozessen vergeben. Jeweils ca. ein weiteres Drittel wurde in maschinellen Erschließungsprozessen vergeben, ca. ein Drittel stammt aus Fremddaten.')
        entities = alt.Chart(entity_df).mark_bar().encode(
            alt.X('sum(Datenart):N', title='Datenart'),
            alt.Y('sum(Anzahl):Q', title='Anzahl'),
            color='Datenart',
            tooltip='Anzahl:N'
        )
        st.altair_chart(entities, use_container_width=True)

        
    else:
        with open(f"{path}/../stats/title_gnd_mean_{satzart[:2]}.csv", "r") as f:
            mean = str(round(float(f.read()),2)).replace('.',',')
        st.write(f'Durchschnittlich {mean} Verknüpfungen zu {satzart}-Sätzen pro DNB-Titeldatensatz')

#main
st.title('GND-Dashboard')

#infoebereich oben
with st.beta_container():
    st.info('Hier finden Sie statistische Auswertungen der GND und ihrer Verknüpfungen mit den Titeldaten der Deutschen Nationalbibliothek (Stand der Daten: Juli 2021). Wählen Sie links die Satzart, die Sie interessiert, und Sie erhalten die verfügbaren Auswertungen und Statstiken. Verwenden Sie einen auf Chromium basierenden Browser.')
    with st.beta_expander("Methodik und Datenherkunft"):
        st.markdown('''
Datengrundlage ist ein Gesamtabzug der Daten der Gemeinsamen Normadatei (GND) sowie der Titeldaten der Deutschen Nationalbibliothek (DNB) inkl. Zeitschriftendatenbank (ZDB), sofern sich Exemplare der Zeitschrift im Bestand der DNB befinden. In den Titeldaten ist auch der Tonträger- und Notenbestand des Deutschen Musikarchivs (DMA) sowie der Buch- und Objektbestand des Deutschen Buch- und Schriftmuseums (DBSM) nachgewiesen.

Der Gesamtabzug liegt im OCLC-Format PICA+ vor. Die Daten werden mithilfe des Pica-Parsers [pica.rs](https://github.com/deutsche-nationalbibliothek/pica-rs) gefiltert. Dieses Tool produziert aus dem sehr großen Gesamtabzug (~ 31 GB) kleinere CSV-Dateien, die mit Python weiterverarbeitet werden.

Das Dashboard ist mit dem Python-Framework [Streamlit](https://streamlit.io/) geschrieben. Die Skripte sowie die gefilterten CSV-Rohdaten sind auf [Github](https://github.com/buchmuseum/GND_Dashboard) zu finden. Die Diagramme wurden mit [Altair](https://altair-viz.github.io/index.html) erstellt, die Karten mit [Deck GL](https://deck.gl/) (via [Pydeck](https://deckgl.readthedocs.io/en/latest/#)), die Wordcloud mit [wordcloud](https://amueller.github.io/word_cloud/index.html).

Für grundlegende Zugriffsstatistik verwenden wir [streamlit-analytics](https://pypi.org/project/streamlit-analytics/). Dabei werden keine personenbezogenen Daten gespeichert.

Alle Skripte und Daten stehen unter CC0 Lizenz und können frei weitergenutzt werden.

Die Daten werden monatlich aktualisiert.
''')

#sidebar mit satzartenfilter
st.sidebar.header("Satzart wählen")
satzart = st.sidebar.selectbox(
    "Über welche GND-Satzart möchten Sie etwas erfahren?",
    ('alle', "Tp - Personen", "Tb - Körperschaften", "Tg - Geografika", "Ts - Sachbegriffe", "Tu - Werke", "Tf - Veranstaltungen")
)
st.sidebar.info('Diese Widgets haben die GitHub-User [niko2342](https://github.com/niko2342/), [ramonvoges](https://github.com/ramonvoges), [a-wendler](https://github.com/a-wendler/) sowie Christian Baumann geschrieben. Sie gehören zur Python Community der Deutschen Nationalbibliothek.')

gnd_allgemein = st.beta_container()
with gnd_allgemein:
    st.header('GND Statistik allgemein')
    #allgemeine statistiken in abhängigkeit der satzart
    if satzart == 'alle':
        gesamt_entity_count()
        entities()
        newcomer()
        zeitverlauf()
        relationen()
        systematik()
    else:
        entities()
        newcomer()
    
    #besondere widgets für einzelne satzarten
    if satzart == "Tp - Personen":
        wirkungsorte()
    elif satzart == "Tg - Geografika":
        wirkungsorte_musik()
        wirkungsorte()
    elif satzart == "Ts - Sachbegriffe":
        sachbegriff_cloud()
        systematik_ts()

dnb = st.beta_container()
with dnb:
    st.header('GND in der Deutschen Nationalbibliothek')
    gnd_top()
    dnb_links()

streamlit_analytics.stop_tracking()
[((11, 7, 11, 32), 'os.path.dirname', 'os.path.dirname', ({(11, 23, 11, 31): '__file__'}, {}), '(__file__)', False, 'import os\n'), ((13, 0, 13, 36), 'streamlit_analytics.start_tracking', 'streamlit_analytics.start_tracking', ({}, {}), '()', False, 'import streamlit_analytics\n'), ((335, 0, 335, 25), 'streamlit.title', 'st.title', ({(335, 9, 335, 24): '"""GND-Dashboard"""'}, {}), "('GND-Dashboard')", True, 'import streamlit as st\n'), ((356, 0, 356, 36), 'streamlit.sidebar.header', 'st.sidebar.header', ({(356, 18, 356, 35): '"""Satzart wählen"""'}, {}), "('Satzart wählen')", True, 'import streamlit as st\n'), ((357, 10, 360, 1), 'streamlit.sidebar.selectbox', 'st.sidebar.selectbox', ({(358, 4, 358, 59): '"""Über welche GND-Satzart möchten Sie etwas erfahren?"""', (359, 4, 359, 131): "('alle', 'Tp - Personen', 'Tb - Körperschaften', 'Tg - Geografika',\n    'Ts - Sachbegriffe', 'Tu - Werke', 'Tf - Veranstaltungen')"}, {}), "('Über welche GND-Satzart möchten Sie etwas erfahren?',\n    ('alle', 'Tp - Personen', 'Tb - Körperschaften', 'Tg - Geografika',\n    'Ts - Sachbegriffe', 'Tu - Werke', 'Tf - Veranstaltungen'))", True, 'import streamlit as st\n'), ((361, 0, 361, 289), 'streamlit.sidebar.info', 'st.sidebar.info', ({(361, 16, 361, 288): '"""Diese Widgets haben die GitHub-User [niko2342](https://github.com/niko2342/), [ramonvoges](https://github.com/ramonvoges), [a-wendler](https://github.com/a-wendler/) sowie Christian Baumann geschrieben. Sie gehören zur Python Community der Deutschen Nationalbibliothek."""'}, {}), "(\n    'Diese Widgets haben die GitHub-User [niko2342](https://github.com/niko2342/), [ramonvoges](https://github.com/ramonvoges), [a-wendler](https://github.com/a-wendler/) sowie Christian Baumann geschrieben. Sie gehören zur Python Community der Deutschen Nationalbibliothek.'\n    )", True, 'import streamlit as st\n'), ((363, 16, 363, 35), 'streamlit.beta_container', 'st.beta_container', ({}, {}), '()', True, 'import streamlit as st\n'), ((388, 6, 388, 25), 'streamlit.beta_container', 'st.beta_container', ({}, {}), '()', True, 'import streamlit as st\n'), ((394, 0, 394, 35), 'streamlit_analytics.stop_tracking', 'streamlit_analytics.stop_tracking', ({}, {}), '()', False, 'import streamlit_analytics\n'), ((17, 17, 17, 31), 'pandas.DataFrame', 'pd.DataFrame', ({}, {}), '()', True, 'import pandas as pd\n'), ((18, 16, 18, 67), 'glob.glob', 'glob.glob', ({(18, 26, 18, 66): 'f"""{path}/../stats/title_gnd_{typ}_*.csv"""'}, {}), "(f'{path}/../stats/title_gnd_{typ}_*.csv')", False, 'import glob\n'), ((24, 4, 24, 45), 'streamlit.header', 'st.header', ({(24, 14, 24, 44): '"""TOP 100 Sachbegriffe pro Tag"""'}, {}), "('TOP 100 Sachbegriffe pro Tag')", True, 'import streamlit as st\n'), ((25, 4, 25, 278), 'streamlit.write', 'st.write', ({(25, 13, 25, 277): '"""Wählen Sie ein Datum aus den letzten 10 Werktagen vor der letzten Aktualisierung der Daten des Dashboards und sehen Sie eine Wordcloud der 100 meistverwendeten GND-Sachbegriffe dieses Tages. Die Größe des Begriffes entspricht der Häufigkeit des Sachbegriffs."""'}, {}), "(\n    'Wählen Sie ein Datum aus den letzten 10 Werktagen vor der letzten Aktualisierung der Daten des Dashboards und sehen Sie eine Wordcloud der 100 meistverwendeten GND-Sachbegriffe dieses Tages. Die Größe des Begriffes entspricht der Häufigkeit des Sachbegriffs.'\n    )", True, 'import streamlit as st\n'), ((26, 12, 26, 55), 'glob.glob', 'glob.glob', ({(26, 22, 26, 54): 'f"""{path}/../stats/*Ts-count.csv"""'}, {}), "(f'{path}/../stats/*Ts-count.csv')", False, 'import glob\n'), ((29, 19, 29, 92), 'streamlit.select_slider', 'st.select_slider', (), '', True, 'import streamlit as st\n'), ((31, 9, 31, 68), 'pandas.read_csv', 'pd.read_csv', ({(31, 21, 31, 67): 'f"""{path}/../stats/{daten_filter}-Ts-count.csv"""'}, {}), "(f'{path}/../stats/{daten_filter}-Ts-count.csv')", True, 'import pandas as pd\n'), ((38, 9, 38, 101), 'wordcloud.WordCloud', 'WordCloud', (), '', False, 'from wordcloud import WordCloud\n'), ((44, 9, 44, 54), 'pandas.read_csv', 'pd.read_csv', ({(44, 21, 44, 53): 'f"""{path}/wirkungsorte-top50.csv"""'}, {}), "(f'{path}/wirkungsorte-top50.csv')", True, 'import pandas as pd\n'), ((48, 4, 48, 50), 'streamlit.header', 'st.header', ({(48, 14, 48, 49): '"""TOP Wirkungsorte von GND-Personen"""'}, {}), "('TOP Wirkungsorte von GND-Personen')", True, 'import streamlit as st\n'), ((49, 4, 49, 115), 'streamlit.markdown', 'st.markdown', ({(49, 16, 49, 114): '"""Von allen Personensätzen (Tp) weisen 782.682 Angaben zum Wirkungsort der jeweiligen Person auf."""'}, {}), "(\n    'Von allen Personensätzen (Tp) weisen 782.682 Angaben zum Wirkungsort der jeweiligen Person auf.'\n    )", True, 'import streamlit as st\n'), ((59, 4, 59, 58), 'streamlit.altair_chart', 'st.altair_chart', (), '', True, 'import streamlit as st\n'), ((62, 25, 68, 5), 'pydeck.ViewState', 'pdk.ViewState', (), '', True, 'import pydeck as pdk\n'), ((70, 23, 84, 1), 'pydeck.Layer', 'pdk.Layer', (), '', True, 'import pydeck as pdk\n'), ((94, 19, 94, 85), 'pandas.read_csv', 'pd.read_csv', (), '', True, 'import pandas as pd\n'), ((95, 4, 95, 54), 'streamlit.header', 'st.header', ({(95, 14, 95, 53): '"""Wirkungszentren der Musik 1400–2010"""'}, {}), "('Wirkungszentren der Musik 1400–2010')", True, 'import streamlit as st\n'), ((96, 4, 96, 199), 'streamlit.write', 'st.write', ({(96, 13, 96, 198): '"""Eine Auswertung der veröffentlichten Titel von Musikern und deren Wirkungszeiten erlaubt Rückschlüsse auf die musikalischen Zentren, wie sie im Bestand der DNB repräsentiert sind."""'}, {}), "(\n    'Eine Auswertung der veröffentlichten Titel von Musikern und deren Wirkungszeiten erlaubt Rückschlüsse auf die musikalischen Zentren, wie sie im Bestand der DNB repräsentiert sind.'\n    )", True, 'import streamlit as st\n'), ((101, 25, 107, 5), 'pydeck.ViewState', 'pdk.ViewState', (), '', True, 'import pydeck as pdk\n'), ((109, 22, 124, 5), 'pydeck.Layer', 'pdk.Layer', (), '', True, 'import pydeck as pdk\n'), ((131, 4, 131, 59), 'streamlit.subheader', 'st.subheader', ({(131, 17, 131, 58): 'f"""TOP 10 Wirkungszentren der {limiter}er"""'}, {}), "(f'TOP 10 Wirkungszentren der {limiter}er')", True, 'import streamlit as st\n'), ((132, 17, 132, 35), 'streamlit.beta_columns', 'st.beta_columns', ({(132, 33, 132, 34): '2'}, {}), '(2)', True, 'import streamlit as st\n'), ((151, 11, 151, 77), 'pandas.read_csv', 'pd.read_csv', (), '', True, 'import pandas as pd\n'), ((152, 4, 152, 30), 'streamlit.subheader', 'st.subheader', ({(152, 17, 152, 29): '"""Relationen"""'}, {}), "('Relationen')", True, 'import streamlit as st\n'), ((153, 4, 153, 392), 'streamlit.write', 'st.write', ({(153, 13, 153, 391): '"""GND-Datensätze können mit anderen Datensätzen verlinkt (»relationiert«) werden. Die Art der Verlinkung wird über einen Relationierungscode beschrieben. Hier sind die am häufigsten verwendeten Relationierungscodes zu sehen. Die Auflösung der wichtigsten Codes gibt es [hier](https://wiki.dnb.de/download/attachments/51283696/Codeliste_ABCnachCode_Webseite_2012-07.pdf)."""'}, {}), "(\n    'GND-Datensätze können mit anderen Datensätzen verlinkt (»relationiert«) werden. Die Art der Verlinkung wird über einen Relationierungscode beschrieben. Hier sind die am häufigsten verwendeten Relationierungscodes zu sehen. Die Auflösung der wichtigsten Codes gibt es [hier](https://wiki.dnb.de/download/attachments/51283696/Codeliste_ABCnachCode_Webseite_2012-07.pdf).'\n    )", True, 'import streamlit as st\n'), ((161, 4, 161, 61), 'streamlit.altair_chart', 'st.altair_chart', (), '', True, 'import streamlit as st\n'), ((169, 21, 169, 96), 'pandas.read_csv', 'pd.read_csv', (), '', True, 'import pandas as pd\n'), ((170, 4, 170, 30), 'streamlit.subheader', 'st.subheader', ({(170, 17, 170, 29): '"""Systematik"""'}, {}), "('Systematik')", True, 'import streamlit as st\n'), ((171, 4, 171, 164), 'streamlit.write', 'st.write', ({(171, 13, 171, 163): '"""Die Entitäten der GND können in eine Systematik eingeordnet werden. Die Liste der möglichen Notationen gibt es [hier](http://www.dnb.de/gndsyst)."""'}, {}), "(\n    'Die Entitäten der GND können in eine Systematik eingeordnet werden. Die Liste der möglichen Notationen gibt es [hier](http://www.dnb.de/gndsyst).'\n    )", True, 'import streamlit as st\n'), ((179, 11, 179, 74), 'streamlit.altair_chart', 'st.altair_chart', (), '', True, 'import streamlit as st\n'), ((183, 24, 183, 102), 'pandas.read_csv', 'pd.read_csv', (), '', True, 'import pandas as pd\n'), ((184, 4, 184, 47), 'streamlit.subheader', 'st.subheader', ({(184, 17, 184, 46): '"""Systematik der Sachbegriffe"""'}, {}), "('Systematik der Sachbegriffe')", True, 'import streamlit as st\n'), ((185, 4, 185, 235), 'streamlit.write', 'st.write', ({(185, 13, 185, 234): '"""Die Entitäten der GND können in eine Systematik eingeordnet werden. Hier sind die Systematik-Notationen der Sachbegriffe (Ts) aufgetragen. Die Liste der möglichen Notationen gibt es [hier](http://www.dnb.de/gndsyst)."""'}, {}), "(\n    'Die Entitäten der GND können in eine Systematik eingeordnet werden. Hier sind die Systematik-Notationen der Sachbegriffe (Ts) aufgetragen. Die Liste der möglichen Notationen gibt es [hier](http://www.dnb.de/gndsyst).'\n    )", True, 'import streamlit as st\n'), ((193, 11, 193, 77), 'streamlit.altair_chart', 'st.altair_chart', (), '', True, 'import streamlit as st\n'), ((197, 17, 197, 150), 'pandas.read_csv', 'pd.read_csv', (), '', True, 'import pandas as pd\n'), ((199, 4, 199, 59), 'streamlit.subheader', 'st.subheader', ({(199, 17, 199, 58): '"""Zeitverlauf der GND-Datensatzerstellung"""'}, {}), "('Zeitverlauf der GND-Datensatzerstellung')", True, 'import streamlit as st\n'), ((200, 4, 200, 147), 'streamlit.write', 'st.write', ({(200, 13, 200, 146): '"""Auf einer Zeitleiste wird die Anzahl der monatlich erstellten GND-Sätze aufgetragen. Die ersten Sätze stammen aus dem Januar 1972"""'}, {}), "(\n    'Auf einer Zeitleiste wird die Anzahl der monatlich erstellten GND-Sätze aufgetragen. Die ersten Sätze stammen aus dem Januar 1972'\n    )", True, 'import streamlit as st\n'), ((201, 19, 201, 68), 'streamlit.slider', 'st.slider', ({(201, 29, 201, 39): '"""Zeitraum"""', (201, 41, 201, 45): '1972', (201, 47, 201, 51): '2021', (201, 53, 201, 64): '(1972, 2021)', (201, 66, 201, 67): '1'}, {}), "('Zeitraum', 1972, 2021, (1972, 2021), 1)", True, 'import streamlit as st\n'), ((207, 11, 207, 61), 'streamlit.altair_chart', 'st.altair_chart', (), '', True, 'import streamlit as st\n'), ((211, 9, 211, 104), 'pandas.read_csv', 'pd.read_csv', (), '', True, 'import pandas as pd\n'), ((234, 4, 234, 254), 'streamlit.write', 'st.write', ({(234, 13, 234, 253): '"""Alle GND-Entitäten können in verschiedenen Katalogisierungsleveln (1-7) angelegt werden. Je niedriger das Katalogisierungslevel, desto verlässlicher die Daten, weil Sie dann von qualifizierten Personen erstellt bzw. überprüft wurden."""'}, {}), "(\n    'Alle GND-Entitäten können in verschiedenen Katalogisierungsleveln (1-7) angelegt werden. Je niedriger das Katalogisierungslevel, desto verlässlicher die Daten, weil Sie dann von qualifizierten Personen erstellt bzw. überprüft wurden.'\n    )", True, 'import streamlit as st\n'), ((235, 11, 235, 66), 'streamlit.altair_chart', 'st.altair_chart', (), '', True, 'import streamlit as st\n'), ((262, 4, 262, 55), 'streamlit.altair_chart', 'st.altair_chart', (), '', True, 'import streamlit as st\n'), ((287, 4, 287, 283), 'streamlit.write', 'st.write', ({(287, 13, 287, 282): '"""Verknüpfungen, die maschinell erzeugt wurden, aus Fremddaten stammen oder verwaist sind, wurden nicht in die Auswertung einbezogen. Eine detaillierte Auflistung der ausgewerteten Felder ist im [GitHub-Repository](https://git.io/JG5vN) dieses Dashboards dokumentiert."""'}, {}), "(\n    'Verknüpfungen, die maschinell erzeugt wurden, aus Fremddaten stammen oder verwaist sind, wurden nicht in die Auswertung einbezogen. Eine detaillierte Auflistung der ausgewerteten Felder ist im [GitHub-Repository](https://git.io/JG5vN) dieses Dashboards dokumentiert.'\n    )", True, 'import streamlit as st\n'), ((288, 4, 288, 54), 'streamlit.altair_chart', 'st.altair_chart', (), '', True, 'import streamlit as st\n'), ((338, 5, 338, 24), 'streamlit.beta_container', 'st.beta_container', ({}, {}), '()', True, 'import streamlit as st\n'), ((339, 4, 339, 341), 'streamlit.info', 'st.info', ({(339, 12, 339, 340): '"""Hier finden Sie statistische Auswertungen der GND und ihrer Verknüpfungen mit den Titeldaten der Deutschen Nationalbibliothek (Stand der Daten: Juli 2021). Wählen Sie links die Satzart, die Sie interessiert, und Sie erhalten die verfügbaren Auswertungen und Statstiken. Verwenden Sie einen auf Chromium basierenden Browser."""'}, {}), "(\n    'Hier finden Sie statistische Auswertungen der GND und ihrer Verknüpfungen mit den Titeldaten der Deutschen Nationalbibliothek (Stand der Daten: Juli 2021). Wählen Sie links die Satzart, die Sie interessiert, und Sie erhalten die verfügbaren Auswertungen und Statstiken. Verwenden Sie einen auf Chromium basierenden Browser.'\n    )", True, 'import streamlit as st\n'), ((365, 4, 365, 40), 'streamlit.header', 'st.header', ({(365, 14, 365, 39): '"""GND Statistik allgemein"""'}, {}), "('GND Statistik allgemein')", True, 'import streamlit as st\n'), ((390, 4, 390, 56), 'streamlit.header', 'st.header', ({(390, 14, 390, 55): '"""GND in der Deutschen Nationalbibliothek"""'}, {}), "('GND in der Deutschen Nationalbibliothek')", True, 'import streamlit as st\n'), ((54, 8, 54, 33), 'altair.X', 'alt.X', (), '', True, 'import altair as alt\n'), ((55, 8, 55, 23), 'altair.Y', 'alt.Y', ({(55, 14, 55, 22): '"""Anzahl"""'}, {}), "('Anzahl')", True, 'import altair as alt\n'), ((86, 20, 90, 77), 'pydeck.Deck', 'pdk.Deck', (), '', True, 'import pydeck as pdk\n'), ((126, 20, 130, 38), 'pydeck.Deck', 'pdk.Deck', (), '', True, 'import pydeck as pdk\n'), ((156, 8, 156, 62), 'altair.X', 'alt.X', (), '', True, 'import altair as alt\n'), ((157, 8, 157, 38), 'altair.Y', 'alt.Y', (), '', True, 'import altair as alt\n'), ((158, 8, 158, 65), 'altair.Color', 'alt.Color', (), '', True, 'import altair as alt\n'), ((174, 8, 174, 48), 'altair.X', 'alt.X', (), '', True, 'import altair as alt\n'), ((175, 8, 175, 38), 'altair.Y', 'alt.Y', (), '', True, 'import altair as alt\n'), ((176, 8, 176, 57), 'altair.Color', 'alt.Color', (), '', True, 'import altair as alt\n'), ((188, 8, 188, 50), 'altair.X', 'alt.X', (), '', True, 'import altair as alt\n'), ((189, 8, 189, 40), 'altair.Y', 'alt.Y', (), '', True, 'import altair as alt\n'), ((190, 8, 190, 59), 'altair.Color', 'alt.Color', (), '', True, 'import altair as alt\n'), ((203, 8, 203, 51), 'altair.X', 'alt.X', (), '', True, 'import altair as alt\n'), ((204, 8, 204, 50), 'altair.Y', 'alt.Y', (), '', True, 'import altair as alt\n'), ((223, 8, 223, 60), 'streamlit.subheader', 'st.subheader', ({(223, 21, 223, 59): '"""Entitäten und Katalogisierungslevel"""'}, {}), "('Entitäten und Katalogisierungslevel')", True, 'import streamlit as st\n'), ((233, 8, 233, 67), 'streamlit.subheader', 'st.subheader', ({(233, 21, 233, 66): 'f"""Katalogisierungslevel in Satzart {satzart}"""'}, {}), "(f'Katalogisierungslevel in Satzart {satzart}')", True, 'import streamlit as st\n'), ((240, 8, 240, 44), 'streamlit.subheader', 'st.subheader', ({(240, 21, 240, 43): 'f"""TOP 10 GND-Newcomer"""'}, {}), "(f'TOP 10 GND-Newcomer')", True, 'import streamlit as st\n'), ((241, 8, 241, 92), 'streamlit.write', 'st.write', ({(241, 17, 241, 91): '"""TOP 10 der GND-Entitäten, die in den letzten 365 Tagen angelegt wurden."""'}, {}), "(\n    'TOP 10 der GND-Entitäten, die in den letzten 365 Tagen angelegt wurden.')", True, 'import streamlit as st\n'), ((242, 25, 242, 101), 'pandas.read_csv', 'pd.read_csv', (), '', True, 'import pandas as pd\n'), ((252, 8, 252, 54), 'streamlit.subheader', 'st.subheader', ({(252, 21, 252, 53): 'f"""TOP 10 {satzart} GND-Newcomer"""'}, {}), "(f'TOP 10 {satzart} GND-Newcomer')", True, 'import streamlit as st\n'), ((253, 8, 253, 95), 'streamlit.write', 'st.write', ({(253, 17, 253, 94): 'f"""TOP 10 der {satzart} Sätze, die in den letzten 365 Tagen angelegt wurden."""'}, {}), "(\n    f'TOP 10 der {satzart} Sätze, die in den letzten 365 Tagen angelegt wurden.'\n    )", True, 'import streamlit as st\n'), ((267, 8, 267, 64), 'streamlit.subheader', 'st.subheader', ({(267, 21, 267, 63): 'f"""TOP 10 GND-Entitäten in DNB-Titeldaten"""'}, {}), "(f'TOP 10 GND-Entitäten in DNB-Titeldaten')", True, 'import streamlit as st\n'), ((268, 20, 268, 87), 'pandas.read_csv', 'pd.read_csv', (), '', True, 'import pandas as pd\n'), ((278, 8, 278, 59), 'streamlit.subheader', 'st.subheader', ({(278, 21, 278, 58): 'f"""TOP 10 {satzart} in DNB-Titeldaten"""'}, {}), "(f'TOP 10 {satzart} in DNB-Titeldaten')", True, 'import streamlit as st\n'), ((318, 8, 318, 74), 'streamlit.subheader', 'st.subheader', ({(318, 21, 318, 73): '"""Datenherkunft der GND-Entitäten in DNB-Titeldaten"""'}, {}), "('Datenherkunft der GND-Entitäten in DNB-Titeldaten')", True, 'import streamlit as st\n'), ((319, 8, 319, 267), 'streamlit.write', 'st.write', ({(319, 17, 319, 266): '"""Weniger als ein Drittel der GND-Entitäten in DNB-Titeldaten wurde in intellektuellen Erschließungsprozessen vergeben. Jeweils ca. ein weiteres Drittel wurde in maschinellen Erschließungsprozessen vergeben, ca. ein Drittel stammt aus Fremddaten."""'}, {}), "(\n    'Weniger als ein Drittel der GND-Entitäten in DNB-Titeldaten wurde in intellektuellen Erschließungsprozessen vergeben. Jeweils ca. ein weiteres Drittel wurde in maschinellen Erschließungsprozessen vergeben, ca. ein Drittel stammt aus Fremddaten.'\n    )", True, 'import streamlit as st\n'), ((326, 8, 326, 59), 'streamlit.altair_chart', 'st.altair_chart', (), '', True, 'import streamlit as st\n'), ((332, 8, 332, 103), 'streamlit.write', 'st.write', ({(332, 17, 332, 102): 'f"""Durchschnittlich {mean} Verknüpfungen zu {satzart}-Sätzen pro DNB-Titeldatensatz"""'}, {}), "(\n    f'Durchschnittlich {mean} Verknüpfungen zu {satzart}-Sätzen pro DNB-Titeldatensatz'\n    )", True, 'import streamlit as st\n'), ((340, 9, 340, 55), 'streamlit.beta_expander', 'st.beta_expander', ({(340, 26, 340, 54): '"""Methodik und Datenherkunft"""'}, {}), "('Methodik und Datenherkunft')", True, 'import streamlit as st\n'), ((341, 8, 353, 4), 'streamlit.markdown', 'st.markdown', ({(341, 20, 353, 3): '"""\nDatengrundlage ist ein Gesamtabzug der Daten der Gemeinsamen Normadatei (GND) sowie der Titeldaten der Deutschen Nationalbibliothek (DNB) inkl. Zeitschriftendatenbank (ZDB), sofern sich Exemplare der Zeitschrift im Bestand der DNB befinden. In den Titeldaten ist auch der Tonträger- und Notenbestand des Deutschen Musikarchivs (DMA) sowie der Buch- und Objektbestand des Deutschen Buch- und Schriftmuseums (DBSM) nachgewiesen.\n\nDer Gesamtabzug liegt im OCLC-Format PICA+ vor. Die Daten werden mithilfe des Pica-Parsers [pica.rs](https://github.com/deutsche-nationalbibliothek/pica-rs) gefiltert. Dieses Tool produziert aus dem sehr großen Gesamtabzug (~ 31 GB) kleinere CSV-Dateien, die mit Python weiterverarbeitet werden.\n\nDas Dashboard ist mit dem Python-Framework [Streamlit](https://streamlit.io/) geschrieben. Die Skripte sowie die gefilterten CSV-Rohdaten sind auf [Github](https://github.com/buchmuseum/GND_Dashboard) zu finden. Die Diagramme wurden mit [Altair](https://altair-viz.github.io/index.html) erstellt, die Karten mit [Deck GL](https://deck.gl/) (via [Pydeck](https://deckgl.readthedocs.io/en/latest/#)), die Wordcloud mit [wordcloud](https://amueller.github.io/word_cloud/index.html).\n\nFür grundlegende Zugriffsstatistik verwenden wir [streamlit-analytics](https://pypi.org/project/streamlit-analytics/). Dabei werden keine personenbezogenen Daten gespeichert.\n\nAlle Skripte und Daten stehen unter CC0 Lizenz und können frei weitergenutzt werden.\n\nDie Daten werden monatlich aktualisiert.\n"""'}, {}), '(\n    """\nDatengrundlage ist ein Gesamtabzug der Daten der Gemeinsamen Normadatei (GND) sowie der Titeldaten der Deutschen Nationalbibliothek (DNB) inkl. Zeitschriftendatenbank (ZDB), sofern sich Exemplare der Zeitschrift im Bestand der DNB befinden. In den Titeldaten ist auch der Tonträger- und Notenbestand des Deutschen Musikarchivs (DMA) sowie der Buch- und Objektbestand des Deutschen Buch- und Schriftmuseums (DBSM) nachgewiesen.\n\nDer Gesamtabzug liegt im OCLC-Format PICA+ vor. Die Daten werden mithilfe des Pica-Parsers [pica.rs](https://github.com/deutsche-nationalbibliothek/pica-rs) gefiltert. Dieses Tool produziert aus dem sehr großen Gesamtabzug (~ 31 GB) kleinere CSV-Dateien, die mit Python weiterverarbeitet werden.\n\nDas Dashboard ist mit dem Python-Framework [Streamlit](https://streamlit.io/) geschrieben. Die Skripte sowie die gefilterten CSV-Rohdaten sind auf [Github](https://github.com/buchmuseum/GND_Dashboard) zu finden. Die Diagramme wurden mit [Altair](https://altair-viz.github.io/index.html) erstellt, die Karten mit [Deck GL](https://deck.gl/) (via [Pydeck](https://deckgl.readthedocs.io/en/latest/#)), die Wordcloud mit [wordcloud](https://amueller.github.io/word_cloud/index.html).\n\nFür grundlegende Zugriffsstatistik verwenden wir [streamlit-analytics](https://pypi.org/project/streamlit-analytics/). Dabei werden keine personenbezogenen Daten gespeichert.\n\nAlle Skripte und Daten stehen unter CC0 Lizenz und können frei weitergenutzt werden.\n\nDie Daten werden monatlich aktualisiert.\n"""\n    )', True, 'import streamlit as st\n'), ((19, 39, 19, 72), 'pandas.read_csv', 'pd.read_csv', (), '', True, 'import pandas as pd\n'), ((218, 12, 218, 78), 'altair.X', 'alt.X', (), '', True, 'import altair as alt\n'), ((219, 12, 219, 44), 'altair.Y', 'alt.Y', (), '', True, 'import altair as alt\n'), ((220, 12, 220, 61), 'altair.Color', 'alt.Color', (), '', True, 'import altair as alt\n'), ((228, 12, 228, 78), 'altair.X', 'alt.X', (), '', True, 'import altair as alt\n'), ((229, 12, 229, 44), 'altair.Y', 'alt.Y', (), '', True, 'import altair as alt\n'), ((230, 12, 230, 61), 'altair.Color', 'alt.Color', (), '', True, 'import altair as alt\n'), ((245, 12, 245, 58), 'altair.X', 'alt.X', (), '', True, 'import altair as alt\n'), ((246, 12, 246, 42), 'altair.Y', 'alt.Y', (), '', True, 'import altair as alt\n'), ((247, 12, 247, 58), 'altair.Color', 'alt.Color', (), '', True, 'import altair as alt\n'), ((257, 12, 257, 60), 'altair.X', 'alt.X', (), '', True, 'import altair as alt\n'), ((258, 12, 258, 42), 'altair.Y', 'alt.Y', (), '', True, 'import altair as alt\n'), ((259, 12, 259, 58), 'altair.Color', 'alt.Color', (), '', True, 'import altair as alt\n'), ((271, 12, 271, 60), 'altair.X', 'alt.X', (), '', True, 'import altair as alt\n'), ((272, 12, 272, 44), 'altair.Y', 'alt.Y', (), '', True, 'import altair as alt\n'), ((273, 12, 273, 60), 'altair.Color', 'alt.Color', (), '', True, 'import altair as alt\n'), ((282, 12, 282, 60), 'altair.X', 'alt.X', (), '', True, 'import altair as alt\n'), ((283, 12, 283, 44), 'altair.Y', 'alt.Y', (), '', True, 'import altair as alt\n'), ((284, 12, 284, 60), 'altair.Color', 'alt.Color', (), '', True, 'import altair as alt\n'), ((321, 12, 321, 54), 'altair.X', 'alt.X', (), '', True, 'import altair as alt\n'), ((322, 12, 322, 50), 'altair.Y', 'alt.Y', (), '', True, 'import altair as alt\n'), ((56, 35, 56, 56), 'altair.Legend', 'alt.Legend', (), '', True, 'import altair as alt\n'), ((57, 17, 57, 51), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((57, 53, 57, 92), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((137, 16, 137, 47), 'streamlit.write', 'st.write', ({(137, 25, 137, 46): 'f"""{i}. {row[\'name\']}"""'}, {}), '(f"{i}. {row[\'name\']}")', True, 'import streamlit as st\n'), ((159, 17, 159, 53), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((159, 55, 159, 88), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((177, 17, 177, 52), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((177, 54, 177, 94), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((177, 96, 177, 132), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((191, 19, 191, 54), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((191, 56, 191, 96), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((191, 98, 191, 134), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((316, 20, 316, 212), 'pandas.DataFrame.from_dict', 'pd.DataFrame.from_dict', (), '', True, 'import pandas as pd\n'), ((140, 16, 140, 47), 'streamlit.write', 'st.write', ({(140, 25, 140, 46): 'f"""{i}. {row[\'name\']}"""'}, {}), '(f"{i}. {row[\'name\']}")', True, 'import streamlit as st\n'), ((221, 21, 221, 59), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((221, 61, 221, 113), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((221, 115, 221, 151), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((231, 21, 231, 73), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((231, 75, 231, 111), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((248, 21, 248, 60), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((248, 62, 248, 99), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((248, 101, 248, 137), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((248, 139, 248, 177), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((260, 21, 260, 60), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((260, 62, 260, 98), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((260, 100, 260, 138), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((274, 21, 274, 60), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((274, 62, 274, 98), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((274, 100, 274, 137), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((274, 139, 274, 177), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((285, 21, 285, 60), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((285, 62, 285, 98), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((285, 100, 285, 138), 'altair.Tooltip', 'alt.Tooltip', (), '', True, 'import altair as alt\n'), ((217, 23, 217, 36), 'altair.Chart', 'alt.Chart', ({(217, 33, 217, 35): 'df'}, {}), '(df)', True, 'import altair as alt\n'), ((244, 19, 244, 44), 'altair.Chart', 'alt.Chart', ({(244, 29, 244, 43): 'newcomer_daten'}, {}), '(newcomer_daten)', True, 'import altair as alt\n'), ((270, 18, 270, 38), 'altair.Chart', 'alt.Chart', ({(270, 28, 270, 37): 'top_daten'}, {}), '(top_daten)', True, 'import altair as alt\n'), ((320, 19, 320, 39), 'altair.Chart', 'alt.Chart', ({(320, 29, 320, 38): 'entity_df'}, {}), '(entity_df)', True, 'import altair as alt\n')]