教學課程:使用功能相依性清除數據
在本教學課程中,您會使用功能相依性來清除數據。 當語意模型中的一個數據行是另一個數據行的函式時,就會有功能相依性。 例如,郵遞區編碼數據行可能會決定城市數據行中的值。 功能相依性會將本身顯示為 DataFrame 內兩個或多個數據行中值之間的一對多關聯性。 本教學課程使用 Synthea 數據集來示範功能關聯性如何協助偵測數據質量問題。
在本教學課程中,您會了解如何:
- 套用領域知識,以制定語意模型中功能相依性的假設。
- 熟悉語意連結的 Python 連結庫 (SemPy) 元件,以協助自動化數據品質分析。 這些元件包括:
- FabricDataFrame - 使用其他語意信息增強的 pandas 類似結構。
- 實用的函式,可自動評估有關功能相依性的假設,以及識別語意模型中關聯性的違規。
必要條件
取得 Microsoft Fabric 訂用帳戶。 或者,註冊免費的 Microsoft Fabric 試用版。
登入 Microsoft Fabric。
使用首頁左側的體驗切換器,切換至 Synapse 資料科學 體驗。
- 從左側瀏覽窗格中選取 [工作區 ],以尋找並選取您的工作區。 此工作區會變成您目前的工作區。
在筆記本中跟著
data_cleaning_functional_dependencies_tutorial.ipynb 筆記本隨附本教學課程。
若要開啟本教學課程隨附的筆記本,請遵循準備系統以進行數據科學教學課程中的指示,將筆記本匯入您的工作區。
如果您想要複製並貼上此頁面中的程式碼,您可以 建立新的筆記本。
開始執行程序代碼之前,請務必將 Lakehouse 附加至筆記本 。
設定筆記本
在本節中,您會使用必要的模組和數據來設定筆記本環境。
- 針對 Spark 3.4 和更新版本,使用 Fabric 時,預設運行時間提供語意連結,而且不需要加以安裝。 如果您使用 Spark 3.3 或更新版本,或想要更新為最新版本的 Semantic Link,您可以執行 命令:
python %pip install -U semantic-link
執行稍後所需模組的必要匯入:
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
提取範例數據。 在本教學課程中,您會使用 綜合醫療記錄的 Synthea 數據集(為了簡單起見,小版):
download_synthea(which='small')
探索資料
FabricDataFrame
使用providers.csv檔案的內容初始化 :providers = FabricDataFrame(pd.read_csv("synthea/csv/providers.csv")) providers.head()
繪製自動偵測功能相依性的圖表,以檢查 SemPy 函
find_dependencies
式的數據質量問題:deps = providers.find_dependencies() plot_dependency_metadata(deps)
功能相依性的圖表顯示
Id
決定NAME
和ORGANIZATION
(以實心箭號表示),這是預期,因為Id
是唯一的:確認這是
Id
唯一的:providers.Id.is_unique
程式代碼會傳
True
回 ,以確認這是Id
唯一的。
深入分析功能相依性
功能相依性圖表也會顯示 ORGANIZATION
會如預期般決定 ADDRESS
和 ZIP
。 不過,您可能預期 ZIP
也會判斷 CITY
,但虛線箭號表示相依性只是近似值,指向數據質量問題。
圖表中有其他特殊之處。 例如, NAME
不會判斷 GENDER
、 Id
、 SPECIALITY
或 ORGANIZATION
。 這些特點可能值得調查。
使用 SemPy 函
list_dependency_violations
式檢視與CITY
之間的ZIP
近似關聯性,以查看違規表格式清單:providers.list_dependency_violations('ZIP', 'CITY')
使用 SemPy 的
plot_dependency_violations
視覺效果函式繪製圖表。 如果違規數目很小,此圖表會很有説明:providers.plot_dependency_violations('ZIP', 'CITY')
相依性違規的繪圖會顯示左側的值
ZIP
,以及右側的值CITY
。 如果有包含這兩個值的數據列,邊緣會將繪圖左側的郵遞區編碼與右側的城市連接起來。 邊緣會加上這類數據列計數的批注。 例如,有兩個數據列的郵遞區編碼為 02747-1242、一個具有城市 “NORTH DARTHMOUTH” 的數據列,另一個數據列則包含城市 “DARTHMOUTH”,如上一個繪圖和下列程式代碼所示:執行下列程式代碼,確認您使用相依性違規繪圖所做的先前觀察:
providers[providers.ZIP == '02747-1242'].CITY.value_counts()
此繪圖也顯示,在具有 「DARTHMOUTH」 的數據列中,有 9 個數據列的
CITY
值為ZIP
02747-1262;一個數據列的值為 02747-1242,而一個數據列ZIP
的ZIP
值為 02747-2537。 使用下列程式代碼確認這些觀察:providers[providers.CITY == 'DARTMOUTH'].ZIP.value_counts()
還有其他與 「DARTMOUTH」 相關聯的郵遞區編碼,但這些郵遞區編碼不會顯示在相依性違規圖表中,因為它們不會提示數據質量問題。 例如,郵遞區編碼 「02747-4302」 與 「DARTMOUTH」 是唯一關聯的,而且不會顯示在相依性違規圖表中。 執行下列程式代碼來確認:
providers[providers.ZIP == '02747-4302'].CITY.value_counts()
摘要說明使用 SemPy 偵測到的數據質量問題
回到相依性違規的圖表,您可以看到此語意模型中存在數個有趣的數據質量問題:
- 某些城市名稱全都大寫。 此問題很容易使用字串方法來修正。
- 某些城市名稱有限定符(或前置詞),例如 “North” 和 “East”。 例如,郵遞區編碼 「2128」 對應至 「EAST BOSTON」 一次,並對應至 「BOSTON」 一次。 “NORTH DARTHMOUTH” 和 “DARTHMOUTH” 之間發生類似的問題。 您可以嘗試卸除這些限定符,或將郵遞區編碼對應到最常見的城市。
- 某些城市有錯字,例如 「PITTSFIELD」 與 「PITTSFILED」 和 「NEWBURGPORT 與 NEWBURYPORT」。 對於 「NEWBURGPORT」,可以使用最常見的發生次數來修正此錯字。 針對 「PITTSFIELD」,每個專案只有一個,因此不需要外部知識或使用語言模型,自動消除混淆會更加困難。
- 有時候,如 “West” 的前置詞會縮寫為單一字母 “W”。 如果所有出現的 「W」 代表 「West」 則此問題可能會以簡單的取代來修正。
- 郵遞區編碼 “02130” 對應到 “BOSTON” 一次, “牙買加平原” 一次。 此問題並不容易修正,但如果有更多數據,則對應至最常見的問題可能是潛在的解決方案。
清理資料
將所有大寫變更為標題大小寫來修正大寫問題:
providers['CITY'] = providers.CITY.str.title()
再次執行違規偵測,以查看某些模棱兩可已消失(違規次數較小):
providers.list_dependency_violations('ZIP', 'CITY')
此時,您可以更手動地精簡數據,但其中一個潛在的數據清除工作是使用 SemPy 的
drop_dependency_violations
函式,卸除數據中的數據行之間違反功能限制的數據列。對於行列式變數的每個值,
drop_dependency_violations
可藉由挑選相依變數的最常見值,並卸載具有其他值的所有數據列,來運作。 只有當您確信此統計啟發學習法會導致數據的正確結果時,才應該套用此作業。 否則,您應該撰寫自己的程式代碼,視需要處理偵測到的違規。在與
CITY
資料列上ZIP
執行 函drop_dependency_violations
式:providers_clean = providers.drop_dependency_violations('ZIP', 'CITY')
列出 和
CITY
之間的ZIP
任何相依性違規:providers_clean.list_dependency_violations('ZIP', 'CITY')
程式代碼會傳回空白清單,指出沒有更多違反功能條件約束 CITY -> ZIP。
相關內容
查看語意連結 /SemPy 的其他教學課程:
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應