Bootstrap

大数据清洗随手记(一)

基于Python的大数据清洗

引言

    大数据可能是2017年之后最火的一个题材了。与其说是题材,我倒感觉可以理解为食材,一个只需要添油加火就炒热的食材。作为一个JavaWEB的开发人员,我曾特别“瞧不上”大数据,认为大数据并不是一个谁都可以做得来的东西,也不是一个我这样Java开发小白能承受得来的东西。但是“老天爷”就是喜欢和你看玩笑,你越不愿意接触的东西,他就会强硬地让你接触,我们公司迎来了战略发展转型期,而大数据就是其中的一个发展方向,很“幸运”我被分配到了大数据研发小组,开始了我战争般的职业生涯。闲话不多说正文开始:

简介

    大数据:超过TB,EB级的数据信息

    Python:一门高级(任性编写)的开发语言

   那么问题来了,大数据清洗为什么要用Python呢?答:因为import!!!Python提供了数不尽的依赖库,Pandas、numpy、matplotlib等等,这些前人的智慧促使了我们使用Python语言进行大数据清洗,Python提供很多的算法分析来进一步的帮助我们进行数据分析和清理。

正文

    Pandas实现读取不同的数据源文件:

#导入需要的依赖库
import pandas as pd
import cx_Oracle
import os
from _operator import index

    读取csv文件的方法:

xls = pd.read_excel('D:/RData/demo/1234.xlsx') 

    读取Excel文件的方法:

    注意这里是office的Excel文件,WPS可能会报错。

data = pd.read_csv("D:/RData/demo/123.csv")

    读取Oracle数据库的方法:

#防止数据库乱码
os.environ['NLS_LANG']='SIMPLIFIED CHINESE_CHINA.ZHS16GBK'
   
#2.链接ORacle数据库
host = "127.0.0.1"    #数据库ip
port = "1521"     #端口
sid = "DAXON"    #数据库名称
dsn = cx_Oracle.makedsn(host, port, sid)
   
#scott是数据用户名,tiger是登录密码(默认用户名和密码)
conn = cx_Oracle.connect("WMIS", "root", dsn)  
   
#SQL语句,可以定制,实现灵活查询
sql = 'SELECT RACID,RAADDR,RAREADER,RABUSSID,RABUSSDATE,RAUSENUM,RAPRICE,RAREADMONTH FROM WMIS_REC_ACC'
   
#使用pandas 的read_sql函数,可以直接将数据存放在dataframe中
result = pd.read_sql(sql,conn) 
conn.close

    读取后的数据存到了dataframe中,方便进行数据清洗操作。以下的方法中还有许多参数,请自行参考API

    基于Python的数据清洗

    数据去重(和按指定字段去重):

#数据去重
result_noDup = result.drop_duplicates()
#按指定字段去除重复数据
data_drop=result.drop_duplicates(['ID'])

    数据去空(慎用):

#数据去空
result_noNull = result_noDup.dropna()

    打印数据描述,判断异常值。(这里只会统计整数值)

#打印数据描述
print(result_noNull.describe())
#min最小值、max最大值、count统计、mean平均值

    图形结果如下:

                 

    根据业务可以选择清除最大值和最小值:

#清除异常数据
result=result_noNull.drop((result_noNull[result_noNull['RAUSENUM'] < 0]).index.tolist())
result = result.drop((result[result['RAUSENUM']==826]).index.tolist())
#去除单价的异常数据
#result=result.drop((result[result['RAPRICE'] == 0]).index.tolist())
#测试
print(result.describe())

    数据替换:

    当数据样本量小的时候,删除数据是不可取的,这会影响到数据的分析建模。所以我们采用数据的平均数,众数或中位数替换的方法读数据进行清洗。众数、平均数、众数可以通过遍历字段求取,这里就不做展示了偷笑


#替换
result['RAUSENUM']=result['RAUSENUM'].replace([1,2,3],np.nan)
result['RAPRICE']=result['RAPRICE'].replace(0,1)
result_rep=result

    具体数据类型化:

    当业务需求对数据的取值范围进行统计,将一定范围的数据定义为以一个类形时,这时我们就需要对数据一定范围内数据进行具体类型化。

#定义分割区域
cutPoint=[0,1000,3000,6000,10000]
result_rep['RAUSENUM']=pd.cut(result_rep['RAUSENUM'],cutPoint)
print(result_rep)
#分组显示
groupLable=['1','2','3','4']
result_rep['CutUseNum']=pd.cut(result_rep['RAUSENUM'],cutPoint,labels=groupLable)
print(result_rep)

    根据正则表达式清洗:

    正则表达式是一种十分规范的数据清洗方式,我们可以通过定义正则表达式匹配字段每一行的值,从而抛弃掉那些不符合正则的数据。

#删除BFNAME不符合的行数据
for row in result_noNull.index:
    pattern=result_noNull.loc[row].values[1]
    if(not(re.search(r'^[\u4e00-\u9fa5]{1,8}$', pattern))):
        result_noNull.drop(row)
#        print("已删除")

           

    根据日期进行数据统计

    分别按照年度、季度、月度进行统计:

#将数据类型转换成日期格式
result['RABUSSDATE'] = pd.to_datetime(result['RABUSSDATE'])
#将日期作为index输出
result1=result.set_index('RABUSSDATE')
  
#统计年度的用水量
result_year=result1.resample('AS').sum().to_period('A')
#统计季度的用水量
result_year=result1.resample('Q').sum().to_period('Q')
#统计月度的用水量
result_year=result1.resample('M').sum().to_period('M')
print(result_year)

        

     根据双重条件进行数据统计:

#双重条件的数据统计
result_gb=result['RAUSENUM'].groupby([result['RAREADMONTH'],result['RAADDR']]).sum()
print(result_gb)

            

;