Startseite BlogWeb-Scraping Daten-QS mit Python: Erstklassige Qualität sicherstellen

Daten-QS mit Python: Erstklassige Qualität sicherstellen

von Kadek

Finden Sie heraus, wie Sie Daten-QA mit Python durchführen können. Die Datenveredelung bereitet Datenwissenschaftlern und Datenanalysten großes Kopfzerbrechen. Wie wir schon oft erwähnt haben, verbringen die meisten Datenexperten 50 bis 80 Prozent ihrer Zeit mit der Verfeinerung von Daten. Um diese Hürde zu überwinden, haben wir verschiedene Systeme eingerichtet, die die hohe Qualität Ihrer Daten sicherstellen.

In einem unserer früheren Artikel haben wir gelernt, wie man mit Python Daten aus dem Internet extrahiert. Von den vielen Erkenntnissen, die wir dabei gewonnen haben, war die wichtigste, dass der Umgang mit großen Datenmengen nie ein einfacher Prozess ist.

In den meisten Fällen verwenden wir die Daten nicht, sobald der Crawler mit dem Extrahieren der Daten fertig ist.

Bevor die Daten einsatzbereit sind, müssen wir uns mit mehreren komplexen Problemen auseinandersetzen. Um die Integrität eines Datensatzes ordnungsgemäß zu überprüfen, kommen verschiedene Qualitätssicherungsmethoden ins Spiel.

In diesem Artikel sehen wir uns einige Pythonic-Methoden an, mit denen Sie die hohe Qualität eines Datensatzes sicherstellen können, um die mit Ihren geschäftlichen Anwendungsfällen verbundenen Probleme zu beheben.

Warum sollten Sie Python für Ihre Daten-QA verwenden?

Python ist eine Allzweck-Programmiersprache, die sehr intuitiv zu bedienen ist. Sie verfügt über eine umfangreiche Community und zahlreiche Bibliotheken, darunter auch, aber nicht nur,Pandas, scikit-learn, und pyspark.

Diese Bibliotheken können fast alle Ihre Anforderungen an die Datenanalyse und -manipulation erfüllen. Um genauer zu sein, pyspark bietet eine API für Apache Spark das die Verarbeitung großer Datenmengen in Echtzeit ermöglicht.

Daher ist Python die optimale Wahl für die Datenverarbeitung und -validierung. Der Einfachheit halber werden wir Folgendes verwenden pandas für den weiteren Verlauf dieses Blogs.

Daten QA Black Box Tests mit Python

Daten-QA-Black-Box-Modell
Daten QA Black Box Modell

Black Box ist im Allgemeinen eine Methode des Softwaretests, bei der die Funktionalität einer Anwendung untersucht wird, ohne in ihre internen Strukturen oder Abläufe Einblick zu nehmen. 

Wir haben uns von dieser äußerst erfolgreichen Softwaretestmethode inspirieren lassen und eine eigene Black Box entwickelt, sozusagen eine Data QA Black Box.

Bei Grepsr ist es der Ausgangspunkt für alle unsere QA-Prozesse. Wir verwenden es für automatische Tests, um Anomalien in einem Datensatz zu erkennen.

Das QA-Team lässt jedes einzelne Datenprojekt durch die Black Box laufen. Auf der Grundlage voreingestellter statistischer und logischer Prozesse liefert es einen Musterbericht. Wir verwenden den Musterbericht, um aussagekräftige Erkenntnisse zu gewinnen und die notwendigen Änderungen vorzunehmen.

Da es nicht plausibel ist, die Datenintegrität mit ein und demselben Satz von Prozessen zu verallgemeinern, passen wir die Black Box häufig an die jeweiligen Anforderungen an. Sie sind mehr als willkommen, uns Ihre Bedenken mitzuteilen. Wir können die Skripte der Black Box entsprechend Ihren Vorschlägen aktualisieren.

Zweifellos kann das QA-Team auf diese Weise Anomalien in einem Datensatz erkennen und Wege zu ihrer Behebung finden.

Von hier an ist die test_dataset.csv wird der Hauptdatensatz sein, mit dem wir arbeiten werden. Lassen Sie uns damit beginnen, ihn in die Datei pandas.DataFrame.

import pandas as pd
import chardet
import re
import numpy as np
with open("./test_dataset.csv", "rb") as f:
   enc = chardet.detect(f.read())
df = pd.read_csv("./test_dataset.csv", encoding= enc["encoding"])
df.dropna(how="all",axis=0,inplace=True)

Das Wichtigste zuerst: Sie erhalten die Daten in der von Ihnen bevorzugten Kodierung. Wir haben ein spezielles Skript, um diese Art von Problemen zu lösen.

Anforderungsanalyse für Ihr Daten-QA-Projekt mit Python

Der erste Schritt im QA-Prozess besteht darin, zu prüfen, ob der Datensatz Ihren Anforderungen entspricht. Lassen Sie uns einige Anwendungsfälle durchgehen:

1. Vergleich der Eingabeliste

In vielen Anwendungsfällen, auf die wir stoßen, erwarten unsere Kunden von uns, dass wir die Produkte mit bestimmten SKUs crawlen. Um die Anforderungen zu erfüllen, gleichen wir die eingehenden SKUs mit der vordefinierten Liste der SKUs ab.

Schauen wir, ob die SKUs identisch sind:

Daten -QA-mit-Python-Unique-SKU-zählen
Einzigartige SKU-Zahl
df[~df.SKU.isin(input_list.SKU_list.unique().tolist())].loc[:,"SKU"].unique().tolist()
input_list[~input_list.SKU_list.isin(df.SKU.unique().tolist())].loc[:,"SKU_list"].unique().tolist()
Zusatz-SKUs
Zusätzliche SKUs

Wir können sehen, dass die erste Liste der SKUs die fehlenden SKUs enthält. Die fehlenden Artikel sind im Eingabeblatt vorhanden, aber nicht im Datensatz. Die zweite Liste der SKUs zeigt eine umgekehrte Konstellation.

Auf diese Weise können wir die fehlenden SKUs herausfinden und sie zu dem von Ihnen benötigten Originaldatensatz hinzufügen.

2. Befolgen Sie die Regel

Wenn es in Ihrem Datensatz eine Spalte gibt, für die wir Regeln definieren können, implementieren wir diese Regeln in unserem Skript. Wir können die Integrität Ihres Datensatzes sicherstellen, indem wir diese Skripts ausführen.

Nehmen wir an, Sie ziehen product_codevon einer E-Commerce-Website, die eine Kombination aus 1 Alphabet und vier Zahlen enthält. Durch die Implementierung eines Skripts können wir die Produkte markieren, die nicht den Regeln entsprechen.

Produkt-Code-Anomalie
Produktcodes, die nicht den Regeln entsprechen

Die oben hervorgehobenen Abschnitte sind die Anomalien in unserem Datensatz. Sie entsprechen nicht den Regeln. In diesem speziellen Fall ist der Datensatz klein, so dass wir die Anomalien ohne große Schwierigkeiten aufspüren können. Aber wenn die Datensätze größer sind, wird auch die Komplexität größer. Es wird schwieriger sein, die Auffälligkeiten herauszufiltern, wie wir es hier getan haben.

Filterung von Produktanomalien
Herausfiltern der Produktcode-Anomalien
def rule_checker(data_point:str) -> bool:
   alphabet_count = sum(1 for i in data_point if i.isalpha())
   numeric_count = sum(1 for i in data_point if i.isnumeric())
   if (alphabet_count == 1) & (numeric_count == 4):
       return True
   else:
       return False
df[~df.product_code.apply(rule_checker)]

Dieses praktische Tool in Python kann uns die Arbeit abnehmen. Wir können entweder die Ungereimtheiten aus dem Datensatz herausfiltern oder den Crawler aktualisieren, um solche Probleme zu beheben.

Markierung von Anomalien im Datensatz für die QA

Der nächste Schritt besteht nun darin, die wahrscheinlichen Unregelmäßigkeiten in unserem Datensatz zu lokalisieren. Unregelmäßigkeiten sind hier die Datenpunkte, die nicht mit der Logik unserer Datenpunkte übereinstimmen. Gehen wir die folgenden Beispiele durch, um die Unregelmäßigkeiten, auf die wir in einem Datensatz stoßen könnten, vollständig zu erfassen:

1. Fehlende Datenfelder

Es ist sehr wahrscheinlich, dass Sie leere Datenfelder erhalten, wenn Sie zum ersten Mal Daten extrahieren. Für das QA-Team ist dies der Zeitpunkt, an dem es zur Pflicht wird.

Nach der Analyse eines Beispieldatensatzes, den die Black Box mit Hilfe einer umfangreichen statistischen Analyse erstellt hat, machen wir uns an die Arbeit.

Der Beispieldatensatz enthält alle fehlenden Felder des Datensatzes. Anhand dieser Angaben validieren wir die fehlenden Punkte manuell. Aber das ist noch nicht alles. Wir können die Skripte an bestimmte Fälle anpassen, indem wir Prioritäten für die Spalten setzen, die für Sie wichtig sind.

Sie können zum Beispiel kein leeres product_name Daten in einem E-Commerce-Datensatz. Daher greifen wir auf den Musterbericht zurück, um die fehlenden Variablen zu finden.

Hier ist ein einfacher Python-Code, der Anomalien herausfiltert. Er ermöglicht es uns, die fehlenden Werte im Datensatz auszugleichen. Wir werden uns später im Abschnitt Nachbearbeitung mit den Feinheiten befassen.

Beispiel für fehlende Felder

2. Logische Prüfung

Ein weiterer Knoten, den wir mit Hilfe der Black Box entwirren können, ist die logische Überprüfung der Spalten in unserem Datensatz. Für ein besseres Verständnis betrachten wir das Feld Telefonnummer.

Für dieses Datenfeld gelten feste Regeln in Bezug auf die Landesvorwahl und die Anzahl der Ziffern. Zum Beispiel bestehen US-Telefonnummern aus zehnstelligen Zahlen zusammen mit der Ortsvorwahl. Immer wenn wir Spalten mit Telefonnummern und Ländern finden, ziehen wir Informationen aus der Metadaten-Datenbank und wenden eine entsprechende Logik an. 

Nehmen wir an, anhand der verfügbaren Vorwahl und nach einem kurzen Blick in die Metadaten finden wir heraus, dass die phone_numerical_count ist 10. Mit diesen Informationen können wir Datenpunkte, die sich nicht an diese Regel halten, trennen.

Telefonnummer-Ziffern-Zahl
Zählung der Telefonnummern und Ziffern
phone_numeral_count = 10
df[df.vendor_contact.apply(lambda x: True if sum(1 for i in x if i.isnumeric())!=phone_numeral_count else False)]

Dies war eine einfache Darstellung, wie wir Stichproben auf der Grundlage der Feldlogik erstellt haben, die wir im Skript eingerichtet haben. Es gibt viele statistische und logische Operationen, die in die Black Box geschrieben werden, um eine umfassende Anomalie-Stichprobe zu erstellen. 

Nachbearbeitung der Daten QA

Datenpunkte, die wir aus Webquellen beziehen, sind nicht immer ohne weiteres verwendbar. Einige eingebettete Anomalien können die Integrität des Datensatzes beeinträchtigen und die Entscheidungsfindung verlangsamen.

Durch die Nachbearbeitung der Daten können wir nicht nur eine hohe Datenqualität aufrechterhalten, sondern auch eine schnellere Lieferung der Datenprojekte gewährleisten. Wir tun dies, indem wir die TAT (Turn Around Time) deutlich reduzieren.

Schauen wir uns einige Nachbearbeitungstechniken an, mit denen sich unsere Qualitätsexperten hin und wieder beschäftigen.

1. HTML-Tags im Textfeld

Wir schicken die Rohdaten, die wir aus dem Internet abrufen, oft durch verschiedene Verarbeitungsstufen. Wenn die Rohdaten direkt über eine API zugänglich gemacht werden, können wir vernünftigerweise erwarten, dass sie frei von HTML-Tags sind. Ganz anders sieht es jedoch aus, wenn wir die Daten durch Parsen von HTML-Dokumenten extrahieren.

Unter diesen Umständen ist das Vorhandensein von HTML-Tags im Datensatz ein großes Problem. Die weitere Analyse kann durch den in den HTML-Tags eingebetteten Inhalt erschwert werden.

Aber keine Sorge. Sie können reguläre Ausdrücke in das Feld einfügen, um den Datensatz zu retten. Unten finden Sie einen Ausschnitt aus dem Python-Code, mit dem Sie die HTML-Tags aus Ihren Datenpunkten entfernen können:

def remove_tags(raw_text):
   CLEANR = re.compile('<.*?>')
   cleantext = re.sub(CLEANR, '', str(raw_text))
   return cleantext

Der Beispieldatensatz berücksichtigt Daten, die in den HTML-Tag eingebettet sind:

HTML-Tag-im-Produktnamen
HTML-Tag im Feld Produktname

Wir verwenden die remove_tagsFunktion auf die Spalten, die die Anomalie enthalten. Sie entfernt die HTML-Tags und liefert als Ergebnis saubere Daten.

Hier wenden wir diese Funktion auf die product_nameSpalte, um die HTML-Tags in jedem Fall zu eliminieren:

df.product_name = df.product_name.apply(lambda x : remove_tags(x) if pd.notna(x) else np.nan)

Es eliminiert HTML-Tags aus allen Instanzen der Spalte, wenn sie vorhanden sind.

Verfeinerte Produktnamen-Daten
Produktname frei von HTML-Tag

Wir können sehr deutlich sehen, dass der Produktname aus der zweiten Zeile frei vom HTML-Tag ist.

Ebenso können wir alle Zeichenfolgen, Zeichen und Zahlen aus dem Datenfeld entfernen, die die Integrität des Datensatzes beeinträchtigen.

2. Anrechnung der leeren Felder

Der Löwenanteil der Datensätze liegt im kategorischen und numerischen Format vor. Wie bereits erwähnt, sind leere Felder in einem Datensatz oft unvermeidlich. 

Wir machen diesen besonderen Schritt, um die fehlenden Datenfelder zu überprüfen, wenn der Datenpunkt sogar auf der Quell-Website fehlt.

Wenn Sie möchten, dass wir die fehlenden Datenfelder imputieren, um den Datensatz sinnvoll zu nutzen, können wir entsprechend vorgehen.

So können Sie z.B. das fehlende Feld in kategorialen Daten zuordnen, indem Sie Werte über den Moduswert oder über den Regressionsansatz zuordnen. 

Für numerische Daten hingegen können Sie statistische Werkzeuge wie den Mittelwert, den Median und die lineare Regression verwenden.

Schauen wir uns die overall_rating Spalte für diesen Fall. Ein negativer Wert in dem Feld kann den Imputationswert verzerren. Der erste Schritt besteht also darin, sicherzustellen, dass das Feld negative Werte enthalten kann. Wir wissen, dass die Werte in diesem Fall nicht negativ sein können.

Daten-Ausgabe-im-Gesamt-Rating
Datenproblem in der Gesamtbewertung

Die Daten haben sowohl negative als auch leere Werte in der overall_rating Feld. Lassen Sie uns die Indizes dieser Felder speichern und mit der Lösung fortfahren.

overall_rating_flagged_index = df[df.overall_rating.isna() |	(df.overall_rating < 0)].index

Dieser einfache Code unten stellt sicher, dass die overall_rating ist frei von jeglichen negativen Einträgen.

df.overall_rating = df.overall_rating.abs()

Jetzt gehen wir zur Imputation über. Lassen Sie uns den Medianwert in die fehlenden Felder der Spalte eintragen.

df.overall_rating.fillna(df.overall_rating.median(), inplace=True)

Nach Anwendung dieser einfachen Technik können wir sehen, dass wir die Feldinformationen so gut wie möglich erhalten haben. 

Verfeinerte-überall-Bewertungsdaten
Verfeinerte Gesamtbewertungsdaten

Wir können die fehlenden Datenfelder durch verschiedene univariate und multivariate Techniken ausgleichen. In den meisten Fällen greifen wir jedoch auf die Imputationsmethode der nächsten Nachbarn zurück.

3. Beziehung zwischen den Spalten

Wir finden oft Datensätze mit zwei oder mehr Spalten, die auf der Grundlage von Feldlogiken miteinander in Beziehung stehen. In den angegebenen Beispieldaten gibt es solche Spalten, in denen das Attribut "Rabatt" kann aus den Attributen "Original Preis" und "Einkaufspreis".

Alternativ können wir auch sagen, dass die "EinkaufspreisDas Attribut "" wird von den Attributen "" abgeleitet.Original Preis" und "Rabatt". Hier ist eine Teilmenge unseres Datensatzes, um die obige Beziehung zu demonstrieren.

df[['Original Price', 'Discount', 'Purchase price']].head(10)
Discount-mismatch-data-QA-mit-Python
Unstimmigkeiten bei den Rabatten in der obersten Zeile

Wir können die Beziehung verwenden, um die Richtigkeit unserer Daten zu überprüfen. In der Abbildung haben wir eine ungültige Instanz hervorgehoben, was bedeutet, dass die Daten darauf hindeuten, dass entweder der Einkaufspreis oder der Rabattpreis für diese bestimmte Zeile ungültig ist.

Python für die Daten-QS verwenden

Wir können solche Zeilen mit Python-Code identifizieren, wie unten gezeigt:

df[(df['Original Price'] <= df['Purchase price']) & 
df['Discount'].notna()]

Nachdem unser manuelles Team solche ungültigen Beziehungen im Web überprüft hat, können wir feststellen, ob der Rabatt, der Kaufpreis oder der ursprüngliche Preis ungültig ist. 

Sobald wir das spezifische Attribut identifiziert haben, das ungültig ist, können wir mit Nachbearbeitungsschritten fortfahren, um die Gültigkeit der Instanz sicherzustellen.

Daten-QA-mit-Python-skewed-data
Rabattabweichung im gesamten Datensatz

Die Nachbearbeitungsschritte umfassen die Suche nach den korrekten Daten und deren Imputation, um die ungültigen Werte zu ersetzen.

In unserem Beispieldatensatz führt das Vorhandensein des Zeichens "$" in den nicht leeren Instanzen dazu, dass die Instanzen in den Spalten "Originalpreis", "Rabatt" und "Kaufpreis" String-Instanzen sind.

Um Berechnungen oder Vergleiche mit diesen Werten durchzuführen, müssen Sie die Zeichenfolge in ein numerisches Format umwandeln, indem Sie das Währungssymbol entfernen.

df['Original Price'] = pd.to_numeric(df['Original Price'].str.replace('[^\d.]', '', regex=True), errors='coerce')
df['Discount'] = pd.to_numeric(df['Discount'].str.replace('[^\d.]', '', regex=True), errors='coerce')
df['Purchase price'] = pd.to_numeric(df['Purchase price'].str.replace('[^\d.]', '', regex=True), errors='coerce')

Nun, da die Preiswerte in Float umgewandelt sind, können wir mit weiteren Berechnungen fortfahren. Aufgrund unserer manuellen Prüfung der Beispieldaten halten wir den Rabatt und den ursprünglichen Preis für gültig. Daher können wir die Berechnungen und Analysen mit diesen Werten durchführen.

Auf diese Weise können Sie den Index finden, für den die ungültige Zeile existiert.

index_=list(df[(df['Original Price']<=df['Purchase price']) & df['Discount'].notna()].index)
Schiefe Daten
Verzerrte Daten

Jetzt ersetzen wir den ungültigen Kaufpreis durch den richtigen Preis, d.h. Kaufpreis = Originalpreis - Rabatt.

Der Python-Code für einen solchen Vorgang lautet:

df.loc[index_,'Purchase price']=df.loc[index_,'Original Price'] - df.loc[index_,'Discount']

Wir können die Gültigkeit der aktualisierten Werte überprüfen, indem wir die Indizes der zuvor ungültigen Zeilen überprüfen.

df.loc[index_,['Original Price','Discount','Purchase price']]
Raffinierte Preisdaten
Verfeinerte Preisdaten

Agile Entwicklung in der Daten QA Black Box Testing

Agiles Testen von Daten
Agile Datenprüfung

Wie alle anderen Prozesse in Grepsr erfolgt auch die Entwicklung der Daten QA Black Box auf agile Weise.

Das obige Flussdiagramm zeigt einen einfachen Weg, wie wir dabei vorgehen. Wenn wir die Daten in die Blackbox einspeisen, werden zwei Beispieldatensätze erzeugt.

Stichprobe 1 ist das Ergebnis einer Zufallsstichprobe. Stichprobe 2 besteht aus den Daten, die uns helfen, die Probleme zu verifizieren (ein vordefinierter Satz von Regeln, der bereits in der Black Box enthalten ist, ist dafür verantwortlich).

Unsere manuellen QA-Experten überprüfen die Stichprobe. Wenn wir bisher unbekannte Probleme finden, schreiben unsere QA-Automatisierungsexperten neue Skripte (Mechanismus zur Erkennung von Problemen), die in die Data QA Black Box eingespeist werden.

Umso besser, wenn wir in dem Beispieldatensatz keine Probleme entdecken. Unser QA-Team führt weitere Datenuntersuchungen und -manipulationen durch. In vielen Fällen geben wir unsere Ergebnisse an die Delivery Engineers weiter.

Danach verbessern die Ingenieure die Crawler, um Platz für die neue Entdeckung zu schaffen.

Der Data QA Black Box-Mechanismus arbeitet mit einem strengen probabilistischen Rahmen, der die aufgezeichneten Daten sorgfältig auf Unstimmigkeiten oder Anomalien untersucht. Wir setzen fortschrittliche mathematische Techniken ein, um probabilistische Muster zu erkennen.

Auf diese Weise können wir bei großen Datensätzen eine präzise Qualitätssicherung durchführen und unsere TAT (Turn Around Time) radikal verbessern.

Zum Schluss

Dieser Blog erläutert nur einen kleinen Teil der Prozesse und Tools, die wir zur Sicherung der Datenqualität einsetzen.

Unser Black-Box-Testing-Ansatz, der auf Python und seinen Bibliotheken basiert, ermöglicht es uns, komplexe Datenqualitätsprobleme effektiv zu lösen.

Wir können die Black Box-Skripte an Ihre spezifischen Anforderungen an die Datenqualität anpassen. 

Unabhängig davon können Sie sich darauf verlassen, dass Grepsr Ihnen qualitativ hochwertige Daten liefert, die mit Ihren Geschäftszielen übereinstimmen.

Lesen Sie dazu:

Verwandte Beiträge

Einen Kommentar hinterlassen