Zdieľať cez


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.

    Snímka obrazovky ponuky prepínača prostredí zobrazujúca, kde vybrať položku Dátová veda.

  • 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 relationships_detection_tutorial.ipynb.

Nastavenie poznámkového bloku

V tejto časti nastavíte poznámkové prostredie s potrebnými modulmi a údajmi.

  1. 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
    
  2. 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
    )
    
  3. 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)
    
  4. 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

  1. 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 medzi patients a providers 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')
    
  2. Vyhľadajte vzťahy medzi tabuľkami pomocou funkcie find_relationships SemPy:

    suggested_relationships = find_relationships([patients, providers, encounters])
    suggested_relationships
    
  3. Vizualizujte vzťahy Údajový rámec ako graf pomocou funkcie plot_relationship_metadata SemPy.

    plot_relationship_metadata(suggested_relationships)
    

    Snímka obrazovky zobrazujúca vzťahy medzi tabuľkami v množine údajov.

    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.

  1. 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))
    
    
  2. Na porovnanie si môžete vytlačiť veľkosti pôvodných tabuliek:

    print(len(patients))
    print(len(providers))
    
  3. 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.

  1. 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 a patients bol zistený, ale existujú dva problémy:

    • Vzťah označuje smer od patients po encounters, čo je inverzná hodnota k očakávanému vzťahu. Je to spôsobené tým, že všetky patients sa na ne vzťahuje encounters (Coverage From je 1,0), zatiaľ čo encounters 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 a Unique Count To stĺpcami.
  2. Spustite find_relationships vyhľadať len vzťahy typu m:1, ale s nižšou coverage_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 po providers. Vzťah medzi encounters a patients sa však zistiť nedá, pretože patients nie je jedinečný, takže nemôže byť na strane "one" vzťahu typu m:1.

  3. Uvoľnite include_many_to_many=True aj coverage_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, že ORGANIZATION stĺpec je pravdepodobne de normalizovaný na obe tabuľky.

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.

  1. 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.

  2. 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 s patient v jednotnom čísle bez toho, aby sa pridalo príliš veľa ďalších rušivých porovnaní do času spustenia.

  3. 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

  1. Začnite od presnej zhody pre vzťahy m:1 (teda predvolený include_many_to_many=False a coverage_threshold=1.0). Zvyčajne je to, čo chcete.
  2. Používajte úzke zameranie na menšie podmnožiny tabuliek.
  3. Ak chcete zistiť problémy s kvalitou údajov, použite overenie.
  4. 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.
  5. Uvedomte si kompromisy vyhľadávacích argumentov. include_many_to_many=True a coverage_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.

  1. 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'),
    }
    
  2. Vyhľadajte vzťahy medzi tabuľkami pomocou funkcie find_relationships SemPy:

    suggested_relationships = find_relationships(all_tables)
    suggested_relationships
    
  3. Vizualizácia vzťahov:

    plot_relationship_metadata(suggested_relationships)
    

    Snímka obrazovky vzťahov medzi tabuľkami.

  4. 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']
    
  5. Ú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 a Row 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 alebo Coverage 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.

Pozrite si ďalšie kurzy o sémantických prepojeniach/SemPy: