【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 缺失值的三种形态
类型 | 存储表现 | 典型场景 | 检测难点 |
---|---|---|---|
显式NULL | NULL | 未填写的选填字段(如用户中间名) | 可通过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 总结:构建智能缺失值治理体系
缺失值处理的核心不是技术选择,而是对业务场景的深度理解:
-
- 诊断先行:通过
calculate_missing_rate
等工具准确定位缺失模式
- 诊断先行:通过
-
- 策略分层:对高价值字段采用模型预测填充,低影响字段使用默认值快速修复
-
- 闭环管理:结合触发器与监控视图,实现缺失值的实时预警与自动修复
- 构建了PostgreSQL缺失值处理的完整技术栈。
- PostgreSQL提供了从检测(元数据查询)到处理(函数+约束)再到监控(触发器+视图)的全流程工具链,企业可根据数据敏感度与业务目标,定制化缺失值治理方案。
- 下一章节将聚焦异常值检测技术,解析如何识别数据中的"离群点"并进行合理处理。
相关文章:

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】3.2 缺失值检测与处理(NULL值填充/删除策略)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 缺失值检测与处理全攻略:NULL值填充与删除策略实战3.2 缺失值检测与处理3.2.1 缺失值类型与业务影响3.2.1.1 缺失值的三种形态3.2.1.2 业务影响分级 3.2.2 缺失值…...

2025年渗透测试面试题总结-某步在线面试(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 一、操作系统相关问题总结与分析及扩展回答 1. Linux命令熟悉度 2. 查看进程的命令 3. 查看网络进程…...

Java后端程序员学习前端之JavaScript
1.什么是JavaScript 1.1.概述 JavaScript是一门世界上最流行的脚本语言javaScript 一个合格的后端人员,必须要精通JavaScript 1.2.历史 JavaScript的起源故事-CSDN博客 2.快速入门 2.1.引入JavaScript 1.内部标签 <script>//.......</script> --…...
ARM Linux 设备树
Linux 设备驱动开发详解:基于最新的Linux 4.0内核, 机械工业出版社, 宋宝华, 2015 1. 设备树的起源 • 背景: ARM架构中大量板级代码冗余,硬编码在mach-xxx目录,设备树(Device Tree)引入结构化描述硬件。 • 目的: 减…...

uniapp-商城-43-shop 后台管理 页面
后台管理较为简单,主要用于后台数据的管理,包含商品类别和商品信息,其实还可以扩展到管理用户等等 1、后台首页 包含 分类管理 商品管理 关于商家等几个栏目 主要代码: <template><view class"manage">…...
kotlin JvmName注解的作用和用途
1. JvmName 注解的作用 JvmName 是 Kotlin 提供的一个注解,用于在编译为 Java 字节码时自定义生成的类名或方法名。 作用对象: 文件级别(整个 .kt 文件)函数、属性、类等成员 主要用途: 控制 Kotlin 编译后生成的 JV…...
Mac 平台 字体Unicode范围分析器
字体Unicode范围分析器 #include <CoreText/CoreText.h> // CoreText框架头文件,用于字体处理 #include <CoreFoundation/CoreFoundation.h> // CoreFoundation框架头文件 #include <stdio.h> // 标准输入输出 #include…...
【C++游戏引擎开发】第30篇:物理引擎(Bullet)—软体动力学系统
一、软体动力学理论体系 1.1 连续体力学基础 1.1.1 变形梯度张量 物体运动可描述为映射函数: x = ϕ ( X , t ) \mathbf{x} = \phi(\mathbf{X},t) x...

vue2 结合后端预览pdf 跨域的话就得需要后端来返回 然后前端呈现
<el-button :loading"pdfIslock" v-if"isPDFFile(form.pic)" type"primary" style"margin: 15px 0" click"previewPDF(form.pic)"> 预览pdf </el-button>//npm install pdfjs-dist //如果没有就得先安装import …...

什么是 HSQLDB?
大家好,这里是架构资源栈!点击上方关注,添加“星标”,一起学习大厂前沿架构! Java开发人员学习Java数据库连接(JDBC)的最简单方法是试验HyperSQL数据库(又名HSQLDB)。 …...
AI时代企业应用系统架构的新思路与CIO变革指南
作为制造企业CIO,我们看问题需要有前瞻性,AI时代企业应用系统架构需要进行全面转型。 一、新思想与新技术 1. 核心新思想 可视化开发AI的融合模式:不再只依赖纯代码开发或传统低代码,而是两者结合,通过AI理解自然语…...

多语言爬虫实现网站价格监控
最近突发奇想想用多种代码来爬取数据做价格监控。常见的比如Python、JavaScript(Node.js)、或者Go?不过通常来说,Python应该是首选,因为它的库比较丰富,比如requests和BeautifulSoup,或者Scrapy。不过客户要求多种代码…...
如何修改 JAR 包中的源码
如何修改 JAR 包中的源码 前言一、准备工作二、将 JAR 当作 ZIP 打开并提取三、重写 Java 类方法 A:直接替换已编译的 .class方法 B:运行时类路径优先加载 四、修改 MyBatis(或其他)XML 资源五、重新打包 JAR(命令行&a…...

16.Three.js 中的 RectAreaLight 全面详解 + Vue 3 实战案例
😎 本文将带你从零了解 THREE.RectAreaLight 的工作原理、使用方式、注意事项,并在最后用 Vue 3 的 Composition API 封装一个完整的光源演示组件,一站式搞懂矩形区域光的魅力 💡! 🖼️ 一、展示图效果示意…...

excel 批量导出图片并指定命名
一、开发环境 打开excel文件中的宏编辑器和JS代码调试 工具-》开发工具-》WPS宏编辑器 左边是工程区,当打开多个excel时会有多个,要注意不要把代码写到其他工作簿去了 右边是代码区 二、编写代码 宏是js语言,因此变量或者方法可以网上搜…...
PyTorch_创建01张量
torch.ones 和 torch.ones_like 创建全1张量torch.zeros 和 torch.zeros_like 创建全0张量torch.full 和 torch.full_like 创建全为指定值张量 上面的函数里有 like 表示根据另外一个张量的形状创建全0或者全1的或者全为指定值的张量。 代码 import torch …...
神经网络之互动练习详解:从基础到拟合非线性数据
神经网络之互动练习详解:从基础到拟合非线性数据 在机器学习的世界里,神经网络是一种强大而神奇的工具,它可以帮助我们解决各种复杂的问题。今天,我们就通过一个有趣的互动练习,来深入了解神经网络的工作原理以及如何…...

Mem0.ai研究团队开发的全新记忆架构系统“Mem0”正式发布
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
海外社交软件技术深潜:实时互动系统与边缘计算的极限优化
一、毫秒级延迟之战:下一代实时通信架构 1.1 全球实时消息投递体系设计 图表 代码 性能基准测试(跨大西洋传输): 协议/算法组合 平均延迟 99分位延迟 丢包恢复率 WebSocketTLSBBRv2 142ms 298ms 78% QUIC自定义CC 112ms 201ms 92%…...

通过DeepSeek大语言模型控制panda机械臂,听懂人话,拟人性回答。智能机械臂助手又进一步啦
文章目录 前言环境配置运行测试报错 前言 通过使用智能化的工作流控制系统来精确操控机械臂,不仅能够基于预设算法可靠地规划每个动作步骤的执行顺序和力度,确保作业流程的标准化和可重复性,还能通过模块化的程序设计思路灵活地在原有工作流中…...

如何添加或删除极狐GitLab 项目成员?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 项目成员 (BASIC ALL) 成员是有权访问您的项目的用户和群组。 每个成员都有一个角色,这决定了他们在项目中可以…...

计算机网络-LDP标签发布与管理
前面学习了LDP建立邻居,建立会话,今天来学习在MPLS中的标签发布与管理。 在MPLS网络中,下游LSR决定标签和FEC的绑定关系,并将这种绑定关系发布给上游LSR。LDP通过发送标签请求和标签映射消息,在LDP对等体之间通告FEC和…...

云境天合水陆安全漏电监测仪—迅速确定是否存在漏电现象
云境天合水陆安全漏电监测仪是一种专为水下及潮湿环境设计的电气安全检测设备,通过高灵敏度电磁传感器探测漏电电流产生的交变磁场,基于法拉第电磁感应定律,自动区分高灵敏度信号和低灵敏度信号,精准定位泄漏电源的具体位置。一旦…...

软考 系统架构设计师系列知识点之杂项集萃(54)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(53) 第87题 某银行系统采用Factory Method方法描述其不同账户之间的关系,设计出的类图如下所示。其中与Factory Method的“Creator”角色对应的类是(ÿ…...

Nginx +Nginx-http-flv-module 推流拉流
这两天为了利用云服务器实现 Nginx 进行OBS Rtmp推流,Flv拉流时发生了诸多情况,记录实现过程。 环境 OS:阿里云CentOS 7.9 64位Nginx:nginx-1.28.0Nginx-http-flv-module:nginx-http-flv-module-1.2.12 安装Nginx编…...

KeyPresser 一款自动化按键工具
1. 简介 KeyPresser 是一款自动化按键工具,它可以与窗口交互,并支持后台运行, 无需保持被控窗口在前台运行。用户可以选择要操作的目标窗口,并通过勾选复选框来控制要发送哪些按键消息。可以从组合框中选择所需的按键,并在编辑框中输入时间间隔以控制按键发送之间的延迟。程…...

DVWA靶场保姆级通关教程--03CSRF跨站请求伪造
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 一、low级别的源码分析 二、medium级别源码分析 安全性分析 增加了一层 Referer 验证: 关键点是:在真实的网络环境中&a…...
从 Python 基础到 Django 实战 —— 数据类型驱动的 Web 开发之旅
主题简介: 本主题以 Python 基础数据类型为核心,结合 Django 框架的开发流程,系统讲解如何通过掌握数字、字符串、列表、元组、字典等基础类型,快速构建功能完善的 Web 应用。通过理论与实践结合,帮助学员从零基础 Py…...

架构思维:构建高并发读服务_基于流量回放实现读服务的自动化测试回归方案
文章目录 引言一、升级读服务架构,为什么需要自动化测试?二、自动化回归测试系统:整体架构概览三、日志收集1. 拦截方式2. 存储与优化策略3. 架构进化 四、数据回放技术实现关键能力 五、差异对比对比方式灵活配置 六、三种回放模式详解1. 离…...

Qt实现车载多媒体项目,包含天气、音乐、视频、地图、五子棋功能模块,免费下载源文件!
本文主要介绍项目,项目的结构,项目如何配置,项目如何打包。这篇文章如果对你有帮助请点赞和收藏,谢谢!源代码仅供学习使用,如果转载文章请标明出处!(免费下载源代码)&…...