第8章 数据处理与分析基础
8.1 文件读写
8.1.1 文件的打开和关闭
- 为什么要打开和关闭文件?
- 打开文件是指将访问文件所需要的属性 信息从外存读取至内存之中,每次文件访问都会利用这些信息来对文件进行读、写操作, 从而避免频繁的文件检索,提升文件访问的效率
-
文件访问任务完成之后,需要关闭文 件以释放这些文件信息,同时将文件属性信息的变化写入磁盘文件之中
-
open函数 -
开文件并返回一个文件对象
-
open函数的参数 file: 取值为一个类路径对象(path-like object)-
mode:模式字符串,用于指定文件的打开模式 -
文件的打开模式
| 模式字符 | 含义 |
|---|---|
| 'r' | 读取模式(默认) |
| 'w' | 写入模式,如果文件存在则将其覆盖 |
| 'a' | 写入模式,如果文件存在则将写入内容追加至尾部 'x' 排它性创建模式,如果文件已存在则打开失败 'b' 二进制模式 |
| 't' | 文本模式(默认) |
| '+' | 更新模式(可读可写) |
- 组合打开模式
- 'rb':以二进制文件读取模式打开
- 'wb':以二进制文件写 入模式打开
- 'a+':以文本文件读取和追加模式打开
- 'ab+':以二进制文件 读取和追加模式打开
-
'w+':以文本文件读写模式打开
-
文件访问的过程
1 2 3 4 | |
8.1.2 路径管理
os模块和os.path子模块
| 函数 | 功能 |
|---|---|
os.listdir(path) |
返回 path 文件夹中的文件名构成的列表 |
os.path.exists(path) |
路径 path 是否存在 |
os.path.isabs(path) |
path 是否为绝对路径 |
os.path.isdir(path) |
path 是否为目录 |
os.path.isfile(path) |
path 是否为文件 |
os.path.abspath(path) |
获取 path 的绝对路径 |
os.path.basename(path) |
获取 path 的最后一项(文件名或最底层文件夹) |
os.path.dirname(path) |
获取 path 中 basename 的所在路径 |
os.path.split(path) |
将 path 切分为 dirname 和 basename 两部分 |
os.path.getsize(path) |
获取文件的大小(字节) |
os.path.getatime(path) |
获取文件或路径的最后访问时间(秒) |
os.path.getmtime(path) |
获取文件或路径的最后修改时间(秒) |
os.path.join(path1, path2, ...) |
将多个路径片段拼接为一个合法的路径 |
- 首先需要在计算机 桌面上创建文件'file.txt',然后打开命令行终端并进入用户主目录,进入Python环境并执行如下命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
pathlib模块- 对路径管理功能进行了封装,该模块的关键组成部分是三个类Path、 WindowsPath和PosixPath,分别用于处理 Windows 风格 的路径及 Posix(Linux、macOS 等)风格的路径
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | |
8.1.3 文本文件读写
常用文本文件读写方法
read():读入文本文件全部内容作为字符串返回;readline():读入文本文件中的一行并将文件指针的位置后移一行;readlines():读入文本文件全部内容,返回一个字符串列表,列表中的每个元素是文本文件的一行内容;write(text_str):将text_str表示的字符串写入文本文件;writelines(str_iter):将可迭代对象str_iter写入文本文件,str_iter中的每个字符串作为文件的一行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | |
大文件的读取
read方法和readlines方法会读入整个文件,在读取较大的文本文件时非常耗时,更严重的是可能会由于内存不足而使得程序无法运行- 解决方法1:使用
readline方法
1 2 3 4 5 6 7 | |
- 解决方法2:直接对文件对象进行迭代
1 2 3 4 5 | |
二进制文件读写*
- 使用
open函数以'rb'和'wb'模式打开文件,即可对二进制文件进行读写操作
1 2 3 4 5 6 7 8 9 10 | |
1 2 | |
8.2 上下文管理
- 上下文
- 指程序运行的环境,某些操作只有在相应的环境或上下文之中时才能正确地运行
- 文件的读写操作必须在文件已经被打开的上下文之中
- 数据库的访问必 须在成功建立数据库连接的上下文之中
- 上下文管理
- 上下文环境构建
- 操作过程中的异常处理
- 上下文环境的清理
- ... ...
- Python 将 构建和清理上下文环境的过程独离出来,称为上下文管理
- 上下文管理器
- 具有上下文管理功能的对象,称为上下文管理器
8.2.1 with语句块
with语句块会调用上下文管理器的相关方法来构建上下文环境- 文件对象就是一个上下文管理器
- 利用
with可以更加方便、安全地访问文件
1 2 3 4 5 6 7 | |
- 利用
with读取大文件
1 2 3 4 5 6 | |
8.2.2 上下文管理协议*
- 上下文管理功能由上下文管理协议约定,上下文管理器就是实现了上下文管理协议的类的实例
- 上下文管理协议
__enter__(self):进入with语句块时调用该方法,返回上下文管理器自身或者相关的对象,若有as子句则返回对象会被赋值给as子句中的变量__exit__(self, exc_type, exc_val, exc_tb):离开with语句块时调用该方法- 如果
with语句块中的代码在执行过程中抛出异常,则异常类型、异常值,以及异常追踪信息分别被传递至三个参数exc_type、exc_val和exc_tb - 如果没有异常发生, 则传入的三个值都是
None - 该方法的返回值为一个布尔值,
True表示不再向上抛出 捕获的异常,False表示继续抛出异常。
- 如果
自定义上下文管理器
- 不再抛出with语句块中的异常
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
1 2 3 | |
1 2 3 4 5 | |
- 抛出with语句块中的异常
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
1 2 3 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
应用
- 利用上下文管理器计算代码块的运行时间
1 2 3 4 5 6 7 8 | |
1 2 3 4 | |
1 | |
8.3 数据库编程
8.3.1 数据库应用编程接口
- 数据库访问过程
- 数据库适配器
- 是数据库管理系统在 Python 中的驱动应用程序,作为客户端与数据库服务器进行通信
-
Python 官方给出了适配器 开发的统一规范,即数据库应用编程接口(DB-API),该规范由 PEP249 定义
-
数据库应用编程接口(PEP249)
| 类型 | 名称 | 功能 | |
| 全局属性 | apilevel | 字符串,兼容的 DB-API 版本(1.0 或 2.0) | |
| threadsafety | 线程安全级别(0 至 5) | ||
| paramstyle | SQL 语句中占位符的风格(五种类型) | ||
| 函数 | connect | 建立并返回数据库连接 (Connection) 对象 | |
| 类.方法 | Connection | .close | 关闭数据库连接 |
| .commit | 提交事务或操作 | ||
| .rollback | 回滚事务 | ||
| .cursor | 获取游标 (Cursor) 对象 | ||
| Cursor | .description | 游标状态描述信息(属性) | |
| .rowcount | 最近一次操作的影响行数 (属性) | ||
| .callproc | 调用数据库存储过程 | ||
| .close | 关闭游标 | ||
| .execute | 执行 SQL 语句 | ||
| .executemany | 利用一组参数多次执行同一 SQL 语句 | ||
| .fetchone | 获取查询结果中的下一条记录 | ||
| .fetchmany | 获取查询结果中指定数量的记录 | ||
| .fetchall | 获取查询结果中的剩余的全部记录 | ||
| 异常类 | InterfaceError | 数据库接口错误 | |
| DataError | 数据处理错误 | ||
| OperationalError | 数据库操作执行错误 | ||
| IntegrityError | 数据库完整性错误 | ||
| InternalError | 数据库内部错误 | ||
| ProgrammingError | SQL错误 | ||
| NotSupportedError | 操作不被支持错误 | ||
- DB-API 的 paramstyle 属性
| 取值 | SQL 参数风格示例 |
|---|---|
'qmark' |
...WHERE name=? |
'numeric' |
...WHERE name=:1 |
'named' |
...WHERE name=:name |
'format' |
...WHERE name=%s |
'pyformat' |
...WHERE name=%(name)s |
- PEP249 是一种官方建议的数据库适配器工具包开发规范,不具有强制性,实际的数据库适配器对 PEP249 规范的遵循程度不一致
8.3.2 嵌入式数据库编程
- 嵌入式数据库编程的一般步骤:
- 建立数据库连接
- 获取游标
- 执行 SQL 语句
- 提交事务或操作
-
关闭游标和数据库连接
-
创建sqlite数据库和表
1 2 3 4 5 6 7 | |
- 数据的添加、修改和删除操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | |
- 数据查询操作
1 2 3 4 5 6 7 8 9 | |
1 2 3 | |
8.4 正则表达式*
- 尽管Python的字符串处理方法非常强大,但还是难以应对一些复杂的字符串处理任务
- 判断一个邮箱地址、手机号码是否合法
- 提取出HTML文档中所有需要的数据
- 设计思想
- 利用一种描述性语言定义规则,然后利用该规则来匹配字符串或字符串文档,找出所有满足规则的部分
- 应用场景
- 匹配性检查,即判断某个字符串是否匹配特定的模式
- 文本提取,即提取字符串文本中与规则相匹配的内容
- 切分字符串,即将字符串文本在与规则相匹配的位置进行切分
- 字符串替换,即将字符串文本中与规则相匹配的内容进行替换
- Python的
re模块提供了正则表达式功能
8.4.1 正则表达式匹配规则
- 字符匹配
- 边界匹配
- 重复限制
- 分组
- 后向引用
-
前置条件和后置条件
-
字符匹配
| 符号 | 功能 | 规则示例 | 匹配示例 |
|---|---|---|---|
. |
匹配\n之外任一字符 |
r'.' |
'A' |
\d |
匹配一个数字 | r'\d' |
'9' |
\D |
匹配一个非数字 | r'\D' |
'A' |
\w |
匹配一个字母、数字或下划线 | r'\w' |
'_' |
\W |
匹配一个\w之外的字符 |
r'\W' |
'\t' |
\s |
匹配任何空白字符 | r'\s' |
'\n' |
\S |
匹配任何非空白字符 | r'\S' |
'A' |
x\|y |
匹配x或y |
r'a\|b\|c' |
'a' |
[xyz] |
匹配xyz中的任一字符 |
r'[abc]' |
'a' |
[x-z] |
匹配x到z之间的任一字符 |
r[X-Z] |
'Y' |
[^xyz] |
匹配xyz之外的任一字符 |
r[^1-9] |
'A' |
- 边界匹配
| 符号 | 功能 | 规则示例 | 匹配示例 | 不匹配示例 |
|---|---|---|---|---|
^ |
行头 | r'^Py' |
'the\nPython' |
'the Python' |
$ |
行尾 | r'the$' |
'the\nPython' |
'the Python' |
\b |
单词边界 | r'\bPy' |
'the Python' |
'the-Python' |
\B |
不是单词边界 | r'\BPy' |
'the-Python' |
'the Python' |
\A |
字符串头 | r'\A'Py |
'Python coding' |
'the\nPython' |
\Z |
字符串尾 | r'on\Z' |
'the Python' |
'Python coding' |
- 重复限制
| 符号 | 功能 | 规则示例 | 匹配示例 | 不匹配示例 |
|---|---|---|---|---|
* |
重复零次或多次 | r'\d*' |
'123abc' |
|
+ |
重复一次或多次 | r'\d+' |
'123abc' |
'abc' |
? |
重复零次或一次 | r'\d?' |
'1abc' |
|
{n} |
重复n次 | r'\d{3}' |
'123abc' |
'12abc' |
{n,m} |
重复最少n次最多m次 | r'\d{2,3}' |
'123abc' |
'1abc' |
{n,} |
最少重复n次 | r'\d{2,}' |
'12abc' |
'1abc' |
{,m} |
最多重复m次 | r'\d{,2}' |
'12abc' |
'123abc' |
- 贪婪匹配与懒惰匹配
- 使用重复限制后,正则表达式规则在匹配文本时会出现匹配内容长度不能确定的问题
例如,规则r'\w{3,5}'在匹配字符串'abcde'时,它的三个子串'abc'、'abcd'和'abcde'都附合规则,那么它匹配到的究竟是哪个子串呢?
Python正则表达式默认情况下匹配到的是最长的子串,这种方式称为__贪婪匹配__。
- 重复限制符号后添加?即表示待重复部分为__懒惰匹配__
| 符号 | 功能 |
|---|---|
*? |
重复零次或多次,但次数尽可能少 |
+? |
重复一次或多次,但次数尽可能少 |
?? |
重复零次或一次,但次数尽可能少 |
{n}? |
重复n次,但次数尽可能少 |
{n,m}? |
重复最少n次最多m次,但次数尽可能少 |
- 分组与后向引用
- 正则表达式中使用
()将多个符号作为一个分组 例如,规则r'(\d{1,3}\.){3}\d{1,3}'用于匹配IP地址 - 分组匹配到的文本内容编号并保存在缓存之中
- 编号方式为:
\1表示匹配到的第1个内容,\2表示匹配到的第2个内容,... ... - 缓存数据可实现文本内容的提取
- 缓存的数据可以被正则表达式后续部分引用,称为__后向引用__
- 在分组中添加
?:表示不缓存匹配内容,例如r(?:\d{1,3})
- 编号方式为:
-
命名分组
- Python中命名分组的方式为
(?P<group_name>) - 后向引用中使用分组名
(?P=group_name)
- Python中命名分组的方式为
-
前置条件和后置条件
| 规则 | 说明 | 规则示例 | 匹配示例 | 不匹配示例 |
|---|---|---|---|---|
r'(?=sub_rules)' |
后置条件 | r'abc(?=[de])' |
'abcd'或'abce' |
'abcf' |
r'(?!sub_rules)' |
后置非条件 | r'abc(?![de])' |
'abcf' |
'abcd'或'abce' |
r'(?<=sub_rules)' |
前置条件 | r'(?<=[ab])cde' |
'acde'或'bcde' |
'fcde' |
r'(?<!sub_rules)' |
前置非条件 | r'(?<![ab])cde' |
'fcde' |
'acde'或'bcde' |
8.4.2 正则表达式的应用
匹配性检查
- 实现
re.match函数re.search函数Match对象startendspangroupgroupsgroupdict
1 2 3 4 | |
1 | |
1 2 3 | |
1 2 3 | |
1 | |
1 | |
1 | |
1 | |
1 | |
1 | |
match和search都只返回字符串中第一次匹配到的结果,即其中有多个满足规则的内容- 两者的区别在于,当字符串包含多行时,
match只会搜索第一行,而search则会搜索整个字符串
1 2 3 4 | |
1 | |
1 | |
1 | |
文本提取
- 实现
re.findall- 会搜索字符串文本,并返回所有与规则相匹配的内容构成的列表
re.finditer- 返回一个生成器
1 2 3 4 5 | |
1 | |
1 2 | |
1 | |
切分字符串
- 实现
re.split
1 2 3 4 | |
1 | |
字符串替换
- 实现
re.sub- 返回替换后的字符串
re.subn- 返回由替换后的字符串和替换次数组成的元组
1 2 3 4 | |
1 | |
8.4.3 正则表达式的编译
- 正则表达式的使用过程
- 1 编译
- 2 匹配
- 每次调用都会重新编译一次
- 提高效率的方式
- 编译和匹配分开
- 实现
re.compile
1 2 3 4 | |
1 | |
8.5 数据分析中的数据结构 *
8.5.1 NumPy
- NumPy 是一种高效的矩阵/高维数组计算工具包,几乎所有的数据 分析和处理工具都依赖或支持 NumPy
ndarray
- NumPy 中最核心的数据类型
- 创建
ndarray常常使用 Numpy 中的array函数
1 2 3 | |
1 | |
1 | |
1 2 | |
- 创建特殊结构的ndarray
| 函数 | 功能描述 |
|---|---|
zeros |
创建全 0 的多维数组 |
ones |
创建全 1 的多维数组 |
eye |
创建对角线元素为 1 的二维数组 |
random.rand |
以随机生成的数据创建多维数组 |
1 2 | |
1 2 3 | |
1 | |
1 2 3 | |
1 | |
1 2 3 | |
1 | |
1 2 3 | |
多维数组的操作
- 元素访问与过滤
1 2 3 | |
1 | |
1 | |
1 | |
1 | |
1 | |
- 改变形状与维度
1 2 | |
1 2 3 | |
1 | |
1 2 | |
1 | |
1 2 | |
- 元素运算
1 | |
1 2 3 | |
1 | |
1 | |
矩阵运算
1 2 3 4 5 | |
1 | |
1 2 | |
1 | |
1 2 | |
1 2 3 4 5 6 7 8 9 10 11 | |
1 2 3 4 5 | |
广播
- 数学中的矩阵运算要求两个矩阵的形状必须相匹配
- 在高维矩阵运算中可能会带来不必要的计算量和存储空间
- 广播(Broadcast)
- 是 NumPy 中的一种特有的运算机制,目的就是适当放松矩阵运算中必须要求形状相匹配的条件,提升运算效率
1 2 3 4 5 6 7 8 9 | |
1 2 3 4 5 | |
1 | |
1 2 3 4 5 | |
- NumPy 多维数组运算中,一旦发生形状不匹配的情况就会自动触发广播
- 广播的逻辑本质,是在特定维度上复制数组使得其形状相匹配
- 广播相关概念
- 轴(Axes)
- NumPy 多维数组中的一个维度称为一个轴
- 轴长
- 一个轴上数据元素的数量称为维度的轴长
-
后尾维度(Trailing Dimension)
- 高维数组的最后一个或多个连续的轴
-
As和B具有相同的后尾维度
1 | |
1 | |
1 | |
1 | |
- 广播的条件
- 当数组维度不同时,后尾维度的轴长(或形状)相符
- 当数组维度相同时,其中之一拥有至少一个轴长为 1 的维度
1 2 | |
1 2 3 4 5 | |
1 | |
1 2 3 | |
[[[3, 3]],
1 | |
8.5.2 SciPy
- SciPy 是一个常用于数学、科学、工程领域的工具包,可用于解决数值计算、积分、 优化、图像处理、常微分方程数求解、信号处理等问题
- SciPy 依赖于 NumPy
特征值与特征向量求解
- 矩阵\(\mathbf A\)的特征值和特征向量分别是满足下式的向量\(\mathbf v\)和标量\(\lambda\):
- 可利用
scipy.linalg中的eig函数来求特征值与特征向量
1 2 3 4 5 6 7 | |
1 | |
1 | |
1 2 3 | |
奇异值分解
- 奇异值分解是将形如\(m\times n\)的矩阵\(\mathbf A\)分解为如下形式:
其中\(\mathbf U\)和\(\mathbf V\)为分别为\(m\times m\)和\(n\times n\)的正交矩阵 (\(\mathbf{UU}^{\top}=\mathbf I\),\(\mathbf{VV}^{\top}=\mathbf I\)), 分别称为左奇异矩阵和右奇异矩阵;\(\Sigma\)为仅主对角线元素有非零值的\(m\times n\)矩阵, 这些非零值称为奇异值
- 奇异值分解在数据降维和压缩、信息推荐、数据去噪等领域有重要的应用价值
- 可利用
scipy.linalg中的svd函数来对矩阵进行奇异值分解
1 2 3 4 5 | |
1 | |
1 2 3 | |
1 | |
1 | |
1 | |
1 2 3 4 5 | |
稀疏矩阵
- 稀疏矩阵
- 矩阵中绝大多数元素是零或者是接近0的数字
- 稀疏矩阵的存储方式
- SciPy 的sparse 模块中提供了7种类型的稀疏矩阵
| 类型 | 结构特点 | 优点 | 缺点 |
|---|---|---|---|
coo_matrix |
采用(行, 列, 数据)三 元组形式存储数据 | 创建方便,结构转换快 | 不支持运算和切片操作 |
dok_matrix |
基于字典存储数据 | 创建方便,结构转换快 | 运算效率低,不支持切片操作 |
csr_matrix |
按行压缩存储数据 | 运算效率高,行切片效率高 | 列切片效率低,结构转换慢 |
csc_matrix |
按列压缩存储数据 | 运算效率高,列切片效率高 | 行切片效率低,结构转换慢 |
bsr_matrix |
采用分块方式存储数据 | 运算效率高,适用于有密集子矩阵的稀疏矩阵 | 切片效率低,结构转换慢 |
lil_matrix |
采用嵌套列表存储数据 | 行切片效率高,结构转换快 | 运算效率低,列切片效率低 |
dia_matrix |
按对角线存储数据 | 运算效率高,对角性良好时存储效率高 | 对角性不好时存储效率低,不 支持切片操作 |
coo_matrix
1 2 3 4 5 6 | |
1 | |
1 | |
1 2 3 4 5 6 | |
1 | |
1 2 3 4 5 | |
csr_matrix
1 2 3 4 | |
1 | |
1 2 3 | |
1 2 3 4 5 | |
8.6 数据可视化*
- Matplotlib是Python中著名的绘图库。它最初是对Matlab绘图命令的模仿,目前是Python绘图领域影响最为广泛的工具
8.6.1 简单绘图
pyplot模块定义了大量函数用于绘制、配置或修改图像
| 函数 | 功能 |
|---|---|
plot |
折线图 |
scatter |
散点图 |
bar |
柱状图 |
pie |
饼图 |
hist |
直方图 |
imshow |
热力图 |
1 2 3 4 5 6 | |
1 2 3 4 5 | |
1 2 3 4 5 | |
1 2 3 4 | |
1 2 3 4 | |
1 2 3 4 | |
8.6.2 图像的配置与修饰
- Matplotlib图像的主要组成部分
- 图像:是一个
Figure对象。常用的属性包括图像的大小(figsize)、分辨率(dpi)等,可包含一个或多个坐标轴 - 坐标轴:图像的子图,是一个
AxesSubplot对象。常用属性有标题(title)等,每个坐标轴由 x 轴(xaxis)和 y 轴(yaxis)组成,每个轴都可以配置自己的标识 (xlabel或ylabel)、刻度、刻度范围、刻度标识等 - 绘图:具体的图形对象,可以是折线图、散点图等。属性有线形、宽度、颜色、修饰符(marker)及其形状和颜色等
- 填充:在折线图与坐标轴之间(坐标轴的
fill方法)或者不同的折线之间 (坐标轴的fill_between方法)填充颜色 - 图例:根据绘图的线形、颜色、修饰符等自动生成
- 标注:使用坐标轴的annotate方法或text方法添加文本或箭头等形状,文本中支持 Latex 符号和公式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | |
- 中美新冠病毒确诊数量对比
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
8.6.3 多子图图像的绘制
1 2 3 4 5 6 7 8 9 10 11 12 | |
8.6.4 三维图像的绘制
- Matplotlib的
mpl_toolkits辅助模块中提供了各种三维图像的绘制功能 - 函数\(Z=\sin(\sqrt{X^2+Y^2})\)的三维图像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
8.7 Pandas基础*
- Pandas是Python数据分析与处理领域非常知名的工具之一,常用于结构化数据分析任务,例如数据分析、数据挖掘和数据清洗等
- 从功能上来说可以粗略地认为它是电子表格和结构化查询语言(SQL)相结合的Python实现
8.7.1 数据结构
系列(Series)
- 系列本质上是带有索引的一维数组元素可以是整数、浮点数、字符串,以及其他的 Python 对象
- 可以基于列表、字典或者 Numpy 数组来创建一个系列
1 2 3 4 5 6 | |
1 2 3 4 | |
1 2 | |
1 2 3 4 | |
1 2 | |
1 2 3 4 | |
1 2 3 | |
1 2 3 4 | |
数据框
- 普通的数据框从逻辑上来说是一种二维表格
- 可以基于二维列表或二 维 Numpy 数组创建数据框,也可以基于系列来创建数据框
1 2 3 | |
| 0 | 1 | |
|---|---|---|
| a | 1 | 8 |
| b | 4 | 5 |
| c | 2 | 7 |
1 2 3 | |
| s1 | s2 | |
|---|---|---|
| 0 | 1 | 8 |
| 1 | 4 | 5 |
| 2 | 2 | 7 |
1 2 3 4 | |
| s1 | s2 | |
|---|---|---|
| 0 | 1 | 8 |
| 1 | 4 | 5 |
| 2 | 2 | 7 |
1 2 | |
| s1 | s2 | |
|---|---|---|
| 0 | 1 | 8 |
| 1 | 4 | 5 |
| 2 | 2 | 7 |
| 3 | 0 | 0 |
1 2 | |
| s1 | s2 | new | |
|---|---|---|---|
| 0 | 1 | 8 | 9 |
| 1 | 4 | 5 | 9 |
| 2 | 2 | 7 | 9 |
| 3 | 0 | 0 | 0 |
- 数据框的读入和写出
- Pandas支持多种格式数据的读入和写出,常用的格式包括Excel、CSV、JSON、SQL、HDF、STATA、SAS、SPSS等。
1 2 3 | |
| s1 | s2 | new | |
|---|---|---|---|
| 0 | 1 | 8 | 9 |
| 1 | 4 | 5 | 9 |
| 2 | 2 | 7 | 9 |
| 3 | 0 | 0 | 0 |
8.7.2 数据访问
索引访问
1 | |
1 | |
1 | |
1 2 3 | |
1 | |
1 | |
1 | |
1 2 3 | |
1 | |
1 2 3 | |
- 数据框的索引访问常用到三个属性
loc: 使用标签索引来访问一行或多行iloc: 使用整数索引来访问一行或多行iat: 通过指定行和列来访问数据框元素
1 2 3 | |
| c1 | c2 | |
|---|---|---|
| a | 1 | 8 |
| b | 4 | 5 |
| c | 2 | 7 |
1 | |
1 2 3 4 | |
1 | |
| c1 | c2 | |
|---|---|---|
| a | 1 | 8 |
| b | 4 | 5 |
1 | |
1 2 3 | |
1 | |
| c1 | c2 | |
|---|---|---|
| a | 1 | 8 |
| c | 2 | 7 |
1 | |
1 2 3 | |
1 | |
1 | |
条件选择
- 根据指定的条件对系列或数据框的值进行过滤
1 2 | |
1 | |
| c1 | c2 | |
|---|---|---|
| b | 4 | 5 |
| c | 2 | 7 |
1 | |
| c1 | c2 | |
|---|---|---|
| c | 2 | 7 |
1 | |
| c1 | c2 | |
|---|---|---|
| a | 1 | 8 |
| b | 4 | 5 |
迭代
- 数据框可以生成多种类型的迭代器,能够对行进行不同形式的迭代遍历
1 2 3 4 | |
1 2 3 | |
1 2 | |
1 2 3 | |
1 2 | |
1 2 3 | |
统计分析
- 系列数据常用统计方法
| 函数 | 功能 |
|---|---|
count |
数据量 |
sum |
求和 |
mean |
均值 |
median |
中位数 |
std |
准偏差 |
min |
最小值 |
max |
最大值 |
value_counts |
频次统计 |
- 数据框的描述信息
1 2 3 | |
| c1 | c2 | |
|---|---|---|
| count | 3.000000 | 3.000000 |
| mean | 2.333333 | 6.666667 |
| std | 1.527525 | 1.527525 |
| min | 1.000000 | 5.000000 |
| 25% | 1.500000 | 6.000000 |
| 50% | 2.000000 | 7.000000 |
| 75% | 3.000000 | 7.500000 |
| max | 4.000000 | 8.000000 |
- 协方差和相关系数
1 2 3 | |
1 | |
1 | |
| c1 | c2 | |
|---|---|---|
| c1 | 0.853200 | -0.019313 |
| c2 | -0.019313 | 0.715135 |
1 | |
1 | |
1 | |
| c1 | c2 | |
|---|---|---|
| c1 | 1.000000 | -0.024724 |
| c2 | -0.024724 | 1.000000 |
8.8 Scikit-learn基础*
8.8.1 Scikit-learn简介
- Scikit-learn是一种通用的机器学习工具包,它依赖 NumPy、SciPy 和 Matplotlib 以实现高效的数值过算、优化和可视化
- Scikit-learn对整个机器学习流程提供了完整的支持,例如数据集读取、数据处理与 转换、模型及学习方法、模型的评价与选择等
- Scikit-learn的核心功能
| 功能 | 描述 |
|---|---|
| 有监督学习模型 | 分类模型、回归模型、集成学习模型、有监督神经网络模型、半监督学习模型,以及特征选择工具 |
| 无监督学习模型 | 聚类模型、双向聚类模型、包括高斯混合模型、流形学习、矩阵分解、变 分估计、异常检测、密度估计、有监督神经网络模型 |
| 模型选择与评价 | 交叉验证、调参工具、性能评价指标、模型保存、偏差/方差分析 |
| 模型解释 | 部分依赖图(PDP)、排列特征重要性(Permutation feature importance) |
| 可视化 | 数据可视化、学习过程可视化、模型评价/选择可视化等 |
| 数据转换工具 | 特征提取、数据预处理、缺失值处理、数据降维、标签处理、核方法 |
| 数据集工具 | 内置数据集、数据集生成工具、数据集加载工具 |
| 高性能计算工具 | 大数据集处理、并行计算、资源管理与配置 |
- Scikit-learn 将大多数机器学习功能封装为类并基于相同或相似的接口实现,主要可分为如下三种
- Estimator:估计器,各常机器学习模型都被封装为估计器。绝大多数估计器都有如下三个方法:
- fit(x, y):根据数据x及标签y对模型进行训练
- score(x, y):根据数据x及标签y对训练好的模型进行评价
- predict(x):利用训练好的模型预测数据x的标签
- Transformer:转换器,对数据进行转换操作,如标准化、降维、特征选择等。大多数转换器都有如下三个方法:
- fit(x, y):根据数据x和标签y确定数据转换方式
- transform(x):根据确定的转换方式,对数据x进行转换
- fit_transform(x, y):确定数据转换方式,并且对数据进行转换
- Pipline
- 将数据处理、转换到模型学习等多个步骤组装为一个完整的过程以便于 模型的训练和使用,通常会包含多个转换器和一个估计器。Pipline对象也有fit、 score、predict、fit_transform等方法。
8.8.2 分类问题
- 分类问题
- 给定一组类别已知的样本数据集(有监督数据),确定一个分类函数用于对类别未知的数据的所属类别进行预测
- k 最近邻算法
- step1:确定 k 值以及样本距离的定义方式
- step2:对于数据集中的样本s,计算它与其他样本数据的距离
- step3:确定距离最近的k个样本以及它们所属的类别c
- step4:将s的类别标记为c
- 鸢尾花数据集(Iris)
- 每个样本对应着一朵鸢尾花样本,记录着花萼长度、花萼宽度、花瓣长度、花瓣宽度四个特征
- 数据集中共包含三个类别(iris-setosa、iris-versicolour和iris-virginica)的鸢尾花样本
-
每个类别共有50个样本数据
-
鸢尾花分类的 k 最近邻模型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
1 2 3 4 | |
8.8.3 聚类问题
- 聚类问题
- 给定一组样本数据根据相似度,将 它们划分入不同的类别,使得类内数据之间的距离尽可能小,类与类之间的距离尽可能 大
- \(k\)均值模型
- 第一,计算数据与聚类中心之间的距离,并将其划分入距离最近的中心表示的类别之中
- 第二,根据新的数据类别划分结果,更新类别中心的位置
-
重复这两个步骤,直到达到最大迭代次数或者类别中心的位置不再发生变化
-
\(k\)均值模型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | |
本页面的全部内容在 生信资料 bio.0594codes.cn 和 莆田青少年编程俱乐部 0594codes.cn 协议之条款下提供,附加条款亦可能应用