【Python 数据分析】数据预处理:z-score 标准化、min-max 归一化、数据缺失值处理、数据重复处理

目录

  • 简述 / 前言
  • 1. z-score 标准化
  • 2. min-max 归一化
  • 3. 数据缺失值处理
  • 4. 数据重复处理

简述 / 前言

本篇文章分享数据分析中最重要的一个步骤:数据预处理。我们在做数据分析之前,都需要采集很多数据,这些数据可能是从官网下载的,可能是从各个大型数据库网站付费购买的,也有可能是通过爬虫获取数据的(爬取数据时要注意规范,要遵守每个网址给的爬虫君子协议,政府官网尽量别去爬,不能非法爬取公民身份资料等敏感信息!!!)。

【补充】什么是网址给的爬虫君子协议?

  • 进入你要爬取网址的根目录,在其后面加上:/robots.txt,就可以看到这个网址允许你爬取哪些分支下的数据,或者不允许你爬取哪些分支下的数据。
  1. 比如你要爬取知乎的信息,那么其君子协议看:https://www.zhihu.com/robots.txt,可以看到知乎不允许未授权用户爬取任何信息,即我们是不能去爬取知乎数据的。只允许了 Googlebot, Googlebot-Image, Baiduspider-news, Baiduspider, Baiduspider-render, Baiduspider-image, bingbot (截止于2024年1月16日只允许上述指定爬虫爬取数据) 爬取指定目录下的数据~
  2. 又比如看看 CSDN 平台的君子协议:https://www.csdn.net/robots.txt,它不允许任何人爬取的目录如下:
    • User-agent: *
    • Disallow: /scripts
    • Disallow: /public
    • Disallow: /css/
    • Disallow: /images/
    • Disallow: /content/
    • Disallow: /ui/
    • Disallow: /js/
    • Disallow: /scripts/
    • Disallow: /article_preview.html*
    • Disallow: /tag/
    • Disallow: /*?*
    • Disallow: /link/
    • Disallow: /tags/
    • Disallow: /news/
    • Disallow: /xuexi/

不论是从什么方式获取的数据,其数据内容或多或少会存在缺失值数据量纲跨度大(就是同一列数据中,有的数据只是个位数,但有的数据范围到了几十万的级别),所以在做数据分析前,数据预处理是必须要做的,哪怕你的数据可能都很正常(其实只有做了这一步才知道你获得的数据正不正常)。

那么本篇文章将分享最常用的两种数据处理方法:z-score 标准化min-max 归一化,以及数据缺失值处理数据重复处理

1. z-score 标准化

z-score 标准化是基于给定数据(data)的 均值(mean) 和 标准差(std) 进行数据标准化的,其计算公式为:
n e w D a t a = d a t a − m e a n s t d newData = \frac{data - mean}{std} newData=stddatamean

对应的 Python 代码示例:

import numpy as npdata = np.array([[ 1.1,  2, 3  ],[   9, 10, 11 ],[10.9,  5, 0.1]])
# 计算均值
mean = np.mean(data, axis=0)
# 计算标准差
std = np.std(data, axis=0)print(f"每一列的均值:{mean}\n")
print(f"每一列的标准差:{std}\n")
# 减去均值,除以标准差
newData = (data - mean) / std
print(f"z-score标准化:\n{newData}")# 查看z-score标准化后的每一列均值 和 标准差
print(f"z-score标准化后的每一列均值:{np.mean(newData, axis=0)}\n")
print(f"z-score标准化后的每一列标准差:{np.std(newData, axis=0)}\n")

输出:

每一列的均值:[7.         5.66666667 4.7       ]每一列的标准差:[4.24342629 3.29983165 4.60941066]z-score标准化:
[[-1.39038588 -1.1111678  -0.36881071][ 0.47131725  1.31319831  1.36676909][ 0.91906863 -0.20203051 -0.99795838]]z-score标准化后的每一列均值:[ 0.00000000e+00 -1.01770444e-16 -7.40148683e-17]z-score标准化后的每一列标准差:[1. 1. 1.]

经过z-score标准化后的数据均值都是0,标准差都是1,当然由于计算机计算精度问题,所以现在看到的均值并不都是0,不过也是非常接近于0了!

看看标准化后的数据是什么样的:

import numpy as np
import matplotlib.pyplot as pltnp.random.seed(2024)
data = np.random.rand(100, 2) * 10
x = data[:, 0]
y = data[:, 1]# 新建figure对象
plt.subplot(121)
plt.scatter(x, y, s=50, alpha=0.7, color='g')
# 设置标题
plt.title("原始数据", fontdict={'fontname': 'FangSong', 'fontsize': 'xx-large', 'fontweight': 'bold'})
plt.xlabel('x轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
plt.ylabel('y轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
plt.xlim(-5, 20)
plt.ylim(-5, 20)
plt.grid()# 计算均值
mean = np.mean(data, axis=0)
# 计算标准差
std = np.std(data, axis=0)
# 减去均值,除以标准差
newData = (data - mean) / std
x = newData[:, 0]
y = newData[:, 1]# 新建figure对象
plt.subplot(122)
plt.scatter(x, y, s=50, alpha=0.7, color='g')
# 设置标题
plt.title("标准化后的数据", fontdict={'fontname': 'FangSong', 'fontsize': 'xx-large', 'fontweight': 'bold'})
plt.xlabel('x轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
# plt.ylabel('y轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
plt.xlim(-5, 20)
plt.ylim(-5, 20)
plt.grid()
plt.show()

输出:
请添加图片描述

2. min-max 归一化

min-max 归一化是对给定数据进行线性变换,它是基于给定数据(data)的极大值(max_d)和极小值(min_d)进行数据归一化操作的,计算公式如下:

n e w D a t a = d a t a − m i n _ d m a x _ d − m i n _ d newData = \frac{data - min\_d}{max\_d - min\_d} newData=max_dmin_ddatamin_d

对应的 Python 代码示例:

import numpy as npdata = np.array([[ 1.1,  2, 3  ],[   9, 10, 11 ],[10.9,  5, 0.1]])
# 计算极大值
max_d = np.max(data, axis=0)
# 计算极小值
min_d = np.min(data, axis=0)print(f"每一列的极大值:{max_d}\n")
print(f"每一列的极小值:{min_d}\n")
# 减去极小值,除以 (极大值 - 极小值)
print(f"min-max标准化:\n{(data - min_d) / (max_d - min_d)}")

输出:

每一列的极大值:[10.9 10.  11. ]每一列的极小值:[1.1 2.  0.1]min-max标准化:
[[0.         0.         0.26605505][0.80612245 1.         1.        ][1.         0.375      0.        ]]

看看归一化的数据图像是什么样的:

import numpy as np
import matplotlib.pyplot as pltnp.random.seed(2024)
data = np.random.rand(100, 2) * 10
x = data[:, 0]
y = data[:, 1]# 新建figure对象
plt.subplot(131)
plt.scatter(x, y, s=50, alpha=0.7, color='g')
# 设置标题
plt.title("原始数据", fontdict={'fontname': 'FangSong', 'fontsize': 'xx-large', 'fontweight': 'bold'})
plt.xlabel('x轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
plt.ylabel('y轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
plt.xlim(-5, 20)
plt.ylim(-5, 20)
plt.grid()# 计算极大值
max_d = np.max(data, axis=0)
# 计算极小值
min_d = np.min(data, axis=0)
# 减去均值,除以标准差
newData = (data - min_d) / (max_d - min_d)
x = newData[:, 0]
y = newData[:, 1]# 新建figure对象
plt.subplot(132)
plt.scatter(x, y, s=50, alpha=0.7, color='g')
# 设置标题
plt.title("归一化后的数据", fontdict={'fontname': 'FangSong', 'fontsize': 'xx-large', 'fontweight': 'bold'})
plt.xlabel('x轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
# plt.ylabel('y轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
plt.xlim(-5, 20)
plt.ylim(-5, 20)
plt.grid()# 新建figure对象
plt.subplot(133)
plt.scatter(x, y, s=50, alpha=0.7, color='g')
# 设置标题
plt.title(f"归一化后的数据\n(放大版)", fontdict={'fontname': 'FangSong', 'fontsize': 'xx-large', 'fontweight': 'bold'})
plt.xlabel('x轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
# plt.ylabel('y轴', fontdict={'fontname': 'FangSong', 'fontsize': 20})
plt.xlim(-0.5, 1.5)
plt.ylim(-0.5, 1.5)
plt.grid()# wspace 控制子图列间距, hspace 控制子图横间距
plt.subplots_adjust(wspace=0.5, hspace=0)
plt.show()

输出:
请添加图片描述

可以看见所有数据都缩放到 [0, 1] 之间了~

3. 数据缺失值处理

现在要用到一个新的第三方库:pandas,这是数据分析中常用的库。

关键方法:.fillna(value, inplace=True),参数含义如下:

参数含义
value你要将缺失值替换成的值
inplace是否覆盖数据框(默认是:False,不覆盖,生成一个新的数据框)

自行创建一个文件:test.csv,数据如下:
在这里插入图片描述

示例:

import pandas as pddf = pd.read_csv("test.csv", encoding="utf-8")
print(df)
print()df['age'].fillna(20, inplace=True)  # 更新age列的NaN为20
df['score'].fillna(0, inplace=True)  # 更新score列的NaN为0
print(df)

输出:

   Unnamed: 0    name   age  score
0           0  senlin   NaN    NaN
1           1     Tom   NaN  100.0
2           2    Mary  18.0   60.0
3           2    Mary  18.0   60.0Unnamed: 0    name   age  score
0           0  senlin  20.0    0.0
1           1     Tom  20.0  100.0
2           2    Mary  18.0   60.0
3           2    Mary  18.0   60.0

4. 数据重复处理

关键方法:.drop_duplicates(keep=keep, inplace=True),各参数含义如下:

参数含义
keep保留第一个重复值还是最后一个重复值,可以选:first, last
inplace是否覆盖数据框(默认是:False,不覆盖,生成一个新的数据框)
  1. 示例(保留第一个重复值):

    import pandas as pddf = pd.read_csv("test.csv", encoding="utf-8")
    print(df)
    print()df.drop_duplicates(keep='first', inplace=True)
    print(df)
    

    输出:

       Unnamed: 0    name   age  score
    0           0  senlin   NaN    NaN
    1           1     Tom   NaN  100.0
    2           2    Mary  18.0   60.0
    3           2    Mary  18.0   60.0Unnamed: 0    name   age  score
    0           0  senlin   NaN    NaN
    1           1     Tom   NaN  100.0
    2           2    Mary  18.0   60.0
    
  2. 示例(保留最后一个重复值):

    import pandas as pddf = pd.read_csv("test.csv", encoding="utf-8")
    print(df)
    print()df.drop_duplicates(keep='last', inplace=True)
    print(df)
    

    输出:

       Unnamed: 0    name   age  score
    0           0  senlin   NaN    NaN
    1           1     Tom   NaN  100.0
    2           2    Mary  18.0   60.0
    3           2    Mary  18.0   60.0Unnamed: 0    name   age  score
    0           0  senlin   NaN    NaN
    1           1     Tom   NaN  100.0
    3           2    Mary  18.0   60.0
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/627309.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【docker-compose】【nginx】内网环境https配置

目录 1、openssl生成自签名证书和私钥2、nginx.conf配置ssl3、docker-compose挂载 1、openssl生成自签名证书和私钥 在部署服务器上,新建cert目录,执行以下指令,然后生成.crt和.key文件 openssl req -newkey rsa:2048 -nodes -keyout rsa_pri…

linux yum仓库

yum是基于rpm包构建的软件更新机制,能够自动解决软件包之间的依赖关系。 常用命令 查询 yum list [软件名] 显示可用的安装包,如果不加软件名则显示所有的可用包 yum info [软件名] 显示安装包的详细信息 如果不加软件名是显示所有包…

2024年【上海市安全员B证】考试试卷及上海市安全员B证复审模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 上海市安全员B证考试试卷根据新上海市安全员B证考试大纲要求,安全生产模拟考试一点通将上海市安全员B证模拟考试试题进行汇编,组成一套上海市安全员B证全真模拟考试试题,学员可通过…

海外短剧APP小程序开发 随心随意畅享大片

随着智能手机的普及和网络的高速发展,短剧APP已经成为当今热门的观影方式。作为一种全新的观影体验,海外短剧APP以其丰富多样的内容吸引了大量用户。本文将为您介绍海外短剧APP开发的相关知识和其所带来的优势,以及市场前景和发展趋势。 海外…

jsonschema,一个超强的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个超强的 Python 库 - jsonschema。 Github地址:https://github.com/python-jsonschema/jsonschema JSON(JavaScript Object Notation)是…

MySQL 多版本并发控制 MVCC

MVCC出现背景 事务的4个隔离级别以及对应的三种异常 读未提交(Read uncommitted) 读已提交(Read committed):脏读 可重复读(Repeatable read):不可重复读 串行化(Se…

.NET领域最硬核的gRPC 核心能力一把梭

前言,本文定位为.NET方向 grpc核心能力一把梭,全篇是姿势性和结论性的展示, 方便中高级程序员快速上手.NET Grpc。 有关grpc更深层次的前世今生、底层原理、困惑点释疑请听下回分解, 欢迎菜鸟老鸟们提出宝贵意见。 grpc宏观目标&…

跨平台进程/任务管理服务——Meproc的配置

配置 Meproc的配置非常简单,只有以下几个配置选项。 Conf [ip: 0.0.0.0,port: 8606,log_level: debug,log_dir: /tmp,web: [ip: 127.0.0.1,port: 8606,],bootstrap_cmd: , ];ip 是 Meproc 服务监听 HTTP 请求的地址。port 是Meproc服务监听HTTP请求的端口。log_l…

「Vue3面试系列」Vue 3.0中如果想实现一个 Modal组件应该怎么设计?

文章目录 一、组件设计二、需求分析三、实现流程目录结构组件内容实现 API 形式事件处理其他完善 一、组件设计 组件就是把图形、非图形的各种逻辑均抽象为一个统一的概念(组件)来实现开发的模式 现在有一个场景,点击新增与编辑都弹框出来进…

51单片机学习总结(自学)

1、模块化编程 c语言模块化编程实现思路设计代码 具体的程序实现代码如下所示 1:程序的头文件 2:程序的函数文件 3:程序的主文件控制函数的实现 持续更新中......

用el-image-viewer实现全局预览图片

背景 在后台管理系统中,一些预览图片的场景,通常都是使用 el-image-viewer 去实现,但是如果多个地方都需要预览图片,又要重复的去写 el-image-viewer 以及一些重复的和预览相关的代码。 可以把预览图片的组件放在根文件&#x…

MyTinySTL 简单分析(一)--iterator.h

MyTinySTL 简单分析 目前在学习STL,看到一个开源的项目MyTinySTL,非常不错。想着照着这个代码自己敲一遍应该也能有些进步。然后就开始了学习过程。 首先分析的是vector 以下是由vector.h关联的所有头文件 其中有几个文件是重复的,例如type…

智能光栅光片显微成像技术的LabVIEW解决方案

智能光栅光片显微成像技术的LabVIEW解决方案 在生物医学研究中,高效的成像技术对于捕捉细胞内罕见和复杂事件至关重要。智能光栅光片显微技术(smartLLSM)的出现,代表了LabVIEW软件在高端成像领域的革命性应用,这项技术…

solr 远程命令执行漏洞复现 (CVE-2019-17558)

solr 远程命令执行漏洞复现 (CVE-2019-17558) ‍ 名称: solr 远程命令执行 (CVE-2019-17558) 描述: Apache Velocity是一个基于Java的模板引擎,它提供了一个模板语言去引用由Java代码定义的对象。Velocity是Apache基金会旗下的一个开源软件项目,旨在确…

Qt 快捷键设置

以 “在编辑时自动补齐”快捷键 为例: 位置:红色 搜索快捷键:蓝色 修改方式:绿色 快捷键:黄色

22k+star炒鸡好用的开源的网盘神器FileBrowser Docker自建个人网盘神器教程

目录 简介 1.拉取镜像 2.创建并启动容器 2.1创建目录 2.2启初始化一个容器用于导出配置文件和数据库,只挂载数据目录 2.3先将数据库文件和配置文件复制出来 2.4停止容器并删除容器 2.5创建完整的容器 3.愉快地使用 3.1示例: 3.2图片预览 3.3json…

基于Java SSM框架实现学生综合考评管理系统项目【项目源码+论文说明】

基于java的SSM框架实现学生学生综合考评管理系统演示 摘要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 学生综合考评管理系统,主要的模块包括查看;管理员;个…

鸿蒙HarmonyOS实战-工具安装和Helloworld案例

🚀前言 HarmonyOS是华为自主开发的操作系统,它在2020年9月正式发布。它最初被称为鸿蒙OS,后来更名为HarmonyOS。HarmonyOS旨在提供一种可在各种设备上无缝运行的统一操作系统,包括智能手机、平板电脑、智能穿戴设备、智能音箱、车…

“核弹级“攻击队视角下的监管痛点解决方案

痛点分析及解决方案 一、辖区企业资产分散且不透明 - 传统的监管体系中,政府监管单位往往面临着辖区企业资产分散且不透明的问题。 - 企业无法梳理自身资产,上报的资产台账无法涵盖全部自身资产 - 监管单位精力有限,无法保证辖区企业资产台账…

工信部颁发的人工智能证书《自然语言与语音处理设计开发工程师》证书到手啦!

工信部颁发的人工智能证书《自然语言与语音处理设计开发工程师》证书拿到手啦! 近期正在报考的工信部颁发的人工智能证书还有: 《计算机视觉处理设计开发工程师》中级 2024年1月24日至28日-北京 《自然语言与语音处理设计开发工程师》中级 第二期 20…