数据分析的流程
- 需求分析
- 数据获取
- 数据预处理
- 分析与建模
- 模型评价与优化
- 部署
NumPy 创建数组
NumPy
提供的 array 函数可以创建一维数组和多维数组
或也可以使用 arange、linspace 等其他函数创建数组,具体请查看课本 P26 第二段文字开始
创建一维数组
python
import numpy as np
# 创建一维数组
arr = np.array([1, 2, 3, 4, 5])
print('arr = ', arr) # 输出查看
- 输出结果
arr = [ 1 2 3 4 5 ]
创建二维数组
python
import numpy as np
# 创建二维数组
arr = np.array([
[1, 2, 3, 4, 5],
[1, 3, 5, 7, 9],
[2, 4, 6, 8, 10]
])
print('arr = ', arr) # 输出查看
- 输出结果
arr = [[1, 2, 3, 4, 5]
[1, 3, 5, 7, 9]
[2, 4, 6, 8, 10]]
查看数组形状
python
import numpy as np
# 创建数组
arr = np.array([
[1, 2, 3, 4, 5],
[1, 3, 5, 7, 9],
[2, 4, 6, 8, 10]
])
print('arr.shape = ', arr.shape) # 输出查看数组形状
- 输出结果
arr.shape = (3, 5)
其中 3 为行数,5 为列数
变换数组的形状
python
import numpy as np
arr = np.array([
[1, 2, 3, 4, 5],
[1, 3, 5, 7, 9],
[2, 4, 6, 8, 10]
])
arr.shape = 5, 3
- 输出结果
arr = [[ 1 2 3]
[ 4 5 1]
[ 3 5 7]
[ 9 2 4]
[ 6 8 10]]
NumPy 创建矩阵
NumPy
提供两种方法创建矩阵:mat、matrix 函数
mat 创建矩阵
python
import numpy as np
# 使用 mat 创建矩阵,用 ; 隔开每一行数据
m1 = np.mat('1 2 3; 4 5 6; 7 8 9')
print('m1 = ', m1) # 查看输出
- 输出结果
m1 = [[1 2 3]
[4 5 6]
[7 8 9]]
使用 matrix 创建矩阵
python
import numpy as np
# 使用 matrix 创建矩阵
m2 = np.matrix([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
print('m1 = ', m1) # 输出查看
补充
如果要创建一个 3 × 3 的对角单位阵
python
import numpy as np
m1 = np.eye(3)
print('m1 = ', m1) # 输出查看
- 输出结果
m1 = [[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
如果要保存/读取一个数组
python
import numpy as np
arr = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
np.save('./save_arr', arr) # 保存数组到文件中
# np.save('保存的文件名', 保存的数组)
# 如果要读取
arr = np.load('./save_arr.npy')
print('arr = ', arr)
以上代码运行后会得到一个 save_arr.npy 二进制文件
- 输出结果
arr = [[1 2 3]
[4 5 6]
[7 8 9]]
数组排序
NumPy
中使用 sort 函数对数组进行排序
python
import numpy as np
# 生成一个随机数组(随机数 1 - 10,共生成 10 个)
arr = np.random.randint(1, 10, size=10)
print('arr = ', arr)
# 直接对数组进行排序
arr.sort() # 这里不需要重新使用变量接收,因为排序会直接影响原数组
print('arr.sort = ', arr)
- 输出结果
arr = [8 3 9 9 7 4 1 8 2 3]
arr.sort = [1 2 3 3 4 7 8 8 9 9]
多维数组排序
python
import numpy as np
# 生成一个随机数组(随机数 1 - 10,生成 3 × 3 的数组)
arr = np.random.randint(1, 10, size=(3, 3))
print('arr = ', arr)
# 沿着横轴排序
arr.sort(axis=1)
print('arr.sort(axis=1) = ', arr)
# 沿着纵轴排序
arr.sort(axis=0)
print('arr.sort(axis=0) = ', arr)
- 输出结果
arr = [[8 7 4]
[2 1 4]
[1 3 8]]
arr.sort(axis=1) = [[4 7 8]
[1 2 4]
[1 3 8]]
arr.sort(axis=0) = [[1 2 4]
[1 3 8]
[4 7 8]]
补充
如果要对数组进行去重,使用 unique 函数来实现,例如:
python
import numpy as np
arr = np.array(['苹果', '香蕉', '西瓜', '苹果', '草莓'])
print('arr = ', arr)
# 对数组进行去重
print('去重后的 arr = ', np.unique(arr))
- 输出结果
arr = ['苹果' '香蕉' '西瓜' '苹果' '草莓']
去重后的 arr = ['苹果' '草莓' '西瓜' '香蕉']
NumPy 操作题(课本 P52)
-
创建 4 个相同的 3 × 3 对角阵,对角线元素都是 [1, 2, 3],再使用 bmat 函数合并 4 个对角矩阵为 1 个 6 × 6 的新矩阵
-
利用合并后的 6 × 6 矩阵进行转置
python
import numpy as np
# 创建单个 3 x 3 对角矩阵
diag_matrix = np.diag([1, 2, 3])
# 生成 4 个相同的对角矩阵
matrices = [diag_matrix for i in range(4)]
# 使用 bmat 合并为 6 x 6 矩阵( 2 x 2 块结构)
combined_matrix = np.bmat([
[matrices[0], matrices[1]],
[matrices[2], matrices[3]]
])
# 获取转置矩阵
transposed_matrix = combined_matrix.T
print("合并后的6x6矩阵:")
print(combined_matrix)
print("\n转置后的矩阵:")
print(transposed_matrix)
- 输出结果
合并后的6x6矩阵:
[[1 0 0 1 0 0]
[0 2 0 0 2 0]
[0 0 3 0 0 3]
[1 0 0 1 0 0]
[0 2 0 0 2 0]
[0 0 3 0 0 3]]
转置后的矩阵:
[[1 0 0 1 0 0]
[0 2 0 0 2 0]
[0 0 3 0 0 3]
[1 0 0 1 0 0]
[0 2 0 0 2 0]
[0 0 3 0 0 3]]
Pandas 增删改查操作
以下所有操作基于 students.csv 文件,数据如下
stu_id | name | gender | age | class |
---|---|---|---|---|
1001 | 小明 | 男 | 18 | 1 |
1002 | 小晴 | 女 | 20 | 1 |
1003 | 小刚 | 男 | 18 | 3 |
1004 | 小丽 | 女 | 17 | 2 |
1005 | 小红 | 女 | 21 | 2 |
python
import pandas as pd
# 读取 CSV 文件数据
df = pd.read_csv('./students.csv')
print('查看文件的前 5 行数据')
print(df.head())
print('新增一列数据:身高')
df['height'] = 175
print(df.head())
print('删除一列数据')
df.drop('height', axis=1, inplace=True)
# 'height' 要删除的字段
# axis=1 要操作的轴,1 = 列(即纵轴),0 = 行(即横轴)
# inplace 是否对元数据生效,默认值为 False
print(df.head())
print('修改数据')
df.loc[0, 'name'] = '李明'
df.loc[1, 'name'] = '王刚'
# 1 为索引,name 为列名,
# df.loc[1, 'name'] 就表示,修改 name 列 的第二个元素
print(df.head())
print('查看数据')
print('只查看 name 列数据')
print(df['name'])
print('查看多列数据')
print(df[['stu_id', 'name', 'age']])
- 输出结果
查看文件的前 5 行数据
stu_id name gender age class
0 1001 小明 男 18 1
1 1002 小晴 女 20 1
2 1003 小刚 男 18 3
3 1004 小丽 女 17 2
4 1005 小红 女 21 2
新增一列数据:身高
stu_id name gender age class height
0 1001 小明 男 18 1 175
1 1002 小晴 女 20 1 175
2 1003 小刚 男 18 3 175
3 1004 小丽 女 17 2 175
4 1005 小红 女 21 2 175
删除一列数据
stu_id name gender age class
0 1001 小明 男 18 1
1 1002 小晴 女 20 1
2 1003 小刚 男 18 3
3 1004 小丽 女 17 2
4 1005 小红 女 21 2
修改数据
stu_id name gender age class
0 1001 李明 男 18 1
1 1002 王刚 女 20 1
2 1003 小刚 男 18 3
3 1004 小丽 女 17 2
4 1005 小红 女 21 2
查看数据
只查看 name 列数据
0 李明
1 王刚
2 小刚
3 小丽
4 小红
Name: name, dtype: object
查看多列数据
stu_id name age
0 1001 李明 18
1 1002 王刚 20
2 1003 小刚 18
3 1004 小丽 17
4 1005 小红 21
聚合方法
首先,什么是 “聚合” ?
假设你有一张班级成绩表,里面有每个学生的数学、语文分数
姓名 | 数学 | 语文 |
---|---|---|
小明 | 85 | 90 |
小红 | 92 | 88 |
小刚 | 78 | 85 |
聚合就是把
多行数据
合并成一行结果
,比如:
-
数学平均分 = (85 + 92 + 78) / 3 =85
-
语文最高分 = 小明, 90
agg 函数(课本 P80)
在 Pandas 中,通常就使用 agg 函数进行聚合操作,那么 agg 是干嘛的?
agg = 指定列 + 指定计算方式 → 汇总结果
- 例如,还是使用刚才的 students.csv
python
import pandas as pd
# 读取 CSV 文件数据
df = pd.read_csv('./students.csv')
# 求平均年龄
print('平均年龄 = ', df['age'].agg('mean'))
# agg('') -> mean 就是求平均值
# 求最大年龄
print('最大年龄 = ', df['age'].agg('max'))
# 求最小年龄
print('最小年龄 = ', df['age'].agg('min'))
# 求平均年龄、最大年龄、最小年龄
print('平均年龄、最大年龄、最小年龄')
print(df['age'].agg(['mean', 'max', 'min']))
- 输出结果
平均年龄 = 18.8
最大年龄 = 21
最小年龄 = 17
平均年龄、最大年龄、最小年龄
mean 18.8
max 21.0
min 17.0
Name: age, dtype: float64
92 页操作题
- 中国省份人口数据.csv
省份 | 202 年人口(万人) | 2019 年人口(万人) |
---|---|---|
河北省 | 7461 | 7447 |
山西省 | 3492 | 3497 |
辽宁省 | 4259 | 4277 |
吉林省 | 2407 | 2448 |
python
import pandas as pd
data = pd.read_csv('../data/中国城市人口数据.csv', encoding='gbk')
# 基本信息查看
print('数据维度为:', data.ndim)
print('数据大小为:', data.size)
print('数据形状为:', data.shape)
# 描述性统计
print(data['2020年人口(万人)'].describe())
# 统计城市人口增长
print('人口增长数:', data['2020年人口(万人)'].sum() - data['2019年人口(万人)'].sum())
保存可视化图
python
import matplotlib.pyplot as plt
# 绘制示例图形
plt.plot([1,2,3], [4,5,6])
# 保存为 PNG 格式(默认格式)
plt.savefig('my_plot.png')
# 保存为 PDF 矢量图(适合学术论文)
plt.savefig('my_plot.pdf')
# 保存为 SVG 矢量图(可编辑)
plt.savefig('my_plot.svg')