# Einführung
Jede Analyse beginnt auf die gleiche Weise: Sie laden einen Datensatz und versuchen herauszufinden, was tatsächlich darin enthalten ist. Wie viele Reihen? Welche Spalten sind numerisch? Wie viel fehlt? Ist irgendetwas völlig verzerrt? Die meisten von uns beantworten diese Fragen, indem sie sie kopieren und einfügen df.describe(), df.isna().sum()Und df.groupby(...).agg(...) Schnipsel, die wir tausendmal getippt haben, und die Ausgabe dann manuell neu formatieren, wenn es Zeit ist, sie in einen Bericht einzufügen.
Das ist vergebliche Mühe. Das Python-Ökosystem verfügt jetzt über Instruments, die Sie von einem Rohdatenrahmen zu einer formatierten, gemeinsam nutzbaren Übersichtstabelle in ein oder zwei Zeilen führen – und über andere, die speziell für die Erstellung der Artwork von „Tabelle 1“ entwickelt wurden, die Sie meist in Forschungsarbeiten sehen. Dieses Tutorial führt Sie durch die 7 Schritte zum Aufbau einer wiederholbaren Pipeline anstelle eines Stapels einmaliger Schnipsel. Wir werden das verwenden Datensatz der Palmer-Pinguine hindurch. Es ist klein, offen und verfügt über eine realistische Mischung aus numerischen und kategorialen Spalten, echten fehlenden Werten und einer natürlichen Gruppierungsvariablen (species). Additionally fangen wir an.
# 1. Einrichten Ihrer Umgebung und Laden der Daten
Installieren Sie die Pakete, die wir in diesem Tutorial verwenden:
pip set up pandas seaborn skimpy tableone great-tables fg-data-profiling
Ein wichtiger Hinweis zum letzten Punkt: Die beliebte Profiling-Bibliothek wurde mehr als einmal umbenannt. Es conflict zunächst Pandas-Profilerstellungwurde ydata-profiling im Jahr 2023 und wurde erneut in umbenannt fg-data-profiling im April 2026. Je älter ydata-profiling Das Paket wird weiterhin installiert und ausgeführt, erhält jedoch keine Updates mehr. Daher sollten neue Projekte bevorzugt werden fg-data-profiling. Wir werden beide Importstile in Schritt 5 behandeln.
Laden Sie nun die Daten. Seaborn verfügt über einen integrierten Pinguindatensatz, der uns einen Obtain erspart:
import pandas as pd
import seaborn as sns
df = sns.load_dataset("penguins")
print(df.form)
print(df.dtypes)
print(df.isna().sum())
Ausgabe:
(344, 7)
species object
island object
bill_length_mm float64
bill_depth_mm float64
flipper_length_mm float64
body_mass_g float64
intercourse object
dtype: object
species 0
island 0
bill_length_mm 2
bill_depth_mm 2
flipper_length_mm 2
body_mass_g 2
intercourse 11
dtype: int64
Sie sehen sieben Spalten: drei kategorische (species, island, intercourse) und vier numerische Messungen (bill_length_mm, bill_depth_mm, flipper_length_mm, body_mass_g). Die Messungen haben jeweils 2 fehlende Werte und intercourse hat 11. Behalten Sie dieses Element bei – wir werden sehen, wie jedes Instrument diese fehlenden Daten meldet.
# 2. Die Baseline ermitteln mit df.describe()
Pandas eingebaut describe() ist der offensichtliche Ausgangspunkt, und das aus gutem Grund. Es funktioniert sofort und erfordert keine zusätzliche Set up:
Ausgabe:
bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
rely 342.00 342.00 342.00 342.00
imply 43.92 17.15 200.92 4201.75
std 5.46 1.97 14.06 801.95
min 32.10 13.10 172.00 2700.00
25% 39.22 15.60 190.00 3550.00
50% 44.45 17.30 197.00 4050.00
75% 48.50 18.70 213.00 4750.00
max 59.60 21.50 231.00 6300.00
Das ist wirklich nützlich, aber beachten Sie seine blinden Flecken. Standardmäßig werden kategoriale Spalten vollständig ignoriert. Es gibt Ihnen eine Zählung von ungleich Null Werte, sagt Ihnen aber nie direkt den fehlenden Prozentsatz. Und es bleibt bei der fünfstelligen Zusammenfassung – keine Schiefe, keine Wölbung, kein Gefühl für die Verteilungsform. Für einen schnellen Bauchcheck ist es in Ordnung, aber als Grundlage eines Berichts hinterlässt es Lücken. Der nächste Schritt schließt einige davon, ohne Pandas zu verlassen.
# 3. Pandas weiter vorantreiben mit embody, .agg()Und groupby
Bevor Sie zu externen Paketen greifen, sollten Sie wissen, wie weit Sie mit Pandas allein kommen können – denn für viele alltägliche Arbeiten reicht das aus.
Falten Sie zunächst die kategorialen Spalten zu derselben Zusammenfassung mit embody="all":
df.describe(embody="all").spherical(2)
Ausgabe:
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g intercourse
rely 344 344 342.00 342.00 342.00 342.00 333
distinctive 3 3 NaN NaN NaN NaN 2
prime Adelie Biscoe NaN NaN NaN NaN Male
freq 152 168 NaN NaN NaN NaN 168
imply NaN NaN 43.92 17.15 200.92 4201.75 NaN
std NaN NaN 5.46 1.97 14.06 801.95 NaN
min NaN NaN 32.10 13.10 172.00 2700.00 NaN
25% NaN NaN 39.22 15.60 190.00 3550.00 NaN
50% NaN NaN 44.45 17.30 197.00 4050.00 NaN
75% NaN NaN 48.50 18.70 213.00 4750.00 NaN
max NaN NaN 59.60 21.50 231.00 6300.00 NaN
Jetzt bekommst du distinctive, primeUnd freq für die Textspalten neben den numerischen Statistiken (mit NaN Ausfüllen der Zellen, in denen eine Statistik nicht zutrifft). Eine Tabelle, jede Spalte.
Zweitens erstellen Sie eine benutzerdefinierte Zusammenfassung mit .agg() Sie steuern additionally genau, welche Statistiken angezeigt werden – auch solche describe() Auslassungen wie Schiefe und Wölbung – und geben Sie einen Prozentsatz fehlender Daten an:
numeric = df.select_dtypes("quantity")
abstract = numeric.agg(("imply", "median", "std", "skew", "kurt")).T
abstract("missing_pct") = df(numeric.columns).isna().imply().mul(100).spherical(1)
abstract.spherical(2)
Ausgabe:
imply median std skew kurt missing_pct
bill_length_mm 43.92 44.45 5.46 0.05 -0.88 0.6
bill_depth_mm 17.15 17.30 1.97 -0.14 -0.91 0.6
flipper_length_mm 200.92 197.00 14.06 0.35 -0.98 0.6
body_mass_g 4201.75 4050.00 801.95 0.47 -0.72 0.6
Drittens – und das ist der Schritt, den die Leute vergessen – Kette groupby() vor describe() So erhalten Sie eine geschichtete Zusammenfassung in einer einzigen Zeile:
df.groupby("species")("body_mass_g").describe().spherical(1)
Ausgabe:
rely imply std min 25% 50% 75% max
species
Adelie 151.0 3700.7 458.6 2850.0 3350.0 3700.0 4000.0 4775.0
Chinstrap 68.0 3733.1 384.3 2700.0 3487.5 3700.0 3950.0 4800.0
Gentoo 123.0 5076.0 504.1 3950.0 4700.0 5000.0 5500.0 6300.0
Das zu verinnerlichende Muster: select_dtypes Spalten auswählen, .agg((...)) Statistiken auswählen, groupby Schichten wählen. Dieses Trio erfüllt einen überraschenden Teil der tatsächlichen Berichtsanforderungen ohne Abhängigkeiten. In den verbleibenden Schritten geht es darum, Zeit zu sparen, den Schliff zu verleihen und die Fälle zu behandeln, in denen „intestine genug“ nicht ausreicht.
# 4. Mit skimpy eine umfassendere Konsolenübersicht erhalten
Wenn Sie mehr wollen als describe() aber ich möchte es nicht von Hand zusammenbauen, dürftig ist die richtige Choice. Es ist wie ein Kompressor describe() das auf Ihrer Konsole oder Ihrem Pocket book läuft und jeden Spaltentyp gleichzeitig verarbeitet. Es funktioniert sowohl mit Pandas- als auch mit Polars-DataFrames.
from skimpy import skim
skim(df)
Ein einzelner Aufruf druckt einen strukturierten Bericht: eine Datenzusammenfassung (Zeilen- und Spaltenanzahl), eine Aufschlüsselung nach Datentyp, eine numerische Tabelle mit Mittelwert, Standardabweichung, der vollständigen Perzentilstreuung und ein Inline-ASCII-Histogramm professional Spalte sowie eine separate Tabelle für Zeichenfolgenspalten, die Dinge wie die Anzahl der Zeichen und die häufigsten/am seltensten Werte anzeigt. Fehlende Daten werden sowohl als Anzahl als auch als Prozentsatz gemeldet, genau dort, wo Sie es erwarten würden.
Ausgabe:
╭──────────────────────────────────────────────── skimpy abstract ─────────────────────────────────────────────────╮
│ Knowledge Abstract Knowledge Varieties │
│ ┏━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┓ ┏━━━━━━━━━━━━━┳━━━━━━━┓ │
│ ┃ Dataframe ┃ Values ┃ ┃ Column Kind ┃ Depend ┃ │
│ ┡━━━━━━━━━━━━━━━━━━━╇━━━━━━━━┩ ┡━━━━━━━━━━━━━╇━━━━━━━┩ │
│ │ Variety of rows │ 344 │ │ float64 │ 4 │ │
│ │ Variety of columns │ 7 │ │ string │ 3 │ │
│ └───────────────────┴────────┘ └─────────────┴───────┘ │
│ quantity │
│ ┏━━━━━━━━━━━━━━━━━━━━┳━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━━━┓ │
│ ┃ column ┃ NA ┃ NA % ┃ imply ┃ sd ┃ p0 ┃ p25 ┃ p50 ┃ p75 ┃ p100 ┃ hist ┃ │
│ ┡━━━━━━━━━━━━━━━━━━━━╇━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━╇━━━━━━╇━━━━━━━━┩ │
│ │ bill_length_mm │ 2 │ 0.5813953488372093 │ 43.92 │ 5.46 │ 32.1 │ 39.23 │ 44.45 │ 48.5 │ 59.6 │ ▃█▆█▃ │ │
│ │ bill_depth_mm │ 2 │ 0.5813953488372093 │ 17.15 │ 1.975 │ 13.1 │ 15.6 │ 17.3 │ 18.7 │ 21.5 │ ▄▅▆█▆▂ │ │
│ │ flipper_length_mm │ 2 │ 0.5813953488372093 │ 200.9 │ 14.06 │ 172 │ 190 │ 197 │ 213 │ 231 │ ▂██▄▆▃ │ │
│ │ body_mass_g │ 2 │ 0.5813953488372093 │ 4202 │ 802 │ 2700 │ 3550 │ 4050 │ 4750 │ 6300 │ ▂█▆▄▃▁ │ │
│ └────────────────────┴────┴────────────────────┴───────┴───────┴──────┴───────┴───────┴──────┴──────┴────────┘ │
│ string │
│ ┏━━━━━━━━━┳━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━┓ │
│ ┃ column ┃ NA ┃ NA % ┃ shortest ┃ longest ┃ min ┃ max ┃ chars/row ┃ phrases/row ┃ complete phrases┃ │
│ ┡━━━━━━━━━╇━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━┩ │
│ │ species │ 0 │ 0 │ Adelie │ Chinstrap │ Adelie │ Gentoo │ 6.59 │ 1.00 │ 344 │ │
│ │ island │ 0 │ 0 │ Dream │ Torgersen │ Biscoe │ Torgersen │ 6.09 │ 1.00 │ 344 │ │
│ │ intercourse │ 11 │ 3.19767442 │ Male │ Feminine │ Feminine │ Male │ 4.99 │ 0.97 │ 333 │ │
│ └─────────┴────┴────────────┴──────────┴───────────┴────────┴───────────┴────────────┴───────────┴────────────┘ │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Das herausragende Merkmal sind die Inline-Histogramme. Sie können die Kind jeder Verteilung ablesen, ohne eine Plotbibliothek öffnen zu müssen. Für die interaktive Erkundung ist Skimpy ein guter Mittelweg: weitaus informativer als describe()viel einfacher als ein vollständiger HTML-Bericht.
# 5. Erstellen eines vollständigen interaktiven Berichts mit Profilerstellung
Wenn Sie das brauchen vollständig Bild – Verteilungen, Korrelationen, Interaktionen, Duplikaterkennung und Datenqualitätswarnungen – ist es besser, einen vollständigen Profilbericht zu erstellen. Dies ist der Einzeiler, der für viele Analysten einen Nachmittag mit explorativem Plotten ersetzt hat.
Mit dem gepflegten Paket:
from data_profiling import ProfileReport # fg-data-profiling
profile = ProfileReport(df, title="Penguins Profiling Report", explorative=True)
profile.to_file("penguins_report.html")
Wenn Sie das Legacy-Paket verwenden, ändert sich nur die Importzeile:
import ydata_profiling # legacy ydata-profiling
Die Ausgabe ist eine eigenständige, interaktive HTML-Datei mit Abschnitten für eine Übersicht (Größe, Speicher, doppelte Zeilen), Particulars professional Variable (beschreibende Statistiken plus Histogramme), Korrelationen über mehrere Koeffizienten, eine Analyse fehlender Werte und automatische Warnungen, die auf Schiefe, hohe Kardinalität, konstante Spalten und dergleichen hinweisen.

Ein Abschnitt des generierten Profiling-Berichts
Der einzige Nachteil ist die Geschwindigkeit: Ein vollständiger Bericht rechnet viel und wird bei großen Datensätzen langsamer. Zwei Argumente beheben das. Verwenden minimal=True um die aufwändigsten Berechnungen auszuschalten und ein Profil einer Stichprobe anstelle des gesamten Rahmens zu erstellen, wenn Sie nur ein Gefühl für die Daten benötigen:
profile = ProfileReport(df.pattern(frac=0.5), minimal=True)
Es gibt auch eine .examine() Methode zum Nebeneinanderstellen zweier Datensätze – von unschätzbarem Wert, um Abweichungen zwischen einem Trainingssatz und Produktionsdaten oder zwischen zwei Zeiträumen zu erkennen.
# 6. Mit tableone einen echten „Tisch 1“ aufbauen
Alles bisher ist für Du — Erkundungshilfen. Tisch eins ist für Ihre Leser. Es erstellt die geschichtete Foundation-Merkmalstabelle, die nahezu jede klinische und quantitative Forschungsarbeit öffnet (daher „Tabelle 1“), mit der Formatierung und den Statistiken, die Gutachter erwarten.
from tableone import TableOne
information = df.dropna(subset=("intercourse"))
columns = ("bill_length_mm", "bill_depth_mm",
"flipper_length_mm", "body_mass_g", "island", "intercourse")
categorical = ("island", "intercourse")
nonnormal = ("body_mass_g") # summarize with median (IQR) as a substitute of imply (SD)
table1 = TableOne(
information,
columns=columns,
categorical=categorical,
nonnormal=nonnormal,
groupby="species",
pval=True,
smd=True,
)
print(table1.tabulate(tablefmt="github"))
Das Ergebnis ist eine ordnungsgemäß formatierte Tabelle: kontinuierliche Variablen als imply (SD)Kategoriale als n (%)alles, was Sie als nicht regular gekennzeichnet haben median (Q1,Q3) – stratifiziert über Ihre Gruppierungsvariable, mit einer Spalte mit fehlenden Daten, p-Werten und standardisierten Mittelwertdifferenzen (SMD) zwischen Gruppen:
| | | Lacking | General | Adelie | Chinstrap | Gentoo | SMD (Adelie,Chinstrap) | SMD (Adelie,Gentoo) | SMD (Chinstrap,Gentoo) | P-Worth |
|------------------------------|-----------|-----------|------------------------|------------------------|------------------------|------------------------|--------------------------|-----------------------|--------------------------|-----------|
| n | | | 333 | 146 | 68 | 119 | | | | |
| bill_length_mm, imply (SD) | | 0 | 44.0 (5.5) | 38.8 (2.7) | 48.8 (3.3) | 47.6 (3.1) | 3.315 | 3.023 | -0.393 | <0.001 |
| bill_depth_mm, imply (SD) | | 0 | 17.2 (2.0) | 18.3 (1.2) | 18.4 (1.1) | 15.0 (1.0) | 0.062 | -3.022 | -3.220 | <0.001 |
| flipper_length_mm, imply (SD) | | 0 | 201.0 (14.0) | 190.1 (6.5) | 195.8 (7.1) | 217.2 (6.6) | 0.837 | 4.140 | 3.119 | <0.001 |
| body_mass_g, median (Q1,Q3) | | 0 | 4050.0 (3550.0,4775.0) | 3700.0 (3362.5,4000.0) | 3700.0 (3487.5,3950.0) | 5050.0 (4700.0,5500.0) | 0.064 | 2.885 | 3.043 | <0.001 |
| island, n (%) | Biscoe | | 163 (48.9) | 44 (30.1) | 0 (0.0) | 119 (100.0) | 1.819 | 2.153 | nan | <0.001 |
| | Dream | | 123 (36.9) | 55 (37.7) | 68 (100.0) | 0 (0.0) | | | | |
| | Torgersen | | 47 (14.1) | 47 (32.2) | 0 (0.0) | 0 (0.0) | | | | |
| intercourse, n (%) | Feminine | | 165 (49.5) | 73 (50.0) | 34 (50.0) | 58 (48.7) | <0.001 | 0.025 | 0.025 | 0.976 |
| | Male | | 168 (50.5) | 73 (50.0) | 34 (50.0) | 61 (51.3) | | | | |
Der wahre Gewinn liegt im Export. A TableOne Das Objekt wechselt direkt in das Format, das Ihr Manuskript benötigt – LaTeX (fügen Sie es in Overleaf ein), HTML, Markdown oder CSV:
table1.to_latex("table1.tex")
table1.to_html("table1.html")
table1.to_csv("table1.csv")
Eine wichtige Sache, die die Paketautoren betonen, und ich auch: Automatisierte Statistiken sind kein Ersatz für Urteilsvermögen. Die Wahl des durchzuführenden Assessments, ob eine Variable wirklich regular ist und wie mit fehlenden Variablen umgegangen werden soll, erfordert eine menschliche Überprüfung, bevor etwas veröffentlicht wird. Tableone beseitigt die Langeweile, nicht die Verantwortung.
# 7. Mit tollen Tabellen zu einer Tabelle in Publikationsqualität aufpolieren
tableone formatiert gezielt Forschungstabellen. Für irgendein anderes Zusammenfassung – ein Geschäftsbericht, eine Folie oder eine README-Datei – Tolle Tische verwandelt einen einfachen DataFrame auf die gleiche Weise in eine gestaltete, präsentationsbereite Tabelle gt Das Paket funktioniert in R. Es nimmt einen Pandas- oder Polars-Body und rendert ihn in HTML oder in ein Bild.
Nehmen Sie die benutzerdefinierte Zusammenfassung, die wir in Schritt 3 erstellt haben, und verschönern Sie sie:
from great_tables import GT, md
numeric = df.select_dtypes("quantity")
stats = (numeric.agg(("imply", "median", "std", "min", "max")).T
.rename_axis("measurement").reset_index())
stats("missing_pct") = df(numeric.columns).isna().imply().mul(100).values
desk = (
GT(stats, rowname_col="measurement")
.tab_header(title="Penguin Physique Measurements",
subtitle="Descriptive statistics, Palmer Archipelago")
.fmt_number(columns=("imply", "median", "std", "min", "max"), decimals=1)
.fmt_percent(columns="missing_pct", decimals=1, scale_values=False)
.data_color(columns="std", palette="Blues")
.tab_source_note(md("Supply: *palmerpenguins* dataset (Horst et al.)."))
)
Hier passieren einige Dinge. fmt_number Und fmt_percent Behandeln Sie die Anzeigeformatierung, damit Sie nie wieder herumhantieren müssen. data_color Wendet einen Farbverlauf an std Spalte, die den Blick auf die unterschiedlichsten Messungen lenkt. tab_header Und tab_source_note Fügen Sie den Titel und die Namensnennung hinzu, damit eine Tabelle fertig aussieht. Es gibt noch viel mehr – Spaltenschlüssel, bedingtes Styling, sogar Inline-Sparklines – aber selbst das führt zu etwas, das Sie den Beteiligten gerne vorstellen würden.
Um das Ergebnis zu verwenden, rendern Sie es in einen HTML-String (funktioniert überall, keine zusätzlichen Abhängigkeiten):
html = desk.as_raw_html()
with open("summary_table.html", "w") as f:
f.write(html)

Die gestaltete Nice Tables-Ausgabe
# Alles zusammenfügen: Immer eine Funktion
Der springende Punkt bei der Automatisierung ist die Wiederholbarkeit. Wickeln Sie die Pipeline so ein, dass der nächste Datensatz ein einzelner Aufruf ist:
from great_tables import GT, md
def descriptive_report(df, decimals=1):
numeric = df.select_dtypes("quantity")
stats = (numeric.agg(("rely", "imply", "median", "std", "min", "max")).T
.rename_axis("variable").reset_index())
stats("missing_%") = df(numeric.columns).isna().imply().mul(100).values
return (
GT(stats, rowname_col="variable")
.tab_header(title="Descriptive Statistics",
subtitle=f"{len(df):,} rows x {df.form(1)} columns")
.fmt_integer(columns="rely")
.fmt_number(columns=("imply", "median", "std", "min", "max"), decimals=decimals)
.fmt_percent(columns="missing_%", decimals=1, scale_values=False)
.data_color(columns="std", palette="Blues")
.tab_source_note(md("Generated routinely with pandas + Nice Tables."))
)
descriptive_report(df) # level it at any DataFrame
Das ist der Unterschied zwischen einem Snippet und einem Instrument: Sie schreiben es einmal und verwenden es für jeden Datensatz, der auf Ihrem Schreibtisch landet.
# Zusammenfassung
Beschreibende Statistiken müssen nicht eine lästige Pflicht sein, die Sie bei jedem Projekt neu implementieren müssen. Die Leiter, die wir bestiegen haben, hat für jede State of affairs eine Sprosse:
- Pandas
describe()Und.agg(): Keine Abhängigkeiten, perfekt für schnelle Überprüfungen und benutzerdefinierte Zusammenfassungen. - dürftig: Eine umfassendere Konsolenzusammenfassung mit Histogrammen und Prozentsätzen fehlender Daten in einem Aufruf.
- fg-data-profiling: Ein vollständiger interaktiver HTML-Bericht, wenn Sie das vollständige Bild der explorativen Datenanalyse (EDA) benötigen.
- Tabelle eins: Die geschichtete „Tabelle 1“ mit p-Werten und SMDs für Forschungsarbeiten, mit einzeiligem Export in LaTeX, HTML und CSV.
- Tolle Tische: Poliertes Design in Publikationsqualität für jede Zusammenfassung, die Sie erstellt haben.
Wählen Sie das leichteste Werkzeug, das Ihre Frage beantwortet. Für eine fünfsekündige Überprüfung der geistigen Gesundheit: describe() gewinnt. Für ein Manuskript verdienen Tableone und Nice Tables ihren Lebensunterhalt. Und sobald Sie Ihre Lieblingskombination in eine Funktion verpackt haben, hören Sie auf tun Beschreibende Statistik und Begin läuft Sie sind genau dort, wo Sie sein möchten, damit Sie Ihre Zeit mit der Analyse verbringen können, die Ihr Gehirn tatsächlich erfordert.
Kanwal Mehreen ist ein Ingenieur für maschinelles Lernen und ein technischer Redakteur mit einer großen Leidenschaft für Datenwissenschaft und die Schnittstelle zwischen KI und Medizin. Sie ist Mitautorin des E-Books „Maximizing Productiveness with ChatGPT“. Als Google Technology Scholar 2022 für APAC setzt sie sich für Vielfalt und akademische Exzellenz ein. Sie ist außerdem als Teradata Range in Tech Scholar, Mitacs Globalink Analysis Scholar und Harvard WeCode Scholar anerkannt. Kanwal ist ein leidenschaftlicher Verfechter von Veränderungen und hat FEMCodes gegründet, um Frauen in MINT-Bereichen zu stärken.
