第一章 数据分析流程
数据分析完整流程
数据收集→数据清洗→数据分析→数据可视化
数据分析核心三件套
Numpy
Pandas
Matplotlib
第二章 Numpy科学计算
Numpy介绍
Python 中科学计算的基础包,提供多维数组对象、各种派生对象(掩码数组和矩阵等)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/O、离散傅里叶变化、基本线性代数、基本统计运算、随机模拟等。
Numpy的主要功能:
- ndarray,一个具有矢量算数运算和复杂广播能力的快速且节省空间的多维数组
- 用于对整组数据进行快速运算的标准数学函数(无需编写循环)
- 用于读写磁盘数据的工具以及用于操作内存映射文件的工具
- 线性代数、随机数生成以及傅里叶变换功能
- 用于集成由 C、C++、Fortran等语言编写的代码的 API
ndarray
1、Numpy数组(ndarray)的核心特性
· 多维性:支持 0维(标量)、1维(向量)、2维(矩阵)更高维数组
· 同质性:所有元素类型必须一致(通过 dtype指定)
· 高效性:基于连续内存块存储,支持向量化运算
2、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矩阵
标量0维5,3.14单个数字,无行列 向量1维[1,2,3]只有行或者列(一维数组) 矩阵2维[[1,2],[3,4]]严格的行列结构(二维表) 张量>=3维[[[1,2],[3,4]]]高阶数组(如RGB图像)3、ndarray的创建
- 基础构造: 适用于手动构建小规模数组或复制已有数据。
- 预定义形状填充: 用于快速初始化固定形状的数组 (如全 0 占位、全 1 初始化)。
- 基于数值范围生成: 生成数值序列,常用于模拟时间序列、坐标网格等。
- 特殊矩阵生成:数学运算专用 (如线性代数中的单位矩阵)。
- 随机数组生成: 模拟实验数据、初始化神经网络权重等场景。
- 高级构造方法:处理非结构化数据 (如文件、字符串) 或通过函数生成复杂数组。
基础构造/np.array()np.copy()预定义形状填充/np.zeros()np.ones()np.empty()np.full()基于数值范围生成/np.arange()np.linspace()np.logspace()特殊矩阵生成/np.eye()np.diag()随机数组生成/np.random.rand()np.random.randn()np.random.randint()高级构造方法/np.array()np.loadtxt()np.fromfunction()4、ndarray的数据类型
bool布尔类型------------------------------------------------------------------------------int8、uint8 有符号、无符号的8位(1字节)整形 int16、uint16 有符号、无符号的16位(2字节)整形 int32、uint32 有符号、无符号的32位(4字节)整形 int64、uint64 有符号、无符号的64位(8字节)整形------------------------------------------------------------------------------float16 半精度浮点型 float32 单精度浮点型 float32 双精度浮点型------------------------------------------------------------------------------complex64 用两个32位浮点数表示的复数 complex128 用两个64位浮点数表示的复数5、索引与切片
基本索引 通过整数索引直接访问元素。索引从0开始 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,step)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符&、|。Numpy常用函数
-----------------------------------------------------------------------------------------------基本数学(执行基础的数学运算) np.sqrt(x)计算数组中每个元素的平方根 np.exp(x)计算数组中每个元素的自然指数e^x np.log(x)计算数组中每个元素的自然对数(ln(x))np.sin(x)计算数组中每个元素的正弦值(弧度制) np.abs(x)计算数组中每个元素的绝对值 np.power(a,b)计算 a^b(a 的 b 次方),a/b 可以是数组 np.round(x,n)将 x 四舍五入到 n 位小数,n省略则取整-----------------------------------------------------------------------------------------------统计(对数组进行统计分析) np.sum(x)计算数组所有元素的和 np.mean(x)计算数组的算术平均值 np.median(x)计算数组的中位数 np.std(x)计算数组的标准差(默认总体标准差) np.var(x)算数组的方差(默认总体方差) np.min(x)/np.max(x)计算数组的最小值/最大值 np.percentile(x,q)计算数组的 q 百分位数(q 取0-100)-----------------------------------------------------------------------------------------------比较(数组元素的条件判断,返回布尔数组,是数据筛选的核心工具) np.greater(a,b)判断 a 中元素是否大于 b 中对应元素 np.less(a,b)判断 a 中元素是否小于 b 中对应元素 np.equal(a,b)判断 a 中元素是否等于 b 中对应元素 np.logical_and(a,b)逻辑与:a 和 b 对应元素都为True时返回Truenp.where(condition,x,y)条件满足返回 x,不满足返回 y np.select(条件,返回的结果)-----------------------------------------------------------------------------------------------去重(用于数组的去重和元素匹配判断) np.unique(x)返回数组去重后的有序数组 np.in1d(a,b)判断 a 中每个元素是否在 b 中,返回布尔数组-----------------------------------------------------------------------------------------------排序(用于数组的排序操作,注意区分 “返回新数组” 和 “原地修改”) np.sort(x)返回数组排序后的**新数组**(原数组不变) x.sort()对数组 x**原地排序**(无返回值,原数组改变) np.argsort(x)返回数组排序后元素的**原索引**数组 np.lexsort(keys)多键排序(按最后一个 key 为主键),返回索引-----------------------------------------------------------------------------------------------其他(用于数组的形状调整、拼接、分割等操作) np.concatenate((a,b))拼接多个数组(维度需一致) np.split(x,indices)将数组分割为多个子数组 np.reshape(x,shape)改变数组形状(元素总数不变) np.copy(x)复制数组(深拷贝,修改副本不影响原数组) np.isnan(x)判断数组元素是否为 NaN(缺失值)-----------------------------------------------------------------------------------------------案例练习
''' 题目1:温度数据分析 某城市一周的最高气温(℃)为 [28, 30, 29, 31, 32, 30, 29]。 - 计算平均气温、最高气温和最低气温 - 找出气温超过 30℃ 的天数 '''importnumpyasnp tempture=np.array([28,30,29,31,32,30,29])print('平均气温为:',np.median(tempture))print('最高气温为:',np.max(tempture))print('最低气温为:',np.min(tempture))print('气温超过30的天数:',len(tempture[tempture>30]))print(np.count_nonzero(tempture>30))print(np.cumsum(np.where(tempture>30,1,0))[-1])''' 题目2:学生成绩统计 某班级5名学生的数学成绩为[85, 90, 78, 92, 88]。 - 计算成绩的平均分、中位数和标准差 - 将成绩转换为百分制(假设满分为10) '''scores=np.array([85,90,78,92,88])print('平均分为:',np.mean(scores))print('中位数为:',np.median(scores))print('标准差为:',np.std(scores))print(scores/10)''' 题目3:矩阵运算 给定矩阵 A=[[1,2],[3,4]] 和 B=[[5,6],[7,8]]- 计算A+B和A*B(逐元素乘法) - 计算A和B的矩阵乘法(点积) '''A=np.array([[1,2],[3,4]])B=np.array([[5,6],[7,8]])print(A+B)print(A*B)print(A@B)print(np.dot(A,B))''' |1 2| |5 6| |3 4| |7 8| C11 = A[1:]*B[:1] = (1 2)*(5 7) = 1*5+2*7 = 19 C12 = A[1:]*B[:2] = (1 2)*(6 8) = 1*6+2*8 = 22 '''''' 题目4:随机数据生成 生成一个(3,4)的随机整数数组,范围[0,10) - 计算每列的最大值和每行的最小值 - 将数组中的所有奇数替换为-1 '''arr=np.random.randint(0,10,(3,4))print(arr)print('每列的最大值',np.max(arr,axis=0))# axis=0列 =1行print('每行的最小值',np.min(arr,axis=1))print(np.where(arr%2==1,-1,arr))arr[arr%2==1]=-1print(arr)''' 题目5:数组变形 创建一个1到12的一维数组,并转换为(3,4)的二维数组 - 计算每行的和与每列的平均值 - 将数组展品为一维数组 '''arr=np.arange(1,13,1)print(arr)arr=np.reshape(arr,(3,4))print(arr)print(np.sum(arr,axis=1))print(np.mean(arr,axis=0))print(np.reshape(arr,(12)))''' 题目6:布尔索引 生成一个(5,5)的随机数组,范围[0,20) - 找出数组中大于10的元素 - 将所有大于10的元素替换为0 '''np.random.seed(0)arr=np.random.randint(0,20,(5,5))print(arr)print(arr[arr>10])arr[arr>10]=0print(arr)''' 题目7:统计函数应用 某公司6个月的销售额(万元)为[120,135,110,125,130,140] - 计算销售额的总和、均值和方差 - 找出销售额最高的月份和最低的月份 '''arr=np.array([120,135,110,125,130,140])print(np.sum(arr))print(np.mean(arr))print(np.var(arr))print(np.argmax(arr)+1)print(np.argmin(arr)+1)''' 题目8:数组拼接 给定A=[1,2,3]和B=[4,5,6] - 将A和B水平拼接为一个新数组 - 将A和B垂直拼接为一个新数组 '''A=np.array([1,2,3])B=np.array([4,5,6])print(np.concatenate((A,B)))print(np.reshape(np.concatenate((A,B)),(2,3)))''' 题目9:唯一值与排序 给定数组[2,1,2,3,1,4,3] - 找出数组中的唯一值并排序 - 计算每个唯一值出现的次数 '''arr=np.array([2,1,2,3,1,4,3])u_arr,counts=np.unique(arr,return_counts=True)print(u_arr)print(counts)d=[]foriinrange(len(u_arr)):d=d+[len(arr[arr==u_arr[i]])]print(d)''' 题目10:综合应用 某商店5天的销售额(万元)和成本(万元)如下: 销售额[20,25,22,30,28] 成本[15,18,16,22,20] - 计算每天的利润(销售额-成本) - 计算利润的平均值和标准差 - 找出利润最高的天数 '''sell=np.array([20,25,22,30,28])cost=np.array([15,18,16,22,20])profit=sell-costprint('每天的利润为:',profit)print('平均值',np.mean(profit))print('标准差',np.std(profit))print('利润最高的天数',len(profit[profit==np.max(profit)]))