预处理代码

news2025/2/24 10:05:17

一、缺失值处理

  • 删除缺失值:
data1=data.dropna()#丢弃缺失值 
#dropna()删除缺失值所在行(axis=0)或列(axis=1),默认为 axis=0
  • 补全
示例数据:
import pandas as pd
import numpy as np

data = pd.DataFrame({
    'name': ['Bob', 'Mary', 'Peter', np.nan, 'Lucy'],
    'score': [99, 100, np.nan, 91, 95],
    'class': ['class1', 'class2', 'class1', 'class2', np.nan],
    'sex': ['male', 'fmale', 'male', 'male', 'fmale'],
    'age': [23, 25, 20, 19, 24]
})

(1)均值填充

  • 适用场景:数据整体极值差异不大时
  • 举例:对成年男性身高的缺失值进行填充
#对data数据中的score进行均值填充
data['score'].fillna(data['score'].mean())

# 结果如下
0     99.00
1    100.00
2     96.25
3     91.00
4     95.00

(2)中位数填充

  • 适用场景:数据整体极值差异较大时
  • 举例:对人均收入进行填充(数据中含有高收入人群:如马总)
    #对data数据中的score进行中位数填充
    data['score'].fillna(data['score'].median())
    
    # 结果如下
    0     99.0
    1    100.0
    2     97.0
    3     91.0
    4     95.0
    
(3)众数填充
  • 适用数据类型:字符类型|没有大小关系的数值类型数据
  • 适用场景:大多数情况下
  • 举例:对城市信息的缺失进行填充/对工人车间编号进行填充
  • 代码示例:对data数据中的class进行众数填充(注意:众数填充时要通过索引0进行取值,一组数据的众数可能有多个,索引为0的数据一定会存在)
    data['class'].fillna(data['class'].mode()[0])
    
    # 结果如下
    0    class1
    1    class2
    2    class1
    3    class2
    4    class1
    
(4)前后数据填充
  • 适用场景:数据行与行之间具有前后关系时
  • 举例:学年成绩排行中的某同学某科目成绩丢失
    #代码示例:对data数据中的score进行前后数据填充
    
    # 前文填充
    data['score'].fillna(method='pad')
    # 后文填充
    data['score'].fillna(method='bfill')
    
    # 前文填充结果
    0     99.0
    1    100.0
    2    100.0
    3     91.0
    4     95.0
    # 后文填充结果
    0     99.0
    1    100.0
    2     91.0
    3     91.0
    4     95.0
    
    

    (5)自定义数据填充

  • 适用场景:业务规定外的数据
  • 举例:某调查问卷对婚后幸福程度进行调查,到那时很多人是未婚,可以自定义内容表示未婚人群
    #代码示例:对data数据中的name进行自定义数据填充
    data['name'].fillna('no_name')
    
    # 结果如下
    0        Bob
    1       Mary
    2      Peter
    3    no_name
    4       Lucy
    
    

    (6)Pandas插值填充

  • 适用场景:数据列的含义较为复杂,需要更精确的填充方法时
    举例:对所有带有nan的数值列dataframe进行填充
    说明:pandas中进行空值填充的方法为interpolate(),该方法的本质是使用各种数学(统计学)中的插值方法进行填充,其中包含最近邻插值法、阶梯插值、线性插值、B样条曲线插值等多种方法。

    data['score'].interpolate()
    
    # 结果如下
    0     99.0
    1    100.0
    2     95.5
    3     91.0
    4     95.0
    

    (7)建模填充

  • 适用场景:具有多种数据维度的场景
  • 说明:可以选择不同的回归|分类模型对数据进行填充
  • 注意:下面的例子中不考虑具体场景,只是用于举例
  • 数值类型数据填充代码示例(线性回归):
  • from sklearn.linear_model import LinearRegression
    
    # 获取数据
    data_train = data.iloc[[0, 1, 3]]
    
    data_train_x = data_train[['age']]
    data_train_y = data_train['score']
    # 使用线性回归进行拟合
    clf = LinearRegression()
    clf.fit(data_train_x, data_train_y)
    # 使用预测结果进行填充
    data['score'].iloc[2] = clf.predict(pd.DataFrame(data[['age']].iloc[2]))
    
  • 字符类型数据填充代码示例(决策树):
from sklearn.tree import DecisionTreeClassifier

# 获取数据
data_train = data.iloc[[0, 1, 3]]

data_train_x = data_train[['age']]
data_train_y = data_train['class']
# 使用决策树进行拟合
clf = DecisionTreeClassifier()
clf.fit(data_train_x, data_train_y)
# 使用分类结果进行填充
data['class'].iloc[4] = clf.predict(pd.DataFrame(data[['age']].iloc[4]))[0]

三、异常值检测与处理

异常值检测

1、3∂原则

要求:数据服从或近似服从正态分布

在3∂原则下,异常值如超过3倍标准差,那么可以将其视为异常值。正负3∂的概率是99.7%,那么距离平均值3∂之外的值出现的概率为P(|x-u| > 3∂) <= 0.003,属于极个别的小概率事件。如果数据不服从正态分布,也可以用远离平均值的多少倍标准差来描述。

需要注意的是,3σ方法假设数据服从正态分布,因此在应用时要确保数据的分布近似于正态分布。如果数据不满足这个假设,其他异常值检测方法可能更合适。此外,3σ方法可能对极端值(outliers)不够敏感,因此在某些情况下可能会漏检一些异常值。因此,在实际应用中,通常需要结合其他方法进行异常值检测,以提高检测的准确性。

首先检验数据是否正态分布

# pvalue大于0.05则认为数据呈正态分布
from scipy import stats
mean = df['age'].mean()
std = df['age'].std()
print(stats.kstest(df['age'],'norm',(mean,std)))

异常值处理

# 选取小于3个标准差的数据
data = data[np.abs(df['age']- mean) <= 3*std]

如果数据不符合正态分布,也可以用远离平均值的多少倍标准差来筛选异常值。具体倍数看数据情况和业务需求

# 定义远离平均值4倍标准差为异常值
a = mean + std*4
b = mean - std*4
data = data[(data['Age'] <= a) & (data['Age'] >= b)]

或者定义为函数:

def three_sigma(s):
    mu, std = np.mean(s), np.std(s)
    lower, upper = mu-3*std, mu+3*std
    return lower, upper

2、箱型图

利用箱型图的四分位距(IQR)对异常值进行检测,四分位距(IQR)就是上四分位与下四分位的差值。而我们通过IQR的1.5倍为标准,规定:超过上四分位+1.5倍IQR距离,或者下四分位-1.5倍IQR距离的点为异常值。

numpypercentile方法。

data = np.array([2, 2, 3, 4, 5, 6, 7, 8, 1000])

Q1 = np.percentile(data, 25)
Q3 = np.percentile(data, 75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

outliers = np.where((data < lower_bound) | (data > upper_bound))

print("异常值的索引:", outliers)
也可以使用seaborn的可视化方法 boxplot来实现:
f,ax=plt.subplots(figsize=(10,8))
sns.boxplot(y='length',data=df,ax=ax)
plt.show()

#或者用pandas自身的plot方法
data['Age'].plot(kind = 'box')

3、标准差的方法(Z-Score)

  • 适用场景:用于检测连续型数据的异常值,数据应该服从正态分布或近似正态分布。
  • Z-score为标准分数,测量数据点和平均值的距离,若A与平均值相差2个标准差,Z-score为2。当把Z-score=3作为阈值去剔除异常点时,便相当于3sigma。
  • import numpy as np
    from scipy import stats
    
    data = np.array([2, 2, 3, 4, 5, 6, 7, 8, 1000])
    
    z_scores = np.abs(stats.zscore(data))
    threshold = 3
    outliers = np.where(z_scores > threshold)
    
    print("异常值的索引:", outliers)
    

Smoothed Z-Score

通过计算数据点与其周围数据点的标准差来识别异常值,从而将数据平滑化。计算过程如下:

  1. 计算滑动窗口内的均值和标准差: 首先,你需要选择一个滑动窗口大小,通常是一个时间窗口(例如,10天)。然后,对于每个数据点,计算在该滑动窗口内的均值(mean)和标准差(standard deviation)。

  2. 计算 Z-Score: 对于每个数据点,计算其与滑动窗口内均值的差值,然后除以滑动窗口内的标准差,得到 Z-Score。

  3. 平滑 Z-Score: 对计算得到的 Z-Score 序列应用一种平滑技术,例如指数移动平均(Exponential Moving Average,EMA)或简单移动平均(Simple Moving Average,SMA),以减少噪音和平滑数据。

  4. 设定阈值: 最后,根据平滑后的 Z-Score,你可以设定一个阈值来识别异常值。如果平滑后的 Z-Score 超过或低于阈值,那么该数据点就被认为是异常值。

对于时间序列数据和需要考虑噪音的情况,Smoothed Z-Score 可能更适合,而对于符合正态分布假设的数据集,Z-Score 通常足够用来检测异常值。

4、基于密度的方法(DBSCAN)

  • 适用场景:适用于数据集中包含群集的情况,可以找出离群的数据点。
from sklearn.cluster import DBSCAN
import numpy as np

data = np.array([[2], [2], [3], [4], [5], [6], [7], [8], [1000]])

dbscan = DBSCAN(eps=0.5, min_samples=2)
labels = dbscan.fit_predict(data)

outliers = np.where(labels == -1)

print("离群值的索引:", outliers)

5、Isolation Forest(孤立森林)

  • 适用场景:适用于高维数据和数据中包含多种类型的异常值。
from sklearn.ensemble import IsolationForest
import numpy as np

data = np.array([[2], [2], [3], [4], [5], [6], [7], [8], [1000]])

isolation_forest = IsolationForest(contamination=0.05)
labels = isolation_forest.fit_predict(data)

outliers = np.where(labels == -1)

print("离群值的索引:", outliers)

常值处理方法

  • 删除含有异常值的记录:直接将含有异常值的记录删除;
  • 视为缺失值:将异常值视为缺失值,利用缺失值处理的方法进行处理;
  • 平均值修正:可用前后两个观测值的平均值修正该异常值;
  • 不处理:直接在具有异常值的数据集上进行数据挖掘;

标准化

1、Smoothed z-score识别
相关性分析
PCA降维
ARIMA模型
随机森林

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

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

相关文章

【python爬虫】—星巴克产品

文章目录 需求爬取星巴克产品以及图片&#xff0c;星巴克菜单 python爬虫爬取结果 需求 爬取星巴克产品以及图片&#xff0c;星巴克菜单 网页分析&#xff1a; 首先&#xff0c;需要分析星巴克官方网站的结构&#xff0c;了解菜单栏的位置、布局以及菜单项的标签或类名等信息…

计算最大回撤

计算最大回撤 1. 累积计算统计特征函数 PANDAS库中累积计算统计特征函数&#xff1a; 1、CUMSUM() 依次给出前1&#xff0c;2&#xff0c;…&#xff0c;n个数的和 2、CUMPROD() 依次给出前1&#xff0c;2&#xff0c;…&#xff0c;n个数的积 3、CUMMAX() 依次给出前1&#…

腾讯云16核服务器配置大全_16核CPU型号性能测评

腾讯云16核CPU服务器有哪些配置可以选择&#xff1f;可以选择标准型S6、标准型SA3、计算型C6或标准型S5等&#xff0c;目前标准型S5云服务器有优惠活动&#xff0c;性价比高&#xff0c;计算型C6云服务器16核性能更高&#xff0c;轻量16核32G28M带宽优惠价3468元15个月&#xf…

6.8-SpringIoC之循环依赖底层源码解析

解决靠&#xff0c;三级缓存 创建Map&#xff0c;存不完整的Bean 存在问题&#xff1a;属性存在但没有值

Redis——Java客户端配置

概要 由于Redis服务器在官网公开了RESP协议&#xff0c;因此第三方可以通过这个协议来实现和Redis服务器通信的客户端程序&#xff0c;而具体的通信逻辑也不需要我们去实现&#xff0c;只需要导入大佬的库即可 jedis就是封装了RESP协议&#xff0c;提供了一组api供我们使用 …

Python进阶学习----一闭三器

目录 ​编辑 前言 一.三器 1. 迭代器&#xff08;Iterator&#xff09; 1.1 什么是可迭代对象 1.2什么是迭代器 1.3案例演示&#xff1a; 以下是一个简单的迭代器示例&#xff0c;遍历一个列表并打印每个元素&#xff1a; 1.4迭代器总结 2. 生成器&#xff08;Generat…

自动化测试的类型​以及自动化测试的几个误区!

有三种主要类型的自动化测试。 一、自动化单元测试​编辑 自动化单元测试在代码级别上进行测试。bug是在开发人 员编写的函数、方法和例程中识别出来的。 一些公司要求开发人员自己进行单元测试&#xff0c;而有些公司则雇用专门的测试自动化资源。这些资源可以访问源代码&a…

公开研讨会|智能制造中生产管理挑战与解决方案(9月29日)

随着新能源行业的规模化发展&#xff0c;企业增效降本成为迫切需求。生产制造能力成为关键因素&#xff0c;其发展必将是在大规模生产的前提下&#xff0c;追寻极简制造、极限制造以及智能制造。然而在这个发展过程中&#xff0c;企业依旧面临着诸多挑战&#xff1a; 产品设计…

spring boot是如何加载Tomcat的

目录 spring boot是如何加载Tomcat的1. 方法入口2. SpringContext上下文3. 创建web容器4. 启动web容器结语 spring boot是如何加载Tomcat的 大家都用过spring boot&#xff0c;都知道他启动的时候内置一个Tomcat&#xff0c;但是他是怎么来的&#xff0c;你们知道吗 这篇博客…

cudann官网上不见了,找不到了安装CUDA和CUDANN时,发现CUDANN不见了,官网甚至找不到一丝它的信息,公告也没有

我在习惯性的安装CUDA和CUDANN时&#xff0c;发现CUDANN不见了&#xff0c;官网甚至找不到一丝它的信息&#xff0c;公告也没有&#xff0c;看看吐槽 说实话最开始的CUDANN确实比较恼火&#xff0c;要下载下来拷贝过去 现在只需要直接安装cuda&#xff0c;就可以安装成功了 C…

XJAR 混淆加密

一&#xff1a;手动加密 pom依赖 <repositories><repository><id>jitpack.io</id><url>https://jitpack.io</url></repository> </repositories> <dependencies><dependency><groupId>com.github.core-l…

2023年CSP-J 普及组第一轮题目和答案详解

家人们首战报捷&#xff01;&#xff01;&#xff01;&#xff01; 才教了一个月的学生&#xff0c;赛前一周才报名CSP-J都没提前安排初赛内容临时周内加了两节课&#xff0c; 总共初赛也就上了3次课准备了不到一周半&#xff0c;压线进了复赛&#xff0c; 不得不说学生基础还不…

Python是人工智能的最佳选择吗?看看它的优势和局限

人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;是当今科技领域最热门的话题之一&#xff0c;它涉及到计算机科学、数学、统计学、心理学等多个学科的交叉和融合。人工智能的目标是让机器能够模拟和超越人类的智能&#xff0c;实现自主学习、推理、决策…

Kotlin协程CoroutineScope异步async取消cancel等待await的任务

Kotlin协程CoroutineScope异步async取消cancel等待await的任务 import kotlinx.coroutines.*fun main(args: Array<String>) {runBlocking {val mScope CoroutineScope(Dispatchers.IO).async {println("->")delay(999999)println("<-")"…

施耐德电气携中国信通院和中国联通共同发布白皮书,共探5G+PLC深度融合应用

2023年9月20日——全球能源管理和自动化领域的数字化转型专家施耐德电气在第23届中国国际工业博览会首日的9月19日&#xff0c;与中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;及中国联合网络通信集团有限公司&#xff08;以下简称“中国联通”&#xff0…

配置 iSCSI 服务并实现客户端自动挂载块设备

文章目录 前言1. iSCSI 简介2. iSCSI Server 端配置2.1. 添加磁盘2.2. 安装 targetcli 软件包2.3. 创建块设备2.4. 创建 Target2.5. 创建 LUN2.6. 创建 ACL2.7. 配置门户创建监听2.8. 查看全部配置信息并保存退出2.9. 启用 Target 服务 3. iSCSI Client 端配置3.1. 安装 iscsi-…

前端框架vBean admin

文章目录 引言I 数据库表设计1.1 用户表1.2 角色表1.3 菜单表II 接口引言 文档:https://doc.vvbin.cn/guide/introduction.html http://doc.vvbin.cn 仓库:https://github.com/vbenjs/vue-vben-admin git clone https://github.com/vbenjs/vue-vben-admin-doc 在线体验demo:…

台积电没有想到,当初拒绝的中国芯片企业,如今反过来抢夺市场了,后悔莫及...

台积电二季度的营收已经出现下滑&#xff0c;本来它希望四季度在以往苹果销售旺季的支持下再度推高收入&#xff0c;然而如今中国手机企业自研的国产5G芯片正在反过来抢占市场&#xff0c;台积电四季度的收入恐怕也将下降。 苹果的销售旺季为每年的四季度&#xff0c;不过此时恰…

通过已有虚拟机快照创建虚拟机

我们在搭建redis、k8s等集群的时候&#xff0c;需要创建多台虚拟机&#xff0c;而且这几台虚拟机的配置基本上是一样的&#xff0c;这种情况下我们可以先创建一台虚拟机&#xff0c;安装需要的应用后导出快照&#xff0c;然后通过快照生成其他的虚拟机 1、生成快照 2、通过快照…

用小程序,轻松识别纸质表格并转换成Excel表格,解放双手

来百度APP 职场小伙伴们&#xff0c;有没有遇到过将纸质表格转化为Excel表格的任务&#xff1f;如果你没有经验&#xff0c;手工处理不仅效率低&#xff0c;而且容易出错。这真是一个费时费力的任务呀&#xff01;但别担心&#xff0c;现在我们有更好的解决方案——百度小程序…