美文网首页
数据预处理(python)

数据预处理(python)

作者: Colleen_oh | 来源:发表于2019-06-12 14:31 被阅读0次

    作为统计的一员,用python来对数据做语出这一步骤是必需的,所以接下来就来总结一下python数据预处理的步骤吧,这里就不放数据了,直接上代码,代码后都有解释,有错误的尽管提出来哈。下面是流程图:

    一、数据预览

    import pandas as pd
    import numpy as np
    data=pd.read_csv('path',sep=',' ,header = 0,encoding='gbk',usecols=['col1','col2','col3'])#导入数据,把path改成文件路径;数据中有中文的话,就用encoding='gbk',没有中文的话就用encoding='utf-8';usecols是可以让我们选择哪几列
    data.head()#查看前五行
    data.info()#查看各字段的信息,其中包含行数、是否为空、字符类型
    data.shape#查看数据集行列分布,几行几列
    data.describe()#查看数据的描述性统计,其中包括总数、均值、标准方差、最小最大、第一四分位数、中位数
    

    预览完数据后要检查是否有重复值。

    d=0
    for i in train.duplicated():
        if i !=False:
            d+=1
    print("d:",d)
    

    二、数据清洗

    2.1 缺失值处理

    data.isnull()#元素级别的判断,把对应的所有元素的位置都列出来,元素为空或者NA就显示True,否则就是False
    data.isnull().any(axis=0)# 查看各列是否存在空值,True表示有空值,axis=0代表是查看列,axis=1是查看行是否存在控制
    data.isnull().any(axis=0).sum()#计算含有空值的列数,若把axis=0改成axis=1,则是计算含有空值的行数
    data['column_name'].isnull().sum()#将某一列中为空或者NA的个数统计出来,把column_name改成字段名
    

    缺失值有三种常用的处理方法,分别是删除法、替换法、插补法。

    2.11 删除法

    删除法可以通过删除观测样本或者删除变量来实现。删除法适用于变量有较大缺失且对研究目标影响不大的情况。如果删除了之后应该很多不建议用删除法。在kaggle中有人这样处理缺失数据,如果数据的缺失达到15%,且并没有发现该变量有多大作用,就删除该变量。

    del data['column_name'] #删除某一列
    data['column_name'].dropna()   #删除某一行为空值或者NA的元素
    data.drop(data.columns[[0,1]],axis=1,inplace=True)  #删除第1,2列,inplace=True表示直接就在内存中替换了,不用二次赋值生效。
    data.dropna(axis=0)         #删除带有空值的行
    data.dropna(axis=1)        #删除带有空值的列
    

    2.12 替换法

    如果缺失值所在变量为数值型,一般用均值来替换;如果为非数值型变量,则使用中位数或者是众数来替换。

    data['column_name']=data['column_name'].fillna(num) #将该列中的空值或者NA填充为num.其中num是某位数字,这个代码用于用数字进行替换。
    data['column_name'][data['column_name'].isnull()]=data['column_name'].dropna().mode().values#如果该列是字符串的,就将该列中出现次数最多的字符串赋予空值,mode()函数就是取出现次数最多的元素
    data['column_name'].fillna(method='pad') #使用前一个数值替代空值或者NA,就是NA前面最近的非空数值替换
    data['column_name'].fillna(method='bfill',limit=1) #使用后一个数值替代空值或者NA,limit=1就是限制如果几个连续的空值,只能最近的一个空值可以被填充。
    data['column_name'].fillna(data['column_name'].mean()) #使用平均值进行填充
    data= data.fillna(data.mean()) #将缺失值全部用该列的平均值代替,这个时候一般已经提前将字符串特征转换成了数值。
    

    2.13 插补法

    使用删除法和替换法有时会存在信息浪费的问题且数据结构会发生变动,以致最后得到有偏的统计结果。用插补法可以很轻松地解决此类问题。常用的插补法有回归插补,多重插补、拉格朗日插补法等。这里就不插入代码了,这个要看情况而选择插补。
    拉格朗日插值法参考:https://blog.csdn.net/sinat_22510827/article/details/80972389

    2.2 异常值处理

    在异常值处理之前需要对异常值进行识别,一般多采用单变量散点图或是箱线图来达到目的,利用图形来判断数值是否处理正常值范围。
    异常值处理的常用方法有四种:删除含有异常值的记录、视为缺失值、平均值修正、不处理。

    import matplotlib.pyplot as plt
    plt.boxplot(data['column_name'],vert = False)#箱线图
    plt.show()
    plt.plot(data['column_name'], data['column_name'], 'o', color='black')#散点图
    data['column_name'].describe()#描述性统计
    def count_box(Q_3,Q_1):#Q_3为75%分位数(第三四分位数),Q_1为25%分位数(第一四分位数)
        IQR=Q_3-Q_1
        down_line=Q_1-1.5*IQR
        up_line=Q_3+1.5*IQR
        print("异常值上限:",up_line," 异常值下限:",down_line)
    

    上面代码中的count_box函数是计算箱线图的异常值上限和下限的,从箱线图的上限和下限可以判断出异常值,当大于上限时,就判断为异常值,当小于下限时,也判断为异常值。
    由于单变量的散点图比较难画,我是选择两个同样的变量做x,y轴,这样其实也可以看出哪些是异常的哈哈哈。同时也可以通过统计来找出异常值的!找出异常值后,就可以自行处理啦。

    三、数据集成

    数据集成就是将多个数据源合并存放在一个一致的数据存储中的过程。这个就要看需求去集成啦!!也不细讲啦

    四、数据变换

    数据变换主要是对数据进行规范化处理、连续变量的离散化以及变量属性的构造,将数据转换成“适当的”形式,以满足挖掘任务及算法的需要。

    4.1 数据转换

    这一步就是把一些属性特征转换为数据的一个过程,例如性别这个字段,有男和女这两个元素。那我们就设0代表男,1代表女。

    def tran_fea(da):#da为要转换的字段
        name_all = list(da.unique())
        for i in range(len(list(da.unique()))):
            da = da.replace(name_all[i],str(i))
        return da 
    da.unique()#可以查看0 1 的顺序。
    

    上面是我自己写的函数,比较简单。

    4.2 简单函数变换

    简单函数变换是对原始数据进行某些数字函数变换,常用的包括平方、开方、取对数、差分运算等。

    4.3 规范化

    数据规范化(归一化)是数据挖掘的一项基础工作。为了消除指标之间的量纲和取值范围差异的影响,需要进行标准化处理,将数据按照比例进行缩放,使之落入一个特定的区域,便于进行综合分析。

    4.3.1 最小-最大规范化(离差标准化)

    最小-最大规范化是对原始数据的线性变换,将数值映射到0-1。
    X* = (x-x.min)/(x.max-x.min)

    ( data-data.min() ) / ( data.max() - data.min() )
    def scale01(da):#da为要进行规范化的字段
        new_da = []
        for i in range(len(da)):
            a = (float(da[i])-float(min(da))) / (float(max(da)) - float(min(da))+0.00000000000000000000001)
            new_da.append(a)
        return new_da
    

    上面有个自定义函数,是自己写的。。。还是很简单的。。有看到优化的大佬们和我说一下呗。。拯救一下我的菜鸡循环。

    4.3.2 零-均值规范化(标准差标准化)

    经过标准差标准化后,经过处理的数据的均值为0,标准差为1(不适用于数值集中且某个数值很大的情况)。
    转换公式为: x*= (x-均值) / 标准差

    ( data-data.mean() ) / data.std() 
    

    4.3.3 小数定标规范化

    通过移动属性值的小数位数,将属性值映射到[-1,1],移动的小数位数取决于属性值绝对值的最大值。
    转化公式为:x*= x / 10的K幂

    data / 10**np.ceil(np.log10( data.abs( ).max( ) ) )
    

    4.4 连续属性离散化

    有一些分类算法(如ID3算法、Apriori算法等),要求数据是分类属性形式。这样,常常需要将连续属性变换成分类属性,即连续属性离散化。
    离散化涉及两个子任务:确定分类数以及如何将连续属性值映射到这些分类值。
    常用的方法有以下几种:等宽法、等频法、聚类。

    4.4.1 等宽法

    将属性的值域分成具有相同宽度的区间。

    d1=pd.cut( data,k,labels=range(k) )#k为区间个数
    

    4.4.2 等频法

    该法将相同数量的记录放进每个区间。

    w=[ 1.0*i/k for i in range (k+1) ]#k是区间个数
    w=data.describe( percentiles=w ) [4 : 4+k+1]##使用 describe 函数自动计算分位数
    w[0]=w[0]*(1-1e-10)
    d2=pd.cut( data,w,labels=range(k) )
    

    4.4.3 聚类

    聚类的方法包括两个步骤,首先将连续属性的值用聚类算法进行聚类,然后再讲聚类得到的簇进行处理,合并到一个簇的连续属性值并做同一标记。这个很少用到,需要的同学自行去查资料。。。

    4.5 属性构造

    在数据挖掘的过程中,为了便于提取更有用的信息,挖掘更深层次的模式,提高挖掘结果的精度,需要利用已有的属性集构造出新的属性,并加入到现有的属性集合中。这个也是根据需求的啦。

    4.6 小波变换

    小波变换具有多分辨率的特点,在时域和领域都具有表征信号局部特征的能力,通过伸缩和平移等运算过程对信号进行多尺度聚焦分析,提供了一种非平稳信号的时顿分析手段,可以由粗及细地逐步观察信号,从中提取有用信息。

    参考:

    https://www.cnblogs.com/gczr/p/6761613.html
    https://blog.csdn.net/Guo_ya_nan/article/details/81013510
    https://www.jianshu.com/p/de1df23bee31

    相关文章

      网友评论

          本文标题:数据预处理(python)

          本文链接:https://www.haomeiwen.com/subject/cljffctx.html