
DataProfiler عبارة عن مكتبة Python مصممة لجعل تحليل البيانات ومراقبة واكتشاف البيانات الحساسة سهلة.
تحميل البيانات بأمر واحد ، تقوم المكتبة تلقائيًا بتنسيق الملفات وتحميلها في ملف بيانات. تحديد البيانات ، تحدد المكتبة المخطط والإحصاءات والكيانات (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 ))ملاحظة: يأتي Profiler للبيانات بنموذج تعليمي عميق مدرب مسبقًا ، يستخدم لتحديد البيانات الحساسة بكفاءة (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 تحتوي على إحصائيات chi -square بين كل عمود في مجموعة البياناتprofile_schema - وصف لتنسيق مجموعة بيانات الإدخال يصف كل عمود وفهرسه في مجموعة البياناتstring - تسمية العمود المعني وفهرسه في مخطط الملف الشخصيtimes - مدة الوقت التي استغرقتها لإنشاء الإحصاءات العالمية لمجموعة البيانات هذه بالميلي ثانية column_name - تسمية/عنوان هذا العمود في مجموعة بيانات الإدخالdata_type - نوع بيانات Python البدائي الموجود في هذا العمودdata_label - تسمية/كيان البيانات في هذا العمود كما هو محدد بواسطة مكون العلامةcategorical - "صحيح" إذا كان هذا العمود يحتوي على بيانات فئويةorder - الطريقة التي يتم بها طلب البيانات في هذا العمود ، إن وجدت ، وإلا "عشوائي"samples - مجموعة فرعية صغيرة من إدخالات البيانات من هذا العمودstatistics - المعلومات الإحصائية على العمودsample_size - عدد عينات بيانات الإدخال المستخدمة لإنشاء هذا الملف الشخصيnull_count - عدد الإدخالات الفارغة في العينةnull_types - قائمة الأنواع الفارغة المختلفة الموجودة في هذه العينةnull_types_index - مقولة تحتوي على كل نوع فارغ وقائمة ذات صلة من المؤشرات التي كانت موجودة في هذه العينةdata_type_representation - النسبة المئوية للعينات المستخدمة في تحديد كل بيانات _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 - قائمة كل فئة متميزة داخل العينة إذا كانت categorial = "صواب"unique_count - عدد الإدخالات المتميزة في العينةunique_ratio - نسبة عدد الإدخالات المتميزة في العينة إلى العدد الإجمالي للإدخالات في العينةcategorical_count - عدد الإدخالات التي تم أخذ عينات منها لكل فئة إذا categorical = 'true'gini_impurity - مقياس عدد المرات التي سيتم فيها تسمية عنصر تم اختياره عشوائيًا من المجموعة بشكل غير صحيح إذا تم تصنيفه بشكل عشوائي وفقًا لتوزيع الملصقات في المجموعة الفرعيةunalikeability - قيمة تشير إلى مدى اختلاف الإدخالات المتكررة عن بعضها البعض داخل العينةprecision - مقرف الإحصائيات فيما يتعلق بعدد الأرقام في رقم لكل عينةtimes - مدة الوقت الذي استغرقته لإنشاء إحصائيات هذه العينة بالمللي ثانيةformat - قائمة تنسيقات DateTime المحتملةnull_replication_metrics - إحصائيات البيانات المقسمة بناءً على ما إذا كانت قيمة العمود فارغة (الفهرس 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 : حجم مكون Max العالمي <attribute_N> : اسم سمة N-Th Edge في قائمة السماتname - اسم التوزيع للسماتscale - احتمال السجل السلبي المستخدم لتوسيع نطاق التوزيعات ومقارنة التوزيعاتproperties - قائمة الخصائص الإحصائية التي تصف التوزيع <attribute_N> : اسم سمة N-Th Edge في قائمة السمات
bin_counts : التهم في كل صندوق من الرسم البياني التوزيعbin_edges : حواف كل سلة من الرسم البياني التوزيعمرات - مدة الوقت الذي استغرقته لتوليد هذا الملف الشخصي بالمللي ثانية
يتم تحديد أنواع البيانات على مستوى العمود للبيانات المنظمة
يتم تحديد ملصقات البيانات لكل خلية للبيانات المهيكلة (العمود/الصف عند استخدام pfiller ) أو على مستوى الحرف للبيانات غير المنظمة.
يمكن لمفيدة البيانات ملف تعريف أنواع البيانات/الملفات التالية:
يجب على Profiler تحديد نوع الملف تلقائيًا وتحميل البيانات في Data Class .
جنبا إلى جنب مع النسب الأخرى ، تتيح Data class الوصول إلى البيانات من خلال نظام بيانات 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 أو النص أيضًا.
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 ))حاليًا ، تم تجهيز Profiler البيانات لتحديث ملفه الشخصي على دفعات.
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 )) بالإضافة إلى profiler المهيكلة ، يوفر DataProfiler توصيفًا غير منظم لكائن أو سلسلة TextData. يعمل Profiler غير المهيكلة أيضًا مع القائمة [String] أو PD.Series (سلسلة) أو pd.dataframe (سلسلة) بالنظر إلى خيار profiler_type المحدد على أنه unstructured . فيما يلي مثال على profiler غير المهيكلة مع ملف نصي.
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 )) يتم إعطاء مثال آخر على profiler غير المهيكلة مع pd.series من السلاسل على النحو التالي ، مع خيار 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 أيضًا القدرة على تعريف بيانات الرسم البياني من ملف CSV. فيما يلي مثال على Profiler الرسم البياني مع ملف 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