首页 > 其他分享 >数据清洗的实现

数据清洗的实现

时间:2024-11-22 09:43:03浏览次数:3  
标签:11 10 04 实现 param 2024 df 清洗 数据

数据清洗

封装算法类

  • 重复值处理类

    • 删除重复值

  • 缺失值处理类

    • 删除缺失值

    • 平均数填补缺失值

    • 中位数填补缺失值

    • 众数填补缺失值

    • 拉格朗日插值法

    • 多变量插补法

    • 决策树回归插补法

    • 随机森林插补法

    • 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

相关文章

  • 【C++】右值引用与移动语义详解:如何利用万能引用实现完美转发
    C++语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C++相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C++内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与QueuePriority......
  • LSTM (长短期记忆网络 - 基于RNN - 比GRU老20年 - 体现注意力的思想) + 代码实现 ——
    目录0.前言1.门控记忆元1.1输入门、遗忘门和输出门1.2候选记忆元 1.3记忆元(C)1.4隐状态(H)2.从零开始实现2.1初始化模型参数2.2定义模型2.3 训练和预测3.简洁实现4.小结0.前言课程全部代码(pytorch版)已上传到附件看懂上上篇RNN的所有细节、上......
  • vue3+setup使用rtsp视频流实现实时监控,全屏,拍摄,自动拍摄等功能(纯前端)
    vue3+setup使用rtsp视频流实现实时监控,全屏,拍摄,自动拍摄等功能(纯前端)概要本文介绍了如何在Vue应用中通过WebRTC技术获取摄像头的rtsp视频流,同时展示了实时监控,全屏,拍摄,自动拍摄等功能。一、获取rtsp流并确保其可用1.因为是纯前端角度,所以从后端可以获取http开头的视频......
  • Matlab高光谱遥感、数据处理与混合像元分解技术
    原文:Matlab高光谱遥感、数据处理与混合像元分解https://mp.weixin.qq.com/s?__biz=MzUzNTczMDMxMg==&mid=2247629522&idx=7&sn=ae7a3957be501d71f7e7c8f9e4fc7f6c&chksm=fa8dbb35cdfa322358a34b591446c129dac64fee9521ebba64acead8f496b8e66be19c6e1098&token=358797745&......
  • 数据中台架构实践()
    数据中台架构实践......
  • Spring Boot 与腾讯云 MySQL 监听 Binlog 数据变化,并使用 UI 展示页面效果
    引言在现代的分布式系统和微服务架构中,数据同步和变更监控是保证系统一致性和实时性的核心问题之一。MySQL数据库的binlog(二进制日志)功能能够记录所有对数据库的修改操作,如插入(INSERT)、更新(UPDATE)、删除(DELETE)等,是实现实时数据变更同步的有效工具。结合SpringBoot框......
  • 数据集-目标检测系列- 花卉 玫瑰 检测数据集 rose >> DataBall
    数据集-目标检测系列-花卉玫瑰检测数据集rose>>DataBall DataBall助力快速掌握数据集的信息和使用方式,会员享有百种数据集,持续增加中。 贵在坚持!数据样例项目地址:*相关项目1)数据集可视化项目:gitcode:https://gitcode.com/DataBall/DataBall-detections-10......
  • 深度探索 C 语言数据结构——双链表:从键盘输入到增删查改及去重操作全解析
    C语言数据结构——双链表:从键盘输入到增删查改及去重操作全解析例题一、创建双链表(一)定义双链表(二)双链表的创建函数二、双链表的增加操作(一)头插(二)尾插(三)在pos位置之后插入数据三、双链表的删除操作(一)头删(二)尾删(三)删除指定位置节点四、双链表去重操作五、销毁双链表六......
  • 使用 Nimrod 实现滑动验证码识别
    滑动验证码识别是一项有趣的任务,通常用于验证用户身份。本文将展示如何使用Nimrod编程语言实现一个滑动验证码的简单图像处理示例。安装Nimrod在开始之前,请确保已安装Nimrod。可以通过以下步骤安装:前往Nimrod官方网站。下载并安装适用于您操作系统的版本。使用nim--v......
  • 使用 Dart 实现滑动验证码识别
    滑动验证码通常用于验证用户是否为真实用户,在图像上提供一个缺口,需要滑动块来匹配缺口的位置。本文将展示如何使用Dart编程语言来实现一个简单的滑动验证码识别程序。环境设置在开始之前,请确保您已经安装了Dart。可以通过以下步骤进行安装:前往Dart官网。安装适用于您操作......