Megosztás a következőn keresztül:


Oktatóanyag: Kapcsolatok felderítése a Synthea-adatkészletben szemantikai hivatkozás használatával

Ez az oktatóanyag bemutatja, hogyan észlelhet kapcsolatokat a nyilvános Synthea-adatkészletben szemantikai hivatkozás használatával.

Ha új adatokkal dolgozik, vagy meglévő adatmodell nélkül dolgozik, hasznos lehet a kapcsolatok automatikus felderítése. Ez a kapcsolatészlelés a következő segítségére lehet:

  • a modell magas szintű megértése,
  • további elemzéseket kaphat a feltáró adatelemzés során,
  • frissített adatok vagy új, bejövő adatok ellenőrzése és
  • adatok törlése.

Még akkor is, ha a kapcsolatok előre ismertek, a kapcsolatok keresése segíthet az adatmodell jobb megértésében vagy az adatminőségi problémák azonosításában.

Ebben az oktatóanyagban egy egyszerű alapkonfigurációs példával kezd, amelyben csak három táblával kísérletezik, így könnyen követhetők a köztük lévő kapcsolatok. Ezután egy összetettebb példát jelenít meg egy nagyobb táblázatkészlettel.

Ebben az oktatóanyagban az alábbiakkal fog megismerkedni:

  • Használja a Szemantic Link Python-kódtárának (SemPy) összetevőit, amelyek támogatják a Power BI-val való integrációt, és segítenek automatizálni az adatelemzést. Ezek az összetevők a következők:
    • FabricDataFrame – egy pandas-szerű struktúra, amely további szemantikai információkkal bővül.
    • Függvények szemantikai modellek fabric-munkaterületről a jegyzetfüzetbe való lekéréséhez.
    • Olyan függvények, amelyek automatizálják a szemantikai modellekben lévő kapcsolatok felderítését és vizualizációját.
  • A több táblával és egymás közötti kapcsolattal rendelkező szemantikai modellek kapcsolatfelderítési folyamatának hibaelhárítása.

Előfeltételek

  • Microsoft Fabric-előfizetés lekérése. Vagy regisztráljon egy ingyenes Microsoft Fabric-próbaverzióra.

  • Jelentkezzen be a Microsoft Fabricbe.

  • A kezdőlap bal oldalán található élménykapcsolóval válthat a Synapse Adattudomány felületre.

    Képernyőkép a felületváltó menüjéről, amelyen látható, hogy hol válassza ki a Adattudomány.

  • A munkaterület megkereséséhez és kijelöléséhez válassza a bal oldali navigációs panel munkaterületeit. Ez a munkaterület lesz az aktuális munkaterület.

Követés a jegyzetfüzetben

A relationships_detection_tutorial.ipynb jegyzetfüzet kíséri ezt az oktatóanyagot.

Az oktatóanyaghoz mellékelt jegyzetfüzet megnyitásához kövesse a Rendszer előkészítése adatelemzési oktatóanyagokhoz című témakör utasításait, és importálja a jegyzetfüzetet a munkaterületre.

Ha inkább erről a lapról másolja és illessze be a kódot, létrehozhat egy új jegyzetfüzetet.

A kód futtatása előtt mindenképpen csatoljon egy lakehouse-t a jegyzetfüzethez .

A jegyzetfüzet beállítása

Ebben a szakaszban egy jegyzetfüzet-környezetet állít be a szükséges modulokkal és adatokkal.

  1. Telepítés SemPy a PyPI-ból a %pip jegyzetfüzeten belüli helyszíni telepítési funkcióval:

    %pip install semantic-link
    
  2. Végezze el a Szükséges SemPy-modulok importálását, amelyekre később szüksége lesz:

    import pandas as pd
    
    from sempy.samples import download_synthea
    from sempy.relationships import (
        find_relationships,
        list_relationship_violations,
        plot_relationship_metadata
    )
    
  3. Importálja a pandast egy olyan konfigurációs beállítás kényszerítése érdekében, amely segít a kimeneti formázásban:

    import pandas as pd
    pd.set_option('display.max_colwidth', None)
    
  4. Kérje le a mintaadatokat. Ebben az oktatóanyagban a szintetikus orvosi rekordok Synthea-adatkészletét használja (az egyszerűség kedvéért kis verzió):

    download_synthea(which='small')
    

Kapcsolatok észlelése a Synthea-táblák egy kis részhalmazán

  1. Jelöljön ki három táblát egy nagyobb készletből:

    • patients megadja a beteg adatait
    • encounters meghatározza azokat a betegeket, akiknél orvosi találkozások voltak (például orvosi találkozó, eljárás)
    • providers meghatározza, hogy mely egészségügyi szolgáltatók vettek részt a betegeknél

    A encounters tábla felold egy több-a-többhöz kapcsolatotpatients, és providers asszociatív entitásként írható le:

    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. Kapcsolatok keresése a táblák között a SemPy függvényével find_relationships :

    suggested_relationships = find_relationships([patients, providers, encounters])
    suggested_relationships
    
  3. Vizualizálja a DataFrame-kapcsolatokat gráfként a SemPy függvényével plot_relationship_metadata .

    plot_relationship_metadata(suggested_relationships)
    

    Képernyőkép az adathalmaz táblái közötti kapcsolatokról.

    A függvény a bal oldalról a jobb oldalra helyezi a kapcsolati hierarchiát, amely a kimenet "from" és "to" tábláinak felel meg. Más szóval a bal oldalon lévő független "from" táblák idegen kulcsokkal mutatnak a jobb oldalon lévő "to" függőségi tábláikra. Minden entitásmező egy kapcsolat "from" vagy "to" oldalán részt vevő oszlopokat jelenít meg.

    Alapértelmezés szerint a kapcsolatok "m:1" (nem "1:m") vagy "1:1" néven jönnek létre. Az "1:1" kapcsolatok egy vagy mindkét módon hozhatók létre, attól függően, hogy a megfeleltetett értékek és az összes érték coverage_threshold aránya meghaladja-e az egy vagy mindkét irányt. Az oktatóanyag későbbi részében az "m:m" kapcsolatok ritkábban fordulnak elő.

Kapcsolatészlelési problémák elhárítása

Az alapkonfigurációs példa a tiszta Synthea-adatok sikeres kapcsolatészlelését mutatja be. A gyakorlatban az adatok ritkán tiszták, ami megakadályozza a sikeres észlelést. Számos olyan technika létezik, amely akkor lehet hasznos, ha az adatok nem tiszták.

Az oktatóanyag ezen szakasza a kapcsolatészlelést ismerteti, ha a szemantikai modell piszkos adatokat tartalmaz.

  1. Először az eredeti DataFrame-ek módosításával szerezze be a "piszkos" adatokat, és nyomtassa ki a piszkos adatok méretét.

    # 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. Összehasonlításként az eredeti táblák nyomtatási méretei:

    print(len(patients))
    print(len(providers))
    
  3. Kapcsolatok keresése a táblák között a SemPy függvényével find_relationships :

    find_relationships([patients_dirty, providers_dirty, encounters])
    

    A kód kimenete azt mutatja, hogy a korábban bevezetett hibák miatt nem észlelhető kapcsolat a "piszkos" szemantikai modell létrehozásához.

Érvényesítés használata

Az ellenőrzés a legjobb eszköz a kapcsolatészlelési hibák elhárításához, mert:

  • Egyértelműen jelzi, hogy egy adott kapcsolat miért nem követi az idegenkulcs-szabályokat, ezért nem észlelhető.
  • Nagy szemantikai modellekkel gyorsan fut, mert csak a deklarált kapcsolatokra összpontosít, és nem végez keresést.

Az érvényesítés bármilyen DataFrame-et használhat a létrehozotthoz find_relationshipshasonló oszlopokkal. A következő kódban a suggested_relationships DataFrame ahelyettpatients_dirty, hogy a dataframe-et patients említi, de a DataFrame-eket szótárral is elnevezheti:

dirty_tables = {
    "patients": patients_dirty,
    "providers" : providers_dirty,
    "encounters": encounters
}

errors = list_relationship_violations(dirty_tables, suggested_relationships)
errors

A keresési feltételek lazításán

A homályosabb helyzetekben megpróbálhatja lazítani a keresési feltételeket. Ez a módszer növeli a hamis pozitív értékek lehetőségét.

  1. Állítsa be include_many_to_many=True és értékelje ki, hogy segít-e:

    find_relationships(dirty_tables, include_many_to_many=True, coverage_threshold=1)
    

    Az eredmények azt mutatják, hogy a kapcsolat encounterspatients között észlelték, de két probléma van:

    • A kapcsolat egy irányt patientsencountersjelöl, amely a várt kapcsolat inverze. Ennek az az oka, hogy a patients (1,0) minden esetet lefedCoverage Fromencounters , míg encounters a (Coverage To = 0,85) csak részben fedi le patients , mivel a betegsorok hiányoznak.
    • Véletlen egyezés van egy alacsony számosságú GENDER oszlopban, amely név és érték szerint egyezik mindkét táblában, de ez nem egy "m:1" kapcsolat. Az alacsony számosságot az Unique Count To oszlopok jelölikUnique Count From.
  2. Futtassa újra find_relationships , hogy csak az "m:1" kapcsolatokat keresse, de alacsonyabb coverage_threshold=0.5:

    find_relationships(dirty_tables, include_many_to_many=False, coverage_threshold=0.5)
    

    Az eredmény a kapcsolatok encountersprovidershelyes irányát mutatja. A kapcsolat encounterspatients azonban nem észlelhető, mert patients nem egyedi, ezért nem lehet az "m:1" kapcsolat "Egy" oldalán.

  3. Lazítsa meg a két include_many_to_many=True és coverage_threshold=0.5a :

    find_relationships(dirty_tables, include_many_to_many=True, coverage_threshold=0.5)
    

    Most mindkét érdekes kapcsolat látható, de sokkal több zaj van:

    • Az alacsony számosságú egyezés GENDER jelen van.
    • Ekkor megjelenik egy magasabb számosságú "m:m" egyezés ORGANIZATION , ami nyilvánvalóvá teszi, hogy ORGANIZATION valószínűleg mindkét táblában az oszlop normalizálódott.

Oszlopnevek egyeztetése

A SemPy alapértelmezés szerint csak a név-hasonlóságot mutató attribútumokat tekinti egyezésnek, kihasználva azt a tényt, hogy az adatbázis-tervezők általában ugyanúgy nevezik el a kapcsolódó oszlopokat. Ez a viselkedés segít elkerülni a hamis kapcsolatokat, amelyek leggyakrabban alacsony számosságú egész számbillentyűkkel fordulnak elő. Ha például vannak 1,2,3,...,10 termékkategóriák és 1,2,3,...,10 rendelésállapotkódok, akkor a rendszer összekeveri őket egymással, ha csak az értékleképezéseket tekinti át, és nem veszi figyelembe az oszlopneveket. A hamis kapcsolatok nem jelenthetnek problémát a GUID-szerű kulcsokkal kapcsolatban.

A SemPy az oszlopnevek és a táblanevek közötti hasonlóságot vizsgálja. Az egyezés hozzávetőleges és a kis- és nagybetűk érzéketlenek. Figyelmen kívül hagyja a leggyakrabban előforduló "dekoratőr" alsztringeket, mint például az "id", a "code", a "name", a "key", a "pk", az "fk". Ennek eredményeképpen a leggyakoribb egyezéses esetek a következők:

  • a "foo" entitás "oszlop" nevű attribútuma megegyezik egy "oszlop" nevű attribútummal (oszlop vagy oszlop) az entitás "sávjában".
  • a "foo" entitás "oszlop" nevű attribútuma megegyezik egy "column_id" nevű attribútummal a sávban.
  • a "foo" entitás "bar" nevű attribútuma megegyezik a "bar" "code" nevű attribútumával.

Az oszlopnevek első egyeztetésével az észlelés gyorsabban fut.

  1. Egyezzen az oszlopnevekkel:

    • Annak megértéséhez, hogy mely oszlopok legyenek kiválasztva a további kiértékeléshez, használja a verbose=2 lehetőséget (verbose=1 csak a feldolgozandó entitásokat sorolja fel).
    • A name_similarity_threshold paraméter határozza meg az oszlopok összehasonlítását. Az 1 küszöbérték azt jelzi, hogy csak 100%-os egyezést szeretne.
    find_relationships(dirty_tables, verbose=2, name_similarity_threshold=1.0);
    

    A 100%-os hasonlóságú futtatás nem veszi figyelembe a nevek közötti kis különbségeket. A példában a táblák többes számú, "s" utótaggal rendelkező űrlapot használnak, amely nem eredményez pontos egyezést. Ezt az alapértelmezett name_similarity_threshold=0.8beállítással jól kezeli a rendszer.

  2. Futtassa újra az alapértelmezettet name_similarity_threshold=0.8:

    find_relationships(dirty_tables, verbose=2, name_similarity_threshold=0.8);
    

    Figyelje meg, hogy a többes számú űrlap patients azonosítóját most összehasonlítjuk az egyesével patient anélkül, hogy túl sok más hamis összehasonlítást ad a végrehajtási időhöz.

  3. Futtassa újra az alapértelmezettet name_similarity_threshold=0:

    find_relationships(dirty_tables, verbose=2, name_similarity_threshold=0);
    

    A másik véglet a 0 értékre váltás name_similarity_threshold , amely azt jelzi, hogy az összes oszlopot össze szeretné hasonlítani. Ez ritkán szükséges, és nagyobb végrehajtási időt és hamis találatokat eredményez, amelyeket felül kell vizsgálni. Figyelje meg az összehasonlítások számát a részletes kimenetben.

Hibaelhárítási tippek összefoglalása

  1. Kezdje az "m:1" kapcsolatok pontos egyezésével (vagyis az alapértelmezett include_many_to_many=False és coverage_threshold=1.0a ). Általában ezt szeretné.
  2. Használjon szűk fókuszt a táblák kisebb részhalmazaira.
  3. Az ellenőrzéssel észlelhet adatminőségi problémákat.
  4. Használja verbose=2 , ha szeretné megtudni, hogy mely oszlopok tekinthetők kapcsolatnak. Ez nagy mennyiségű kimenetet eredményezhet.
  5. Vegye figyelembe a keresési argumentumok kompromisszumait. include_many_to_many=True és coverage_threshold<1.0 olyan hamis kapcsolatokat hozhat létre, amelyeket nehezebb elemezni, és szűrni kell.

Kapcsolatok észlelése a teljes Synthea-adatkészleten

Az egyszerű alapkonfigurációs példa egy kényelmes tanulási és hibaelhárítási eszköz volt. A gyakorlatban egy szemantikai modellből, például a teljes Synthea-adatkészletből indulhat ki, amely sokkal több táblával rendelkezik. A teljes synthea-adatkészletet az alábbiak szerint ismerheti meg.

  1. Olvassa el az összes fájlt a synthea/csv könyvtárból:

    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. Kapcsolatok keresése a táblák között a SemPy függvényével find_relationships :

    suggested_relationships = find_relationships(all_tables)
    suggested_relationships
    
  3. Kapcsolatok vizualizációja:

    plot_relationship_metadata(suggested_relationships)
    

    Képernyőkép a táblák közötti kapcsolatokról.

  4. Megszámolja, hogy hány új "m:m" kapcsolatot fog felderíteni a include_many_to_many=Truerendszer. Ezek a kapcsolatok a korábban bemutatott "m:1" kapcsolatokon kívül vannak; ezért a következőre multiplicitykell szűrnie:

    suggested_relationships = find_relationships(all_tables, coverage_threshold=1.0, include_many_to_many=True) 
    suggested_relationships[suggested_relationships['Multiplicity']=='m:m']
    
  5. A kapcsolati adatokat különböző oszlopok szerint rendezheti, hogy jobban megismerje azok természetét. Dönthet például úgy, hogy a kimenetet a legnagyobb táblák azonosítására szolgáló és Row Count Toa következő szerint Row Count From rendezi.

    suggested_relationships.sort_values(['Row Count From', 'Row Count To'], ascending=False)
    

    Egy másik szemantikai modellben talán fontos lenne a null értékek vagy a Null Count FromCoverage To.

    Ez az elemzés segíthet megérteni, hogy a kapcsolatok bármelyike érvénytelen lehet-e, és hogy el kell-e távolítania őket a jelöltek listájáról.

Tekintse meg a szemantikai hivatkozás / SemPy egyéb oktatóanyagait: