数据预处理

作者: 晓迦 | 来源:发表于2019-01-19 20:05 被阅读3次
    数据预处理.PNG

    缺失值分析

    数据的缺失主要包括记录的缺失和记录中某个字段信息的缺失,两者都会造成分析结果的不准确。
    产生的原因

    • 有些信息暂时无法获取或者获取信息的代价太大
    • 有些信息是被遗漏的。
    • 属性值不存在。

    缺失值的影响

    • 数据挖掘建模将丢失大量的有用信息。
    • 数据挖掘模型所表现出的不确定性更加显著,模型中雨涵的规律更难把握。
    • 包含空值的数据将使建模过程陷入混乱,导致不可靠的输出。

    缺失值处理

    1.删除缺失值:

    • data.dropna() #直接删除含有缺失值的行
    • data.dropna(axis=1) #直接删除含有缺失值的行
    • data.dropna(how = 'all') #删除全是缺失值的行
    • data.dropna(thresh = 3) #保留至少有3个非空值的行
    • data.dropna(subset = [u'血型']) #判断特定的列,若该列含有缺失值则删除缺失值所在的行

    2.插补缺失值

    • data.fillna(data.mean()) # 均值插补
    • data.fillna(data.median()) #中位数插补
    • data.fillna(data.mode()) # 众数插补
    • data.fillna(data.max()) #最大值插补
    • data.fillna(data.min()) #最小值插补
    • data.fillna(5000) # 固定值插补
    • data.fillna(method = 'fill') #最近临插补--用缺失值的前一个值填充
    • data.fillna(method = 'pad') #最近临插补--用缺失值的前一个值填充

    异常值分析

    • 简单统计分析,剔除掉不合理的数据。
    • 3\sigma原则
    • 箱型图分析,异常值通常被定义为小于Q_L - 1.5IQR或者大于Q_H +1.5IQR的值。

    异常值处理

    将异常值视为缺失值后进行插补。

    重复值处理

    • 所有列是否重复
      查看:print(data.duplicate()))
      删除:data.drop_duplicates()
    • 某一列是否重复
      查看:print(data.duplicated('column'))
      删除:data.drop_duplicates('column')
    • 根据多列判断
      查看:print(data.duplicated(['col1','col2','col3'])
      删除:data.drop_duplicaties(['col1','col2','col3'])

    拉格朗日法插补

    from scipy.interpolate import lagrange
    # 自定义拉格朗日插值函数
    # s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5
    def ployinterp_column(s,n,k=5):
        y = s[list(range(n-k,n)) + list(range(n,n+1+k))]  # 取值
        y = y[y.notnull()] # 剔除空值
        return lagrange(y.index,list(y))(n)
    # 逐个判断元素是否需要插值
    for i in data.columns:
        for j in range(len(data)):
            if (data[i].isnull())[j]:
                data[i][j] = ployinterp_columns(data[i],j)
    

    数据归一化

    最小最大归一化

    (data-data.min())/(data.max()-data.min())
    

    零均值归一化

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

    小数定标规范化

    data/10**np.ceil(log10(data.abs().max())) # np.ceil() 计算大于等于该值的最小整数
    

    连续属性离散化

    等宽法

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

    等频法

    w = [1.0*i/k for i in range(k+1)]
    w = data.describe(percentiles = w)[4:4+k+1]
    w[0] = w[0]*(1-1e-10)  #为了包含第一个值
    d2 = pd.cut(data,w,labels=range(k))
    

    基于聚类分析的方法

    from sklearn.cluster import KMeans
    kmodel = KMeans(n_clusters = k,n_jobs = 4)
    kmodel.fit(data.reshape((len(data),1)))
    c= pd.DataFrame(kmodel.cluster_centers_).sort(0)  #输出聚类中心并排序
    w = pd.rolling_mean(c,2).iloc[1:] #移动平均第一个值为空值  去除第一个值
    w = [0] + list(w[0]) + [data.max()] #加上最大值和最小值,生成一个新的列表
    d3 = data.cut(data,w,labels = range(k))
    

    主成分分析降维

    #对一个10*4维的随机矩阵进行降维
    from sklearn.decomposition import PCA
    D = np.random.rand(10,4)
    pca = PCA()
    pca.fit(D)
    pca.components_ # 返回模型的各个特征向量
    pca.explained_variance_ratio_ #返回各个成分各自的方差百分比
    

    合并数据

    堆叠合并
    横向堆叠是指将后一个表的数据堆叠到前一个表的后几列,可以使用 concat 函数完成。
    与横向堆叠相对的,纵向堆叠则是指将后一个表的数据堆叠到前一个表的下几行

    pd.concat(objs,axis = 0,join = 'outer')
    # objs:表示需要合并表的组合[d1,d2],接受多个Series,DataFrame,Panel的组合,无默认。
    #axis:默认为0,axis = 0表示做列对齐,列名一致的话,将后表数据添加到前表的下几行(纵向堆叠)。axis = 1表示做行对齐,行标签一致的情况下,将后表的数据添加到前表的后几列(横向堆叠)。
    # join:默认为outer,'inner'和'outer'表示取交集和并集。
    

    详细可见:concat函数的常用参数及说明
    主键合并
    主键合并是指前后两个表按照一个或者多个键匹配的方式连接起来。
    pandas库中的 merge 函数和 join 函数都可以实现主键合并。

    pd.merge(left,right,how='inner',on=None,left_on=None,right_on = None,left_index=False,right_index=False,sort=False
    #left,right:分别表示需要匹配的左表和右表,可接受的对象为DataFrame
    #how:表示左右表的连接方式,默认为inner,可以接收的取值为left,right,inner,outer;
    # on :表示左右表的连接主键,两个表的主键名称一致时才能使用,不一致时,需要使用使用left_on,right_on等参数,on 参数默认为None,可接收的数据类型为str或sequence。
    sort:表示是否对合并后的数据进行排序,默认为False,可接收的数据类型为boolean.
    
    data1.join(data2,on=None,how='inner',sort=sort)  
    # join 函数与merge 函数 不同之处在于,join 函数要求两个主键的名称必须相同。
    

    详细可见:merge函数的常用参数及说明
    重叠合并
    数据处理的过程中偶尔出现同样一份数据存储在两张表中,单看两张表的话,哪一张的数据都不算全,但是如果将其中一个表的数据补充进另一张表中,生产的这张新表是相对完整的数据。这种方法叫重叠合并,pandas库中提供了 combine_first的方法来实现这一功能。

    data1.combine_first(data2)
    

    参考:《Python数据分析与挖掘实战》
    黄小技术包搞分析的博客

    相关文章

      网友评论

        本文标题:数据预处理

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