【鸢尾花书籍】编程不难

📝本文介绍

本文为作者拜读鸢尾花书籍《编程不难》后所做的笔记,整理成文章,以供回顾
👋作者简介:一个正在积极探索的本科生

📱联系方式:943641266(QQ)

🚪Github地址:https://github.com/sankexilianhua

🔑Gitee地址:https://gitee.com/Java_Ryson

由于本人的知识所限,如果文章有问题,欢迎大家联系并指出,博主会在第一时间修正。

文章目录

  • [📕1. 安装Anaconda](#📕1. 安装Anaconda)
  • [📘2. JupyterLab](#📘2. JupyterLab)
    • [📖2.1 组成](#📖2.1 组成)
    • [📖2.2 快捷键](#📖2.2 快捷键)
  • [📙3. python语法](#📙3. python语法)
    • [📖3.1 关键字](#📖3.1 关键字)
    • [📖3.2 注释](#📖3.2 注释)
    • [📖 3.3 缩进](#📖 3.3 缩进)
    • [📖 3.4 变量](#📖 3.4 变量)
    • [📖 3.5 导包](#📖 3.5 导包)
  • 📗4.Python数据类型
    • [📖4.1 数据类型](#📖4.1 数据类型)
    • [📖4.2 类型转换与特殊值](#📖4.2 类型转换与特殊值)
    • 📖4.3字符串
    • [📖4.4 列表](#📖4.4 列表)
    • [📖4.5 其他数据类型](#📖4.5 其他数据类型)
    • [📖4.6 矩阵](#📖4.6 矩阵)
  • [📕 5. Pyton常见运算](#📕 5. Pyton常见运算)
    • [📖5.1 运算符](#📖5.1 运算符)
    • [📖5.2 算术运算符](#📖5.2 算术运算符)
    • [📖5.3 比较运算符](#📖5.3 比较运算符)
    • [📖5.4 逻辑运算符](#📖5.4 逻辑运算符)
    • [📖5.5 赋值运算符](#📖5.5 赋值运算符)
    • [📖5.6 成员运算符](#📖5.6 成员运算符)
    • [📖5.7 成员运算符](#📖5.7 成员运算符)
    • [📖5.8 优先级](#📖5.8 优先级)
  • [📘 6. 控制结构](#📘 6. 控制结构)
    • [📖6.1 条件语句](#📖6.1 条件语句)
    • [📖6.2 循环结构](#📖6.2 循环结构)
    • [📖6.3 控制](#📖6.3 控制)
    • [📖6.4 迭代器](#📖6.4 迭代器)
  • [📙7. Python函数](#📙7. Python函数)
    • [📖7.1 概念](#📖7.1 概念)
    • [📖7.2 匿名函数](#📖7.2 匿名函数)
    • [📖7.3 构建模块,库](#📖7.3 构建模块,库)
  • 📗8.可视化
    • [📖8.1 一幅图的结构](#📖8.1 一幅图的结构)
    • [📖8.2 绘图常用api](#📖8.2 绘图常用api)
    • [📖8.3 图片输出格式](#📖8.3 图片输出格式)
  • [📕9. 二维可视化](#📕9. 二维可视化)
    • [📖9.1 散点图](#📖9.1 散点图)
    • [📖9.2 等高线](#📖9.2 等高线)
    • [📖9.3 热图](#📖9.3 热图)
  • [📘10. Numpy](#📘10. Numpy)
    • [📖10.1 数组](#📖10.1 数组)
      • [🔖10.1.1 概念](#🔖10.1.1 概念)
      • [🔖10.1.2 数组变形](#🔖10.1.2 数组变形)
    • [📖10.2 数列](#📖10.2 数列)
    • [📖10.3 网格数据](#📖10.3 网格数据)
    • [📖10.4 特殊数组](#📖10.4 特殊数组)
    • [📖10.5 数组导入导出](#📖10.5 数组导入导出)
    • [📖10.6 索引](#📖10.6 索引)
    • [📖10.7 切片](#📖10.7 切片)
    • [📖10.8 视图和副本](#📖10.8 视图和副本)
    • [📖10.9 常见运算](#📖10.9 常见运算)
    • [📖10.10 转置](#📖10.10 转置)
    • [📖10.11 扁平化](#📖10.11 扁平化)
    • [📖10.12 旋转](#📖10.12 旋转)
    • [📖10.13 堆叠](#📖10.13 堆叠)
    • [📖10.14 重复](#📖10.14 重复)
    • [📖10.15 分块矩阵](#📖10.15 分块矩阵)
    • [📖10.16 线性代数](#📖10.16 线性代数)
  • [📙11. Seaborn可视化数据](#📙11. Seaborn可视化数据)
    • [📖11.1 直方图](#📖11.1 直方图)
    • [📖11.2 核密度估计KDE](#📖11.2 核密度估计KDE)
    • [📖11.3 分散点图](#📖11.3 分散点图)
    • [📖11.4 蜂群图](#📖11.4 蜂群图)
    • [📖11.5 箱型图](#📖11.5 箱型图)
    • [📖11.6 小提琴图](#📖11.6 小提琴图)
    • [📖11.7 聚类热图](#📖11.7 聚类热图)
  • 📗12.Pandas时间序列
    • [📖12.1 时间序列](#📖12.1 时间序列)
    • [📖12.2 缺失值](#📖12.2 缺失值)
    • [📖12.3 移动平均](#📖12.3 移动平均)
    • 📖12.4收益率
    • [📖12.5 统计分析](#📖12.5 统计分析)
    • [📖12.6 相关性](#📖12.6 相关性)

📕1. 安装Anaconda

mac:https://docs.anaconda.com/anaconda/install/mac-os/

window:在 Anaconda 官网 (https://www.anaconda.com/) 下载对应版本即可

📘2. JupyterLab

JupyterLab 集合"浏览器 + 编程 + 文档 + 绘图 + 多媒体 + 发布"众多功能与一身。

📖2.1 组成

cell

在 JupyterLab 中,Cell (单元格) 是指一个包含代码或文本的矩形区域,它是用户编写和执行代码、编写文本和渲染Markdown 的基本单位。Cell 可以包含多种类型的内容,包括代码、Markdown、LaTeX 公式等。JupyterLab 中的 Cell 可以通过交互式的方式进行编辑和执行。
kernel

JupyterLab 中,内核 (kernel) 是指与特定编程语言交互的后台进程 ,它负责编译和执行用户在 JupyterLab 中编写的代码,并返回执行结果。内核与 JupyterLab 之间通过一种称为"Jupyter 协议"的通信协议进行交互。打开一个新的 notebook 或console 时,JupyterLab 会自动启动一个内核,这个内核将与该 notebook 或 console 中编写的代码进行交互。内核还可以保存笔记本中的变量和状态,使得大家可以在多个代码单元格之间共享变量和状态。

📖2.2 快捷键

JupyterLab 的快捷键分成两种状态:a) 编辑模式;b) 命令模式。

编辑模式快捷键:

快捷键 功能
esc / ctrl+M 进入命令模式
ctrl+S 保存
shift+enter 执行+跳转
ctrl+enter 执行
alt+enter 执行+创建cell
ctrl + shift + - 分割
ctrl + / 注释/撤销注释
ctrl + [ 向右缩进
ctrl + ] 向左缩进
ctrl + A 全选
ctrl + Z 撤销
ctrl + shift + Z 重做(撤销撤销)
ctrl + c 复制
ctrl + x 剪切
ctrl + v 粘贴
ctrl + f 查询
home 跳到某行开头
end 跳到某行结尾
ctrl + home 跳到多行cell第一行开头
ctrl + end 跳到多行cell最后一行结尾
tab 代码补齐
shift + tab 对键入的函数提供帮助文档
ctrl + B 展开/关闭左侧sidebar

命令模式快捷键:

快捷键 功能
esc 进入命令模式
esc -> m 代码转文本
esc -> y 文本转代码
enter 进入编辑模式
esc->a 上方插入
esc->b 下方插入
esc->d->d 删除
esc->0->0 重启kernel
esc->ctrl + b 展开/关闭左侧sidebar
esc->ctrl + a 选中所有cells
esc->shift + ↑ 选中当前和上方cell
esc-> shift + ↓ 选中当前和下方cell
shift + m 合并
shift + enter 执行+跳转
ctrl + enter 执行
alt + enter 执行+创建
esc->1 一级标题
esc->2 二级标题
esc->3 三级标题

📙3. python语法

📖3.1 关键字

​ 这里挑选几个个人觉得特殊的关键字,不全列出来。

关键字 介绍
complex 复数
condition 条件
def 定义函数
elif 等同于else if
except 捕获异常
lambda 定义一个匿名函数
pass 占位符,跳过
raise 引发异常
yield 用于生成器函数,暂停函数执行并返回一个值

📖3.2 注释

单行注释:#

多行注释:'''/"""(三引号)

📖 3.3 缩进

缩进是指在代码行前面留出的空格 (space) 或制表符 (tab),它们用于表示代码块的开始和结束

缩进情况:

  • 在 if ... elif ... else ... 语句中,它们所控制的代码块需要缩进,以表示它们属于条件语句。
  • 在 for、while 等循环语句中,循环体内的代码块需要缩进,以表示它们属于循环语句。
  • 在函数定义时,函数体内的代码块需要缩进,以表示该代码块属于函数体。

📖 3.4 变量

变量 (variable) 是用于存储数据值的标识符。

  • Python 会根据所赋予的值自动确定其类型
  • 动态类型语言,无需显式指定变量类型
  • 静态类型语言则需要指定,并且编译器会检测是否正确使用

命名规则

  • 变量名必须是一个合法的标识符,即由字母、数字和下划线组成,且不能以数字开头。例如,x、my_var、var_1 等都是合法的标识符。注意,变量名不能以数字开头,比如1_variable 作为变量名不合法。

  • 变量名区分大小写。例如,my_var 和 My_var 是不同的变量名。

  • 变量名应该具有描述性,能够清晰地表达其所代表的内容。例如,name 可以代表人名,age可以代表年龄等。

  • 变量名应该尽量简洁明了,但不要过于简短或过于复杂。避免使用单个字母或缩写作为变量名,除非上下文明确。

  • 变量名不应该与 Python 中的保留函数 (关键字) 重名,否则会导致语法错误。例如,不能使用if、else、while 等关键字作为变量名。

  • 在特定的上下文中,可以使用特定的命名约定。例如,类名应该使用驼峰命名法(camelCase),函数名和变量名应该使用下划线分隔法 (snake_case) 等。

命名法

  • 驼峰命名(每个单词首字母大写)
    • 小驼峰:首字母小写
    • 大驼峰:首字母大写
  • 蛇形命名:单词之间使用下划线分隔

📖 3.5 导包

  • Python 包是一组相关的模块和函数的集合。

  • Python 中有很多常用的包,包括数据处理和可视化、机器学习和深度学习、网络编程、Web 开发等。

  • 可以直接使用import来导入包,也可以使用from...import

    • 导入后可以使用as来起别名

📗4.Python数据类型

📖4.1 数据类型

数据类型 type 特点
数字Number int float complex 整数,浮点数,复数等
字符串String str 字符序列
列表List list 有序元素,可以修改
元组Tuple tuple 有序元素,不可修改
集合Set set 无序元素,不允许重复
字典Dictionary dict 键值对,必须唯一
布尔Boolean bool True和False
None类型 NoneType 空值或缺失值

📖4.2 类型转换与特殊值

  • 使用数据type()来进行对应的转换。例:int(x)
  • 一些特殊数值如:Π,e等,可以通过导入math包来使用

📖4.3字符串

  • 单引号,双引号,三引号都可以用来创建字符串(三引号多用于多行字符串的创建)

  • 单字符也是字符串

  • 可以通过索引来访问指定位置的字符,正向从0开始,反向从-1开始(-1标识最后一个字符)

  • 切片是指从字符串中提取出一部分子字符串。语法为string[start:end],是一个左闭右开区间,切片还可以指定步长 (step),用于跳过指定数量的字符。语法为string[start: end:step]。

  • 复制字符串可以采用 string_name[:] 实现

  • 索引和切片操作不会改变原始字符串,而是返回一个新的字符串。

一些字符串api可以在需要使用时再查询即可。

📖4.4 列表

  • python中列表可以存储不同类型的元素
python 复制代码
api:
	len()
    enumerate() #将数组等组合成一个索引,第二个参数可要可不要,用于指示开始下标
    reverse()
    insert()
    append()
    del ...
    '字符'_join
    等

其余一些api,可在使用时直接查询

  • 视图:直接使用等号(=)赋值,是非拷贝方法,修改哪个列表都会影响到另一个列表,即共享同一个地址。
  • copy(),浅拷贝,只对list的第一层元素完成拷贝,深层元素仍然共享
  • copy.deepcopy(),深拷贝,创建一个完全独立的列表对象,适用于嵌套列表

📖4.5 其他数据类型

元组

元组 (tuple) 是一种不可变的序列类型,用圆括号 () 来表示。元组一旦创建就不能被修改,这意味着你不能添加或删除其中的元素。

集合

在 Python 中,集合 (set) 是一种无序的、可变的数据类型,可以用来存储多个不同的元素。使用花括号 {} 或者 set() 函数创建集合,或者使用一组元素来初始化一个集合。

api 作用
add 添加单个元素
update 添加多个元素
remove 删除元素(删除不存在元素会引发KeyError异常)
discard 删除元素,不会引发异常
& 交集
| 并集
- 差集

字典

在 Python 中,字典是一种无序的键值对 (key-value pair) 集合。

可以使用大括号 {} 或者 dict() 函数创建字典,键 (key) 值 (value) 对之间用冒号 : 分隔。

python 复制代码
# 使用大括号创建字典
person = {'name': 'James', 'age': 18, 'gender':
'male'}
# 使用 dict() 函数创建字典
fruits = dict(apple=3, banana=2, cherry=5)

📖4.6 矩阵

  • 一个 n × D (n by capital D ) 矩阵 Xn 是矩阵行数 (number of rows in the matrix),D 是矩阵列数 (number of columns in the matrix)。

  • 从统计数据角度,n 是样本个数,D 是样本数据特征数。

  • 行向量 (row vector) 是由一系列数字或符号排列成的一行序列。列向量 (column vector) 是由一系列数字或符号排列成的一列序列。

  • 矩阵可以视作由一系列行向量、列向量构造而成。

📕 5. Pyton常见运算

📖5.1 运算符

► 算术运算符:用于数学运算,例如加法 (+)、减法 (-)、乘法 (*)、除法 (/)、取余数(%)、乘幂 (**) 等。
► 比较运算符:用于比较两个值之间的关系,例如等于 (==)、不等于 (!=)、大于 (>)、小于 (<)、大于等于 (>=)、小于等于 (<=) 等。
► 逻辑运算符:用于处理布尔型数据,例如与 (and)、或 (or)、非 (not) 等。
► 赋值运算符:用于给变量赋值,例如等号 (=)、自加运算 (+=)、自减运算 (-=)、自乘运算 (*=)、自除运算 (/=)。
► 成员运算符:用于检查一个值是否为另一个值的成员,例如 in、not in 等。
► 身份运算符:用于检查两个变量是否引用同一个对象,例如 is、is not 等。

📖5.2 算术运算符

加减法

加法运算符 (+) 用于将两个数值相加或将两个字符串拼接起来。

  • 操作数类型不一致,则会自动进行转换
    • 复数,浮点数,整数

减法将两个数值相减,字符串不适用。

乘除法

乘法运算符 (*) 用于将两个数值相乘或将一个字符串重复多次。(注意,NumPy 数组完成矩阵乘法 (matrix multiplication) 时用的运算符为 @)

除法运算符 / 用于将两个数值相除,结果为浮点数。

  • 在 Python 中,正斜杠 / (forward slash) 和反斜杠 \ (backward slash) 具有不同的用途和含义。在路径表示中,正斜杠 / 用作目录分隔符,用于表示文件系统路径。在除法运算中,正斜杠用作除法操作符。在 Windows 文件路径表示中,反斜杠用作目录分隔符。在字符串中,反斜杠 \ 用作转义字符,用于表示特殊字符或字符序列

取模运算符 % 用于获取两个数值相除的余数

📖5.3 比较运算符

相等,不等,大于,大等,小于,小等,只返回True或False

📖5.4 逻辑运算符

三种逻辑运算符:and,or和not

and:两方两边都为真才为真

or:两边有一方为真,就为真

not:取反

📖5.5 赋值运算符

+=,-=,*=,/=,%=,**=

  • ∗ ∗ = : a ∗ ∗ = b {**= :a**=b} ∗∗=:a∗∗=b 则结果为a = a b {a^b} ab

📖5.6 成员运算符

in 和 not in 用于判断元素是否在列表中

📖5.7 成员运算符

is 和 not is 判断两个对象是否引用同一个内存地址

📖5.8 优先级

括号 > 正负号 > 算术运算符 > 位运算符 > 比较运算符 > 身份运算符 > 成员运算符 > 逻辑运算符

📘 6. 控制结构

📖6.1 条件语句

if else 结构,可以多重嵌套

if elif else语句:判断多个条件,如果第一个条件成立,立即执行if中代码,如果第一个条件不成立,但第二个条件成立,则执行elif中代码,都不成立执行else中代码。

📖6.2 循环结构

除正常while,for结构,可以使用for...in 的方式

python 复制代码
mystring = "matplotlib"

for obj in mystring:
    print(obj)
  • 使用enumerate()

    可以将一个可迭代对象转换为一个由索引和元素组成的枚举对象。默认索引为0,可以在第二个参数中指定起始索引(1,2,3...)

  • 使用zip()

    可以将多个可迭代对象的元素组合成元组,然后返回这些元组组成的迭代器。

    注意:当这些对象长度不同时,以最短的可迭代对象为准

    python 复制代码
    names =['Alice','Bob','Charlie']
    scores = [80, 90 , 75]
    for name, socre in zip(names,scores):
        	print(name ,score)

    可以使用其来计算内积,让两个元素*

  • 矩阵乘法

    • python方法

    3层循环,第一层用来标识结果矩阵的行,第二层循环用来标识结果矩阵的列,第三层循环用来标识需要相乘的个数。

    python 复制代码
    A = [[1,2,3,4],
    	 [5,6,7,8]]
    B = [[8,7,6,5],
    	 [4,3,2,1]]
    C = [[0,0],
    	 [0,0]]
    
    for i in range(len(A)) #行
    	for j in range(len(B[0])) #列
        	for k in range(len(B)) # 需要相乘后相加的所有个数
            	C[i][j] += A[i][k]*B[k][j] 
                #矩阵乘法 m*n  n*q  k即是n ,i是m,j是q
    • numpy方法

      A@B或调用api

  • 列表生成式

    即:在列表[]中写下对应一个for循环来生成。[for ... in ... if ... ]

捕捉异常:

python 复制代码
try: 
    x=1/0
except ZeroDivisionError:
    print(...)

📖6.3 控制

  • break:跳出当前循环
  • continue:跳出当前循环
  • pass:空语句占位符

📖6.4 迭代器

一种用于遍历数据集合的对象,能够逐个返回数据元素,无需提前将整个数据集加载到内存中。itertools模块中包含了一些列函数,包括组合,排列等。

用于排列:

  • 无放回排列

    • 使用itertools.permutations()获取一个可迭代的对象

    • 第二个参数用于指定返回的排列长度,不指定则与输入序列长度相同

  • 有放回排列

    • 使用itertools.product

    • 第二个参数用于指定每个元素可以重复出现的次数

用于组合:

  • 无放回组合

    • 使用itertools.conbination()

    • 第二个参数用于指定返回的排列长度,不指定则与输入序列长度相同

  • 有放回组合

    • 使用iterltools.combinations_with_reolacement

    • 第二个参数用于指定组合长度

📙7. Python函数

📖7.1 概念

函数是一段可重复使用的代码块,用于执行特定任务或完成特定操作。函数可以接受输入参数,并且可以返回具体值、或者不返回任何值作为结果。

  • 包-模块-函数:包>模块>函数,模块和函数可以重用。

  • 可以简单理解成,处理输入,完成输出

    • python中,函数输出可以有多种:无输出,一输出,多输出(即可以有不止一个返回值)
  • 可以通过"输入参数=",来指定默认值

📖7.2 匿名函数

也成为lambda函数,一种快速定义单行函数的方式。

python 复制代码
lambda arguments: expression
		参数列表	表达式

📖7.3 构建模块,库

  • 构建模块
    • 将几个相关函数放置在同一个文件中
    • 在其他文件中引用该文件即可使用该文件当中的函数
  • 构建库
    • 创建一个文件夹,用于存放库的代码文件
    • 在文件夹中创建一个setup.py文件,引入setuptools库,使用setup()函数,来描述库的信息,包括名称,版本,作者,依赖,模块文件等信息
    • 之后创建一个__ init __.py的空文件声明这是一个python包

📗8.可视化

📖8.1 一幅图的结构

  • 图像区域:整个绘图区域的边框,可以包含一个或多个子图
  • 子图区域:实际绘图区域,包含坐标轴、绘制的图像和文本标签等
  • 坐标轴:显示子图数据范围并提供刻度标记和标签的对象
  • 脊柱:连接坐标轴和图像区域的线条,通常包括上下左右四条
  • 标题:描述整个图像内容的文本标签,通常位于中心位置或上方
  • 刻度:刻度标记,表示坐标轴上的数据值
  • 标签:用于描述坐标轴或图像的文本标签
  • 图例:标识不同数据系列的图例,通常用于区分不同数据系列或数据类型
  • 艺术家:在Matplotlib中,所有绘图元素都被视为艺术家对象,包括图像区域,子图区域,坐标轴,刻度,图例等等。

matplotlib和seaborn生成的都是静态图,也就是图片。

📖8.2 绘图常用api

api 所属包 作用
linespace(start,stop,num=50,endpoint=True(是否包含结束点)) numpy 生成在给定范围内的等差数列
sin() numpy 计算给定角度的正弦值
cos() numpy 计算给定角度的余弦值
deg2rad()&rad2deg() numpy 角度转弧度/弧度转角度
subplots(rows,cols,figsize=(num1,num2)) matplotlib 创建一个新图形和轴对象
add_subplot() matplotlib 创建一个新子图对象
plot(x,y,label,color,linewidth) matplotlib 用于绘制曲线
set_title() matplotlib 设置标题
set_xlabel()/set_ylabel() matplotlib 设置x/y轴标签
legend() matplotlib 添加图例
set_xlim()/set_ylim() matplotlib 设置横轴/纵轴范围
set_xticks() matplotlib 设置横轴刻度的位置
set_xticklabels() matplotlib 设置横轴刻度的标签
set_aspect('equal') matplotlib 横纵轴采用相同的比例,保持图形绘制时不会因为坐标比例问题产生形变

📖8.3 图片输出格式

  • PNG :常见位图格式,支持透明度和压缩。输出的图片不是矢量图,放大时会失去清晰度。但可以保留细节
  • JPG/JPEG:常见的有损压缩位图格式,用于存储照片和复杂的图像。会失去一些细节,但文件通常较小
  • EPS:矢量图格式。可以无限放大二不失真。
  • PDF:常见文档格式,可以包含矢量图和位图。可以无限放大而不失真
  • SVG:基于XML的矢量图格式。可以无限放大而不失真,且文件大小通常较小。

📕9. 二维可视化

📖9.1 散点图

二维散点图是平面直角坐标系中一种用于可视化二维数据分布的图形表示方法。由一系列离散的数据点组成,其中每个数据点都由两个坐标值。

  • matplotlibs中的scatter()函数可以用于创建散点图。

  • matplotlib.pyplot.scatter()函数来指定数据点的坐标和其他绘图参数。

  • 利用seaborn.scatterplot()来绘制散点图

    python 复制代码
    import seaborn as sns
    
    sns.scatterplot(data=data_frame,x="x_variable",y="y_variable")
  • 利用plotly.express.scatter()绘制散点图

    python 复制代码
    import plotly.express as px
    fig = px.scatter(data_frame, x="x_variable",y="y_variable")
    fig.show()

📖9.2 等高线

等高线图是一种展示三维数据的方式,其中相同数值的数据点被连接成曲线,形成轮廓线。

  • 可以使用contourf()函数来绘制填充等高线。

  • 为绘制平面等高线,可以使用numpy.meshgrid()产生网格数据,将输入的一维数组扩展为二维数组

  • 使用matplotlib.pyplot.contour(X,Y,Z,levels,camp)来绘制等高线

📖9.3 热图

可以使用matplotlib.pyplot.imshow()函数来绘制热图

python 复制代码
seaborn.heatmap(data, vmin, vmax, cmap, annot)
  • 有三维可视化,以及一些可视化的技巧,不再此处继续赘述。

📘10. Numpy

  • numpy最重要的功能之一是提供了高效的多维数组对象ndarray,可以用来表示向量,矩阵和更高维的数组。
  • 需要处理有标签,多维数组数据,可以使用xarray
  • NumPy 支持多种文件格式的读写操作,包括文本文件、二进制文件、CSV 文件等。
  • NumPy 提供了丰富的线性代数操作方法

📖10.1 数组

🔖10.1.1 概念

使用numpy.array()手动生成一维,二维,三维等数组

python 复制代码
numpy.array(object, dtype)
object:转换为数组的输入数据
dtype:用于指定数组的数据类型

形状:使用shape属性来获取数组的形状,即每个维度上的大小
长度:使用len()函数来获取数组的长度
维度:使用ndim属性来获取数组的维数
大小:使用size属性来获取数组的大小,即所有元素的个数

一维数组

可直接使用array()来生成

python 复制代码
a = numpy.array([-3,-2,-1,0,1,2,3])

二维数组

使用array()或matrix()来生成。matrix()专门用于生成二维矩阵

三维矩阵

使用array()生成

🔖10.1.2 数组变形

重塑数组,改变数组的形状,可以使用numpy.reshape()函数。其允许指定一个新的形状,然后返回一个拥有相同数据但具有新形状的数组。

numpy.reshape(a, newshape, order='C')
a:被重塑的数组,可为数组,python列表,元组等
newshape: 新的形状,可以是整数元组或列表,序列。
order: 重塑数组的元素在内存中存储的顺序,可以为C(按行),也可为F(按列)

常见:
改变数组维度:reshap(a,(2,3....))
展开数组:reshape(a,-1)
改变数组的顺序: reshape(a,(3,2),order='F')
(中间的代表维数,如(3,2),二维,3行2列)
注意:使用-1作为形状参数时,函数会根据数组中的数据数量和其他指定的维数来自动计算该维度的大小。
如:
行向量:reshape(a,(1,-1))
列向量:reshape(a,(-1,1))

📖10.2 数列

使用下面三个函数来生成数列

python 复制代码
numpy.arange(start, stop, step)
生成等差数列,从起始值start起,以步长step递增,直到结束值stop(不包含stop)

numpy.linspace(start, stop, num, endpoint)
生成等间距数列,从起始值start开始,到结束值stop结束,num指定数列的长度(元素的个数),默认为50.endpoint参数指定是否包含结束值。

numpy.logspace(start, stop, num, endpoint, base)
生成等比数列,从base的start次幂开始到base的stop次幂结束,num指定数列的长度,默认为50.endpoint指定是否包含参数。

📖10.3 网格数据

numpy.meshgrid()可以生成多维网格数据。

📖10.4 特殊数组

函数 yongtu
empty() 生成指定大小,未初始化的数组,数组内元素值随机
empty_like() 创建与给定数组有相同形状和数据类型的未初始化数组
eye() 创建二维单位矩阵数组
full() 创建一个指定大小和给定值的数组
full_like() 创建与给定数组相同形状和数据类型的数组,但值给定
ones() 创建一个指定大小,全为1的数组
ones_like() 创建与给定数组相同形状和数据类型的数组,但值都为1
zeros() 创建一个指定大小,全为0的数组
zeros_like() 创建与给定数组相同形状和数据类型的数组,但值都为0

📖10.5 数组导入导出

  • numpy.savetxt()可以把numpy array写成txt,CSV文件
  • numpy.genfromtxt()可以用来读入txt,CSV文件

📖10.6 索引

  • numpy中数组正向索引由0开始,逐个增加。逆向索引(从数组尾部),为-1,-2...

  • 使用numpy.newaxis,可以增加数组的维度

    python 复制代码
    一维数组 a[]
    a[:,numpy.newaxis],将一维数组变成列向量
    a[numpy.newaxis,:],将一维数组变成行向量
  • numpy.squeeze()可以从数组形状中删除单维度的条目。

📖10.7 切片

一维数组

切片访问一维数组中的子数组,可以使用:来实现

  • 开始索引指定第一个要获取的元素
  • 结束索引指定要获取的最后一个元素位置+1(即,不包含最后一个元素)
python 复制代码
整数切片:
使用a[start:end(:step)]
()内的是可以省略的,默认为1
布尔索引切片:
使用布尔值来选择数组中元素,通过一些条件来生成布尔数组,该数组与原数组形状相同
如:a[a>1],a[a<0]

二维数组

取出单个元素:a[] []来取出

取出行:使用a[[0,...],:]来取出,需要第几行就在[]内标明,若无[]则取出元素为一维数组

取出列:使用a[:,[0,...]]来取出,需要第几列就在[]内标明,若无[]则取出元素为一维数组

二维数组也可以使用布尔切片

📖10.8 视图和副本

视图:原始数组的一个新视图,与原始数组共享相同的数据。

副本:原始数组的一个完整拷贝,修改副本不会影响原始数组。对数据进行切片或使用numpy.copy(),会生成一个副本。(需要使用参数copy=True来实现)

  • 使用numpy.may_share_memory()可以判断两个数组是否共享内存

📖10.9 常见运算

常见函数

运算 函数
加法 add()
减法 subtract()
乘法 multiply()
除法 divide()
乘幂 power()
圆周率 pi
欧拉数 e
正无穷 inf
非数 NAN
最大值 max()
最小值 min()
平均值 mean()
标准差 std()
方差 var()
求和 sum()
加权平均数 average()
协方差 cov()
相关系数 correlate()

广播原则

将形状较小的数组扩展为与形状较大的数组相同,再进行运算。

例:一个m个元素行向量和一个n个元素列向量相运算,将其扩展成m*n的矩阵后再进行运算(相当于将这m个行向量复制n行,n个列向量复制m列)

  • 一维数组任意广播
  • 二维数组和一维数组进行广播运算时,需要二维列与一维元素个数匹配
  • 二维数组和列向量,需要行数匹配

📖10.10 转置

即:一个n*m的矩阵,转置后得到一个m * n的矩阵。

可以使用numpy.transpose()方法或.T属性,但两者返回的都是原矩阵的视图

📖10.11 扁平化

可以理解为reshape()的逆操作,将矩阵进行降维。

python 复制代码
array.ravel()
array.reshape(-1)
array.flatten()
numpy.ravel()
numpy.flatten()
来实现扁平化

注意:ravel和resahpe(-1)返回的是原始数组的视图,而flatten返回的是副本

📖10.12 旋转

  • numpy.rot90(),将一个数组逆时针旋转90°。返回的是原数组的视图。

  • numpy.flip(),用于翻转数组中的元素。可以沿着一个轴或多个轴进行翻转

    python 复制代码
    numpy.flip(A,axis=None)
    若无指定轴,整个数组沿着所有轴进行翻转

📖10.13 堆叠

沿行堆叠

numpy.stack()沿着指定轴将多个数组堆叠在一起,返回一个新数组。

numpy.row_stack()将多个数组沿行方向堆叠

numpy.vstack()将多个数组沿垂直方向(行方向)进行堆叠。

沿列堆叠

numpy.colum_stack()将多个一维数组沿列方向进行堆叠,形成二维数组

numpy.hstack()只有堆叠两个列向量时,才会生成二维数组。若是两个正常数组使用该方法堆叠,会合并成一个更长数组。

拼接

numpy.concatenate()可以沿行列方向完成数组的拼接。

叠三维

numpy.stack()可以将二维数组堆叠成三维。

📖10.14 重复

numpy.repeat()重复是数组中的每一个元素

numpy.tile()重复的是一整个数组

例:

python 复制代码
array: 1, 2, 3, 4, 5
np.repeat(array,2):1,1,2,2,3,3,4,4,5,5

np.tile(array,2):1,2,3,4,5,1,2,3,4,5

📖10.15 分块矩阵

合成

numpy.block()将多个数组沿不同的轴组成一个分块矩阵。接收一个嵌套列表作为输入,每个列表代表一个矩阵,根据指定的轴将这些矩阵连接在一起。

切割

numpy.split()将一个数组沿指定轴分割为多个子数组。

接受三个参数:要分割的数组、分割的索引位置、沿着哪个轴进行分割。

📖10.16 线性代数

在numpy的linalg模块中提供许多用于线性代数计算的函数。

常见函数

函数 作用
inv() 计算矩阵的逆
pinv() 计算矩阵的moore-penrose伪逆
solve() 求解线性方程组Ax=b。A为矩阵,b为列向量
lstsq() 最小二乘解
norm() 计算向量的模
dot() 计算向量点积
cholesky() 计算Cholesky分解
eig() 计算矩阵的特征值和特征向量
svd() 计算奇异值分解
A@B 矩阵乘法

格拉姆矩阵:它由向量集合的内积组成。给定一个向量集合 x 1 , x 2 , . . . , x n {x_1, x_2, ..., x_n} x1,x2,...,xn,则其对应的格拉姆矩阵 G 定义为 G = [ g i , j g_{i,j} gi,j],其中 g i , j = x i ∗ x j g_{i,j} = xi*xj gi,j=xi∗xj,表示第 i 个向量和第 j 个向量的内积。格拉姆矩阵是对称矩阵。

📙11. Seaborn可视化数据

Seaborn 是一个用于数据可视化的 Python 库,它基于 Matplotlib,并提供了一组高级的绘图函数和样式设置,可以轻松创建具有吸引力和专业外观的统计图表

  • 一元样本数据分布是指只包含一个随机变量的样本数据分布可视化

    一元样本分布的方法有:直方图 (histogram)、核密度估计 (Kernel Density Estimation, KDE)、毛毯图 (rug plot)、分散图 (strip plot)、小提琴图 (violin plot)、箱型图 (box plot)、蜂群图 (swarm plot)等等。

  • 二元样本数据分布则涉及两个随机变量。这种分布一般叫联合分布 (joint distribution)。我们可以通过相关性系数量化联合分布。

    可视化二元样本分布的方法有散点图 (scatter plot)、散点图 + 边缘直方图、散点图 + 毛毯图、散点图 + 回归图、频率热图、二元 KDE 等等图形和图形组合。

  • 边缘分布 (marginal distribution) 是指在多元数据分布中,对某一个或几个变量进行统计,而忽略其他变量的分布。

📖11.1 直方图

seaborn.histplot()用于绘制直方图。

重要输入:

  • data一般为Pandas数据帧
  • x为横轴标签
  • stat指定纵轴类型:
    • count:频数
    • probability:概率
    • density:概率密度
  • bins指定区间数量
  • binwidth指定区间宽度

频数 (frequency):直方图中每个区间内的样本数量被称为频数。它表示了数据落入该区间的次数或计数。

概率 (probability):是指某个事件发生的可能性。在直方图中,可以将频数除以总观测值的数量,得到每个区间的概率。这样计算得到的概率是相对频率,表示该区间中的观测值出现的相对概率。

概率密度 (probability density):是指在概率分布函数中某一点附近单位自变量取值范围内的概率。在直方图中,概率密度可以通过将每个区间的频数除以该区间的宽度得到。概率密度函数描述了变量的分布形状,而不是具体的概率值。

📖11.2 核密度估计KDE

核密度估计 (Kernel Density Estimation, KDE) 是一种非参数方法,用于估计连续变量的概率密度函数 (Probability Density Function, PDF)。它通过将每个数据点视为一个核函数 (通常是高斯核函数),在整个变量范围内生成一系列核函数,然后将这些核函数进行平滑和叠加,从而得到连续的概率密度估计曲线。

核密度估计的目标是通过在数据点附近生成高斯分布的核函数,捕捉数据的分布特征和结构。

📖11.3 分散点图

用来可视化一组分类变量与连续变量的关系。

使用searborn.stripplot()来绘制分散点图。分散点图适用于较小的数据集。数据点重叠较多时,使用seaborn.swarmplot()来避免重叠点问题。

📖11.4 蜂群图

用于可视化分类变量和数值变量关系的图表类型。它通过在分类轴上对数据进行分散排列,避免数据点的重叠,以展示数值变量在不同类别下的分布情况。每个数据点在分类轴上的位置表示其对应的数值大小,从而呈现出数据的密度和分布趋势。

用于比较不同类别之间的数值差异和趋势,适用于数据探索、特征分析和可视化报告等场景。

📖11.5 箱型图

箱型图 (box plot) 是一种常用的统计图表,用于展示数值变量的分布情况和异常值检测。它通过绘制数据的五个关键统计量 (最小值、第一四分位数 Q 1、中位数 Q 2、第三四分位数 Q3、最大值)以及可能存在的异常值来提供对数据的直观概览。

四分位:25%,50%,75%,100%

📖11.6 小提琴图

可以同时展示数据的分布形状、中位数、四分位数和离群值等信息。

seaborn.violinplot() 是 Seaborn 库中用于绘制小提琴图的函数。

📖11.7 聚类热图

seaborn.clustermap()函数用于创建聚类热图,它能够可视化数据集中的聚类结构和相似性。聚类热图使用层次聚类算法对数据进行聚类,并以热图的形式展示聚类结果。

聚类热图的原理是通过计算数据点之间的相似性(例如欧几里得距离或相关系数),然后使用层次聚类算法将相似的数据点分组为聚类簇。层次聚类将数据点逐步合并形成聚类树状结构,根据相似性的距离进行聚类的层次化过程。聚类热图将聚类树状结构可视化为热图

📗12.Pandas时间序列

📖12.1 时间序列

时间序列 (timeseries) 是指按照时间顺序排列的一系列数据点或观测值,通常是等时间间隔下的测量值,如每天、每小时、每分钟等。时间序列数据通常用于研究时间相关的现象和趋势,例如股票价格、气象数据、经济指标等。

处理:数据预处理,时间序列的可视化,时间序列的统计分析,时间序列的建模和预测

  • 创建时间序列:通过pandas.date_range()创建一个时间范围,或将字符串转换位时间序列对象
  • 时间序列索引:使用时间序列作为DataDrame的索引
  • 切片和索引:使用时间序列标签或位置
  • 重采样:将时间序列转换为不同的时间间隔
  • 移动窗口函数:对时间序列数据进行滑动窗口操作,计算滑动窗口内的统计指标
  • 分组操作:将时间序列数据按照时间维度进行分组,从而进行聚合操作
  • 聚合操作:对时间序列数据进行聚合操作
  • 可视化

📖12.2 缺失值

缺失值 :数据集中的某些值缺失或未被记录的情况

  • 处理方法:1.删除带有缺失值的样本或变量 2.使用常量填充缺失值 3. 使用回归模型,插值方法等技术对缺失值进行预测和填充 4. 对于分类变量,可以创建一个新的类别来表示缺失值

📖12.3 移动平均

时间序列的移动平均 (moving average, MA) 是一种常用的平滑技术,用于去除序列中的噪声和波动,以便更好地观察和分析序列的长期趋势。

移动平均通过计算序列中一段固定长度(通常称为窗口)内数据点的平均值来平滑序列。窗口的大小决定了平滑的程度,较大的窗口将平滑更多的波动,但可能会导致较长的滞后。

即:选一个窗口大小,计算窗口数据的平均值,逐步计算直到到达序列尾。就可以得到一系列数据。

📖12.4收益率

一般用于股票市场。

日收益率的计算公式为:日收益率 = (当日收盘价 − 前一日收盘价) / 前一日收盘价

📖12.5 统计分析

波动率

波动率:波动率是衡量其价格变动幅度的指标,常用的量化方法为历史波动率 (historical volatility)。历史波动率本质上就是一定回望窗口内收益率样本数据的标准差。

移动波动率:使用一个窗口来计算该序列的波动率,窗口持续移动,直到尾部

📖12.6 相关性

即:计算几个时间序列之间的相关性系数,来观测其关联程度。

相关推荐
萧鼎5 分钟前
【Python】计算机视觉应用:OpenCV库图像处理入门
python·opencv
子午35 分钟前
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
人工智能·python·深度学习
是个热心市民39 分钟前
构建一个导航栏web
前端·javascript·python·django·html
大哇唧1 小时前
python批量合并excel文件
开发语言·python·excel
墨城烟柳Q1 小时前
自动化爬虫-selenium模块万字详解
爬虫·python·selenium·自动化
raoxiaoya2 小时前
python安装selenium,geckodriver,chromedriver
开发语言·python·selenium
Dxy12393102162 小时前
python使用requests发送请求ssl错误
开发语言·python·ssl
gxchai2 小时前
利用pythonstudio写的PDF、图片批量水印生成器,可同时为不同读者生成多组水印
python
ao_lang2 小时前
剑指offer第五天
python·算法·cpp
这个男人是小帅3 小时前
【GCN】 代码详解 (1) 如何运行【pytorch】可运行版本
人工智能·pytorch·python·深度学习·分类