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 tisztítása.

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 a következőket sajátíthatja el:

  • A Szemantikai hivatkozás Python-kódtárának (SemPy) összetevőinek használata, amelyek támogatják a Power BI-val való integrációt, és segítenek az adatelemzés automatizálásában. 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 a szemantikai modellek Fabric munkaterületről jegyzetfüzetbe történő átvitelére.
    • 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

  • A bal oldali navigációs panelen válassza Munkaterületek lehetőséget a munkaterület megkereséséhez és kijelöléséhez. Ez a munkaterület lesz az aktuális munkaterület.

Kövesd a jegyzetfüzetben.

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

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ítse a SemPy a PyPI-ból a jegyzetfüzet %pip beépített telepítési funkciójának használatá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 Synthea szintetikus orvosi rekordok adatkészletét használja (kis verzió az egyszerűség kedvéért):

    download_synthea(which='small')
    

Kapcsolatok észlelése Synthea táblák egy kis részén

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

    • patients beteginformációkat határoz meg
    • encounters meghatározza azokat a betegeket, akiknél orvosi találkozás történt (például orvosi találkozó, eljárás)
    • providers meghatározza, hogy mely egészségügyi szolgáltatók látták el a betegeket

    A encounters tábla feloldja a patients és a providers közötti több-a-többekhez kapcsolatot, és mint asszociatív entitásí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 find_relationships függvényével:

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

    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 az idegen kulcsaikat használják, hogy a jobb oldalon lévő "to" függőségi tábláikra mutassanak. 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 aránya az összes értékhez meghaladja-e coverage_threshold csak egy vagy mindkét irányban. Az oktatóanyag későbbi részében foglalkozol az "m:m" kapcsolatokkal, amelyek ritkábban fordulnak elő.

Kapcsolatfelismeré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 find_relationships függvényével:

    find_relationships([patients_dirty, providers_dirty, encounters])
    

    A kód kimenete azt mutatja, hogy nincsenek észlelt kapcsolatok a korábban bevezetett hibák miatt, amelyekkel létrehoztad a "piszkos" szemantikai modellt.

É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, és így 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 find_relationshipsáltal létrehozotthoz hasonló oszlopokkal. A következő kódban a suggested_relationships DataFrame patients_dirtyhelyett patients hivatkozik, de a DataFrame-eket szótárral is aliasnevezheti:

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

errors = list_relationship_violations(dirty_tables, suggested_relationships)
errors

Keresési feltételek lazítása

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 a 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 encounters és patients között észlelhető, de két probléma van:

    • A kapcsolat a patients és encountersközötti irányt jelzi, ami a várt kapcsolat inverze. Ennek az az oka, hogy az összes patients véletlenül encounters által lett lefedve (Coverage From 1,0), míg a encounters csak részben van lefedve a patients által (Coverage To = 0,85), mivel hiányoznak a betegek adatsorai.
    • 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 nem egy érdekes "m:1" kapcsolat. Az alacsony számosságot Unique Count From és Unique Count To oszlopok jelzik.
  2. Újra kell futtatni a find_relationships programot, hogy csak az "m:1" kapcsolatokat keresse, de alacsonyabb coverage_threshold=0.5mellett.

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

    Az eredmény a encounters és providersközötti kapcsolatok helyes irányát mutatja. A encounters és patients közötti kapcsolat azonban nem észlelhető, mivel patients nem egyedi, így nem lehet az "m:1" kapcsolat "egy" oldalán.

  3. Lazítsa meg mindkettőt, include_many_to_many=True-t és coverage_threshold=0.5-et.

    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:

    • A GENDER alacsony számosságú egyezése jelen van.
    • A ORGANIZATION magasabb számosságú "m:m" egyezés jelent meg, ami nyilvánvalóvá teszi, hogy a ORGANIZATION valószínűleg mindkét táblára denormalizált oszlop.

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 1,2,3,...,10 termékkategóriák és 1,2,3,...,10 rendelésállapotkódok vannak, 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 nem érzékeny a kis- és nagybetűkre. 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 ("COLUMN" vagy "Column") az entitás "bar"-ban.
  • Az 'foo' entitás 'column' nevű attribútuma megegyezik a 'bar' entitás 'column_id' nevű attribútumával.
  • a "foo" entitás "bar" nevű attribútuma megegyezik a "bar" "code" nevű attribútumával.

Az oszlopneveket először összehasonlítva, az észlelés gyorsabban fut.

  1. Párosítsa az oszlopneveket:

    • A további értékeléshez kiválasztott oszlopok megismeréséhez használja a verbose=2 lehetőséget (verbose=1 csak a feldolgozandó entitásokat listázza).
    • A name_similarity_threshold paraméter határozza meg az oszlopok összehasonlításának módját. Az 1 küszöbérték azt jelzi, hogy Önt kizárólag a 100% egyezés érdekli.
    find_relationships(dirty_tables, verbose=2, name_similarity_threshold=1.0);
    

    A 100% szintű hasonlóság nem veszi figyelembe a nevek közötti apró különbségeket. A példádban a táblák többes számú alakban, "s" utótaggal szerepelnek, ami nem eredményez pontos egyezést. Ez jól kezelhető az alapértelmezett beállítással, name_similarity_threshold=0.8.

  2. Alapértelmezett name_similarity_threshold=0.8futtatása újra:

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

    Figyelje meg, hogy most a többes számú alak patients azonosítóját hasonlítjuk össze az egyes számmal patient, anélkül hogy túl sok más felesleges összehasonlítást adnánk a végrehajtási időhöz.

  3. Futtassa újra alapértelmezettként name_similarity_threshold=0.

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

    A name_similarity_threshold 0 értékre módosítása a másik szélső érték, és 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.0). Ez az, amit általában szeretne.
  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. Ha szeretné megérteni, hogy mely oszlopok kerülnek figyelembe vételre kapcsolatok esetén, használja a verbose=2-t. 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 indulhat ki, például a teljes Synthea adatkészletből, amely sokkal több táblával rendelkezik. Az alábbiakban megismerheti a teljes synthea adatkészletet.

  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 find_relationships függvényével:

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

    plot_relationship_metadata(suggested_relationships)
    

    Táblák közötti kapcsolatok képernyőképe.

  4. Számolja meg, hogy hány új "m:m" kapcsolatot fedeznek fel include_many_to_many=True-val. Ezek a kapcsolatok a korábban bemutatott "m:1" kapcsolatokon kívüliek; ezért szűrnie kell a multiplicity-ra.

    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 Row Count From és Row Count Toalapján rendezi, amely segít azonosítani a legnagyobb táblákat.

    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 számának Null Count From vagy Coverage Toösszpontosítania.

    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: