
DataproFiler es una biblioteca de Python diseñada para facilitar el análisis de datos, el monitoreo y la detección de datos confidencial .
Cargando datos con un solo comando, la biblioteca formatea automáticamente y carga los archivos en un DataFrame. Perfilando los datos, la biblioteca identifica el esquema, las estadísticas, las entidades (PII / NPI) y más. Los perfiles de datos se pueden usar en aplicaciones o informes posteriores.
Comenzar solo requiere algunas líneas de código (ejemplo 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 ))Nota: El Profiler de datos viene con un modelo de aprendizaje profundo previamente capacitado, utilizado para identificar eficientemente datos confidenciales (PII / NPI). Si lo desea, es fácil agregar nuevas entidades al modelo previamente capacitado existente o insertar una nueva tubería completa para el reconocimiento de entidades.
Para la documentación de la API, visite la página de documentación.
Si tiene sugerencias o encuentra un error, abra un problema.
Si desea contribuir, visite la página contribuyente.
Para instalar el paquete completo desde PYPI : pip install DataProfiler[full]
Si desea instalar las dependencias de ML sin generar informes, use DataProfiler[ml]
Si los requisitos de ML son demasiado estrictos (por ejemplo, no desea instalar TensorFlow), puede instalar un paquete más delgado con DataProfiler[reports] . El paquete más delgado deshabilita el reconocimiento de detección / entidad sensible predeterminado (LABLER)
Instalar desde PYPI: pip install DataProfiler
En el caso de esta biblioteca, un perfil de datos es un diccionario que contiene estadísticas y predicciones sobre el conjunto de datos subyacente. Existen "estadísticas globales" o global_stats , que contienen datos de nivel de conjunto de datos y hay "estadísticas de nivel de columna/fila" o data_stats (cada columna es una nueva entrada de valor clave).
El formato para un perfil estructurado está a continuación:
"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]]
}
}
]
(*) Actualmente, la actualización de la matriz de correlación se apaga. Se restablecerá en una actualización posterior. Los usuarios aún pueden usarlo como se desea con la opción IS_ENABLE establecida en True.
El formato para un perfil no estructurado está a continuación:
"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]
}
}
El formato para un perfil de gráfico está a continuación:
"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 - Número de datos de entrada Muestras utilizadas para generar este perfilcolumn_count : el número de columnas contenidas en el conjunto de datos de entradarow_count : el número de filas contenidas en el conjunto de datos de entradarow_has_null_ratio : la proporción de filas que contienen al menos un valor nulo al número total de filasrow_is_null_ratio - La proporción de filas que están completamente compuestas de valores nulos (filas nulas) al número total de filasunique_row_ratio : la proporción de filas distintas en el conjunto de datos de entrada al número total de filasduplicate_row_count : el número de filas que ocurren más de una vez en el conjunto de datos de entradafile_type : el formato del archivo que contiene el conjunto de datos de entrada (ex: .csv)encoding : la codificación del archivo que contiene el conjunto de datos de entrada (Ej: UTF -8)correlation_matrix : matriz de forma column_count x column_count que contiene los coeficientes de correlación entre cada columna en el conjunto de datoschi2_matrix - matriz de forma column_count x column_count que contiene las estadísticas de chi -cuadrado entre cada columna en el conjunto de datosprofile_schema : una descripción del formato del conjunto de datos de entrada etiquetando cada columna y su índice en el conjunto de datosstring : la etiqueta de la columna en cuestión y su índice en el esquema de perfiltimes : la duración del tiempo que se necesitó para generar las estadísticas globales para este conjunto de datos en milisegundos column_name : la etiqueta/título de esta columna en el conjunto de datos de entradadata_type : el tipo de datos de pitón primitivo que está contenido en esta columnadata_label : la etiqueta/entidad de los datos en esta columna según lo determinado por el componente de etiquetadorcategorical - 'verdadero' si esta columna contiene datos categóricosorder : la forma en que se ordenan los datos en esta columna, si los hay, de lo contrario "aleatorio"samples : un pequeño subconjunto de entradas de datos desde esta columnastatistics - Información estadística en la columnasample_size : número de muestras de datos de entrada utilizadas para generar este perfilnull_count : el número de entradas nulas en la muestranull_types : una lista de los diferentes tipos nulos presentes dentro de esta muestranull_types_index : un dict que contiene cada tipo nulo y una lista respectiva de los indicios de que está presente dentro de esta muestradata_type_representation : el porcentaje de muestras utilizadas identificando como cada data_typemin - Valor mínimo en la muestramax - valor máximo en la muestramode : modo de las entradas en la muestramedian - mediana de las entradas en la muestramedian_absolute_deviation : la desviación absoluta mediana de las entradas en la muestrasum - El total de todos los valores muestreados de la columnamean : el promedio de todas las entradas en la muestravariance : la varianza de todas las entradas en la muestrastddev : la desviación estándar de todas las entradas en la muestraskewness : la asimetría estadística de todas las entradas en la muestrakurtosis : la curtosis estadística de todas las entradas en la muestranum_zeros : el número de entradas en esta muestra que tienen el valor 0num_negatives : el número de entradas en esta muestra que tienen un valor inferior a 0histogram : contiene información relevante de histogramabin_counts : el número de entradas dentro de cada contenedorbin_edges : los umbrales de cada contenedorquantiles : el valor en cada percentil en el orden en que se enumeran en función de las entradas en la muestravocab : una lista de los personajes utilizados dentro de las entradas en esta muestraavg_predictions : promedio de las confidencias de predicción de la etiqueta de datos en todos los puntos de datos muestreadoscategories : una lista de cada categoría distinta dentro de la muestra si categorial = 'verdadero'unique_count : el número de entradas distintas en la muestraunique_ratio : la proporción del número de entradas distintas en la muestra al número total de entradas en la muestracategorical_count : número de entradas muestreadas para cada categoría si categorical = 'verdadero'gini_impurity : medida de la frecuencia con la que un elemento elegido al azar del conjunto se etiquetaría incorrectamente si se etiquetara al azar de acuerdo con la distribución de etiquetas en el subconjuntounalikeability : un valor que denota la frecuencia con la que las entradas difieren entre sí dentro de la muestraprecision : un dictado de estadísticas con respecto al número de dígitos en un número para cada muestratimes : la duración del tiempo que se necesitó para generar las estadísticas de esta muestra en milisegundosformat - Lista de posibles formatos de fecha y horanull_replication_metrics : estadísticas de datos divididas en función de si el valor de la columna es nulo (índice 1 de las listas a las referencias por claves de dict) o no (índice 0)class_prior : una lista que contiene la probabilidad de que un valor de columna sea nulo y no nuloclass_sum : una lista que contiene una suma de todas las demás filas basadas en si el valor de la columna es nulo o noclass_mean : una lista que contiene una media de todas las demás filas en función de si el valor de la columna es nulo o nosamples_used - Número de datos de entrada Muestras utilizadas para generar este perfilempty_line_count : el número de líneas vacías en los datos de entradafile_type : el tipo de archivo de los datos de entrada (ex: .txt)encoding : codificación de archivo del archivo de datos de entrada (ex: UTF -8)memory_size - Tamaño de los datos de entrada en MBtimes : duración del tiempo que se necesitó para generar este perfil en milisegundos data_label : etiquetas y estadísticas sobre las etiquetas de los datos de entradaentity_counts : el número de veces que aparece una etiqueta o entidad específica dentro de los datos de entradaword_level : el número de palabras contadas dentro de cada etiqueta o entidadtrue_char_level : el número de caracteres contados dentro de cada etiqueta o entidad según lo determine el modelopostprocess_char_level : el número de caracteres contados dentro de cada etiqueta o entidad según lo determine el postprocesadorentity_percentages : los porcentajes de cada etiqueta o entidad dentro de los datos de entradaword_level : el porcentaje de palabras en los datos de entrada que están contenidos dentro de cada etiqueta o entidadtrue_char_level : el porcentaje de caracteres en los datos de entrada que están contenidos dentro de cada etiqueta o entidad según lo determine el modelopostprocess_char_level : el porcentaje de caracteres en los datos de entrada que están contenidos dentro de cada etiqueta o entidad según lo determine el postprocesadortimes : la duración del tiempo que le tomó al etiquetador de datos predecir en los datosstatistics : estadísticas de los datos de entradavocab : una lista de cada personaje en los datos de entradavocab_count : el número de ocurrencias de cada carácter distinto en los datos de entradawords : una lista de cada palabra en los datos de entradaword_count : el número de ocurrencias de cada palabra distinta en los datos de entradatimes : la duración del tiempo que se necesitó para generar las estadísticas de vocabulario y palabras en milisegundosnum_nodes - número de nodos en el gráficonum_edges - número de bordes en el gráficocategorical_attributes - Lista de atributos de borde categóricocontinuous_attributes - lista de atributos de borde continuoavg_node_degree - Grado promedio de nodos en el gráficoglobal_max_component_size : tamaño del componente Global Max <attribute_N> : Nombre del atributo N-th Edge en la lista de atributosname - Nombre de la distribución para el atributoscale : la probabilidad negativa del registro se utiliza para escalar y comparar distribucionesproperties : lista de propiedades estadísticas que describen la distribución <attribute_N> : Nombre del atributo N-th Edge en la lista de atributos
bin_counts : cuenta en cada contenedor del histograma de distribuciónbin_edges : bordes de cada contenedor del histograma de distribuciónTimes: duración del tiempo que se necesitó para generar este perfil en milisegundos
Los tipos de datos se determinan a nivel de columna para datos estructurados
Las etiquetas de datos se determinan por celda para datos estructurados (columna/fila cuando se usa el perfilador ) o a nivel de caracteres para datos no estructurados.
El perfilador de datos puede perfilar los siguientes tipos de datos/archivos:
El Profiler debe identificar automáticamente el tipo de archivo y cargar los datos en una Data Class .
Junto con otros atributos, la Data class permite acceder a los datos a través de un marco de datos PANDAS válido.
# 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' )Si el tipo de archivo no se identifica automáticamente (raro), puede especificarlo específicamente, consulte la sección especificando un tipo de archivo o delimitador.
El ejemplo usa un archivo CSV, por ejemplo, pero también funcionan CSV, JSON, Avro, Parquet o Text.
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 ))Actualmente, el Profiler de datos está equipado para actualizar su perfil en lotes.
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 ))Tenga en cuenta que si los datos con los que actualiza el perfil contienen índices enteros que se superponen con los índices en los datos perfilados originalmente, cuando se calculan las filas nulas, los índices se "desplazarán" a valores deshabitados para que los recuentos y relaciones nulos aún sean precisos.
Si tiene dos archivos con el mismo esquema (pero datos diferentes), es posible fusionar los dos perfiles a través de un operador de adición.
Esto también permite que los perfiles se determinen de manera distribuida.
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 ))Tenga en cuenta que si los perfiles fusionados tenían índices enteros superpuestos, cuando se calculan las filas nulas, los índices se "desplazarán" a valores deshabitados para que los recuentos nulos y las proporciones aún sean precisos.
Para encontrar el cambio entre perfiles con el mismo esquema, podemos utilizar la función diff del perfil. El diff proporcionará diferencias generales de archivo y muestreo, así como diferencias detalladas de las estadísticas de los datos. Por ejemplo, las columnas numéricas tienen la prueba t para evaluar la similitud y el PSI (índice de estabilidad de la población) para cuantificar el cambio de distribución de columnas. Se describe más información en la sección Profiler de las páginas de GitHub.
Crea el informe de diferencia como este:
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 )) Además del perfilador estructurado, DataproFiler proporciona perfiles no estructurados para el objeto o cadena de datos textuales. El Profiler no estructurado también funciona con List [String], PD.Series (String) o Pd.DataFrame (String) dada la opción Profiler_Type especificada como unstructured . A continuación se muestra un ejemplo del Profiler no estructurado con un archivo de texto.
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 )) Otro ejemplo del Profiler no estructurado con PD.Series of Strings se da como se muestra a continuación, con la opción Profiler 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 también proporciona la capacidad de perfilar datos gráficos de un archivo CSV. A continuación se muestra un ejemplo del perfilador de gráficos con un archivo CSV de datos gráficos:
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 )Visite la página de documentación para ver ejemplos adicionales y detalles de la API
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