Dela via


Handledning: Rensa data med funktionella beroenden

Använd funktionella beroenden för att rensa data. Det finns ett funktionellt beroende när en kolumn i en semantisk modell (en Power BI-datauppsättning) är beroende av en annan kolumn. En kolumn kan till exempel ZIP code fastställa värdet i en city kolumn. Ett funktionellt beroende visas som en en-till-många-relation mellan värden i två eller flera kolumner i en DataFrame. I den här självstudien används Synthea-datamängden för att visa hur funktionella beroenden hjälper till att identifiera datakvalitetsproblem.

I den här guiden lär du dig att:

  • Använd domänkunskap för att skapa hypoteser om funktionella beroenden i en semantisk modell.
  • Bekanta dig med komponenter i Semantic Link Python-biblioteket (SemPy) som automatiserar datakvalitetsanalys. Dessa komponenter omfattar:
    • FabricDataFrame— en Pandas-liknande struktur med ytterligare semantisk information.
    • Funktioner som automatiserar utvärdering av hypoteser om funktionella beroenden och identifierar överträdelser i dina semantiska modeller.

Förutsättningar

  • Välj Arbetsytor i navigeringsfönstret och välj sedan din arbetsyta för att ange den som den aktuella arbetsytan.

Följ med i anteckningsboken

Följ den här självstudien med notebook-filen data_cleaning_functional_dependencies_tutorial.ipynb .

Konfigurera anteckningsboken

I det här avsnittet konfigurerar du en notebook-miljö.

  1. Kontrollera Spark-versionen. Om du använder Spark 3.4 eller senare i Microsoft Fabric ingår Semantic Link som standard, så du behöver inte installera det. Om du använder Spark 3.3 eller tidigare, eller om du vill uppdatera till den senaste Semantic Link, kör du följande kommando.

    %pip install -U semantic-link
    
  2. Importera de moduler som du använder i den här notebook-filen.

    import pandas as pd
    import sempy.fabric as fabric
    from sempy.fabric import FabricDataFrame
    from sempy.dependencies import plot_dependency_metadata
    
  3. Ladda ned exempeldata. I den här självstudien använder du Synthea-datamängden för syntetiska medicinska journaler (liten version för enkelhetens skull).

    download_synthea(which='small')
    

Utforska data

  1. Initiera en FabricDataFrame med innehållet i providers.csv-filen .

    providers = FabricDataFrame(pd.read_csv("synthea/csv/providers.csv"))
    providers.head()
    
  2. Kontrollera om det finns datakvalitetsproblem med SemPys find_dependencies funktion genom att rita en graf över autodetected funktionella beroenden.

    deps = providers.find_dependencies()
    plot_dependency_metadata(deps)
    

    Skärmbild av ett funktionellt beroendediagram som visar ID bestämmer NAMN och ORGANISATION.

    Diagrammet visar som Id bestämmer NAME och ORGANIZATION. Det här resultatet förväntas eftersom Id det är unikt.

  3. Bekräfta att det Id är unikt.

    providers.Id.is_unique
    

    Koden returnerar True för att bekräfta att Id ä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, SPECIALITYeller ORGANIZATION. Var och en av dessa egenheter kan vara värt att undersöka.

  1. Ta en djupare titt på den ungefärliga relationen mellan ZIP och CITY med hjälp av SemPys list_dependency_violations funktion för att lista överträdelserna:
providers.list_dependency_violations('ZIP', 'CITY')
  1. 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')

Skärmbild av diagrammet över beroendeöverträdelser.

Diagrammet över beroendeöverträdelser visar värden för ZIP på vänster sida och värden för CITY 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:

  1. Bekräfta observationerna från diagrammet genom att köra följande kod:
providers[providers.ZIP == '02747-1242'].CITY.value_counts()
  1. Diagrammet visar också att bland de rader som har CITY som "DARTHMOUTH" har nio rader en ZIP på 02747-1262. En rad har ZIP 02747-1242. En rad har ZIP 02747-2537. Bekräfta dessa observationer med följande kod:

    providers[providers.CITY == 'DARTHMOUTH'].ZIP.value_counts()
    
  2. 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

Diagrammet över beroendeöverträdelser visar flera datakvalitetsproblem i den här semantiska modellen:

  • Vissa ortnamn är versaler. Åtgärda problemet 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 DARTMOUTH" och "DARTMOUTH". Släpp dessa kvalificerare eller mappa postnummer till staden med den vanligaste förekomsten.
  • Det finns stavfel i vissa stadsnamn, som "PITTSFIELD" jämfört med "PITTSFILED" och "NEWBURGPORT" jämfört med "NEWBURYPORT". För "NEWBURGPORT" löser du det här stavfelet med hjälp av den vanligaste förekomsten. För "PITTSFIELD", med bara en förekomst vardera, är automatisk tvetydighet mycket svårare utan extern kunskap eller en språkmodell.
  • Ibland förkortas prefix som "West" till den enda bokstaven "W". Ersätt "W" med "West" 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. Med mer data mappar du till den vanligaste förekomsten.

Rensa data

  1. Åtgärda versaler genom att ändra värden till rubrikfall.

    providers['CITY'] = providers.CITY.str.title()
    
  2. Kör överträdelseidentifiering igen för att bekräfta att det finns färre tvetydigheter.

    providers.list_dependency_violations('ZIP', 'CITY')
    

Förfina data manuellt eller ta bort rader som bryter mot funktionella begränsningar mellan kolumner med hjälp av SemPy-funktionen drop_dependency_violations .

För varje värde för den determinanta variabeln drop_dependency_violations väljer du det vanligaste värdet för den beroende variabeln och släpper alla rader med andra värden. Använd endast den här åtgärden om du är säker på att den här statistiska heuristiken leder till korrekta resultat för dina data. Annars skriver du din egen kod för att hantera de identifierade överträdelserna.

  1. drop_dependency_violations Kör funktionen på kolumnerna ZIP ochCITY.

    providers_clean = providers.drop_dependency_violations('ZIP', 'CITY')
    
  2. Lista eventuella beroendeöverträdelser mellan ZIP och CITY.

    providers_clean.list_dependency_violations('ZIP', 'CITY')
    

Koden returnerar en tom lista som anger att det inte finns några fler överträdelser av funktionsbegränsningen ZIP -> CITY.

Se andra självstudier för semantisk länk eller SemPy: