数据清洗
封装算法类
-
重复值处理类
-
删除重复值
-
-
缺失值处理类
-
删除缺失值
-
平均数填补缺失值
-
中位数填补缺失值
-
众数填补缺失值
-
拉格朗日插值法
-
多变量插补法
-
决策树回归插补法
-
随机森林插补法
-
knn回归算法插补
-
svr插补法
-
多重插补法
-
线性回归预测填补缺失值
-
-
异常值检测类
-
使用3sigma方法检测异常值
-
使用Z-score方法检测异常值
-
使用箱线法检测异常值
-
使用grubbs test-假设检验方法检测异常值
-
使用K-近邻方法检测异常值
-
使用局部离群离子(LOF)方法检测异常值
-
使用DBSCAN方法检测异常值
-
使用孤立森林方法检测异常值
-
-
处理时间类
-
转换为datetime类型,并提取年月日时分秒
-
-
处理编码类
-
onehot编码
-
label编码
-
业务类
1. 重复值处理
-
删除重复值
if duplicates: # 检测重复值 duplicate_mask = df.duplicated() # 获取重复值的内容 duplicate_values = df[duplicate_mask] duplicate_values) # 删除重复值的行 df = HandleDuplicates.drop_duplicates(df)
2. 缺失值处理
-
删除缺失值
if missing_values_method == 'delete': df = HandleMissingValues.drop_missing_values(df)
-
平均值、中位数、众数填补缺失值
# 平均值,中值或众数填补缺失值 elif missing_values_method in ['mean', 'median', 'most_frequent']: df_fill = HandleMissingValues.simple_imputation(df_num, missing_values_method)
-
拉格朗日插值法
# 使用拉格朗日插值法填补缺失值 if missing_values_method == 'lagrange': df_fill = HandleMissingValues.lagrange_interpolation(df_num)
-
多变量插补法
# 使用多变量插补法填补缺失值。 elif missing_values_method == 'multivariate': df_fill = HandleMissingValues.multivariate_imputation(df_num,estimator=multivariate_estimator, max_iter=multivariate_max_iter, random_state=multivariate_random_state)
重要参数:
-
estimator:指定用于估计缺失值的回归器,默认为 None。
-
max_iter:指定迭代次数的最大值,默认为 10。
-
random_state:指定随机数生成器的种子。
当 random_state 的值为 None 时,每次运行时会使用不同的随机种子,因此得到的随机结果也会不同。而当值为一个固定的整数时(例如 0),每次运行时都会使用相同的随机种子,从而确保得到相同的随机结果。
-
-
决策树回归插补法
# 使用决策树回归插补法填补缺失值。 elif missing_values_method == 'decision_tree': df_fill = HandleMissingValues.decision_tree_imputation(df_num,criterion=decision_tree_criterion, max_depth=decision_tree_max_depth)
重要参数:
-
criterion:指定划分节点的标准。
{平方误差:"squared_error",均方误差:"friedman_mse",绝对误差:"absolute_error", 泊松损失函数:"poisson"}
-
max_depth:决策树最大深度
-
-
随机森林插补法
# 使用随机森林插补法填补缺失值。 elif missing_values_method == 'random_forest': df_fill = HandleMissingValues.random_forest_imputation(df_num,criterion=random_forest_criterion, max_depth=random_forest_max_depth, n_estimators=random_forest_n_estimators)
重要参数:
-
criterion:指定划分节点的标准。
{平方误差:"squared_error",均方误差:"friedman_mse",绝对误差:"absolute_error", 泊松损失函数:"poisson"}
-
max_depth:树的最大深度
-
n_estimators:随机森林中树的数量
-
-
knn回归算法
# 使用KNN回归插补法填补缺失值。 elif missing_values_method == 'knn': df_fill = HandleMissingValues.knn_imputation(df_num,n_neighbors=knn_n_neighbors)
重要参数:
-
n_neighbors:KNN 中的邻居数量
-
-
svr插补法
# 使用SVR 插补法填补缺失值。 elif missing_values_method == 'svr': df_fill = HandleMissingValues.svr_imputation(df_num,kernel=svr_kernel,C=svr_C,epsilon=svr_epsilon)
重要参数:
-
kernel:SVR 的核函数
可选 {线性核:'linear', 径向基函数核:'poly',多项式核:'rbf', sigmoid核:'sigmoid'}
-
C:SVR 的惩罚参数
-
epsilon:SVR 的不敏感损失函数中的ε参数
-
-
多重插补法
# 使用多重插补法填补缺失值。 elif missing_values_method == 'multiple': df_fill = HandleMissingValues.multiple_imputation(df_num,estimator=multiple_estimator, max_iter=multiple_max_iter, random_state=multiple_random_state)
重要参数:
-
estimator:指定用于估计缺失值的回归器,默认为 None。
-
max_iter:指定迭代次数的最大值,默认为 10。
-
random_state:指定随机数生成器的种子。
当 random_state 的值为 None 时,每次运行时会使用不同的随机种子,因此得到的随机结果也会不同。而当值为一个固定的整数时(例如 0),每次运行时都会使用相同的随机种子,从而确保得到相同的随机结果。
-
-
线性回归预测填补缺失值
# 使用线性回归预测填补缺失值 elif missing_values_method == 'lin_regression': df_fill = HandleMissingValues.lin_regression_impute(df_num)
3. 异常值处理
3.1 检测异常值
-
使用3sigma方法检测异常值
if method == '3sigma': df_bool = HandleOutliers.handle_3sigma(df_num)
-
使用Z-score方法检测异常值
elif method == 'Z_score': df_bool = HandleOutliers.handle_Z_score(df_num,threshold=Z_score_threshold)
重要参数:
-
threshold:阈值
-
-
使用箱线法检测异常值
elif method == 'boxplot': df_bool = HandleOutliers.handle_boxplot(df_num)
-
使用grubbs test-假设检验方法检测异常值
elif method == 'grubbs_test': df_bool = HandleOutliers.handle_grubbs_test(df_num)
-
使用K-近邻方法检测异常值
elif method == 'knn': df_bool = HandleOutliers.handle_knn(df_num,n_neighbors=knn_de_n_neighbors, contamination=knn_de_contamination)
重要参数:
-
n_neighbors:邻居点的数量
-
contamination:异常值的比例
-
-
使用局部离群离子(LOF)方法检测异常值
elif method == 'LOF': df_bool = HandleOutliers.handle_LOF(df_num,n_neighbors=LOF_neighbors, contamination=LOF_contamination)
重要参数:
-
n_neighbors:邻居点的数量
-
contamination:异常值的比例
-
-
使用DBSCAN方法检测异常值
elif method == 'DBSCAN': df_bool = HandleOutliers.handle_DBSCAN(df_num,eps=DBSCAN_eps,min_samples=DBSCAN_min_samples)
重要参数:
-
eps:邻域半径
-
min_samples:最小样本数
-
-
使用孤立森林方法检测异常值
elif method == 'iForest': df_bool = HandleOutliers.handle_iForest(df_num,n_estimators=iForest_n_estimators, contamination=iForest_contamination)
重要参数:
-
n_estimators:指定了孤立森林中包含的隔离树(Isolation Tree)的数量
-
contamination:异常值比例
-
3.2 处理异常值
-
删除异常值
# 删除异常值 if processing__outliers_method == 'delete': df = HandleMissingValues.drop_missing_values(df)
-
替换异常值:赋值nan,填补缺失值(同上)
4. 处理时间序列
-
转换为datetime类型,并提取年月日时分秒
# 将编码为字符串的特征转换为datetime类型 ['d','m','y','H','M','S'] df[feature] = pd.to_datetime(df[feature]) if extract_datetime in ['y', 'm', 'd', 'H', 'M', 'S']: # 提取年 df['Year'] = df[feature].dt.year if extract_datetime in ['m', 'd', 'H', 'M', 'S']: # 提取月 df['Month'] = df[feature].dt.month if extract_datetime in ['d', 'H', 'M', 'S']: # 提取日 df['Day'] = df[feature].dt.day if extract_datetime in ['H', 'M', 'S']: # 提取小时 df['Hour'] = df[feature].dt.hour if extract_datetime in ['M', 'S']: # 提取分钟 df['Minute'] = df[feature].dt.minute if extract_datetime in ['S']: # 提取秒 df['Seconds'] = df[feature].dt.second
5. 编码处理
-
onehot编码
# onehot编码 if encode_method == 'onehot': df = HandleEncode.handle_onehot(df, feature)
-
label编码
# label编码 elif encode_method == 'label': df = HandleEncode.handle_label(df, feature)
6. 数字类型处理
-
int型或float型
# 检查是否所有值都是整数 if (df[feature].fillna(-9999) % 1 == 0).all(): # 将只有0的浮点数作为小数编码为int类型 df[feature] = df[feature].astype('Int64') logger.debug('特征 {} 成功转换为int类型', feature) else: df[feature] = df[feature].astype(float) # 将浮点数的小数四舍五入到初始值 df[feature] = df[feature].round(decimals=2) logger.debug('特征 {} 成功转换为float类型', feature)
业务方法参数
1. 重复值处理方法
""" 处理重复值的函数 :param df: DataFrame,需要处理的数据集 :param duplicates: 处理重复值的方法,False为不处理,True为删除 :return: DataFrame,处理完重复值的数据集 """
2. 缺失值处理方法
""" 用于处理数据中缺失值的函数 :param df: DataFrame,需要处理的数据集 :param missing_values_method: 处理缺失值的方法,默认为多变量插补法,False为不处理 :param multivariate_estimator: 多变量插补法指定用于估计缺失值的回归器,默认为 None。 :param multivariate_max_iter: 多变量插补法指定迭代次数的最大值,默认为 10。 :param multivariate_random_state: 多变量插补法指定随机数生成器的种子。 :param decision_tree_criterion: 决策树回归指定划分节点的标准,默认为平方误差:"squared_error" :param decision_tree_max_depth: 决策树最大深度 :param random_forest_criterion: 随机森林指定划分节点的标准,默认为平方误差:"squared_error" :param random_forest_max_depth: 随机森林每棵树的最大深度 :param random_forest_n_estimators: 随机森林中树的数量 :param knn_n_neighbors: KNN 中的邻居数量 :param svr_kernel: SVR 的核函数,可选 {线性核:'linear', 径向基函数核:'poly', 多项式核:'rbf', sigmoid核:'sigmoid'} :param svr_C: SVR 的惩罚参数 :param svr_epsilon: SVR 的不敏感损失函数中的ε参数 :param multiple_estimator: 多重插补法指定用于估计缺失值的回归器,默认为 None。 :param multiple_max_iter: 多重插补法指定迭代次数的最大值,默认为 10。 :param multiple_random_state: 多重插补法指定随机数生成器的种子。 :return: DataFrame,处理完缺失值的数据集 """
3. 异常值处理方法
""" 处理数据中异常值的函数 :param df: DataFrame,需要处理的原数据集 :param detecting_outliers_methods: 检测异常值方法,默认为箱线图法和K-近邻法结合 :param Z_score_threshold: Z-score方法的阈值 :param knn_de_n_neighbors: knn邻居点的数量 :param knn_de_contamination: knn异常值的比例 :param LOF_neighbors: 局部离群离子(LOF)方法邻居点的数量 :param LOF_contamination: 局部离群离子(LOF)方法异常值的比例 :param DBSCAN_eps: DBSCAN邻域半径 :param DBSCAN_min_samples: DBSCAN最小样本数 :param iForest_n_estimators: 孤立森林中包含的隔离树(Isolation Tree)的数量 :param iForest_contamination: 孤立森林的异常值比例,可以为"auto" :param processing__outliers_method: 处理异常值方法,默认为多变量插补'multivariate' :param multivariate_estimator: 多变量插补法指定用于估计缺失值的回归器,默认为 None。 :param multivariate_max_iter: 多变量插补法指定迭代次数的最大值,默认为 10。 :param multivariate_random_state: 多变量插补法指定随机数生成器的种子。 :param decision_tree_criterion: 决策树回归指定划分节点的标准,默认为平方误差:"squared_error" :param decision_tree_max_depth: 决策树最大深度 :param random_forest_criterion: 随机森林指定划分节点的标准,默认为平方误差:"squared_error" :param random_forest_max_depth: 随机森林每棵树的最大深度 :param random_forest_n_estimators: 随机森林中树的数量 :param knn_n_neighbors: KNN 中的邻居数量 :param svr_kernel: SVR 的核函数,可选 {线性核:'linear', 径向基函数核:'poly', 多项式核:'rbf', sigmoid核:'sigmoid'} :param svr_C: SVR 的惩罚参数 :param svr_epsilon: SVR 的不敏感损失函数中的ε参数 :param multiple_estimator: 多重插补法指定用于估计缺失值的回归器,默认为 None。 :param multiple_max_iter: 多重插补法指定迭代次数的最大值,默认为 10。 :param multiple_random_state: 多重插补法指定随机数生成器的种子。 :return: DataFrame,处理完异常值的数据集多列 """
4. 时间处理方法
""" 提取数据中的日期时间值的函数 :param df: DataFrame,需要处理的原数据集 :param extract_datetime: 需要提取到的日期类型 :return: DataFrame,处理后的数据集 """
5. 特征编码方法
""" 对数据中的分类特征进行编码的函数 :param df: DataFrame,需要处理的原数据集 :param encode_method: 编码方式,默认为onehot,若为False,则跳过不处理 :return: DataFrame,处理后的数据集 """
测试
数据集:a_data.csv(现场电表数据)
监视过程:使用logger日志的方式
调用业务方法:
data_processing = DataProcessing() # 重复值处理 df = data_processing.handle_duplicates(input_data) # 缺失值处理 df = data_processing.handle_missing_values(df) # 异常值处理 df = data_processing.handle_outliers(df, detecting_outliers_methods=['Z_score'], processing__outliers_method='multivariate') # 处理时间序列 df = data_processing.handle_time(df) # 编码处理 df = data_processing.handle_encoder(df) # 数据类型处理 df = data_processing.handle_round_values(df)
输出日志:
11-04-2024 10:55:14.87 - INFO - 开始处理重复值... 方法: "TRUE" 11-04-2024 10:55:14.88 - INFO - 检测到重复值为: STARTTIME BA103_1 BA103_2 BA103_7 284 2020/4/25 10:15 5110.0 77971 558 285 2020/4/25 10:30 5110.0 77975 558 286 2020/4/25 10:45 5110.0 77978 558 287 2020/4/25 11:00 5110.0 77982 558 292 2020/4/25 11:15 5111.0 77985 558 293 2020/4/25 11:30 5111.0 77988 558 294 2020/4/25 11:45 5111.0 77992 558 295 2020/4/25 12:00 5111.0 77995 558 300 2020/4/25 12:15 5112.0 77999 558 301 2020/4/25 12:30 5112.0 78002 558 302 2020/4/25 12:45 5112.0 78005 558 303 2020/4/25 13:00 5112.0 78009 559 305 2020/4/25 13:15 5113.0 78012 559 307 2020/4/25 13:30 5113.0 78016 559 309 2020/4/25 13:45 5113.0 78019 559 311 2020/4/25 14:00 5113.0 78023 559 3692 2020/7/1 21:15 6549.0 100823 1439 3693 2020/7/1 21:30 6549.0 100827 1440 3694 2020/7/1 21:45 6550.0 100830 1440 3695 2020/7/1 22:00 6550.0 100834 1440 30101 2021/4/6 8:15 13684.0 213298 4918 30102 2021/4/6 8:30 13684.0 213302 4918 30103 2021/4/6 8:45 13685.0 213306 4919 30104 2021/4/6 9:00 13685.0 213310 4919 39021 2021/7/8 9:15 16027.0 258182 6121 39022 2021/7/8 9:30 16027.0 258188 6121 39023 2021/7/8 9:45 16028.0 258194 6121 39024 2021/7/8 10:00 16028.0 258200 6121 11-04-2024 10:55:14.89 - DEBUG - 成功删除 28 行重复值 11-04-2024 10:55:14.89 - INFO - 完成重复值的处理,用时 0.017261 秒 11-04-2024 10:55:14.89 - INFO - 开始处理缺失值... 方法:MULTIVARIATE 11-04-2024 10:55:14.89 - INFO - 发现总共有 1 个缺失值。 11-04-2024 10:55:14.93 - DEBUG - 成功填补了 1 个缺失的值 11-04-2024 10:55:14.93 - INFO - 剩余缺失值 0 个。 11-04-2024 10:55:14.93 - INFO - 在 0.043778 秒内完成对缺失值的处理 11-04-2024 10:55:14.94 - INFO - 开始检测异常值...方法: ['Z_score'] 11-04-2024 10:55:14.94 - INFO - 在 0.002188 秒内完成异常值的检测,检测到 553 个异常值 11-04-2024 10:55:14.94 - INFO - 开始检测异常值...方法: ['Z_score'] 11-04-2024 10:55:15.05 - DEBUG - 成功替换了 553 个异常值 11-04-2024 10:55:15.05 - INFO - 在 0.107187 秒内完成异常值的处理 11-04-2024 10:55:15.05 - INFO - 在 0.109375 秒内完成异常值的检测与处理 11-04-2024 10:55:15.05 - INFO - 开始转换DATETIME功能...时间粒度: S 11-04-2024 10:55:15.07 - DEBUG - 特征 STARTTIME 成功转换为DATETIME类型,并成功提取至 S 类型 11-04-2024 10:55:15.07 - INFO - 在 0.025 秒内完成 DATETIME 特征的转换 11-04-2024 10:55:15.07 - INFO - 开始编码...方法: onehot 11-04-2024 10:55:15.08 - DEBUG - 跳过对日期时间特征 STARTTIME 的编码 11-04-2024 10:55:15.08 - INFO - 分类特征的编码完成,用时 0.004922 秒 11-04-2024 10:55:15.08 - INFO - 开始特征类型转换... 11-04-2024 10:55:15.08 - DEBUG - 特征 BA103_1 成功转换为float类型 11-04-2024 10:55:15.08 - DEBUG - 特征 BA103_2 成功转换为float类型 11-04-2024 10:55:15.08 - DEBUG - 特征 BA103_7 成功转换为float类型 11-04-2024 10:55:15.08 - DEBUG - 特征 Year 成功转换为int类型 11-04-2024 10:55:15.08 - DEBUG - 特征 Month 成功转换为int类型 11-04-2024 10:55:15.08 - DEBUG - 特征 Day 成功转换为int类型 11-04-2024 10:55:15.08 - DEBUG - 特征 Hour 成功转换为int类型 11-04-2024 10:55:15.08 - DEBUG - 特征 Minute 成功转换为int类型 11-04-2024 10:55:15.08 - DEBUG - 特征 Seconds 成功转换为int类型 11-04-2024 10:55:15.08 - INFO - 特征的特征类型转换成功 9 个,用时 0.007615 秒 11-04-2024 10:55:15.08 - INFO - 自动清理过程完成用时 0.212 秒 11-04-2024 10:55:15.24 - INFO - 导出过程完成用时 0.156138 秒 标签:11,10,04,实现,param,2024,df,清洗,数据 From: https://blog.csdn.net/qq_46129710/article/details/143962267