目录简介1、数据分析三剑客简介2、NumPy 概述2.1 什么是 NumPy2.2 NumPy 的特点3、Pandas 概述3.1 什么是 Pandas3.2 Pandas 的核心数据结构3.3 Pandas 的主要功能4、Matplotlib 概述4.1 什么是 Matplotlib4.2 Matplotlib 的特点5、三者的关系5.1 层次依赖关系5.2 功能互补关系5.3 代码示例一、numpy1、安装、导入1.1 安装1.2 导包numpy2、NumPy 核心数据结构ndarray2.1 创建数组2.2 数组属性3、NumPy 数组操作3.1 数组索引和切片3.2 数组形状操作4、NumPy 数学运算4.1 基本运算4.2 统计运算5、NumPy 广播机制二、pandas1、Pandas 安装和导入1.1 安装 Pandas1.2 导入 Pandas2、Pandas 核心数据结构三、Matplotlib简介1、数据分析三剑客简介NumPy数值计算基础库提供高性能的多维数组对象Pandas数据处理和分析库提供强大的数据结构和数据分析工具Matplotlib数据可视化库提供丰富的绘图功能2、NumPy 概述2.1 什么是 NumPyNumPyNumerical Python是Python科学计算的基础包它提供了快速高效的多维数组对象 ndarray用于对数组执行元素级计算以及直接对数组执行数学运算的函数用于读写硬盘上基于数组的数据集的工具线性代数运算、傅里叶变换以及随机数生成用于将C、C、Fortran代码集成到Python的工具2.2 NumPy 的特点高效的数组运算比纯Python代码快10-100倍丰富的数学函数支持大量的数学运算广播功能不同形状的数组之间的数学运算底层语言实现核心代码用C语言编写执行效率高3、Pandas 概述3.1 什么是 PandasPandas是基于NumPy构建的库为Python编程语言提供了快速、强大、灵活且易于使用的数据结构和数据分析工具。3.2 Pandas 的核心数据结构Series一维带标签数组DataFrame二维表格型数据结构3.3 Pandas 的主要功能数据清洗和准备数据整理和转换数据分析和建模数据可视化4、Matplotlib 概述4.1 什么是 MatplotlibMatplotlib是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 numpy1.2 导包numpyimport numpy as np # 惯例缩写为 np2、NumPy 核心数据结构ndarray2.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(farray dimension:{arr1.ndim}) # 数组形状 print(farray shape:{arr1.shape}) # 数组大小 print(farray size:{arr1.size}) # 数组类型 print(farray 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 pandas1.2 导入 Pandasimport pandas as pd # 惯例缩写为 pd2、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], dtypeobject) Index([1, 2, 3, 4], dtypeint64) 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, ascendingFalse)) # 降序排列 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(howall)) # 删除指定列为空的行 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销售额, aggfuncsum)) df.pivot_table(index[产品, 地区], values销售额, aggfunc[sum, max])5、pandas处理excel文件为文件新增一列然后存为新文件import pandas as pd df pd.read_excel(rD:\python\project\python_adv\pythonPandas\data\data1.xlsx,engineopenpyxl) # print(df.query(工资7000)) df[是否成年] df[年龄].apply(lambda x: 1 if x 18 else 0) df.to_excel(./data/results.xlsx,engineopenpyxl)三、Matplotlib数据可视化1、Matplotlib 安装和导入1.1 安装 Matplotlib# 使用 pip 安装 pip install matplotlib # 使用 conda 安装 conda install matplotlib1.2 导入 Matplotlibimport matplotlib.pyplot as plt # 惯例缩写为 plt2、基本绘图功能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, coloryellow) # 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,colorgreen) # 设置标题 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,,encodinggbk) # 删除有null数据的行并更改原df df.dropna(inplaceTrue) # 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, inplaceTrue) df_America.set_index(year, inplaceTrue) df_Japan.set_index(year, inplaceTrue) # 画图 plt.figure(figsize(10, 5)) plt.plot(df_China.index, df_China[GDP], colorblack, label中国) plt.plot(df_America.index, df_America[GDP], colorgreen, label美国) plt.plot(df_Japan.index, df_Japan[GDP], coloryellow, label日本) # 添加网格、标题、x轴、y轴、图例 plt.grid() plt.legend() # 图例 plt.title(1960-2019年中美日GDP数据折线图) plt.xlabel(年份) plt.ylabel(GDP) # 显示 plt.show()