4(1)

2020-03-01 372浏览

  • 1.第 4 周:数据汇总与统计 徐波 xubo@dhu.edu.cn
  • 2.课程回顾 数据分析技术
  • 3.2.2 多维数组运算 • 基本算数运算 • 函数运算
  • 4.二维数组与标量运算 • 为所有同学的所有课程成绩增加 5 分。 >>> scores + 5 array([[75, 90, [65, 69, [95, 98, [85, 87, [93, 77, 等价于 二维数组 + 二维数组 82, 85, 93, 96, 83, 95, 80, 92, 93, 95, 87, 85, 91, 88, 96, 89, 97, 95, 91, 78, 94], 95], 96], 85], 85]]) >>> a = np.ones((5,7))*5 >>> a array([[ 5., 5., 5., 5., 5., [ 5., 5., 5., 5., 5., [ 5., 5., 5., 5., 5., [ 5., 5., 5., 5., 5., [ 5., 5., 5., 5., 5., >>> scores + a array([[ 75., 90., 82., 95., [ 65., 69., 85., 80., [ 95., 98., 93., 92., [ 85., 87., 96., 93., [ 93., 77., 83., 95., 二维数组 + 数字 5., 5., 5., 5., 5., 5.], 5.], 5.], 5.], 5.]]) 87., 85., 91., 88., 96., 89., 97., 95., 91., 78., 94.], 95.], 96.], 85.], 85.]])
  • 5.二维数组与一维数组运算 • 每个科目基础分不同,为各科目增加相应的基础分。 二维数组 + 一维数组 >>> bonus = np.array([3,4,5,3,6,7,2]) >>> scores + bonus array([[73, 89, 82, 93, 88, 91, 91], [63, 68, 85, 78, 86, 99, 92], [93, 97, 93, 90, 92, 97, 93], [83, 86, 96, 91, 89, 93, 82], [91, 76, 83, 93, 97, 80, 82]]) • 修改选定数据 >>> scores[names == ' 肖良英 ', subjects == 'English'] array([64]) >>> scores[names == ' 肖良英 ', subjects == 'English'] + 5 array([69])
  • 6.多维数组运算 - 通用函数 • 一元, 1 个输输 入数 输 输输 ,返回 输 输 1 个数组 函数 描述 abs 、 fabs 计算整数、浮点数或复数的绝对值 sqrt 计算各元素的平方根 square 计算各元素的平方 exp 计算各元素的指数 log 、 log10 自然对数、底数为 10 的 log sign 计算各元素的正负号 ceil 计算各元素的 ceiling 值,即大于等于该值的最小整数 floor 计算各元素的 floor 值,即小于等于该值的最大整数 cos 、 cosh 、 sin sinh 、 tan 、 tan h 普通和双曲型三角函数
  • 7.通用函数 - 二元 • 2 个输入数组,返回 1 个数组 函数 描述 add 将数据中对应的元素相加 subtract 从第一个数组中减去第二个数组中的元素 multiply 数组元素相乘 divide 数组对应元素相除 power 对第一个数组中的元素 A ,根据第二个数组中的相应元素 B ,计算 AB mod 元素级的求模运算 copysign 将第二个数组中的值的符号复制给第一个数组中的值 equal,not_equal 执行元素级的比较运算,产生布尔型数组
  • 8.第1轴 聚合函数 第0轴 • 支持在行、列或者全体数输 元素上的聚集函数 输 输 输 输 输 输 输 输 函数 sum mean min 、 max argmin 、 ar gmax cumsum cumprod 描述 求和 算术平均值 最大值和最小值 最大值和最小值的索引 从 0 开始向前累加各元素 从 1 开始向前累乘各元素 >>> scores.sum(axis = 0) # 按列求 和 • 统计不同科目的成绩总分 array([388, 396, 414, 430, 422, 425, • 求“王微”所有课程成绩的平均分430]) >>> scores[names == ' 王 微 '].mean() • 查询英语考试成绩最高同学的姓名 82.428571428571431 >>> names[scores[:,subjects == 'English'].argmax()] ' 方绮雯 '
  • 9.随机数组生成函数 • np.random 模块 函数 描述 random 随机产生 [0,1) 之间的浮点值 randint 随机生成给定范围内的一组整数 uniform 随机生成给定范围内服从均匀分布的一组浮点数 choice 在输 定的序列内随机 输输输输输输输输输输 元素 输 normal 随机生成一组服从给定均值和方差的正态分布随机数
  • 10.本周课程 数据分析技术
  • 11.数据汇总与统计 1. 2. 3. 4. 5. 6. 统计的基本概念 统计的含义 常用统计量 Pandas 数据结构 Seires 对象及数据访问 DataFrame 对象及数据访问 数据文件读取 读写 CSV 和文本文件 读写 Excel 文件 数据清洗 缺失数据处理 去重 数据规整化 数据合并 数据排序 统计分析 通用函数与运算 统计函数 相关性分析
  • 12.1. 统计的基本概念
  • 13.1. 统计的基本概念 统计的含义 • 统计是对数据资料的获取、整理、分析、描述及推断方法的总称 • 在理解输输 有数据的基 输 输 输 输 输输 上, 输 输输 计分析 输 输 输输 一步 输 输输输输 律 • 对未来实施预测 • 如市场预测、人口预测、经济发展预测等 案例 3-1 :学生问卷调查统计分析 50 名同学的反馈结果
  • 14.1. 统计的基本概念 总体 • 研究对象的全体称为总体 • 如:所有学生的身高、成绩和体重等 • 总体中的每一个成员都是个体 • 如:单个同学的身高、成绩 • 从总体中抽出部分个体组成的集合称为样本,样本中所含个体的数目称为样本容量 案例 3-1 包括学生的性输输 、年 输 输输 、输输 程输输 9趣等 个 输 总体  每个总体的样本容量为 50
  • 15.1. 统计的基本概念 常用统计量含义 统计量 含义 案例说明 均值 样本(一组数据)的算术平均值 学生身高均值 168.4cm ,描述了 全班同学身高的整体特征 ,反映数据的集中趋势 方差 两组数据 {1,9,30,60} 和 描述一组数据的离散程度,或样 {24,25,25,26} ,样本均值都是 25 ,而方差分别为 本个体距离均值的分散程度 520.5 , 0.5 ,表示第一组数据的 离散程度远大于第二组 频率 频数与样本容量的比值为频率。 频数是某个值在样本中出现的次 案例中性别的值为男和女,男生 的频率是 53% ,女生为 47% 数,或样本中不同的值分别出现 的次数 众数 样本中出现次数最多的值,如果 课程兴趣反馈数据的众数是 4 , 所有值出现的次数一样多,则认 同学对《数据科学》比较感兴趣 的同学人数最多 为样本没有众数。
  • 16.1. 统计的基本概念 常用统计量含义 统计量 分位数 含义 案例说明 将一个随机变量的概率分布范围分 为几个等份的数值点 包括中位数、四分位数、百分位 数等 将样本数据从小到大顺序排列,如 果样本容量为奇数,处在中间的数 是中位数;否则处在最中间两个数 的平均值是中位数 中位数的作用类似于平均值,反 应数据整体特征,但是不受最大 、最小两个极端数值的影响 将样本由小到大排列后分成四等份 ,处于 3 个分割点位置的数值就是 四分位数 Q1 表示下四分位数:排在 25% 的数值; Q2 表示中位数; Q3 表 示上四分位数:排在 75% 的数值。 Q3-Q1 称为四分位距,反应了样 本中间 50% 数据的取值范围 其中: 中位数 四分位数
  • 17.2. pandas 数据结构
  • 18.2. Pandas 数据结构 Why pandas ? • 使用 NumPy 存储学生成绩信息 • 学生姓名,一维 ndarray • 课程名称,一维 ndarray • 各位同学的各门课程成绩,二维 ndarray • 能否将这些数据组织在一个数据结构中? • 将二维的数据的行与学生姓名数组关联 • 将二维的数据的列与课程名称数组关联
  • 19.2. Pandas 数据结构 什么是 pandas ? • pandas 是基于 python 的数据分析工具包 • Series 数据结构用于处理一维数据 • DataFrame 数据结构用于处理二维数据和高维数据 • 汇集多种数据源数据、处理缺失数据 • 对数据进行切片、聚合和汇总统计 • 实现数据可视化 • 使用前需要导入 >>> import pandas as pd • 为方便使用 Series 和 DataFrame ,将其导入本地命名空间 >>> from pandas import Series, DataFrame
  • 20.2. Pandas 数据结构 Series 数据结构 • Series 是类似于数组的一维数据结构,由索引( index )和值( values )两个相关联的 数组组成: Series 创建 Series ( [data,index,....] ) data : Python 的列表或 Numpy 的一维 ndarray 对象 index :列表,若省略则自动生成 0 ~n-1 的序号标签
  • 21.2. Pandas 数据结构 例题 3-1 • 创建 5 名篮球运动员身高的 Series 结构对象 height ,值是身高,索引为球衣号码(数字字符串作为索引)。 >>> height=Series([187,190,185,178,185], index=['13','14','7','2','9']) >>> height 13 187 14 190 7 185 2 178 9 185dtype:int64 • 用字典创建 Series 对象,将字典的 key 作为索引: >>> height=Series({'13':187,'14':190,'7':185,'2':178, '9':185})
  • 22.2. Pandas 数据结构 Series 数据选取方法 选取类型 索引名选取 基于位置选取 条件筛选 选取方法 说明 obj [ index ] 选取某个值 obj [ indexList ] 选取多个值 obj [ loc ] 选取某个值 obj [ locList ] 选取多个值 obj [a:b,c ] 选取位置 a~(b-1) 以及 c 的值 obj [ condition ] 选取满足条件表达式的值 Series 的索引为数字,基于位置序号访问需要使用 iloc 方式
  • 23.2. Pandas 数据结构 例题 3-2 • 使用例 3-1 创建的球员身高 Series 输象 , 输输输球 输输数据的 输 输 输输输、增加、 输 输 输 输输除和修改。 输 输 输输 1. 球员身高查询 >>> height['13'] # 同 height[0] 187 >>> height[ ['13','2','7'] ] 13 2 7 187 178 185 >>> height[1:3] 14 7 # 检索标签序号 1~3 的球员身高 190 185 >>> height[ height.values>=186 ] 13 14 # 同 height[[0,3,2]] 187 190 # 检索高于 186 的球员
  • 24.2. Pandas 数据结构 例题 3-2 2. 球员身高修改 >>> height['13'] = 188 >>> height['13'] # 将 13 号队员的身高修改为 188 188 >>> height[1:3] = 160 >>> height 13 14 7 2 9 188 160 160 178 185 # 修改位置 1 、 2 的数据,标量赋值
  • 25.2. Pandas 数据结构 例题 3-2 3. 增加新球员 >>> a = Series([190,187], index=['23','5']) >>> new = height . append( a ) >>> new 13 14 7 2 9 23 5 188 160 160 178 185 190 187 Series 不能直接添加新数据 append() 函数将两个 Series 拼接输输 生一个新的 输 输 输 输 Series 不改变原 Series >>> height 13 188 14 160 7 160 2 178 9 185
  • 26.2. Pandas 数据结构 例题 3-2 4. 删除离队球员 >>> new = height . drop( ['13', '9'] ) 员数据 >>> new 14 7 2 160 160 178 Series 的 drop() 函数缺省不删除原始对象的数据 >>> height 13 188 14 160 7 160 2 178 9 185 # 删除 13 号球
  • 27.2. Pandas 数据结构 例题 3-2 Series 对象创建后,值可以修改,索引也修改,用新的列表替换即可。 5. 更改球员球衣号码 >>> height.index=[13,14,7,2,9] 字索引 13 14 7 2 9 188 160 160 178 185 Series 的索引为数字,基于位置序号访问需要使用 iloc 方式 >>> height.iloc[0] 188 # 注意这里是数 >>> height 13 188 14 160 7 160 2 178 9 185
  • 28.思考与练习 1. 创建并访问 Series 对象。 1 )创建如下表的 Series 数据对象,其中 a-f 为索引; a b c d e f 30 25 27 41 25 34 2 )增加数据 27 ,索引为 g ; 3 )修改索引 d 对应的值为 40 ; 4 )查询值大于 27 的数据; 5 )删除位置为 1-3 的数据。 【提示】位置 1-3 的索引列表,可以用 series.index[1:3] 来得到。
  • 29.2. Pandas 数据结构 DataFrame 数据结构 • DataFrame 包括值( values )、行索引( index )和列索引( columns ) 3 部分: DataFrame 创建方法: DataFrame ( data , index = […] , columns=[…] ) data :列表或 NumPy 的二维 ndarray 对象 index , colunms :列表,若省略则自动生成 0 ~n-1 的序号标签
  • 30.2. Pandas 数据结构 例题 3-3 • 创建 DataFrame 对象 students 记录 3 名学生的信息 • 行索引为数字序号;列索引为 age 、 weight 和 height >>> data = [[19,170,68],[20,165,65],[18,175,65]] >>> students = DataFrame(data, index=[1,2,3], columns=['age','height','weigh t']) >>> students 1 2 3 age 19 20 18 height 170 165 175 weight 68 65 65 data 列表的每个元素初始化输DataFrame 的一行值
  • 31.2. Pandas 数据结构 DataFrame 数据选取方法 选取类型 索引名选取 位置序号选取 选取方法 说明 obj[ col ] 选取某列 obj[ colList ] 选取某几列 obj.loc[ index, col ] 选取某行某列 obj.loc[ indexList, colList ] 选取多行多列 obj.iloc[ iloc, cloc] 选取某行某列 obj.iloc[ ilocList, clocList ] 选取多行多列 obj.iloc[a:b,c:d] 选取 a~(b-1) 行 , c~(d-1) 列 obj.loc[ condition, colList ] 使用索引构造条件表达式 选取满足条件的行 条件筛选 obj.iloc[ condition, clocList ] 使用位置序号构造条件表达式 选取满足条件的行
  • 32.2. Pandas 数据结构 例题 3-4 •使用例 3-3 创建的学生 DataFrame 输象 , 输输输学生信息的 输 输 输 输 输输输、增加、 输 输 输 输输除和修改。 输输输 输 1. 学生信息查询 >>> students.loc[ 1, 'age'] # 查询 1 号同学的年龄 19 >>> students.loc[[1,3],['height','weight']] # 查询 1 、 3 号同学的身高 和体重 1 3 height 170 175 weight 68 65 >>> students.iloc[[0,2],[0,1]] 1 3 age 19 18 height 170 175 # 查询第 0 、 2 行的第 0 、 1 列的值
  • 33.2. Pandas 数据结构 例题 3-4 >>> students.loc[ : , ['height','weight']] 1 2 3 height 170 165 175 weight 68 65 65 >>> students[['height', 'weight']] 1 2 3 height 170 165 175 2 3 2 3 有同学的身高和体重,常用形式 # 通输输 切片抽取某些行和列的数据 输 输 输 输 输输 输 输 输 输输 height 165 175 >>> students[1:3 ] age 20 18 # 输输所 weight 68 65 65 >>> students.iloc[1:, 0:2] age 20 18 #“:” 表示所有行的数据 height 165 175 weight 65 65 # 抽取行数据,列的“ :” 可以省略
  • 34.2. Pandas 数据结构 例题 3-4 # 筛选身高大于 168 的同学,显示其身高和体重值 >>> mask = students['height']>=168 >>> mask 1 2 3Name:True False True height,dtype:bool #mask 对象索引为 2 的行值为 False ,对应 students 索引为 2 的行未选中 >>> students.loc[ mask, ['height','weight'] ] 1 3 height 170 175 weight 68 65
  • 35.2. Pandas 数据结构 例题 3-4 2. 增加学生信息 # 列索引标签不存在,添加新列;存在则为值修改 >>> students['expense'] = [1500,1600,1200] >>> students 1 2 3 age 19 20 18 height 170 165 175 weight 68 65 65 # 为学生增加月消费数据 expense 1500 1600 1200 DataFrame 对象可以添加新的列,但不能直接增加新的行 增加行需要通过两个 DataFrame 对象的合并实现(见章节 3. 5)
  • 36.>>> students 2. Pandas 数据结构 例题 3-4 age height weight expense 1 19 170 68 1500 2 20 165 65 1600 3 18 175 65 1200 3. 修改学生信息 >>> students['expense'] = 1000 >>> students 1 2 3 age 19 20 18 height 170 165 175 weight 68 65 65 # 选中月消费列,用标量赋值 expense 1000 1000 1000 >>> students.loc[1, :] = [21,180,70,20] 据,使用列表赋值 >>> students 1 2 3 age 21 20 18 height 180 165 175 weight expense 70 20 65 1000 65 1000 # 修改 1 号同学数
  • 37.2. Pandas 数据结构 例题 3-4 3. 修改学生信息 # 筛选不合理数据,重新赋值 >>> students age height weight expense 1 21 180 70 20 2 20 165 65 1000 3 18 175 65 1000 >>> students.loc[students['expense']<500, 'exp ense' ] = 1200 >>> students age height weight expense 1 21 180 70 1200 2 20 165 65 1000 3 18 175 65 1000
  • 38.>>> students 2. Pandas 数据结构 例题 3-4 1 age 21 180 70 1200 2 20 165 65 1000 3 18 175 65 1000 4. 删除学生信息 height weight expense 缺省不修改原始数据对象 >>> students.drop(1, axis=0) age height 2 20 165 3 18 175 weight 65 expense 1600 65 1200 #axis=0 表示行 >>> students.drop('expense', axis=1)# 删除 expense 列, axi s=1 表示列 age height 1 21 180 2 20 165 4 18 175 weight 70 65 65 >>> students.drop([1, 2], axis=0) age 3 18 height 175 weight 65 expense 1000 # 删除多行,给出行索引名列表
  • 39.>>> students 2. Pandas 数据结构 例题 3-4 4. 删除学生信息 age height weight expense 1 21 180 70 1200 2 20 165 65 1000 3 18 175 65 1000 如果需要直接删除原始对象的行或列,设置参数 inplace=True # 删除多列,并修改 students 对象 >>> students.drop(['age','weight'], axis=1, in place=True) height expense 1 180 1200 2 165 1000 3 175 1000 >>> students height expense 1 180 1200 2 165 1000 4 175 1000
  • 40.课后作业 1 打包提交名为:“学号 - 姓名 -Data-4.zip” 1. 创建并访问 DataFrame 对象。 a) 创 建 3×3DataFrame 数 据 对 象 : 数 据 内 容 为 1-9 ; 行 索 引 为 字 符 a , b , c ;列索引为字符串 one , two , three ; b) 查询列索引为 two 和 three 两列数据; c) 查询第 0 行、第 2 行、第 0 列、第 2 列数据; d) 筛选第 1 列中值大于 2 的所有行数据,另存为 data1 对象; e) 为 data1 添加一列数据,列索引为 four ,值都为 10 ; f) 将 data1 所有值大于 9 的数据修改为 8 ; g) 删除 data1 中第 0 行和第 1 行数据。 【提示】 1 )生成数据,使用 numpy 的 arange() 函数和 reshape() 函数。 2 )使用 data>9 生成布尔型的 DataFrame ,用于整个 DataFrame 的数据过滤。