【PostgreSQL数据分析实战:从数据清洗到可视化全流程】3.2 缺失值检测与处理(NULL值填充/删除策略)

👉 点击关注不迷路
👉 点击关注不迷路
👉 点击关注不迷路


文章大纲

  • 缺失值检测与处理全攻略:NULL值填充与删除策略实战
    • 3.2 缺失值检测与处理
      • 3.2.1 缺失值类型与业务影响
        • 3.2.1.1 缺失值的三种形态
        • 3.2.1.2 业务影响分级
      • 3.2.2 缺失值检测技术
        • 3.2.2.1 字段级缺失率计算
        • 3.2.2.2 记录级缺失检测
      • 3.2.3 缺失值处理策略矩阵
        • 3.2.3.1 删除策略(数据精简)
        • 3.2.3.2 填充策略(数据重建)
      • 3.2.4 PostgreSQL专属处理工具
        • 3.2.4.1 函数级解决方案
        • 3.2.4.2 约束级预防机制
      • 3.2.5 处理效果验证与持续监控
        • 3.2.5.1 质量验证指标
        • 3.2.5.2 自动化监控体系
      • 3.2.6 行业最佳实践对比
    • 3.2.7 决策流程图:缺失值处理路径选择
    • 3.3 总结:构建智能缺失值治理体系

缺失值检测与处理全攻略:NULL值填充与删除策略实战

在数据清洗流程中,缺失值处理是保障数据完整性的核心环节。

  • PostgreSQL作为企业级数据分析的核心数据库,提供了丰富的工具链来应对NULL值(含显式NULL与隐式缺失值)问题。
  • 本章将从缺失值检测、处理策略选择、PostgreSQL实战方法三个维度,结合金融、医疗等行业案例,构建系统化的缺失值治理体系。

3.2 缺失值检测与处理

在这里插入图片描述

3.2.1 缺失值类型与业务影响

3.2.1.1 缺失值的三种形态
类型存储表现典型场景检测难点
显式NULLNULL未填写的选填字段(如用户中间名)可通过IS NULL直接检测
隐式缺失''(空字符串)错误存储的必填字段(如空邮箱)需结合业务规则区分空值与有效值
逻辑缺失未记录的关联数据订单表中无对应商品信息的孤儿记录需通过外键约束或跨表查询发现
3.2.1.2 业务影响分级

在这里插入图片描述

3.2.2 缺失值检测技术

3.2.2.1 字段级缺失率计算
  • 1. 基础检测SQL(支持多表批量扫描)
-- 单表字段缺失率分析
CREATE OR REPLACE FUNCTION calculate_missing_rate(table_name text) 
RETURNS TABLE (column_name text,total_rows bigint,missing_count bigint,missing_rate numeric(5,2)
) AS $$
BEGINRETURN QUERY EXECUTE format('SELECT attname AS column_name,total_rows,missing_count,(missing_count::numeric / total_rows) * 100 AS missing_rateFROM (SELECT attname,(SELECT COUNT(*) FROM %I) AS total_rows,SUM(CASE WHEN %I IS NULL THEN 1 ELSE 0 END) AS missing_countFROM %IGROUP BY attname) AS sub', table_name, table_name, table_name);
END;
$$ LANGUAGE plpgsql;-- 使用示例:检测用户表缺失率
SELECT * FROM calculate_missing_rate('users');
  • 2. 隐式缺失值检测(空字符串/特殊符号)
-- 检测邮箱字段是否存在空字符串或无效格式
SELECT user_id, email,CASE WHEN email IS NULL THEN 'NULL'WHEN email = '' THEN '空字符串'ELSE '有效' END AS email_status
FROM users;
3.2.2.2 记录级缺失检测
  • 跨表关联缺失(外键完整性检测)
-- 检测订单表中无对应客户的孤儿订单
SELECT o.order_id
FROM orders o
LEFT JOIN customers c ON o.customer_id = c.customer_id
WHERE c.customer_id IS NULL;-- 批量检测所有外键关联缺失(通过元数据查询)
SELECT conname AS foreign_key,nspname || '.' || relname AS source_table,af.attname AS source_column,nspname || '.' || confrelid::regclass AS target_table,aof.attname AS target_column
FROM pg_constraint 
JOIN pg_class ON conrelid = pg_class.oid
JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid
JOIN pg_attribute af ON af.attrelid = conrelid AND af.attnum = conkey[1]
JOIN pg_class confrelid ON confrelid = confrelid::oid
JOIN pg_attribute aof ON aof.attrelid = confrelid AND aof.attnum = confkey[1]
WHERE contype = 'f';

3.2.3 缺失值处理策略矩阵

3.2.3.1 删除策略(数据精简)
策略类型适用场景实现方式风险提示
删除行缺失率<5%且为非关键字段DELETE FROM table WHERE col IS NULL可能破坏数据分布特征
删除列缺失率>80%且业务价值低ALTER TABLE table DROP COLUMN col不可逆操作,需备份数据
条件删除关键字段缺失(如订单金额为NULL)DELETE FROM orders WHERE amount IS NULL可能导致样本偏差
  • 案例:医疗数据清洗
    在电子病历表中,blood_pressure字段缺失率达12%,但属于诊断必需字段:
-- 删除关键字段缺失的记录(保留完整病历)
DELETE FROM medical_records
WHERE blood_pressure_systolic IS NULL OR blood_pressure_diastolic IS NULL;
3.2.3.2 填充策略(数据重建)
  • 1. 数值型字段填充方法

    方法适用场景PostgreSQL函数示例代码
    均值填充正态分布数据,无显著异常值AVG(col)UPDATE table SET col = (SELECT AVG(col) FROM table) WHERE col IS NULL;
    中位数填充偏态分布数据,存在异常值PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY col)UPDATE table SET col = (SELECT MEDIAN(col) FROM table) WHERE col IS NULL;
    众数填充离散数值型或分类字段MODE() WITHIN GROUP (ORDER BY col)UPDATE table SET col = (SELECT MODE() WITHIN GROUP (ORDER BY col) FROM table) WHERE col IS NULL;
    时间序列填充含时间维度的连续数据LAG(col) OVER (ORDER BY time_col)UPDATE table t1 SET col = (SELECT LAG(col) FROM table t2 WHERE t2.time_col < t1.time_col ORDER BY t2.time_col DESC LIMIT 1) WHERE t1.col IS NULL;
  • 2. 分类型字段填充方法

-- 填充最频繁出现的分类(众数)
UPDATE users
SET gender = (SELECT MODE() WITHIN GROUP (ORDER BY gender) FROM users)
WHERE gender IS NULL;-- 填充自定义默认值(如'未知')
UPDATE users
SET occupation = '未知'
WHERE occupation IS NULL;
  • 3. 高级填充技术

  • 基于关联表填充

    -- 通过客户所在地区填充缺失的邮编(关联地址表)
    UPDATE customers c
    SET zipcode = a.zipcode
    FROM addresses a
    WHERE c.address_id = a.address_id AND c.zipcode IS NULL;
    
  • 机器学习预测填充
    通过Python调用PostgreSQL数据,训练回归模型(如随机森林)预测缺失值:

    # 使用SQLAlchemy获取数据
    import pandas as pd
    from sqlalchemy import create_engineengine = create_engine('postgresql://user:password@host/dbname')
    data = pd.read_sql_query("SELECT * FROM table_with_missing", engine)# 训练模型填充缺失值
    from sklearn.ensemble import RandomForestRegressor
    X = data.drop('target_col', axis=1)
    y = data['target_col']
    model = RandomForestRegressor()
    model.fit(X.dropna(), y.dropna())
    data['target_col'] = model.predict(X)# 回填到数据库
    data.to_sql('table_with_missing', engine, if_exists='replace', index=False)
    

3.2.4 PostgreSQL专属处理工具

3.2.4.1 函数级解决方案
函数功能描述示例
COALESCE返回第一个非NULL值COALESCE(col1, col2, '默认值')
NULLIF相等则返回NULL,否则返回原值NULLIF(col1, col2)
GREATEST / LEAST处理多字段缺失时的最值填充GREATEST(col1, col2, 0)
GENERATE_SERIES生成填充序列(时间序列补全)SELECT generate_series('2023-01-01', '2023-01-31', '1 day')
  • 案例:时间序列数据补全
    修复传感器数据中缺失的时间点记录:
-- 创建完整时间序列视图
CREATE OR REPLACE VIEW complete_sensor_data AS
SELECT ts AS measurement_time,COALESCE(s.value, NULL) AS sensor_value -- 保留NULL标记原始缺失
FROM generate_series('2023-01-01 00:00:00'::timestamp,'2023-01-01 23:59:00'::timestamp,'1 minute'::interval
) AS ts
LEFT JOIN sensor_data s ON ts = s.measurement_time;
3.2.4.2 约束级预防机制
-- 创建表时设置默认值(预防未来缺失)
CREATE TABLE employees (employee_id SERIAL PRIMARY KEY,department VARCHAR(50) NOT NULL DEFAULT '未知部门', -- 强制非NULL并设默认值hire_date DATE NOT NULL DEFAULT CURRENT_DATE -- 当前日期自动填充
);-- 添加CHECK约束拒绝无效空值
ALTER TABLE users
ADD CONSTRAINT valid_email CHECK (email IS NOT NULL OR email ~ '^.+@.+\..+$');

3.2.5 处理效果验证与持续监控

3.2.5.1 质量验证指标
指标计算方法合格标准
残留缺失率处理后NULL值数量/总记录数<0.1%(非容忍字段)
数据偏移度填充值均值 - 原始均值
分布一致性K-S检验填充前后数据分布差异p-value > 0.05
  • 验证SQL示例
-- 检测处理后是否仍有缺失值
SELECT COUNT(*) AS remaining_missing
FROM table
WHERE target_col IS NULL;-- 对比填充前后均值差异
SELECT '原始数据' AS data_type,AVG(target_col) AS mean
FROM original_data
UNION ALL
SELECT '处理后数据' AS data_type,AVG(target_col) AS mean
FROM cleaned_data;
3.2.5.2 自动化监控体系
-- 创建缺失值监控触发器
CREATE OR REPLACE FUNCTION monitor_missing_values() 
RETURNS TRIGGER AS $$
BEGINIF NEW.target_col IS NULL THENINSERT INTO data_quality_log (table_name, column_name, event_time)VALUES (TG_TABLE_NAME, 'target_col', NOW());END IF;RETURN NEW;
END;
$$ LANGUAGE plpgsql;-- 为敏感字段添加触发器
CREATE TRIGGER missing_value_trigger
AFTER INSERT OR UPDATE ON sensitive_table
FOR EACH ROW
EXECUTE FUNCTION monitor_missing_values();

3.2.6 行业最佳实践对比

行业典型缺失场景优选策略技术工具
金融风控客户收入证明缺失关联其他字段预测填充随机森林+SQL存储过程
医疗分析诊断结果未填写严格删除缺失记录外键约束+定时质量报告
电商运营用户地址信息不全分级填充(城市级→国家级)COALESCE+地址解析API
物联网传感器数据传输中断前后值插值填充LAG/LEAD函数+时间序列补全

3.2.7 决策流程图:缺失值处理路径选择

在这里插入图片描述

3.3 总结:构建智能缺失值治理体系

缺失值处理的核心不是技术选择,而是对业务场景的深度理解:

    1. 诊断先行:通过calculate_missing_rate等工具准确定位缺失模式
    1. 策略分层:对高价值字段采用模型预测填充,低影响字段使用默认值快速修复
    1. 闭环管理:结合触发器与监控视图,实现缺失值的实时预警与自动修复
  • 构建了PostgreSQL缺失值处理的完整技术栈。
    • PostgreSQL提供了从检测(元数据查询)到处理(函数+约束)再到监控(触发器+视图)的全流程工具链,企业可根据数据敏感度与业务目标,定制化缺失值治理方案。
    • 下一章节将聚焦异常值检测技术,解析如何识别数据中的"离群点"并进行合理处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/81805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java求职面试:Spring Boot与微服务的幽默探讨

Java求职者面试&#xff1a;技术与幽默的碰撞 场景概述 在某互联网大厂的面试现场&#xff0c;面试官严肃认真&#xff0c;程序员则是一个搞笑的水货角色。面试者名叫张伟&#xff0c;年龄28岁&#xff0c;硕士学历&#xff0c;拥有5年的Java开发经验。以下是面试的详细过程。…

使用 NGINX 实现 HTTP Basic 认证ngx_http_auth_basic_module 模块

一、前言 在 Web 应用中&#xff0c;对部分资源进行访问控制是十分常见的需求。除了基于 IP 限制、JWT 验证、子请求校验等方式外&#xff0c;最经典也最简单的一种方式便是 HTTP Basic Authentication。NGINX 提供的 ngx_http_auth_basic_module 模块支持基于用户名和密码的基…

map和set的设计以及红黑树的设计

1.map和set的底层是红黑树 2.map和set在STL是容器&#xff0c;在我看来&#xff0c;不过也是封装了平衡二叉搜索树红黑树的适配器 我们先看红黑树的设计&#xff0c;看完后map和set的封装易如反掌 #pragma once #include<utility> #include<iostream> using name…

Linux运维——Vim技巧二

Vim技巧 一、管理多个文件1.1、用缓冲区列表管理打开的文件1.2、用参数列表将缓冲区分组1.3、将工作区切分成窗口1.4、用标签页将窗口分组1.5、用:edit命令打开文件1.6、使用:find打开文件1.7、把文件保存到不存在的目录中 二、动作命令在文档中移动2.1、区分实际行与屏幕行2.2…

2025 年 408 真题及答案

2025 年 408 真题 历年408真题及答案下载直通车 1、以下 C 代码的时间复杂度是多少&#xff1f;&#xff08;&#xff09; int count 0; for (int i0; i*i<n; i)for (int j0; j<i; j)count;A O(log2n)B O(n)C O(nlogn)D O(n2) 2、对于括号匹配问题&#xff0c;符号栈…

【MuJoCo仿真】开源SO100机械臂导入到仿真环境

主要参考&#xff1a;https://github.com/jpata/gym-so100/tree/integration/gym_so100/assets/trs_so_arm100 参考&#xff1a;&#xff08;八&#xff09;lerobot开源项目扩展so100的仿真操控&#xff08;操作记录&#xff09;_so100机械臂 仿真-CSDN博客 下载&#xff1a;…

Socat 用法详解:网络安全中的瑞士军刀

Socat 用法详解&#xff1a;网络安全中的强大工具 引言 socat&#xff08;SOcket CAT&#xff09;是一款功能强大的命令行工具&#xff0c;被誉为“网络瑞士军刀”&#xff0c;广泛应用于数据传输、端口转发和网络调试等场景。它支持多种协议和数据通道&#xff08;如文件、管…

永磁同步电机控制算法--基于PI和前馈的位置伺服控制

一、原理介绍 永磁同步伺服系统是包含了电流环、速度环和位置环的三环控制系统。 伺服系统通过电流检测电路和光电编码器检测电动机三相绕组电流和转子位置θ&#xff0c;通过坐标变换&#xff0c;计算出转矩电流分量iq和励磁电流分量id。 位置信号指令与实际转子位置信号的差…

Lucene多种数据类型使用说明

Lucene 作为一款高性能的全文检索引擎库&#xff0c;其核心功能围绕索引和搜索文本数据&#xff0c;但它也支持多种数据类型以满足复杂的应用场景。以下是 Lucene 支持的主要数据类型及其用途的详细说明&#xff1a; 1. 文本类型&#xff08;Text&#xff09; 用途&#xff1a;…

Web网页布局

目录 一、传统的DIVCSS布局&#xff08;使用率最高的&#xff09; 1.div传统的一块块转 2.以猫眼电影为例‘ 3.div布局格式&#xff08;唯一的id属性&#xff0c;不唯一写class重复的&#xff09; 3.2总体布局样式 二、HTML5语义标签CSS3布局 1.把div改为绿色的语义标签…

大模型基础(五):transformers库(下):快速分词器、自动配置类、快速微调

transformers库&#xff08;下&#xff09; 1 快速分词器1.1 Fast 分词器的核心特点1.2 对比示例1.3 何时使用 Fast 分词器&#xff1f;1.4 注意事项 2 自动配置类 AutoConfig2.1 核心功能2.2 基本用法2.3 主要应用场景2.4 常用函数2.5 与具体配置类的区别2.6 注意事项 3 快速微…

在pycharm profession 2020.3上离线安装.whl类型的包(以PySimpleGUI为例)

今天写个小代码&#xff0c;用到了PySimpleGUI。 在pycharm profession 2020.3的项目中的Terminal里运行如下代码即可安装。 python3 -m pip install --force-reinstall --extra-index-url https://PySimpleGUI.net/install PySimpleGUI 安装方法如图&#xff1a; 安装后使用…

SpringBoot整合RabbitMQ(Java注解方式配置)

1.生产端 1. 创建生产者SpringBoot工程 2. 引入start&#xff0c;依赖坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 3. 编写yml配置&#xff0c;基本…

分析strtol(),strtoul()和strtod()三个函数的功能

字符串转换为数值部分和子字符串首地址的函数有strtol(),strtoul()和strtod()三个函数。 1、strtol()函数 long int strtol(const char *str, char **endptr, int base) //当base0时,若字符串不是以"0","0x"和"0X"开头,则将数字部分按照10进制…

Spring 的事务隔离

在Spring框架中&#xff0c;事务管理是一个非常重要的方面&#xff0c;它允许开发者以声明式的方式定义事务边界&#xff0c;并且通过配置不同的隔离级别来控制并发事务的行为。Spring支持多种事务管理方式&#xff0c;包括编程式事务管理和声明式事务管理&#xff08;如使用Tr…

单片机自动排列上料控制程序

/****L2233 CODE11549 2025 4 18 08:53*******/ /***轴承上料机控制 提升 摇摆 光电检测***/ /***2025 3 21 电机控制PCB板 PAST ***/ /*2.3 2.2 1.2 1.3 1.4 1.5 1.6 1.7 5.3 3.2 ***/ /*启动 解锁 光电 接近 前停 后停 电机前 电机后*/ #include &quo…

力扣119题解

记录 2025.5.5 题目&#xff1a; 思路&#xff1a; 代码: class Solution {public List<Integer> getRow(int rowIndex) {List<Integer> row new ArrayList<Integer>();row.add(1);for (int i 1; i < rowIndex; i) {row.add((int) ((long) row.get(i…

国产化海光C86架构服务器安装windows实录

最近几年与红蓝关系急转直下&#xff0c;尤其是科技领域尤为突出。随之而来的就是软硬件的国产化大潮。由于行业的原因根据要求必须使用国产化服务器、国产化操作系统、国产化数据库、国产化中间件。虽然闭关锁国断开红蓝联系可以在一定程度激发国产化发展&#xff0c;但是不得…

Oracle OCP证书有效期是三年?

这一段时间&#xff0c;网上经常传出消息Oracle OCM认证证书有效期为三年&#xff0c;其实这个假消息&#xff0c;通过博睿谷与Oracle官方人员确认&#xff0c;OCP认证证书有效期是永久的。 OCP证书本身永久有效&#xff0c;但老版本的OCP证书代表着更多的项目经验&#xff0c…

Python 闭包:函数式编程中的魔法变量容器

闭包与匿名函数的常见混淆 在编程社区中&#xff0c;闭包(closure)和匿名函数(anonymous function)经常被混为一谈&#xff0c;这种混淆有其历史根源&#xff1a; 历史发展因素&#xff1a;在早期编程实践中&#xff0c;在函数内部定义函数并不常见&#xff0c;直到匿名函数广…