前言
對于每個從事和資料科學有關的人來說,前期的資料清洗和探索一定是個花費時間的作業,毫不夸張的說,80%的時間我們都花在了前期的資料作業中,包括清洗、處理、EDA(Exploratory Data Analysis,探索性資料分析)等,前期的作業不僅關乎資料的質量,也關乎最終模型預測效果的好壞,
每當我們手上出現一份新的資料時,我們都需要事先通過人為地觀察、欄位釋義等方式預先對資料進行熟悉與理解,在清洗、處理完資料之后才會開始真正的 EDA 程序,
這個程序最通用的操作無非就是對現有的資料做基本性的統計、描述,包括平均值、方差、最大值與最小值、頻數、分位數、分布等,實際上往往都是比較固定且機械的,
在 R 語言中 skimr 包提供了豐富的資料探索性統計資訊,比 Pandas 中的 describe() 基本統計資訊更為豐富一些,
01-skmir
但在 Python 社區中,我們同樣也可以實作 skmir 的功能,甚至比 skmir 有過之而無不及,那就是使用 pandas-profiling 庫來幫助我們搞定前期的資料探索作業,
快速使用
通過 pip install pandas-profiling 之后我們就可以直接匯入并使用了,我們只需要通過其一行核心代碼 ProfileReport(df, **kwargs) 即可實作:
import pandas as pd import seaborn as sns from pandas_profiling import ProfileReport titanic = sns.load_dataset("Titanic") ProfileReport(titanic, title = "The EDA of Titanic Dataset")
如果我們是在 Jupyter Notebook 中使用,則會在 Jupyter Notebook 中渲染最后直接輸出到單元格中,
02-profile
pandas-profiling 庫也擴展了 DataFrame 物件方法,這意味著我們也可以通過像呼叫方法一樣使用 DataFrame.profile_report() 來實作和上述一樣的效果,
無論使用哪種方式,最后都是生成一個 ProfileReport 物件;如果要進一步貼合 Jupyter Notebook,可以直接呼叫 to_widgets() 和 to_notebook_iframe() 來分別生成掛架或對應的組件,在展示效果上會更加美觀,而不是在輸出欄進行展示,
03-widgets
如果不在 Jupyter Notebook 中直接使用,而是使用其他 IDE,那么我們可以通過 to_file() 方法來直接將報告輸出,需要注意的是最后保存的檔案名需要加上擴展名 .html,
另外,Pandas-profiling 還和多個框架、云上平臺等進行了集成,能夠讓我們方便的進行呼叫,詳情見官網(https://pandas-profiling.github.io/pandas-profiling/docs/master/rtd/pages/integrations.html),
進一步定制報告資訊
雖然生成的探索性報告基本上已經能滿足我們了解資料的簡單需求,但是當中輸出的資訊也有些不足或是冗余,好在 pandas-profiling 也給我們提供了自己定制的可能,這些定制的配置最侄訓寫入到 yaml 檔案中,
在官方檔案中列出了幾個我們能夠進一步調整的部分,分別對應了報告 Tab 欄的各部分標簽:
- vars:主要用于調整資料中欄位或變數在報告中的呈現的統計指標
- missing_diagrams:主要涉及到關于缺失值欄位的可視化展示
- correlations:顧名思義即調整有關各欄位或變數之間相關關系的部分,包括是否計算相關系數、以及相關的閾值等
- interactions:主要涉及兩兩欄位或變數之前的相關關系圖呈現
- samples:分別對應了 Pandas 中 head() 和 tail() 方法,即預覽前后多少條資料
這些部分還有許多可以指定的引數,感興趣的朋友可以直接參考官方檔案https://pandas-profiling.github.io/pandas-profiling/docs/master/rtd/pages/advanced_usage.html
于是我們可以直接在代碼中手動寫入并進行調整,就像這樣:
profile_config = { "progress_bar": False, "sort": "ascending", "vars": { "num": {"chi_squared_threshold": 0.95}, "cat": {"n_obs": 10} }, "missing_diagrams": { 'heatmap': False, 'dendrogram': False, } } profile = titanic.profile_report(**profile_config) profile.to_file("titanic-EDA-report.html")
將所有配置的資訊寫在一個字典變數中,再通過 **variable 的形式將鍵值對進行解包使其能夠根據鍵來對應到相應的引數中,
除了代碼中的配置寫法外,如果你稍微了解一點 yaml 組態檔的寫法,那么我們也無需在代碼中逐個寫入,而是可以通過在 yaml 檔案中修改,修改的不僅官方檔案中所列出的配置選項,還能修改未列出的引數,由于組態檔過長,這里我只放出基于官方默認組態檔 config_default.yaml 自己做出修改的部分:
# profile_config.yml vars: num: quantiles: - 0.25 - 0.5 - 0.75 skewness_threshold: 10 low_categorical_threshold: 5 chi_squared_threshold: 0.95 cat: length: True unicode: True cardinality_threshold: 50 n_obs: 5 chi_squared_threshold: 0.95 coerce_str_to_date: False bool: n_obs: 3 file: active: False image: active: False exif: True hash: True sort: "desceding"
修改完 yaml 檔案之后,我們只需在生成報告時通過 config_file 引數指定組態檔所在的路徑即可,就像這樣:
df.profile_report(config_file = "你的檔案路徑.yml")
通過將組態檔與核心代碼相分離,以提高我們代碼的簡潔性與可讀性,
最后
pandas-profiling 庫為我們提供了一種方便、快捷的資料探索方式,提供了比基本統計資訊更為豐富的一些資訊(如缺失值相關圖、相關關系圖等),能夠為我們前期的資料探索作業節省出大量的時間,
不過由于 pandas-profiling 生成的報告維度相對來說比較固定和模板化,所以對于想讓報告更加豐富的朋友來說你可能需要自己再去做一些額外的作業了;同時,需要注意的是,pandas-profiling 比較適合在中小資料集中使用,隨著資料量的增加,報告渲染的速度會大幅度變慢且生成報告會耗時更多,
如果你仍有對大資料集進行 EDA 的需要,那么像官方檔案說的那樣你最好是通過抽樣或者采樣的方式來在不影響資料分布的情況下減少樣本量,官方也有表示會在以后的版本中使用 modin、spark 和 dask 等高性能的庫或框架作為可擴展的后端,到那時也許生成大資料集的 EDA 報告時可能就不是問題了,
PS:如有需要Python學習資料的小伙伴可以加下方的群去找免費管理員領取
可以免費領取原始碼、專案實戰視頻、PDF檔案等
本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理,
作者:資料不吹牛
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/33686.html
標籤:Python
