数据分析三剑客
数据分析三剑客
1.课程介绍和工具安装
1.1课程导论
数据分析的流程
- 数据收集:数据从哪里来
- 数据清洗:缺失值、错误数据、格式混乱
- 数据分析:统计(平均值、最大值、比例);分组数据对比
- 数据可视化:折线图、柱状图、散点图
数据分析工具链
- numpy:高性能数值计算(矩阵、向量),数据的发动机
- pandas:表格数据处理(类似于高级execl),数据的手术刀
- matplotlib:数据可视化(绘图库),数据的翻译官
Anaconda + Jupyter Notebook
课程主要内容
- 数据分析概述与环境搭建
- Numpy科学计算
- Pandas数据处理
- 数据可视化
- 项目实战
1.2 Anaconda
-
方便安装:就像安装一个应用程序一样简单,预先安装好了许多常用工具,无需单独配置。
-
包管理器:包含一个名为Conda的包管理器,用于安装、更新和管理软件包。
-
环境管理:可以轻松创建和管理多个独立的python环境
-
集成工具和库:捆绑了许多用于数据科学、机器学习和科学计算的重要工具和库。
-
跨平台:可在windows、macOS、Linux等操作系统上运行
https://blog.csdn.net/kinsman2016/article/details/134861263
由于本人电脑已经安装了python,后续实战使用的是pip
1.3 Jupyter笔记本的使用(pycharm中集成Jupyter)
pip install pandas numpy matplotlib seaborn faker
pip install jupyter
快捷键 | 功能 |
---|---|
esc | 从输入模式退出到命令模式 |
a | 在当前cell上面创建一个新的cell |
b | 在当前cell下面创建一个新的cell |
dd | 删除当前cell |
m | 切换到markdown模式 |
y | 切换到code模式 |
ctrl+回车 | 运行cell |
shift+回车 | 运行当前cell,并创建一个新的cell |
在命令行输入如下命令,启动jupyter服务
jupyter notebook
在命令行查看对应的,登录字符串,每次token都不一样
http://127.0.0.1:8888/tree?token=bf1950fb7cc439719c200ae9e454c3b52904da329f0670d2
在浏览器中复制粘贴上述字符串,即可使用jupyter 编写代码了。
或者直接在pycharm中新建jupyter 文件,直接使用pycharm编辑和运行即可。
2.Numpy科学计算
2.1 Numpy介绍
是 Python 生态中用于科学计算的核心库,提供高性能的多维数组对象(ndarray)及数学运算工具,是数据科学、机器学习和数值计算的基础依赖
2.2 ndarray
高效存储同构数据(同类型元素),支持向量化操作(无需显式循环)。
维度(shape):一维向量、二维矩阵、更高维张量
属性名称 | 通俗解释 | 使用示例 |
---|---|---|
shape | 数组的形状:行数和列数(或更高维度的尺寸) | arr.shape |
ndim | 维度数量(1,2,3) | arr.ndim |
size | 总元素个数:数组中所有元素的总数 | arr.size |
dtype | 元素类型:整数、浮点数、字符串等 | arr.dtype |
T | 转置:行变列,列变行 | arr.T |
itemsize | 单个元素占用的内存字节数 | arr.itemsize |
nbytes | 数组内存占用量:size * itemsize | arr.nbytes |
flags | 内存存储方式:是否连续存储(高级优化) | arr.flags |
2.2.1 多维性
import numpy as np
arr = np.array(5) # 0维数组
print(arr)
print(arr.ndim) # 数组的维度
import numpy as np
arr = np.array([1, 2, 3]) # 1维数组
print(arr)
print(arr.ndim) # 数组的维度
import numpy as np
arr = np.array([[1, 2, 3],[2, 3 ,4]]) # 2维数组
print(arr)
print(arr.ndim) # 数组的维度
2.2.2 同质性
import numpy as np
arr = np.array([1, 'hello']) # 不同的数据类型,会被强制转换为相同的数据类型
print(arr) # ['1' 'hello']
arr = np.array([1, 2.8]) # 数据类型强行转换为浮点数
print(arr) # [1. 2.8]
2.2.3 属性
arr = np.array([[1,2,3],[2,3,4]])
print(arr.ndim) # 2
print(arr.shape) #(2,3)
print(arr.dtype) # int64
print(arr.size) # 6
print(arr.itemsize) # 8
print(arr.nbytes) # 48
print(arr.T) # 转置
print(arr.flags)
2.2.4 ndarray的创建方法
1.基础构造:适用于手动构建小规模数组或复制已有数据
2.预定义形状填充:用于快速初始化固定形状的数组(如全0占位、全1初始化)
3.基于数值范围生成:生成数值序列,常用于模拟时间序列、坐标网格等
4.特殊矩阵生成:数学运算专用(如线性代数中的单位矩阵)
5.随机数组生成:模拟实验数据、初始化神经网络权重等场景
6.高级构造函数:处理非结构化数据(如文件、字符串)或通过函数生成复杂数组
用途 | 方法 |
---|---|
基础构造 | np.array() np.copy() |
预定义形状填充 | np.zeros() np.ones() np.empty() np.full() |
基于数值范围生成 | np.arange() np.linspace() np.logspace() |
特殊矩阵生成 | np.eye() np.diag() |
随机数组生成 | np.random.rand() np.random.randn() np.random.randint() |
高级构造函数 | np.array() np.loadtxt() np.fromfunction() |
名称 | 维度 | 示例 | 备注 |
---|---|---|---|
标量 | 0 | 5,3,4 | 单个数字,无行列 |
向量 | 1 | [1,2,3] | 只有行或者列(一位数组) |
矩阵 | 2 | [[1,2,3],[2,3,4]] | 严格的行列结构(二维表) |
张量 | ≥3 | [[[1,2],[2,3]]] | 高阶数组(如RGB图像) |
矩阵类型 | 定义 | 例子 |
---|---|---|
零矩阵 | 所有元素为0 | [0 0] [0 0] |
单位矩阵 | 对角线上为1,其余为0 | [1 0] [0 1] |
对角矩阵 | 只有对角线有非0值 | [2 0] [0 3] |
对称矩阵 | A=AT(转置后和原来相同) | [1 2] [2 3] |
# 基础创建方法
list1 = [1, 2, 3]
arr = np.array( list1 , dtype=np.float32)
print(arr)
arr1 = np.copy(arr) # 元素和原始的数据相同,但不是同一个数组
print(arr1)
# 预定义形状
# 全0数组
arr = np.zeros((2, 3), dtype=np.uint8)
print(arr)# 全1的数组
arr = np.ones((3, 3), dtype=np.uint8)
print(arr)# 未初始化
arr = np.empty((2, 3), dtype=np.float32)
print(arr)# 全部填充同一个数值
arr = np.full((2, 3), fill_value=3)
print(arr)
# 基于数值范围生成(等差数列)
arr = np.arange(1, 10, 2) # start, end, step
print(arr)
# 等间隔数列
arr = np.linspace(0, 2 * np.pi, 50) # start, stop, num
print(arr)# 对数间隔数列
arr = np.logspace(0, 1, 20, base=2) # start, stop, num
print(arr)
# 特殊矩阵
# 单位矩阵,主对角线上的元素为1, 其他元素为0
arr = np.eye(3, 4, dtype=np.uint8) # N, M
print(arr)# 对角矩阵,主对角线上是非0的数字,其他的数字为0
arr = np.diag([1, 2, 3])
print(arr)
# 随机数的生成
# 生成0-1之间的随机浮点数,均匀分布
arr = np.random.rand(2, 3) # 2行3列
print(arr)# 生成指定范围区间的随机浮点数 np.random.uniform(low=0.0, high=1.0, size=None)
arr = np.random.uniform(3, 6, size=(2, 3))
print(arr)# 生成指定范围区间的随即整数
arr = np.random.randint(3,10,(2,3))
print(arr)# 生成随机数列--正态分布,两边小,中间大
arr = np.random.randn(2,3)
print(arr)# 设置随机种子
np.random.seed(20)
arr = np.random.randint(1, 10, (2, 5))
print(arr)
2.2.5 ndarray的数据类型
数据类型 | 说明 |
---|---|
bool | 布尔类型 |
int8 int16 int32 int64 uint8 uint16 uint32 uint64 | 有符号、无符号的 8位(1字节)整型 有符号、无符号的16位(2字节)整型 有符号、无符号的32位(4字节)整型 有符号、无符号的64位(8字节)整型 |
float16 float32 float64 | 半精度浮点型、单精度浮点型、双精度浮点型 |
complex64 complex128 | 用2个32位浮点数表示的复数 用2个64位浮点数表示的复数 |
# ndarray的数据类型
# bool
arr = np.array([1, 0, -1], dtype=np.bool)
print(arr)
#整数
arr = np.array([1, 0, -1], dtype=np.int8)
print(arr)
#浮点数
arr = np.random.uniform(2,9,(3,4))
print(arr)
#复数
real = np.array([1,2,3])
imag = np.array([3,4,5])
complex_arr = real + 1j*imag
print(complex_arr)x = np.real(complex_arr)
y = np.imag(complex_arr)
print(x, y)
2.2.6 索引和切片
索引、切片类型 | 描述、用法 |
---|---|
基本索引 | 通过整数索引直接访问元素,索引从0开始 |
行列切片 | 使用 : 切片语法,选择行列的子集 |
连续切片 | 从起始索引到结束索引按步长切片 |
使用slice函数 | 通过slice(start,stop, step)定义切片规则 |
布尔索引 | 通过布尔条件筛选满足条件的元素,支持逻辑运算符& | |
# 一维数组的索引与切片arr = np.random.randint(1, 100, 30)
print(arr)# 下标索引
print(arr[0])
# 连续切片
print(arr[0:10])
# 布尔
print(arr[arr>10])# 布尔索引
print(arr[ (10<arr) & (arr<50)])# slice函数,等价于 index=2 到index=7
print(arr[slice(2, 7)])
# 二维数组的索引与切片arr = np.random.randint(1, 100, (6, 7))
print(arr)
# 行列index
print(arr[2, 3])# 行列切片范围
print(arr[0:2, 0:3])# bool 返回一个一维数组
print(arr[arr>50])# 嵌套使用
print(arr[2][arr[2]>50])print(arr[:, 3][arr[:, 3] > 50])
2.2.7 ndarray的运算
# 算术运算 ,对应的元素做算术运算
a = np.array([1,2,3])
b = np.array([2,3,4])
print(a+b)
print(a-b)
print(a*b)
print(a/b)
# 二维数组 也是对应位置的元素互相算术运算
a = np.array([[1,2,3],[4,5,6]])
b = np.array([[1,2,3],[4,5,6]])
print(a+b)
print(a-b)
print(a*b)
print(a/b)print(a+3) # 每个元素+3
print(a*3) # 每个元素*3
import numpy as np
# 广播机制 1.先获取shape 2.是否广播
# 同一纬度 或者行列为=其中一个为1,
a = np.array([1,2,3]) # 1*3
b = np.array([[2],[3],[4]]) # 3*1
print(a)
print(b)
print(a+b)
print(a-b)
"""
a:扩充
1 2 3
1 2 3
1 2 3b:扩充
2 2 2
3 3 3
4 4 4
"""
# 矩阵相乘(@)运算
"""
前提条件:左矩阵的列数必须等于右矩阵的行数(即若 A为 m×n 矩阵,则 B 必须是 n×p 矩阵)
运算规则:结果矩阵 C 的维度为 m×p(行数同左矩阵,列数同右矩阵)元素计算:即左矩阵第 i 行与右矩阵第 j列的点积)C11 = [1,2] * [3, 6] = 1*3 + 2*6 = 15c12 = [1,2] * [4, 7] = 1*4 + 2*7 = 18c13 = [1,2] * [5, 8] = 1*5 + 2*8 = 21C21 = [2,4] * [3, 6] = 2*3 + 4*6 = 30c22 = [2,4] * [4, 7] = 2*4 + 4*7 = 36c23 = [2,4] * [5, 8] = 2*5 + 4*8 = 42C31 = [3,4] * [3, 6] = 3*3 + 4*6 = 33c32 = [3,4] * [4, 7] = 3*4 + 4*7 = 40c33 = [3,4] * [5, 8] = 3*5 + 4*8 = 47c = [[15 18 21][30 36 42][33 40 47]]
"""
a = np.array([[1,2],[2,4],[3,4]]) # mxn = 3*2 3行2列
b = np.array([[3,4,5],[6,7,8]]) # nxp = 2*3 2行3列c = a @ b # c的预算结果应该是 mxp = 3*3 3行3列print(a @ b)
2.3 numpy 常用函数
基本数学函数 | 统计 | 比较 | 去重 | 其他 | 排序 |
---|---|---|---|---|---|
np.sqrt(x) | np.sum(x) | np.greater(a,b) | np.unique(x) | np.concatenate((a,b)) | np.sort(x) |
np.exp(x) :e为底的指数 | np.mean(x) | np.less(a,b) | np.in1d(a,b) | np.split(x, indices) | x.sort() |
np.log(x) | np.median(x) | np.equal(x,b) | np.reshape(x,shape) | np.argsort(x) | |
np.sin(x) | np.std(x) | np.logical_and(a,b) | np.copy(x) | np.lexsort(keys) | |
np.abs(x) | np.var(x) | np.where(condition,x,y) | np.isnan(x) | ||
np.power(x1,x2): x1底 x2:指数 | np.min(x) np.max(x) | ||||
np.round(x) | np.percentitle(x, q) |
2.3.1基本函数
# 计算平方根
a = np.sqrt(7)
print(a)
a = np.sqrt([1,2,3])
print(a)
arr = np.array([1,2,3])
a = np.sqrt(arr)
print(a)# 计算指数
print(np.exp(1)) # e的1次方 2.71828# 计算自然对数 lnx
print(np.log(2.71))# 计算三角函数的值
print(np.sin(np.pi/2))
print(np.cos(np.pi))# 计算绝对值
arr = np.array([-1, 2, -3])
print(np.abs(arr))# 计算a^b
arr = np.array([-1, 2, -3])
print(np.power(arr, 2))# 向上取整
arr = np.array([-1.5, 2.5, -3.223])
print(np.ceil(arr))#向下取整
print(np.floor(arr))# 检测缺失值 NaN 空值
arr = np.array([-1.5, 2.5, -3.223, np.nan])
np.isnan(arr)
2.3.2统计函数
arr = np.random.randint(1, 20, 10)
print(arr)
# 求和
print(np.sum(arr))
# 平均值
print(np.mean(arr))
# 中位数 如果是奇数个,就是排序后中间的值, 如果是偶数个,就是排序后中间两位数的平均值
print(np.median(arr))
# 方差 1 2 3的平均值是2 方差=(1-2)^2 + (2-2)^2 + (3-2)^2
print(np.var([1,2,3]))
# 标准差 是方差开根号 ,表示数据的离散程度,质量控制、风险评估,值越小,越稳定
print(np.std([1,2,3]))
# 最大值,以及下标
print(np.max(arr), np.argmax(arr))# 最小值
print(np.min(arr), np.argmin(arr))
# 分位数, 统计出20%的数字小于计算出来的结果
print(np.percentile(arr, 20))
# 累积和 An 等于前n个数的和
arr = np.array([1,2,3])
print(np.cumsum(arr)) # [1 3 6]
# 累积积 An = 前n个数的积
print(np.cumprod(arr))
2.3.3比较函数
# 大于、小于、等于
print(np.greater([3,4,5,6,7], 4)) # [False False True True True]
print(np.less([3,4,5,6,7], 4)) # [ True False False False False]
print(np.equal([3,4,5,6,7], 4)) # [False True False False False]
print(np.equal([1,2,3],[3,2,3])) # [False True True]# 逻辑与或非
print(np.logical_and([0,1],[1,1])) # [False True]
print(np.logical_not([0,1])) # [ True False]
print(np.logical_or([0,1],[1,1])) # [ True True]
#检查数组中是否所有的都为True,或者有一个为True
print(np.all([0,0,0,1])) # False
print(np.any([0,0,0,1])) # True# 自定义条件
# print(np.where(条件, 符合条件, 不符合条件))
arr = np.array([1,2,3,5,6])
print(np.where(arr>3, arr, 0)) # [0 0 0 5 6]score = np.random.randint(50, 100, 45)
score_80 = np.sum(np.where(score>80, 1, 0)) # 计算出大于80分的学生的人数
print(score_80)# np.where 嵌套使用
print(np.where(score>=80,'优秀',np.where(score>=60, '良好', '不及格')))
# np.select(条件, 返回结果)
print(score)
print(np.select([score>=80, (score<80) & (score>=60), score < 60],['优秀', '良好', '不及格'], default='未知'))
2.3.4去重
# 去重
print(np.unique(arr))
2.3.5其他
# 数组的拼接
arr1 = np.array([1,2,3])
arr2 = np.array([4,5,6])
print(np.concatenate((arr1, arr2)))# 数组的分割
arr = np.random.randint(1, 30, 20)
print(arr)
print(np.split(arr, 2)) # 分割为2份
print(np.split(arr, [3,6])) # 按照下标进行分割