
Dataprofiler adalah perpustakaan Python yang dirancang untuk membuat analisis data, pemantauan, dan deteksi data sensitif mudah.
Memuat data dengan perintah tunggal, pustaka secara otomatis memformat & memuat file ke dalam dataframe. Profil data, perpustakaan mengidentifikasi skema, statistik, entitas (PII / NPI) dan banyak lagi. Profil data kemudian dapat digunakan dalam aplikasi atau laporan hilir.
Memulai hanya mengambil beberapa baris kode (contoh 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 ))Catatan: Profiler data dilengkapi dengan model pembelajaran mendalam yang sudah terlatih, yang digunakan untuk mengidentifikasi data sensitif secara efisien (PII / NPI). Jika diinginkan, mudah untuk menambahkan entitas baru ke model pra-terlatih yang ada atau memasukkan seluruh pipa baru untuk pengakuan entitas.
Untuk dokumentasi API, kunjungi halaman dokumentasi.
Jika Anda memiliki saran atau menemukan bug, buka masalah.
Jika Anda ingin berkontribusi, kunjungi halaman yang berkontribusi.
Untuk menginstal paket lengkap dari PYPI : pip install DataProfiler[full]
Jika Anda ingin menginstal dependensi ML tanpa menghasilkan laporan, gunakan DataProfiler[ml]
Jika persyaratan ML terlalu ketat (katakanlah, Anda tidak ingin menginstal TensorFlow), Anda dapat menginstal paket yang lebih ramping dengan DataProfiler[reports] . Paket Slimmer menonaktifkan Deteksi Data / Pengenalan Data Sensitif Default (Labler)
Instal dari PYPI: pip install DataProfiler
Dalam hal perpustakaan ini, profil data adalah kamus yang berisi statistik dan prediksi tentang dataset yang mendasarinya. Ada "statistik global" atau global_stats , yang berisi data tingkat dataset dan ada "statistik tingkat kolom/baris" atau data_stats (setiap kolom adalah entri nilai kunci baru).
Format untuk profil terstruktur di bawah ini:
"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]]
}
}
]
(*) Saat ini pembaruan matriks korelasi diaktifkan. Ini akan diatur ulang dalam pembaruan nanti. Pengguna masih dapat menggunakannya sesuai keinginan dengan opsi IS_ENABLE diatur ke True.
Format untuk profil yang tidak terstruktur di bawah ini:
"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]
}
}
Format untuk profil grafik di bawah ini:
"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 - Jumlah sampel data input yang digunakan untuk menghasilkan profil inicolumn_count - Jumlah kolom yang terkandung dalam dataset inputrow_count - Jumlah baris yang terkandung dalam dataset inputrow_has_null_ratio - proporsi baris yang berisi setidaknya satu nilai nol ke jumlah total barisrow_is_null_ratio - proporsi baris yang sepenuhnya terdiri dari nilai nol (baris nol) ke jumlah total barisunique_row_ratio - proporsi baris berbeda dalam dataset input ke jumlah total barisduplicate_row_count - Jumlah baris yang terjadi lebih dari sekali dalam dataset inputfile_type - Format file yang berisi data input (mis: .csv)encoding - Pengkodean file yang berisi dataset input (mis: UTF -8)correlation_matrix - matriks bentuk column_count x column_count yang berisi koefisien korelasi antara setiap kolom dalam datasetchi2_matrix - matriks bentuk column_count x column_count yang berisi statistik chi -square antara setiap kolom dalam datasetprofile_schema - Deskripsi format dataset input yang melabeli setiap kolom dan indeksnya dalam datasetstring - Label kolom yang dimaksud dan indeksnya dalam skema profiltimes - Durasi waktu yang dibutuhkan untuk menghasilkan statistik global untuk dataset ini dalam milidetik column_name - label/judul kolom ini dalam dataset inputdata_type - tipe data python primitif yang terkandung dalam kolom inidata_label - label/entitas data di kolom ini sebagaimana ditentukan oleh komponen labelercategorical - 'Benar' jika kolom ini berisi data kategorikalorder - Cara data di kolom ini dipesan, jika ada, jika tidak "acak"samples - Subset kecil entri data dari kolom inistatistics - Informasi Statistik di Kolomsample_size - jumlah sampel data input yang digunakan untuk menghasilkan profil ininull_count - jumlah entri nol dalam sampelnull_types - daftar jenis nol yang berbeda yang ada dalam sampel ininull_types_index - Dikt yang berisi masing -masing jenis nol dan daftar masing -masing dari indikasi yang ada dalam sampel inidata_type_representation - persentase sampel yang digunakan mengidentifikasi sebagai masing -masing data_typemin - Nilai minimum dalam sampelmax - Nilai maksimum dalam sampelmode - Mode entri dalam sampelmedian - median entri dalam sampelmedian_absolute_deviation - deviasi absolut median dari entri dalam sampelsum - total semua nilai sampel dari kolommean - rata -rata semua entri dalam sampelvariance - Varians dari semua entri dalam sampelstddev - standar deviasi semua entri dalam sampelskewness - KETINGKATAN STATISTIK SEMUA entri dalam sampelkurtosis - Kurtosis statistik dari semua entri dalam sampelnum_zeros - jumlah entri dalam sampel ini yang memiliki nilai 0num_negatives - Jumlah entri dalam sampel ini yang memiliki nilai kurang dari 0histogram - Berisi histogram informasi yang relevanbin_counts - Jumlah entri di dalam setiap tempat sampahbin_edges - ambang batas masing -masing tempat sampahquantiles - Nilai pada setiap persentil dalam urutan yang terdaftar berdasarkan entri dalam sampelvocab - Daftar karakter yang digunakan dalam entri dalam sampel iniavg_predictions - Rata -rata Konfidensi Prediksi Label Data Di Semua Titik Data Sampelcategories - Daftar setiap kategori berbeda dalam sampel jika categorial = 'true'unique_count - Jumlah entri berbeda dalam sampelunique_ratio - Proporsi jumlah entri berbeda dalam sampel ke jumlah total entri dalam sampelcategorical_count - Jumlah entri yang diambil sampelnya untuk setiap kategori jika categorical = 'true'gini_impurity - Ukur seberapa sering elemen yang dipilih secara acak dari set akan diberi label salah jika diberi label secara acak sesuai dengan distribusi label dalam subsetunalikeability - nilai yang menunjukkan seberapa sering entri berbeda satu sama lain dalam sampelprecision - Dikt Statistik sehubungan dengan jumlah digit dalam angka untuk setiap sampeltimes - durasi waktu yang dibutuhkan untuk menghasilkan statistik sampel ini dalam milidetikformat - Daftar kemungkinan format datetimenull_replication_metrics - statistik data dipartisi berdasarkan apakah nilai kolom null (indeks 1 daftar yang dirujuk oleh tombol dikt) atau tidak (indeks 0)class_prior - daftar yang berisi probabilitas nilai kolom menjadi nol dan bukan nolclass_sum - daftar yang berisi jumlah semua baris lain berdasarkan apakah nilai kolom nol atau tidakclass_mean - daftar yang berisi rata -rata semua baris lain berdasarkan apakah nilai kolom nol atau tidaksamples_used - Jumlah sampel data input yang digunakan untuk menghasilkan profil iniempty_line_count - Jumlah baris kosong dalam data inputfile_type - Jenis file data input (mis: .txt)encoding - Pengkodean file dari file data input (mis: UTF -8)memory_size - Ukuran data input di MBtimes - durasi waktu yang dibutuhkan untuk menghasilkan profil ini dalam milidetik data_label - label dan statistik pada label data inputentity_counts - berapa kali label atau entitas tertentu muncul di dalam data inputword_level - Jumlah kata yang dihitung dalam setiap label atau entitastrue_char_level - jumlah karakter yang dihitung dalam setiap label atau entitas sebagaimana ditentukan oleh modelpostprocess_char_level - jumlah karakter yang dihitung dalam setiap label atau entitas sebagaimana ditentukan oleh postprocessorentity_percentages - Persentase setiap label atau entitas dalam data inputword_level - Persentase kata dalam data input yang terkandung dalam setiap label atau entitastrue_char_level - persentase karakter dalam data input yang terkandung dalam setiap label atau entitas sebagaimana ditentukan oleh modelpostprocess_char_level - persentase karakter dalam data input yang terkandung dalam setiap label atau entitas sebagaimana ditentukan oleh postprocessortimes - durasi waktu yang dibutuhkan labeler data untuk memprediksi pada datastatistics - Statistik data inputvocab - Daftar setiap karakter dalam data inputvocab_count - Jumlah kejadian dari setiap karakter yang berbeda dalam data inputwords - daftar setiap kata dalam data inputword_count - Jumlah kemunculan setiap kata yang berbeda dalam data inputtimes - durasi waktu yang dibutuhkan untuk menghasilkan statistik vocab dan kata -kata dalam milidetiknum_nodes - jumlah node dalam grafiknum_edges - Jumlah tepi dalam grafikcategorical_attributes - Daftar atribut tepi kategorikalcontinuous_attributes - Daftar atribut tepi kontinuavg_node_degree - Tingkat rata -rata node dalam grafikglobal_max_component_size : Ukuran komponen max global <attribute_N> : Nama atribut tepi n-th dalam daftar atributname - Nama Distribusi untuk Atributscale - kemungkinan log negatif yang digunakan untuk skala dan membandingkan distribusiproperties - Daftar Properti Statistik yang Menjelaskan Distribusi <attribute_N> : Nama atribut tepi n-th dalam daftar atribut
bin_counts : Hitungan di setiap nampan histogram distribusibin_edges : tepi setiap nampan histogram distribusikali - durasi waktu yang dibutuhkan untuk menghasilkan profil ini dalam milidetik
Jenis data ditentukan pada tingkat kolom untuk data terstruktur
Label data ditentukan per sel untuk data terstruktur (kolom/baris ketika profiler digunakan) atau pada tingkat karakter untuk data yang tidak terstruktur.
Profiler data dapat membuat profil data/jenis file berikut:
Profiler harus secara otomatis mengidentifikasi jenis file dan memuat data ke Data Class .
Bersamaan dengan atribut lain, Data class memungkinkan data untuk diakses melalui dataframe panda yang valid.
# 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' )Jika jenis file tidak diidentifikasi secara otomatis (jarang), Anda dapat menentukannya secara khusus, lihat bagian yang menentukan filetype atau pembatas.
Contoh menggunakan file CSV misalnya, tetapi CSV, JSON, AVRO, parket atau teks juga berfungsi.
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 ))Saat ini, profiler data diperlengkapi untuk memperbarui profilnya dalam batch.
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 ))Perhatikan bahwa jika data yang Anda perbarui profil dengan berisi indeks integer yang tumpang tindih dengan indeks pada data yang awalnya diprofilkan, ketika baris nol dihitung, indeks akan "bergeser" ke nilai yang tidak berpenghuni sehingga jumlah dan rasio nol masih akurat.
Jika Anda memiliki dua file dengan skema yang sama (tetapi data yang berbeda), dimungkinkan untuk menggabungkan kedua profil bersama melalui operator tambahan.
Ini juga memungkinkan profil ditentukan secara terdistribusi.
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 ))Perhatikan bahwa jika profil gabungan memiliki indeks integer yang tumpang tindih, ketika baris nol dihitung, indeks akan "bergeser" ke nilai yang tidak berpenghuni sehingga jumlah dan rasio nol masih akurat.
Untuk menemukan perubahan antara profil dengan skema yang sama kita dapat memanfaatkan fungsi diff profil. diff akan memberikan perbedaan file dan pengambilan sampel secara keseluruhan serta perbedaan terperinci dari statistik data. Misalnya, kolom numerik memiliki kedua uji-t untuk mengevaluasi kesamaan dan PSI (indeks stabilitas populasi) untuk mengukur pergeseran distribusi kolom. Informasi lebih lanjut dijelaskan di bagian Profiler dari halaman GitHub.
Buat laporan perbedaan seperti ini:
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 )) Selain profiler terstruktur, Dataprofiler menyediakan profil yang tidak terstruktur untuk objek atau string TextData. Profiler yang tidak terstruktur juga berfungsi dengan daftar [String], PD.Series (String) atau PD.DataFrame (String) Opsi Profiler_Type yang ditentukan sebagai unstructured . Di bawah ini adalah contoh profiler yang tidak terstruktur dengan file teks.
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 )) Contoh lain dari profiler yang tidak terstruktur dengan PD.Series string diberikan seperti di bawah ini, dengan opsi 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 juga menyediakan kemampuan untuk profil data grafik dari file CSV. Di bawah ini adalah contoh profiler grafik dengan file CSV data grafik:
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 )Kunjungi halaman dokumentasi untuk contoh tambahan dan detail 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