前言
本文是根據python官方教程中標準庫模塊的介紹,自己查詢資料并整理,編寫代碼示例做出的學習筆記。
根據模塊知識,一次講解單個或者多個模塊的內容。
教程鏈接:https://docs.python.org/zh-cn/3/tutorial/index.html
質量控制
質量控制(Quality Control, QC),主要關注于提高代碼質量、確保數據準確性和程序穩定性。
數據質量
數據質量是指數據滿足其預定用途所要求的準確性、完整性、一致性、及時性和有效性的程度。良好的數據質量是數據分析、決策支持以及模型訓練等過程成功的基礎。把控數據質量主要包括以下幾個方面:
數據質量的要素:
- 準確性:數據是否正確無誤,沒有錯誤或偏差。
- 完整性:數據集中是否存在缺失值或丟失的信息。
- 一致性:數據內部及跨數據集之間是否存在矛盾或不匹配。
- 時效性:數據是否是最新的,能否反映當前狀況。
- 有效性:數據是否符合預期的格式和范圍,如日期格式正確、數值在合理范圍內。
- 唯一性:記錄是否有重復。
- 可追溯性:數據的來源和變更歷史是否清晰可查。
如何把控數據質量:
- 數據驗證規則:定義一套數據驗證規則,比如字段格式、范圍限制、唯一性約束等,并在數據輸入時或定期進行檢查。
- 數據清洗:使用Python中的Pandas等庫進行數據清洗,包括處理缺失值、去除重復數據、糾正錯誤數據等。
- 數據質量報告:定期生成數據質量報告,包括數據概況、缺失值統計、異常值檢測等,以便監控數據質量變化。
- 自動化檢查:利用腳本或工具自動化執行數據質量檢查任務,提高效率并減少人為錯誤。
- 數據治理:建立數據治理框架,明確數據責任人,制定數據管理策略和流程,確保數據從源頭到應用的每個環節都有質量控制。
- 用戶反饋循環:鼓勵數據使用者反饋數據問題,建立快速響應機制,及時修正數據錯誤。
- 持續監控:實施數據質量監控系統,對關鍵指標進行實時或定期監控,一旦發現數據質量問題立即報警并采取措施。
通過上述方法,可以在Python中有效地把控數據質量,確保數據分析和決策基于可靠的數據基礎之上。
數據清洗
數據清洗是數據預處理的關鍵步驟,旨在識別并糾正數據集中的錯誤、不完整、不準確或無關的部分,以提升數據質量,確保后續分析或建模的準確性。
在Python中,數據清洗通常借助pandas庫完成。
示例
- 打開文件,read_xxx()。常用的入參就是文件路徑和編碼,如過有用到其他參數的用法,臨時再學就好了。
import pandas as pd# 打開一個名為"test.csv"的文件,沒有就新建一個,我就是新建的
df = pd.read_csv('test.csv', encoding='gbk')
pd模塊中還有很多read開頭的函數,自行嘗試。
-
head(n=5)函數:獲取指定行數信息
這個函數可以獲取你拿到的數據的指定行數的部分,默認值是五。# 讀取一下文件的信息,打印1行試試 print(df.head(1))
這是打印出的數據
這是文件內容,注意我們的是csv文件,從Alice開始的才算是正式的數據
再換成打印3行試試,因為我們數據就3行
可以看到,數據全部打印了,前面有012,這個很好理解,我不多解釋了。 -
info()函數:獲取數據信息
函數用于展示DataFrame(簡單理解為就是我們打開的數據)的結構、類型和內存使用情況。使用起來很簡單,直接調用就好了。
參數說明
- verbose:默認為None,如果設置為True或False,將覆蓋pd.options.display.max_info_columns的設置,控制是否打印所有列的詳細信息。如果DataFrame的列數超過max_info_columns,默認行為是僅顯示前后的部分列。
- buf:默認為sys.stdout,指定輸出信息的目標,可以是一個文件對象或者具有write()方法的任何對象。
- max_cols:控制在詳細輸出中顯示的最大列數。如果DataFrame的列數超過這個值,且verbose未被顯式設置,那么將顯示簡略的摘要而非所有列的詳情。默認值來自pd.options.display.max_info_columns。
- memory_usage:控制是否顯示DataFrame及其索引的內存使用情況。可以是布爾值(True/False),或者字符串"deep"。"deep"會更深入地計算內存使用,包括嵌套結構的內存。默認情況下,僅顯示內存使用情況的摘要。
- null_counts:在pandas的新版本中,此參數已被移除,因為現在默認總是顯示非空值的數量。
返回值
info()函數本身不返回任何值,而是直接打印輸出到控制臺或指定的緩沖區。輸出內容通常包括:- DataFrame的總行數和列數。
- 每列的名稱、非空值數量、數據類型。
- 索引的類型和非空值數量。
- 如果設置了memory_usage=True或memory_usage=‘deep’,還會顯示DataFrame及其索引的內存使用量。
print(df.info())
稍微解釋一下:- 類信息:<class ‘pandas.core.frame.DataFrame’> 表明df是一個pandas的DataFrame對象。
- 索引范圍:RangeIndex: 3 entries, 0 to 2 表示DataFrame有3行數據,索引是從0到2的整數序列。
- 數據列詳情:
- 列出了每一列的名稱(Column)、非空值的數量(Non-Null Count)以及數據類型(Dtype)。
- 列1 (Name):3個非空值,數據類型為object(通常表示字符串)。
- 列2 (Age):3個非空值,數據類型為int64(整數)。
- 列3 (City):3個非空值,數據類型為object(通常表示字符串)。
- 數據類型匯總:dtypes: int64(1), object(2) 總結了DataFrame中各數據類型的列數。這里說明有1列是int64類型,2列是object類型。
- 內存使用:memory usage: 204.0+ bytes 表示該DataFrame占用的大約內存大小。注意這里的“+”表明計算可能不是完全精確的,特別是當使用memory_usage='deep’時,但對于估計內存消耗很有幫助。
- 結尾的None:這是因為df.info()函數實際上沒有返回值(返回None),它直接將信息輸出到控制臺。當你在Python腳本或交互式環境中 調用print(df.info())時,最終的None是由print函數打印出來的,表示df.info()執行完畢并沒有返回任何可供打印的實際內容。
-
isnull()函數:獲取缺失值對象
print(df.isnull)
這個函數會返回一個和原來數據結構相同但是為布爾值的對象,通過這個對象,我們可以對數據中的缺失值進行操作。
簡單修改一下原來的數據。
通過isnull函數,我們可以明確看到哪一行哪一列有缺失值,通過sum函數,我們可以明確知道的哪一列缺失了幾個值。
通過前后幾次的輸出對比,可以明顯發現我們已經將name一列的缺失值補充上去,并且為我們設置的值x。
最后輸出框中出現一堆紅色的告警,提示的是關于鏈式賦值(chained assignment)和 inplace 操作的問題。pandas 3.0版本中,這種通過鏈式賦值進行的inplace操作可能不再有效,因為中間對象可能被視為原對象的一個副本,而不是原對象本身。
為了避免這個警告并確保代碼在未來版本的pandas中也能正常工作,您可以按照警告的建議采用以下兩種方式之一:df.method({col: value}, inplace=True)或者df[col] = df[col].method(value)。換成我們的代碼就是
# 方法1 df.fillna({'Name': "x"}, inplace=True) # 方法2 df['Name'] = df['Name'].fillna("x")
-
dropna()函數:刪除有缺失值的行
# 直接刪除含有缺失值的行 df.dropna(inplace=True)
-
drop_duplicates()函數:刪除重復數據
df.drop_duplicates(inplace=True)
-
astype()函數:類型轉換
# 將某列轉換為整型 df['column_name'] = df['column_name'].astype(int)
注意如果列有缺失值,可能會導致轉換失敗,別問我怎么知道的。 -
文本數據清洗:
.str
# 去除空格 df['text_column'] = df['text_column'].str.strip() # 大小寫 df['text_column'] = df['text_column'].str.lower()
這個就不單獨運行了,看函數名就知道啥作用
-
replace()函數:替換特定值
df['column_name'].replace('old_value', 'new_value', inplace=True)
數據清洗的方法還有很多,想寫完不太可能,寫一些常用的簡單的認知一下即可。
結尾
數據質量不止數據清洗這一項,還有其他很多項,但是基本都是配合著一起來的。這里只是初步認知,不需要講那么多。大概都了解了,就進到項目那一塊去,等你寫出一個項目,比如一個小游戲后,成就感足以讓你繼續向下努力學習了,這里太深入講只會浪費熱情,耐心。