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
Szerezze be a Microsoft Fabric-előfizetést. Vagy regisztráljon egy ingyenes Microsoft Fabric próbaeléréséhez.
Jelentkezzen be a Microsoft Fabric.
A kezdőlap bal alsó részén található élménykapcsolóval válthat Fabricre.
- 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.
Az oktatóanyaghoz mellékelt jegyzetfüzet megnyitásához kövesse az utasításokat a A rendszer előkészítése adatelemzési oktatóanyagokhoz szakaszokban, hogy importálhassa a jegyzetfüzetet a munkaterületére.
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.
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
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 )
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)
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
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 apatients
és aproviders
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')
-
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
Vizualizálja a DataFrame-kapcsolatokat gráfként a SemPy
plot_relationship_metadata
függvényével.plot_relationship_metadata(suggested_relationships)
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.
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))
Összehasonlításként az eredeti táblák nyomtatási méretei:
print(len(patients)) print(len(providers))
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_dirty
helyett 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.
Á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
éspatients
között észlelhető, de két probléma van:- A kapcsolat a
patients
ésencounters
közötti irányt jelzi, ami a várt kapcsolat inverze. Ennek az az oka, hogy az összespatients
véletlenülencounters
által lett lefedve (Coverage From
1,0), míg aencounters
csak részben van lefedve apatients
á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ágotUnique Count From
ésUnique Count To
oszlopok jelzik.
- A kapcsolat a
Újra kell futtatni a
find_relationships
programot, hogy csak az "m:1" kapcsolatokat keresse, de alacsonyabbcoverage_threshold=0.5
mellett.find_relationships(dirty_tables, include_many_to_many=False, coverage_threshold=0.5)
Az eredmény a
encounters
ésproviders
közötti kapcsolatok helyes irányát mutatja. Aencounters
éspatients
közötti kapcsolat azonban nem észlelhető, mivelpatients
nem egyedi, így nem lehet az "m:1" kapcsolat "egy" oldalán.Lazítsa meg mindkettőt,
include_many_to_many=True
-t éscoverage_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 aORGANIZATION
valószínűleg mindkét táblára denormalizált oszlop.
- A
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.
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
.- A további értékeléshez kiválasztott oszlopok megismeréséhez használja a
Alapértelmezett
name_similarity_threshold=0.8
futtatá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ámmalpatient
, anélkül hogy túl sok más felesleges összehasonlítást adnánk a végrehajtási időhöz.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
- Kezdje az "m:1" kapcsolatok pontos egyezésével (vagyis az alapértelmezett
include_many_to_many=False
éscoverage_threshold=1.0
). Ez az, amit általában szeretne. - Használjon szűk fókuszt a táblák kisebb részhalmazaira.
- Az ellenőrzéssel észlelhet adatminőségi problémákat.
- 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. - Vegye figyelembe a keresési argumentumok kompromisszumait.
include_many_to_many=True
éscoverage_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.
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'), }
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
Kapcsolatok vizualizációja:
plot_relationship_metadata(suggested_relationships)
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 amultiplicity
-ra.suggested_relationships = find_relationships(all_tables, coverage_threshold=1.0, include_many_to_many=True) suggested_relationships[suggested_relationships['Multiplicity']=='m:m']
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
ésRow Count To
alapjá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
vagyCoverage 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.
Kapcsolódó tartalom
Tekintse meg a szemantikai hivatkozás / SemPy egyéb oktatóanyagait: