Kurz: Zjišťování relací v datové sadě Synthea pomocí sémantického odkazu
Tento kurz ukazuje, jak pomocí sémantického odkazu rozpoznat relace ve veřejné datové sadě Synthea .
Když pracujete s novými daty nebo pracujete bez existujícího datového modelu, může být užitečné automaticky zjišťovat relace. Toto zjišťování relací vám může pomoct:
- porozumět modelu na vysoké úrovni,
- získání dalších přehledů při průzkumné analýze dat,
- ověření aktualizovaných dat nebo nových, příchozích dat a
- vyčistit data.
I když jsou relace známé předem, může vyhledávání relací pomoct lépe porozumět datovému modelu nebo identifikaci problémů s kvalitou dat.
V tomto kurzu začnete jednoduchým příkladem směrného plánu, ve kterém experimentujete pouze se třemi tabulkami, aby bylo snadné sledovat propojení mezi nimi. Pak zobrazíte složitější příklad s větší sadou tabulek.
V tomto kurzu se naučíte:
- Používejte komponenty sémantické knihovny Pythonu (SemPy), které podporují integraci s Power BI a pomáhají automatizovat analýzu dat. Mezi tyto komponenty patří:
- FabricDataFrame – struktura podobná knihovně pandas rozšířená o další sémantické informace.
- Funkce pro načítání sémantických modelů z pracovního prostoru Fabric do poznámkového bloku
- Funkce, které automatizují zjišťování a vizualizaci relací v sémantických modelech
- Řešení potíží s procesem zjišťování relací pro sémantické modely s více tabulkami a vzájemnými závislostmi
Požadavky
Získejte předplatné Microsoft Fabric. Nebo si zaregistrujte bezplatnou zkušební verzi Microsoft Fabricu.
Přihlaste se k Microsoft Fabric.
Pomocí přepínače prostředí na levé straně domovské stránky přepněte na prostředí Synapse Datová Věda.
- V levém navigačním podokně vyberte Pracovní prostory , abyste našli a vybrali pracovní prostor. Tento pracovní prostor se stane vaším aktuálním pracovním prostorem.
Sledování v poznámkovém bloku
Tento kurz doprovází poznámkový blok relationships_detection_tutorial.ipynb .
Pokud chcete otevřít doprovodný poznámkový blok pro tento kurz, postupujte podle pokynů v části Příprava systému na kurzy datových věd a importujte poznámkový blok do pracovního prostoru.
Pokud byste raději zkopírovali a vložili kód z této stránky, můžete vytvořit nový poznámkový blok.
Než začnete spouštět kód, nezapomeňte k poznámkovému bloku připojit lakehouse.
Nastavení poznámkového bloku
V této části nastavíte prostředí poznámkového bloku s potřebnými moduly a daty.
Nainstalujte
SemPy
z PyPI pomocí%pip
možnosti in-line instalace v poznámkovém bloku:%pip install semantic-link
Proveďte nezbytné importy modulů SemPy, které budete potřebovat později:
import pandas as pd from sempy.samples import download_synthea from sempy.relationships import ( find_relationships, list_relationship_violations, plot_relationship_metadata )
Import knihovny pandas pro vynucování možnosti konfigurace, která pomáhá s formátováním výstupu:
import pandas as pd pd.set_option('display.max_colwidth', None)
Stáhněte si ukázková data. Pro účely tohoto kurzu použijete datovou sadu Synthea syntetických lékařských záznamů (pro jednoduchost malou verzi):
download_synthea(which='small')
Detekce relací v malé podmnožině tabulek Synthea
Vyberte tři tabulky z větší sady:
patients
určuje informace o pacientech.encounters
určuje pacienty, kteří měli zdravotní setkání (například lékařskou schůzku, proceduru).providers
určuje, kteří poskytovatelé zdravotní péče se zúčastnili pacientů
Tabulka
encounters
řeší relaci M:N mezipatients
relacemi aproviders
lze ji popsat jako asociativní entitu:patients = pd.read_csv('synthea/csv/patients.csv') providers = pd.read_csv('synthea/csv/providers.csv') encounters = pd.read_csv('synthea/csv/encounters.csv')
K vyhledání relací mezi tabulkami použijte funkci SemPy
find_relationships
:suggested_relationships = find_relationships([patients, providers, encounters]) suggested_relationships
Vizualizujte datový rámec relací jako graf pomocí funkce SemPy
plot_relationship_metadata
.plot_relationship_metadata(suggested_relationships)
Funkce stanoví hierarchii relací z levé strany na pravou stranu, která odpovídá tabulkám "from" a "to" ve výstupu. Jinými slovy, nezávislé tabulky "od" na levé straně používají své cizí klíče k nasměrovat na jejich "na" závislé tabulky na pravé straně. Každé pole entity zobrazuje sloupce, které se účastní buď strany "from", nebo "to" (od) nebo "to" relace.
Ve výchozím nastavení se relace generují jako "m:1" (ne jako "1:m") nebo "1:1". Relace "1:1" lze vygenerovat jedním nebo oběma způsoby v závislosti na tom, jestli poměr mapovaných hodnot ke všem hodnotám překračuje
coverage_threshold
pouze jeden nebo oba směry. Později v tomto kurzu se budeme zabývat méně častými případy relací m:m.
Řešení potíží s detekcí relací
Příklad směrného plánu ukazuje úspěšnou detekci relací u čistých dat Synthea . V praxi jsou data zřídka čistá, což brání úspěšné detekci. Existuje několik technik, které můžou být užitečné, když data nejsou čistá.
Tato část tohoto kurzu se zabývá detekcí vztahů, když sémantický model obsahuje špinavá data.
Začněte tím, že manipulací s původními datovými rámci získáte "špinavá" data a vytisknete velikost zašpiněných dat.
# 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))
Pro porovnání tisk velikostí původních tabulek:
print(len(patients)) print(len(providers))
K vyhledání relací mezi tabulkami použijte funkci SemPy
find_relationships
:find_relationships([patients_dirty, providers_dirty, encounters])
Výstup kódu ukazuje, že se nezjistily žádné relace kvůli chybám, které jste zavedli dříve, abyste vytvořili sémantický model "dirty".
Použití ověřování
Ověření je nejlepší nástroj pro řešení potíží se selháními detekce vztahů, protože:
- Hlásí jasně, proč konkrétní vztah nedodržuje pravidla cizího klíče, a proto se nedá zjistit.
- Běží rychle u velkých sémantických modelů, protože se zaměřuje pouze na deklarované relace a neprovádí vyhledávání.
Ověření může použít libovolný datový rámec se sloupci, které jsou podobné datovému rámci vygenerovanému find_relationships
. V následujícím kódu suggested_relationships
datový rámec odkazuje patients
spíše než patients_dirty
na datové rámce, ale můžete je aliasovat slovníkem:
dirty_tables = {
"patients": patients_dirty,
"providers" : providers_dirty,
"encounters": encounters
}
errors = list_relationship_violations(dirty_tables, suggested_relationships)
errors
Povolit kritéria hledání
V dalších nástěnných scénářích můžete zkusit uvolnit kritéria hledání. Tato metoda zvyšuje možnost falešně pozitivních výsledků.
Nastavte
include_many_to_many=True
a vyhodnoťte, jestli to pomůže:find_relationships(dirty_tables, include_many_to_many=True, coverage_threshold=1)
Výsledky ukazují, že byl zjištěn vztah od
encounters
kpatients
dvěma problémům:- Relace označuje směr od
patients
kencounters
, což je inverzní k očekávané relaci. Důvodem je to, že se všepatients
stalo pokrytoencounters
(Coverage From
je 1,0), zatímcoencounters
jsou pouze částečně pokrytypatients
(Coverage To
= 0,85), protože chybí řádky pacientů. - U sloupce s nízkou kardinalitou
GENDER
existuje náhodná shoda, která se v obou tabulkách shoduje s názvem a hodnotou, ale nejedná se o relaci m:1, která by byla zajímavá. Nízká kardinalita je označenáUnique Count From
sloupci aUnique Count To
sloupci.
- Relace označuje směr od
Znovu spusťte
find_relationships
vyhledávání pouze pro relace "m:1", ale s nižšícoverage_threshold=0.5
:find_relationships(dirty_tables, include_many_to_many=False, coverage_threshold=0.5)
Výsledek ukazuje správný směr relací od
encounters
doproviders
. Relace odencounters
toupatients
se ale nezjistí, protožepatients
není jedinečná, takže nemůže být na straně 1 relace m:1.Uvolněte obě
include_many_to_many=True
acoverage_threshold=0.5
:find_relationships(dirty_tables, include_many_to_many=True, coverage_threshold=0.5)
Teď jsou obě relace zájmu viditelné, ale existuje mnohem více šumu:
- Je přítomna shoda
GENDER
s nízkou kardinalitou. - Objevila se shoda m:m
ORGANIZATION
s vyšší kardinalitou, což značí, žeORGANIZATION
sloupec je pravděpodobně denormalizovaný do obou tabulek.
- Je přítomna shoda
Shoda názvů sloupců
SemPy ve výchozím nastavení považuje za odpovídající pouze atributy, které zobrazují podobnost s názvem, a využívá tak skutečnost, že návrháři databáze obvykle označují související sloupce stejným způsobem. Toto chování pomáhá vyhnout se nechutným relacím, ke kterým dochází nejčastěji u celočíselného klíče s nízkou kardinalitou. Pokud 1,2,3,...,10
jsou například kategorie produktů a 1,2,3,...,10
stavový kód objednávky, budou se navzájem zaměňovat, když se podíváte jenom na mapování hodnot, aniž byste přihlédli k názvům sloupců. Spurious relace by neměly být problém s klíči podobné identifikátoru GUID.
SemPy se podívá na podobnost mezi názvy sloupců a názvy tabulek. Porovnávání je přibližné a nerozlišuje malá a velká písmena. Ignoruje nejčastěji zjištěných podřetězi "dekorátor", jako je "id", "code", "name", "key", "pk", "fk". V důsledku toho jsou nejběžnější případy shody:
- atribut s názvem column v entitě foo odpovídá atributu s názvem column (také COLUMN nebo Column) v řádku entity.
- atribut s názvem column v entitě foo odpovídá atributu s názvem "column_id" v řádku.
- atribut s názvem "bar" v entitě "foo" odpovídá atributu s názvem "code" v řádku.
Při párování názvů sloupců se detekce spustí rychleji.
Porovná názvy sloupců:
- Pokud chcete zjistit, které sloupce jsou vybrány k dalšímu vyhodnocení, použijte
verbose=2
možnost (verbose=1
uvádí pouze zpracovávané entity). - Parametr
name_similarity_threshold
určuje, jak se sloupce porovnávají. Prahová hodnota 1 značí, že se zajímáte pouze o 100 % shody.
find_relationships(dirty_tables, verbose=2, name_similarity_threshold=1.0);
Při 100% podobnosti se nepodaří zohlednit malé rozdíly mezi názvy. V příkladu mají tabulky tvar množného čísla s příponou "s", což vede k žádné přesné shodě. To je zpracováno dobře s výchozím
name_similarity_threshold=0.8
.- Pokud chcete zjistit, které sloupce jsou vybrány k dalšímu vyhodnocení, použijte
Spusťte znovu s výchozím kódem
name_similarity_threshold=0.8
:find_relationships(dirty_tables, verbose=2, name_similarity_threshold=0.8);
Všimněte si, že ID pro formulář
patients
v množném čísle je nyní porovnána s jednotným číslempatient
, aniž by bylo nutné přidat příliš mnoho dalších nechutných porovnání k době provádění.Spusťte znovu s výchozím kódem
name_similarity_threshold=0
:find_relationships(dirty_tables, verbose=2, name_similarity_threshold=0);
Změna
name_similarity_threshold
na 0 je druhá extrémní hodnota a označuje, že chcete porovnat všechny sloupce. To je zřídka nutné a vede ke zvýšení doby provádění a nechtěných shod, které je potřeba zkontrolovat. Podívejte se na počet porovnání ve podrobném výstupu.
Shrnutí tipů pro řešení potíží
- Začněte od přesné shody pro relace "m:1" (to znamená výchozí
include_many_to_many=False
acoverage_threshold=1.0
). To je obvykle to, co chcete. - Použijte úzký fokus na menší podmnožinu tabulek.
- K detekci problémů s kvalitou dat použijte ověřování.
- Použijte
verbose=2
, pokud chcete zjistit, které sloupce se považují za relaci. Výsledkem může být velký objem výstupu. - Mějte na paměti kompromisy z argumentů hledání.
include_many_to_many=True
acoverage_threshold<1.0
může vést k nechtěným relacím, které mohou být obtížně analyzovat a budou muset být filtrovány.
Detekce relací v úplné datové sadě Synthea
Jednoduchý příklad směrného plánu byl pohodlný nástroj pro výuku a řešení potíží. V praxi můžete začít od sémantického modelu, jako je úplná datová sada Synthea , která má mnohem více tabulek. Prozkoumejte úplnou datovou sadu synthea následujícím způsobem.
Čtení všech souborů z adresáře synthea/csv :
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'), }
Pomocí funkce SemPy
find_relationships
najděte relace mezi tabulkami:suggested_relationships = find_relationships(all_tables) suggested_relationships
Vizualizace relací:
plot_relationship_metadata(suggested_relationships)
Spočítejte, s kolika novými relacemi
include_many_to_many=True
m:m se zjistí . Tyto relace jsou navíc k dříve zobrazeným relacím m:1; proto musíte filtrovat podlemultiplicity
:suggested_relationships = find_relationships(all_tables, coverage_threshold=1.0, include_many_to_many=True) suggested_relationships[suggested_relationships['Multiplicity']=='m:m']
Data relací můžete řadit podle různých sloupců, abyste získali hlubší přehled o jejich povaze. Můžete se například rozhodnout uspořádat výstup podle
Row Count From
aRow Count To
, což vám pomůže identifikovat největší tabulky.suggested_relationships.sort_values(['Row Count From', 'Row Count To'], ascending=False)
V jiném sémantickém modelu by možná bylo důležité zaměřit se na počet hodnot null
Null Count From
neboCoverage To
.Tato analýza vám pomůže pochopit, jestli některá z relací není platná, a pokud je potřebujete odebrat ze seznamu kandidátů.
Související obsah
Podívejte se na další kurzy pro sémantický odkaz / SemPy: