IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> Python数据清洗 -> 正文阅读

[人工智能]Python数据清洗

应用目标

  • 手动准备异常数据集(使用新手学习最广泛地数据集iris.csv,自行添加异常值和空值)

  • 识别异常数据(方法一:3σ原则识别异常值 方法二:箱形图)

  • 填补缺失值/空白值(向上填补、向下填补、指定值填补)

  • 数据清洗结果保存至文件

思路分析

main函数

  • 为了更好地封装功能函数,采用统一的接口,功能函数返回相同的数据结构。

  • 相较于以往,可插入性更加完善,比如方便添加若干种异常值处理方法或数据填充方法。

  • main函数完成的是框架工作,提供统一接口,方便后期扩充功能函数。

def main():
    # 从文件读取数据
    path = "iris_mistake.csv"
    or_data = read_data(path)

    # 异常值处理 两种选择方式 返回异常值所在位置
    outlier_method = input('输入异常值处理方法(three_sigma/box_plot):')
    if outlier_method == "three_sigma":
        outlier = three_sigma(or_data)
    elif outlier_method == "box_plot":
        outlier = box_plot(or_data)

    # 将异常值置空
    nan_data = update_data_to_null(or_data, outlier)

    # 空值填补处理 三种选择方式 返回填补后的dataFrame
    fill_method = input('输入空值填补方法(fillup/filldown/value):')
    fill_data = fillna(nan_data,fill_method)

    # 写入文件
    new_path = "iris_" + outlier_method + "_" + fill_method + ".csv"
    write_csv(new_path,fill_data)

if __name__=="__main__":
    main()

异常值处理功能函数

3σ原则

  • 以列为单位进行循环处理(计算均值方差 -> 找到上下界 -> 返回异常值的index元组)
  • 不同的数据集,需要手动调整pass的列(iris数据集的最后一列Species 不需要参与计算)
def three_sigma(or_data):
    column_id = 0                   
    outlier = []                        # 存放异常值index
    for column_head in or_data.columns: # 按列遍历
        if column_head == 'Species':    # 最后一列不进行处理
            pass
        else:
            print(column_head)          # 计算总和、均值、方差
            column_data_sum = or_data[column_head].sum()
            column_data_mean = or_data[column_head].mean()
            column_data_std = or_data[column_head].std()
            print("总和:",end=' ')
            print(column_data_sum)
            print("均值:", end=' ')
            print(column_data_mean)
            print("方差:", end=' ')
            print(column_data_std)
            high = column_data_mean + 3 * column_data_std      # 最大界
            low = column_data_mean - 3* column_data_std        # 最小界

            for cell in or_data[column_head]:
                if cell > high or cell < low :
                    print("异常值:",end=' ')
                    print(cell)                 # 找到异常值的行号
                    row_id = or_data[(or_data[column_head]==cell)].index.tolist()
                    for i in row_id:            # 异常值行号与列号组成元组
                        cell_iloc = (i, column_id)
                    outlier.append(cell_iloc)   

        column_id = column_id + 1

    print(outlier)
    return outlier                               # 返回所有异常值的index

箱形图

  • 总体功能与上一种方法如出一辙,最大的不同点在于绘制箱形图,具体的参数设置已经在注释标明,更官方的plot资料参考其他优质博客。
def box_plot(or_data):
    column_id = 0
    outlier = []
    for column_head in or_data.columns:

        if column_head == 'Species':
            pass
        else:
            # 找到异常值
            iqr = or_data[column_head].quantile(0.75) - or_data[column_head].quantile(0.25)
            # 下阈值
            val_low = or_data[column_head].quantile(0.25) - iqr * 1.5
            # 上阈值
            val_up = or_data[column_head].quantile(0.75) + iqr * 1.5
            # 异常值

            print(column_head)
            print("IQR:", end=" ")
            print(iqr)
            print("下阈值:", end=" ")
            print(val_low)
            print("上阈值:", end=" ")
            print(val_up)

            for cell in or_data[column_head]:
                if cell > val_up or cell < val_low:
                    print("异常值:", end=' ')
                    print(cell)
                    row_id = or_data[(or_data[column_head] == cell)].index.tolist()
                    for i in row_id:
                        cell_iloc = (i, column_id)
                    outlier.append(cell_iloc)

        column_id = column_id + 1
    print(outlier)

    # 绘制图像
    show_data = or_data.iloc[:, 0:4]
    # print(show_data.head(10))

    fig, axes = plt.subplots(1, 4)
    color = dict(boxes='DarkGreen', whiskers='DarkOrange',
                 medians='DarkBlue', caps='Red')
    # boxes表示箱体,whisker表示触须线
    # medians表示中位数,caps表示最大与最小值界限

    show_data.plot(kind='box', ax=axes, subplots=True,
                   title='Different boxplots', color=color, sym='r+')
    # sym参数表示异常值标记的方式

    fig.subplots_adjust(wspace=1, hspace=1)  # 调整子图之间的间距
    fig.savefig('boxplot.png')

    # 返回异常值的index
    return outlier

异常值置空+ 空值填充功能函数

异常值置空

def update_data_to_null(or_data,outlier):
    for loc in outlier:                 # 从异常值处理函数get位置坐标 完成nan更新
        # print(loc[0])
        # print(loc[1])
        or_data.iloc[loc[0], loc[1]] = np.nan
        print(or_data.iloc[loc[0],loc[1]])

    return or_data                      # 返回更新后的数据集

空值填充

def fillna(nan_data,fill_method):
    if fill_method == "fillup":         # 向上填充
        return nan_data.fillna(method='ffill')
    elif fill_method == "filldown":     # 向下填充
        return nan_data.fillna(method='bfill')
    else:                               # 指定值填充
        somevalue = float(input("输入填充的数值:"))
        return nan_data.fillna(value=somevalue)

读写csv文件功能函数

读csv文件

def read_data(path):
    data = pd.read_csv(path)
    print(type(data))
    return data

写csv文件

def write_csv(new_path,fill_data):
    fill_data.to_csv(path_or_buf=new_path , header=True, index =False)

运行结果

采用不同的功能函数得到不同的结果

源码分享

此次源码暂且不提交github或gitee,关注博主,联系邮箱 Andel2001@163.com

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-12-01 17:42:25  更:2021-12-01 17:44:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 2:37:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码