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.
Microsoft Fabric-előfizetés lekérése. Vagy regisztráljon egy ingyenes Microsoft Fabric-próbaverzióra.
A kezdőlap bal oldalán található élménykapcsolóval válthat a Synapse Adattudomány felületre.
- 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.
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 .
Ebben a szakaszban egy jegyzetfüzet-környezetet állít be a szükséges modulokkal és adatokkal.
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
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 szintetikus orvosi rekordok Synthea-adatkészletét használja (az egyszerűség kedvéért kis verzió):
download_synthea(which='small')
Jelöljön ki három táblát egy nagyobb készletből:
patients
megadja a beteg adataitencounters
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
, ésproviders
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')
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
Vizualizálja a DataFrame-kapcsolatokat gráfként a SemPy függvényével
plot_relationship_metadata
.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 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ő.
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 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.
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_relationships
hasonló 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 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
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
patients
között észlelték, de két probléma van:- A kapcsolat egy irányt
patients
encounters
jelöl, amely a várt kapcsolat inverze. Ennek az az oka, hogy apatients
(1,0) minden esetet lefedCoverage From
encounters
, mígencounters
a (Coverage To
= 0,85) csak részben fedi lepatients
, 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 azUnique Count To
oszlopok jelölikUnique Count From
.
- A kapcsolat egy irányt
Futtassa újra
find_relationships
, hogy csak az "m:1" kapcsolatokat keresse, de alacsonyabbcoverage_threshold=0.5
:find_relationships(dirty_tables, include_many_to_many=False, coverage_threshold=0.5)
Az eredmény a kapcsolatok
encounters
providers
helyes irányát mutatja. A kapcsolatencounters
patients
azonban nem észlelhető, mertpatients
nem egyedi, ezért nem lehet az "m:1" kapcsolat "Egy" oldalán.Lazítsa meg a két
include_many_to_many=True
éscoverage_threshold=0.5
a :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, hogyORGANIZATION
valószínűleg mindkét táblában az oszlop normalizálódott.
- Az alacsony számosságú egyezés
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.
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.8
beállítással jól kezeli a rendszer.- Annak megértéséhez, hogy mely oszlopok legyenek kiválasztva a további kiértékeléshez, használja a
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évelpatient
anélkül, hogy túl sok más hamis összehasonlítást ad a végrehajtási időhöz.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.
- Kezdje az "m:1" kapcsolatok pontos egyezésével (vagyis az alapértelmezett
include_many_to_many=False
éscoverage_threshold=1.0
a ). Általában ezt szeretné. - Használjon szűk fókuszt a táblák kisebb részhalmazaira.
- Az ellenőrzéssel észlelhet adatminőségi problémákat.
- Használja
verbose=2
, ha szeretné megtudni, hogy mely oszlopok tekinthetők kapcsolatnak. 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.
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.
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 függvényével
find_relationships
:suggested_relationships = find_relationships(all_tables) suggested_relationships
Kapcsolatok vizualizációja:
plot_relationship_metadata(suggested_relationships)
Megszámolja, hogy hány új "m:m" kapcsolatot fog felderíteni a
include_many_to_many=True
rendszer. Ezek a kapcsolatok a korábban bemutatott "m:1" kapcsolatokon kívül vannak; ezért a következőremultiplicity
kell szűrnie: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 a legnagyobb táblák azonosítására szolgáló és
Row Count To
a következő szerintRow 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 From
Coverage 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:
- Oktatóanyag: Adatok tisztítása funkcionális függőségekkel
- Oktatóanyag: Funkcionális függőségek elemzése szemantikai mintamodellben
- Oktatóanyag: Kapcsolatok felderítése szemantikai modellben szemantikai hivatkozás használatával
- Oktatóanyag: Power BI-mértékek kinyerása és kiszámítása Jupyter-jegyzetfüzetből