Skip to content

Commit 977d102

Browse files
committed
📝 Update the section on data cleaning
* Add validation categories and procedures * Add text encoding with charset_normalizer and ftfy * Add DataProfiler and cerberus
1 parent e78cde1 commit 977d102

22 files changed

Lines changed: 1880 additions & 972 deletions

‎CHANGELOG.rst‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ Notfälle, wenn Zweige für ältere Versionen erstellt werden müssen.
2222
Added
2323
~~~~~
2424

25+
* 📝 Update the section on data cleaning
26+
27+
* Add validation categories and procedures
28+
* Add text encoding with charset_normalizer and ftfy
29+
* Add DataProfiler and cerberus
30+
2531
* 📝 Add Narwhals
2632
* 📝 Add SBOM
2733
* 📝 Add protobuf-py

‎docs/clean-prep/categories.rst‎

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
.. SPDX-FileCopyrightText: 2021 cusy GmbH
2+
..
3+
.. SPDX-License-Identifier: BSD-3-Clause
4+
5+
Kategorien der Datenqualität
6+
============================
7+
8+
Es gibt verschiedene Möglichkeiten, Datenqualitätsprobleme zu kategorisieren –
9+
nach der Ursache des Problems, nach seinen wahrscheinlichen oder potenziellen
10+
Auswirkungen, nach der Art des Datenelements, nach der Ebene einer
11+
Datenhierarchie, auf der der Fehler oder Inkonsistenz sichtbar werden, um nur
12+
einige zu nennen. In diesem Tutorial erfolgt die Kategorisierung im Allgemeinen
13+
implizit, und wir konzentrieren uns auf die Methoden zur Erkennung von Problemen
14+
sowie auf die dafür geeigneten Werkzeuge. Es ist jedoch sinnvoll, zumindest
15+
allgemein auf andere Möglichkeiten der Kategorisierung von Datenproblemen
16+
einzugehen, bevor wir uns mit der Erkennung befassen.
17+
18+
Unmögliche Daten
19+
wie :abbr:`z. B. (zum Beispiel)` Temperaturen unterhalb des absoluten
20+
Nullpunkts (0 Kelvin oder −273,15 °C) oder unsinnige Datums- und Zeitangaben
21+
– in Python können diese zwar nicht im :class:`datetime`-Datentyp auftreten,
22+
jedoch in :doc:`../data-processing/serialisation-formats/json/index` und
23+
:doc:`SQLite <python-basics:save-data/sqlite/index>`, in denen meist
24+
Textfelder zur Speicherung von Datumsangaben verwendet werden.
25+
Sonderwerte
26+
Der `IEEE-754 <https://de.wikipedia.org/wiki/IEEE_754>`_-Standard zur
27+
Darstellung von Gleitkommazahlen enthält auch Sonderwerte für positive und
28+
negative Unendlichkeit (+∞, −∞) sowie *Not-a-Number* -Werte (``NaN``).
29+
Unspezifizierte Werte
30+
Werte, die einem bestimmten Format entsprechen, können dennoch ungültig
31+
sein, wie :abbr:`z. B. (zum Beispiel)` E-Mail-Adressen.
32+
Inkonsistenzen
33+
Gruppen verwandter Feldwerte für jeden Datensatz können sich einschränken.
34+
Um solche Inkonsistenzen zu vermeiden, empfiehlt das :abbr:`DRY (Don’t
35+
Repeat Yourself)`-Prinzip, berechenbare Werte zu vernachlässigen. Prüfsummen
36+
sind jedoch das genaue Gegenteil davon.
37+
38+
*„Single Source of Truth“* ist ein Beispiel für Datenbanknormalisierung und
39+
vereinfacht Aktualisierungen; mit denormalisierten Datenspeichern können
40+
hingegen wVerknüpfungen und Berechnungen während der Datenanalyse vermieden
41+
werden.
42+
43+
Anomalien und Data-Drift
44+
Die bisherigen Überprüfungen erlaubten, Daten ungültig erklären zu können.
45+
Anomalien und Data-Drift lassen diesen Schluss jedoch nicht zwingend zu und
46+
erlauben daher nur selten eine automatisierte Bereinigung der Daten.
47+
Malware
48+
Weder alle Eingabe- noch Ausgabedaten sollen in Analysesystemen verarbeitet
49+
werden.
50+
51+
.. figure:: exploits_of_a_mom_2x.png
52+
:alt: Hi, this is your son’s school. We’re having some computer trouble.
53+
Oh, dear - did he break something? In a way –
54+
Did you really name your son Robert'); DROP TABLE Students; -- ?
55+
Oh, yes. Little bobby tables, we call him.
56+
Well, weve lost this year’s student records. I hope you’re happy.
57+
And I hope, youe’ve learned to sanitize your database inpots.
58+
:target: https://xkcd.com/327/
59+
60+
Exploits of a Mom
61+
62+
Ein offensichtliches Beispiel für versehentlich offengelegte Ausgabedaten
63+
sind :abbr:`z. B. (zum Beispiel)` aus fortlaufenden Personenkennziffern
64+
generierte URLs mit personenbezogenen Daten.
65.9 KB
Loading

‎docs/clean-prep/index.rst‎

Lines changed: 44 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -5,65 +5,60 @@
55
Daten bereinigen und validieren
66
===============================
77

8-
Im Folgenden wollen wir euch einen praktischen Überblick über verschiedene
9-
Bibliotheken und Methoden zur `Datenbereinigung
10-
<https://de.wikipedia.org/wiki/Datenbereinigung>`_ und -validierung mit Python
11-
geben. Dabei verwenden wir neben bekannten Bibliotheken wie
12-
:doc:`/workspace/numpy/index` und :doc:`/workspace/pandas/index` auch mehrere
13-
kleine, spezialisierte Bibliotheken wie :doc:`dedupe <deduplicate>`,
14-
:doc:`TheFuzz <string-matching>`, :doc:`voluptuous <voluptuous>`, :doc:`tdda
15-
<tdda>` und :doc:`hypothesis <hypothesis>`. Wir bevorzugen diese
16-
leichtgewichtigeren Lösungen gegenüber großen, universellen Systemen wie `Great
17-
Expectations <https://greatexpectations.io/>`_ oder `MobyDQ
18-
<https://ubisoft.github.io/mobydq/>`_.
8+
*„Garbage In, Garbage Out“* ist der verzweifelte Hinweis, dass aus mangelhaften
9+
Daten kaum gute Erkenntnisse gezogen werden können. Zwar gibt es stark
10+
regulierte, sicherheitskritische Bereiche, in denen Daten routinemäßig in allen
11+
Phasen überprüft werden, das allgemeine Niveau der Datenvalidierung ist in den
12+
meisten Analyseprojekten jedoch eher gering.
1913

20-
.. tip::
21-
`cusy Seminar: Daten bereinigen und validieren mit Python
22-
<https://cusy.io/de/our-training-courses/cleanse-and-validate-data-with-python.html>`_
14+
Wenn wir jedoch Code schreiben, um Daten auszuwerten, die Daten jedoch nicht
15+
vorher überprüfen, werden einige Ergebnisse irreführend, falsch oder ungültig
16+
sein. Ähnlich verhält es sich, wenn wir unsere Ausgaben nicht validieren. So
17+
tragen wir dann auch noch zu den *„schlechten Daten“* bei, gegen das wir alle
18+
wettern. Hilfreich ist hier das *Postelsche Gesetz*, für das im TCP-Standard
19+
vorgeschlagene Prinzip der Robustheit:
20+
21+
*„Sei konservativ in dem, was du tust, sei liberal in dem, was du von
22+
anderen akzeptierst.“* [#]_
23+
24+
Dies steht in auffälligem Kontrast zu einer der Prinzipien von Python:
2325

24-
Überblick
25-
---------
26+
*„Fehler sollten niemals unbemerkt bleiben.“* [#]_
2627

27-
.. csv-table:: GitHub-Insights
28-
:header: "Name", "Stars", "Mitwirkende", "Commit-Aktivität", "Lizenz"
28+
Auch die :doc:`XML
29+
<../data-processing/serialisation-formats/xml-html/index>`-Spezifikation
30+
schreibt vor, dass nicht wohlgeformte XML-Dokumente zurückgewiesen werden
31+
sollen:
2932

30-
"`scikit-learn <https://github.com/scikit-learn/scikit-learn>`_",".. image:: https://raster.shields.io/github/stars/scikit-learn/scikit-learn",".. image:: https://raster.shields.io/github/contributors/scikit-learn/scikit-learn",".. image:: https://raster.shields.io/github/commit-activity/y/scikit-learn/scikit-learn",".. image:: https://raster.shields.io/github/license/scikit-learn/scikit-learn"
31-
"`fg-data-profiling <https://github.com/Data-Centric-AI-Community/fg-data-profiling>`_",".. image:: https://raster.shields.io/github/stars/Data-Centric-AI-Community/fg-data-profiling",".. image:: https://raster.shields.io/github/contributors/Data-Centric-AI-Community/fg-data-profiling",".. image:: https://raster.shields.io/github/commit-activity/y/Data-Centric-AI-Community/fg-data-profiling",".. image:: https://raster.shields.io/github/license/Data-Centric-AI-Community/fg-data-profiling"
32-
"`Hypothesis <https://github.com/HypothesisWorks/hypothesis>`_",".. image:: https://raster.shields.io/github/stars/HypothesisWorks/hypothesis",".. image:: https://raster.shields.io/github/contributors/HypothesisWorks/hypothesis",".. image:: https://raster.shields.io/github/commit-activity/y/HypothesisWorks/hypothesis",".. image:: https://raster.shields.io/github/license/HypothesisWorks/hypothesis"
33-
"`marshmallow <https://github.com/marshmallow-code/marshmallow>`_",".. image:: https://raster.shields.io/github/stars/marshmallow-code/marshmallow",".. image:: https://raster.shields.io/github/contributors/marshmallow-code/marshmallow",".. image:: https://raster.shields.io/github/commit-activity/y/marshmallow-code/marshmallow",".. image:: https://raster.shields.io/github/license/marshmallow-code/marshmallow"
34-
"`dedupe <https://github.com/dedupeio/dedupe>`_",".. image:: https://raster.shields.io/github/stars/dedupeio/dedupe",".. image:: https://raster.shields.io/github/contributors/dedupeio/dedupe",".. image:: https://raster.shields.io/github/commit-activity/y/dedupeio/dedupe",".. image:: https://raster.shields.io/github/license/dedupeio/dedupe"
35-
"`pandera <https://github.com/unionai-oss/pandera>`_",".. image:: https://raster.shields.io/github/stars/unionai-oss/pandera",".. image:: https://raster.shields.io/github/contributors/unionai-oss/pandera",".. image:: https://raster.shields.io/github/commit-activity/y/unionai-oss/pandera",".. image:: https://raster.shields.io/github/license/unionai-oss/pandera"
36-
"`thefuzz <https://github.com/seatgeek/thefuzz>`_",".. image:: https://raster.shields.io/github/stars/seatgeek/thefuzz",".. image:: https://raster.shields.io/github/contributors/seatgeek/thefuzz",".. image:: https://raster.shields.io/github/commit-activity/y/seatgeek/thefuzz",".. image:: https://raster.shields.io/github/license/seatgeek/thefuzz"
37-
"`Voluptuous <https://github.com/alecthomas/voluptuous>`_",".. image:: https://raster.shields.io/github/stars/alecthomas/voluptuous",".. image:: https://raster.shields.io/github/contributors/alecthomas/voluptuous",".. image:: https://raster.shields.io/github/commit-activity/y/alecthomas/voluptuous",".. image:: https://raster.shields.io/github/license/alecthomas/voluptuous"
38-
"`datacleaner <https://github.com/rhiever/datacleaner>`_",".. image:: https://raster.shields.io/github/stars/rhiever/datacleaner",".. image:: https://raster.shields.io/github/contributors/rhiever/datacleaner",".. image:: https://raster.shields.io/github/commit-activity/y/rhiever/datacleaner",".. image:: https://raster.shields.io/github/license/rhiever/datacleaner"
39-
"`popmon <https://github.com/ing-bank/popmon>`_",".. image:: https://raster.shields.io/github/stars/ing-bank/popmon",".. image:: https://raster.shields.io/github/contributors/ing-bank/popmon",".. image:: https://raster.shields.io/github/commit-activity/y/ing-bank/popmon",".. image:: https://raster.shields.io/github/license/ing-bank/popmon"
40-
"`TDDA <https://github.com/tdda/tdda>`_",".. image:: https://raster.shields.io/github/stars/tdda/tdda",".. image:: https://raster.shields.io/github/contributors/tdda/tdda",".. image:: https://raster.shields.io/github/commit-activity/y/tdda/tdda",".. image:: https://raster.shields.io/github/license/tdda/tdda"
41-
"`Validr <https://github.com/guyskk/validr>`_",".. image:: https://raster.shields.io/github/stars/guyskk/validr",".. image:: https://raster.shields.io/github/contributors/guyskk/validr",".. image:: https://raster.shields.io/github/commit-activity/y/guyskk/validr",".. image:: https://raster.shields.io/github/license/guyskk/validr"
42-
"`Probatus <https://github.com/ing-bank/probatus>`_",".. image:: https://raster.shields.io/github/stars/ing-bank/probatus",".. image:: https://raster.shields.io/github/contributors/ing-bank/probatus",".. image:: https://raster.shields.io/github/commit-activity/y/ing-bank/probatus",".. image:: https://raster.shields.io/github/license/ing-bank/probatus"
33+
*„Validierende Prozessoren MÜSSEN … Verstöße gegen … die Nichteinhaltung der
34+
in dieser Spezifikation festgelegten Gültigkeitsbedingungen melden.“* [#]_
4335

44-
Ruhende Projekte
45-
----------------
36+
Die Abschnitte :doc:`procedures/index`, :doc:`procedures/ranges` und
37+
:doc:`procedures/regression_tests` setzen keine Python-Kenntnisse voraus und
38+
sind damit auch allgemein für Fachkräfte aus den Bereichen Datenmanagement,
39+
Unternehmensführung und Qualitätssicherung geeignet.
40+
41+
Anschließend geben wir euch einen praktischen Überblick über verschiedene
42+
:doc:`libs-methods/index` zur `Datenbereinigung
43+
<https://de.wikipedia.org/wiki/Datenbereinigung>`_ und -validierung mit Python.
44+
45+
.. tip::
46+
`cusy Seminar: Daten bereinigen und validieren mit Python
47+
<https://cusy.io/de/our-training-courses/cleanse-and-validate-data-with-python.html>`_
4648

47-
.. csv-table:: GitHub-Insights
48-
:header: "Name", "Stars", "Mitwirkende", "Commit-Aktivität", "Lizenz"
49+
----
4950

50-
"`Bulwark <https://github.com/ZaxR/bulwark>`_",".. image:: https://raster.shields.io/github/stars/ZaxR/bulwark",".. image:: https://raster.shields.io/github/contributors/ZaxR/bulwark",".. image:: https://raster.shields.io/github/commit-activity/y/ZaxR/bulwark",".. image:: https://raster.shields.io/github/license/ZaxR/bulwark"
51-
"`PandasSchema <https://github.com/multimeric/PandasSchema>`_",".. image:: https://raster.shields.io/github/stars/multimeric/PandasSchema",".. image:: https://raster.shields.io/github/contributors/multimeric/PandasSchema",".. image:: https://raster.shields.io/github/commit-activity/y/multimeric/PandasSchema",".. image:: https://raster.shields.io/github/license/multimeric/PandasSchema"
52-
"`pandas-validation <https://github.com/jmenglund/pandas-validation>`_",".. image:: https://raster.shields.io/github/stars/jmenglund/pandas-validation",".. image:: https://raster.shields.io/github/contributors/jmenglund/pandas-validation",".. image:: https://raster.shields.io/github/commit-activity/y/jmenglund/pandas-validation",".. image:: https://raster.shields.io/github/license/jmenglund/pandas-validation"
53-
"`Opulent-Pandas <https://github.com/danielvdende/opulent-pandas>`_",".. image:: https://raster.shields.io/github/stars/danielvdende/opulent-pandas",".. image:: https://raster.shields.io/github/contributors/danielvdende/opulent-pandas",".. image:: https://raster.shields.io/github/commit-activity/y/danielvdende/opulent-pandas",".. image:: https://raster.shields.io/github/license/danielvdende/opulent-pandas"
54-
"`signpost <https://github.com/ilsedippenaar/signpost>`_",".. image:: https://raster.shields.io/github/stars/ilsedippenaar/signpost",".. image:: https://raster.shields.io/github/contributors/ilsedippenaar/signpost",".. image:: https://raster.shields.io/github/commit-activity/y/ilsedippenaar/signpost",".. image:: https://raster.shields.io/github/license/ilsedippenaar/signpost"
51+
.. [#] Jon Postel: `Transmission Control Protocol
52+
<https://www.rfc-editor.org/info/rfc761/#section-2.10>`_, 1980
53+
.. [#] Tim Peters: :pep:`The Zen of Python <20>`, 1999
54+
.. [#] `XML-Spezifikation 1.0, Abschnitt 5.1
55+
<https://www.w3.org/TR/2008/REC-xml-20081126/#proc-types>`_, 1998
5556
5657
.. toctree::
5758
:hidden:
5859
:titlesonly:
5960
:maxdepth: 0
6061

61-
nulls.ipynb
62-
outliers.ipynb
63-
string-matching.ipynb
64-
deduplicate.ipynb
65-
hypothesis.ipynb
66-
tdda.ipynb
67-
voluptuous.ipynb
68-
scikit-learn-reprocessing.ipynb
69-
dask-pipeline.ipynb
62+
categories
63+
procedures/index
64+
libs-methods/index

docs/clean-prep/dask-pipeline.ipynb renamed to docs/clean-prep/libs-methods/dask-pipeline.ipynb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"1. [Google Maps Geocoder](https://developers.google.com/maps/documentation/geocoding/guides-v3/overview)\n",
1919
"2. [Open Notify API for ISS location](http://api.open-notify.org/)\n",
2020
"\n",
21-
"Wir werden sie verwenden, um den ISS-Standort und die nächste Durchlaufzeit in Bezug auf eine Liste von Städten zu verfolgen. Um unsere Diagramme zu erstellen und Daten intelligent zu parallelisieren, verwenden wir Dask, insbesondere [Dask Delayed](../performance/dask.ipynb)."
21+
"Wir werden sie verwenden, um den ISS-Standort und die nächste Durchlaufzeit in Bezug auf eine Liste von Städten zu verfolgen. Um unsere Diagramme zu erstellen und Daten intelligent zu parallelisieren, verwenden wir Dask, insbesondere [Dask Delayed](../../performance/dask.ipynb)."
2222
]
2323
},
2424
{
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)