
Der Dataprofiler ist eine Python -Bibliothek, die die Datenanalyse, Überwachung und sensible Datenerkennung erleichtert.
Laden Sie Daten mit einem einzigen Befehl und die Bibliothek formatiert und lädt Dateien automatisch in einen Datenrahmen. Profiling der Daten identifiziert die Bibliothek das Schema, die Statistiken, die Entitäten (PII / NPI) und mehr. Datenprofile können dann in nachgeschalteten Anwendungen oder Berichten verwendet werden.
Erste Schritte nur wenige Codezeilen (Beispiel CSV):
import json
from dataprofiler import Data , Profiler
data = Data ( "your_file.csv" ) # Auto-Detect & Load: CSV, AVRO, Parquet, JSON, Text, URL
print ( data . data . head ( 5 )) # Access data directly via a compatible Pandas DataFrame
profile = Profiler ( data ) # Calculate Statistics, Entity Recognition, etc
readable_report = profile . report ( report_options = { "output_format" : "compact" })
print ( json . dumps ( readable_report , indent = 4 ))HINWEIS: Der Datenprofiler verfügt über ein vorgebildetes Deep-Lern-Modell, das zur effizienten Identifizierung sensibler Daten (PII / NPI) verwendet wird. Auf Wunsch ist es einfach, dem vorhandenen vorgeborenen Modell neue Entitäten hinzuzufügen oder eine neue Pipeline für die Entitätserkennung einzufügen.
Für die API -Dokumentation besuchen Sie die Dokumentationsseite.
Wenn Sie Vorschläge haben oder einen Fehler finden, öffnen Sie bitte ein Problem.
Wenn Sie einen Beitrag leisten möchten, besuchen Sie die beitragende Seite.
So installieren Sie das vollständige Paket von PYPI : pip install DataProfiler[full]
Wenn Sie die ML -Abhängigkeiten ohne Erstellung von Berichten installieren möchten, verwenden Sie DataProfiler[ml]
Wenn die ML -Anforderungen zu streng sind (z. B. möchten Sie TensorFlow nicht installieren), können Sie ein schlankeres Paket mit DataProfiler[reports] installieren. Das schlankere Paket deaktiviert die standardmäßige sensible Datenerkennung / Entitätserkennung (Labler)
Installieren Sie von PYPI: pip install DataProfiler
Bei dieser Bibliothek ist ein Datenprofil ein Wörterbuch, das Statistiken und Vorhersagen über den zugrunde liegenden Datensatz enthält. Es gibt "Global Statistics" oder global_stats , die Datensatzdaten enthalten, und es gibt "Spalten-/Zeilenebene-Statistiken" oder data_stats (jede Spalte ist ein neuer Schlüsselwerteintrag).
Das Format für ein strukturiertes Profil ist unten:
"global_stats": {
"samples_used": int,
"column_count": int,
"row_count": int,
"row_has_null_ratio": float,
"row_is_null_ratio": float,
"unique_row_ratio": float,
"duplicate_row_count": int,
"file_type": string,
"encoding": string,
"correlation_matrix": list[list[int]], (*)
"chi2_matrix": list[list[float]],
"profile_schema": {
string: list[int]
},
"times": dict[string, float],
},
"data_stats": [
{
"column_name": string,
"data_type": string,
"data_label": string,
"categorical": bool,
"order": string,
"samples": list[str],
"statistics": {
"sample_size": int,
"null_count": int,
"null_types": list[string],
"null_types_index": {
string: list[int]
},
"data_type_representation": dict[string, float],
"min": [null, float, str],
"max": [null, float, str],
"mode": float,
"median": float,
"median_absolute_deviation": float,
"sum": float,
"mean": float,
"variance": float,
"stddev": float,
"skewness": float,
"kurtosis": float,
"num_zeros": int,
"num_negatives": int,
"histogram": {
"bin_counts": list[int],
"bin_edges": list[float],
},
"quantiles": {
int: float
},
"vocab": list[char],
"avg_predictions": dict[string, float],
"data_label_representation": dict[string, float],
"categories": list[str],
"unique_count": int,
"unique_ratio": float,
"categorical_count": dict[string, int],
"gini_impurity": float,
"unalikeability": float,
"precision": {
'min': int,
'max': int,
'mean': float,
'var': float,
'std': float,
'sample_size': int,
'margin_of_error': float,
'confidence_level': float
},
"times": dict[string, float],
"format": string
},
"null_replication_metrics": {
"class_prior": list[int],
"class_sum": list[list[int]],
"class_mean": list[list[int]]
}
}
]
(*) Derzeit wird das Korrelationsmatrix -Update abgeschaltet. Es wird in einem späteren Update zurückgesetzt. Benutzer können es weiterhin wie gewünscht verwenden, wenn die Option Is_Enable auf True gesetzt ist.
Das Format für ein unstrukturiertes Profil ist unten:
"global_stats": {
"samples_used": int,
"empty_line_count": int,
"file_type": string,
"encoding": string,
"memory_size": float, # in MB
"times": dict[string, float],
},
"data_stats": {
"data_label": {
"entity_counts": {
"word_level": dict[string, int],
"true_char_level": dict[string, int],
"postprocess_char_level": dict[string, int]
},
"entity_percentages": {
"word_level": dict[string, float],
"true_char_level": dict[string, float],
"postprocess_char_level": dict[string, float]
},
"times": dict[string, float]
},
"statistics": {
"vocab": list[char],
"vocab_count": dict[string, int],
"words": list[string],
"word_count": dict[string, int],
"times": dict[string, float]
}
}
Das Format für ein Diagrammprofil ist unten:
"num_nodes": int,
"num_edges": int,
"categorical_attributes": list[string],
"continuous_attributes": list[string],
"avg_node_degree": float,
"global_max_component_size": int,
"continuous_distribution": {
"<attribute_1>": {
"name": string,
"scale": float,
"properties": list[float, np.array]
},
"<attribute_2>": None,
...
},
"categorical_distribution": {
"<attribute_1>": None,
"<attribute_2>": {
"bin_counts": list[int],
"bin_edges": list[float]
},
...
},
"times": dict[string, float]
samples_used - Anzahl der Eingangsdatenproben, die zum Generieren dieses Profils verwendet werdencolumn_count - Die Anzahl der im Eingabendatensatz enthaltenen Spalten enthaltenrow_count - Die Anzahl der im Eingabendatensatz enthaltenen Zeilen enthaltenrow_has_null_ratio - Der Anteil der Zeilen, die mindestens einen Nullwert für die Gesamtzahl der Zeilen enthaltenrow_is_null_ratio - Der Anteil der Zeilen, die vollständig aus Nullwerten (Nullzeilen) zur Gesamtzahl der Zeilen bestehenunique_row_ratio - Der Anteil der unterschiedlichen Zeilen im Eingabedatensatz zur Gesamtzahl der Zeilenduplicate_row_count - Die Anzahl der Zeilen, die mehr als einmal im Eingabedatensatz auftretenfile_type - Das Format der Datei mit dem Eingabedatensatz (z. B. .csv)encoding - die Codierung der Datei mit dem Eingabedatensatz (z. B. UTF -8)correlation_matrix - Matrix der Form column_count x column_count , die die Korrelationskoeffizienten zwischen jeder Spalte im Datensatz enthältchi2_matrix - Matrix der Form column_count x column_count , die die Chi -Quadrat -Statistik zwischen jeder Spalte im Datensatz enthältprofile_schema - Eine Beschreibung des Formats des Eingabedatensatzs, das jede Spalte und ihr Index im Datensatz beschriftetstring - Die Beschriftung der fraglichen Spalte und ihr Index im Profilschematimes - die Zeitdauer, die erforderlich war, um die globalen Statistiken für diesen Datensatz in Millisekunden zu generieren column_name - Die Beschriftung/Titel dieser Spalte im Eingabedatensatzdata_type - Der primitive Python -Datentyp, der in dieser Spalte enthalten istdata_label - Die Beschriftung/Entität der Daten in dieser Spalte, die von der Label -Komponente bestimmt wurdecategorical - 'True', wenn diese Spalte kategoriale Daten enthältorder - die Art und Weise, in der die Daten in dieser Spalte, wenn überhaupt, angeordnet sind, ansonsten „zufällig“samples - eine kleine Teilmenge von Dateneinträgen aus dieser Spaltestatistics - Statistische Informationen zur Spaltesample_size - Anzahl der Eingabedatenproben, die zum Generieren dieses Profils verwendet werdennull_count - Die Anzahl der Nulleinträge in der Probenull_types - eine Liste der verschiedenen in diesem Beispiel vorhandenen Null -Typennull_types_index - Ein Diktat, das jeden Null -Typ enthält, und eine jeweilige Liste der Anzeigen, dass es in dieser Stichprobe vorhanden istdata_type_representation - Der Prozentsatz der als jeder data_type identifizierten Stichprobenmin - Mindestwert in der Probemax . Maximaler Wert in der Probemode - Modus der Einträge in der Probemedian - Median der Einträge in der Stichprobemedian_absolute_deviation - die mittlere absolute Abweichung der Einträge in der Stichprobesum - Die Gesamtzahl aller Stichprobenwerte aus der Spaltemean - der Durchschnitt aller Einträge in der Stichprobevariance - Die Varianz aller Einträge in der Probestddev - Die Standardabweichung aller Einträge in der Stichprobeskewness - Die statistische Schiefe aller Einträge in der Stichprobekurtosis - Die statistische Kurtosis aller Einträge in der Stichprobenum_zeros - die Anzahl der Einträge in diesem Beispiel, die den Wert 0 habennum_negatives - die Anzahl der Einträge in dieser Stichprobe, die einen Wert von weniger als 0 habenhistogram - enthält relevante Histogramminformationenbin_counts - die Anzahl der Einträge in jedem Behälterbin_edges - Die Schwellenwerte jedes Behältersquantiles - Der Wert bei jedem Perzentil in der Reihenfolge, die sie basierend auf den Einträgen in der Stichprobe aufgeführt sindvocab - Eine Liste der in den Einträgen in diesem Beispiel verwendeten Zeichenavg_predictions - Durchschnitt der Datenbezeichnungsvorhersageverträge über alle abgetasteten Datenpunkte hinwegcategories - Eine Liste jeder bestimmten Kategorie innerhalb des Beispiels, wenn categorial = 'true'unique_count - Die Anzahl der unterschiedlichen Einträge in der Probeunique_ratio - Der Anteil der Anzahl der unterschiedlichen Einträge in der Stichprobe zur Gesamtzahl der Einträge in der Probecategorical_count - Anzahl der für jede Kategorie abgetasteten Einträge, wenn categorical = 'true'gini_impurity - Maß dafürunalikeability - Ein Wert, der angibt, wie häufig Einträge innerhalb der Probe voneinander unterscheidenprecision - Ein Diktat der Statistik in Bezug auf die Anzahl der Ziffern in einer Zahl für jede Probetimes - die Zeitdauer, die für die Generierung der Statistiken dieser Stichprobe in Millisekunden erforderlich warformat - Liste möglicher DateTime -Formatenull_replication_metrics - Statistiken der Daten, die auf der Grundlage des Spaltenwerts null ist (Index 1 der Listen, auf die von Diktatschlüssel verwiesen wird) oder nicht (Index 0)class_prior - Eine Liste, die die Wahrscheinlichkeit enthält, dass ein Spaltenwert null und nicht null istclass_sum - eine Liste, die die Summe aller anderen Zeilen enthält, basierend darauf, ob der Spaltenwert null ist oder nichtclass_mean - eine Liste, die den Mittelwert aller anderen Zeilen enthält, basierend darauf, ob der Spaltenwert null ist oder nichtsamples_used - Anzahl der Eingangsdatenproben, die zum Generieren dieses Profils verwendet werdenempty_line_count - die Anzahl der leeren Zeilen in den Eingabedatenfile_type - Der Dateityp der Eingabedaten (z. B. .txt)encoding - Dateicodierung der Eingabedatendatei (Ex: UTF -8)memory_size - Größe der Eingabedaten in MBtimes - Zeitdauer dauerte, um dieses Profil in Millisekunden zu generieren data_label - Beschriftungen und Statistiken zu den Beschriftungen der Eingabedatenentity_counts - Die Anzahl der Zeiten, mit denen eine bestimmte Beschriftung oder Entität in den Eingabedaten angezeigt wirdword_level - Die Anzahl der Wörter, die in jeder Etikett oder Entität gezählt wurdentrue_char_level - Die Anzahl der in jeder Etikett oder Entität gezählten Zeichen, wie durch das Modell bestimmtpostprocess_char_level - Die Anzahl der in jeder Etikett oder Entität gezählten Zeichen, die vom Postprozessor bestimmt wirdentity_percentages - Die Prozentsätze jeder Etikette oder Entität innerhalb der Eingabedatenword_level - Der Prozentsatz der Wörter in den Eingabedaten, die in jeder Beschriftung oder Entität enthalten sindtrue_char_level - Der Prozentsatz der Zeichen in den Eingabedaten, die in jeder Etikett oder Entität enthalten sind, wie vom Modell bestimmtpostprocess_char_level - Der Prozentsatz der Zeichen in den Eingabedaten, die in jeder Etikett oder Entität enthalten sind, wie vom Postprozessor bestimmttimes - Die Zeitdauer, die der Datenlabel für die Daten vorherzusagen dauertestatistics - Statistiken der Eingabedatenvocab - Eine Liste jedes Zeichens in den Eingabedatenvocab_count - Die Anzahl der Vorkommen jedes unterschiedlichen Zeichens in den Eingabedatenwords - eine Liste jedes Wortes in den Eingabedatenword_count - Die Anzahl der Vorkommen jedes bestimmten Wortes in den Eingabedatentimes - die Zeitdauer, die erforderlich war, um die Statistiken des Vokabals und der Wörter in Millisekunden zu generierennum_nodes - Anzahl der Knoten in der Grafiknum_edges - Anzahl der Kanten in der Grafikcategorical_attributes - Liste der kategorialen Kantenattributecontinuous_attributes - Liste der kontinuierlichen Kantenattributeavg_node_degree - Durchschnittlicher Knotengrad in der Grafikglobal_max_component_size : Größe der globalen maximalen Komponente <attribute_N> : Name des N-ten-Edge-Attributs in der Liste der Attributename - Name der Verteilung für Attributscale - Negative Log -Wahrscheinlichkeit, die zum Skalieren und Vergleich von Verteilungen verwendet wirdproperties - Liste der statistischen Eigenschaften, die die Verteilung beschreiben <attribute_N> : Name des N-ten-Edge-Attributs in der Liste der Attribute
bin_counts : zählt in jedem Behälter des Verteilungshistogrammsbin_edges : Kanten jedes Behälters des VerteilungshistogrammsZeiten - Zeitdauer dauerte, um dieses Profil in Millisekunden zu generieren
Datentypen werden auf Spaltenebene für strukturierte Daten bestimmt
Datenbezeichnungen werden pro Zelle für strukturierte Daten (Spalte/Zeile, wenn der Profiler verwendet wird) oder auf der Zeichenebene für unstrukturierte Daten bestimmt.
Der Datenprofiler kann die folgenden Daten-/Dateitypen profilieren:
Der Profiler sollte den Dateityp automatisch identifizieren und die Daten in eine Data Class laden.
Zusammen mit anderen Attributtes ermöglicht die Data class über einen gültigen Pandas -Datenframe auf Daten.
# Load a csv file, return a CSVData object
csv_data = Data ( 'your_file.csv' )
# Print the first 10 rows of the csv file
print ( csv_data . data . head ( 10 ))
# Load a parquet file, return a ParquetData object
parquet_data = Data ( 'your_file.parquet' )
# Sort the data by the name column
parquet_data . data . sort_values ( by = 'name' , inplace = True )
# Print the sorted first 10 rows of the parquet data
print ( parquet_data . data . head ( 10 ))
# Load a json file from a URL, return a JSONData object
json_data = Data ( 'https://github.com/capitalone/DataProfiler/blob/main/dataprofiler/tests/data/json/iris-utf-8.json' )Wenn der Dateityp nicht automatisch (selten) identifiziert wird, können Sie diese speziell angeben, siehe Abschnitt Angabe eines Filetyps oder eines Grenzwerters.
Beispiel verwendet zum Beispiel eine CSV -Datei, aber CSV, JSON, AVRO, Parquet oder Text funktionieren ebenfalls.
import json
from dataprofiler import Data , Profiler
# Load file (CSV should be automatically identified)
data = Data ( "your_file.csv" )
# Profile the dataset
profile = Profiler ( data )
# Generate a report and use json to prettify.
report = profile . report ( report_options = { "output_format" : "pretty" })
# Print the report
print ( json . dumps ( report , indent = 4 ))Derzeit ist der Datenprofiler für die Aktualisierung seines Profils in Stapeln ausgestattet.
import json
from dataprofiler import Data , Profiler
# Load and profile a CSV file
data = Data ( "your_file.csv" )
profile = Profiler ( data )
# Update the profile with new data:
new_data = Data ( "new_data.csv" )
profile . update_profile ( new_data )
# Print the report using json to prettify.
report = profile . report ( report_options = { "output_format" : "pretty" })
print ( json . dumps ( report , indent = 4 ))Beachten Sie, dass wenn die Daten, mit denen Sie das Profil aktualisieren, Ganzzahlindizes enthält, die sich mit den ursprünglich profilierten Daten überlappen, wenn Nullzeilen berechnet werden, werden die Indizes auf unbewohnte Werte "verschoben", sodass die Nullzählungen und -verhältnisse immer noch genau sind.
Wenn Sie zwei Dateien mit demselben Schema (aber unterschiedlichen Daten) haben, können Sie die beiden Profile über einen Additionsbetreiber zusammenschließen.
Dies ermöglicht es auch, Profile verteilt zu ermitteln.
import json
from dataprofiler import Data , Profiler
# Load a CSV file with a schema
data1 = Data ( "file_a.csv" )
profile1 = Profiler ( data1 )
# Load another CSV file with the same schema
data2 = Data ( "file_b.csv" )
profile2 = Profiler ( data2 )
profile3 = profile1 + profile2
# Print the report using json to prettify.
report = profile3 . report ( report_options = { "output_format" : "pretty" })
print ( json . dumps ( report , indent = 4 ))Beachten Sie, dass wenn zusammengeführte Profile überlappende Ganzzahlindizes hatten, wenn Nullzeilen berechnet werden, werden die Indizes auf unbewohnte Werte "verschoben", so dass Nullzählungen und Verhältnisse immer noch genau sind.
Um die Änderung zwischen Profilen mit demselben Schema zu finden, können wir die diff -Funktion des Profils verwenden. Der diff liefert die Gesamtdatei- und Stichprobenunterschiede sowie detaillierte Unterschiede in den Statistiken der Daten. Beispielsweise haben numerische Spalten sowohl einen T-Test zur Bewertung der Ähnlichkeit als auch zur Quantifizierung der Verschiebung der Spaltenverteilung (Populationsstabilitätsindex). Weitere Informationen finden Sie im Profiler -Abschnitt der GitHub -Seiten.
Erstellen Sie den Unterschiedsbericht wie diesen:
import json
import dataprofiler as dp
# Load a CSV file
data1 = dp . Data ( "file_a.csv" )
profile1 = dp . Profiler ( data1 )
# Load another CSV file
data2 = dp . Data ( "file_b.csv" )
profile2 = dp . Profiler ( data2 )
diff_report = profile1 . diff ( profile2 )
print ( json . dumps ( diff_report , indent = 4 )) import pandas as pd
import dataprofiler as dp
import json
my_dataframe = pd . DataFrame ([[ 1 , 2.0 ],[ 1 , 2.2 ],[ - 1 , 3 ]])
profile = dp . Profiler ( my_dataframe )
# print the report using json to prettify.
report = profile . report ( report_options = { "output_format" : "pretty" })
print ( json . dumps ( report , indent = 4 ))
# read a specified column, in this case it is labeled 0:
print ( json . dumps ( report [ "data_stats" ][ 0 ], indent = 4 )) Zusätzlich zum strukturierten Profiler bietet DataProfiler ein unstrukturiertes Profiling für das TextData -Objekt oder die Zeichenfolge an. Der unstrukturierte Profiler arbeitet auch mit List [String], PD.Series (String) oder PD.Dataframe (String) angegebener Profiler_Type -Option, das als unstructured angegeben ist. Im Folgenden finden Sie ein Beispiel für den unstrukturierten Profiler mit einer Textdatei.
import dataprofiler as dp
import json
my_text = dp . Data ( 'text_file.txt' )
profile = dp . Profiler ( my_text )
# print the report using json to prettify.
report = profile . report ( report_options = { "output_format" : "pretty" })
print ( json . dumps ( report , indent = 4 )) Ein weiteres Beispiel für den unstrukturierten Profiler mit PD.Series von Strings ist wie unten angegeben, wobei der Profiler Option profiler_type='unstructured'
import dataprofiler as dp
import pandas as pd
import json
text_data = pd . Series ([ 'first string' , 'second string' ])
profile = dp . Profiler ( text_data , profiler_type = 'unstructured' )
# print the report using json to prettify.
report = profile . report ( report_options = { "output_format" : "pretty" })
print ( json . dumps ( report , indent = 4 ))Dataprofiler bietet auch die Möglichkeit, Diagrammdaten aus einer CSV -Datei zu profilieren. Im Folgenden finden Sie ein Beispiel für den Graph -Profiler mit einer CSV -Datei von Diagrammdaten:
import dataprofiler as dp
import pprint
my_graph = dp . Data ( 'graph_file.csv' )
profile = dp . Profiler ( my_graph )
# print the report using pretty print (json dump does not work on numpy array values inside dict)
report = profile . report ()
printer = pprint . PrettyPrinter ( sort_dicts = False , compact = True )
printer . pprint ( report )Besuchen Sie die Dokumentationsseite für weitere Beispiele und API -Details
Sensitive Data Detection with High-Throughput Neural Network Models for Financial Institutions
Authors: Anh Truong, Austin Walters, Jeremy Goodsitt
2020 https://arxiv.org/abs/2012.09597
The AAAI-21 Workshop on Knowledge Discovery from Unstructured Data in Financial Services