Python数据分析与挖掘实战第四章笔记之数据预处理

# 数据预处理:包括数据的清洗,数据集成,数据变化和数据规约。
# 数据清洗主要是删除原始数据集中的无关数,重复数据,平滑噪声数据,筛选掉与挖掘主题无关的数据,处理缺失值,异常值等
# 缺失值的处理:删除记录,数据插补和不处理三种方法。
# 数据插补方法:1、均值、中位数、众数插补;2、使用固定值插补:将缺失的属性值用一个常量进行替换;3、最近临插补:在记录中找到与缺失样本最接近的样本的该属性值进行插补;
# 4、回归方法:对带有缺失值的变量,根据已有数据和与其有关的其他变量的数据建立拟合模型老预测确实的属性值;5、插值法:利用已知点建立合适的插值函数,未知值由丢in给点求出的函数值近似代替。
# 插值方法:1、拉格朗日插值法:但是在实际计算中很不方便。2、牛顿插值法:具有承袭性和易于变动节点的特点。在pythonscipy库中只提供了拉格朗日插值法的函数,牛顿法需要自己进行编写。

# 用拉格朗日法进行插补代码
import pandas as pd
from scipy.interpolate import lagrange
inputfile='E:/WTTfiles/自我学习/机器学习/python数据分析与挖掘实战/chapter4/demo/data/catering_sale.xls'
outputfile='E:/WTTfiles/自我学习/机器学习/python数据分析与挖掘实战/chapter4/demo/tmp/sales.xls'#输出数据路径
data=pd.read_excel(inputfile)
# data[u'销量'][(data[u'销量']<400) | (data[u'销量']>5000)]=None#过滤异常值,将其变为空值
row_indexs = (data[u'销量'] < 400) | (data[u'销量'] > 5000)  #得到过滤数据的索引
data.loc[row_indexs,u'销量'] = None  #过滤数据

# 自定义列向量插值函数
def ployinterp_column(s,n,k=5):#s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5    y=s[list(range(n-k,n))+list(range(n+1,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_column(data[i],j)
            data.loc[j, i] = ployinterp_column(data[i], j)
data.to_excel(outputfile)#输出结果,写入文件



# 异常值处理:
# 在数据预处理时,异常值是否剔除,要视情况而定。
# 1、删除含有异常值的记录;2、视为缺失值:利用缺失值的方法进行处理;3、平均值修正:可用前后两个观测值的平均值修正改异常值;4、不处理:直接在具有异常值的数据上进行挖掘建模



# 4.2数据集成:数据往往分布在不同的数据源中,数据集成就是将多个数据源合并存放在一个一致的数据存储中的过程。
# 1、实体识别:从不同数据源识别出现实世界的实体,统一不同源数据的矛盾之处;
# 2、冗余属性识别:数据集成往往导致数据冗余:统一属性多次出现;同一属性命名不一致导致重复。对于冗余数据先分析,检测后进行删除。
#4.3 数据变换:主要是对数据进行规范化处理,将数据转换成适当的形式。
# 1、简单函数变换:是对原始数据进行某些数学函数变换,常用的包括平方、开方、取对数、差分运算等。简单的函数变换常用来将不具有正态分布的数据变换成具有正态分布的数据。
# 在时间序列分析中,简单的对数变换或者差分运算可以将非平稳序列转换成平稳序列。
# 2、规范化:为了消除指标间的量纲和取值范围差异的影响,需要进行标准化处理,将数据按照比例进行缩放。
#1)最小-最大规范化:也称为离差标准化,是对原始数据进行线性变换,将数值映射到[0-1]之间,x*=(x-min)/(max-min)
# (2)-均值规范化:也称标准差标准化,经过处理的数据均值为0,标准差为1x*=(x-平均值)/标准差
#3)小数定标规范化:通过移动属性值的小数位数,将属性值映射到[-1,1]之间,移动的小数位数取决于属性值绝对值的最大值,x*=x/10^k

# 数据规范化代码
import pandas as pd
import numpy as np
datafile='E:/WTTfiles/自我学习/机器学习/python数据分析与挖掘实战/chapter4/demo/data/normalization_data.xls'
data=pd.read_excel(datafile,header=None)
print(data)
print((data-data.min())/(data.max()-data.min()))
print((data-data.mean())/data.std())
print(data/10**np.ceil(np.log10(data.abs().max())))

你可能感兴趣的:(数据分析与数据挖掘)