python数据分析与挖掘实战 -第四章数据预处理

2023-11-19

数据清洗

目的:删除原始数据集中的无关数据、重复数据、平滑噪声数据、筛选掉与挖掘主题无关的数据、处理缺失值、异常值等

缺失值处理方法:删除记录、数据插补和不处理

拉格朗日插值法:对于平面上已知的N个点(无两点在一条直线上)可以找到一个N-1次多项式y=a0+a1x+…+an-1x^n-1,使此多项式曲线过这n个点

代码实现:

import pandas as pd  
from scipy.interpolate import lagrange

inputfile = '../data/catering_sale.xls'  # 销量数据路径
outputfile = '../tmp/sales.xls'  # 输出数据路径

data = pd.read_excel(inputfile)  # 读入数据
row_indexs = (data[u'销量'] < 400) | (data[u'销量'] > 5000) #异常值
data.loc[row_indexs, u'销量'] = None  # 过滤异常值,将其变为空值 loc为Selection by Label函数,即为按标签取数据 index为row_index 销量列的数据


# 自定义列向量插值函数
# s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5
def ployinterp_column(s, n, k=5):
    y = s.reindex(list(range(n - k, n)) + list(range(n + 1, n + 1 + k)))  # reindex使它符合新的索引,如果索引的值不存在就填入空值,取前五和后五个值来进行插值
    y = y[y.notnull()]  # 剔除空值
    return lagrange(y.index, list(y))(n)  # scipy.interpolate.lagrange(x, y),最后的括号就是我们要插值的n


# 逐个元素判断是否需要插值
for i in data.columns:
    for j in range(len(data)):
        if (data[i].isnull())[j]:  # 如果data中i列的第j个值为null,只有if[True][j]程序才去判断j,False则忽略
            data[i, j] = ployinterp_column(data[i], j)

data.to_excel(outputfile)  # 输出结果,写入文件

输出:

在这里插入图片描述
没有插入空白处,还产生了很多列同样的数据?日期也没正确显示 日后再改

源代码为

data[u’销量’] [(data(u’销量’) < 400) | (data(u’销量’) > 5000)] = None

报错 ‘DataFrame’ object is not callable 改成上面的代码可以正常运行,出现此报错一般是变量名重复。相当于把(data(u’销量’) < 400) 也看作data[u’销量’] ?

异常值处理:

处理方法:删除含有异常值的记录、视为缺失值、平均值修正、不处理

数据集成:

目的:将多个数据源合并存放在一个一致的数据存储中的过程

在数据集成时,来自多个数据源的现实世界实体的表达形式是不一样的,有可能不匹配,要考虑实体识别问题和属性冗余问题,从而将源数据在最底层上加以转换、提炼和集成。

实体识别:
任务是统一不同源数据的矛盾之处

  • 同名异义
  • 异名同义
  • 单位不统一

冗余属性识别:

  • 同一属性多次出现
  • 同一属性命名不一致导致重复

数据变换

目的:对数据进行规范化处理,将数据转换为“适当的”形式,以适用于挖掘任务及算法的需要。

简单函数变换:
常用来将不具有正态分布的数据变换成具有正态分布的数据

规范化:

  • 最大-最小规范化:[min,max]
  • 零-均值规范化:经过处理的数据的均值为0,标准差为1
  • 小数定标规范化:将属性值映射到[-1,1]

跳过代码 代入公式即可得到

连续属性离散化:

  1. 等宽法:将属性的值域分成具有相同宽度的区间,区间的个数由数据本身的特点决定,或者由用户指定。
  2. 等频法:将相同数量的记录放入每个区间
  3. 基于聚类分析的方法:一维聚类方法包括两个步骤,首先将连续属性的值用聚类算法进行聚类,然后再将聚类得到的簇进行处理,合并到一个簇的连续属性值并做同一标记。需要用户指定簇的个数,从而决定产生的区间数
    KMeans算法:
    1)选取K个点做为初始聚集的簇心(也可选择非样本点);
    2) 分别计算每个样本点到 K个簇核心的距离(这里的距离一般取欧氏距离或余弦距离),找到离该点最近的簇核心,将它归属到对应的簇;
    3) 所有点都归属到簇之后, M个点就分为了 K个簇。之后重新计算每个簇的重心(平均距离中心,将其定为新的“簇核心”;
    4) 反复迭代 2 - 3 步骤,直到达到某个中止条件。

以上三种离散方法代码实现:

参考

https://blog.csdn.net/YUBANGSHUANGYUER/article/details/103981481?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160310149819725271758589%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=160310149819725271758589&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v28-1-103981481.pc_first_rank_v2_rank_v28&utm_term=python%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E4%B8%8E%E6%8C%96%E6%8E%98%E5%AE%9E%E6%88%98+4-3&spm=1018.2118.3001.4187

代码顺利运行:

#-*- coding: utf-8 -*-
#数据规范化
import pandas as pd
 
datafile = '../data/discretization_data.xls' #参数初始化
data = pd.read_excel(datafile) #读取数据
data = data[u'肝气郁结证型系数'].copy()
k = 4
 
d1 = pd.cut(data, k, labels = range(k)) #等宽离散化,各个类比依次命名为0,1,2,3
 
#等频率离散化
w = [1.0*i/k for i in range(k+1)] #列表解析 将1.0*i/k 放入w列表 即为w=[0.0 0.25 0.5 0.75 1.0]
w = data.describe(percentiles = w)[4:4+k+1] #前面是取几个分位数的值作为不等长列表,[4:4+k+1]没懂代表什么意思
w[0] = w[0]*(1-1e-10) #这个也没懂

#w是区间 可以自己指定  w=[0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1]
#d2=pd.qcut(data,4,labels = range(k)) 如果是分成4个区间,可以使用qcut函数,4表示按照4分位数进行切割
d2 = pd.cut(data, w, labels = range(k)) #将data数组分成w个,名字为range(k)
 
from sklearn.cluster import KMeans #采用KMeans算法
kmodel = KMeans(n_clusters = k, n_jobs = 4) #建立模型选取4个点为初始点,n_jobs是并行数,一般等于CPU数较好
kmodel.fit(data.values.reshape((len(data), 1))) #训练模型.fit()求得训练集X的均值,方差,最大值,最小值,这些训练集X固有的属性。
c = pd.DataFrame(kmodel.cluster_centers_).sort_values(0) #输出聚类中心,并且排序(默认是随机序的)
w = c.rolling(2).mean().iloc[1:] #相邻两项求中点,作为边界点.python中切片不包括偏移值,iloc前闭后开 切片1行的数据
w = [0] + list(w[0]) + [data.max()] #把首末边界点加上 第0行和最大值
d3 = pd.cut(data, w, labels = range(k)) #离散成w区间,名字为range(k)
 
def cluster_plot(d, k): #自定义作图函数来显示聚类结果
  import matplotlib.pyplot as plt
  plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
  plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
  
  plt.figure(figsize = (8, 3)) #图像大小
  for j in range(0, k):
    plt.plot(data[d==j], [j for i in d[d==j]], 'o') #x=data[d==j],
  
  plt.ylim(-0.5, k-0.5)
  return plt
 
cluster_plot(d1, k).show()
 
cluster_plot(d2, k).show()
cluster_plot(d3, k).show()

小波变换:
具有多分辨率的特点,在时域和频域都具有表征信号局部特征的能力,通过伸缩和平移等运算过程对信号进行多尺度聚焦分析,提供了一种非平稳信号的时频分析手段,可以由粗及细地逐步观察信号,从中提取有用信号。

数据规约:

目的:产生更小但保持原数据完整性的新数据集,在规约后的数据集上分析和挖掘更有效率

属性规约:
通过属性合并来创建新属性维数或者直接通过删除不相关的属性来减少数据维数。

常用方法:

  • 合并属性
  • 逐步向前选择:从空属性集开始,每次从原来属性集合中选择一个当前最优的属性添加到当前属性于集中
  • 逐步向后删除:从全属性集开始,每次从属性集中选择一个最差的属性删除
  • 决策树归纳:利用决策树的归纳法对初始数据进行分类
  • 主成分分析:用较少的变量取解释原始数据中的大部分变量,即将许多相关性很高的变量转化成彼此相互独立或不相关的变量
import pandas as pd

#参数初始化
inputfile = '../data/principal_component.xls'
outputfile = '../tmp/dimention_reducted.xls' #降维后的数据

data = pd.read_excel(inputfile, header = None) #读入数据

from sklearn.decomposition import PCA

pca = PCA()
pca.fit(data)
pca.components_ #返回模型的各个特征向量
#降维
#low_d = pca.transform(data)
pca.explained_variance_ratio_ #返回各个成分各自的方差百分比

主成分分析的函数:
sklearn.decomposition.PCA(n_components = None, copy = True, whiten = False)

n_components:PCA算法中所要保留的主成分个数n,也即保留下来的特征个数n,缺省默认为None,所有成分被保留,赋值为Int。

copy:将原始数据复制一份

whiten:白化,使得每个特征具有相同的方差

特征值对应的特征向量就是理想中想取得正确的坐标轴,而特征值就等于数据在旋转之后的坐标上对应维度上的方差。

通常经过特征向量变换下的数据被称为变量的主成分,当前m个主成分累计的方差贡献率达到一个较高的百分数(如85%以上)的话,就保留着这m个主成分的数据。实现了对数据进行降维的目的。

从上面的结果可以得到特征方程有7个特征根

数值规约:

目的通过选择替代的、较小的数据来减少数据量,包括有参数方法和无参数方法两类。

有参数方法:使用模型来评估数据,只需存放参数,而不需要存放实际数据

  • 回归
  • 对数线性模型

无参数方法:需要存放实际数据

  • 直方图
  • 聚类
  • 抽样
  • 参数回归
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python数据分析与挖掘实战 -第四章数据预处理 的相关文章

随机推荐

  • Python3中__call__方法介绍

    如果Python3类中有 call 方法 那么此类实例的行为类似于函数并且可以像函数一样被调用 当实例作为函数被调用时 如果定义了此方法 则x arg1 arg2 是x call arg1 arg2 的简写 为了将一个类实例当作函数调用 我
  • 如何实现一个分布锁?

    基本概念 为何需要分布式锁 传统环境中的情况 在程序开发过程中不得不考虑的就是并发问题 在java中对于同一个jvm而言 jdk已经提供了lock和同步等 但是在分布式情况下 往往存在多个进程对一些资源产生竞争关系 而这些进程往往在不同的机
  • 七. go 常见数据结构实现原理之 反射

    目录 一 golang 是如何实现反射的 如何比较两个对象完全相等 一 golang 是如何实现反射的 参考博客Go 语言问题集 Go Questions Go 语言在 reflect 包里定义了各种类型 实现了反射的各种函数 通过它们可以
  • 【Git系列】Git配置SSH免密登录

    Git配置SSH免密登录 1 设置用户名和邮箱 2 生成密钥 3 远程仓库配置密钥 2 免密登录 其他系列 Git最详细的体系化教程 在以上push操作过程中 我们第一次push时 是需要进行录入用户名和密码的 比较麻烦 而且我们使用的是h
  • 刷脸支付技术更多的是想要助力数字化运营

    刷脸支付是在原有的收银系统基础上增加一种收款方式 不影响收银系统 收银更有效 支付更便捷 体验感更好 节省时间成本 资金更安全 支付宝 微信官方为推广刷脸支付 两大官方投入巨额资金普及刷脸支付 日常生活中可避免忘记带手机 手机没电 通话中
  • C++17中utf-8 character literal的使用

    一个形如42的值被称作字面值常量 literal 这样的值一望而知 每个字面值常量都对应一种数据类型 字面值常量的形式和值决定了它的数据类型 由单引号括起来的一个字符称为char型字面值 双引号括起来的零个或多个字符则构成字符串型字面值 字
  • 两万字带你认识黑客在kali中使用的工具

    目录 前言 一 信息收集工具 二 脆弱性分析工具 三 漏洞利用工具 四 嗅探与欺骗工具 五 密码攻击工具 六 权限提升工具 七 Web应用工具 八 无线攻击工具 九 硬件黑客工具 十 维持访问工具 十一 取证工具 十二 逆向工程工具 十三
  • Linux动态链接库.so文件的创建与使用

    1 介绍 使用GNU的工具我们如何在Linux下创建自己的程序函数库 一个 程序函数库 简单的说就是一个文件包含了一些编译好的代码和数据 这些编译好的代码和数据可以在事后供其他的程序使用 程序函数库可以使整个程序更加模块化 更容易重新编译
  • Qt 简述QSettings配置文件保存使用数据

    前言 在开发中 需要将一些信息保存到本地 以便下次程序启动时使用 文件读写 数据库都是可以的 但是Qt提供了QSettings接口方法 将需要的信息写入或者读取配置文件中 其方法类似键值对 QSettings可以存储一系列设置 每个设置包括
  • 探讨Socks5代理IP在跨境电商与网络游戏中的网络安全应用

    随着全球互联网的迅猛发展 跨境电商和在线游戏成为了跨国公司和游戏开发商的新战场 然而 与此同时 网络安全问题也日益突出 本文将探讨如何利用Socks5代理IP来增强跨境电商和网络游戏的网络安全 保障数据传输的隐私和安全性 第一部分 Sock
  • 五分钟,带你彻底掌握 MyBatis 缓存的工作原理

    点击上方 芋道源码 选择 设为星标 管她前浪 还是后浪 能浪的浪 才是好浪 每天 8 55 更新文章 每天掉亿点点头发 源码精品专栏 原创 Java 2020 超神之路 很肝 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络
  • Quartz框架多个trigger任务执行出现漏执行的问题分析

    一 问题描述 使用Quartz配置定时任务 配置了超过10个定时任务 这些定时任务配置的触发时间都是5分钟执行一次 实际运行时 发现总有几个定时任务不能执行到 二 示例程序 1 简单介绍 采用spring quartz整合方案实现定时任务
  • docker菜鸟入门

    菜鸟入门Docker 说明 一 什么是Docker 1 虚拟机和Linux容器 二 Docker用途 三 Docker安装 1 设置仓库 2 安装 Docker Engine Community 3 验证安装成功 四 Docker启动与停止
  • VoVNet论文解读

    摘要 1 介绍 2 高效网络设计的影响因素 2 1 内存访问代价 2 2 GPU计算效率 3 建议的方法 3 1 重新思考密集连接 3 2 One Shot Aggregation 3 3 构建 VoVNet 网络 4 实验 5 代码解读
  • 01背包(c++版)

    dp i j 表示从下标为 0 i 的物品里任意取 放进容量为j的背包 价值总和最大是多少 void test 2 wei bag problem1 vector
  • 上班族为何需要做副业?如何靠副业月入过万?

    网上统计某某城市平均工资8千以上 诶 一看自己3 4千 其实现在每个背井离乡在外上班的打工人都挺难的 城市很繁华 工资很现实 在工厂打螺丝的更是苦逼的生活 被资本家无情的压榨 在豪华的写字楼上班的白领 也过着996的生活 甚至是007的日子
  • 操作系统复习题

    一 选择题 在计算机系统中 操作系统是 核心系统软件 网络操作系统 不是基本的操作系统 实时性 不是分时系统的基本特征 关于操作系统的叙述 能方便用户编程的程序 是不正确的 操作系统的发展过程是 设备驱动程序组成的原始操作系统 管理程序 操
  • Response 456错误

    今天使用某share拉取股票数据时 遇到了Response 456错误 然而在网上查也没有查到 感觉是是较为少见的错误 http response code HTTP状态码对照表 t 332741160的专栏 CSDN博客 后来发现这个错误
  • 【Bun1.0】使用 Bun.js 构建快速、可靠和安全的 JavaScript 应用程序

    bun js Bun 是一个现代的JavaScript运行环境 如Node Deno 主要特性如下 启动速度快 更高的性能 完整的工具 打包器 转码器 包管理 官网 https bun sh 优点 与传统的 Node js 不同 Bun j
  • python数据分析与挖掘实战 -第四章数据预处理

    数据清洗 目的 删除原始数据集中的无关数据 重复数据 平滑噪声数据 筛选掉与挖掘主题无关的数据 处理缺失值 异常值等 缺失值处理方法 删除记录 数据插补和不处理 拉格朗日插值法 对于平面上已知的N个点 无两点在一条直线上 可以找到一个N 1