
DataProfiler - это библиотека Python, предназначенная для облегчения анализа данных, мониторинга и конфиденциального обнаружения данных .
Загружая данные с помощью одной команды, библиотека автоматически форматирует и загружает файлы в DataFrame. Профилируя данные, библиотека идентифицирует схему, статистику, объекты (PII / NPI) и многое другое. Затем профили данных могут использоваться в приложениях или отчетах.
Начало работы требует всего несколько строк кода (пример 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 ))Примечание. Профилировщик данных поставляется с предварительно обученной моделью глубокого обучения, используемой для эффективной идентификации конфиденциальных данных (PII / NPI). При желании легко добавить новые объекты в существующую предварительно обученную модель или вставить весь новый конвейер для распознавания сущностей.
Для документации API посетите страницу документации.
Если у вас есть предложения или найдите ошибку, откройте проблему.
Если вы хотите внести свой вклад, посетите страницу.
Чтобы установить полный пакет из PYPI : pip install DataProfiler[full]
Если вы хотите установить зависимости ML без создания отчетов, используйте DataProfiler[ml]
Если требования ML слишком строгие (скажем, вы не хотите устанавливать TensorFlow), вы можете установить более тонкий пакет с DataProfiler[reports] . Пакет более тонкий пакет отключает конфиденциальное обнаружение данных по умолчанию / распознавание объектов (Labler)
Установить из PYPI: pip install DataProfiler
В случае этой библиотеки профиль данных - это словарь, содержащий статистику и прогнозы о базовом наборе данных. Существуют «глобальная статистика» или global_stats , которые содержат данные уровня наборов данных, и существуют «Статистика столбца/уровня строк» или data_stats (каждый столбец является новой записью ключей).
Формат для структурированного профиля ниже:
"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]]
}
}
]
(*) В настоящее время обновление матрицы корреляции переключено. Он будет сброшен в более позднем обновлении. Пользователи все еще могут использовать его по желанию с помощью опции is_enable, установленной в True.
Формат для неструктурированного профиля ниже:
"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]
}
}
Формат для профиля графика ниже:
"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 - Количество образцов входных данных, используемых для генерации этого профиляcolumn_count - количество столбцов, содержащихся в наборе данных вводаrow_count - количество строк, содержащихся в наборе данных вводаrow_has_null_ratio - Доля рядов, которые содержат как минимум одно нулевое значение для общего количества строкrow_is_null_ratio - Доля рядов, которые полностью состоят из нулевых значений (нулевые строки), к общему количеству строкunique_row_ratio - доля отдельных строк в наборе данных ввода к общему количеству строкduplicate_row_count - количество строк, которые встречаются более одного раза в наборе данных вводаfile_type - формат файла, содержащего набор данных ввода (например: .csv)encoding - кодирование файла, содержащего набор данных ввода (например: UTF -8)correlation_matrix - Матрица формы column_count x column_count , содержащий коэффициенты корреляции между каждым столбцом в наборе данныхchi2_matrix - Матрица формы column_count X column_count , содержащая статистику хи -квадрат между каждым столбцом в наборе данныхprofile_schema - описание формата набора данных вводаstring - метка рассматриваемого столбца и его индекс в схеме профиляtimes - продолжительность времени, необходимая для создания глобальной статистики для этого набора данных в миллисекундах column_name - метка/заголовок этого столбца в наборе данных вводаdata_type - примитивный тип данных Python, который содержится в этом столбцеdata_label - метка/объект данных в этом столбце, как определено компонентом меткиcategorical - 'true', если этот столбец содержит категориальные данныеorder - способ, которым данные в этом столбце упорядочены, если таковые имеются, в противном случае «случайный»samples - небольшое подмножество записей данных из этого столбцаstatistics - Статистическая информация о столбцеsample_size - количество образцов входных данных, используемых для генерации этого профиляnull_count - Количество нулевых записей в образцеnull_types - список различных типов нулевых типов, присутствующих в этом образцеnull_types_index - дикт, содержащий каждый тип нуля, и соответствующий список указаний, которые он присутствует в этом образцеdata_type_representation - процент образцов, используемых в качестве каждого DATA_TYPEmin - минимальное значение в образцеmax - максимальное значение в выборкеmode - режим записей в образцеmedian - медиана записей в образцеmedian_absolute_deviation - медианное абсолютное отклонение записей в образцеsum - общая сумма всех выбранных значений из столбцаmean - среднее из всех записей в выборкеvariance - дисперсия всех записей в выборкеstddev - стандартное отклонение всех записей в образцеskewness - статистическая асимметрия всех записей в образцеkurtosis - статистический куртоз всех записей в образцеnum_zeros - количество записей в этом образце, которые имеют значение 0num_negatives - количество записей в этой выборке, которые имеют значение меньше 0histogram - содержит соответствующую гистограмму информациюbin_counts - количество записей в каждом мусорном ведреbin_edges - пороги каждого мусорного ведраquantiles - значение в каждом процентиле в порядке, в котором они перечислены на основе записей в образцеvocab - список персонажей, используемых в записях в этом примереavg_predictions - Среднее значение доверенности прогнозирования метки данных во всех выбранных точках данныхcategories - Список каждой отдельной категории в выборке if categorial = 'true'unique_count - количество отдельных записей в образцеunique_ratio - доля количества отдельных записей в выборке к общему количеству записей в образцеcategorical_count - Количество записей, отобранных для каждой категории, если categorical = 'true'gini_impurity - Мера того, как часто случайно выбранного элемента из набора был бы неправильно помечен, если он был случайным образом помечен в соответствии с распределением меток в подмножествеunalikeability - Значение, обозначающее, как часто записи отличаются друг от друга в выборкеprecision - DICT статистики относительно количества цифр в количестве для каждого образцаtimes - продолжительность времени, необходимой для создания статистики этой выборки в миллисекундахformat - Список возможных форматов DateTimenull_replication_metrics - Статистика данных, разделенные на основе того, является ли значение столбца NULL (индекс 1 списков, на которые ссылается ключи DICT) или нет (индекс 0)class_prior - список, содержащий вероятность того, что значение столбца будет нулевым, а не нольclass_sum - список, содержащий сумму всех других строк на основе того, является ли значение столбца нулевым или нетclass_mean - список, содержащий среднее значение для всех других строк на основе того, является ли значение столбца нулевым или нетsamples_used - Количество образцов входных данных, используемых для генерации этого профиляempty_line_count - количество пустых строк в входных данныхfile_type - тип файла входных данных (например: .txt)encoding - кодирование файла входных данных (например: UTF -8)memory_size - размер входных данных в MBtimes - продолжительность времени, необходимая для создания этого профиля в миллисекундах data_label - Метки и статистика на метках входных данныхentity_counts - количество раз, когда конкретная метка или объект появляются внутри входных данныхword_level - количество слов, подсчитанных в каждой метке или сущностиtrue_char_level - количество символов, подсчитанных в каждой метке или сущности, как определено модельюpostprocess_char_level - количество символов, подсчитанных в каждой метке или сущности, как определено постпроцессоромentity_percentages - проценты каждой метки или сущности в входных данныхword_level - процент слов во входных данных, которые содержатся в каждой метке или объектеtrue_char_level - процент символов в входных данных, которые содержатся в каждой метке или объекте, как определено модельюpostprocess_char_level - процент символов во входных данных, которые содержатся в каждой метке или сущности, как определено постпроцессоромtimes - продолжительность времени, необходимого для того, чтобы этикетка данных предсказала в данныхstatistics - Статистика входных данныхvocab - список каждого символа в входных данныхvocab_count - количество случаев каждого отдельного символа в входных данныхwords - список каждого слова во входных данныхword_count - количество случаев каждого отличного слова во входных данныхtimes - продолжительность времени, необходимая для создания статистики слова и слов и слов в миллисекундахnum_nodes - количество узлов на графикеnum_edges - количество краев на графикеcategorical_attributes - Список категориальных атрибутов краяcontinuous_attributes - список атрибутов непрерывного краяavg_node_degree - Средняя степень узлов на графикеglobal_max_component_size : размер глобального максимального компонента <attribute_N> : Имя атрибута n-th Edge в списке атрибутовname - Имя распределения для атрибутаscale - отрицательная вероятность журнала, используемая для масштабирования и сравнения распределенийproperties - Список статистических свойств, описывающих распределение <attribute_N> : Имя атрибута n-th Edge в списке атрибутов
bin_counts : подсчеты в каждой бункеру гистограммы распределенияbin_edges : края каждой бункера гистограммы распределенияВремя - продолжительность времени, необходимая для создания этого профиля в миллисекундах
Типы данных определяются на уровне столбцов для структурированных данных
Метки данных определяются на ячейку для структурированных данных (столбец/строка при использовании профилируса ) или на уровне символов для неструктурированных данных.
Профилировщик данных может профилировать следующие типы данных/файлов:
Профилировщик должен автоматически идентифицировать тип файла и загружать данные в Data Class .
Наряду с другими атрибутами Data class позволяет получить доступ к действительным DataFrame Pandas.
# 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' )Если тип файла не идентифицирован автоматически (редко), вы можете указать их конкретно, см. Раздел, указанный филетип или разделитель.
Пример использует, например, файл CSV, но также работают CSV, JSON, AVRO, Parquet или 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 ))В настоящее время профилировщик данных оснащен для обновления своего профиля партиями.
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 ))Обратите внимание, что если данные, с которыми вы обновляете профиль, содержат целочисленные индексы, которые перекрываются с показателями, первоначально профилированными данными, при рассчитанности нулевые строки индексы будут «смещены» на необитаемые значения, так что нулевые количества и соотношения все еще являются точными.
Если у вас есть два файла с одной и той же схемой (но разными данными), можно объединить два профиля вместе через оператор добавления.
Это также позволяет определять профили распределенным образом.
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 ))Обратите внимание, что если объединенные профили имели перекрывающиеся целочисленные индексы, когда рассчитываются нулевые строки, индексы будут «смещены» на необитаемые значения, так что нулевые количества и соотношения все еще являются точными.
Для поиска изменения между профилями с той же схемой мы можем использовать функцию diff профиля. diff предоставит общие различия в файлах и отборах, а также подробные различия статистики данных. Например, числовые столбцы имеют как t-критерий для оценки сходства, так и PSI (индекс стабильности популяции) для количественной оценки сдвига распределения столбцов. Более подробная информация описана в разделе Profiler на страницах GitHub.
Создайте разницу отчет таким образом:
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 )) В дополнение к структурированному профилировщику, DataProfiler предоставляет неструктурированное профилирование для объекта или строки TextData. Неструктурированный профилировщик также работает с List [String], Pd.series (String) или P.DataFrame (String) с учетом опции Profiler_type, указанной как unstructured . Ниже приведен пример неструктурированного профилировщика с текстовым файлом.
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 )) Другой пример неструктурированного профилировщика с Pd.series of Strings приведен, как показано ниже, с 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 также предоставляет возможность профилировать графические данные из файла CSV. Ниже приведен пример профилировщика графика с файлом CSV с графом:
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 )Посетите страницу документации для получения дополнительных примеров и деталей 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