Kurz: Zisťovanie vzťahov v množine údajov Synthea pomocou sémantického prepojenia
Tento kurz ukazuje, ako zisťovať vzťahy vo verejnej Synthea množine údajov pomocou sémantického prepojenia.
Keď pracujete s novými údajmi alebo pracujete bez existujúceho dátového modelu, môže byť užitočné vzťahy automaticky zistiť. Toto zisťovanie vzťahov vám môže pomôcť:
- porozumieť modelu na vysokej úrovni,
- získať ďalšie prehľady počas prieskumnej analýzy údajov,
- overiť aktualizované údaje alebo nové, prichádzajúce údaje a
- vyčistenie údajov.
Aj keď sú vzťahy známe vopred, vyhľadávanie vzťahov môže pomôcť lepšie pochopiť dátový model alebo identifikáciu problémov s kvalitou údajov.
V tomto kurze začnete jednoduchým základným príkladom toho, kde experimentujete len s tromi tabuľkami, aby sa dali jednoducho sledovať prepojenia medzi nimi. Potom zobrazíte zložitejší príklad s väčšou množinou tabuľky.
V tomto kurze sa naučíte:
- Použite súčasti knižnice jazyka Python sémantických prepojení (SemPy), ktoré podporujú integráciu so službou Power BI a pomáhajú automatizovať analýzu údajov. Medzi tieto súčasti patria:
- FabricDataFrame – štruktúra pripomínaná pandas, vylepšená ďalšími sémantickými informáciami.
- Funkcie na vyťahovanie sémantických modelov z pracovného priestoru služby Fabric do poznámkového bloku.
- Funkcie, ktoré automatizujú zisťovanie a vizualizáciu vzťahov v sémantických modeloch.
- Riešenie problémov s procesom zisťovania vzťahov pre sémantické modely s viacerými tabuľkami a vzájomnými väzbami.
Predpoklady
Získajte predplatné služby Microsoft Fabric . Alebo si zaregistrujte bezplatnú skúšobnú služby Microsoft Fabric.
Prihláste sa do služby Microsoft Fabric.
Pomocou prepínača skúseností v ľavej dolnej časti domovskej stránky sa prepnete na službu Fabric.
- Na ľavej navigačnej table vyberte položku Pracovné priestory a vyhľadajte a vyberte pracovný priestor. Tento pracovný priestor sa stane vaším aktuálnym pracovným priestorom.
Sledovanie v notebooku
Tento kurz sprevádza poznámkový blok
Ak chcete otvoriť sprievodný poznámkový blok pre tento kurz, postupujte podľa pokynov v téme Príprava systému na kurzy dátových vied na import notebooku do pracovného priestoru.
Ak by ste radšej skopírovali a prilepili kód z tejto stránky, môžete vytvoriť nový poznámkový blok.
Uistite sa, že pripojiť lakehouse k notebooku, ako začnete bežať kód.
Nastavenie poznámkového bloku
V tejto časti nastavíte poznámkové prostredie s potrebnými modulmi a údajmi.
Nainštalujte
SemPy
z rozhrania PyPI pomocou možnosti%pip
vnorenej inštalácie v rámci poznámkového bloku:%pip install semantic-link
Vykonajte potrebné importy modulov SemPy, ktoré budete potrebovať neskôr:
import pandas as pd from sempy.samples import download_synthea from sempy.relationships import ( find_relationships, list_relationship_violations, plot_relationship_metadata )
Importujte pandas na vynucovanie možnosti konfigurácie, ktorá pomáha s formátovaním výstupu:
import pandas as pd pd.set_option('display.max_colwidth', None)
Vyžiadajte vzorové údaje. V tomto kurze použijete Synthea množinu údajov syntetických zdravotných záznamov (malá verzia z dôvodu zjednodušenia):
download_synthea(which='small')
Zisťovanie vzťahov v malej podmnožine tabuliek Synthea
Z väčšej množiny vyberte tri tabuľky:
-
patients
špecifikuje informácie o pacientoch -
encounters
špecifikuje pacientov, ktorí mali lekárske stretnutia (napríklad lekárske vymenovanie, postup) -
providers
určujú, ktorí poskytovatelia lekárov navštevovali
Tabuľka
encounters
rieši vzťah typu many-to-many medzipatients
aproviders
a dá sa opísať ako asociatívna entita:patients = pd.read_csv('synthea/csv/patients.csv') providers = pd.read_csv('synthea/csv/providers.csv') encounters = pd.read_csv('synthea/csv/encounters.csv')
-
Vyhľadajte vzťahy medzi tabuľkami pomocou funkcie
find_relationships
SemPy:suggested_relationships = find_relationships([patients, providers, encounters]) suggested_relationships
Vizualizujte vzťahy Údajový rámec ako graf pomocou funkcie
plot_relationship_metadata
SemPy.plot_relationship_metadata(suggested_relationships)
Funkcia stanoví hierarchiu vzťahov z ľavej strany na pravej strane, ktorá vo výstupe zodpovedá tabuľkám "od" a "k". Inými slovami, nezávislé tabuľky "od" na ľavej strane používajú svoje cudzie kľúče, aby odkazovali na ich tabuľky závislostí na pravej strane. Každé pole entity zobrazuje stĺpce, ktoré sa zúčastňujú buď na strane "od" alebo "do" vo vzťahu.
V predvolenom nastavení sa vzťahy generujú ako m:1 (nie ako 1:m) alebo 1:1. Vzťahy 1:1 možno vygenerovať jedným alebo oboma smermi v závislosti od toho, či pomer namapovaných hodnôt k všetkým hodnotám presahuje
coverage_threshold
v jednom alebo oboch smeroch. Neskôr v tomto kurze sa budete zaoberať menej častými prípadmi vzťahov typu m:m.
Riešenie problémov s detekciou vzťahov
Pôvodný príklad znázorňuje úspešné zisťovanie vzťahov pri čistom syntea údajov. V praxi sú údaje zriedkavo čisté, čo bráni úspešnému zisťovaniu. Existuje niekoľko techník, ktoré môžu byť užitočné, ak údaje nie sú čisté.
Táto časť tohto kurzu sa zaoberá detekciou vzťahov, keď sémantický model obsahuje špinavé údaje.
Začnite manipuláciou s pôvodnými údajovými prvkami DataFrames, aby ste získali "špinavé" údaje, a vytlačte veľkosť špinavých údajov.
# 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))
Na porovnanie si môžete vytlačiť veľkosti pôvodných tabuliek:
print(len(patients)) print(len(providers))
Vyhľadajte vzťahy medzi tabuľkami pomocou funkcie
find_relationships
SemPy:find_relationships([patients_dirty, providers_dirty, encounters])
Výstup kódu ukazuje, že nedošlo k žiadnym vzťahom zisteným v dôsledku chýb, ktoré ste uviedli v minulosti pri vytváraní "špinavého" sémantického modelu.
Použitie overenia
Overenie je najlepším nástrojom na riešenie problémov s zlyhaniami zisťovania vzťahov, pretože:
- Jasne uvádza, prečo sa určitý vzťah nepoužíva podľa pravidiel cudzieho kľúča, a preto sa nedá zistiť.
- Funguje rýchlo s veľkými sémantickými modelmi, pretože sa zameriava len na deklarované vzťahy a nevykonáva vyhľadávanie.
Overenie môže používať ľubovoľný údajový rámec so stĺpcami podobnými stĺpcom vygenerovaným find_relationships
. V nasledujúcom kóde suggested_relationships
Údajový rámec odkazuje skôr na patients
než na patients_dirty
, ale v prípade údajových rámca môžete na alias použiť slovník:
dirty_tables = {
"patients": patients_dirty,
"providers" : providers_dirty,
"encounters": encounters
}
errors = list_relationship_violations(dirty_tables, suggested_relationships)
errors
Uvoľnené kritériá vyhľadávania
V ďalších nejasných scenároch môžete skúsiť uvoľniť kritériá vyhľadávania. Táto metóda zvyšuje možnosť falošne pozitívnych.
Nastavte
include_many_to_many=True
a vyhodnoťte, či vám to pomôže:find_relationships(dirty_tables, include_many_to_many=True, coverage_threshold=1)
Výsledky ukazujú, že vzťah medzi
encounters
apatients
bol zistený, ale existujú dva problémy:- Vzťah označuje smer od
patients
poencounters
, čo je inverzná hodnota k očakávanému vzťahu. Je to spôsobené tým, že všetkypatients
sa na ne vzťahujeencounters
(Coverage From
je 1,0), zatiaľ čoencounters
sú len čiastočne pokrytépatients
(Coverage To
= 0,85), pretože chýbajú riadky u pacientov. - V stĺpci s nízkou kardinalitou
GENDER
dôjde k náhodnej zhode, ktorá sa zhoduje s menom a hodnotou v oboch tabuľkách, ale nejde o vzťah záujmov typu m:1. Nízka kardinalita je označenáUnique Count From
aUnique Count To
stĺpcami.
- Vzťah označuje smer od
Spustite
find_relationships
vyhľadať len vzťahy typu m:1, ale s nižšoucoverage_threshold=0.5
:find_relationships(dirty_tables, include_many_to_many=False, coverage_threshold=0.5)
Výsledok zobrazuje správny smer vzťahov od
encounters
poproviders
. Vzťah medziencounters
apatients
sa však zistiť nedá, pretožepatients
nie je jedinečný, takže nemôže byť na strane "one" vzťahu typu m:1.Uvoľnite
include_many_to_many=True
ajcoverage_threshold=0.5
:find_relationships(dirty_tables, include_many_to_many=True, coverage_threshold=0.5)
Teraz sú oba vzťahy záujmu viditeľné, ale je tu oveľa viac hluku:
- Prítomná je zhoda s nízkou kardinalitou v
GENDER
. - Zobrazila sa vyššia kardinalita m:m na
ORGANIZATION
, čo ukázalo, žeORGANIZATION
stĺpec je pravdepodobne de normalizovaný na obe tabuľky.
- Prítomná je zhoda s nízkou kardinalitou v
Priradiť názvy stĺpcov
SemPy predvolene považuje za zhodné iba atribúty, ktoré zobrazujú podobnosť názvu, pričom využívajú skutočnosť, že návrhári databáz zvyčajne rovnakým spôsobom pomenujú súvisiace stĺpce. Toto správanie pomáha vyhnúť sa nerušivým vzťahom, ktoré sa najčastejšie vyskytujú s nízkymi kardinalitami celočíselných kľúčov. Ak existujú napríklad 1,2,3,...,10
kategórie produktov a 1,2,3,...,10
kód stavu objednávok, zamieňajú sa navzájom pri pohľade na mapovanie hodnôt bez toho, aby sa brali do úvahy názvy stĺpcov. Falošné vzťahy by nemali predstavovať problém s kľúčmi, ako sú napríklad identifikátory GUID.
SemPy pracuje s podobnosťou medzi názvami stĺpcov a názvami tabuliek. Približná zhoda je približná a nerozlišujú sa veľké a malé písmená. Ignoruje najčastejšie sa vyskytujúce podreťazce "dekorátor", ako napríklad "id", "code", "name", "key", "pk", "fk". Výsledkom je, že najtypickejšie prípady zhody sú:
- atribút s názvom stĺpec v entite foo sa zhoduje s atribútom s názvom stĺpec (tiež STĹPEC alebo Stĺpec) v entite "bar".
- Atribút s názvom stĺpec v entite foo sa zhoduje s atribútom s názvom column_id v pruhu.
- atribút s názvom "bar" v entite foo sa zhoduje s atribútom s názvom kód v riadku .
Tým, že najprv zladíte názvy stĺpcov, detekcia sa spustí rýchlejšie.
Priradiť názvy stĺpcov:
- Ak chcete zistiť, ktoré stĺpce sú vybraté na ďalšie vyhodnocovanie, použite možnosť
verbose=2
(verbose=1
uvádza iba spracovávané entity). - Parameter
name_similarity_threshold
určuje spôsob porovnávania stĺpcov. Prahová hodnota 1 označuje, že máte záujem len o 100% zhodu.
find_relationships(dirty_tables, verbose=2, name_similarity_threshold=1.0);
Spustenie s 100% podobnosť nedokáže zohľadniť malé rozdiely medzi názvami. Vo vašom príklade majú tabuľky množné číslo s príponou "s", čo nemá za následok presnú zhodu. Tento problém sa rieši s predvoleným
name_similarity_threshold=0.8
.- Ak chcete zistiť, ktoré stĺpce sú vybraté na ďalšie vyhodnocovanie, použite možnosť
Spustite znova s predvoleným
name_similarity_threshold=0.8
:find_relationships(dirty_tables, verbose=2, name_similarity_threshold=0.8);
Všimnite si, že ID pre
patients
množného čísla sa teraz porovnáva spatient
v jednotnom čísle bez toho, aby sa pridalo príliš veľa ďalších rušivých porovnaní do času spustenia.Spustite znova s predvoleným
name_similarity_threshold=0
:find_relationships(dirty_tables, verbose=2, name_similarity_threshold=0);
Zmena
name_similarity_threshold
na 0 je iná extrémna hodnota, ktorá označuje, že chcete porovnať všetky stĺpce. Toto je zriedkavo potrebné a má za následok zvýšenú dobu spustenia a falošné zhody, ktoré je potrebné skontrolovať. Pozrite si počet porovnaní v podrobnom výstupe.
Súhrn tipov na riešenie problémov
- Začnite od presnej zhody pre vzťahy m:1 (teda predvolený
include_many_to_many=False
acoverage_threshold=1.0
). Zvyčajne je to, čo chcete. - Používajte úzke zameranie na menšie podmnožiny tabuliek.
- Ak chcete zistiť problémy s kvalitou údajov, použite overenie.
- Ak chcete zistiť, ktoré stĺpce sa vo vzťahu považujú za stĺpce, použite
verbose=2
. To môže mať za následok veľké množstvo výstupu. - Uvedomte si kompromisy vyhľadávacích argumentov.
include_many_to_many=True
acoverage_threshold<1.0
môžu vytvárať falošné vzťahy, ktoré môžu byť ťažšie analyzovať a budú musieť byť filtrované.
Rozpoznanie vzťahov na úplnom Synthea množine údajov
Jednoduchý základný príklad bol pohodlný nástroj na učenie a riešenie problémov. V praxi môžete začať zo sémantického modelu, ako je napríklad úplný Synthea množine údajov, ktorá má oveľa viac tabuliek. Preskúmajte úplnú synte nasledujúcou množine údajov.
Prečítajte si všetky súbory z adresára 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'), }
Vyhľadajte vzťahy medzi tabuľkami pomocou funkcie
find_relationships
SemPy:suggested_relationships = find_relationships(all_tables) suggested_relationships
Vizualizácia vzťahov:
plot_relationship_metadata(suggested_relationships)
Spočítať počet nových vzťahov m:m sa zistí pomocou
include_many_to_many=True
. Tieto vzťahy sú dodatkom k predtým zobrazeným vzťahom m:1; Preto je potrebné filtrovaťmultiplicity
:suggested_relationships = find_relationships(all_tables, coverage_threshold=1.0, include_many_to_many=True) suggested_relationships[suggested_relationships['Multiplicity']=='m:m']
Údaje o vzťahoch môžete zoradiť podľa rôznych stĺpcov a lepšie porozumieť ich povahe. Môžete sa napríklad rozhodnúť, že zoradíte výstup podľa
Row Count From
aRow Count To
, ktoré pomáhajú identifikovať najväčšie tabuľky.suggested_relationships.sort_values(['Row Count From', 'Row Count To'], ascending=False)
V inom sémantickom modeli by bolo možno dôležité zamerať sa na počet hodnôt null
Null Count From
aleboCoverage To
.Táto analýza vám pomôže pochopiť, či niektoré vzťahy môžu byť neplatné, a či ich potrebujete odstrániť zo zoznamu kandidátov.
Súvisiaci obsah
Pozrite si ďalšie kurzy o sémantických prepojeniach/SemPy: