数据清洗(一)----- 清洗数据的目的及基本格式、类型与编码

一、数据清洗的目的

         简单的来说不干净的数据会导致分析过程中的错误以及结果的错误。举个简单的例子,以前我们上学时做柱形图这种类型的图时,如果大部分数据集中在某个区间而一两个数据离得很远,如果不去除这一两个有问题的数据,那整体的图画出来就会有问题,不能反映数据的情况。

二、数据科学的过程

1. 问题陈述

      清楚的了解你要解决的问题是什么。

2. 数据的收集与存储

      从哪里收集数据?收集来的数据在哪里存放?格式又是什么?

3. 数据清洗

      简单的查看一下数据,有哪些地方需要处理?有没有需要删除的?有没有需要转换的?怎样调整数据才能适应接下来的分析和挖掘?

4. 数据分析和机器学习

     数据需要进一步进行怎样的处理?使用什么样的算法?运用什么公式?怎样的顺序?

5. 数据展现和可视化

     数据的处理结果该怎样呈现出来?采用什么样的图或表能更加直观的达到说明问题的效果?有没有更好的可视化方案?有没有替代方案?

6 问题决议

    第一步中问题的答案究竟是什么?数据处理的结果还有哪些方面的不足?这个方法能彻底解决问题么?还有没有别的办法?接下来要做的又是什么?

       其实在处理这些问题时步骤大概按照这六步走,但是划分也不那么绝对。比如你在数据收集的时候就可以进行清洗,处理之后还要继续清洗,等等;步骤有时会有交叉,但最终的目的都是一样的。

三、记录数据处理的过程

        认真记录下曾经按什么样的顺序处理过什么样的事情很有必要,因为哪怕再小的项目,如果你不记录,几个月之后你可能就不知道当时对数据干了啥,也说不清其中的原由,更谈不上重新做一次。

       解决这个问题最好的办法就是留一份工作日志。这个日志应该包含链接、屏幕截图、复制粘贴关键的命令、解释这样处理原因的关键性文字等等。如果你对版本控制系统比较熟的话,可以使用Git或SVN来记录处理的过程。

四、基础知识——格式、类型与编码

1. 文件格式

      在网上收集数据的时候可能会遇到以下几种情况:

  • 数据可以以文件的形式下载
  • 数据可以通过交互界面访问,比如利用查询接口来访问数据库系统
  • 数据通过持续不断的流的形式进行访问
  • 通过应用程序接口(API)来访问

      在计算机中广义存在的两种文件类型是文本文件和二进制文件;简单来说,平时我们能看懂的记事本、表格等都是文本文件,计算机能读懂但由非人类可读字符组成的文件是二进制文件。

1.1 常见的文本文件格式

      最常见的文本文件类型主要有三种:

  • 分隔格式(结构化数据)
  • JSON格式(半结构化数据)
  • HTML格式(非结构化数据)

1.2 分隔格式

      分隔文件就是文本格式文件,这种文件行和列由统一的符号分隔;分隔的字符就叫做分隔符。最常见的分隔符就是制表符和逗号,这两种方案分别出现在制表符分隔值(TSV)和逗号分隔值(CSV)中。

      1.2.1  查看不可见的分隔字符

                分隔文件中的换行符、回车符等都是不可见的,如何让他们可见呢?比如用notepad++打开的文件,要显示分隔符可以这么操作:视图 --> 显示符号 -->  在 显示所有字符 处打勾就可以了;其它的软件文本行都可以找到各自的方式查看。

      1.2.2  封闭错误数据

               举个例子:在一个以 “ , ” 为分隔符的分隔文件中,如果有一个工资数据的格式是这样 “ 76,888 ” ,这个逗号是工资中的千位分隔符,但在此分隔文件中,逗号又是分隔符,因此引起错误;处理方案主要有以下两种:

  • 创建分隔文件时检查确保没有引起歧义的逗号(也就是说删掉上面工资中的逗号,不使用那种格式的工资)
  • 使用额外的符号来对数据进行封闭处理(比如上面的工资数据用引号包含,将里面的逗号封闭起来)

      1.2.3  字符转义

              如果字符本身就含有引号,那么此时再用引号进行封闭显然不合适;也许你会说可以用单引号、双引号进行区别,但是单引号在英文中又与名词所有格冲突,因此也不算是最好的办法,遇到这种问题最好的解决办法就是使用转义字符:

               比如“ light \”red blue\“ ”,这样,通过  \ 反斜杠对双引号进行转义就不会与外面的双引号又冲突了。

      1.2.4  JSON格式

               JSON格式的数据是当前较为流行的数据格式,它是一个半结构化的数据,使用键值对的字典类型格式,数据的顺序无关紧要,还可以缺失某些值,它还支持多层级结构和多值属性

       1.2.5  HTML格式

               HTML文件是一种网页文件,非格式化的;里面包含很多冗余的数据,针对这种数据目前也有很对提取办法,网络信息爬虫就是专门针对这种网页数据爬取的,各式各样的提取规则以后会涉及到。

2. 归档文件

      归档文件就是内部包含(文本文件或二进制文件)等许多文件的独立文件。

磁带归档(TAR)文件:

      通常以.tar为后缀名,这种文件一般只归档并不会压缩;通常windows系统下直接使用相应的软件就可以归档了,而linux系统下则需要相应命令:tar cvf name.tar name1.csv name2.csv (创建归档文件) tar xvf name.tar(打开归档文件)    

3. 压缩、解压文件

       压缩文件其实与归档文件类似,只是后缀名不同,一般ZIP、RAR文件既归档又压缩。windows下压缩、解压都很方便,最主要的是利用程序来压缩解压,这个以后再探讨。Linux下的压缩解压命令可以查看我之前的博客LINUX常用命令

       压缩、解压的格式有非常多的选择,影响我们选择压缩、解压方式的主要有以下三个关键因素:

  • 压缩和解压缩的速度
  • 压缩比率(文件到底能缩减多少)
  • 压缩方案的互操作性(文件容易解压吗?)

        对于上面的因素考虑,一般没有定论,只有一些经验参考:gzip压缩和解压缩都比较快,但一般windows上没有;bzip2压缩的文件比gzip和zip都要小,但花费的时间稍微长一点,windows上同样也很少有这个;zip在各系统上都存在,压缩和解压速度也不赖,只是压缩比率不怎么高;rar是windows上独有的归档解决方案,归档速度不是特别理想。

4. 数据类型、空值与编码

4.1 数据类型

      数据类型基本上其它地方介绍的非常多而且详细,这里就不多做介绍,基本上在数据处理上接触到的最多数据类型为:数字、日期、字符串。

4.2 数据类型间的相互转换

      数据转换在数据清洗过程中必不可少,但是在介绍具体的转换之前我们先介绍一下转换过程中数据损耗的问题。

      数据损耗

       数据损耗有时会发生有时不会发生,有时的数据损耗是允许的,有时却不被允许,这就要看具体的情况来对待;一般损耗的风险因素有以下两个:

  • 同种类型间不同范围的转换:比如200长的字符串转换到100长的字符串上,超过长度的都会被截取掉;最容易忽略的就是数字类型上,比如长整型转换为整型,等等;
  • 不同精度间的转换:比如原本四位精度的数字转为两位精度,那么多余的精度信息将会被舍弃,造成数据的丢失。

4.3 数据类型间相互转换的策略

      SQL级别的类型转换

       例子一:将MySQL数据格式化为字符串

       比如数据库中查到一条日期数据 2000-01-21 04:51:00,我们希望得到4:51am,Friday,January 21,2000,我们可以这样操作:

select concat( 
              concat(hour(date),':',minute(date)),
              if (hour(date) < 12, 'am', 'pm'),
              concat(', ', dayname(date), ', ', monthname(date), ' ', day(date), ', ', year(date))
              )
from table_name where mid=21;

或者使用date_format()函数:

select date_format(date, '%1:%i%p, %W, %M %e, %Y') from tbl_name where mid=21;
用这个语句查出的唯一不同是AM是大写的,只需要将am那一部分拆开转化为小写再用concat函数链接即可。

      例子二:从字符串类型转换到MySQL日期类型

      比如有一段字符串“ ....>....>.....>sent:Thursday, August 17, 2000 6:29 PM>...."是这样子的,我们要提取里面的日期并转化为MySQL的datetime类型:

select str_to_date(
                   substring_index(
                                   substring_index(reference, '>', 3),
                                   'sent:',
                                   -1),
                   '%W, %M,%e, %Y, %h:%i %p')
from referenceinfo where mid =22;
substring_index()函数按指定字符对字符串进行分割,并得到指定位置的字符串;
str_to_date()函数就是将字符串格式的日期转化为datetime类型。

       例子三:将字符串类型转换数据转化为小数

       比如有某个字符串 ” .......$18.47/bbl....“ ,现在需要提取字符串里面的数字并转化为小数:

select convert(substring_index(
                               substring(body,locate('$', body) + 1),
                               '/bbl',
                               1),
              decimal(4,2)
              ) 
as price from tbl_name where body like '%$%' and body like '%/bbl%' ;
substring()函数定位,substring_index()函数分割,convert()函数将字符转换为数字

      文件级别的类型转换

       例子一:excel中的类型转换

       一般这种表格中可以直接设置单元格格式,修改数据的类型;使用函数判断,例如=istext(A2)就可以判断A2中的内容是不是文本,是返回TRUE,不是则返回FALSE;同样isnumber()函数也是如此。

       另外,还有这样的转换方式 =TEXT(A4, "yyyy-mm-dd"),这样就可以直接将数字类型的日期转换为字符串类型的。

4.4 隐藏在数据森林中的空值

       在数据处理时有一些是我们不需要的数据,比如0值、空值和null值,这三种值不进行处理往往会导致一些错误,并且这三种值是不同的,在具体的情景下处理方式不一。

       

       0值是最容易处理的空值,因为它具有一定的意义;可以拿他进行排序、比较、数学运算(不能当除数);有了这些基础,0值处理起来就很容易了。

       

       与0值相比,空值的处理要难一些,因为它在不同的情况下产生的含义不同。比如”“两个引号紧挨着,这时可以说他为空值,” “两个引号之间有个空格,这时可以说它是空格;需要注意这些问题。

       null

      null不等于任何值,甚至是它本身。只有在不希望出现任何数据的情况下才应该使用NULL。一般对于null值的处理通常都是用指定的值去替换掉(一般用0),不过这种替换应该做好规划,使它有利于接下来的数据处理,并做好记录一面以后遗忘。

4.5 字符编码

      不管是数据库里数据还是文本文件内中的数据,在存储时都采用了一定的编码解码格式,当使用不同的编码格式来对文件或数据库内容进行读取时就会产生编码冲突,因此要通过调整编码使之一致,或使用向下兼容的编码类型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章