数据分析[0]_常用数据处理

常用数据处理

这里主要介绍了包括以下几种类型的数据处理:
- 数值型数列均值、方差、分位数的计算
- 噪声数据过滤
- 缺失值补全方法


1. 实现数值型数列均值、方差、分位数的计算

1.1 均值计算
1、传入数据;
2、然后是构造计算均值的函数;
3、步骤为:(1)传入要计算列的参数;(2)设置变量存储该列数据的总和,以及设置变量存储数据的长度;(3)长度调用len()函数;(4)数据总和循环整个长度(也可以设置循环当有值存在时,长度加1,同时累加数据的和);(5)数据总和除以数据长度得到均值(需满足长度不为0);
4、调用函数,得到计算结果:

def LoadData(dataSet):
    data = pd.read_csv(dataSet)
    data.replace(to_replace='NaN', value=0, regex=True, inplace=True)
    return data

def GetMean(dataSet):
    "计算均值"
    sumOfData = 0 #存储数据的总和
    lengthOfData = len(dataSet) #存储数据的长度
    for i in range(len(dataSet)):
        #循环求和
        sumOfData = sumOfData + float(dataSet.loc[i])
    if lengthOfData != 0 :
        #返回均值
        return sumOfData/lengthOfData
    else:
        return '此数据无均值'

1.2 方差计算
1、传入数据;
2、然后是构造计算方差的函数;
3、步骤为:(1)传入要计算的数据列;(2)设置变量存储该列的均值,调用之前构造的均值计算函数;(3)设置变量存储数据列中每个值与均值差值的平方和,通过循环整个数据列的长度,其中平方和计算调用了pow(x,2)函数,也可以使用x**2计算;(4)若数据长度不为0返回方差结果。
4、调用函数,得到计算结果:

def LoadData(dataSet):
    data = pd.read_csv(dataSet)
    data.replace(to_replace='NaN', value=0, regex=True, inplace=True)
    return data

def GetVar(dataSet):
    "计算方差"
    average = GetMean(dataSet) #得到均值
    lengthOfData = len(dataSet)
    variance = 0
    for i in range(len(dataSet)):
        #首先计算各值与均值差值的平方和
        variance = variance + pow(float(dataSet.loc[i]) - average,2)
    if lengthOfData != 0:
        return variance/lengthOfData
    else:
        return '无标准差'

1.3 分位数计算
1、传入数据:随机输入乱序的列表
2、然后是构造分位数计算函数;
3、步骤为:(1)传入参数为数据列和要计算的分位数的数值;(2)判断分位数是否输入正确,错误则直接返回;(3)对传入的数据列进行升序排序;(4)确定该分位数的位置,即长度与分位数的乘积,若位置坐标不为整数时,向上取整;(5)根据位置坐标来选取分位数的数值结果,位置大于1时在列表中的坐标为实际位置减1,位置小于1时,即第一个点的位置。
4、调用函数,得到计算结果:

def LoadData(dataSet):
    data = pd.read_csv(dataSet)
    data.replace(to_replace='NaN', value=0, regex=True, inplace=True)
    return data

def GetQuantile(dataSet,percent):
    "计算分位数"
    if percent >=1 or percent < 0:
        return '分位数数值传入出错,需要在0-1之间'
    dataSet.sort()
    print(dataSet)
    #如果不为整数,向上取整
    i = math.ceil(len(dataSet)*percent)
    print(i)
    if i > 1 :
        quantile = float(dataSet[i-1])
    else :
        quantile = float(dataSet[0])
    return quantile

2. 噪声数据过滤

2.1 噪声数据过滤–最大最小阈值过滤噪声数据
1、传入数据列dataframe类型或者其他的如列表格式也可以,只是对每个数据值的操作不同,构造函数;
2、步骤为:(1)传入参数数据列、最大最小的阈值;(2)通过循环整个数据列的长度,对每个数据进行数值大小判断,当该数据小于最小阈值或者大于最大阈值时,数据置空,最后返回数据列。
3、函数调用,以及输出结果。

def FilterNoiseThreshold(dataSet,maxThreshold,minThreshold):
    "利用最大最小的阈值来过滤噪声数据"
    for i in range(len(dataSet)):
        if float(dataSet.loc[i]) < minThreshold or float(dataSet.loc[i]) > maxThreshold:
            dataSet.loc[i] = np.nan
    return dataSet

2.2 噪声数据过滤–等频装箱均值填充过滤噪声数据
1、等频装箱:将数据排序后,分为不同箱子,在每个箱子中数据的个数一样,使用每个箱子的均值来填充每个箱子中的原本的值,进行噪声平滑处理。
2、传入数据列。
3、构造等频装箱函数。

def GetFrequencySpiltbox(data,box):
    "等频装箱:每个箱子用均值填充"
    data.sort() #首先进行排序
    print(data)
    flag = len(data) % box #用于判断最后面的箱子是否刚好分完
    dict = {}   #存储于字典中
    #最后的箱子不能分完
    if flag >= 1:
        boxNum = len(data)/box + 1
        i = 0
        j = 0 #盒子长度的移动
        for i in range(int(boxNum)-1):
            dict[i] = data[0+j:box+j]
            j = j + box
#            #均值填充
#            dict[i] = [GetMean(DataFrame(dict[i]))]*len(DataFrame(dict[i]))
        dict[i+1] = data[j:]
        #print(dict[i+1])
        dict[i+1] = [GetMean(DataFrame(dict[i+1]))]*len(DataFrame(dict[i+1]))
    #箱子刚好分完
    else:
        boxNum = len(data)/box
        i = 0
        j = 0
        for i in range(int(boxNum)):
            dict[i] = data[0+j:box+j]
            j = j + box
#            #均值填充
#            dict[i] = [GetMean(DataFrame(dict[i]))]*len(DataFrame(dict[i]))
    print('每个箱子的个数为:'+str(box))
    for value in dict:
        #print('第'+str(value+1)+'个箱子用均值平滑结果')
        print('第'+str(value+1)+'个箱子结果')
        print(dict[value])

2.3 噪声数据过滤–等宽装箱均值填充过滤噪声数据
1、等宽装箱:将数据排序后,分为不同箱子,在每个箱子中数据最大最小的差值是一样的,即箱子的宽度相同,使用每个箱子的均值来填充每个箱子中的原本的值,进行噪声平滑处理。
2、传入数据列。
3、构造等宽装箱函数。

def GetWidthSpiltbox(data,width):
    "等宽装箱:每个箱子用均值填充"
    data.sort() #首先进行排序
    print(data)
    t=0
    i=width
    box = []
    for line in data:
        #判断当前值是否大于第一个值加宽度,如果大于就需要放进下一个箱子
        if line >= (data[t]+i): 
            #返回line这个值在data列表中的位置
            ind = data.index(line)
            #为当前箱子赋值
            box.append(data[t:ind+1])
            #当前游标为索引值再后移1个单位
            t = ind
            t += 1
        #如果line已经到达最后了,不管是否达到宽度都属于最后一个箱子
        elif line == data[len(data)-1]:
            ind = data.index(line)
            box.append(data[t:ind+1])
    print('设定区间范围为:'+str(width))
    for i in range(len(DataFrame(box))):
        print('第'+str(i+1)+'个箱子分箱结果为:')
#        for j in range(len(DataFrame((box[i])))):
#            box[i] = list(DataFrame(box[i]).mean())*len(DataFrame((box[i])))
        print(box[i])

3. 缺失值补全方法

3.1 缺失值填充–均值/分位数填充缺失值
1、传入数据列,构造函数;
2、步骤为:(1)传入需要填充的数据列参数;(2)首选将数据中的缺失值替换为0;(3)均值填充:如果当前值为0,则调用均值函数替换当前值;(4)分位数填充:如果当前值为0,则调用分位数函数替换当前值;(5)返回缺失值补全的数据列。
3、函数调用,以及输出结果。

def GetFillMissing(dataSet):
    "均值和分位数填充缺失值"
    dataSet.replace(to_replace='NaN', value=0, regex=True, inplace=True)
    #均值填充GetMean(dataSet.H3MeK4_N)
    dataSet.H3MeK4_N = dataSet.H3MeK4_N.map(lambda x : GetMean(dataSet.H3MeK4_N) if x==0 else x)
    #分位数填充GetQuantile(dataSet,percent)
    #dataSet.H3MeK4_N = dataSet.H3MeK4_N.map(lambda x : GetQuantile(list(dataSet.H3MeK4_N),0.5) if x==0 else x)
    return dataSet

3.2 缺失值填充–启发式补全
—————–启发式补全是数据分析最常用的填充方式,能够很好消除一些不确定性,让结果更加精确。比如此处以男女身高缺失为例,直接使用均值、中位数或者其他进行填充,效果必定差于用男性均高填充男性缺失身高,女生同理。如果属性更多,也可以使用更多的属性来进行启发式补全,比如出生年龄、出生地、家庭背景等等属性。
1、传入dataframe类型的数据,0代表女性,1代表男性:
这里写图片描述
2、启发式补全:对于其中3号男性和5号女性使用启发式补全缺失的身高,想要用女性的平均身高填充5号身高,用男性的平均身高填充3号的身高。
3、函数调用;
4、步骤为:(1)首先填充缺失值为0;(2)循环所有的数据,对于性别为女的身高求一次平均值,对于身高为男性的求一次平均值;(3)再循环所有的数据,给对应性别的身高缺失的数据填充对应的性别的身高均值。
5、调用函数,结果为:
这里写图片描述

def GetFillMissingHeuristic(data):
    "启发式补全"
    sex = data.sex
    height = data.height
    data.replace(to_replace='NaN', value=-1, regex=True, inplace=True)
    sumHeight0 = 0
    len0 = 0
    sumHeight1 = 0
    len1 = 0
    for i in range(len(data)):
        if (int(sex.loc[i]) == 0) & (int(height.loc[i])!=-1):
            sumHeight0 += height.loc[i]
            len0 += 1
        elif (int(sex.loc[i]) == 1) & (int(height.loc[i])!=-1):
            sumHeight1 += height.loc[i]
            len1 += 1
    for i in range(len(data)):
        if (int(data['height'].loc[i]) == -1) & (int(data['sex'].loc[i]) == 0):
           data['height'].loc[i] = sumHeight0/len0
        if (int(data['height'].loc[i]) == -1) & (int(data['sex'].loc[i]) == 1):
           data['height'].loc[i] = sumHeight1/len1
    return data

猜你喜欢

转载自blog.csdn.net/YuXiao_V/article/details/79414022