Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu öğretici, genel Synthea veri kümesinde semantik bağlantı kullanarak ilişkilerin nasıl algılandığını göstermektedir.
Yeni verilerle çalışırken veya mevcut bir veri modeli olmadan çalışırken, ilişkileri otomatik olarak keşfetmek yararlı olabilir. Bu ilişki algılama aşağıdakilere yardımcı olabilir:
- modeli yüksek düzeyde anlamak,
- keşif veri analizi sırasında daha fazla içgörü elde etmek,
- güncelleştirilmiş verileri veya yeni, gelen verileri doğrulama ve
- verileri temizle
İlişkiler önceden bilinse bile, ilişkiler araması veri modelinin daha iyi anlaşılmasına veya veri kalitesi sorunlarının belirlenmesine yardımcı olabilir.
Bu öğreticide, aralarındaki bağlantıların kolayca takip edebilmesi için yalnızca üç tabloyla denemeler yaptığınız basit bir temel örnekle başlayacaksınız. Daha sonra, daha büyük bir tablo kümesiyle daha karmaşık bir örnek gösterirsiniz.
Bu öğreticide şunların nasıl yapılacağını öğreneceksiniz:
- Semantik bağlantının Python kitaplığının (SemPy) Power BI ile tümleştirmeyi destekleyen ve veri analizini otomatikleştirmeye yardımcı olan bileşenlerini kullanın. Bu bileşenler şunlardır:
- FabricDataFrame - ek anlam bilgileriyle geliştirilmiş pandas benzeri bir yapı.
- Fabric çalışma alanından not defterinize anlamsal modeller çekmek için işlevler.
- Anlamsal modellerinizdeki ilişkileri bulma ve görselleştirmeyi otomatik hale getiren işlevler.
- Birden çok tablo ve bağımlılık içeren anlam modelleri için ilişki bulma işleminin sorunlarını giderin.
Önkoşullar
Microsoft Fabric aboneliği alın. Ya da ücretsiz Microsoft Fabric deneme sürümünekaydolun.
Microsoft Fabrichesabınıza giriş yapın.
Giriş sayfanızın sol alt köşesindeki deneyim değiştiriciyi kullanarak Fabric'e geçin.
- Çalışma alanınızı bulmak ve seçmek için sol gezinti bölmesinden çalışma alanları seçin. Bu çalışma alanı, geçerli çalışma alanınız olur.
Not defterini takip edin
relationships_detection_tutorial.ipynb not defteri bu öğreticiye eşlik eder.
Bu öğretici için eşlik eden not defterini açmak amacıyla sisteminizi veri bilimi öğreticilerine hazırlama başlığındaki yönergeleri izleyerek not defterini çalışma alanınıza aktarın.
Bu sayfadaki kodu kopyalayıp yapıştırmayı tercih ederseniz, yeni bir not defteri oluşturabilirsiniz.
Kod çalıştırmaya başlamadan önce, not defterine bir gölevi eklemenizden emin olun.
Dizüstü bilgisayarı ayarla
Bu bölümde, gerekli modüller ve verilerle bir not defteri ortamı ayarlarsınız.
Not defterindeki
SemPysatır içi yükleme özelliğini kullanarak PyPI'den%pipyükleyin:%pip install semantic-linkDaha sonra ihtiyacınız olacak SemPy modüllerinin gerekli içeri aktarmalarını gerçekleştirin:
import pandas as pd from sempy.samples import download_synthea from sempy.relationships import ( find_relationships, list_relationship_violations, plot_relationship_metadata )Çıktı biçimlendirmeye yardımcı olan bir yapılandırma seçeneğini zorlamak için pandas'ı içeri aktar:
import pandas as pd pd.set_option('display.max_colwidth', None)Örnek verileri çekin. Bu eğitimde, sentetik tıbbi kayıtların Synthea veri kümesinin (küçük sürümü basitlik için) versiyonunu kullanırsınız.
download_synthea(which='small')
Synthea tablolarının küçük bir alt kümesindeki ilişkileri algılama
Daha büyük bir kümeden üç tablo seçin:
-
patientshasta bilgilerini belirtir -
encounters, tıbbi karşılaşmaları olan hastaları belirtir (örneğin, tıbbi randevu, prosedür) -
providershangi sağlık hizmeti sağlayıcılarının hastalarla ilgilendiğini belirtir
encounterstablosu,patientsileprovidersarasındaki çoka çok ilişkisini çözer ve ilişkisel varlıkolarak tanımlanabilir.patients = pd.read_csv('synthea/csv/patients.csv') providers = pd.read_csv('synthea/csv/providers.csv') encounters = pd.read_csv('synthea/csv/encounters.csv')-
SemPy'nin
find_relationshipsişlevini kullanarak tablolar arasındaki ilişkileri bulun:suggested_relationships = find_relationships([patients, providers, encounters]) suggested_relationshipsSemPy'nin
plot_relationship_metadataişlevini kullanarak DataFrame ilişkilerini grafik olarak görselleştirin.plot_relationship_metadata(suggested_relationships)İşlev, çıkıştaki "from" ve "to" tablolarına karşılık gelen ilişki hiyerarşisini sol taraftan sağ tarafa doğru düzenler. Başka bir deyişle, sol taraftaki bağımsız "from" tabloları, sağ taraftaki "to" bağımlılık tablolarına işaret etmek için yabancı anahtarlarını kullanır. Her bir varlık kutusu, bir ilişkinin "giden" veya "gelen" tarafına katılan sütunları gösterir.
Varsayılan olarak, ilişkiler "m:1" ("1:m" veya "1:1" olarak oluşturulmaz) olarak oluşturulur. "1:1" ilişkileri, eşlenen değerlerin tüm değerlere oranının yalnızca bir veya iki yönde
coverage_thresholdaşıp aşmamalarına bağlı olarak bir veya iki şekilde oluşturulabilir. Bu eğitimde ilerleyen bölümlerde "m:m" ilişkilerinin nadir görülen durumlarını ele alıyoruz.
İlişki algılama sorunlarını giderme
Temel örnekte temiz Synthea verilerinde başarılı bir ilişki algılama gösterilmektedir. Uygulamada, veriler nadiren temizdir ve bu da başarılı algılamayı önler. Veriler temiz olmadığında yararlı olabilecek çeşitli teknikler vardır.
Bu öğreticinin bu bölümü, anlam modeli kirli veriler içerdiğinde ilişki algılamayı ele alır.
"Kirli" verileri almak için özgün DataFrame'leri işleyerek başlayın ve kirli verilerin boyutunu yazdırın.
# create a dirty 'patients' dataframe by dropping some rows using head() and duplicating some rows using concat() patients_dirty = pd.concat([patients.head(1000), patients.head(50)], axis=0) # create a dirty 'providers' dataframe by dropping some rows using head() providers_dirty = providers.head(5000) # the dirty dataframes have fewer records than the clean ones print(len(patients_dirty)) print(len(providers_dirty))Karşılaştırma için, özgün tabloların boyutlarını yazdırın:
print(len(patients)) print(len(providers))SemPy'nin
find_relationshipsişlevini kullanarak tablolar arasındaki ilişkileri bulun:find_relationships([patients_dirty, providers_dirty, encounters])Kodun çıktısı, "kirli" bir anlam modeli oluşturmak için daha önce yaptığınız hatalar nedeniyle herhangi bir ilişkinin algılanmadığını gösteriyor.
Doğrulamayı kullanma
Doğrulama, aşağıdakilerden dolayı ilişki algılama hatalarını gidermek için en iyi araçtır:
- Belirli bir ilişkinin neden Yabancı Anahtar kurallarına uymadığı ve bu nedenle algılanamadığına ilişkin net bir şekilde bildirir.
- Yalnızca bildirilen ilişkilere odaklandığı ve arama gerçekleştirmediği için büyük anlamsal modellerle hızlı çalışır.
Doğrulama, find_relationshipstarafından oluşturulana benzer sütunlara sahip herhangi bir DataFrame kullanabilir. Aşağıdaki kodda, suggested_relationships DataFrame patientsyerine patients_dirty'e atıfta bulunur, ancak DataFrame'lere bir sözlükle farklı isimler verebilirsiniz:
dirty_tables = {
"patients": patients_dirty,
"providers" : providers_dirty,
"encounters": encounters
}
errors = list_relationship_violations(dirty_tables, suggested_relationships)
errors
Arama ölçütlerini gevşetme
Daha bulanık senaryolarda arama ölçütlerinizi gevşetmeyi deneyebilirsiniz. Bu yöntem hatalı pozitif olasılığını artırır.
include_many_to_many=Trueayarlayın ve yardımcı olup olmadığını değerlendirin:find_relationships(dirty_tables, include_many_to_many=True, coverage_threshold=1)Sonuçlar,
encountersilepatientsilişkisinin algılandığını gösterir, ancak iki sorun vardır:- İlişki, beklenen ilişkinin tersi olan
patients'danencounters'e bir yön gösterir. Bunun nedeni, tümpatientsveencounters(Coverage From1,0) tarafından kapsanmış olmasıdır; iseencounters, hastaların satırları eksik olduğundan sadece kısmenpatients(Coverage To= 0,85) tarafından kapsanmaktadır. - Düşük kardinalite
GENDERsütununda yanlışlıkla bir eşleşme oluşmuştur ve bu her iki tabloda da isim ve değer açısından eşleşir, ancak bu ilgi çekici bir "m:1" ilişkisi değildir. Düşük kardinalite,Unique Count FromveUnique Count Tosütunlarıyla gösterilir.
- İlişki, beklenen ilişkinin tersi olan
Sadece "m:1" ilişkilerini aramak için
find_relationshipstekrar çalıştırın, ancak daha düşük bircoverage_threshold=0.5ile:find_relationships(dirty_tables, include_many_to_many=False, coverage_threshold=0.5)Sonuç,
encountersileprovidersarasındaki ilişkilerin doğru yönünü gösterir. Ancak,encountersbenzersiz olmadığındanpatientsilepatientsarasındaki ilişki algılanamaz, bu nedenle "m:1" ilişkisinin "Bir" tarafında olamaz.hem
include_many_to_many=Truehem decoverage_threshold=0.5gevşetin:find_relationships(dirty_tables, include_many_to_many=True, coverage_threshold=0.5)Artık her iki ilgi ilişkisi de görünür durumdadır, ancak çok daha fazla gürültü vardır:
-
GENDERüzerinde bir düşük kardinalite eşleşmesi mevcut. -
ORGANIZATIONüzerinde daha yüksek kardinaliteye sahip bir "m:m" eşleşmesi ortaya çıktı ve bu,ORGANIZATION'in her iki tabloya da denormalize edilmiş bir sütun olduğunu gösterir.
-
Sütun adlarını eşleştir
Varsayılan olarak SemPy, veritabanı tasarımcılarının ilgili sütunları genellikle aynı şekilde adlandırmalarından yararlanarak yalnızca ad benzerliğini gösteren özniteliklerle eşleşir. Bu davranış, en sık düşük kardinaliteli tamsayı anahtarlarıyla oluşan sahte ilişkileri önlemeye yardımcı olur. Örneğin, 1,2,3,...,10 ürün kategorisi ve 1,2,3,...,10 sipariş durumu kodu varsa, yalnızca sütun adlarını hesaba katmadan değer eşlemelerine bakarken birbirleriyle karıştırılırlar. Yanlış ilişkiler GUID gibi anahtarlarla ilgili bir sorun olmamalıdır.
SemPy, sütun adları ile tablo adları arasındaki benzerliğe bakar. Eşleştirme yaklaşık olup büyük/küçük harfe duyarlı değildir. "id", "code", "name", "key", "pk", "fk" gibi en sık karşılaşılan "dekoratör" alt dizelerini yoksayar. Sonuç olarak, en tipik eşleşme durumları şunlardır:
- 'foo' varlığındaki 'column' adlı öznitelik, 'bar' varlığındaki 'column' (aynı zamanda 'COLUMN' veya 'Column') adlı bir öznitelikle eşleşir.
- 'foo' varlığındaki 'column' adlı bir öznitelik, 'bar' içindeki 'column_id' adlı bir öznitelikle eşleşir.
- 'foo' varlığındaki 'bar' adlı bir öznitelik, 'bar' içindeki 'code' adlı bir öznitelikle eşleşir.
Önce sütun adlarını eşleştirerek algılama daha hızlı çalışır.
Sütun adlarını eşleştirin:
- Daha fazla değerlendirme için hangi sütunların seçildiğini anlamak için
verbose=2seçeneğini kullanın (verbose=1yalnızca işlenen varlıkları listeler). -
name_similarity_thresholdparametresi sütunların nasıl karşılaştırılmasını belirler. 1 eşiği, sadece 100% eşleşmesiyle ilgilendiğinizi gösterir.
find_relationships(dirty_tables, verbose=2, name_similarity_threshold=1.0);100% benzerlikle çalıştırma işlemi, adlar arasındaki küçük farkları hesaba katmıyor. Örneğinizde, tabloların "s" soneki olan çoğul bir formu vardır ve bu da tam eşleşmeye neden olmaz. Bu, varsayılan
name_similarity_threshold=0.8ile iyi yönetilir.- Daha fazla değerlendirme için hangi sütunların seçildiğini anlamak için
Varsayılan
name_similarity_threshold=0.8ile yeniden çalıştırın:find_relationships(dirty_tables, verbose=2, name_similarity_threshold=0.8);Dikkat edin ki çoğul form
patientskimliği (ID), yürütme süresine gereksiz karşılaştırmalar eklemeden artık tekilpatientile karşılaştırılmaktadır.Varsayılan
name_similarity_threshold=0ile yeniden çalıştırın:find_relationships(dirty_tables, verbose=2, name_similarity_threshold=0);name_similarity_threshold0 olarak değiştirmek diğer aşırılıktır ve tüm sütunları karşılaştırmak istediğinizi gösterir. Bu nadiren gereklidir ve daha fazla yürütme süresine ve gözden geçirilmesi gereken sahte eşleşmelere neden olur. Ayrıntılı çıktıdaki karşılaştırma sayısını gözlemleyin.
Sorun giderme ipuçlarının özeti
- "m:1" ilişkileri için tam eşleşmeden başlayın (yani varsayılan
include_many_to_many=Falsevecoverage_threshold=1.0). Bu genellikle istediğiniz şey. - Tabloların daha küçük alt kümelerinde dar bir odak kullanın.
- Veri kalitesi sorunlarını algılamak için doğrulamayı kullanın.
- İlişki için hangi sütunların dikkate alındığını anlamak istiyorsanız
verbose=2kullanın. Bu, büyük miktarda çıkışa neden olabilir. - Arama kriterlerinin ödünlerine dikkat edin.
include_many_to_many=Truevecoverage_threshold<1.0, analiz edilmesi zor olabilecek ve filtrelenmiş olması gerekebilecek sahte ilişkiler üretebilir.
Tam Synthea veri kümesindeki ilişkileri algılama
Basit temel örnek, kullanışlı bir öğrenme ve sorun giderme aracıydı. Uygulamada, çok daha fazla tablo içeren tam Synthea veri kümesi gibi bir anlam modelinden başlayabilirsiniz. Tam synthea veri kümesini aşağıda gösterildiği gibi keşfedin.
synthea/csv dizinindeki tüm dosyaları okuyun:
all_tables = { "allergies": pd.read_csv('synthea/csv/allergies.csv'), "careplans": pd.read_csv('synthea/csv/careplans.csv'), "conditions": pd.read_csv('synthea/csv/conditions.csv'), "devices": pd.read_csv('synthea/csv/devices.csv'), "encounters": pd.read_csv('synthea/csv/encounters.csv'), "imaging_studies": pd.read_csv('synthea/csv/imaging_studies.csv'), "immunizations": pd.read_csv('synthea/csv/immunizations.csv'), "medications": pd.read_csv('synthea/csv/medications.csv'), "observations": pd.read_csv('synthea/csv/observations.csv'), "organizations": pd.read_csv('synthea/csv/organizations.csv'), "patients": pd.read_csv('synthea/csv/patients.csv'), "payer_transitions": pd.read_csv('synthea/csv/payer_transitions.csv'), "payers": pd.read_csv('synthea/csv/payers.csv'), "procedures": pd.read_csv('synthea/csv/procedures.csv'), "providers": pd.read_csv('synthea/csv/providers.csv'), "supplies": pd.read_csv('synthea/csv/supplies.csv'), }SemPy'nin
find_relationshipsişlevini kullanarak tablolar arasındaki ilişkileri bulun:suggested_relationships = find_relationships(all_tables) suggested_relationshipsİlişkileri görselleştirme:
plot_relationship_metadata(suggested_relationships)Kaç yeni "m:m" ilişkisi
include_many_to_many=Trueile keşfedilecek, sayın. Bu ilişkiler, daha önce gösterilen "m:1" ilişkilerine ek olarak, bu nedenle,multiplicityüzerinde filtreleme yapmanız gerekir.suggested_relationships = find_relationships(all_tables, coverage_threshold=1.0, include_many_to_many=True) suggested_relationships[suggested_relationships['Multiplicity']=='m:m']İlişki verilerini çeşitli sütunlara göre sıralayarak bunların doğasını daha iyi anlayabilirsiniz. Örneğin, çıktıyı
Row Count Fromve en büyük tabloları tanımlamaya yardımcı olanRow Count Togöre sıralamayı seçebilirsiniz.suggested_relationships.sort_values(['Row Count From', 'Row Count To'], ascending=False)Farklı bir anlam modelinde,
Null Count FromveyaCoverage Tonull değer sayısına odaklanmak önemli olabilir.Bu analiz, ilişkilerden herhangi birinin geçersiz olup olmadığını ve bunları aday listesinden kaldırmanız gerekip gerekmediğini anlamanıza yardımcı olabilir.
İlgili içerik
Anlamsal bağlantı / SemPy için diğer öğreticilere göz atın: