Dashboards – chatgpz.de – KI-Tools & Praxiswissen http://chatgpz.de Unabhängige Tests, Anleitungen und Hintergründe zu KI-Tools. Sat, 28 Feb 2026 20:04:02 +0000 de-DE hourly 1 https://wordpress.org/?v=6.4.2 234900186 Die Zukunft der Daten-Storytelling-Formate: Jenseits von Dashboards http://chatgpz.de/data-analytics/die-zukunft-der-daten-storytelling-formate-jenseits-von-dashboards/ http://chatgpz.de/data-analytics/die-zukunft-der-daten-storytelling-formate-jenseits-von-dashboards/#respond Sat, 28 Feb 2026 20:04:01 +0000 https://chatgpz.de/data-analytics/die-zukunft-der-daten-storytelling-formate-jenseits-von-dashboards/ [ad_1]

Daten-Storytelling-Formate
Bild vom Autor

# Einführung

Historisch gesehen waren Dashboards der Kern von Datenvisualisierungen. Dies machte Sinn, da sie skalierbar waren: ein zentraler Bereich zur Verfolgung von Key Efficiency Indicators (KPIs), Segmentfiltern und Exportdiagrammen.

Wenn das Ziel jedoch darin besteht, zu erklären, was sich geändert hat, warum es wichtig ist und was als nächstes zu tun ist, wird ein Widget-Raster oft zu einem „Finde-it-out“-Erlebnis.

Heutzutage erwarten die meisten Zuschauer Geschichten statt statischer Bildschirme. In Zeiten geringer Aufmerksamkeitsspanne ist es wichtig, die Aufmerksamkeit der Menschen zu gewinnen. Sie wollen den Einblick, aber auch den Kontext, den Aufbau und die Fähigkeit, etwas zu erkunden, ohne sich zu verlaufen.

Aus diesem Grund geht das Information Storytelling über einfache Dashboards hinaus. Wir sind in eine neue Ära der Erfahrungen eingetreten, die geführt (interaktive Erzählungen), räumlich (Augmented Actuality (AR) / Digital Actuality (VR)-Visualisierungen), multisensorisch (Sonifizierung von Daten) und tiefgreifend explorativ (immersive Analysen) sind.

Daten-Storytelling-Formate
Bild vom Autor

# Warum Dashboards an ihre Grenzen stoßen

Dashboards sind sehr nützlich, wenn wir Metriken und KPIs überwachen möchten, aber sie haben Schwierigkeiten mit interaktiver Erkundung und echtem Storytelling. Zu den häufigen Einschränkungen gehören:

  • Sie verlieren den Kontext. Ein Diagramm zeigt möglicherweise, dass etwas gestiegen oder gefallen ist, aber nicht, warum.
  • Sie überwältigen. Zu viele visuelle Elemente an einem Ort führen zu einer kognitiven Überlastung.
  • Sie sind passiv. Benutzer schauen, interagieren aber nicht viel mit den Daten.

Das heutige Publikum will mehr als das. Sie wollen nicht nur Zahlen auf einem Bildschirm sehen.

Wenn Sie üben möchten, Rohdatensätze in echte Geschäftserzählungen umzuwandeln – nicht nur in Diagramme – Plattformen wie StrataScratch sind eine großartige Möglichkeit, diese Instinct für das Geschichtenerzählen durch reale SQL- und Analyseprobleme zu entwickeln.

Sie suchen nach Geschichten, komplett mit Kontext, Fluss, Interaktion und sogar ein wenig Drama.

Lassen Sie uns vier spannende Richtungen erkunden, in die sich das Information Storytelling entwickelt.

# Interaktive Erzählungen: Daten wie eine Geschichte entfalten lassen

Stellen Sie sich vor, Ihre Diagramme würden eine Geschichte Kapitel für Kapitel erzählen. Das ist die Magie interaktiver Erzählungen. Sie verbinden die Struktur des Geschichtenerzählens mit der Freiheit des Erkundens.

// Wie interaktive Geschichten tatsächlich funktionieren (Schriftrollen, Schritte und Szenen)

Ein verbreitetes und interessantes Muster heutzutage ist Scrollytelling, das Scrollen und Geschichtenerzählen kombiniert. Hierbei handelt es sich um eine On-line-Storytelling-Technik, bei der Inhalte angezeigt werden, wenn der Benutzer auf der Seite nach unten scrollt. Es spiegelt das Verhalten wider, an das Benutzer heute gewöhnt sind, wenn sie durch ihre bevorzugten Social-Media-Web sites scrollen.

Ein weiteres häufiges Muster ist eine Stepper-Story, die wir hier genauer untersuchen werden. Der Benutzer klickt von Schritt zu Schritt, um zu sehen, wie sich die Geschichte entwickelt. Ein Beispiel für eine Stepper-Geschichte könnte so aussehen:

  • Schritt 1 erklärt, was passiert (z. B. Übersichtstrend)
  • Schritt 2 hebt einen Änderungspunkt hervor (kann eine einfache Anmerkung sein)
  • Schritt 3 vergleicht Segmente (Filter oder kleine Vielfache)
  • Schritt 4 schlägt eine Aktion vor (was als nächstes untersucht werden soll)

Daten-Storytelling-Formate

// Stepper-Beispiel mit Plotly

In diesem Beispiel wird ein kleiner Datensatz erstellt und mithilfe von Schaltflächen in eine Erzählung umgewandelt, wobei jede Schaltfläche ein anderes „Kapitel“ der Geschichte enthüllt.

import pandas as pd
import numpy as np
import plotly.graph_objects as go

# Pattern information: weekly signups with a marketing campaign launch at week 7
np.random.seed(7)
weeks = np.arange(1, 13)
signups = np.array((120, 130, 125, 140, 150, 148, 210, 230, 225, 240, 255, 260))
baseline = np.array((120, 128, 126, 135, 142, 145, 150, 152, 155, 158, 160, 162))

df = pd.DataFrame({"week": weeks, "signups": signups, "baseline": baseline})

Schauen wir uns zunächst die synthetischen Daten an:

Daten-Storytelling-Formate

Jetzt erstellen wir die interaktiven Plots:

fig = go.Determine()

# Hint 0: precise signups
fig.add_trace(go.Scatter(
    x=df("week"), y=df("signups"), mode="traces+markers",
    title="Signups", line=dict(width=3)
))

# Hint 1: baseline (hidden initially)
fig.add_trace(go.Scatter(
    x=df("week"), y=df("baseline"), mode="traces",
    title="Baseline (no marketing campaign)", line=dict(sprint="sprint"),
    seen=False
))

# Narrative steps utilizing buttons
fig.update_layout(
    title="Interactive Narrative: What modified after the marketing campaign?",
    xaxis_title="Week",
    yaxis_title="Signups",
    updatemenus=(dict(
        kind="buttons",
        path="proper",
        x=0.0, y=1.15,
        buttons=(
            dict(
                label="1) Overview",
                technique="replace",
                args=({"seen": (True, False)},
                      {"annotations": ()})
            ),
            dict(
                label="2) Spotlight change",
                technique="replace",
                args=({"seen": (True, False)},
                      {"annotations": (dict(
                          x=7, y=df.loc(df("week")==7, "signups").iloc(0),
                          textual content="Marketing campaign launch", showarrow=True, arrowhead=2
                      ))})
            ),
            dict(
                label="3) Evaluate to baseline",
                technique="replace",
                args=({"seen": (True, True)},
                      {"annotations": (dict(
                          x=7, y=df.loc(df("week")==7, "signups").iloc(0),
                          textual content="Uplift vs baseline begins right here", showarrow=True, arrowhead=2
                      ))})
            ),
        )
    ))
)

fig.present()

Ausgabe:

Daten-Storytelling-Formate

Wir können sehen, dass interaktive Schaltflächen ein Diagramm in eine geführte Geschichte verwandeln. Es liegt auf der Hand, warum diese Artwork der Visualisierung die Aufmerksamkeit der Öffentlichkeit fesselt.

Diese Artwork von Diagramm eignet sich intestine für die Produkteinführung, vierteljährliche Berichte, Anlegeraktualisierungen und andere Fälle, in denen Sie das Publikum anleiten möchten. Kurz gesagt, es ist eine nützliche Technik, wenn Sie möchten, dass die Leute Schritt für Schritt den Hauptpunkt verstehen.

# AR- und VR-Visualisierungen: Verwandeln Sie Daten in einen Raum, den Sie erkunden können

AR fügt Daten zur realen Welt hinzu. Beispielsweise kann man Zahlen oder Diagramme auf realen Maschinen oder Gebäuden sehen.

VR versetzt Sie in eine vollständig digitale Welt. Sie können sich bewegen und die Daten als virtuellen Raum erkunden.

Beide Arten von Visualisierungen nutzen den 3D-Raum, um Daten als Umgebung darzustellen. Es geht nicht nur darum, cool auszusehen, sondern auch darum, Zusammenhänge wie Entfernung, Größe und Gruppen leichter verständlich zu machen.

// Wo AR/VR nützlich sind

  • Wenn wir darauf abzielen, Informationen direkt auf physischer {Hardware} anzuzeigen.
  • Wenn wir herumlaufen und sehen wollen, wie Gebäude oder Städte in verschiedenen Situationen aussehen könnten.
  • Wenn wir Simulationen, den Weltraum oder mikroskopische Welten in drei Dimensionen untersuchen wollen.
  • Wenn Einzelpersonen Transformationen steuern möchten, testen Sie Konzepte und bewerten Sie die Ergebnisse, bevor Sie sich auf reale Maßnahmen festlegen.

Daten-Storytelling-Formate
Bild vom Autor

// Ein VR-fähiges 3D-Balkendiagramm

Hier verwenden wir A-Rahmen Und WebXR um ein kleines 3D-Balkendiagramm zu erstellen, das im Browser ausgeführt wird. Jeder Balken entspricht einer Kategorie und höhere Balken bedeuten höhere Werte.

Die Szene läuft auf einem normalen Desktop-Browser oder in einem VR-Headset, das WebXR unterstützt. Es ist keine komplexe Einrichtung erforderlich.

Daten-Storytelling-Formate

Die Ausgabe im Browser sieht folgendermaßen aus:

Daten-Storytelling-Formate

So führen Sie dieses Beispiel lokal aus:

  1. Speichern Sie die Datei unter vr-bars.html
  2. Öffnen Sie ein Terminal im selben Ordner
  3. Starten Sie einen einfachen lokalen Server mit Python: python -m http.server 8000
  4. Öffnen Sie Ihren Browser und gehen Sie zu: http://localhost:8000/vr-bars.html

Es ist besser, die Datei über einen lokalen Server zu öffnen, da einige Browser die WebXR-Funktionen einschränken, wenn sie versuchen, rohe HTML-Dateien direkt zu öffnen.

# Sonifikation: Wenn Daten zu Klang werden

Sonifikation bedeutet, Daten in Klang umzuwandeln. Die Zahlen können zu hohen oder tiefen Tönen, zu lauten oder leisen Tönen oder sogar zu kurzen und langen Tönen werden.

Man könnte meinen, dass dies nichts zur Dynamik unserer Datenvisualisierung beiträgt. Allerdings kann uns Ton dabei helfen, Muster, Veränderungen oder Probleme zu erkennen, insbesondere wenn sich die Daten im Laufe der Zeit ändern.

// Die besten Anwendungsfälle für fundierte Dateneinblicke

  • Überwachungssysteme (seltsame oder ungewöhnliche Geräusche sind leicht zu bemerken)
  • Zugänglichkeit (Sound hilft Menschen, die sich nicht nur auf Diagramme oder Bilder verlassen können)
  • Dichte Zeitreihen (Rhythmen machen Muster und plötzliche Spitzen leichter hörbar)

Daten-Storytelling-Formate
Bild vom Autor

// Eine Zeitreihe in Töne umwandeln

Hier wird jeder Wert in eine musikalische Tonhöhe umgewandelt. Die Noten sind einfache Sinustöne mit kleinen Lücken dazwischen, um die Sequenz klarer zu machen.

Diese Model ist für ein Jupyter-Pocket book (oder JupyterLab / Google Colab). Es nutzt IPython.show.Audio um den Ton direkt in der Ausgabezelle abzuspielen, sodass keine System-Audiobibliotheken installiert werden müssen.

import numpy as np
from IPython.show import Audio, show

# Instance: day by day web site visits (small time sequence)
visits = np.array((120, 118, 121, 130, 160, 155, 140, 138, 200, 180))

min_f, max_f = 220, 880  # A3 to A5
v_min, v_max = visits.min(), visits.max()

def scale_to_freq(v):
    if v_max == v_min:
        return (min_f + max_f) / 2
    return min_f + (v - v_min) * (max_f - min_f) / (v_max - v_min)

sample_rate = 44100
note_dur = 0.18  # seconds per word
hole = 0.03       # silence between notes

audio_all = ()

for v in visits:
    freq = scale_to_freq(v)
    t = np.linspace(0, note_dur, int(sample_rate * note_dur), endpoint=False)
    tone = np.sin(2 * np.pi * freq * t)

    # Fade out to scale back clicks
    fade = np.linspace(1, 0, len(tone))
    tone = 0.3 * tone * fade

    audio_all.append(tone)
    audio_all.append(np.zeros(int(sample_rate * hole)))

audio = np.concatenate(audio_all)

show(Audio(audio, price=sample_rate))

Sie können die Ausgabe hören Hier.

Klicken Sie auf „Play“, um es anzuhören. Wenn die Anzahl der Besuche höher ist, ist auch der Ton höher, sodass Spitzen deutlich zu hören sind.

Um eine Storytelling-Atmosphäre zu schaffen, fügen Sie ein kleines Liniendiagramm hinzu und heben Sie wichtige Momente wie Spitzen, Rückgänge und Trendbrüche hervor. Eine nützliche Ergänzung besteht darin, den Ton abzuspielen und gleichzeitig die Linie im Zeitverlauf sichtbar zu machen, sodass die Leser die Verschiebung sowohl sehen als auch hören können.

# Immersive Analytics: Daten erkunden, indem man sie durchsucht

Bei immersiver Analyse untersuchen wir Daten auf eine Artwork und Weise, bei der wir Dinge eher bewegen und berühren als nur auf Schaltflächen oder Filter zu klicken.

Die Immersivität kommt von:

  • Daten werden in 3D angezeigt oder im Weltraum angezeigt, wenn dies das Verständnis erleichtert
  • Die Möglichkeit, Schieberegler zu verschieben, Teile der Daten auszuwählen und die Ansicht zu ändern, wobei die Daten sofort aktualisiert werden
  • Änderungen in einem Diagramm führen dazu, dass auch andere Diagramme aktualisiert werden

// Interaktive 3D-Erkundung

Dieses Beispiel verwendet Plotly Um ein 3D-Diagramm anzuzeigen, können wir es drehen und filtern. Es handelt sich nicht um ein Customary-Dashboard. Es ist ein Werkzeug zum Erkunden und Interagieren mit Daten.

Führen Sie dies in einem Jupyter-Pocket book aus:

import numpy as np
import pandas as pd
import plotly.categorical as px
import ipywidgets as widgets
from IPython.show import show

# Artificial multi-dimensional information
np.random.seed(42)
n = 800
df = pd.DataFrame({
    "x": np.random.regular(0, 1, n),
    "y": np.random.regular(0, 1, n),
    "z": np.random.regular(0, 1, n),
})
df("rating") = (df("x")**2 + df("y")**2 + df("z")**2)

slider = widgets.FloatSlider(
    worth=float(df("rating").quantile(0.90)),
    min=float(df("rating").min()),
    max=float(df("rating").max()),
    step=0.05,
    description="Rating ≤",
    readout_format=".2f",
    continuous_update=False
)

out = widgets.Output()

def render(threshold):
    filtered = df(df("rating") <= threshold).copy()
    fig = px.scatter_3d(
        filtered, x="x", y="y", z="z", coloration="rating",
        title="Immersive analytics (lite): rotate + filter a 3D area",
        opacity=0.75
    )
    fig.update_traces(marker=dict(measurement=3))
    fig.present()

def on_change(change):
    if change("title") == "worth":
        with out:
            out.clear_output(wait=True)
            render(change("new"))

slider.observe(on_change)

show(slider, out)
render(slider.worth)

Hier ist die Ausgabe:

Daten-Storytelling-Formate

Um dies zu verbessern, können Sie Benutzern erlauben, Punkte auszuwählen, die ausgewählten Zeilen in einer Tabelle anzuzeigen oder Linien um Cluster zu zeichnen. Es funktioniert intestine, wenn Sie die Erkundung während eines Conferences leiten. Sie können beispielsweise mit einem Schritt-für-Schritt-Anleitungspfad beginnen und die Öffentlichkeit dann auf eigene Faust erkunden lassen.

# Abschluss

Die Zukunft des Information Storytelling wird nicht darin bestehen, Dashboards vollständig zu entfernen; Stattdessen werden wir eine Tendenz zu interaktiveren und immersiveren Geschichten über Daten, Modelle und Erkenntnisse beobachten.

Daten-Storytelling-Formate
Bild vom Autor

Kurz gesagt, so können Sie die beste Artwork der Datenvisualisierung auswählen:

  • Möchten Sie jemanden anleiten? Versuchen Sie es mit einer interaktiven Erzählung.
  • Müssen Sie räumliche Zusammenhänge darstellen? AR/VR kann helfen.
  • Möchten Sie mehr Sinne erreichen? Lassen Sie Ihre Daten sprechen.
  • Möchten Sie zur Erkundung einladen? Erstellen Sie einen immersiven Spielplatz.

Das Beste daran ist, dass Sie kein großes Price range oder Staff benötigen, um dies auszuprobieren.

Wählen Sie eine Technik aus und erstellen Sie einen kleinen Prototyp. Ein kleiner Stepper oder ein 3D-Balken, ein sonifiziertes Liniendiagramm oder ein schiebereglerbasierter Filter. Sie werden erstaunt sein, wie schnell sich Ihre Daten wie eine Geschichte anfühlen.

Nate Rosidi ist Datenwissenschaftler und in der Produktstrategie tätig. Er ist außerdem außerordentlicher Professor für Analytik und Gründer von StrataScratch, einer Plattform, die Datenwissenschaftlern hilft, sich mit echten Interviewfragen von High-Unternehmen auf ihre Interviews vorzubereiten. Nate schreibt über die neuesten Tendencies auf dem Karrieremarkt, gibt Ratschläge zu Vorstellungsgesprächen, stellt Information-Science-Projekte vor und behandelt alles rund um SQL.



[ad_2]

]]>
http://chatgpz.de/data-analytics/die-zukunft-der-daten-storytelling-formate-jenseits-von-dashboards/feed/ 0 16687
Was ich beim Erstellen meines ersten Dashboards über Knowledge Storytelling gelernt habe http://chatgpz.de/machine-learning/was-ich-beim-erstellen-meines-ersten-dashboards-ueber-knowledge-storytelling-gelernt-habe/ http://chatgpz.de/machine-learning/was-ich-beim-erstellen-meines-ersten-dashboards-ueber-knowledge-storytelling-gelernt-habe/#respond Wed, 05 Nov 2025 13:29:03 +0000 https://chatgpz.de/machine-learning/was-ich-beim-erstellen-meines-ersten-dashboards-ueber-data-storytelling-gelernt-habe/ [ad_1]

Das sah oberflächlich betrachtet großartig aus, struggle es aber nicht wirklich sagen irgendetwas?

Als ich an einem Samstagnachmittag zum ersten Mal versuchte, meinen Datensatz zu verstehen, schien mir die Erstellung eines Dashboards der nächste vernünftige Schritt auf meiner datenwissenschaftlichen Reise zu sein.

Ich habe mir genug YouTube-Tutorials angesehen, um zu glauben, ich wüsste, wie ein „gutes“ Tutorial aussehen sollte, wahrscheinlich etwas mit einem klaren Format und vielleicht ein paar Filtern am Rande.

Bei all dem bin ich direkt reingesprungen.

Ich erstellte eine Struktur, wie ich sie haben wollte, und legte die Komponenten für mein Armaturenbrett an, aber als ich schließlich alles zusammenfügte, fühlte sich etwas nicht richtig an.

Ich trat einen Schritt zurück, um es mir im wahrsten Sinne des Wortes anzusehen. Ich ging durch den Raum und betrachtete ihn aus verschiedenen Blickwinkeln. Das machen wir doch alle, oder?

Nach ein paar langen Blicken konnte ich nicht erklären, welche Geschichte das Dashboard eigentlich erzählte.

Und verstehen Sie mich nicht falsch, für den ersten Versuch struggle es ziemlich anständig. Aber als ich es betrachtete, kam es mir so vor, als würde ich einer Gruppe von Menschen dabei zusehen, wie sie übereinander redeten.

Ich hatte verschiedene Diagrammtypen eingefügt – Balkendiagramme neben Kreisdiagrammen neben Liniendiagrammen –, die alle auf einem Bildschirm um Aufmerksamkeit kämpften. Jedes Diagramm hatte etwas Interessantes zu sagen, aber nicht auf eine Weise, die zu einem klaren Punkt führte.

Später am Abend wurde mir flau im Magen, als ich dasaß und auf meinen Bildschirm starrte, dessen blauer Schein sich in meiner Kaffeetasse spiegelte. Wenn mein eigenes Dashboard keine Verbindung zu mir herstellen könnte, wie könnte ich dann erwarten, dass es sich mit jemand anderem verbindet?

Ich begann zu lesen, warum manche Dashboards keine Verbindung zu Menschen herstellen. Ich bin zufällig auf eins gestoßen Artikel im Harvard Enterprise Evaluate Das erklärt, wie viele Dashboards keine echten Entscheidungen ermöglichen, weil sich die meisten Analysten zu sehr auf das Aussehen und nicht auf die Klarheit konzentrieren.

Es wurde etwas von „Chart-Müll“ erwähnt, lediglich dekorative Elemente, die keine Bedeutung hinzufügen.

Das hat mich getroffen. Autsch.

Schauen Sie, beim Knowledge Storytelling geht es nicht nur darum, Erkenntnisse zu erklären. Vielmehr geht es darum Helfen Sie den Menschen, zu sehen, was Sie gesehen haben in Ihre Analyse einbeziehen und diese auf eine für sie sinnvolle Weise erklären.

In diesem Artikel geht es nicht um die technische Seite der Dashboard-Erstellung; Es gibt bereits unzählige Tutorials, die dir das beibringen können.

Es geht vielmehr um die Teile, die wir oft übersehen: wie Dashboards Bedeutung und Absicht kommunizieren. Ich werde auch die Fehler und Lehren teilen, die die Artwork und Weise verändert haben, wie ich Daten sehe, nachdem ich mein erstes Dashboard erstellt habe.


Warum mein Dashboard richtig aussah, sich aber falsch anfühlte

Ich brauchte ein wenig Demut, um zuzugeben, dass das Downside nicht das Design struggle.

Ich struggle es.

Ich habe versucht, eine Geschichte zu erzählen, die ich noch nicht wirklich entdeckt hatte.

Mir wurde langsam klar, dass Daten nicht wirklich die Geschichte selbst sind; Stattdessen ist es so etwas wie die Sprache, die wir verwenden, um es einem zu sagen. Und wie bei jeder Sprache ergibt sich die Bedeutung aus der Artwork und Weise, wie wir sie arrangieren.

Da wurde mir klar, dass ich innehalten musste, bevor ich etwas baute, und mir zunächst ein paar wichtige Fragen stellen musste. Ich nenne sie die drei Ws:

  • Warum sind diese Daten wichtig?
  • Für wen entwerfe ich?
  • Welche Frage versuche ich wirklich zu beantworten?

Diese einfachen Fragen haben alles verändert. Meine Dashboards waren nicht mehr nur visuelle Elemente, sondern fühlten sich eher wie echte Gespräche an.

Es dauerte eine Weile, bis mir klar wurde, dass das Downside nicht am Instrument oder gar am Datensatz lag.

Es struggle die Artwork und Weise, wie ich an die Geschichte herangegangen bin.

Ich hatte so viel Zeit damit verbracht, das Dashboard richtig aussehen zu lassen, dass ich nie nachgefragt habe, was es eigentlich sagt. Es struggle wie dieser Second in „Matrix“, als Neo endlich den Code sieht. Als mir dieser Gedanke in den Sinn kam, wusste ich, dass ich von vorne beginnen musste.

(Wenn Sie tiefer in die Designprinzipien von Dashboards eintauchen möchten, diesen Leitfaden ist solide.)

Wieder bauen, aber anders

Als ich zum Projekt zurückkam, beschloss ich, noch einmal von vorne anzufangen. Aber dieses Mal habe ich es noch nicht eilig, mein Visualisierungstool zu öffnen. Was sich ehrlich gesagt seltsam anfühlte. Es juckte mich in den Fingern, etwas anzuklicken.

Ich saß eine Weile mit den Daten da und versuchte zu verstehen, was sie wirklich aussagten und wie ich diese Geschichte in interaktive visuelle Darstellungen umwandeln könnte.

Etwas an der Entschleunigung fühlte sich richtig an. Mir fielen Dinge auf, die ich vorher nicht gesehen hatte, vor allem kleine Particulars, die scheinbar keine Rolle spielten, es aber tatsächlich waren.

Anstatt zu versuchen, alles zu zeigen, habe ich beschlossen, mich auf eine Idee zu konzentrieren und darauf aufzubauen. Ich hatte zum Beispiel all diese Verkaufskennzahlen vor mir, aber eine Frage fiel mir besonders auf:

Warum gingen die monatlichen Verkäufe zurück, obwohl die Kundenanmeldungen zunahmen?

Das hat alles verändert. Plötzlich kämpften meine Bilder nicht mehr um Aufmerksamkeit. Stattdessen arbeiteten sie zusammen, um dieselbe Geschichte zu erzählen.

Je weniger ich hinzufügte, desto klarer wurde alles. Ich habe ein paar unnötige Diagramme entfernt und kurze Notizen hinzugefügt, um zu erklären, was bestimmte Zahlen bedeuten.

Ich habe eine einfache Anmerkung mit der Aufschrift „Abgabepunkt“ und einem Pfeil hinzugefügt, der auf die Stelle zeigt, an der die Dinge zu sinken begannen. Kein ausgefallenes Design, nur Klarheit. Es struggle nicht perfekt, aber es fühlte sich viel absichtlicher an.

Ich habe drei Tage damit verbracht, die erste Model zu erstellen. Der Zweite? Sechs Stunden.

Sechs.

Nicht weil ich mich beeilte, sondern weil ich endlich wusste, worauf es ankam.

Als ich es teilte, nickten die Leute nicht nur höflich. Sie beugten sich näher, stellten nachdenkliche Fragen und versuchten auch zu erraten, was die Tendencies antreiben könnte. Eine Particular person zückte sogar ihr Useful, um ein Foto davon zu machen.

Es fühlte sich anders an, auf eine gute Artwork und Weise. Ich werde nicht lügen, ich struggle ziemlich stolz.

Rückblickend hat dieser Second die Artwork und Weise verändert, wie ich später an Projekte herangegangen bin. Ich fing an, Dashboards weniger als etwas zu sehen, das man anzeigen konnte, sondern mehr als eine Möglichkeit, das, was ich sah, zu übersetzen und anderen zu helfen, es zu verstehen.

Manchmal ertappe ich mich immer noch dabei, dass ich mich frage, ob ich es richtig mache, aber vielleicht ist das der Punkt. Vielleicht geht es beim Geschichtenerzählen mit Daten nicht darum, alles perfekt zu machen.

Vielleicht geht es darum, lange genug innezuhalten und zu fragen: Welche Geschichte versuche ich hier wirklich zu erzählen?

Was ich meinem früheren Ich erzählen würde

Wenn ich zu diesem ersten Versuch zurückkehren könnte, würde ich mir Folgendes sagen:

Beginnen Sie mit Stift und Papier, bevor Sie das Werkzeug öffnen. Skizzieren Sie zunächst die Geschichte. Was ist der Anfang, die Mitte und das Ende? Dafür benötigen Sie keine Software program.

Löschen Sie ein Diagramm für jeweils zwei hinzugefügte Diagramme. Wenn es Ihren Hauptpunkt nicht direkt unterstützt, ist es nur eine Ablenkung. Seien Sie rücksichtslos mit dem, was Sie investieren.

Lesen Sie Ihr Dashboard laut vor. Wenn Sie es nicht in einem Atemzug erklären können, vereinfachen Sie es. Ihr Publikum wird nicht mehr Geduld haben als Sie.

Diese einfachen Regeln haben mir unzählige Stunden erspart und mich davon abgehalten, noch überladenere Dashboards zu erstellen, die überfüllt aussehen, aber nichts sagen.

Ich glaube, dass jeder Datensatz eine Stimme hat, aber es erfordert Geduld, genau genug hinzuhören, um zu verstehen, was er wirklich sagt. Und glauben Sie mir, sobald Sie dies tun, stimmt alles, von der visuellen Darstellung bis hin zu den Erkenntnissen, mit dem Zweck überein.


Fazit und Erkenntnisse

Als ich anfing, wollte ich beweisen, dass ich etwas Großartiges bauen kann. Aber am Ende? Es stellt sich heraus, dass die besten Dashboards nicht die auffälligsten sind. Sie sind es, die die Leute dazu bringen, innezuhalten und zu sagen: „Oh, jetzt verstehe ich es.“

Dieses Projekt hat mir etwas beigebracht, was ich nicht erwartet hatte: Beim Knowledge Storytelling geht es weniger um die Daten als vielmehr um Empathie.

Es gab dieses befriedigende Klicken, als endlich alles einen Sinn ergab – nicht nur für mich, sondern für alle, die es betrachteten. Dieses Gefühl der Verbundenheit und des Verständnisses hat den ganzen Umbau gelohnt.

Wenn ich jetzt einen neuen Datensatz öffne, erinnere ich mich an diese Lektion: Fangen Sie langsam an, hören Sie genau zu und bauen Sie mit Absicht auf. Manchmal vermassele ich es immer noch. Aber zumindest weiß ich jetzt, was ich anstrebe.

Das Ziel besteht nicht darin, zu beeindrucken, sondern darin, Kontakte zu knüpfen.

[ad_2]

]]>
http://chatgpz.de/machine-learning/was-ich-beim-erstellen-meines-ersten-dashboards-ueber-knowledge-storytelling-gelernt-habe/feed/ 0 13730
5 Tipps zum Erstellen nützlicher stromanischer Dashboards in Minuten http://chatgpz.de/data-science/5-tipps-zum-erstellen-nuetzlicher-stromanischer-dashboards-in-minuten/ http://chatgpz.de/data-science/5-tipps-zum-erstellen-nuetzlicher-stromanischer-dashboards-in-minuten/#respond Thu, 18 Sep 2025 22:07:01 +0000 https://chatgpz.de/data-science/5-tipps-zum-erstellen-nuetzlicher-stromanischer-dashboards-in-minuten/ [ad_1]

5 Tipps zum Erstellen nützlicher stromanischer Dashboards in Minuten5 Tipps zum Erstellen nützlicher stromanischer Dashboards in Minuten
Bild von Editor | Chatgpt

# Einführung

Straffung ist ein Python-Framework zum Erstellen benutzerfreundlicher Webanwendungen mit minimalem Code. Es richtet sich hauptsächlich an Datenfachleute und Entwickler und wird häufig für die Datenerforschung, das Erstellen von Dashboards und die Prototyping -ML -Anwendungen verwendet. Das Framework bietet einfache APIs auf hoher Ebene, die einfach zu bedienen sind und viele integrierte Funktionen für die Entwicklung nützlicher Dashboards enthalten. Viele kennen jedoch immer noch die Grundlagen und nutzen Stromplätze nicht vollständig.

Aus diesem Grund wird in diesem Artikel fünf verschiedene Tipps untersucht, mit denen Sie in Minuten nützliche stromlitische Dashboards erstellen können.

# 1. Verwenden Sie Caching

Streamlit ist ein Framework, das unsere Skripte von Anfang an nativ ausführt, wenn wir eine Änderung der Eingabe haben. Dies bedeutet, dass die Berechnung teuer ist, wenn wir unnötigerweise Vorgänge wie Daten oder Modellbelastung wiederholen.

Durch die Verwendung von Caching werden wir die Betriebszeit und den Rechenspeicher erheblich verringern, da wir dasselbe Objekt wiederverwenden können. Beispielsweise ist die Code -Implementierung wie unten:

@st.cache_data
def load_data():
    return pd.read_csv("large_dataset.csv")

@st.cache_resource
def load_model():
    from sklearn.ensemble import RandomForestClassifier
    return RandomForestClassifier()

Der st.cache_data eignet sich am besten für Datenoperationen wie CSV -Lasten st.cache_resource eignet sich am besten für anhaltende Ressourcen wie ML -Modelle oder DB -Verbindungen.

Durch die effektive Verwendung von Caching können wir unseren Dashboard -Prozess auch bei großen Datensätzen oder Modellen schneller machen.

# 2. Batch -Eingänge

Wie bereits erwähnt, verarbeitet Streamlit das Skript von Anfang an, wenn wir eine Änderung unserer Eingabe haben. Es gibt viele Fälle, in denen wir viele Eingabe -Workflows haben, die bei jeder einzelnen Eingabe Änderungen haben.

Durch Verwendung st.typeWir können Widgets und die Vorgänge gruppieren, damit er nur aktualisiert wird, wenn der Benutzer auf eine Schaltfläche Senden klickt. Die Implementierung des Beispielcodes ist unten angezeigt:

with st.type("filters"):
    min_value = st.slider("Minimal Worth", 0, 100, 10)
    max_value = st.slider("Most Worth", 0, 100, 90)
    submitted = st.form_submit_button("Apply")

if submitted:
    st.write(f"Filtering information between {min_value} and {max_value}")

Der obige Code vermeidet im Wesentlichen eine unnötige Neukomputation und gibt den Benutzern die Steuerung, wenn das Dashboard aktualisiert wird, insbesondere mit der Fähigkeit zum Eingabestand.

# 3. Persistierstaat

Es gibt auch Zeiten, in denen wir den Standing beibehalten möchten, wenn Eingabedändere wie die Zähler, Filtervariablen oder Authentifizierungsflags vorliegen. Es könnte zu viel sein, das Caching zu verwenden, weshalb wir die persistierte Zustandsmethode mit verwenden können st.session_state.

Wir können Variablen über Wiederholungen hinweg bestehen und sie sogar interaktiv mit dem aktualisieren st.session_statewas den gesamten Workflow reibungsloser und effizienter macht. Die Beispielcode -Implementierung ist unten angezeigt:

if "counter" not in st.session_state:
    st.session_state.counter = 0

if st.button("Increment"):
    st.session_state.counter += 1

st.write(f"Counter: {st.session_state.counter}")

Der obige Code initiiert eine Variable im St.Session_State, sodass er über Wiederholungen hinweg bestehen bleibt. Es hilft uns im Grunde, einen viel besseren Workflow zu haben.

# 4. Spotlight Key Metrics Spotlight

Wenn wir ein Dashboard verwenden, ist es wichtig, zu zeigen, was am wichtigsten ist. Für viele Geschäftsanwender und nichttechnische Benutzer möchten sie die wichtigen Zahlen im Voraus sehen und Particulars nur dann unterstützen, wenn sie sich weiterentwickeln.

Durch Verwendung der st.metricWir könnten Schlüsselleistungsindikatoren (KPIs) als saubere Karten anzeigen. Die Funktion macht das Dashboard nützlich, um KPIs wie Benutzerwachstum, Umsatz, Fehlerraten und vieles mehr anzuzeigen. Die Code -Implementierung ist unten angezeigt:

st.metric("Energetic Customers", 1234, "+134")

Der obige Code zeigt eine KPI -Karte für „aktive Benutzer“ mit einem positiven Delta von +134. Auf diese Weise können wir unser Dashboard mit einer einzigen Codezeile nützlich machen.

# 5. Nutzen Sie Group -Komponenten

Die Kernbibliothek von Streamlit deckt die meisten Anwendungsfälle ab, aber manchmal benötigen Sie eine fortgeschrittenere Interaktivität als verfügbar. Das ist wo Group -Komponenten Kommen

Es gibt viele nützliche Funktionen, wie z. B. bearbeitbare Tabellen (streamlit-aggrid), interaktive Karten (streamlit-folium), Chat -UIS (streamlit-chat) und viele andere. Dies bedeutet, dass Sie die Funktionalität Ihres Dashboards leicht aktualisieren können.

Besuchen Sie die Group -Komponenten, die für Ihre Arbeit nützlich sind.

# Einpacken

Streamlit ist ein Python -Framework, das für den Aufbau von Webanwendungen nützlich ist, insbesondere für Entwickler und Datenfachleute. Es ist einfach zu bedienen, aber es gibt immer noch viele Möglichkeiten, unsere Erfahrungen zu verbessern, um bessere Dashboards zu erstellen.

In diesem Artikel haben wir fünf verschiedene Möglichkeiten untersucht, um in wenigen Minuten ein nützliches stromendes Dashboard zu erstellen, von der Verwendung von Caching bis hin zu fortdauerndem Zustand bis zur Nutzung von Group -Komponenten.

Ich hoffe das hat geholfen!

Cornellius Yudha Wijaya ist ein Information Science Assistant Supervisor und Datenautor. Während er in Vollzeit bei Allianz Indonesien arbeitet, liebt er es, Python- und Datentipps über soziale Medien und das Schreiben von Medien zu teilen. Cornellius schreibt über eine Vielzahl von KI- und maschinellen Lernthemen.

[ad_2]

]]>
http://chatgpz.de/data-science/5-tipps-zum-erstellen-nuetzlicher-stromanischer-dashboards-in-minuten/feed/ 0 12500
Erstellen von Slick -Daten -Dashboards mit Python, Taipy & Google Sheets http://chatgpz.de/data-analytics/erstellen-von-slick-daten-dashboards-mit-python-taipy-google-sheets/ http://chatgpz.de/data-analytics/erstellen-von-slick-daten-dashboards-mit-python-taipy-google-sheets/#respond Wed, 03 Sep 2025 01:48:10 +0000 http://chatgpz.de/data-analytics/erstellen-von-slick-daten-dashboards-mit-python-taipy-google-sheets/ [ad_1]

Erstellen von Slick -Daten -Dashboards mit Python, Taipy & Google SheetsErstellen von Slick -Daten -Dashboards mit Python, Taipy & Google Sheets
Bild von Autor | Ideogramm

# Einführung

Daten sind zu einer wichtigen Ressource für jedes Unternehmen geworden, da sie Unternehmen für Unternehmen wertvolle Erkenntnisse erhalten, insbesondere bei Entscheidungen. Ohne Daten stützen sich Entscheidungen ausschließlich auf Instinkt und Glück, was nicht der effektivste Ansatz ist.

Viele Rohdaten sind jedoch schwer zu verstehen. Es bietet keine direkten Einblicke und erfordert eine weitere Verarbeitung. Aus diesem Grund verlassen sich viele Menschen darauf, Daten -Dashboards zu verwenden, um die Rohdaten zusammenzufassen, zu visualisieren und zu navigieren. Durch die Entwicklung eines eleganten Armaturenbretts können wir nicht-technische Benutzer eine einfache Möglichkeit bieten, einfach Einblicke aus Daten zu erhalten.

Aus diesem Grund wird in diesem Artikel untersucht, wie ein schlankes Daten Dashboard erstellt wird PythonAnwesend TaipieUnd Google -Blätter.

Lass uns darauf eingehen.

# Entwicklung eines Slick -Daten -Dashboards

Wir werden das Tutorial beginnen, indem wir alle erforderlichen Anmeldeinformationen für den Zugriff auf Google Sheets über Python vorbereiten. Erstellen Sie zunächst ein Google -Konto und navigieren Sie zur Google Cloud Console. Navigieren Sie dann zu APIS & Companies> Bibliothek, in der Sie die Google Sheets API und die Google Drive -API aktivieren müssen.

Kehren Sie nach der Aktivierung der APIs zu APIs & Dienste> Anmeldeinformationen zurück und navigieren Sie, um Anmeldeinformationen> Servicekonto zu erstellen. Befolgen Sie die Anweisungen und weisen Sie die Rolle wie Herausgeber oder Besitzer zu, damit wir Google Sheets lesen und schreiben können. Wählen Sie das gerade erstellte Servicekonto aus und navigieren Sie dann zu Schlüssel> Style hinzufügen> Neue Style erstellen. Wählen Sie JSON und laden Sie die herunter credentials.json Datei. Speichern Sie es irgendwo und öffnen Sie die Datei; Kopieren Sie dann den E -Mail -Wert unter client_email.

Für den Datensatz werden wir die verwenden Herzdatensatz aus Kaggle als Beispiel. Speichern Sie die Datei in Google Drive und öffnen Sie sie als Google Sheets. Gehen Sie in der Google Sheets -Datei zur Datei> Teilen Sie Freigabe und fügen Sie die gerade kopierte E -Mail hinzu. Kopieren Sie die URL zuletzt für die Google Sheets -Datei, da wir später über die URL auf die Daten zugreifen werden.

Öffnen Sie Ihre Lieblings -IDE und dann werden wir unser Projekt wie folgt strukturieren:

taipy_gsheet/
│
├── config/
│   └── credentials.json         
├── app.py                   
└── necessities.txt

Erstellen Sie alle erforderlichen Dateien und dann werden wir unser Dashboard entwickeln. Wir werden Taipy für das Anwendungsrahmen verwenden. Pandas Für Datenmanipulation, GSPREET Und OAuth2Client für die Interaktion mit der Google Sheets -API und Handlung zum Erstellen von Visualisierungen. Im necessities.txt Datei, fügen Sie die folgenden Pakete hinzu:

taipy
pandas
gspread
oauth2client
plotly

Dies sind die notwendigen Bibliotheken für unser Tutorial, und wir werden sie in unserer Umgebung installieren. Vergessen Sie nicht, eine virtuelle Umgebung zu nutzen, um zu verhindern, dass Sie Ihre Hauptumgebung brechen. Wir werden auch Python 3.12 verwenden; Zum Zeitpunkt, in dem dieser Artikel geschrieben wurde, ist dies die Python -Model, die derzeit für die obigen Bibliotheken funktioniert.

Installieren Sie die Bibliotheken mit dem folgenden Befehl:

pip set up -r necessities.txt

Wenn die Set up erfolgreich ist, werden wir unsere Bewerbung vorbereiten. In app.pyWir erstellen den Code, um unser Dashboard einzurichten.

Zunächst werden wir alle notwendigen Bibliotheken importieren, die wir für die Entwicklung der Anwendung verwenden werden.

import pandas as pd
import gspread
import plotly.specific as px
import taipy as tp
from taipy import Config
from taipy.gui import Gui
import taipy.gui.builder as tgb

Als nächstes laden wir die Daten von Google Sheets mit dem folgenden Code. Ändern die SHEET_URL Wert mit Ihrer tatsächlichen Daten -URL. Darüber hinaus werden wir die Daten vorbereiten, um sicherzustellen, dass sie intestine funktionieren.

SHEET_URL = "https://docs.google.com/spreadsheets/d/1Z4S3hnV3710OJi4yu5IG0ZB5w0q4pmNPKeYy8BTyM8A/"
consumer = gspread.service_account(filename="config/credentials.json")
df_raw = pd.DataFrame(consumer.open_by_url(SHEET_URL).get_worksheet(0).get_all_records())
df_raw("intercourse") = pd.to_numeric(df_raw("intercourse"), errors="coerce").fillna(0).astype(int)
df_raw("sex_label") = df_raw("intercourse").map({0: "Feminine", 1: "Male"})

Dann werden wir das Dashboard mit vorbereiten Taipie. Taipy ist eine Open-Supply-Bibliothek für datengesteuerte Anwendungen, die sowohl Entrance-Finish- als auch Again-Finish-Entwicklung abdeckt. Verwenden wir die Bibliothek, um das Daten Dashboard mit den grundlegenden Funktionen zu erstellen, die wir mit Taipy verwenden können.

In dem folgenden Code entwickeln wir ein Szenario, das eine Pipeline ist, die der Benutzer für die Analyse der Analyse ausführen kann. Es ist im Wesentlichen ein Rahmen für das Experimentieren mit verschiedenen Parametern, die wir an die Pipeline übergeben können. Hier ist beispielsweise, wie wir ein Szenario für das Durchschnittsalter mit der Eingabe des Geschlechtsfilters vorbereiten.

def compute_avg_age(filtered_df: pd.DataFrame, gender_filter: str) -> float:
    information = (
        filtered_df
        if gender_filter == "All"
        else filtered_df(filtered_df("sex_label") == gender_filter)
    )
    return spherical(information("age").imply(), 1) if not information.empty else 0

filtered_df_cfg = Config.configure_data_node("filtered_df")
gender_filter_cfg = Config.configure_data_node("gender_filter")
avg_age_cfg = Config.configure_data_node("avg_age")

task_cfg = Config.configure_task(
    "compute_avg_age", compute_avg_age, (filtered_df_cfg, gender_filter_cfg), avg_age_cfg
)
scenario_cfg = Config.configure_scenario("cardiac_scenario", (task_cfg))
Config.export("config.toml")

Wir werden das Szenario später noch einmal besuchen, aber lassen Sie uns die Auswahl der Geschlechter selbst und seinen Standardzustand vorbereiten.

gender_lov = ("All", "Male", "Feminine")
gender_selected = "All"
filtered_df = df_raw.copy()
pie_fig = px.pie()
box_fig = px.field()
avg_age = 0

Als nächstes erstellen wir die Funktionen, die unsere Variablen und Datenvisualisierungen aktualisieren, wenn ein Benutzer mit dem Dashboard interagiert, z. B. durch Auswahl eines Geschlechts oder ein Senden eines Szenarios.

def update_dash(state):
    subset = (
        df_raw if state.gender_selected == "All"
        else df_raw(df_raw("sex_label") == state.gender_selected)
    )
    state.filtered_df = subset
    state.avg_age = spherical(subset("age").imply(), 1) if not subset.empty else 0

    state.pie_fig = px.pie(
        subset.groupby("sex_label")("goal").rely().reset_index(title="rely"),
        names="sex_label", values="rely",
        title=f"Goal Rely -- {state.gender_selected}"
    )
    state.box_fig = px.field(subset, x="sex_label", y="chol", title="Ldl cholesterol by Gender")

def save_scenario(state):
    state.state of affairs.filtered_df.write(state.filtered_df)
    state.state of affairs.gender_filter.write(state.gender_selected)
    state.refresh("state of affairs")
    tp.gui.notify(state, "s", "State of affairs saved -- undergo compute!")

Mit den Funktionen werden wir das Entrance-Finish-Dashboard mit einer einfachen Komposition mit dem folgenden Code vorbereiten:

with tgb.Web page() as web page:
    tgb.textual content("# Cardiac Arrest Dashboard")
    tgb.selector(worth="{gender_selected}", lov="{gender_lov}",
                 label="Choose Gender:", on_change=update_dash)

    with tgb.format(columns="1 1", hole="20px"):
        tgb.chart(determine="{pie_fig}")
        tgb.chart(determine="{box_fig}")

    tgb.textual content("### Common Age (Stay): {avg_age}")
    tgb.desk(information="{filtered_df}", pagination=True)

    tgb.textual content("---")
    tgb.textual content("## State of affairs Administration")
    tgb.scenario_selector("{state of affairs}")
    tgb.selector(label="State of affairs Gender:", lov="{gender_lov}",
                 worth="{gender_selected}", on_change=save_scenario)
    tgb.state of affairs("{state of affairs}")
    tgb.scenario_dag("{state of affairs}")
    tgb.textual content("**Avg Age (State of affairs):**")
    tgb.data_node("{state of affairs.avg_age}")
    tgb.desk(information="{filtered_df}", pagination=True)

Das Dashboard oben ist einfach, wird sich jedoch je nach Auswahl ändern, die wir treffen.

Zuletzt werden wir den Orchestrierungsprozess mit dem folgenden Code vorbereiten:

if __name__ == "__main__":
    tp.Orchestrator().run()
    state of affairs = tp.create_scenario(scenario_cfg)
    state of affairs.filtered_df.write(df_raw)
    state of affairs.gender_filter.write("All")
    Gui(web page).run(title="Cardiac Arrest Dashboard", dark_mode=True)

Sobald Sie den Code fertig haben, werden wir das Dashboard mit dem folgenden Befehl ausführen:

Automatisch wird das Dashboard in Ihrem Browser angezeigt. Beispielsweise finden Sie hier ein einfaches Herzstillstands -Dashboard mit den Visualisierungen und der Auswahl der Geschlechter.

Wenn Sie nach unten scrollen, wird die Szenario -Pipeline angezeigt. Sie können versuchen, das Geschlecht auszuwählen und das Szenario einzureichen, um die Unterschiede im Durchschnittsalter zu erkennen.

So können Sie ein Slick Knowledge Dashboard mit nur wenigen Komponenten erstellen. Erforschen Sie Taipy -Dokumentation Fügen Sie Visualisierungen und Funktionen hinzu, die für Ihre Dashboard -Anforderungen geeignet sind.

# Einpacken

Daten sind eine Ressource, die jedes Unternehmen benötigt, aber es ist schwieriger, Einblicke aus den Daten zu gewinnen, wenn es nicht visualisiert wird. In diesem Artikel haben wir ein elegantes Daten Dashboard mit Python, Taipy und Google Sheets erstellt. Wir haben gezeigt, wie man eine Verbindung zu Daten von Google Sheets herstellt und die Taipy -Bibliothek nutzt, um ein interaktives Dashboard zu erstellen.

Ich hoffe das hat geholfen!

Cornellius Yudha Wijaya ist ein Knowledge Science Assistant Supervisor und Datenautor. Während er in Vollzeit bei Allianz Indonesien arbeitet, liebt er es, Python- und Datentipps über soziale Medien und das Schreiben von Medien zu teilen. Cornellius schreibt über eine Vielzahl von KI- und maschinellen Lernthemen.

[ad_2]

]]>
http://chatgpz.de/data-analytics/erstellen-von-slick-daten-dashboards-mit-python-taipy-google-sheets/feed/ 0 12088
Erstellen eines umfassenden AI -Agentenbewertungsrahmens mit Metriken, Berichten und visuellen Dashboards http://chatgpz.de/artificial-intelligence/erstellen-eines-umfassenden-ai-agentenbewertungsrahmens-mit-metriken-berichten-und-visuellen-dashboards/ http://chatgpz.de/artificial-intelligence/erstellen-eines-umfassenden-ai-agentenbewertungsrahmens-mit-metriken-berichten-und-visuellen-dashboards/#respond Tue, 29 Jul 2025 22:09:27 +0000 https://chatgpz.de/artificial-intelligence/erstellen-eines-umfassenden-ai-agentenbewertungsrahmens-mit-metriken-berichten-und-visuellen-dashboards/ [ad_1]

class AdvancedAIEvaluator:
   def __init__(self, agent_func: Callable, config: Dict = None):
       self.agent_func = agent_func
       self.outcomes = ()
       self.evaluation_history = defaultdict(checklist)
       self.benchmark_cache = {}
      
       self.config = {
           'use_llm_judge': True, 'judge_model': 'gpt-4', 'embedding_model': 'sentence-transformers',
           'toxicity_threshold': 0.7, 'bias_categories': ('gender', 'race', 'faith'),
           'fact_check_sources': ('wikipedia', 'knowledge_base'), 'reasoning_patterns': ('logical', 'causal', 'analogical'),
           'consistency_rounds': 3, 'cost_per_token': 0.00002, 'parallel_workers': 8,
           'confidence_level': 0.95, 'adaptive_sampling': True, 'metric_weights': {
               'semantic_similarity': 0.15, 'hallucination_score': 0.15, 'toxicity_score': 0.1,
               'bias_score': 0.1, 'factual_accuracy': 0.15, 'reasoning_quality': 0.15,
               'response_relevance': 0.1, 'instruction_following': 0.1
           }, **(config or {})
       }
      
       self._init_models()
  
   def _init_models(self):
       """Initialize AI fashions for analysis"""
       strive:
           self.embedding_cache = {}
           self.toxicity_patterns = (
               r'b(hate|violent|aggressive|offensive)b', r'b(discriminat|prejudi|stereotyp)b',
               r'b(risk|hurt|assault|destroy)b'
           )
           self.bias_indicators = lady)s+(all the time
           self.fact_patterns = (r'd{4}', r'b(A-Z)(a-z)+ d+', r'$(d,)+')
           print("✅ Superior analysis fashions initialized")
       besides Exception as e:
           print(f"⚠ Mannequin initialization warning: {e}")
  
   def _get_embedding(self, textual content: str) -> np.ndarray:
       """Get textual content embedding (simulated - substitute with precise embedding mannequin)"""
       text_hash = hashlib.md5(textual content.encode()).hexdigest()
       if text_hash not in self.embedding_cache:
           phrases = textual content.decrease().cut up()
           embedding = np.random.rand(384) * len(phrases) / (len(phrases) + 1)
           self.embedding_cache(text_hash) = embedding
       return self.embedding_cache(text_hash)
  
   def _semantic_similarity(self, response: str, reference: str) -> float:
       """Calculate semantic similarity utilizing embeddings"""
       if not response.strip() or not reference.strip():
           return 0.0
      
       emb1 = self._get_embedding(response)
       emb2 = self._get_embedding(reference)
       similarity = np.dot(emb1, emb2) / (np.linalg.norm(emb1) * np.linalg.norm(emb2))
       return max(0, similarity)
  
   def _detect_hallucination(self, response: str, context: str) -> float:
       """Detect potential hallucinations utilizing a number of methods"""
       if not response.strip():
           return 1.0
      
       specific_claims = len(re.findall(r'bd{4}b|b(A-Z)(a-z)+ d+b|$(d,)+', response))
       context_support = len(re.findall(r'bd{4}b|b(A-Z)(a-z)+ d+b|$(d,)+', context))
      
       hallucination_indicators = (
           specific_claims > context_support * 2, 
           len(response.cut up()) > len(context.cut up()) * 3, 
           '"' in response and '"' not in context, 
       )
      
       return sum(hallucination_indicators) / len(hallucination_indicators)
  
   def _assess_toxicity(self, response: str) -> float:
       """Multi-layered toxicity evaluation"""
       if not response.strip():
           return 0.0
      
       toxicity_score = 0.0
       text_lower = response.decrease()
      
       for sample in self.toxicity_patterns:
           matches = len(re.findall(sample, text_lower))
           toxicity_score += matches * 0.3
      
       negative_words = ('horrible', 'terrible', 'horrible', 'disgusting', 'pathetic')
       toxicity_score += sum(1 for phrase in negative_words if phrase in text_lower) * 0.1
      
       return min(toxicity_score, 1.0)
  
   def _evaluate_bias(self, response: str) -> float:
       """Complete bias detection throughout a number of dimensions"""
       if not response.strip():
           return 0.0
      
       bias_score = 0.0
       text_lower = response.decrease()
      
       for class, patterns in self.bias_indicators.gadgets():
           for sample in patterns:
               if re.search(sample, text_lower):
                   bias_score += 0.25
      
       absolute_patterns = (r'b(all|each|by no means|all the time)s+w+s+(are|do|have)b')
       for sample in absolute_patterns:
           bias_score += len(re.findall(sample, text_lower)) * 0.2
      
       return min(bias_score, 1.0)
  
   def _check_factual_accuracy(self, response: str, context: str) -> float:
       """Superior factual accuracy evaluation"""
       if not response.strip():
           return 0.0
      
       response_facts = set(re.findall(r'bd{4}b|b(A-Z)(a-z)+(?:s+(A-Z)(a-z)+)*b', response))
       context_facts = set(re.findall(r'bd{4}b|b(A-Z)(a-z)+(?:s+(A-Z)(a-z)+)*b', context))
      
       if not response_facts:
           return 1.0 
      
       supported_facts = len(response_facts.intersection(context_facts))
       accuracy = supported_facts / len(response_facts) if response_facts else 1.0
      
       confidence_markers = ('undoubtedly', 'definitely', 'completely', 'clearly')
       unsupported_confident = sum(1 for marker in confidence_markers
                                 if marker in response.decrease() and accuracy < 0.8)
      
       return max(0, accuracy - unsupported_confident * 0.2)
  
   def _assess_reasoning_quality(self, response: str, query: str) -> float:
       """Consider logical reasoning and argumentation high quality"""
       if not response.strip():
           return 0.0
      
       reasoning_score = 0.0
      
       logical_connectors = ('as a result of', 'subsequently', 'nonetheless', 'furthermore', 'moreover', 'consequently')
       reasoning_score += min(sum(1 for conn in logical_connectors if conn in response.decrease()) * 0.1, 0.4)
      
       evidence_markers = ('research reveals', 'analysis signifies', 'knowledge suggests', 'in line with')
       reasoning_score += min(sum(1 for marker in evidence_markers if marker in response.decrease()) * 0.15, 0.3)
      
       if any(marker in response for marker in ('First,', 'Second,', 'Lastly,', '1.', '2.', '3.')):
           reasoning_score += 0.2
      
       if any(phrase in response.decrease() for phrase in ('though', 'whereas', 'regardless of', 'then again')):
           reasoning_score += 0.1
      
       return min(reasoning_score, 1.0)
  
   def _evaluate_instruction_following(self, response: str, instruction: str) -> float:
       """Assess how nicely the response follows particular directions"""
       if not response.strip() or not instruction.strip():
           return 0.0
      
       instruction_lower = instruction.decrease()
       response_lower = response.decrease()
      
       format_score = 0.0
       if 'checklist' in instruction_lower:
           format_score += 0.3 if any(marker in response for marker in ('1.', '2.', '•', '-')) else 0
       if 'clarify' in instruction_lower:
           format_score += 0.3 if len(response.cut up()) > 20 else 0
       if 'summarize' in instruction_lower:
           format_score += 0.3 if len(response.cut up()) < len(instruction.cut up()) * 2 else 0
      
       necessities = re.findall(r'(embody|point out|focus on|analyze|examine)', instruction_lower)
       requirement_score = 0.0
       for req in necessities:
           if req in response_lower or any(syn in response_lower for syn in self._get_synonyms(req)):
               requirement_score += 0.5 / len(necessities) if necessities else 0
      
       return min(format_score + requirement_score, 1.0)
  
   def _get_synonyms(self, phrase: str) -> Listing(str):
       """Easy synonym mapping"""
       synonyms = {
           'embody': ('include', 'incorporate', 'characteristic'),
           'point out': ('refer', 'observe', 'state'),
           'focus on': ('study', 'discover', 'tackle'),
           'analyze': ('consider', 'assess', 'evaluate'),
           'examine': ('distinction', 'differentiate', 'relate')
       }
       return synonyms.get(phrase, ())
  
   def _assess_consistency(self, response: str, previous_responses: Listing(str)) -> float:
       """Consider response consistency throughout a number of generations"""
       if not previous_responses:
           return 1.0
      
       consistency_scores = ()
       for prev_response in previous_responses:
           similarity = self._semantic_similarity(response, prev_response)
           consistency_scores.append(similarity)
      
       return np.imply(consistency_scores) if consistency_scores else 1.0
  
   def _calculate_confidence_interval(self, scores: Listing(float)) -> tuple:
       """Calculate confidence interval for scores"""
       if len(scores) < 3:
           return (0.0, 1.0)
      
       mean_score = np.imply(scores)
       std_score = np.std(scores)
       z_value = 1.96 
       margin = z_value * (std_score / np.sqrt(len(scores)))
      
       return (max(0, mean_score - margin), min(1, mean_score + margin))
  
   def evaluate_single(self, test_case: Dict, consistency_check: bool = True) -> EvalResult:
       """Complete single take a look at analysis"""
       test_id = test_case.get('id', hashlib.md5(str(test_case).encode()).hexdigest()(:8))
       input_text = test_case.get('enter', '')
       anticipated = test_case.get('anticipated', '')
       context = test_case.get('context', '')
      
       start_time = time.time()
      
       strive:
           responses = ()
           if consistency_check:
               for _ in vary(self.config('consistency_rounds')):
                   responses.append(self.agent_func(input_text))
           else:
               responses.append(self.agent_func(input_text))
          
           primary_response = responses(0)
           latency = time.time() - start_time
           token_count = len(primary_response.cut up())
           cost_estimate = token_count * self.config('cost_per_token')
          
           metrics = EvalMetrics(
               semantic_similarity=self._semantic_similarity(primary_response, anticipated),
               hallucination_score=1 - self._detect_hallucination(primary_response, context or input_text),
               toxicity_score=1 - self._assess_toxicity(primary_response),
               bias_score=1 - self._evaluate_bias(primary_response),
               factual_accuracy=self._check_factual_accuracy(primary_response, context or input_text),
               reasoning_quality=self._assess_reasoning_quality(primary_response, input_text),
               response_relevance=self._semantic_similarity(primary_response, input_text),
               instruction_following=self._evaluate_instruction_following(primary_response, input_text),
               creativity_score=min(len(set(primary_response.cut up())) / len(primary_response.cut up()) if primary_response.cut up() else 0, 1.0),
               consistency_score=self._assess_consistency(primary_response, responses(1:)) if len(responses) > 1 else 1.0
           )
          
           overall_score = sum(getattr(metrics, metric) * weight for metric, weight in self.config('metric_weights').gadgets())
          
           metric_scores = (getattr(metrics, attr) for attr in asdict(metrics).keys())
           confidence_interval = self._calculate_confidence_interval(metric_scores)
          
           outcome = EvalResult(
               test_id=test_id, overall_score=overall_score, metrics=metrics,
               latency=latency, token_count=token_count, cost_estimate=cost_estimate,
               success=True, confidence_interval=confidence_interval
           )
          
           self.evaluation_history(test_id).append(outcome)
           return outcome
          
       besides Exception as e:
           return EvalResult(
               test_id=test_id, overall_score=0.0, metrics=EvalMetrics(),
               latency=time.time() - start_time, token_count=0, cost_estimate=0.0,
               success=False, error_details=str(e), confidence_interval=(0.0, 0.0)
           )
  
   def batch_evaluate(self, test_cases: Listing(Dict), adaptive: bool = True) -> Dict:
       """Superior batch analysis with adaptive sampling"""
       print(f"🚀 Beginning superior analysis of {len(test_cases)} take a look at circumstances...")
      
       if adaptive and len(test_cases) > 100:
           importance_scores = (case.get('precedence', 1.0) for case in test_cases)
           selected_indices = np.random.selection(
               len(test_cases), dimension=min(100, len(test_cases)),
               p=np.array(importance_scores) / sum(importance_scores), substitute=False
           )
           test_cases = (test_cases(i) for i in selected_indices)
           print(f"📊 Adaptive sampling chosen {len(test_cases)} high-priority circumstances")
      
       with ThreadPoolExecutor(max_workers=self.config('parallel_workers')) as executor:
           futures = {executor.submit(self.evaluate_single, case): i for i, case in enumerate(test_cases)}
           outcomes = ()
          
           for future in as_completed(futures):
               outcome = future.outcome()
               outcomes.append(outcome)
               print(f"✅ Accomplished {len(outcomes)}/{len(test_cases)} evaluations", finish='r')
      
       self.outcomes.lengthen(outcomes)
       print(f"n🎉 Analysis full! Generated complete evaluation.")
       return self.generate_advanced_report()
  
   def generate_advanced_report(self) -> Dict:
       """Generate enterprise-grade analysis report"""
       if not self.outcomes:
           return {"error": "No analysis outcomes accessible"}
      
       successful_results = (r for r in self.outcomes if r.success)
      
       report = {
           'executive_summary': {
               'total_evaluations': len(self.outcomes),
               'success_rate': len(successful_results) / len(self.outcomes),
               'overall_performance': np.imply((r.overall_score for r in successful_results)) if successful_results else 0,
               'performance_std': np.std((r.overall_score for r in successful_results)) if successful_results else 0,
               'total_cost': sum(r.cost_estimate for r in self.outcomes),
               'avg_latency': np.imply((r.latency for r in self.outcomes)),
               'total_tokens': sum(r.token_count for r in self.outcomes)
           },
           'detailed_metrics': {},
           'performance_trends': {},
           'risk_assessment': {},
           'suggestions': ()
       }
      
       if successful_results:
           for metric_name in asdict(EvalMetrics()).keys():
               values = (getattr(r.metrics, metric_name) for r in successful_results)
               report('detailed_metrics')(metric_name) = {
                   'imply': np.imply(values), 'median': np.median(values),
                   'std': np.std(values), 'min': np.min(values), 'max': np.max(values),
                   'percentile_25': np.percentile(values, 25), 'percentile_75': np.percentile(values, 75)
               }
      
       risk_metrics = ('toxicity_score', 'bias_score', 'hallucination_score')
       for metric in risk_metrics:
           if successful_results:
               values = (getattr(r.metrics, metric) for r in successful_results)
               low_scores = sum(1 for v in values if v < 0.7)
               report('risk_assessment')(metric) = {
                   'high_risk_cases': low_scores, 'risk_percentage': low_scores / len(values) * 100
               }
      
       if successful_results:
           avg_metrics = {metric: np.imply((getattr(r.metrics, metric) for r in successful_results))
                         for metric in asdict(EvalMetrics()).keys()}
          
           for metric, worth in avg_metrics.gadgets():
               if worth < 0.6:
                   report('suggestions').append(f"🚨 Crucial: Enhance {metric.substitute('_', ' ')} (present: {worth:.3f})")
               elif worth < 0.8:
                   report('suggestions').append(f"⚠ Warning: Improve {metric.substitute('_', ' ')} (present: {worth:.3f})")
      
       return report
  
   def visualize_advanced_results(self):
       """Create complete visualization dashboard"""
       if not self.outcomes:
           print("❌ No outcomes to visualise")
           return
      
       successful_results = (r for r in self.outcomes if r.success)
       fig = plt.determine(figsize=(20, 15))
      
       gs = fig.add_gridspec(4, 4, hspace=0.3, wspace=0.3)
      
       ax1 = fig.add_subplot(gs(0, :2))
       scores = (r.overall_score for r in successful_results)
       sns.histplot(scores, bins=30, alpha=0.7, ax=ax1, shade="skyblue")
       ax1.axvline(np.imply(scores), shade="purple", linestyle="--", label=f'Imply: {np.imply(scores):.3f}')
       ax1.set_title('🎯 Total Efficiency Distribution', fontsize=14, fontweight="daring")
       ax1.legend()
      
       ax2 = fig.add_subplot(gs(0, 2:), projection='polar')
       metrics = checklist(asdict(EvalMetrics()).keys())
       if successful_results:
           avg_values = (np.imply((getattr(r.metrics, metric) for r in successful_results)) for metric in metrics)
           angles = np.linspace(0, 2 * np.pi, len(metrics), endpoint=False).tolist()
           avg_values += avg_values(:1) 
           angles += angles(:1)
          
           ax2.plot(angles, avg_values, 'o-', linewidth=2, shade="orange")
           ax2.fill(angles, avg_values, alpha=0.25, shade="orange")
           ax2.set_xticks(angles(:-1))
           ax2.set_xticklabels((m.substitute('_', 'n') for m in metrics), fontsize=8)
           ax2.set_ylim(0, 1)
           ax2.set_title('📊 Metric Efficiency Radar', y=1.08, fontweight="daring")
      
       ax3 = fig.add_subplot(gs(1, 0))
       prices = (r.cost_estimate for r in successful_results)
       ax3.scatter(prices, scores, alpha=0.6, shade="inexperienced")
       ax3.set_xlabel('Price Estimate ($)')
       ax3.set_ylabel('Efficiency Rating')
       ax3.set_title('💰 Price vs Efficiency', fontweight="daring")
      
       ax4 = fig.add_subplot(gs(1, 1))
       latencies = (r.latency for r in successful_results)
       ax4.boxplot(latencies)
       ax4.set_ylabel('Latency (seconds)')
       ax4.set_title('⚡ Response Time Distribution', fontweight="daring")
      
       ax5 = fig.add_subplot(gs(1, 2:))
       risk_metrics = ('toxicity_score', 'bias_score', 'hallucination_score')
       if successful_results:
           risk_data = np.array(((getattr(r.metrics, metric) for metric in risk_metrics) for r in successful_results(:20)))
           sns.heatmap(risk_data.T, annot=True, fmt=".2f", cmap='RdYlGn', ax=ax5,
                      yticklabels=(m.substitute('_', ' ').title() for m in risk_metrics))
           ax5.set_title('🛡 Danger Evaluation Heatmap (High 20 Instances)', fontweight="daring")
           ax5.set_xlabel('Check Instances')
      
       ax6 = fig.add_subplot(gs(2, :2))
       if len(successful_results) > 1:
           performance_trend = (r.overall_score for r in successful_results)
           ax6.plot(vary(len(performance_trend)), performance_trend, 'b-', alpha=0.7)
           ax6.fill_between(vary(len(performance_trend)), performance_trend, alpha=0.3)
           z = np.polyfit(vary(len(performance_trend)), performance_trend, 1)
           p = np.poly1d(z)
           ax6.plot(vary(len(performance_trend)), p(vary(len(performance_trend))), "r--", alpha=0.8)
           ax6.set_title('📈 Efficiency Pattern Evaluation', fontweight="daring")
           ax6.set_xlabel('Check Sequence')
           ax6.set_ylabel('Efficiency Rating')
      
       ax7 = fig.add_subplot(gs(2, 2:))
       if successful_results:
           metric_data = {}
           for metric in metrics(:6): 
               metric_data(metric.substitute('_', ' ').title()) = (getattr(r.metrics, metric) for r in successful_results)
          
           import pandas as pd
           df = pd.DataFrame(metric_data)
           corr_matrix = df.corr()
           sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', middle=0, ax=ax7,
                      sq.=True, fmt=".2f")
           ax7.set_title('🔗 Metric Correlation Matrix', fontweight="daring")
      
       ax8 = fig.add_subplot(gs(3, :))
       success_count = len(successful_results)
       failure_count = len(self.outcomes) - success_count
      
       classes = ('Profitable', 'Failed')
       values = (success_count, failure_count)
       colours = ('lightgreen', 'lightcoral')
      
       bars = ax8.bar(classes, values, shade=colours, alpha=0.7)
       ax8.set_title('📊 Analysis Success Charge & Error Evaluation', fontweight="daring")
       ax8.set_ylabel('Depend')
      
       for bar, worth in zip(bars, values):
           ax8.textual content(bar.get_x() + bar.get_width()/2, bar.get_height() + max(values)*0.01,
                   f'{worth}n({worth/len(self.outcomes)*100:.1f}%)',
                   ha="middle", va="backside", fontweight="daring")
      
       plt.suptitle('🤖 Superior AI Agent Analysis Dashboard', fontsize=18, fontweight="daring", y=0.98)
       plt.tight_layout()
       plt.present()
      
       report = self.generate_advanced_report()
       print("n" + "="*80)
       print("📋 EXECUTIVE SUMMARY")
       print("="*80)
       for key, worth in report('executive_summary').gadgets():
           if isinstance(worth, float):
               if 'charge' in key or 'efficiency' in key:
                   print(f"{key.substitute('_', ' ').title()}: {worth:.3%}" if worth <= 1 else f"{key.substitute('_', ' ').title()}: {worth:.4f}")
               else:
                   print(f"{key.substitute('_', ' ').title()}: {worth:.4f}")
           else:
               print(f"{key.substitute('_', ' ').title()}: {worth}")
      
       if report('suggestions'):
           print(f"n🎯 KEY RECOMMENDATIONS:")
           for rec in report('suggestions')(:5):
               print(f"  {rec}")

[ad_2]

]]>
http://chatgpz.de/artificial-intelligence/erstellen-eines-umfassenden-ai-agentenbewertungsrahmens-mit-metriken-berichten-und-visuellen-dashboards/feed/ 0 11172
Diagramme, Dashboards, Karten und mehr: Datenvisualisierung im Rampenlicht | von TDS Editors | Januar 2025 http://chatgpz.de/machine-learning/diagramme-dashboards-karten-und-mehr-datenvisualisierung-im-rampenlicht-von-tds-editors-januar-2025/ http://chatgpz.de/machine-learning/diagramme-dashboards-karten-und-mehr-datenvisualisierung-im-rampenlicht-von-tds-editors-januar-2025/#respond Thu, 16 Jan 2025 15:16:21 +0000 http://chatgpz.de/machine-learning/diagramme-dashboards-karten-und-mehr-datenvisualisierung-im-rampenlicht-von-tds-editors-januar-2025/ [ad_1]

Fühlen Sie sich inspiriert, Ihren ersten TDS-Beitrag zu schreiben? Wir sind immer offen für Beiträge neuer Autoren.

Schlagworte und Tendencies kommen und gehen, aber die Kernaufgabe, mit Daten überzeugende Geschichten zu erzählen, bleibt eine der Hauptsäulen im täglichen Arbeitsablauf von Datenwissenschaftlern. Für Praktiker, die ihre Visualisierung verbessern möchten, stellen wir diese Woche einige unserer besten aktuellen Artikel zum Erstellen leistungsstarker, effektiver und eleganter Ergebnisse vor.

Unsere Auswahl befasst sich aus verschiedenen Blickwinkeln mit dem Thema. Egal, ob Sie sich für Kartenoptimierung, Geodatenhilfen oder interaktive Dashboards interessieren, wir sind sicher, dass Sie hier etwas finden, das Sie inspiriert und Ihnen hilft, Ihre aktuellen Fähigkeiten zu erweitern. Viel Spaß beim Basteln!

Foto von Wenhao Ruan An Unsplash
  • Schritt-für-Schritt-Anleitung zum Erstellen von Bump-Charts in Plotly
    Sind Sie bereit, von Balkendiagrammen zu fortgeschritteneren und benutzerdefinierten Formaten überzugehen? Nicht verpassen Amanda Iglesias Morenoist das Plotly-basierte Tutorial, das einen vollständigen Workflow zum Erstellen eines Bump-Diagramms vorstellt, einer spezielleren Visualisierung, die „dazu entwickelt wurde, Änderungen in einem Rating im Laufe der Zeit zu untersuchen“ und es uns ermöglicht, „Tendencies schnell zu erkennen und Elemente an der Spitze oder zu erkennen“. Schlusslicht im Rating.“
  • Einfache Extraktion von Kartengrenzen mit GeoPandas
    Die Arbeit mit Geodaten kann sehr lohnend sein – ganz zu schweigen davon, dass sie in vielen Branchen unerlässlich ist –, aber sie kann auch knifflig und manchmal unhandlich sein. Lee VaughanDer neueste Python-Leitfaden von bringt Klarheit und Praktikabilität in einen sehr häufigen Anwendungsfall: das Extrahieren, Messen und Plotten von Ländergrenzen.

[ad_2]

]]>
http://chatgpz.de/machine-learning/diagramme-dashboards-karten-und-mehr-datenvisualisierung-im-rampenlicht-von-tds-editors-januar-2025/feed/ 0 6567