Python数据分析-闪电学习版
📊 数据分析简介
数据科学工作流
“数据科学是处理数据的科学,涵盖数据获取、处理、展示等多个环节。”

数据分析的流程
数据分析的基本流程如下:

获取数据(Obtain)

使用库:Scrapy
清洗数据(Scrub)

使用库:NumPy、Pandas
展示数据(Explore)

使用库:Matplotlib、Seaborn
数据建模(Model)

使用库:scikit-learn、SciPy、TensorFlow
解析数据(Interpret)

使用库:Bokeh、D3.js
步骤 常用库
获取数据 Scrapy
清洗数据 NumPy、Pandas
展示数据 Matplotlib、Seaborn
数据建模 scikit-learn、SciPy、TensorFlow
解析数据 Bokeh、D3.js
数据分析的定义
“数据分析是数据科学中的一个重要环节,指在统计学理论的支持下,使用合理的工具对相关数据进行处理,提炼出隐藏的重要信息。”

Python数据分析的关键库
Python 数据分析三剑客
在Python数据分析中,有三个重要的库被称为**“Python数据分析三剑客”**:

NumPy:用于高效的数值计算。
Pandas:用于数据处理和分析。
Matplotlib:用于数据可视化。
Excel与Python的区别
Excel适用于处理中小量数据,而Python适用于处理大量数据。

Python的设计理念
常见问题:

“Python不将所有功能集合到自身上,而是采用模块化设计,这是为了避免臃肿和性能下降。”

Python的设计者并未打算包揽所有功能,而是提供基础语法及常用模块,以保持语言的简洁性与高效性。
学习建议
学习Python数据分析的基础
“学习Python数据分析前,建议具备Python基础。”

对于没有基础的学习者,可以参考《从0到1:Python快速上手》或《从0到1:Python进阶之旅》。
常见问题解答
学习Python数据分析之前,要不要先去学习Excel?
学习数据分析之前,要不要先去学习网络爬虫?
对于每一章后面的练习题,我们要不要做呢?
对于学习数据分析,有什么好的学习方法推荐么?
使用VSCode
“学习数据分析时,使用VSCode作为开发环境是一个不错的选择。”

参考书中步骤
具体步骤请参考教材中的相关章节。
🐍 NumPy基础
📚 教学重点
了解 NumPy 是什么
掌握 列表 和 数组 的区别
掌握 数组 的基础操作
2.1 NumPy是什么
“对于 Python 来说,数据分析的‘三剑客’指的是:NumPy、Pandas、Matplotlib。NumPy 是用于科学计算的一个非常重要的库,主要用于操作一个多维数组。”

2.2 创建数组
在 Python 中,我们可以使用 NumPy 来生成一个数组。NumPy 是用来操作数组的,所以学习 NumPy,其实就是学习数组的各种操作。

数组与列表的区别
列表的元素可以是不同数据类型,而数组的元素必须是同一数据类型。
列表不可以进行四则运算,而数组可以进行四则运算。
常用创建数组的方法
方法 说明
array() 最常用方法
arange() 创建某个范围的数组,指定步长
linspace() 创建某个范围的数组,指定个数
zeros() 创建全0数组
ones() 创建全1数组

  1. 基本方法
    (1)array()方法
    在 NumPy 中,使用 array() 方法来创建一个数组。其语法为:

python
Copy
np.array(列表或元组)
(2)arange()方法
使用 arange() 方法创建元素值为“指定范围”的一维数组。其语法为:

python
Copy
np.arange(start, end, step)
注意:arange() 方法只能创建一维数组。

(3)linspace()方法
使用 linspace() 方法创建元素值为“指定范围”的一维数组。其语法为:

python
Copy
np.linspace(start, end, step, endpoint=True或False)
注意:arange() 需要指定步长,而 linspace() 需要指定个数。

(4)zeros()和ones()
使用 zeros() 方法创建一个全0数组,使用 ones() 方法创建一个全1的数组。其语法为:

python
Copy
np.zeros((a, b, …, n), dtype=int或float)
np.ones((a, b, …, n), dtype=int或float)
2. 随机数组
在 NumPy 中,可以使用 random 模块创建随机数组。主要方法如下:

方法 说明
randint(start, end) 随机整数,值范围为 [start, end)
rand() 随机浮点数,值范围为 [0, 1)
randn() 随机浮点数,符合正态分布
(1)randint()方法
使用 randint() 方法创建整型的随机数组。其语法为:

python
Copy
np.random.randint(start, end, size=元组或整数)
(2)rand()方法
使用 rand() 方法创建浮点型的随机数组,其元素的取值范围为 [0, 1)。其语法为:

python
Copy
np.random.rand(m, n)
(3)randn()方法
使用 randn() 方法生成一个随机数组,该数组的元素是符合正态分布的。其语法为:

python
Copy
np.random.randn(m, n)
3. 数组与列表的区别
数组和列表的本质区别在于内存中的存储方式不同。

2.3 数组属性
数组的常用属性如下表所示:

属性 说明
ndim 维度的个数,即多少维
shape 数组的形状,比如 m 行 n 列
size 元素的个数
dtype 元素的类型
数组的类型指的是数组每一个元素的类型,了解这一点非常重要。

2.4 元素操作
在 NumPy 中,数组元素的操作主要包括“增删查改”以及“切片”这五种方式:

访问元素(查)
修改元素(改)
添加元素(增)
删除元素(删)
切片方式

  1. 访问元素
    使用下标的方式来访问数组中的元素,和 Python 中的列表相同。

  2. 修改元素
    使用下标的方式来修改某一个元素的值。对于二维数组,可以修改整一行或整一列的值。

  3. 添加元素
    使用 append() 方法在数组的末尾添加一个新元素。其语法为:

python
Copy
np.append(arr, value, axis=n)
4. 删除元素
使用 delete() 方法来删除元素。其语法为:

python
Copy
np.delete(arr, m, axis=n)
5. 切片方式
通过切片的方式截取数组的一部分。对于二维数组,切片的语法依然适用,但行和列需要分别定义。

2.5 数组操作
NumPy 为我们提供了很多用于处理数组的方法,主要包括以下六个方面:

修改形状
修改维度
翻转数组
查找唯一值
合并数组
分割数组

  1. 修改形状
    使用 reshape() 方法来修改数组的形状。其语法为:

python
Copy
arr.reshape(m, n)
2. 修改维度
使用 array() 方法的 ndmin 参数来修改一个数组的维度。其语法为:

python
Copy
np.array(arr, ndmin=n)
3. 翻转数组
使用 transpose() 方法来翻转一个数组。其语法为:

python
Copy
np.transpose(arr)
4. 查找唯一值
使用 unique() 方法来查找数组中所有不同的数字。其语法为:

python
Copy
np.unique(arr)
5. 合并数组
合并数组的方法有多种,具体方法将在后续部分详细说明。

🧮 NumPy 数组合并与分割
数组合并

  1. 水平合并与垂直合并
    方法 说明
    hstack() 沿“现有轴”水平合并
    vstack() 沿“现有轴”垂直合并
    stack() 沿“新的轴”合并
  2. 使用 concatenate()
    在 NumPy 中,可以使用 concatenate() 方法来沿“现有轴”合并两个数组。

语法:
python
Copy
np.concatenate((arr1, arr2), axis=n)
注意: 当 axis=0 时,表示沿着“纵轴”合并(垂直堆叠),此时等价于 vstack()。

例子:
python
Copy

方式1

np.concatenate((arr1, arr2), axis=0)

方式2

np.vstack((arr1, arr2))
当 axis=1 时,表示沿着“横轴”合并(水平堆叠),此时等价于 hstack()。

例子:
python
Copy

方式1

np.concatenate((arr1, arr2), axis=1)

方式2

np.hstack((arr1, arr2))
3. 使用 stack()
在 NumPy 中,可以使用 stack() 方法来沿“新的轴”合并两个数组。

语法:
python
Copy
np.stack((arr1, arr2), axis=n)
数组分割
在 NumPy 中,如果想要对一个数组进行分割,可以使用以下三种方法:

方法 说明
split() 分割数组
hsplit() 分割数组(沿着横轴)
vsplit() 分割数组(沿着纵轴)
语法:
python
Copy
np.split(arr, section=整数或数组, axis=n)
数组运算
NumPy 提供了多种用于数组运算的方法,主要包括以下五大类:

基本运算
比较运算
标量运算
数学函数
统计函数

  1. 基本运算
    在 NumPy 中,数组可以进行加、减、乘、除、求幂等运算。对于数组的基本运算,我们有两种方式:

使用运算符
使用函数
运算符
运算符 说明


  • / 除
    % 求余
    ** 求幂
    函数
    函数 说明
    add(a, b) 加,等价于 a + b
    subtract(a, b) 减,等价于 a - b
    multiply(a, b) 乘,等价于 a * b
    divide(a, b) 除,等价于 a / b
    mod(a, b) 求余,等价于 a % b
    power(a, b) 求幂,等价于 a ** b
  1. 比较运算
    在 NumPy 中,可以使用比较运算符对两个数组进行大小比较。

运算符 说明

大于
< 小于
= 大于等于
<= 小于等于
== 等于
!= 不等于

  1. 标量运算
    标量和向量是两个不同的概念:向量是一组数,标量是一个数。标量运算可以理解为将一个数组和一个数进行加减乘除等操作。

  2. 数学函数
    NumPy 中提供多种数学函数,常用的如下:

函数 说明
square() 求平方
abs() 求绝对值
sqrt() 求平方根
around() 求四舍五入值
ceil() 向上取整
floor() 向下取整
reciprocal() 求倒数
sin() 求正弦
cos() 求余弦
tan() 求正切
📊 NumPy中的统计函数
统计函数概述
在NumPy中,统计函数用于对数组进行各种统计分析。常用的统计函数如下表所示:

函数 说明
sum() 求和
max() 求最大值
min() 求最小值
median() 求中位数
mean() 求平均数
var() 求方差
std() 求标准差
quantile() 求分位数

  1. 求和
    在NumPy中,我们使用 sum() 函数对一个数组进行求和。

语法:
python
Copy
np.sum(arr, axis=n)
2. 求最值
使用 max() 函数求数组的最大值,使用 min() 函数求数组的最小值。

语法:
python
Copy
np.max(arr, axis=n)
np.min(arr, axis=n)
3. 求中位数
中位数是指按顺序排序后处于中间位置的数。具体规则如下:

如果数字个数为奇数,如 5 个数:23、45、35、22、28,排序后为:22、23、28、35、45,中位数为 28。
如果数字个数为偶数,如 6 个数:23、45、35、22、28、32,排序后为:22、23、28、32、35、45,中位数为
KaTeX can only parse string typed expression
2
28+32

=30。
在NumPy中,我们使用 median() 函数求数组的中位数。

语法:
python
Copy
np.median(arr, axis=n)
4. 求平均数
使用 mean() 函数求数组的平均数。

语法:
python
Copy
np.mean(arr, axis=n)
5. 求方差
方差是指数据与平均数差的平方,用于衡量数据的离散程度。在NumPy中,我们使用 var() 函数求数组的方差。

语法:
python
Copy
np.var(arr, axis=n)
6. 求标准差
标准差是方差的平方根,用于表示数据的离散程度。在NumPy中,我们使用 std() 函数求数组的标准差。

语法:
python
Copy
np.std(arr, axis=n)
7. 求加权平均数
加权平均数是指根据每个数据出现的次数(权)计算的平均数。在NumPy中,我们使用 average() 函数求数组的加权平均数。

语法:
python
Copy
np.average(arr, axis=n)
8. 求百分位数
百分位数是指将一组数据从小到大排序后,计算每个数据所在的位置。最小值为第 0 百分位数,最大值为第 100 百分位数,中位数为第 50 百分位数。在NumPy中,我们使用 percentile() 函数求数组的百分位数。

语法:
python
Copy
np.percentile(arr, q, axis=n)
9. 求众数
众数是指一组数据中出现最多的数。众数可以有一个或多个。例如:

数组:10、20、30、40、10,众数为 10。
数组:10、20、30、40、20、10,众数为 10 和 20。
10. 方差与标准差的关系
方差的单位与数据的单位不一致,通常难以直接使用。通过对方差开平方,我们得到 标准差,使其单位与数据一致,因而在实用性上标准差更为常用。

遍历数组
在NumPy中,遍历数组使用 for 循环实现,语法如下:

python
Copy
for item in arr:

数组排序
使用 sort() 方法对数组进行排序。需要注意两种情况:

在数组对象上调用 sort() 方法,将对数组本身进行排序。
在 NumPy 上调用 sort() 方法,将返回该数组的排序副本。
语法:
python
Copy
arr.sort(axis=n)
np.sort(arr, axis=n)
练习题
单选题
下面有关NumPy的说法中,正确的是( )。

A. NumPy中只有一维数组和二维数组
B. 包含同样数据的数组和列表,数组更占内存
C. 我们可以使用中括号“[]”来创建一个数组
D. 数组元素的数据类型一般要求是相同的
如果想要求一个数组的方差,我们可以使用( )方法来实现。

A. mean()
B. median()
C. var()
D. std()
编程题
请使用NumPy提供的方法创建一个包含10个元素,并且值在100~900(包含900)之间的一维随机列表。

请创建一个5×4的二维数组,数组每一个元素都是0~100(包含100)之间的随机整数。

🐍 NumPy进阶
📚 教学重点
掌握深拷贝和浅拷贝的区别
掌握axis的值
掌握广播机制
掌握如何读写文件
了解矩阵是什么
3.1 浅拷贝和深拷贝
在大多数编程语言中,浅拷贝和深拷贝是非常重要的概念。在Python面试中,这也是经常考到的知识点。

  1. 浅拷贝
    定义:浅拷贝指的是对一个数组对象拷贝后,两个数组对象不同,但它们的数据是共享的,存在“藕断丝连”的关系。

方法:在NumPy中,可以使用 view() 方法来对一个数组进行浅拷贝。

语法:

python
Copy
arr.view()
2. 深拷贝
定义:深拷贝指的是对一个数组进行拷贝后,两个数组对象完全不同,数据也不共享,前后两个数组是“打死不相往来”的关系。

方法:在NumPy中,可以使用 copy() 方法来对一个数组进行深拷贝。

语法:

python
Copy
arr.copy()
3.2 axis的值
在NumPy中,多维数组的操作需要指定对哪一维进行操作,而axis用来指定需要操作的维数。

取值:
axis=0:表示对第1维进行操作(纵向)。
axis=1:表示对第2维进行操作(横向)。
二维数组操作示例
axis值 操作方向
0 纵向操作
1 横向操作
总结
一句话概括:如果 axis=n,那么NumPy将沿着“第n个下标”变化的方向进行操作。

3.3 广播机制
在NumPy中,如果两个数组的形状不同,但符合以下任意一种情况,就可以进行加减乘除运算:

维度不同时,两个数组的“后缘维度”相同。
维度相同时,有一个数组的某个轴长度为1。

  1. 维度不同
    如果两个数组的维度不同,但它们的“后缘维度”相同,这两个数组也可以进行运算。

  2. 维度相同
    如果两个数组的维度相同,但存在一个数组某条轴的长度为1,这两个数组也可以进行运算。

  3. 标量运算
    数组标量运算,本质上也是使用了广播机制。
    3.4 读写文件
    在实际开发中,有时需要从一个文件读取数组,或者将数组写入文件。NumPy通常使用CSV格式来读写文件。

  4. 读取文件
    使用 loadtxt() 方法从文件读取数组。

语法:

python
Copy
np.loadtxt(path, delimiter=“分割符”)
2. 写入文件
使用 savetxt() 方法将数组写入文件。

语法:

python
Copy
np.savetxt(path, arr, delimiter=“分割符”)
3.5 矩阵简介
在NumPy中,矩阵和数组是两种不同的数据类型,虽然它们很相似,但在本质上有区别。数组是 ndarray 对象,矩阵是 matrix 对象。

矩阵的特点
矩阵都是二维的,可以视为一种特殊的二维数组。
NumPy官方建议,当矩阵和数组可以通用时,选择使用数组。
矩阵创建方法
方法 说明
zero() 创建全0矩阵
ones() 创建全1矩阵
identity() 创建单位矩阵
rand() 创建随机矩阵

  1. 全0矩阵
    使用 matlib 模块的 zeros() 方法创建全0矩阵。

语法:

python
Copy
np.matlib.zeros((m, n))
2. 全1矩阵
使用 matlib 模块的 ones() 方法创建全1矩阵。

语法:

python
Copy
np.matlib.ones((m, n))
3. 单位矩阵
单位矩阵是指行数和列数相同,且从左上角到右下角对角线上的元素为1,其他元素为0。

使用 matlib 模块的 identity() 方法创建单位矩阵。

语法:

python
Copy
np.matlib.identity(m)
4. 随机矩阵
使用 matlib 模块的 rand() 方法来创建随机矩阵。

语法:

python
Copy
np.matlib.rand(m, n)
本章练习
一、单选题
如果想要使用NumPy读取一个CSV文件,我们可以使用( )方法来实现。

A. loadtxt()
B. loadcsv()
C. readtxt()
D. readcsv()
对于二维数组来说,下面说法中不正确的是( )。

A. 如果不设置axis,表示对所有元素进行操作
B. 如果axis=0,表示沿着纵轴进行操作
C. 如果axis=1,表示沿着横轴进行操作
D. 如果axis=2,表示沿着横轴进行操作
下面有一段代码,其运行结果是( )。

python
Copy
import numpy as np
arr = np.array([10, 20, 30, 40, 50])
print(arr - 10)
A. [0, 20, 30, 40, 50]
B. [0, 10, 20, 30, 40]
C. [10, 20, 30, 40, 40]
D. 报错
下面有一段代码,其运行结果是( )。

python
Copy
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b = np.array([[10], [20], [30]])
print(a + b)
下面有关矩阵的说法中,正确的是( )。

A. 矩阵和数组是一样的
B. 数组的方法都适用于矩阵
C. 所有矩阵都是二维的
D. 矩阵也是一个ndarray对象
📊 Pandas简介

  1. 什么是Pandas?
    Pandas是基于NumPy实现的一个非常重要的数据分析库,主要用于操作二维数据表。

Python数据分析“三剑客”
NumPy
Pandas
Matplotlib
2. Pandas的基本概念
2.1 数据结构
Pandas提供了两种主要的数据结构:

Series(系列):可以看成一种特殊的一维数组。
DataFrame(数据帧):可以看成一种特殊的二维数组。
3. Series的使用
3.1 创建Series
在Pandas中,可以使用Series()方法来创建一个“系列”。其语法为:

python
Copy
pd.Series(data, index=列表)
3.2 Series的属性
属性 说明
index 行名(索引)
values 数据(值)
3.3 获取某行的值
使用loc[]方法来获取Series某一行的值,其语法为:

python
Copy
se.loc[行名]
3.4 Series与字典的关系
Series和字典非常相似:

相似点:Series的index对应字典中的key,Series中的data对应字典中的value。
区别:
字典是无序的,而Series是有序的。
字典的key是不可变的,而Series的index是可变的。
Series提供了大量的统计方法,而字典则没有。
4. DataFrame的使用
4.1 创建DataFrame
在Pandas中,可以使用DataFrame()方法来创建一个“数据帧”。其语法为:

python
Copy
pd.DataFrame(data, index=列表, columns=列表)
4.2 DataFrame的属性
属性 说明
dtypes DataFrame的类型
values DataFrame的数据(值)
index 行名(索引)
columns 列名
shape 形状,即行数和列数
size 元素的个数
4.3 创建DataFrame时的元素格式
列表格式:

python
Copy
[
[“小杰”, “男”, 20],
[“小红”, “女”, 19],
[“小明”, “男”, 21]
]
字典格式:

python
Copy
[
{“name”: “小杰”, “gender”: “男”, “age”: 20},
{“name”: “小红”, “gender”: “女”, “age”: 19},
{“name”: “小明”, “gender”: “男”, “age”: 21}
]
5. 数据的增删查改
5.1 访问数据
在Pandas中,有两种主要方式来访问DataFrame中的数据:

loc[]或iloc[]:用于获取某些行或某些列的数据。
df[]:用于获取行或列。
5.2 修改数据
修改某一行或一列的数据,使用以下方式:

修改行:
python
Copy
df.loc[行名] = 新值 # 推荐使用
修改列:
python
Copy
df.loc[:, 列名] = 新值
5.3 添加数据
在DataFrame中添加一行或一列数据,可以使用:

添加行:

python
Copy
df.loc[行名] = 值 # 推荐使用
添加列:

python
Copy
df.loc[:, 列名] = 值
5.4 删除数据
在Pandas中删除某一行或某一列的数据,使用drop()方法:

删除行:

python
Copy
df.drop(行名或列表, axis=0)
删除列:

python
Copy
df.drop(列名或列表, axis=1)
6. 遍历DataFrame
6.1 遍历行
使用iterrows()方法遍历DataFrame的所有行:

python
Copy
for key, value in df.iterrows():

6.2 遍历列
使用iteritems()方法遍历DataFrame的所有列:

python
Copy
for key, value in df.iteritems():

7. 其他注意事项
DataFrame的一行或一列,本质上是一个Series。
DataFrame的多行或多列,本质上是一个DataFrame。
loc[]、iloc[]、df[]获取的结果是一个Series或一个DataFrame。
DataFrame不同列的数据类型可以不同,但同一列的数据类型要求相同。
8. 常见问题
Pandas总共有多少种数据结构?

Pandas提供2种数据结构:Series(系列)和DataFrame(数据帧)。
除了loc[]、iloc[]、df[],为什么不介绍ix[]?

因为Pandas从v0.20版本开始就不再支持ix[]。
如何获取某一列的数据?

使用df[“column_name”]方法获取某一列的数据。
如何删除某一行或某一列的数据?

推荐使用drop()方法,而不是del关键字。
📊 数据读写与分析
🎯 教学重点
掌握如何读写JSON、CSV、Excel、HTML
掌握如何读写数据库
掌握文件读写的高级技巧
📈 数据分析流程
在实际工作中,对于数据分析来说,通常的工作流程如下图所示:

(此处应有流程图,需根据实际内容补充)

📂 读写数据简介
在Pandas中,读写数据主要分为以下五种方式:

方法 说明
read_json() 读取JSON文件
read_csv() 读取CSV文件
read_excel() 读取Excel文件
read_html() 读取网页
read_sql() 读取数据库
对于Pandas读取文件的本质是将文件中的数据转换成一个DataFrame,而写入文件则是将一个DataFrame存放到一个文件中。

📥 读取数据的方法
方法 说明
read_json() 读取JSON文件
read_csv() 读取CSV文件
read_excel() 读取Excel文件
read_html() 读取网页
read_sql() 读取数据库
📝 写入数据的方法
方法 说明
to_json() 写入JSON文件
to_csv() 写入CSV文件
to_excel() 写入Excel文件
to_html() 写入网页
to_sql() 写入数据库
📄 读写JSON

  1. JSON简介
    JSON(JavaScript对象表示法)是一种轻量级的数据交换格式,主要用于数据的传输。JSON具有两种表示方式:

字典表示法
列表表示法
字典表示法示例:

json
Copy
{
“book”: “从0到1”,
“author”: “Jack”,
“price”: 59
}
列表表示法示例:

json
Copy
[
{“name”: “小杰”, “age”: 20},
{“name”: “小红”, “age”: 19},
{“name”: “小明”, “age”: 21}
]
2. 读取JSON
在Pandas中,可以使用read_json()方法来读取JSON文件,语法如下:

python
Copy
pd.read_json(path)
3. 写入JSON
使用to_json()方法将数据导出到JSON文件,语法如下:

python
Copy
df.to_json(df, index=布尔值, header=布尔值, force_ascii=布尔值)
📊 读写CSV

  1. CSV简介
    CSV(逗号分隔的值)是一种常见的文件格式,可以使用文本或电子表格的方式查看。CSV文件中的每一行代表电子表格中的一行,逗号分隔单元格。

  2. 读取CSV
    在Pandas中,可以使用read_csv()方法来读取CSV文件,语法如下:

python
Copy
pd.read_csv(path, index_col=m)
3. 写入CSV
使用to_csv()方法将数据导出到CSV文件,语法如下:

python
Copy
df.to_csv(df, index=布尔值, header=布尔值)
常见问题
read_csv()与read_table()的区别:
read_csv()使用英文逗号(,)作为分隔符
read_table()使用制表符(\t)作为分隔符
📅 读写Excel

  1. Excel简介
    Excel是Windows环境下强大的电子表格应用,常用于数据存储。

  2. 读取Excel
    在Pandas中,使用read_excel()方法读取Excel文件,语法如下:

python
Copy
pd.read_excel(path, index_col=m, sheet_name=n)
3. 写入Excel
使用to_excel()方法将数据导出到Excel文件,语法如下:

python
Copy
df.to_excel(df, index=布尔值, header=布尔值)
🌐 读写HTML
在Pandas中,使用read_html()方法读取网页中表格(即table标签)中的数据,语法如下:

python
Copy
pd.read_html(url, index_col=m, encoding=“utf-8”)
⚙️ 深入文件读写

  1. 分块读取
    使用chunksize参数定义每次读取的行数,仅适合read_csv()、read_json()、read_excel()方法。

  2. 只读取一部分
    利用nrows参数读取前n行数据,skiprows参数跳过前n行数据。适用于read_csv()、read_json()、read_excel()方法。

🗄️ 读写数据库

  1. 安装MySQL
    (参考书中步骤)

  2. 安装Navicat for MySQL
    (参考书中步骤)

  3. 读取MySQL
    使用pymysql模块连接并读取MySQL,步骤如下:

连接数据库
读取数据
关闭数据库
安装命令:

bash
Copy
pip install pymysql
📚 本章练习
一、单选题
如果想要对一个CSV文件进行分块读取,我们可以使用read_csv方法的( )参数来实现。

A. chunksize
B. index_col
C. nrows
D. skiprows
下面有关读写文件的说法中,正确的是( )。

A. Pandas只能对JSON、CSV、Excel这3种文件进行读写
B. read_html()方法可以读取一个网页中任意标签的数据
C. read_html()方法返回的是一个DataFrame
D. read_csv()方法返回的是一个DataFrame
二、问答题
深刻理解数据分析的工作流程,对于Pandas的学习是非常重要的。请把数据分析的工作流程默写出来。
📊 数据筛选与操作

  1. 教学重点
    掌握筛选数据的各种操作

  2. 筛选数据简介
    在实际工作中,数据的量往往是非常大的。获取了数据之后,很多时候我们并不需要对所有数据进行处理,而是选取一些必要的数据,这个时候就涉及到筛选数据。

  3. 选择行列:loc[]、iloc[]和df[]
    在Pandas中,如果想要获取某一行或某几行,可以使用以下三种方式:

方法 语法 说明
loc[] df.loc[行名] 通过行名获取行
iloc[] df.iloc[行索引] 通过行索引获取行
df[] df[m:n] 不推荐使用
获取列
获取某一列或某几列的方法同样适用上述三种方式:

方法 语法 说明
loc[] df.loc[:,列名] 通过列名获取列
iloc[] df.iloc[:,列索引] 通过列索引获取列
df[] df[列名] 推荐使用
4. 重新索引:reindex()
语法简介
在Pandas中,我们可以使用reindex()方法来选取某几行或某几列数据。

python
Copy
df.reindex(index=列表, columns=列表)
深入了解
虽然reindex()实现的效果,使用loc[]、iloc[]、df[]等方式也可以实现,但它们之间还是有着一定区别:

当行名或列表不存在时,使用reindex(),数据的值为NaN。
当行名或列表不存在时,使用loc[]、iloc[]、df[],程序会报错。
填充为其他值
在Pandas中,可以使用fill_value这个参数将“缺失的数据”填充为“指定值”。

python
Copy
df.reindex(index=列表, columns=列表, fill_value=n)
5. 获取首尾:head()和tail()
在Python中,我们可以使用head()方法获取前几条数据,也可以使用tail()方法获取后几条数据。

python
Copy
df.head(n)
df.tail(n)
6. 随机抽样:sample()
在Pandas中,我们可以使用sample()方法来随机选取一部分数据。

python
Copy
df.sample(n=整数)
df.sample(frac=小数)
7. 逻辑比较
在Pandas中,我们可以使用逻辑比较的方式来选取所需要的数据。

比较运算符
一般有以下六种比较运算符:

(大于)
= (大于等于)
< (小于)
<= (小于等于)
== (等于)
!= (不等于)
Python的逻辑运算符
运算符 说明
and 与
or 或
not 非
Pandas的逻辑运算符
运算符 说明
& 与
| 或
~ 非

  1. 过滤操作
    在Pandas中,除了逻辑比较外,我们还可以使用query()和filter()方法来对数据进行过滤。

query()方法
使用query()方法对指定的列进行数据过滤,语法如下:

python
Copy
df.query(判断条件)
filter()方法
使用filter()方法进行数据过滤,语法如下:

python
Copy
df.filter(items, like, regex)
9. 模式匹配
在Pandas中,可以使用以下三种方法判断是否包含某一个子字符串:

属性 说明
contains(A) 判断是否包含A
startswith(A) 判断是否以A开头
endswith(A) 判断是否以A结尾
10. 本章练习
单选题
如果想要查看前10行数据,下面哪一种方法是不正确的?

A. df.head(10)
B. df.iloc[:10]
C. df.iloc[:11]
D. df.loc[range(0, 10)]
如果想要随机抽取10行数据,可以使用( )方法来实现。

A. reindex()
B. head()
C. tail()
D. sample()
下面有一个DataFrame,如果想要获取年龄大于20且小于23之间(不包含20和23)的数据,哪一种方式是不正确的?

python
Copy
data = [
[“小杰”, “男”, 20],
[“小红”, “女”, 19],
[“小明”, “男”, 23],
[“小华”, “男”, 22],
[“小莉”, “男”, 19],
]
df=pd.DataFrame(data, columns=[“name”, “gender”, “age”])
A. df[(df[“age”] > 20) & (df[“age”] < 23)]
B. df.query(“20 < age < 23”)
C. df.query(“age > 20 and age < 23”)
D. df[df[“age”].between(20, 23)]
问答题
如果有未知行数的数据集,如何获取最后一行数据?请说一下你的思路。
下面有一个DataFrame,请回答对应几个问题。
python
Copy
import pandas as pd
data = [
[1001, “小杰”, “男”, 650, “一班”],
[1002, “小红”, “女”, 645, “一班”],
[1003, “小明”, “男”, 590, “二班”],
[1004, “小华”, “男”, 640, “二班”],
[1005, “小莉”, “女”, 635, “二班”],
]
df=pd.DataFrame(data, columns=[“学号”, “姓名”, “性别”, “成绩”, “班级”])
(1)如何获取所有“一班”的数据?
(2)如何获取所有600分以上的数据?
(3)如何获取600~640分之间的数据?
🗂️ 处理数据
📚 教学重点
掌握处理数据的各种操作
掌握字符串处理的各种方法
掌握自定义函数的使用
7.1 处理数据简介
在数据分析中,获取数据后需要筛选出所需的数据,并对其进行各种处理,才能得到高质量的数据。

7.2 操作行名和列名
在Pandas中,对于行名和列名的操作主要包括以下三个方面:

操作 说明
设置某一列为行名 使用 set_index() 方法
重置行名 使用 reset_index() 方法
修改行名和列名 使用 index、columns 或 rename() 方法

  1. 设置某一列为行名
    使用 set_index() 方法设置某一列为行名,语法如下:

python
Copy
df.set_index(列名, drop=布尔值)
2. 重置行名
使用 reset_index() 方法重置行名,语法如下:

python
Copy
df.reset_index(drop=布尔值)
3. 修改行名和列名
在Pandas中,有两种方式来修改行名和列名:

使用 index 和 columns 属性
使用 rename() 方法
(1)使用 index 和 columns
通过 index 属性修改行名,columns 属性修改列名,语法如下:

python
Copy
df.index = 列表
df.columns = 列表
(2)使用 rename() 方法
使用 rename() 方法修改行名或列名,语法如下:

python
Copy
df.rename(index=字典, columns=字典)
7.3 类型转换
在实际工作中,有时需要将 DataFrame 或某一列转换为其他类型。类型转换主要分为两种情况:

针对整个 DataFrame
针对某一列

  1. 针对 DataFrame
    对整个 DataFrame 的类型转换主要包括三种情况:

转换方式 说明
转换成字典 使用 to_dict() 方法
转换成数组 使用 NumPy 的 array() 方法
转换成列表 先转换为数组,再转换为列表
(1)DataFrame 转换为字典
使用 to_dict() 方法将 DataFrame 转换为字典,语法如下:

python
Copy
df.to_dict(into=值)
(2)DataFrame 转换为数组
使用 NumPy 的 array() 方法将 DataFrame 转换为数组,语法如下:

python
Copy
np.array(df)
(3)DataFrame 转换为列表
将 DataFrame 转换为数组后,再转换为列表。

  1. 针对某一列
    使用 astype() 方法对某一列进行类型转换,语法如下:

python
Copy
df[列名].astype(类型)
7.4 行列转置:T
使用 T 属性将 DataFrame 进行转置,T 是“transposition”(调换)的缩写,语法如下:

python
Copy
df.T
7.5 大小排序:sort_values()
使用 sort_values() 方法进行大小排序,语法如下:

python
Copy
df.sort_values(by=列表, ascending=布尔值)
7.6 数据排名:rank()
使用 rank() 方法对某一列进行排名,语法如下:

python
Copy
df[列名].rank(ascending=布尔值, method=值)
7.7 数据替换:replace()
使用 replace() 方法对数据进行批量替换,语法如下:

替换一个值:
python
Copy
df.replace(A, B)
替换多个值:
python
Copy
df.replace(字典)
7.8 数据移动:shift()
使用 shift() 方法实现数据的整体移动,语法如下:

python
Copy
df.shift(n, axis=0或1)
7.9 数据清洗
数据往往存在问题,如缺失、重复、异常等。数据清洗是对这些“脏数据”进行处理,以便获得高质量的数据。

  1. 缺失值
    数据缺失的情况常见,原因主要有两种:

信息暂时无法获取
信息被遗漏
(1)判断缺失值
使用 isnull() 方法判断数据是否缺失,语法如下:

python
Copy
df.isnull()
(2)处理缺失值
对缺失值的处理方式包括:

删除:删除包含缺失值的行或列
填充:用某个值替代缺失值
① 删除
使用 dropna() 方法删除包含缺失值的行或列,语法如下:

python
Copy
df.dropna(axis=0或1, how=“any"或"all”)
② 填充
使用 fillna() 方法对缺失值进行填充,语法如下:

python
Copy
df.fillna(value=字典, method=填充方式)
2. 重复值
重复值是指存在相同的行数据,通常需要进行删除处理。

(1)判断重复值
使用 duplicated() 方法判断是否有重复数据,语法如下:

python
Copy
df.duplicated()
(2)处理重复值
使用 drop_duplicates() 方法删除重复数据,默认保留第一次出现的数据,语法如下:

python
Copy
df.drop_duplicates(subset=列表, keep=值)
3. 异常值
异常值是指不合理的值,如年龄为负数、成绩大于100等。

(1)判断异常值
判断异常值的方式包括:

散点图分析
箱线图分析
3σ原则
统计分析
(2)处理异常值
处理异常值的方式一般有两种:

删除:直接删除该行或该列
填充:使用平均值代替
7.10 数据合并
在Pandas中,合并不同的数据集有四种方法,如下表所示:

方法 说明
concat() 轴向合并
merge() 主键合并
join() 行列连接
append() 纵向合并

  1. 轴向合并:concat()
    使用 concat() 方法沿某一轴合并两个数据集,语法如下:

python
Copy
pd.concat(列表, axis=0或1, join=连接方式, ignore_index=布尔值)
2. 主键合并:merge()
使用 merge() 方法根据一个或多个键合并数据集,语法如下:

python
Copy
pd.merge(df1, df2, how=连接方式)
3. 行列连接:join()
使用 join() 方法根据指定行或列合并两个数据集,语法如下:

python
Copy
df1.join(df2, on=行名或列名)
4. 纵向合并:append()
使用 append() 方法将两个 DataFrame 进行纵向合并,语法如下:

python
Copy
df1.append(df2, ignore_index=布尔值)
7.11 字符串处理
在数据分析中,字符串处理非常重要。字符串方法通常针对的是 Series,而不是 DataFrame。

  1. 获取长度:len()
    使用 len() 方法获取字符串的长度,语法如下:

python
Copy
str.len()
2. 统计次数:count()
使用 count() 方法统计某个子字符串出现的次数,语法如下:

python
Copy
str.count(子字符串)
3. 去除空格:strip()
使用 strip() 方法去除字符串首尾的空格,语法如下:

python
Copy
str.strip()
4. 替换字符串:replace()
使用 replace() 方法替换字符串的一部分,语法如下:

python
Copy
str.replace(A, B)
5. 分割字符串:split()
使用 split() 方法对字符串进行分割,语法如下:

python
Copy
str.split(“分割符”, expand=布尔值)
6. 重复字符串:repeat()
使用 repeat() 方法将字符串重复多次,语法如下:

python
Copy
str.repeat(n)
7. 连接行或列:cat()
使用 cat() 方法连接几列,语法如下:

python
Copy
A.str.cat(B, sep=“分割符”)
8. 大小写转换
实现字符串的大小写转换的方法如下表所示:

方法 说明
lower() 将大写转换成小写
upper() 将小写转换成大写
swapcase() 大小写互换
9. 判断类型
判断字符类型的方法如下表所示:

方法 说明
isnumeric() 判断是否为纯数字
isupper() 判断是否为纯大写
islower() 判断是否为纯小写
📊 字符串判断方法
字符串方法介绍
在字符串处理中,Python提供了多种方法来判断字符串的特性。以下是常用的几种字符串方法及其功能:

方法 说明
isnumeric() 判断所有字符是否纯数字
islower() 判断所有字符是否纯小写
isupper() 判断所有字符是否纯大写
🔍 判断包含子字符串
在Pandas中,如果想要判断某个字符串是否包含另一个子字符串,可以使用以下方法:

方法 说明
contains(A) 判断是否包含子字符串 A
startswith(A) 判断是否以子字符串 A 开头
endswith(A) 判断是否以子字符串 A 结尾
🔧 自定义函数的应用
在Pandas中,我们可以通过以下三种方法对DataFrame应用自定义函数:

方法 说明
map() 应用于一列
apply() 应用于多列
applymap() 应用于整个DataFrame

  1. map() 方法
    map() 方法用于对某一列的所有元素执行相同的操作。其语法如下:

python
Copy
df[].map(fn, args=元组)
2. apply() 方法
apply() 方法用于对某几列的所有元素执行相同的操作。其语法如下:

python
Copy
df[].apply(fn, args=元组)
3. applymap() 方法
applymap() 方法用于对整个DataFrame的所有元素执行相同的操作。其语法如下:

python
Copy
df.applymap(fn)
方法总结
方法 适用范围
map() 针对一列
apply() 针对多列(也可以是一列)
applymap() 针对所有列
对于一般运算,推荐使用之前介绍的各种方式;对于复杂运算,可以考虑使用这三种方法。

🛠️ 处理天气数据的实战题
在本项目中,我们需要对天气数据进行以下处理:

对“月份”这一列进行转换,例如将 1 转换为“1月”。
对“温度”这一列进行转换,例如将 19 转换为“19℃”。
将“月份”这一列设置成行名。
🗂️ 拆分数据的实战题
请将“from_to”这一列根据“_”分开,然后分成“from”和“to”两列,并且要删除原始列。

📋 本章练习
单选题
下面有关数据处理的说法中,不正确的是( )。

A. 数据清洗的目的是为了提高数据质量
B. 可以使用 duplicated() 方法删除重复数据
C. concat() 方法可以沿着一条轴将多个对象进行堆叠
D. 可以使用 rename() 方法对索引进行重命名
如果想要删除包含缺失值(NaN)的行,我们应该使用( )方法来实现。

A. isnull()
B. dropna()
C. drop()
D. fillna()
下面有关数据合并的说法中,不正确的是( )。

A. merge() 方法可以根据一个或多个键将不同的 DataFrame 进行合并
B. concat() 方法可以沿着一条轴来将多个对象进行堆叠
C. merge() 方法可以同时对多个 DataFrame 进行合并
D. join() 方法可以将两个毫不相关的 DataFrame 进行合并
编程题
下面有一个DataFrame,请将“vip”这一列的 yes、no 依次替换成 True、False。请使用至少 2 种方式来实现。
python
Copy
data = [
[“小杰”, “yes”],
[“小红”, “yes”],
[“小明”, “no”],
[“小华”, “no”],
[“小莉”, “yes”]
]
df=pd.DataFrame(data, columns=[“name”, “vip”])
下面有一个DataFrame,请将 price 这一列的“元”去掉,然后将这一列的类型转换成浮点型(注意这一列本身是字符串型)。请使用至少 2 种方式来实现。
python
Copy
data = [
[“苹果”, “6.4元”, “秋季”],
[“西瓜”, “2.5元”, “夏季”],
[“香蕉”, “7.8元”, “四季”],
[“李子”, “12.4元”, “夏秋”],
[“芒果”, “3.5元”, “夏季”]
]
df=pd.DataFrame(data, columns=[“fruit”, “price”, “season”])
下面有一个DataFrame,请把 name 这一列的“姓”和“名”的第一个字符都转化成大写。例如第 1 行的“bill gates”,最终要转化成“Bill Gates”。
python
Copy
data = [
[“bill gates”, 1955],
[“stevejobs”, 1955],
[“timcook”, 1960],
[“elonmusk”, 1971],
[“larrypage”, 1973]
]
df=pd.DataFrame(data, columns=[“name”, “birth”])
下面有一个DataFrame,请找出成绩最高的前 3 名的数据,并且打印出来。
python
Copy
import pandas as pd
data = [
[1001, “小杰”, “男”, 650, “一班”],
[1002, “小红”, “女”, 645, “一班”],
[1003, “小明”, “男”, 590, “二班”],
[1004, “小华”, “男”, 640, “二班”],
[1005, “小莉”, “女”, 635, “二班”]
]
df=pd.DataFrame(data, columns=[“学号”, “姓名”, “性别”, “成绩”, “班级”])

📊 数据分析与统计函数

8.1 分析数据简介

“上一章已经介绍了如何对数据进行各种处理,这样才能得到高质量的数据。接下来就是对数据的各种分析,以便得到想要的结果了。”

8.2 基本统计函数

统计函数概述

在Pandas中,统计函数是指对一组值进行计算并返回单个值的函数,这些函数不修改原来的DataFrame,常称为聚合函数

常见统计函数

函数 说明
sum() 求和
count() 统计个数
max() 求最大值
min() 求最小值
median() 求中位数
mean() 求平均数
mode() 求众数
var() 求方差
std() 求标准差
quantile() 求分位数

各函数的详细介绍

  1. 求和:sum()

    • 在Pandas中,使用sum()函数对“行或列”进行求和。
    • 语法df.sum(axis=0或1, numeric_only=True或False)
  2. 统计个数:count()

    • 使用count()函数统计“行或列”中非NaN的数据个数。
    • 语法df.count(axis=0或1)
  3. 求最值:max()min()

    • 使用max()函数求“行或列”中的最大值,使用min()函数求最小值。
    • 语法
      • df.max(axis=0或1)
      • df.min(axis=0或1)
  4. 求中位数:median()

    • 中位数是指按顺序排序后,处于中间位置的数。
    • 语法df.median(axis=0或1)
  5. 求众数:mode()

    • 众数是指一组数据中出现最多的数。
    • 语法df.mode(axis=0或1)
  6. 求平均数:mean()

    • 使用mean()函数对“行或列”求平均数。
    • 语法df.mean(axis=0或axis=1)
  7. 求方差:var()

    • 方差衡量数据的离散程度。
    • 语法df.var(axis=0或1)
  8. 求标准差:std()

    • 标准差是方差的平方根。
    • 语法df.std(axis=0或1)
  9. 求分位数:quantile()

    • 分位数是将数据分为几个等份的点。
    • 语法df.quantile(axis=0或1, q=值)

8.3 其他统计函数

除了基本的统计函数,Pandas还提供了其他有用的统计函数:

函数 说明
unique() 统计取值种类
value_counts() 统计取值个数
pct_change() 求变化百分比
idxmax() 求最大值的行名(索引)
idxmin() 求最小值的行名(索引)

其他函数的详细介绍

  1. 统计取值种类:unique()

    • 统计某一列中有多少种取值情况。
    • 语法df[].unique()
  2. 统计取值个数:value_counts()

    • 计算某一列中每一种值的个数。
    • 语法df[列名].value_counts()
  3. 求变化百分比:pct_change()

    • 将每个元素与前一个元素进行比较,计算变化百分比。
    • 语法df.pct_change(axis=0或1)
  4. 求最值的索引:idxmax()idxmin()

    • 获取某一列中最大值或最小值所对应的行名。
    • 语法
      • df[].idxmax()
      • df[].idxmin()

8.4 整体情况

总体信息获取

使用describe()info()方法可以快速查看数据集的整体情况。

  1. describe()方法

    • 一次性获取数据集的多种统计值。
    • 语法df.describe()
  2. info()方法

    • 获取数据集的基本信息,包括类型、列名、个数、内存等。
    • 语法df.info()

8.5 聚合方法

使用agg()方法对一个DataFrame同时应用多个统计函数。

  • 语法df.agg(列表)

8.6 数据分组

数据分组是根据某些条件将数据拆分为若干组。

主要方法

  1. groupby()方法

    • 对一个DataFrame进行分组。
    • 语法df.groupby(列名或列表)
  2. get_group()方法

    • 获取某一组的数据。
    • 语法分组对象.get_group(组名)

8.7 实战题:各大洲平均寿命

利用life.csv文件统计各大洲在1950、1960、1970、1980、1990、2000年的人均寿命。

本章练习

  1. 下面哪一个方法可以一次性获取多个统计指标?( )

    • A. describe()
    • B. mean()
    • C. info()
    • D. sum()
  2. 如果想要计算数据的变化比率,我们应该使用( )方法来实现。

    • A. rank()
    • B. change()
    • C. mean()
    • D. pct_change()
  3. 如果想要获取有多少行数据,下面哪一种方式无法实现?( )

    • A. len(df)
    • B. df.shape[0]
    • C. df.describe()
    • D. df.info()
  4. 如果想要获取有多列数据,下面哪一种方式无法实现?( )

    • A. len(df)
    • B. df.shape[1]
    • C. len(df.columns)
    • D. df.info()

🕒 时间序列

1. 时间序列概述

在进行金融分析或量化研究时,总是避免不了对“时间序列数据”的处理。所谓的时间序列,指的是在一定时间内对某个指标按照时间顺序观察得到的数列。

时间序列示例

  • 一天内每小时的温度变化
  • 每隔一天的股票价格
  • 列车每隔一段时间行驶的距离

2. 时间序列定义

在Pandas中,时间序列是以时间作为行名(索引)的SeriesDataFrame。通常情况下,时间序列以DataFrame形式出现,较少为Series形式。

3. 转换类型

我们可以使用to_datetime()方法将时间字符串转换成时间对象。

语法

pd.to_datetime()
可转换格式
以下五种格式的字符串可以被转换为Pandas支持的时间对象:

20220520
2022.05.20
2022/05/20
05/20/2022
20-May-2022
4. 获取日期
在Pandas中,可以使用DatetimeIndex对象提供的属性来获取年、月、日、季度等。

语法
python
Copy
df.index.属性
5. 索引与切片
Pandas为时间序列提供了独特的“索引”和“切片”方式,使得我们可以快速选取所需数据,类似于列表的操作。

语法示例
df["2022"] # 获取某年的数据
df$"2022-01"$ # 获取某月的数据
df["2022":"2023"] # 获取区间的数据
6. 重采样:resample()
我们可以使用Grouper()方法来指定分组的依据,通常与groupby()方法搭配使用。

语法
python
Copy
pd.Grouper(key, freq)
6.1 降采样
降采样是从高频到低频的操作,通常会使用统计函数。

6.2 升采样
升采样是从低频到高频的操作,可能导致数据缺失。我们通常使用填充方式来处理缺失值,填充方式包括:

使用ffill()方法向前填充
使用bfill()方法向后填充
7. 移动计算:rolling()
在Pandas中,我们可以使用rolling()方法实现移动计算。

语法
python
Copy
df.rolling(n)
8. 分组器:Grouper()
在Pandas中,我们使用Grouper()方法来实现分组操作,通常结合groupby()使用。

9. 实战题:求每个月的销量总和
我们尝试计算sales.csv文件中保存的某公司一年内每天的产品销量的每个月总和。

10. 本章练习
单选题
如果想要实现时间序列的移动计算,我们可以使用( )方法来实现。

A. sample()
B. resample()
C. rolling()
D. groupby()
下面有关重采样的说法中,不正确的是( )。

A. 降采样会导致一些时间没有对应的数据
B. 任何类型的DataFrame都可以进行重采样
C. 可以使用resample()方法来实现升采样
D. 重采样使用freq参数来控制转换的频率
下面有关时间序列的说法中,不正确的是( )。

A. 只有时间序列才有重采样,其他DataFrame都没有
B. 时间序列本质上是一个Series或DataFrame
C. 时间序列的行名(索引)可以是从0开始的连续整数
D. 时间序列的时间频率可以是固定的,也可以是不固定的
问答题
请简单说一下重采样是什么?然后重采样可以分为多少种,每一种又是怎样的?(面试题)
编程题
有一个sales.csv文件,它保存的是某公司一年内每天的产品销量,请找出每个月销量最高对应的日期。
📊 透视表与数据处理
教学重点
掌握透视表
掌握交叉表
掌握层次化索引
掌握离散化处理
掌握哑变量处理
10.1 透视表
透视表简介
在Pandas中,我们可以使用 pivot_table() 方法来实现一个透视表。除了 pivot_table() 方法,还有一个 pivot() 方法也可以实现透视表。

语法
python
Copy
pd.pivot_table(df, index=列表, columns=列表, values=)
统计函数
透视表不仅可以对DataFrame进行“排版”,还可以在“排版”的同时使用统计函数来进行各种统计。在Pandas中,可以使用 aggfunc 参数来定义统计函数。

语法
python
Copy
pd.pivot_table(df, index=列表, columns=列表, values=, aggfunc=字符串或列表, margins=True, margins_name=名字)
10.2 交叉表
在Pandas中,虽然 pivot_table() 方法也可以实现交叉表,但使用 crosstab() 方法是更好的选择。crosstab() 方法默认统计个数(次数)。

语法
python
Copy
pd.crosstab(index=行数据, columns=列数据)
10.3 层次化索引
层次化索引简介
为了处理多维数据,可以使用“层次化索引”将高维数据转换为低维数据,通常是转换为二维数据(即DataFrame)。实现层次化索引的常用方法是在创建DataFrame时,给 index 或 columns 参数传递一个多维数组。

常用操作
对于使用层次化索引的DataFrame,常用的操作包括:

操作	描述
获取行数据	使用 loc[] 获取行数据
获取列数据	使用 df[] 获取列数据
统计函数	使用统计函数
索引排序	使用 sort_index()
重置索引	使用 reset_index()
交换位置	使用 swaplevel()
获取行数据
使用 loc[] 来获取行数据。

语法
python
Copy
df.loc[1层行名,2层行名,, 第n层行名]
获取列数据
使用 df[] 来获取列数据。

语法
python
Copy
df[列名或列表]
统计函数
对于使用层次化索引的DataFrame,可以使用各种统计函数进行操作。

索引排序
使用 sort_index() 方法对索引进行排序,适用于层次化索引的DataFrame。

语法
python
Copy
df.sort_index()
重置索引
使用 reset_index() 方法将层次化索引重置为普通索引。

语法
python
Copy
df.reset_index()
交换位置
使用 swaplevel() 方法来交换不同层索引的位置。

语法
python
Copy
df.swaplevel(m, n)
10.4 离散化处理
离散化简介
离散化处理是将连续值域划分为若干个区间,常用于将年龄或身高分为几个区间。离散化的目的是简化数据结构。

语法
在Pandas中,可以使用 cut() 方法来实现数据的离散化。

python
Copy
pd.cut(data, bins=列表)
常用参数
对于 cut() 方法,可以使用以下参数进行自定义设置:

python
Copy
pd.cut(data, bins=列表, right=布尔值, labels=列表, retbins=布尔值)
10.5 哑变量处理
哑变量(虚拟变量)是人为设置的一种变量,用于反映变量的不同类别。在Pandas中,可以使用 get_dummies() 方法对变量进行哑变量处理。

语法
python
Copy
pd.get_dummies(data, prefix)
实战题:创建透视表
请根据给定的 visits.csv 文件创建一个透视表:行是“区域”,列是“动物”,值是“访客”。

本章练习
单选题
如果想要将一个层次化索引的DataFrame转换成一个普通索引的DataFrame,可以使用( )方法。

A. set_index()
B. reset_index()
C. sort_index()
D. rename()
关于层次化索引的说法中,不正确的是( )。

A. 普通索引的DataFrame的index是一个一维数组
B. 层次化索引的DataFrame的index是一个多维数组
C. 层次化索引的DataFrame无法使用统计函数
D. 可以使用sort_index()方法对层次化索引进行排序
如果想要对DataFrame进行哑变量处理,可以使用( )方法。

A. cut()
B. pivot()
C. crosstab()
D. get_dummies()
问答题
离散化处理指的是什么?它的目的又是什么?
哑变量处理指的是什么?它的目的又是什么?
📊 Pandas 基础知识
👩‍🏫 教学重点
本节课的重点包括:

掌握Pandas的广播机制
掌握索引对象
掌握inplace参数
掌握NaN值
🔄 11.1 广播机制
广播机制是指在Pandas中,通过利用其基于NumPy的特性,可以轻松地对DataFrame的某一行或某一列中的所有数据项执行相同的加减等操作。

📚 11.2 索引对象
在Pandas中,行名即索引这一列属于Index类对象。常见的索引对象如下表所示:

索引对象	说明
Index	最基础的Index对象
RangeIndex	从0开始的连续整数
Int64Index	整数型的Index对象
MultiIndex	层次化索引
DatetimeIndex	时间类的Index对象(时间序列索引)
PeriodIndex	时间间隔Index对象
关于索引的注意事项
索引是可以重复的。
索引只能整体替换,而不能部分修改。
索引对象可以转换成一个列表。
⚙️ 11.3 inplace参数
inplace参数是指在会修改DataFrame数据的方法中,是否直接修改原始DataFrame的选项。其特点是:

默认值为False,表示不会修改原来的DataFrame,而是返回一个新的DataFrame。
当inplace=True时,表示会直接修改原来的DataFrame。
🚫 11.4 NaN值
在Pandas中,缺失数据使用NaN值来表示,类似于数据库中的NULL值。NaN值的表示形式有三种:

np.NaN
np.NAN
np.nan
这三种写法是等价的。缺失值一般来源于以下两方面:

加载包含缺失值的文件或数据库。
手动指定缺失值。
📊 11.5 实战题:统计每一列的缺失值个数
加载数据后,我们尝试统计每一列的缺失值。

📝 本章练习
一、单选题
对于层次化索引的DataFrame来说,它的索引是( )对象。

A. RangeIndex
B. MultiIndex
C. DatetimeIndex
D. PeriodIndex
如果想要判断某个值是否为缺失值,我们应该使用( )方法。

A. is()
B. not()
C. isnull()
D. isnan()
下面有关DataFrame中的索引的说法中,正确的是( )。

A. 时间序列的索引是RangeIndex对象
B. 不允许有重复的索引
C. 可以使用list()函数将索引对象转化成一个列表
D. 可以只修改索引的一部分
二、编程题
下面有一个DataFrame,请将列名改为["水果", "价格", "季节"]。要求至少使用2种方式来实现。
python
Copy
import pandas as pd
data = [
    ["苹果", 6.4, "秋季"],
    ["西瓜", 2.5, "夏季"],
    ["香蕉", 7.8, "四季"],
    ["李子", 12.4, "夏秋"],
    ["芒果", 3.5, "夏季"]
]
df = pd.DataFrame(data, columns=["fruit", "price", "season"])
下面有一个数据集,请将“成绩”这一列每一个元素都减去该列的平均值。
python
Copy
import pandas as pd
data = [
    [1001, "小杰", "男", 650, "一班"],
    [1002, "小红", "女", 645, "一班"],
    [1003, "小明", "男", 590, "二班"],
    [1004, "小华", "男", 640, "二班"],
    [1005, "小莉", "女", 635, "二班"]
]
df = pd.DataFrame(data, columns=["学号", "姓名", "性别", "成绩", "班级"])

# 📊 Matplotlib数据可视化学习指南

## 1. 教学重点

- **了解常用的可视化库**
- **掌握Matplotlib通用设置**
- **掌握Matplotlib绘制各种图表**

## 2. Matplotlib简介

在Python中,我们可以使用**Matplotlib**库来实现数据的可视化,数据可视化是将数据以图表的方式展示处理。

## 3. 数据可视化的必要性

> 对于数据可视化,仅掌握Matplotlib这一个库是不够的。虽然它是Python可视化中最重要的一个库,但实际工作需求复杂多变,还需学习其他可视化库,如**Seaborn****Pyecharts****Bokeh****Plotline**等。

## 4. 基本绘图(折线图)

### 4.1 基本语法

在Matplotlib中,使用`plot()`函数绘制折线图,语法如下:

$$
\text{plt.plot}(x, y)
$$

折线图适合观察“因变量y”随着“自变量x”改变的趋势,特别适用于展示随时间变化的连续数据。

### 4.2 样式定义

`plot()`函数提供多种样式参数,主要分为两类:

1. 线条样式
2. 节点样式

#### 4.2.1 线条样式

在Matplotlib中,用于定义线条样式的参数有以下三个:

| 属性        | 说明         |
|-----------|------------|
| **color** | 线条颜色      |
| **linestyle** | 线条外观      |
| **linewidth** | 线条宽度      |

#### 4.2.2 节点样式

在Matplotlib中,用于定义节点样式的参数有以下四个:

| 属性             | 说明         |
|----------------|------------|
| **marker**     | 节点外观      |
| **markersize****ms** | 节点大小      |
| **markerfacecolor****mfc** | 节点颜色      |
| **markeredgecolor****mec** | 边框颜色      |

## 5. 通用设置

通用设置不仅适用于折线图,也可用于其他大多数图表,通常通过`pyplot`子库直接调用。

### 5.1 画布样式

使用`figure()`函数定义画布样式,包括大小、颜色、边框等,语法如下:

$$
\text{plt.figure}(figsize, facecolor, edgecolor)
$$

### 5.2 定义标题

使用`title()`、`xlabel()`、`ylabel()`函数分别定义主标题、x轴标题、y轴标题,语法如下:

$$
\text{plt.title}(label, loc) \\
\text{plt.xlabel}(label, loc) \\
\text{plt.ylabel}(label, loc)
$$

### 5.3 定义图例

使用`legend()`函数为图表定义图例,语法如下:

$$
\text{plt.legend}(loc)
$$

### 5.4 刻度标签

使用`xticks()`和`yticks()`函数分别定义x轴和y轴的刻度标签,语法如下:

$$
\text{plt.xticks}(ticks, labels) \\
\text{plt.yticks}(ticks, labels)
$$

### 5.5 刻度范围

使用`xlim()`和`ylim()`函数定义x轴和y轴的范围,语法如下:

$$
\text{plt.xlim}(left, right) \\
\text{plt.ylim}(left, right)
$$

### 5.6 网格线

使用`grid()`函数为图表添加网格线,语法如下:

$$
\text{plt.grid}(axis, linestyle, color)
$$

### 5.7 参考线

使用`axhline()`和`axvline()`函数添加水平和垂直参考线,语法如下:

$$
\text{plt.axhline}(y, color, linestyle, linewidth) \\
\text{plt.axvline}(x, color, linestyle, linewidth)
$$

### 5.8 参考区域

使用`axhspan()`和`axvspan()`函数添加水平和垂直参考区域,语法如下:

$$
\text{plt.axhspan}(ymin, ymax, facecolor, alpha) \\
\text{plt.axvspan}(xmin, xmax, facecolor, alpha)
$$

### 5.9 注释文本

使用`annotate()`函数为关键节点添加有指向的注释文本,语法如下:

$$
\text{plt.annotate}(text, xy, xytext, arrowprops)
$$

使用`text()`函数为节点添加注释文本,语法如下:

$$
\text{plt.text}(x, y, text)
$$

## 6. 通用样式

在Matplotlib中,有一些样式参数可以被大多数绘图函数使用,称为“通用样式参数”。

| 参数           | 说明         |
|---------------|------------|
| **color**     | 颜色         |
| **fontsize**  | 文本大小      |
| **ha**        | 水平对齐      |
| **va**        | 垂直对齐      |
| **label**     | 图例         |
| **alpha**     | 透明度(0~1.0|

## 7. 散点图

### 7.1 基本语法

在Matplotlib中,使用`scatter()`函数绘制散点图,语法如下:

$$
\text{plt.scatter}(x, y)
$$

### 7.2 散点图的主要作用

- 判断变量之间是否存在关联趋势(线性或非线性)。
- 判断是否有离群点(异常点)。

### 7.3 样式定义

`scatter()`函数同样提供了多种可选样式参数:

| 参数          | 说明             |
|--------------|----------------|
| **marker**   | 散点形状          |
| **s**        | 散点大小(size)   |
| **color**    | 散点颜色          |
| **alpha**    | 散点透明度(0~1.0|

### 7.4 气泡图

使用`scatter()`函数的`s`参数绘制气泡图,`s`参数的值要求是一个列表。

## 8. 柱形图

### 8.1 基本语法

在Matplotlib中,使用`bar()`函数绘制柱形图,语法如下:

$$
\text{plt.bar}(x, y, hatch)
$$

### 8.2 高级绘图

柱状图在实际开发中的使用频率较高,基本的柱状图可能无法满足实际需求,因此需要掌握一些高级柱状图的绘制技术,包括堆叠柱状图等。

# 📊 数据可视化图表

## 条形图

### 定义
条形图是一种与柱形图非常相似的图表,其主要区别在于:
- **柱形图**是纵向的
- **条形图**是横向的

### 使用方法
在Matplotlib中,可以使用 `barh()` 函数来绘制条形图。
```python
plt.barh(x, y, hatch)
直方图
基本定义
直方图又称为“质量分布图”,主要用于展示数据的分布情况。

使用方法
在Matplotlib中,可以使用 hist() 函数来绘制直方图。

python
Copy
plt.hist(x, bins)
直方图与柱状图的区别
特点	柱状图	直方图
数据类型	离散型数据	连续型数据
展示内容	数据的大小	数据的个数(频率)
矩形条之间的间隙	有固定的间隙	没有间隙
直方图样式定义
常用样式参数
参数	说明
histtype	直方图类型
rwidth	条形的宽度
facecolor	条形的颜色
edgecolor	边框的颜色
alpha	透明度
饼状图
基本定义
饼状图没有坐标,主要用于展示各部分在总和中的比例。

使用方法
在Matplotlib中,可以使用 pie() 函数来绘制饼状图。

python
Copy
plt.pie(x)
饼状图样式定义
参数	说明
labels	各部分的标题(列表)
colors	各部分的颜色(列表)
autopct	显示百分比
explode	是否拉出某部分(元组)
shadow	是否显示阴影(元组)
圆环图
圆环图也称为“环形图”,可以通过 pie() 函数的 radius 和 wedgeprops 参数来实现。

实战题示例
绘制气温折线图
介绍如何使用Pandas读取数据,并使用Matplotlib绘制折线图。
浏览器份额柱形图
绘制主流浏览器所占市场份额的柱形图,数据来源于 browser.csv 文件。
🖼️ 高级图表概述
章节介绍
13.1 高级图表简介
在本章节中,我们将介绍 Matplotlib 中的高级图表,主要包括以下五种:

箱线图(Boxplot)
面积图(Area Plot)
棉棒图(Stem Plot)
热力图(Heatmap)
子图表(Subplots)
📦 箱线图
1. 基本语法
箱线图是一种统计图表,用于显示数据的分布情况。它使用六个统计量来描述数据:

最大值
上四分位数
中位数
下四分位数
最小值
异常值
2. 绘制方法
在 Matplotlib 中,我们可以使用 boxplot() 函数来绘制一个箱线图。箱线图主要有两个作用:

查看数据的分布情况
发现数据中的异常点
语法
python
Copy
plt.boxplot(x)
3. 样式定义
为了使箱线图更加美观,boxplot() 函数提供了许多样式参数,常用的如下表所示:

参数	说明
notch	是否有缺口,默认为 False(不带缺口)
vert	是否为纵向,默认为 True(纵向)
showmeans	是否显示平均值,默认为 False(不显示)
showfliers	是否显示异常值,默认为 True(显示)
flierprops	异常点的样式,值是一个字典
boxprops	箱子的样式,值是一个字典,需要结合 patch_artist=True 一起使用
labels	指定每个箱线图的标签
📊 面积图
1. 基本语法
面积图用于显示数据随时间变化而变化的范围,强调数量与时间的关系。在 Matplotlib 中,我们可以使用 stackplot() 函数来绘制一个面积图。

语法
python
Copy
plt.stackplot(x, y)
2. 高级绘图
在实际开发中,基本的面积图有时无法满足需求,因此我们还需要掌握一些高级面积图的绘制,常见的只有堆叠面积图这一种。

🍭 棉棒图
1. 基本语法
棉棒图又称为棒棒糖图或火柴杆图,由一个“杆”(直线)和一个“头”(圆点)组成。它是柱形图的变形,可以看作是一种特殊的柱形图。

语法
python
Copy
plt.stem(x, y)
2. 样式定义
为了使棉棒图更加美观,stem() 函数提供了样式参数,如 linefmt 和 markerfmt。

🔥 热力图
1. 基本语法
热力图用于以高亮的方式显示区域的密度情况,以展示数据的差异性。在 Matplotlib 中,我们可以使用 imshow() 函数来绘制热力图。

语法
python
Copy
plt.imshow(x)
2. 样式定义
热力图可以使用 cmap 参数来定义颜色。常用的取值如下表所示:

取值	说明
plt.cm.gray	黑→灰→白
plt.cm.bone	黑→蓝灰→白
plt.cm.hot	黑→红→白
plt.cm.cool	青绿→浅蓝→品红
plt.cm.spring	品红→橙黄→黄色
plt.cm.summer	深绿→浅绿→黄色
plt.cm.autumn	红→橙→黄
plt.cm.winter	蓝→青蓝→绿
📈 子图表
1. 基本语法
在 Matplotlib 中,我们可以使用 subplot() 函数同时绘制多个子图表。

语法
python
Copy
plt.subplot(rows, cols, index)
2. 实际案例
我们尝试绘制一个 2×2 的组合图表,在同一张画布上绘制四种不同的图表:折线图、散点图、柱形图、饼状图。

📊 实战题
1. 箱线图查找异常点
使用 staff.csv 文件中的年龄数据,通过箱线图判断是否存在异常值。

2. 每月销量的棉棒图
使用 product.csv 文件中的每月产品销量数据,尝试绘制相应的棉棒图。

📚 Jupyter Notebook 学习指南
🎯 教学重点
了解 Jupyter Notebook 的使用
📖 Jupyter Notebook 简介
Jupyter Notebook 是一个网页端的应用,允许用户在网页中直接编写和运行代码,并在同一页面显示结果。
它不仅简单美观,其功能也非常强大。
⚙️ Jupyter Notebook 安装
安装步骤可以参考书中提供的详细说明。
🌟 应用场景
Jupyter Notebook 主要可以用于以下三个方面:

应用场景	描述
运行常规代码	可以直接在Notebook中编写和执行代码。
Pandas 数据分析	适用于数据分析和数据处理任务。
Matplotlib 绘图	可以用于数据可视化,生成各种图表。
💡 常用技巧
Jupyter Notebook 中的一些常用技巧包括:

技巧	描述
问号查询	使用问号可以查询函数和对象的帮助文档。
输出多个变量	可以在一个单元格中输出多个变量的值。
读取文件	通过相关命令可以方便地读取各种文件。
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55fe09384e9a41eebc6a51ff50026c5c.png)

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐