Python数据分析三剑客:NumPy、Pandas、Matplotlib
目录
简介
1、数据分析三剑客简介
- NumPy:数值计算基础库,提供高性能的多维数组对象
- Pandas:数据处理和分析库,提供强大的数据结构和数据分析工具
- Matplotlib:数据可视化库,提供丰富的绘图功能
2、NumPy 概述
2.1 什么是 NumPy
NumPy(Numerical Python)是Python科学计算的基础包,它提供了:
- 快速高效的多维数组对象 ndarray
- 用于对数组执行元素级计算以及直接对数组执行数学运算的函数
- 用于读写硬盘上基于数组的数据集的工具
- 线性代数运算、傅里叶变换,以及随机数生成
- 用于将C、C++、Fortran代码集成到Python的工具
2.2 NumPy 的特点
- 高效的数组运算:比纯Python代码快10-100倍
- 丰富的数学函数:支持大量的数学运算
- 广播功能:不同形状的数组之间的数学运算
- 底层语言实现:核心代码用C语言编写,执行效率高
3、Pandas 概述
3.1 什么是 Pandas
Pandas是基于NumPy构建的库,为Python编程语言提供了快速、强大、灵活且易于使用的数据结构和数据分析工具。
3.2 Pandas 的核心数据结构
- Series:一维带标签数组
- DataFrame:二维表格型数据结构
3.3 Pandas 的主要功能
- 数据清洗和准备
- 数据整理和转换
- 数据分析和建模
- 数据可视化
4、Matplotlib 概述
4.1 什么是 Matplotlib
Matplotlib是Python最著名的绘图库,它提供了一整套和MATLAB类似的绘图API,非常适合交互式绘图。
4.2 Matplotlib 的特点
- 丰富的图表类型:线图、散点图、柱状图、饼图等
- 高度可定制:可以控制图表的每一个细节
- 多种输出格式:支持PNG、PDF、SVG等格式
- 与IPython兼容:支持在IPython环境中交互式绘图
5、三者的关系
5.1 层次依赖关系
NumPy、Pandas 和 Matplotlib 三者构成了 Python 数据分析的完整技术栈,它们之间存在着清晰的层次依赖关系:
NumPy 是基础层
- 提供了高效的多维数组(ndarray)对象
- 是 Pandas 和 Matplotlib 的底层依赖
- 负责数值计算和数组操作
Pandas 是数据处理层
- 基于 NumPy 构建,使用 NumPy 数组作为底层存储
- 提供了更高级的数据结构(Series、DataFrame)
- 专注于数据清洗、整理和分析
Matplotlib 是可视化层
- 依赖于 NumPy 的数据结构
- 能够直接处理 Pandas 的数据对象
- 负责将数据转化为直观的图表
5.2 功能互补关系
三者各司其职,形成了完整的数据分析工作流:
NumPy - 数值计算引擎
- 核心功能:数学运算、线性代数、随机数生成
- 数据格式:ndarray 多维数组
- 优势:计算效率高,内存占用少
Pandas - 数据处理工具
- 核心功能:数据清洗、转换、聚合、分析
- 数据格式:Series(一维)、DataFrame(二维)
- 优势:数据操作便捷,支持缺失值处理
Matplotlib - 可视化平台
- 核心功能:图表绘制、图形定制、结果展示
- 输出形式:静态图片、交互式图表
- 优势:图表类型丰富,定制化程度高
5.3 代码示例
一、numpy
提供高性能的多维数组对象
1、安装、导入
1.1 安装:
# 使用 pip
安装 pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
# 使用 conda
安装 conda install numpy
1.2 导包numpy
import numpy as np # 惯例缩写为 np
2、NumPy 核心数据结构:ndarray
2.1 创建数组
import numpy as np
# 创建一维数组
arr1 = np.array([1, 4, 5, 6, 7])
print(arr1, type(arr1), arr1.shape)
# 创建二维数组
arr2 = np.array([[1, 2, 4], [3, 5, 5]])
print(arr2,arr2.shape)
# 创建元素全为0的数组
arr_0 = np.zeros((3,4))
print(arr_0)
# 创建元素全为1的数组
arr_1 = np.ones((2,3))
print(arr_1)
# 创建有序数组,从0-12,步长为2
arr3 = np.arange(0, 12, 2)
print(arr3)
# 创建等分数组:0-2,等分4
arr4 = np.linspace(0, 2, 4)
print(arr4)
# 创建随机数组:0-1均匀分布,2行3列
arr5 = np.random.rand(2, 3)
print(arr5)
# 创建随机数组:正态分布、3行3列
arr6 = np.random.randn(3, 3)
print(arr6)
2.2 数组属性
import numpy as np
arr1 = np.array([[1,2,3],[4,5,6]])
print(arr1)
# 数组维度
print(f"array dimension:{arr1.ndim}")
# 数组形状
print(f"array shape:{arr1.shape}")
# 数组大小
print(f"array size:{arr1.size}")
# 数组类型
print(f"array type:{arr1.dtype}")
3、NumPy 数组操作
3.1 数组索引和切片
import numpy as np
arr_index = np.array([[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25]]
)
print(arr_index)
# 索引
# 输出arr_index[3,4]
print(arr_index[3,4])
# 切片
# 输出第二行
print(arr_index[1])
# 输出第二列
print(arr_index[:,1])
# 输出最后一行
print(arr_index[-1])
# 输出最后一列
print(arr_index[:,-1])
# 输出1-5步长为2的行,1-5步长为3的列
print(arr_index[0:6:2, 0:6:3])
# 布尔
# 输出大于5的数
print(arr_index[arr_index > 10])
3.2 数组形状操作
import numpy as np
# 生成一个有序一维数组
arr0 = np.arange(20)
print(arr0)
# 调整形状
arr_rs = arr0.reshape(4, 5)
print(arr_rs)
# 转置
print(arr_rs.T)
# 展平
print(arr_rs.flatten())
# 调整大小-取前3*4个数据
print(np.resize(arr_rs, (3, 4)))
# 调整大小-超出部分从前边开始轮询
print(np.resize(arr_rs, (3, 7)))
4、NumPy 数学运算
4.1 基本运算
import numpy as np
arr_a = np.arange(1, 6)
arr_b = np.arange(5, 10)
print(arr_a)
print(arr_b)
# 数组加法
print(arr_a + arr_b)
# 数组减法
print(arr_a - arr_b)
# 数组乘法
print(arr_a * arr_b)
# 数组除法
print(arr_a / arr_b)
# 数组整除
print(arr_a // arr_b)
# 数组取余
print(arr_a % arr_b)
# 数组除法
print(arr_b % arr_a)
# 矩阵乘法
metrix_a = np.array([[1, 2], [3, 4]])
metrix_b = np.array([[5, 6], [7, 8]])
metrix_mul = np.dot(metrix_a,metrix_b)
print(metrix_mul)
# @ 实现矩阵乘法
print(metrix_a @ metrix_b)
4.2 统计运算
import numpy as np
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
# 求和
print(arr1.sum())
# 求平均数
print(arr1.mean())
# 求方差
print(arr1.var())
# 求标准差
print(arr1.std())
# 求最大、最小值
print(np.max(arr1))
print(np.min(arr1))
# 求最大、小值的索引
print(np.argmax(arr1))
print(np.argmin(arr1))
5、NumPy 广播机制
import numpy as np
# 广播示例
a = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
b = np.array([10, 20, 30])
c = np.array([[2],[3],[4]])
# 将b广播到a的每一行
print(a + b)
# 将c广播到a的每一列
print(a * c)
# 输出
'''
[[11 22 33]
[14 25 36]
[17 28 39]]
[[ 2 4 6]
[12 15 18]
[28 32 36]]
'''
二、pandas
数据处理和分析
1、Pandas 安装和导入
1.1 安装 Pandas
# 使用 pip 安装
pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
# 使用 conda 安装
conda install pandas
1.2 导入 Pandas
import pandas as pd # 惯例缩写为 pd
2、Pandas 核心数据结构
2.1 Series:一维带标签数组
import pandas as pd
# 创建一维带标签数组
s1 = pd.Series([1, 2, 3])
print(s1)
# 创建一维带执行指定标签的数组
s2 = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
print(s2)
# 输出全部标签
print(s2.index)
# 输出所有值
print(s2.values)
2.2 DataFrame:二维表格数据结构
import pandas as pd
# 字典创建二维数组
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, 30, 35, 28],
'城市': ['北京', '上海', '广州', '深圳'],
'工资': [5000, 7000, 6000, 8000]
}
p1 = pd.DataFrame(data)
print(p1)
# 列表创建二维数组
data_list = [
['张三', 25, '北京', 5000],
['李四', 30, '上海', 7000],
['王五', 35, '广州', 6000],
['赵六', 28, '深圳', 8000]
]
# index 执行行索引,column指定列索引
p2 = pd.DataFrame(data_list, index=[1, 2, 3, 4], columns=['name', 'age', 'city', 'galary'])
print(p2)
# 输出形状
print(p2.shape)
# 输出列名
print(p2.columns)
# 输出行名
print(p2.index)
# 输出类型——会分别输出列的类型
print(p2.dtypes)
#输出
'''
姓名 年龄 城市 工资
0 张三 25 北京 5000
1 李四 30 上海 7000
2 王五 35 广州 6000
3 赵六 28 深圳 8000
name age city galary
1 张三 25 北京 5000
2 李四 30 上海 7000
3 王五 35 广州 6000
4 赵六 28 深圳 8000
(4, 4)
Index(['name', 'age', 'city', 'galary'], dtype='object')
Index([1, 2, 3, 4], dtype='int64')
name object
age int64
city object
galary int64
dtype: object
'''
3、 DataFrame 基本操作
3.1 数据查看和选择
注意:取多行、多列时,需要使用[[元素]] 形式
df[['name', 'salary']]
df.loc[['p1','p3']]
df.
iloc[行选择器, 列选择器]:适用索引形式,获取行、列数据。
左开右闭,与列表、字符串一致逗号前面控制选取哪些行,逗号后面控制选取哪些列
import pandas as pd
import pandas as ps
data_list = [
['张三', 25, '北京', 5000],
['李四', 30, '上海', 7000],
['王五', 35, '广州', 6000],
['赵六', 28, '深圳', 8000]
]
df = pd.DataFrame(data_list, index=['p1', 'p2', 'p3', 'p4'], columns=['name', 'age', 'city', 'salary'])
# 查看数据
print(df)
# 输出前3行
print(df.head(3))
# 输出后两行
print(df.tail(2))
# 输出描述
print(df.describe())
# 选择列数据
# 取单列
print(df['name'])
# 取多列,df[列表]
print(df[['name', 'salary']])
# 选取行数据
# 按指定索引进行取数据:loc[]
# 单行数据
print(df.loc['p1'])
# 多行数据:df.loc[列表]
print(df.loc[['p1','p3']])
# 使用自定义标签进行切片输出:左闭右闭
print(df['p1':'p3'])
# 按默认索引进行数据: iloc[行选择器, 列选择器]
# 使用默认标签进行切片输出:左闭右开
# 单行指定数据
print(df.iloc[0])
# 获取1行到结尾数据
print(df.iloc[1:])
# 获取1行到结尾行,2列到结尾列
print(df.iloc[1:,2:])
3.2 数据筛选和过滤
import pandas as pd
df = pd.DataFrame({
'name': ['张三', '李四', '王五', '赵六', '钱七'],
'age': [25, 30, 35, 28, 32],
'department': ['技术部', '销售部', '技术部', '人事部', '销售部'],
'salary': [5000, 7000, 6000, 5500, 7500]
})
# 筛选
# 方法一:
print(df[df['age'] >= 30]) # 筛选年龄大于等于30的
# 方法二:
print(df.query('age > 30'))
print(df.query('age >30 and salary > 6000')) # 筛选年龄大于等于30并且薪资大于6000的
# 排序:默认升序
print(df.sort_values('salary'))
print(df.sort_values('salary', ascending=False)) # 降序排列
print(df.sort_values(['department', 'salary'], ascending=[False, True]))
4、数据处理和清洗
4.1 处理缺失值
import pandas as pd
# reda_csv打开指定路径的csv文件
# sep分隔符,默认为英文逗号
df = pd.read_csv('./data/清洗数据.csv',sep=',')
# print(df)
# 检查缺失值
# 缺失值数量统计
print(df.isnull().sum())
# 非缺失值数量统计
print(df.notnull().sum())
# 删除缺失值
# 删除包含缺失值的行
df.dropna()
# 删除全为缺失值的行
print(df.dropna(how='all'))
# 删除指定列为空的行
df_cleaned = df.dropna(subset=['A'])
# 填充缺失值
print(df.fillna(0))
print(df.fillna(df.mean()))
4.2 数据转换
import pandas as pd
df = pd.read_csv('./data/分组聚合数据.csv')
print(df)
# 分组聚合
print(df.groupby('产品')['销售额'].sum())
print(df.groupby(['产品', '地区'])['销售额'].agg(['sum','mean']))
print(df.groupby(['产品', '地区'])['销售额'].sum())
# 数据透视表进行分组聚合
print(df.pivot_table(index='产品', values='销售额', aggfunc='sum'))
df.pivot_table(index=['产品', '地区'], values='销售额', aggfunc=['sum', 'max'])
5、pandas处理excel文件
为文件新增一列,然后存为新文件
import pandas as pd
df = pd.read_excel(r'D:\python\project\python_adv\pythonPandas\data\data1.xlsx',engine="openpyxl")
# print(df.query('工资>=7000'))
df["是否成年"] = df["年龄"].apply(lambda x: 1 if x >= 18 else 0)
df.to_excel('./data/results.xlsx',engine="openpyxl")
三、Matplotlib
数据可视化
1、Matplotlib 安装和导入
1.1 安装 Matplotlib
# 使用 pip 安装
pip install matplotlib
# 使用 conda 安装
conda install matplotlib
1.2 导入 Matplotlib
import matplotlib.pyplot as plt # 惯例缩写为 plt
2、基本绘图功能
2.1 折线图
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
# 新版本需要指定 matplotlib 使用 TkAgg 作为图形后端来渲染和显示图
matplotlib.use("TkAgg")
# 添加支持中文
plt.rcParams['font.sans-serif'] = ['SimHei','Heiti TC']
plt.rcParams['axes.unicode_minus'] = False
# 主备数据
x = np.array([1, 2, 3, 4, 5])
y = np.array([3, 5, 6, 1, 8])
# 设置显示的大小
plt.figure(figsize=(10, 5))
# 画图
plt.plot(x, y, color='yellow')
# plt.bar(x, y) # 柱状图
# 添加标题
plt.title("折线图示例")
# 添加x、y轴标识
plt.xlabel("x轴")
plt.ylabel('Y轴')
# 为图像添加网格
plt.grid()
# 显示图像
plt.show()
2.2 散点图
import matplotlib.pyplot as plot
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
matplotlib.use('TkAgg')
plt.rcParams['font.sans-serif'] = ['SimHei','Heiti TC']
plt.rcParams['axes.unicode_minus'] = False
# 准备数据
np.random.seed(56)
x = np.random.randn(50)
y = x*2 + np.random.randn(50)*0.9
# 设置大小
plt.figure(figsize=(10,4))
# 绘图
plt.scatter(x,y,color='green')
# 设置标题
plt.title("散点图示例")
# 设置x、y轴
plt.xlabel("X轴")
plt.ylabel("Y轴")
plt.grid()
# 图形显示
plt.show()
四、实例——中美日GDP数据分析综合案例
单独获取中美日三个国家的各个年份的GDP数据,并绘制出折线图方便对比
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
import pandas as pd
matplotlib.use("TkAgg")
plt.rcParams['font.sans-serif'] = ['SimHei','Heiti TC']
plt.rcParams['axes.unicode_minus'] = True
# 读取./data/1960-2019全球GDP数据.csv 文件
df = pd.read_csv('./data/1960-2019全球GDP数据.csv',sep=',',encoding='gbk')
# 删除有null数据的行,并更改原df
df.dropna(inplace=True)
# print(df)
# 数据处理
# 筛选对应数据,并复制为之后更改
df_China = df.query('country == "中国"').copy()
df_America = df.query('country == "美国"').copy()
df_Japan = df.query('country == "日本"').copy()
# 设置年份为索引
df_China.set_index("year", inplace=True)
df_America.set_index("year", inplace=True)
df_Japan.set_index("year", inplace=True)
# 画图
plt.figure(figsize=(10, 5))
plt.plot(df_China.index, df_China["GDP"], color='black', label='中国')
plt.plot(df_America.index, df_America["GDP"], color='green', label='美国')
plt.plot(df_Japan.index, df_Japan["GDP"], color='yellow', label='日本')
# 添加网格、标题、x轴、y轴、图例
plt.grid()
plt.legend() # 图例
plt.title("1960-2019年中美日GDP数据折线图")
plt.xlabel("年份")
plt.ylabel("GDP")
# 显示
plt.show()
更多推荐

所有评论(0)