day06-pandas高阶 课件代码下午

03-缺失值检测与处理

import pandas as pd
import numpy as np

# 加载数据
data = pd.read_excel("./qs.xlsx")
print('data:\n', data)
print('data的列索引:\n', data.columns)

# 检测缺失值
#  isnull + sum
res_null = pd.isnull(data).sum()
print('res_null:\n', res_null)
print('*' * 100)

# notnull + sum
# res_null = pd.notnull(data).sum()
# print('res_null:\n',res_null)

# 处理缺失值
# 1、删除法 ---简单粗暴,易懂易操作,不能随意使用,如果随意使用,可能会造成数据的大量丢失
# 只有整行或者整列 大部分为缺失值或者全部为缺失值,才能进行使用
# axis=0, ---行, axis = 1 列
# how='any' ---只要有缺失值,就删除整列或者整行
# inplace=False # 不对df产生影响, inplace=True--直接对df产生影响
# data.dropna(axis=0, how='any', inplace=True)
# data.dropna(axis=1, how='any', inplace=True)
# how = 'all' ----只有整行、或者整列 全部为缺失值,才进行删除
# data.dropna(axis=1, how='all', inplace=True)
# print('删除之后的结果:\n', data)

# 2、填充法
# 可能造成 数据分布规律 发生变化,可能会对数据分析结果产生影响
# 如果填充不会对数据分布产生影响,或者不会对数据分析结果产生影响
# fillna
# 数值型数据---可以使用均值、中位数、众数来进行填充
# 非数值型数据--可以使用众数来进行填充
# 都可以使用数据的上下邻居来进行填充
# 使用众数 来填充商品ID这一列
# mode = data['商品ID'].mode()[0]
# print('mode:\n', mode)
# data['商品ID'].fillna(value=mode, inplace=True)
#
# # 使用上下邻居来填充 类别ID
# # method='pad' 或者'ffill' ---使用上邻居填充
# # method='bfill' 或者 'backfill' ---使用下邻居填充
# data.loc[:, "类别ID"].fillna(method='backfill', inplace=True)
#
#
# # 使用上邻居来填充门店编号
# data.loc[:, '门店编号'].fillna(method='pad', inplace=True)
#
# print('填充之后的结果:\n', data)
# 3、插值法
# 线性插值 ---拟合线性关系进行插值
# 多项式插值 ---拟合多项式关系进行插值
# -----常用多项式插值:拉格朗日多项式插值、牛顿多项式插值
# 样条插值 ---拟合样条关系进行插值
# from scipy.interpolate import spline  # 样条插值模块
# from scipy.interpolate import lagrange  # 拉格朗日多项式插值
# from scipy.interpolate import interp1d  # 线性插值
#
# x = np.array([1, 2, 3, 4, 5, 8, 9])
# y = np.array([3, 5, 7, 9, 11, 17, 19])  # y = 2x + 1
# z = np.array([2, 8, 18, 32, 50, 128, 162])  # z = 2 * x^2
#
# # 线性插值 ---拟合直线关系
# liner_1 = interp1d(x=x, y=y, kind='linear')  # [ 13.  15.]
# # kind = 'cubic'  # 理解为拟合曲线
# liner_2 = interp1d(x=x, y=z, kind='linear')  # [  76.  102.]
#
# print(liner_1([6, 7]))
# print(liner_2([6, 7]))
# print('*' * 100)
#
# # 拉格朗日多项式插值 --拟合拉格朗日多项式
# la1 = lagrange(x=x, w=y)  # [ 13.  15.]
# la2 = lagrange(x=x, w=z)  # [ 72.  98.]
# print(la1([6, 7]))
# print(la2([6, 7]))
# print('*' * 100)
#
# # 样条插值 --拟合样条
# print(spline(xk=x, yk=y, xnew=[6, 7]))  # [ 13.  15.]
# print(spline(xk=x, yk=z, xnew=[6, 7]))  # [ 72.  98.]

# 线性插值 对 线性数据表现较好,对非线性数据标表现不好
# 拉格朗日插值、样条插值 对线性数据表现较好,对非线性数据也表现较好 ---推荐

# 对于 * ? " " : 等特殊字符的缺失值??
# 1、将特殊字符替换为np.nan
data.replace("*", np.nan, inplace=True)
print('data:\n',data)
# 2、再进行删除、填充、插值

# np.nan 类型???----<class 'float'>
# print(type(np.nan))


04-异常值剔除

import pandas as pd


# 3sigma原则 ----99.73% [u-3a,u+3a]之间,认为超出这个范围的就是异常值
def three_sigma(data):
    """
    3sigma原则剔除异常值
    :param data: series类型
    :return: bool_index
    """
    # 上限
    up = data.mean() + 3 * data.std()
    # 下限
    low = data.mean() - 3 * data.std()

    #
    bool_index_1 = low <= data
    bool_index_2 = data <= up

    # 同时满足 小于 上限, 大于 下限
    bool_index = bool_index_1 & bool_index_2

    return bool_index


# 箱线图分析
# up = qu + 1.5iqr # (1,3)---1.5最常用的
# low = ql - 1.5iqr
# (low,up) ---正常的值,如果超过这个范围,认为是异常的
def box_analysis(data):
    """
    箱线图分析法提出异常值
    :param data: series
    :return: bool_index
    """
    # 确定上四分位数
    qu = data.quantile(q=0.75)
    # 确定下四分位数
    ql = data.quantile(q=0.25)
    # 确定分位数间距
    iqr = qu - ql
    # 确定上限
    up = qu + 1.5 * iqr
    # 确定下限
    low = ql - 1.5 * iqr

    #
    bool_index = (low <= data) & (data <= up)

    return bool_index


# 加载数据
data = pd.read_excel("./meal_order_detail.xlsx")
print('data:\n', data)
print('data 的列索引:\n', data.columns)
print('*' * 100)
# 验证
# 使用amounts 列进行验证 3sigma原则
# bool_index = three_sigma(data.loc[:, 'amounts'])
# 使用amounts 列进行验证 箱线图分析法
bool_index = box_analysis(data.loc[:, 'amounts'])
# 选出在正常范围内的值
data = data.loc[bool_index, :]
print('data:\n', data)

05-数据标准化处理

import pandas as pd
import numpy as np
# 标准化目的:去除数据量级的影响
# 离差标准化
# 将数据转化到[0,1]
# x = (x - min) / max -min
def min_max_sca(data):
    """
    离差标准化进行标准化数据
    :param data: df 或者series
    :return: 标准化之后的数据
    """
    data = (data - data.min()) / (data.max() - data.min())
    return data
# 标准差标准化
# 将数据转化为符合标准正态分布的数据---u=0,a=1
# x = (x - mean) / std
def stand_sca(data):
    """
    标准差标准化数据
    :param data: df或者series
    :return: 标准化之后的数据
    """
    data = (data - data.mean()) / data.std()
    return data
# 小数定标标准化
# 通过移动小数位数来进行标准化
#  x = x / 10^k
# k ---> log10(|x|.max()) --->向上取整
def desc_sca(data):
    """
    小数定标标准化
    :param data: df 或者series
    :return: 标准化之后的数据
    """
    # np.floor() --->向下取整
    data = data / (10 ** int(np.ceil(np.log10(data.abs().max()))))
    return data
# 验证
data = pd.read_excel("./meal_order_detail.xlsx")
print('data:\n', data)
print('data 的列索引:\n', data.columns)
print('*' * 100)
# 将 amounts 进行标准化
# data.loc[:, 'amounts'] = min_max_sca(data.loc[:, 'amounts'])
# data.loc[:, 'amounts'] = stand_sca(data.loc[:, 'amounts'])
data.loc[:, 'amounts'] = desc_sca(data.loc[:, 'amounts'])
print('标准化之后的结果:\n', data.loc[:, 'amounts'])
# print('均值:',data.loc[:, 'amounts'].mean())
# print('标准差:',data.loc[:, 'amounts'].std())
# 标准化之后的数据----没有真实具体解释意义,可以用于代替原来的数据参与计算
发布了128 篇原创文章 · 获赞 24 · 访问量 4255

猜你喜欢

转载自blog.csdn.net/return_min/article/details/103962945