Python数据分析基础(一)
一、数据分析概述与环境搭建
数据分析学习主要涵盖以下几个部分:
- 数据分析概述与环境搭建
- Numpy 科学计算
- Pandas 数据处理
- 数据可视化
- 项目实战
1.2 Anaconda 安装
Anaconda 简介
Anaconda 是一个用于科学计算的 Python 发行版,包含了众多流行的科学计算、数据分析的 Python 包。下面将 Anaconda 方案与原生 Python+pip 方案从多个维度进行对比:
对比维度 | Anaconda 方案 | 原生 Python+pip 方案 |
---|---|---|
安装难度 | 一键安装所有工具 | 需手动装每个库 |
依赖管理 | Conda 自动解决依赖冲突 | pip 可能遇到版本兼容问题 |
磁盘占用 | 较大 (3GB + 基础包) | 可按需安装 (最小仅几十 MB) |
适用场景 | 初学者 / 快速开始数据分析 | 开发者 / 需要精确控制环境 |
典型案例 | 学校教学 / 个人学习 | 生产服务器部署 |
1.3 Jupyter 笔记本的使用
Jupyter 是一个开源的交互式计算环境,广泛应用于数据科学、机器学习、科学研究等领域,主要组件有 Jupyter Notebook 和 Jupyter Lab。
JupyterLab 作为 Jupyter Notebook 的继承者,提供了更现代化和功能丰富的界面。其多文档界面、内置协作功能和扩展系统使其成为数据科学家和研究人员的首选。
在 PyCharm 中集成 Jupyter
在 PyCharm 中可通过以下路径创建 Jupyter Notebook:New -> Jupyter Notebook
Jupyter 快捷键
快捷键 | 功能 |
---|---|
esc | 从输入模式退出到命令模式 |
a | 在当前 cell 上面创建一个新的 cell |
b | 在当前 cell 下面创建一个新的 cell |
dd | 删除当前 cell |
m | 切换到 markdown 模式 |
y | 切换到 code 模式 |
ctrl + 回车 | 运行 cell |
shift + 回车 | 运行当前 cell 并创建一个新的 cell |
二、Numpy 科学计算
2.1 Numpy 介绍
numpy 是 Python 中科学计算的基础包。它是一个 Python 库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/O、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。
numpy 的部分功能如下:
- ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。
- 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。
- 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。
- 线性代数、随机数生成以及傅里叶变换功能。
- 用于集成由 C、C++、Fortran 等语言编写的代码的 API。
2.2 ndarray
ndarray 的核心特性
- 多维性:支持 0 维(标量)、1 维(向量)、2 维(矩阵)及更高维数组。
- 同质性:所有元素类型必须一致(通过 dtype 指定)。
- 高效性:基于连续内存块存储,支持向量化运算。
ndarray 的属性
属性名称 | 通俗解释 | 使用示例 |
---|---|---|
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 |
矩阵相关概念
矩阵是一个由行(row)和列(column)排列成的矩形数组。
名称 | 维度 | 示例 | 备注 |
---|---|---|---|
标量 | 0 维 | 5, 3.14 | 单个数字,无行列 |
向量 | 1 维 | [1, 2, 3] | 只有行或列(一维数组) |
矩阵 | 2 维 | [[1, 2], [3, 4]] | 严格的行列结构(二维表) |
张量 | ≥3 维 | [[[1, 2], [3, 4]]] | 高阶数组(如 RGB 图像) |
一些特殊矩阵:
- 零矩阵:所有元素为 0。
- 单位矩阵:对角线上为 1,其余为 0。
- 对角矩阵:只有对角线有非零值。
- 对称矩阵:A=Aᵀ(A 的转置等于自身)。
ndarray 的数据类型
数据类型 | 说明 |
---|---|
bool | 布尔类型 |
int8、uint8 | 有符号、无符号的 8 位(1 字节)整型 |
int16、uint16 | 有符号、无符号的 16 位(2 字节)整型 |
int32、uint32 | 有符号、无符号的 32 位(4 字节)整型 |
int64、uint64 | 有符号、无符号的 64 位(8 字节)整型 |
float16 | 半精度浮点型 |
float32 | 单精度浮点型 |
float64 | 双精度浮点型 |
complex64 | 用两个 32 位浮点数表示的复数 |
complex128 | 用两个 64 位浮点数表示的复数 |
ndarray 的创建
ndarray 的创建方法多样,适用于不同场景:
创建方式 | 方法 | 用途 |
---|---|---|
基础构造 | np.array()、np.copy() | 适用于手动构建小规模数组或复制已有数据。 |
预定义形状填充 | np.zeros、np.ones()、np.empty()、np.full() | 用于快速初始化固定形状的数组(如全 0 占位、全 1 初始化)。 |
基于数值范围生成 | np.arange()、np.linspace()、np.logspace() | 生成数值序列,常用于模拟时间序列、坐标网格等。 |
特殊矩阵生成 | np.eye()、np.diag() | 数学运算专用(如线性代数中的单位矩阵)。 |
随机数组生成 | np.random.rand()、np.random.randn()、np.random.randint() | 模拟实验数据、初始化神经网络权重等场景。 |
高级构造方法 | np.loadtxt()、np.array()、np.fromfunction() | 处理非结构化数据(如文件、字符串)或通过函数生成复杂数组。 |
1.基础构造方法
import numpy as np
# 直接从列表创建数组
arr = np.array([1, 2, 3, 4, 5])
print(arr) # 输出:[1 2 3 4 5]# 从列表变量创建数组
list1 = [1, 2, 3, 4, 5]
arr1 = np.array(list1)
print(arr1) # 输出:[1 2 3 4 5]
2. 复制数组
import numpy as np
# 复制数组(生成独立副本)
arr2 = np.copy(arr1)
print("原始数组arr1:", arr1) # 输出:原始数组arr1: [1 2 3 4 5]
print("复制数组arr2:", arr2) # 输出:复制数组arr2: [1 2 3 4 5]# 修改复制数组不影响原始数组
arr2[0] = 10
print("修改后arr1:", arr1) # 输出:修改后arr1: [1 2 3 4 5]
print("修改后arr2:", arr2) # 输出:修改后arr2: [10 2 3 4 5]
3. 全 0 数组
import numpy as np
# 创建2行3列的全0数组(默认float类型)
arr3 = np.zeros((2, 3))
print(arr3)
# 输出:
# [[0. 0. 0.]
# [0. 0. 0.]]# 创建一维全0数组
arr3 = np.zeros((2,))
print(arr3) # 输出:[0. 0.]
4. 全 1 数组
import numpy as np
# 创建5行8列的int类型全1数组
arr4 = np.ones((5, 8), dtype=int)
print(arr4)
# 输出:
# [[1 1 1 1 1 1 1 1]
# [1 1 1 1 1 1 1 1]
# [1 1 1 1 1 1 1 1]
# [1 1 1 1 1 1 1 1]
# [1 1 1 1 1 1 1 1]]
5. 未初始化数组(谨慎使用)
import numpy as np
# 创建3行4列的未初始化数组(元素值为随机垃圾值)
arr5 = np.empty((3, 4))
print(arr5) # 输出结果为随机值,每次运行可能不同
6. 指定值填充数组
import numpy as np
# 创建3行4列的全5数组
arr6 = np.full((3, 4), 5)
print(arr6)
# 输出:
# [[5 5 5 5]
# [5 5 5 5]
# [5 5 5 5]]
7. 形状复制类数组
import numpy as np
# 创建与arr6形状相同的全0数组
arr7 = np.zeros_like(arr6)
print(arr7)
# 输出:
# [[0 0 0 0]
# [0 0 0 0]
# [0 0 0 0]]# 创建与arr7形状相同的全2025数组
arr8 = np.full_like(arr7, 2025)
print(arr8)
# 输出:
# [[2025 2025 2025 2025]
# [2025 2025 2025 2025]
# [2025 2025 2025 2025]]
8. 数值范围生成数组
import numpy as np
# 生成等差数列(1到10,步长2)
arr9 = np.arange(1, 10, 2)
print(arr9) # 输出:[1 3 5 7 9]# 生成等间隔序列(0到10,取5个点)
arr10 = np.linspace(0, 10, 5)
print(arr10) # 输出:[ 0. 2.5 5. 7.5 10. ]# 生成特定步长序列(0到100,步长25)
arr11 = np.arange(0, 101, 25)
print(arr11) # 输出:[ 0 25 50 75 100]# 生成对数间隔序列(以2为底,0到4次方,取3个点)
arr12 = np.logspace(0, 4, 3, base=2)
print(arr12) # 输出:[ 1. 4. 16.]
9. 特殊矩阵构造
import numpy as np
# 创建3x3单位矩阵
arr1 = np.eye(3, dtype=int)
print(arr1)
# 输出:
# [[1 0 0]
# [0 1 0]
# [0 0 1]]# 创建3x4单位矩阵
arr2 = np.eye(3, 4, dtype=int)
print(arr2)
# 输出:
# [[1 0 0 0]
# [0 1 0 0]
# [0 0 1 0]]# 创建对角矩阵(对角线元素为1,2,3)
arr3 = np.diag([1, 2, 3])
print(arr3)
# 输出:
# [[1 0 0]
# [0 2 0]
# [0 0 3]]
10. 随机数组生成
import numpy as np
# 生成3行4列的0-1均匀分布随机浮点数
arr4 = np.random.rand(3, 4)
print(arr4)
# 输出示例:
# [[0.01509913 0.77429605 0.08387621 0.11136891]
# [0.46665429 0.932956 0.45962575 0.16040936]
# [0.63886266 0.40999997 0.9272048 0.65846277]]# 生成2行2列的3-6区间均匀分布随机浮点数
arr5 = np.random.uniform(3, 6, (2, 2))
print(arr5)
# 输出示例:
# [[5.94723917 4.73325818]
# [5.49598497 3.95144181]]# 生成2行2列的3-6区间随机整数
arr6 = np.random.randint(3, 6, (2, 2))
print(arr6)
# 输出示例:
# [[5 3]
# [4 5]]# 生成2行2列的标准正态分布随机数(均值0,标准差1)
arr7 = np.random.randn(2, 2)
print(arr7)
# 输出示例:
# [[-0.37140525 1.19865143]
# [-1.02207119 0.08113326]]# 设置随机种子(保证结果可复现)
np.random.seed(42)
arr8 = np.random.rand(2, 2)
print(arr8)
# 输出:
# [[0.37454012 0.95071431]
# [0.73199394 0.59865848]]
ndarray 的索引与切片
索引 / 切片类型 | 描述 / 用法 | |
---|---|---|
基本索引 | 通过整数索引直接访问元素,索引从 0 开始 | |
行 / 列切片 | 使用冒号: 切片语法选择行或列的子集 | |
连续切片 | 从起始索引到结束索引按步长切片 | |
slice 函数 | 通过slice(start, stop, step) 定义切片规则 | |
布尔索引 | 通过布尔条件筛选满足条件的元素,支持逻辑运算符& (与)、` | `(或) |
1. 基本索引(以 2 维数组为例)
import numpy as np# 创建一个3行4列的数组
arr = np.array([[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]])# 访问第2行第3列的元素(索引从0开始)
print("第2行第3列的元素:", arr[1, 2]) #第2行第3列的元素:7
2. 行 / 列切片
import numpy as nparr = np.array([[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]])# 取所有行的第2列元素(:表示所有行)
print("所有行的第2列元素:")
print(arr[:, 1]) # 输出:[ 2 6 10]# 取第2行的所有列元素
print("\n第2行的所有列元素:")
print(arr[1, :]) # 输出:[5 6 7 8]
3. 连续切片(按步长访问)
import numpy as np# 创建一个1维数组
arr = np.array([10, 20, 30, 40, 50, 60, 70, 80])# 从索引1开始到索引6结束,步长为2(不包含结束索引)
print("连续切片结果:", arr[1:6:2]) # 输出:连续切片结果: [20 40 60]
4. 使用 slice 函数
import numpy as nparr = np.array([10, 20, 30, 40, 50, 60, 70, 80])# 定义切片规则:从索引2开始,到索引7结束,步长为1
s = slice(2, 7, 1)
print("使用slice函数的切片结果:", arr[s]) # 输出:使用slice函数的切片结果: [30 40 50 60 70]
5. 布尔索引
import numpy as nparr = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])# 筛选出所有大于3的元素
bool_mask = arr > 3
print("大于3的元素:")
print(arr[bool_mask]) # 输出:[4 5 6 7 8 9]# 筛选出大于3且小于7的元素(注意布尔运算需用&,且条件需加括号)
bool_mask2 = (arr > 3) & (arr < 7)
print("\n大于3且小于7的元素:")
print(arr[bool_mask2]) # 输出:[4 5 6]