Opetusohjelma: Suhteiden etsiminen Synthea -tietojoukosta semanttisen linkin avulla
Tässä opetusohjelmassa kuvataan, miten voit tunnistaa suhteet julkisessa Synthea tietojoukon semanttisen linkin avulla.
Kun käsittelet uusia tietoja tai työskentelet ilman aiemmin luotua tietomallia, voi olla hyödyllistä löytää suhteet automaattisesti. Tämän suhteen tunnistuksen avulla voit tehdä seuraavaa:
- ymmärtää mallia korkealla tasolla,
- saada lisää merkityksellisiä tietoja valmistelevan tietoanalyysin aikana,
- vahvistetaan päivitetyt tiedot tai uudet, saapuvat tiedot ja
- tietojen puhdistaminen.
Vaikka suhteita tiedettäisiin jo etukäteen, suhteiden etsiminen voi auttaa ymmärtämään tietomallia paremmin tai tunnistamaan tietojen laatuun liittyviä ongelmia.
Tässä opetusohjelmassa aloitat yksinkertaisella perusesimerkinnällä, jossa kokeillaan vain kolmea taulukkoa, jotta niiden välisiä yhteyksiä on helppo seurata. Sen jälkeen näytät monimutkaisemman esimerkin, jossa on suurempi taulukkojoukko.
Tässä opetusohjelmassa opit
- Käytä semanttisen linkin Python-kirjaston (SemPy) komponentteja, jotka tukevat Power BI -integrointia ja auttavat tietojen analysoinnin automatisoinnissa. Näitä osia ovat seuraavat:
- FabricDataFrame – pandas-kaltainen rakenne, joka on parannettu semanttisten lisätietojen avulla.
- Funktiot semanttisten mallien hakemiseen Fabric-työtilasta muistikirjaan.
- Funktiot, jotka automatisoivat semanttisten mallien suhteiden etsimistä ja visualisointia.
- Semanttisten mallien suhteiden etsimisprosessin vianmääritys, jossa on useita taulukoita ja keskenään riippuvaisia.
Edellytykset
Hanki Microsoft Fabric -tilaus. Voit myös rekisteröityä microsoft fabric -kokeiluversion maksuttomaan .
Vaihda Fabriciin aloitussivun vasemmassa alakulmassa olevan käyttökokemuksen vaihtajan avulla.
- Valitse Työtilat vasemmasta siirtymisruudusta työtilan hakemiseksi ja valitsemiseksi. Tästä työtilasta tulee nykyinen työtilasi.
Seuraa mukana muistikirjassa
relationships_detection_tutorial.ipynb -muistikirja on tämän opetusohjelman mukana.
Jos haluat avata tämän opetusohjelman liitteenä olevan muistikirjan, noudata ohjeita kohdassa Valmistele järjestelmäsi datatiedeopetusohjelmia varten muistikirjan tuomiseksi työtilaasi.
Jos haluat kopioida ja liittää koodin tältä sivulta, voit luoda uuden muistikirjan.
Muista liittää muistikirjaan lakehouse- ennen kuin aloitat koodin suorittamisen.
Muistikirjan asettaminen
Tässä osiossa määrität muistikirjaympäristön, joka sisältää tarvittavat moduulit ja tiedot.
Asenna
SemPy
PyPI:stä käyttämällä muistikirjassa olevaa%pip
asennusominaisuutta:%pip install semantic-link
Suorita semPy-moduulien tarpeellinen tuonti, jotka tarvitset myöhemmin:
import pandas as pd from sempy.samples import download_synthea from sempy.relationships import ( find_relationships, list_relationship_violations, plot_relationship_metadata )
Tuo pandas, jotta voit pakottaa määritysvaihtoehdon, joka auttaa tulosteen muotoilussa:
import pandas as pd pd.set_option('display.max_colwidth', None)
Hae mallitiedot. Tässä opetusohjelmassa käytetään synteettisten potilastietojen Synthea -tietojoukkoa (pieni versio yksinkertaisuuden vuoksi):
download_synthea(which='small')
Suhteiden havaitseminen pienessä Synthea -taulukoiden alijoukossa
Valitse kolme taulukkoa suuremmasta joukkoa:
-
patients
määrittää potilastiedot -
encounters
määrittää potilaat, joilla oli lääketieteellisiä kohtaamisia (esimerkiksi lääkärinkäynti, toimenpide) -
providers
täsmennetään, mitkä lääketieteelliset palveluntarjoajat osallistuivat potilaiden hoitoon
encounters
-taulukko ratkaiseepatients
japroviders
välisen monta-moneen-suhteen, ja sitä voidaan kuvata assositiiviseksi entiteetiksi:patients = pd.read_csv('synthea/csv/patients.csv') providers = pd.read_csv('synthea/csv/providers.csv') encounters = pd.read_csv('synthea/csv/encounters.csv')
-
Etsi taulukoiden väliset suhteet SemPy-
find_relationships
funktiolla:suggested_relationships = find_relationships([patients, providers, encounters]) suggested_relationships
Visualisoi DataFrame-suhteet kaaviona SemPy:n
plot_relationship_metadata
-funktiolla.plot_relationship_metadata(suggested_relationships)
Funktio määrittää suhdehierarkian vasemmalta puolelta oikealle, mikä vastaa tuloksen "from"- ja "to"-taulukoita. Toisin sanoen vasemmalla puolella olevat riippumattomat "from"-taulukot osoittavat oikeanpuoleisiin riippuvuustaulukoihin viiteavaimillaan. Jokaisessa entiteettiruudussa näkyvät sarakkeet, jotka osallistuvat suhteen "kohteesta" tai "to"-puolelle.
Oletusarvon mukaan suhteet luodaan muodossa "m:1" (ei muodossa "1:m") tai "1:1". 1:1-suhteet voidaan luoda jommallakummalla tai kummallakin tavalla sen mukaan, ylittääkö yhdistettyjen arvojen suhde kaikkiin arvoihin
coverage_threshold
vain yhteen tai molempiin suuntiin. Myöhemmin tässä opetusohjelmassa käsittelet m:m-suhteita harvemmin.
Suhteiden tunnistusongelmien vianmääritys
Perusesimerkki näyttää onnistuneen suhteen tunnistamisen puhtaassa Synthea tietoja. Käytännössä tiedot ovat harvoin puhtaita, mikä estää onnistuneen tunnistamisen. On useita tekniikoita, joista voi olla hyötyä, kun tiedot eivät ole puhtaita.
Tässä opetusohjelman osiossa käsitellään suhteiden havaitsemista, kun semanttinen malli sisältää likaista tietoja.
Aloita käsittelemällä alkuperäisiä DataFrames-kehyksiä, jotta saat "likaiset" tiedot, ja tulosta virheellisten tietojen koko.
# 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))
Vertailun vuoksi alkuperäisten taulukoiden tulostuskoot:
print(len(patients)) print(len(providers))
Etsi taulukoiden väliset suhteet SemPy-
find_relationships
funktiolla:find_relationships([patients_dirty, providers_dirty, encounters])
Koodin tulos näyttää, että suhteita ei havaita aiemmin käyttöön otettujen virheellisen semanttisen mallin luomisen virheiden vuoksi.
Käytä vahvistusta
Vahvistus on paras työkalu suhteiden tunnistamisen virheiden vianmääritykseen, koska:
- Se ilmoittaa selvästi, miksi tietty suhde ei noudata viiteavainsääntöjä, joten sitä ei voida havaita.
- Se toimii nopeasti suurten semanttisten mallien kanssa, koska se keskittyy vain määritettyihin suhteisiin eikä suorita hakua.
Vahvistus voi käyttää mitä tahansa DataFrame-kehystä, jos sarakkeet ovat samankaltaisia kuin find_relationships
. Seuraavassa koodissa suggested_relationships
DataFrame viittaa patients
eikä patients_dirty
, mutta voit aliaksena DataFrames-kehyksen hakemiston avulla:
dirty_tables = {
"patients": patients_dirty,
"providers" : providers_dirty,
"encounters": encounters
}
errors = list_relationship_violations(dirty_tables, suggested_relationships)
errors
Löysennä hakuehtoja
Hämärämmissä skenaarioissa voit kokeilla hakuehtojesi löysäämistä. Tämä menetelmä lisää false-positiivisten positiivisten mahdollisuutta.
Määritä
include_many_to_many=True
ja arvioi, auttaako se:find_relationships(dirty_tables, include_many_to_many=True, coverage_threshold=1)
Tulokset osoittavat, että yhteys
encounters
patients
havaittiin, mutta on olemassa kaksi ongelmaa:- Suhde ilmaisee suunnan
patients
:stäencounters
, joka on käänteisenä odotetusta suhteesta. Tämä johtuu siitä, että kaikkipatients
sisältyvätencounters
(Coverage From
on 1,0), kun taasencounters
katetaan vain osittainpatients
(Coverage To
= 0, 85), koska potilaiden rivejä puuttuu. - Pienen kardinaliteetin
GENDER
sarakkeessa on vahingossa vastaavuus, joka sattuu vastaamaan molempien taulukoiden nimeä ja arvoa, mutta se ei ole kiinnostava "m:1"-suhde.Unique Count From
jaUnique Count To
sarakkeet ilmoittavat pienen kardinaliteetin.
- Suhde ilmaisee suunnan
Suorita
find_relationships
uudelleen, jos haluat etsiä vain "m:1"-suhteita, mutta alemmallacoverage_threshold=0.5
:find_relationships(dirty_tables, include_many_to_many=False, coverage_threshold=0.5)
Tulos näyttää suhteiden oikean suunnan
encounters
kohteeseenproviders
. Suhdettaencounters
patients
ei kuitenkaan havaita, koskapatients
ei ole yksilöllinen, joten sitä ei voi olla m:1-suhteen "Yksi"-puolella.Löysennä sekä
include_many_to_many=True
ettäcoverage_threshold=0.5
:find_relationships(dirty_tables, include_many_to_many=True, coverage_threshold=0.5)
Nyt molemmat kiinnostavat suhteet ovat näkyvissä, mutta melua on paljon enemmän:
-
GENDER
matala kardinaliteetti vastaa toisiaan. - Suurempi kardinaliteettivastaavuus "m:m"
ORGANIZATION
ilmaantui, mikä tekee selväksi, ettäORGANIZATION
on todennäköisesti sarake, jonka normalisointi puretaan molempiin taulukoihin.
-
Täsmää sarakkeiden nimet
SemPy ottaa oletusarvoisesti huomioon, että se vastaa vain määritteitä, jotka näyttävät nimien samankaltaisuuden, ja hyödyntää sitä, että tietokannan suunnittelijat nimeävät liittyvät sarakkeet yleensä samalla tavalla. Tämä toiminta auttaa välttämään vääriä suhteita, joita esiintyy useimmin pienen kardinaliteetin kokonaislukuavaimilla. Jos on esimerkiksi 1,2,3,...,10
tuoteluokkia ja 1,2,3,...,10
tilauksen tilakoodia, ne sekoitetaan toisiinsa, kun tarkastellaan arvojen yhdistämismäärityksiä ottamatta huomioon sarakkeiden nimiä. Virheellisten suhteiden ei pitäisi olla ongelmia GUID-tunnuksen kaltaisten avainten kanssa.
SemPy tarkastelee sarakkeiden nimien ja taulukoiden nimien välistä samankaltaisuutta. Vastaavuus on likimääräinen ja kirjainkoolla ei ole merkitystä. Se ohittaa useimmin havaitut "decorator"-alimerkkijonot, kuten "tunnus", "koodi", "nimi", "avain", "pk", "fk". Tämän seurauksena yleisimmät vastaavuustapaukset ovat:
- määrite nimeltä "column" entiteetissä "foo" vastaa määritettä nimeltä "column" (myös "COLUMN" tai "Column") entiteetissä 'bar'.
- entiteetin foo-entiteetissä "column"-määrite vastaa määritettä, jonka nimi on column_id rivillä.
- määrite nimeltä bar entiteetissä "foo" vastaa määritettä nimeltä "code" kohteessa 'bar'.
Tunnistaminen suoritetaan nopeammin, kun sarakkeiden nimet täsmäytellään ensin.
Täsmää sarakkeiden nimet:
- Jos haluat tietää, mitkä sarakkeet on valittu jatkoarviointia varten, käytä
verbose=2
-asetusta (verbose=1
luetteloi vain käsiteltävät entiteetit). -
name_similarity_threshold
-parametri määrittää, miten sarakkeita verrataan. Raja-arvo 1 ilmaisee, että olet kiinnostunut sadasta% vain vastaavuus.
find_relationships(dirty_tables, verbose=2, name_similarity_threshold=1.0);
Jos luku on 100,% samankaltaisuutta ei oteta huomioon pienten nimien välisten erojen vuoksi. Esimerkissä taulukoilla on monikkomuotoinen ja "s"-jälkiliite, minkä tuloksena ei ole tarkkaa vastaavuutta. Tätä käsitellään hyvin oletusasetusten
name_similarity_threshold=0.8
.- Jos haluat tietää, mitkä sarakkeet on valittu jatkoarviointia varten, käytä
Suorita uudelleen käyttäen oletusasetusta
name_similarity_threshold=0.8
:find_relationships(dirty_tables, verbose=2, name_similarity_threshold=0.8);
Huomaa, että monikkomuotoisen
patients
tunnusta verrataan nyt yksikönpatient
lisäämättä liikaa muita vääriä vertailuja suoritusaikaan.Suorita uudelleen käyttäen oletusasetusta
name_similarity_threshold=0
:find_relationships(dirty_tables, verbose=2, name_similarity_threshold=0);
Toinen äärimmäinen
name_similarity_threshold
muuttaminen arvoon 0 on se, että haluat vertailla kaikkia sarakkeita. Tämä on harvoin tarpeen, ja se kasvattaa suoritusaikaa ja vääriä vastaavuuksia, joita on tarkistettava. Huomaa vertailujen määrä yksityiskohtaisessa tulosteessa.
Yhteenveto vianmääritysvihjeistä
- Aloita m:1-suhteiden tarkasta vastaavuuden alusta (eli oletusasetus
include_many_to_many=False
jacoverage_threshold=1.0
). Tämä on yleensä mitä haluat. - Keskity ahtaasti taulukoiden pienempiin alijoukkoihin.
- Käytä vahvistusta tietojen laatuongelmien tunnistamiseen.
- Käytä
verbose=2
, jos haluat ymmärtää, mitä sarakkeita käsitellään suhteessa. Tämä voi aiheuttaa suuren tulostemäärän. - Ota huomioon hakuargumenttien kompromissit.
include_many_to_many=True
jacoverage_threshold<1.0
saattavat aiheuttaa vääriä suhteita, joita voi olla vaikeampi analysoida ja jotka on suodatettava.
Suhteiden havaitseminen Syntheatietojoukossa
Yksinkertainen perusesimerkki oli kätevä oppimis- ja vianmääritystyökalu. Käytännössä voit aloittaa semanttisesta mallista, kuten täydellisestä Synthea tietojoukosta, jossa on paljon enemmän taulukoita. Tutustu tietojoukon
Lue kaikki tiedostot synthea/csv -hakemistosta:
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'), }
Etsi taulukoiden väliset suhteet SemPy-
find_relationships
-funktiolla:suggested_relationships = find_relationships(all_tables) suggested_relationships
Visualisoi suhteet:
plot_relationship_metadata(suggested_relationships)
Laske, kuinka monta uutta "m:m"-suhdetta löydetään
include_many_to_many=True
kanssa. Nämä suhteet täydentävät aiemmin näytettyjä "m:1"-suhteita. Siksi sinun on suodatettavamultiplicity
:suggested_relationships = find_relationships(all_tables, coverage_threshold=1.0, include_many_to_many=True) suggested_relationships[suggested_relationships['Multiplicity']=='m:m']
Voit lajitella suhdetietoja eri sarakkeiden mukaan, jotta saat syvemmän käsityksen niiden luonteesta. Voit esimerkiksi järjestää tulokset
Row Count From
jaRow Count To
mukaan, mikä auttaa tunnistamaan suurimmat taulukot.suggested_relationships.sort_values(['Row Count From', 'Row Count To'], ascending=False)
Erilaisessa semanttisessa mallissa olisi ehkä tärkeää keskittyä tyhjäarvojen määrään
Null Count From
taiCoverage To
.Tämän analyysin avulla voit ymmärtää, voiko jokin suhteista olla virheellinen, ja jos ne on poistettava ehdokasluettelosta.
Aiheeseen liittyvä sisältö
Katso muut opetusohjelmat semanttisesta linkistä /SemPy:stä: