Handledning: Rensa data med funktionella beroenden
I den här handledningen använder du funktionella beroenden för datarensning. Det finns ett funktionellt beroende när en kolumn i en semantisk modell (en Power BI-datauppsättning) är en funktion i en annan kolumn. Till exempel kan en postnummer-kolumn bestämma värdena i en stad-kolumn. Ett funktionellt beroende manifesterar sig som en en-till-många-relation mellan värdena i två eller flera kolumner i en DataFrame. I den här handledningen används datamängden Synthea för att visa hur funktionella relationer kan hjälpa till att identifiera datakvalitetsproblem.
I den här guiden lär du dig att:
- Använd domänkunskap för att formulera hypoteser om funktionella beroenden i en semantisk modell.
- Bekanta dig med komponenter i semantiklänkens Python-bibliotek (SemPy) som hjälper dig att automatisera datakvalitetsanalys. Dessa komponenter omfattar:
- FabricDataFrame – en Pandas-liknande struktur som utökas med ytterligare semantisk information.
- Användbara funktioner som automatiserar utvärderingen av hypoteser om funktionella beroenden och som identifierar överträdelser av relationer i dina semantiska modeller.
Förutsättningar
Få en Microsoft Fabric prenumeration. Eller registrera dig för en kostnadsfri Microsoft Fabric-utvärderingsversion.
Logga in på Microsoft Fabric.
Använd upplevelseväxlaren längst ner till vänster på din startsida för att växla till Fabric.
- Välj Arbetsytor i det vänstra navigeringsfönstret för att hitta och välja din arbetsyta. Den här arbetsytan blir din aktuella arbetsyta.
Följ med i anteckningsboken
Den data_cleaning_functional_dependencies_tutorial.ipynb notebook-filen medföljer den här självstudien.
Om du vill öppna den medföljande notebook-filen för den här handledningen följer du anvisningarna i Förbereda systemet för handledningar för datavetenskap för att importera anteckningsboken till din arbetsyta.
Om du hellre kopierar och klistrar in koden från den här sidan kan du skapa en ny notebook-fil.
Se till att koppla en lakehouse till anteckningsbok innan du börjar köra kod.
Konfigurera anteckningsboken
I det här avsnittet konfigurerar du en notebook-miljö med nödvändiga moduler och data.
- För Spark 3.4 och senare är Semantic link tillgänglig i standardkörmiljön när du använder Fabric, och det behövs inte installeras. Om du använder Spark 3.3 eller senare, eller om du vill uppdatera till den senaste versionen av Semantic Link, kan du köra kommandot:
python %pip install -U semantic-link
Utför nödvändiga importer av moduler som du behöver senare:
import pandas as pd import sempy.fabric as fabric from sempy.fabric import FabricDataFrame from sempy.dependencies import plot_dependency_metadata from sempy.samples import download_synthea
Hämta exempeldata. I den här självstudien använder du Synthea datauppsättning för syntetiska medicinska journaler (liten version för enkelhetens skull):
download_synthea(which='small')
Utforska data
Initiera en
FabricDataFrame
med innehållet från providers.csv-filen.providers = FabricDataFrame(pd.read_csv("synthea/csv/providers.csv")) providers.head()
Identifiera datakvalitetsproblem med SemPys
find_dependencies
-funktion genom att rita ett diagram över automatiskt upptäckta funktionella beroenden.deps = providers.find_dependencies() plot_dependency_metadata(deps)
Diagrammet över funktionella beroenden visar att
Id
bestämmerNAME
ochORGANIZATION
(indikeras av de fasta pilarna), vilket är förväntat eftersomId
är unikt:Bekräfta att
Id
är unikt:providers.Id.is_unique
Koden returnerar
True
för att bekräfta attId
är unik.
Analysera funktionella beroenden på djupet
Diagrammet funktionella beroenden visar också att ORGANIZATION
avgör ADDRESS
och ZIP
, som förväntat. Du kan dock förvänta dig att ZIP
också fastställer CITY
, men den streckade pilen anger att beroendet bara är ungefärligt och pekar mot ett datakvalitetsproblem.
Det finns andra egenheter i diagrammet.
NAME
avgör till exempel inte GENDER
, Id
, SPECIALITY
eller ORGANIZATION
. Var och en av dessa egenheter kan vara värt att undersöka.
Ta en djupare titt på den ungefärliga relationen mellan
ZIP
ochCITY
genom att använda SemPyslist_dependency_violations
-funktion för att se en tabelllista över överträdelser:providers.list_dependency_violations('ZIP', 'CITY')
Rita ett diagram med SemPys
plot_dependency_violations
visualiseringsfunktion. Det här diagrammet är användbart om antalet överträdelser är litet:providers.plot_dependency_violations('ZIP', 'CITY')
Diagrammet över beroendeöverträdelser visar värden för
ZIP
till vänster och värden förCITY
till höger. En kant ansluter ett postnummer till vänster i diagrammet med en stad till höger om det finns en rad som innehåller dessa två värden. Kanterna kommenteras med antalet sådana rader. Det finns till exempel två rader med postnummer 02747-1242, en rad med staden "NORTH DARTHMOUTH" och den andra med staden "DARTHMOUTH", som du ser i föregående diagram och följande kod:Bekräfta de tidigare observationer du gjorde med diagrammet över beroendeöverträdelser genom att köra följande kod:
providers[providers.ZIP == '02747-1242'].CITY.value_counts()
Diagrammet visar också att bland de rader som har
CITY
som "DARTHMOUTH" har nio rader enZIP
02747-1262; en rad har enZIP
02747-1242; och en rad har enZIP
02747-2537. Bekräftar dessa observationer med följande kod:providers[providers.CITY == 'DARTMOUTH'].ZIP.value_counts()
Det finns andra postnummer som är associerade med "DARTMOUTH", men dessa postnummer visas inte i diagrammet över beroendeöverträdelser, eftersom de inte antyder datakvalitetsproblem. Postnumret "02747-4302" är till exempel unikt associerat med "DARTMOUTH" och visas inte i diagrammet över beroendeöverträdelser. Bekräfta genom att köra följande kod:
providers[providers.ZIP == '02747-4302'].CITY.value_counts()
Sammanfatta datakvalitetsproblem som identifierats med SemPy
Om du går tillbaka till diagrammet över beroendeöverträdelser kan du se att det finns flera intressanta problem med datakvaliteten i den här semantiska modellen:
- Vissa stadsnamn är skrivna med stora bokstäver. Det här problemet är enkelt att åtgärda med hjälp av strängmetoder.
- Vissa stadsnamn har kvalificerare (eller prefix), till exempel "North" och "East". Postnumret "2128" mappar till exempel till "EAST BOSTON" en gång och till "BOSTON" en gång. Ett liknande problem uppstår mellan "NORTH DARTHMOUTH" och "DARTHMOUTH". Du kan försöka ta bort dessa kvalificerare eller mappa postnummer till staden med flest förekomster.
- Det finns stavfel i vissa städer, till exempel "PITTSFIELD" jämfört med "PITTSFILED" och "NEWBURGPORT vs. "NEWBURYPORT". För "NEWBURGPORT" kan det här stavfelet åtgärdas med hjälp av den vanligaste förekomsten. För "PITTSFIELD" gör det faktum att det bara finns en förekomst var det mycket svårare för automatisk avklaring utan extern kunskap eller användning av en språkmodell.
- Ibland förkortas prefix som "West" till en enda bokstav "W". Det här problemet kan eventuellt åtgärdas med en enkel ersättning om alla förekomster av "W" står för "West".
- Postnumret "02130" mappar till "BOSTON" en gång och "Jamaica Plain" en gång. Det här problemet är inte lätt att åtgärda, men om det fanns mer data kan mappning till den vanligaste förekomsten vara en potentiell lösning.
Rensa data
Åtgärda problem med versaler genom att ändra alla versaler till rubrikfall:
providers['CITY'] = providers.CITY.str.title()
Kör överträdelseidentifieringen igen för att se att vissa tvetydigheter är borta (antalet överträdelser är mindre):
providers.list_dependency_violations('ZIP', 'CITY')
I det här läget kan du förfina dina data mer manuellt, men en potentiell datarensningsaktivitet är att släppa rader som bryter mot funktionella begränsningar mellan kolumner i data med hjälp av SemPys
drop_dependency_violations
funktion.För varje värde för den determinanta variabeln fungerar
drop_dependency_violations
genom att välja det vanligaste värdet för den beroende variabeln och släppa alla rader med andra värden. Du bör endast tillämpa den här åtgärden om du är säker på att den här statistiska heuristiken skulle leda till rätt resultat för dina data. Annars bör du skriva din egen kod för att hantera de identifierade överträdelserna efter behov.Kör funktionen
drop_dependency_violations
på kolumnernaZIP
ochCITY
:providers_clean = providers.drop_dependency_violations('ZIP', 'CITY')
Lista eventuella beroendeöverträdelser mellan
ZIP
ochCITY
:providers_clean.list_dependency_violations('ZIP', 'CITY')
Koden returnerar en tom lista som anger att det inte finns fler överträdelser av funktionsbegränsningen CITY –> ZIP-.
Relaterat innehåll
Kolla in andra handledningar för Semantisk länk / SemPy:
- Självstudie: Analysera funktionella beroenden i en exempelsemantisk modell
- Självstudie: Extrahera och beräkna Power BI-mått från en Jupyter Notebook-
- Självstudie: Identifiera relationer i en semantisk modell med hjälp av semantisk länk
- Självstudie: Identifiera relationer i datauppsättningen Synthea med hjälp av semantisk länk
- Självstudie: Verifiera data med SemPy och Great Expectations (GX)