数据清洗经验

2023-05-16

平时习惯了在某些特定的数据集合上做实验,简单的tokenization、预处理等步骤就足够了。但是在数据越来越大的年代,数据清洗越来越重要,也越来越复杂。看到Philip J.Guo 的这篇英文文章《Parsing Raw Data》觉得不错,学习并译成中文,难免谬误,仅供参考。

  前言

  科研工作者、工程师、业务分析者这些和数据打交道的职业,数据分析在他们工作中是一项核心任务。这么不仅仅针对“大数据”的从业者,即使你笔记本硬盘上的数据也值得分析。数据分析的第一步是洗数据,原始数据可能有各种不同的来源,包括:

  1. Web服务器的日志
  2. 某种科学仪器的输出结果
  3. 在线调查问卷的导出结果
  4. 1970s的政府数据
  5. 企业顾问准备的报告

  这些来源的共同点是:你绝对料想不到他们的各种怪异的格式。数据给你了,那就要处理,但这些数据可能经常是:

  1. 不完整的(某些记录的某些字段缺失)
  2. 前后不一致(字段名和结构前后不一)
  3. 数据损坏(有些记录可能会因为种种原因被破坏)

  因此,你必须经常维护你的清洗程序来清洗这些原始数据,把他们转化成易于分析的格式,通常称为data wrangling。接下来会介绍一些关于如何有效清洗数据,所有介绍的内容都可以由任意编程语言实现。

  使用断言

  这是最重要的一点经验:使用断言(Assertions)揪出代码中的bug。用断言的形式写下你对代码格式的假设,如果一旦发现有数据跟你的断言相悖,就修改这些断言。

  记录是有序的?如果是,断言之!每一条记录都是有7个字段么?如果是,断言之。每一个字段都是0-26之间的奇数么?如果是,断言之!总之,能断言的都断言!

  在理想世界中,所有记录都应该是整整齐齐的格式,并且遵循某种简洁的内在结构。但是实际当中可不是这样。  写断言写到你眼出血,即便是出血还得再写。

  洗数据的程序肯定会经常崩溃。这很好,因为每一次崩溃都意味着你这些糟糕的数据又跟你最初的假设相悖了。反复的改进你的断言直到能成功的走通。但一定要尽可能让他们保持严格,不要太宽松,要不然可能达不到你要的效果。最坏的情况不是程序走不通,而是走出来不是你要的结果。

  不要默默的跳过记录

  原始数据中有些记录是不完整或者损坏的,所以洗数据的程序只能跳过。默默的跳过这些记录不是最好的办法,因为你不知道什么数据遗漏了。因此,这样做更好:

  1. 打印出warning提示信息,这样你就能够过后再去寻找什么地方出错了
  2. 记录总共跳过了多少记录,成功清洗了多少记录。这样做能够让你对原始数据的质量有个大致的感觉,比如,如果只跳过了0.5%,这还说的过去。但是如果跳过了35%,那就该看看这些数据或者代码存在什么问题了。

  使用Set或者Counter把变量的类别以及类别出现的频次存储起来

  数据中经常有些字段是枚举类型的。例如,血型只能是A、B、AB或者O。用断言来限定血型只能是这4种之一虽然挺好,但是如果某个类别包含多种可能的值,尤其是当有的值你可能始料未及的话,就不能用断言了。这时候,采用counter这种数据结构来存储就会比较好用。这样做你就可以:

  1. 对于某个类别,假如碰到了始料未及的新取值时,就能够打印一条消息提醒你一下。
  2. 洗完数据之后供你反过头来检查。例如,假如有人把血型误填成C,那回过头来就能轻松发现了。

  断点清洗

  如果你有大量的原始数据需要清洗,要一次清洗完可能需要很久,有可能是5分钟,10分钟,一小时,甚至是几天。实际当中,经常在洗到一半的时候突然崩溃了。

  假设你有100万条记录,你的清洗程序在第325392条因为某些异常崩溃了,你修改了这个bug,然后重新清洗,这样的话,程序就得重新从1清洗到325391,这是在做无用功。其实可以这么做:1. 让你的清洗程序打印出来当前在清洗第几条,这样,如果崩溃了,你就能知道处理到哪条时崩溃了。2. 让你的程序支持在断点处开始清洗,这样当重新清洗时,你就能从325392直接开始。重洗的代码有可能会再次崩溃,你只要再次修正bug然后从再次崩溃的记录开始就行了。

  当所有记录都清洗结束之后,再重新清洗一遍,因为后来修改bug后的代码可能会对之前的记录的清洗带来一些变化,两次清洗保证万无一失。但总的来说,设置断点能够节省很多时间,尤其是当你在debug的时候。

  在一部分数据上进行测试

  不要尝试一次性清洗所有数据。当你刚开始写清洗代码和debug的时候,在一个规模较小的子集上进行测试,然后扩大测试的这个子集再测试。这样做的目的是能够让你的清洗程序很快的完成测试集上的清洗,例如几秒,这样会节省你反复测试的时间。

  但是要注意,这样做的话,用于测试的子集往往不能涵盖到一些奇葩记录,因为奇葩总是比较少见的嘛。

  把清洗日志打印到文件中

  当运行清洗程序时,把清洗日志和错误提示都打印到文件当中,这样就能轻松的使用文本编辑器来查看他们了。

  可选:把原始数据一并存储下来

  当你不用担心存储空间的时候这一条经验还是很有用的。这样做能够让原始数据作为一个字段保存在清洗后的数据当中,在清洗完之后,如果你发现哪条记录不对劲了,就能够直接看到原始数据长什么样子,方便你debug。

  不过,这样做的坏处就是需要消耗双倍的存储空间,并且让某些清洗操作变得更慢。所以这一条只适用于效率允许的情况下。

  最后一点,验证清洗后的数据

  记得写一个验证程序来验证你清洗后得到的干净数据是否跟你预期的格式一致。你不能控制原始数据的格式,但是你能够控制干净数据的格式。所以,一定要确保干净数据的格式是符合你预期的格式的。

  这一点其实是非常重要的,因为你完成了数据清洗之后,接下来就会直接在这些干净数据上进行下一步工作了。如非万不得已,你甚至再也不会碰那些原始数据了。因此,在你开始数据分析之前要确保数据是足够干净的。要不然的话,你可能会得到错误的分析结果,到那时候,就很难再发现很久之前的数据清洗过程中犯的错了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据清洗经验 的相关文章

  • 告别我的2016

    又过了一年 xff01 xff01 xff01 每一年都会因为所经历的不同 xff0c 收获也不同 在过去的2016年 xff0c 回想自己在工作上好像没有做多少事情 xff0c 却也有不一样的收获 2016年2月份 xff0c 刚过来春节
  • 判断某个月份是否在给定的月份区间内

    判断某个月份是否在给定的月份区间内 输入 指定月份 xff1a m m m 月份区间 xff1a m 1 m 1
  • 数据清洗

    1 概念 数据清洗 xff1a 把脏数据清洗掉 xff0c 提高数据质量 Data cleansing Data cleaning Data scrubbing三种表达方式都可以 xff0c 意思都是检测和去除数据集中的噪声数据和无关数据
  • 联想H61主板升级BIOS,支持nvme硬盘

    本教程升级有一定风险 xff1a 请阅读文章最后的 遗憾 部分接受再升级 最近因为手上有一台联想的i7 2600主机 xff0c 他的主板是H61的 xff0c 正好看见pcie接口空着 xff0c 在网上看见有人用它升级了拜滕的存储芯片
  • armv8 摘要

    作者 xff1a 蜗蜗 发布于 xff1a 2015 7 7 22 31 分类 xff1a ARMv8A Arch 1 前言 ARMv8 xff08 当前只有A系列 xff0c 即ARMv8 A xff09 架构 xff0c 是ARM公司为
  • android 绘制过程摘要

    1 没有硬件加速的UI绘制过程 xff1a 在Android应用程序进程这一侧 xff0c 每一个窗口都关联有一个Surface 每当窗口需要绘制UI时 xff0c 就会调用其关联的Surface的成员函数lock获得一个Canvas xf
  • opengl 摘要

    一 创建opengl工程 1 第一步设置像素格式 如支持双缓冲 xff0c 设置颜色模式 xff0c 如是rgba xff0c 还是颜色索引 xff08 需调色板 xff09 xff0c 设置模板缓冲区的特征值 2 第二步创建绘制环境 且自
  • Watchdog

    一 简介 软件狗 类似硬件狗 xff0c 硬件狗是被动等 喂 xff0c 系统主要线程主动调用硬件接口 xff0c 告诉系统本线程是正常的 但android 这种framework层中的软件狗本身是一个线程 xff0c 会主动询问系统关键线
  • android Binder 学习

    一 面向过程调用与面向对象调用的区别 1 面向过程调用同一时刻只能服务一个客户 xff0c 而且该过程必须具有锁功能 xff0c 如果有其他客户想要访问 xff0c 则需要等待前一客户完成操作 2 面向对象则能同时服务多个客户 xff0c
  • QEMU KVM 虚拟机移植之性能提高篇小结(android 虚拟机双系统方案)

    一 提升性能核心要素 1 将 OPENGL 接口进行穿透调用 xff0c 下面对opengl穿透做个小结 2 在arm开发板上打开kvm特性 xff0c 这个qcom amp mtk都是实现了的 xff0c 只需要打开开关即可 二 ANDR
  • android 系统基础知识

    一 Activity 启动模式 Activity有四种启动模式 xff1a standard singleTop singleTask singleInstance 可以在AndroidManifest xml中activity标签的属性a
  • android 内存管理概要

    一 zram zram swap 主要原理就是从内存分配一块区域出来用作 swap 分区 xff0c 每次如果内存空间不够了 xff0c 不是把应用程序杀掉 xff0c 而是把应用程序所占用的内存数据复制到 swap 分区 xff0c 等切
  • python统计从1970/1/1 08:00:00到某个时刻的总秒数

    使用场景 xff0c 比如需要从一堆文件中 xff0c 选出时间属性在2017年12月13日00 00 00以后的所有文件 span class token keyword import span os statinfo span clas
  • art知识简要概括

    一 GC分类 1 kGcCauseForAlloc 当没有足够的内存分配时触发 2 kGcCauseBackground 当已使用的内存超过最大值时触发 3 kGcCauseExplicit 当使用System GC时触发 二 GC守护线程
  • SEAndroid 知识点

    一 DAC 1 自主访问控制 Linux上的安全模型叫DAC xff0c 进程的权限与执行它的用户的权限一致 xff0c file针对所有者 所有者组 其他用户制定相关权限 二 MAC 1 强访问控制 SELinux上的安全模型叫MAC x
  • Cgroup 理解

    一 综述 1 cgroup 可以控制进程组的资源 xff08 cpu memory i o等 xff09 2 cgroup 采用树型结构来控制进程组的资源 3 cgroup 利用资源子系统来分割资源 4 cgroup 是lxc xff0c
  • namespace 理解

    当调用clone时 xff0c 设定了CLONE NEWPID xff0c 就会创建一个新的PID Namespace xff0c clone出来的新进程将成为Namespace里的第一个进程 一个PID Namespace为进程提供了一个
  • Bionic 学习

    一 基本概况 1 不与其他libc库兼容 xff0c 有自己的动态链接器 linker 2 不支持c 43 43 异常抛出 3 一共有libc xff08 c基础库 xff09 libm xff08 数学库 xff09 libdl xff0
  • 基于容器原理(docker、lxc、cells)的Android 双系统设计概要

    写在前面 前几年预研加开发android双系统 xff0c 中途用过不少开源代码或者研读过大牛BLOG xff0c 现开放双系统设计原理来回报社区 android容器技术已在android 6 7 8 9 10 11 12 13版本中分别实
  • Android手机可信引导解决方案

    1 概述 Android手机的可信引导过程 xff0c 主要分为三部分 xff0c lk的可信 xff0c boot的可信 xff0c 和system的可信 xff1b 系统上电到lk的启动过程验证 因为和硬件联系紧密 xff0c 基本都由

随机推荐

  • Android智能手机安全解决方案

    1 终端安全解决方案全景 1 1 Android系统框架预览 此外 xff0c 鉴于许多硬件厂商不希望公开其设备驱动程序 xff0c GOOGLE在运行时库层对下屏蔽实现细节 xff0c 对上提供统一接口增加了硬件抽象层 1 2 Andro
  • EFI secure boot

    一 EFI secure boot 是EFI BIOS中的一个子标签 xff0c 同时EFI BIOS提供证书管理功能 xff0c 系统可以同时拥有多个证书供用户选择 EFI只能执行经过正确签名的固件 EFI 证书种类比较多 xff1a P
  • TPM2.0读书笔记

    三种关联性技术 1 Intel TXT技术 2 TrustZone技术 3 AMD PSP技术 TPM实体 1 持久性hierarchy TPM RH PLATFORM 平台 TPM RH OWNER 存储 TPM RH ENDORSEME
  • 适用各种语言的字符串jaccard相似度的计算

    要计算两个文本的相似度 xff0c 现在可能大多会通过相似度模型来计算 xff0c 或者是通过embedding向量来计算 但可解释性差一些 xff0c 有些情况下 xff0c 可能直接用两个文本共同的字符数来计算更直观一些 Jaccard
  • windows下PowerShell别名使用

    个人在windows下习惯用PowerShell替代CMD作为命令行工具 如何自定义命令来提高生产力呢 xff1f linux中有alias工具 xff0c 如 span class token builtin class name ali
  • Linux

    Linux 1 计算机硬件体系 1 1冯诺依体系 由运算器 控制器 存储器 输入设备和输出设备五部门组成 顺序执行程序 计算机处理数据和指令一律用二进制表示 1 2硬件组成 存储器 随机存储内存RAM xff0c 内存 xff0c 逻辑IO
  • c++ threadpool.h

    threadpool h include lt pthread h gt include lt semaphore h gt include lt iostream gt include lt vector gt using namespa
  • java从http url下载文件的简单方法

    br br import java io File br import java net URL br br import org apache commons io FileUtils br br public class Downloa
  • idea运行Sparkstreaming读取hdfs文件遇到的问题

    先贴代码 idea中运行SparkStreaming时 xff0c 动态添加文件至指定目录下 xff0c 结果没有任务信息输出 问题原因 xff1a idea所在主机时间和hdfs集群时间不同步 代码中指定的hdfs目录为非空 启动之前已经
  • [HDU1085][HDU1028][HDU2013] 组合数学入门(母函数、递推)

    先来说一说母函数 xff0c 今天是第一次学 杭电关于母函数的PPT感觉不错 xff0c 挺适合入门看看的 什么是母函数 xff1f 对于序列a0 xff0c a1 xff0c a2 xff0c 构造一函数 xff1a G x 61 a0
  • Elasticsearch系列-Elasticsearch入门教程

    引言 Elasticsearch是著名的开源分布式搜索和数据处理平台 xff0c 是一个基于Lucene的分布式 实时 全文搜索系统 xff0c 其稳定 可靠 高可用 可大规模扩展等特性 xff0c 使得Elasticsearch的应用十分
  • Elasticsearch系列-Elasticsearch集群工作原理

    引言 ELasticsearch作为一个分布式搜索引擎 xff0c 能够出色地支持集群模式 动态水平扩容 故障转移等分布式系统特性 xff0c 这是其作为全文搜索引擎首选的重要原因 本文从零开始描述集群的配置和扩容过程 xff0c 让你对E
  • Elasticsearch系列-集群API(一)

    引言 Elasticsearch提供了大量了的Rest API用以操作Elastic search的相关功能 xff0c 提供了极大的便利 xff0c 掌握这些API是熟练地使用Elasticsearch的前提 Elastic search
  • JVM系列-CPU使用率高问题排查方法

    引言 Java程序在实际生产过程中经常遇到CPU使用率高的问题 xff0c 那么应该如何排查问题的原因呢 xff0c 本文大概描述一下排查方法 一 排查占用CPU的进程 使用top命令 xff0c 在大写打开的情况下按P键或者在大写没有打开
  • python判断list中的值是否完全一样

    对于一个python的list a span class token operator 61 span span class token punctuation span span class token number 1 span spa
  • 生产问题排查-SSLException:Unrecognized SSL message,plainetxt connection异常排查

    引言 最近在一次生产问题中遇到了SSLException Unrecognized SSL message plainetxt connection错误异常信息 xff0c 背景为调用微信api 获取相应信息的时候报错 xff0c 微信ap
  • 【云原生】本地搭建Openshift单机最小化开发环境

    文章目录 一 什么是CodeReady Container xff08 CRC xff09 xff1f 二 本地化部署CodeReady Container三 Code Ready Container的使用 公众号 xff1a MCNU云原
  • 手把手kubernetes本地化部署(含疑难杂症排查解析)

    文章目录 一 什么是Kubernetes xff1f 二 Kubernetes的基本概念PodDeploymentServiceNamespaceConfigMapSecret 三 Kuberntes单机本地部署3 1 安装minikube
  • chatGPT大规模使用kubernetes,云原生技术在AI领域也大有可为

    文章目录 一 云原生在AI领域的应用方向1 1 弹性部署1 2 自动化和可维护性1 3安全性和隔离性 二 云原生在AI领域的应用案例2 1 chatGPT全面使用云原生技术2 2 TensorFlow Serving和k8s及docker的
  • 数据清洗经验

    平时习惯了在某些特定的数据集合上做实验 xff0c 简单的tokenization 预处理等步骤就足够了 但是在数据越来越大的年代 xff0c 数据清洗越来越重要 xff0c 也越来越复杂 看到Philip J Guo 的这篇英文文章 Pa