《(完整版)[15次课件]Python基础》由会员分享,可在线阅读,更多相关《(完整版)[15次课件]Python基础(470页珍藏版)》请在金锄头文库上搜索。
1、PythonPython与大与大数据分析数据分析 对外经贸大学信息学院对外经贸大学信息学院 大数据大数据专业专业 Python Python教研教研组组PythonPython与大数据分析与大数据分析 Python基础(5次课)网络爬虫(2次课)期中随堂上机考试(1次课)金融数据分析案例(2次课)文本数据分析案例(3次课)图像数据分析(3次课)8/11/2024外经贸-信息学院2自我介绍刘宁宁对外经济贸易大学信息学院讲师。专注于对图像分类(VisualObjectClassification)、文本处理(NaturalLanguageProcessing)、模式识别(PatternRecogn
2、ition)等方面的研究。32024/8/11外经贸-信息学院为什么大数据首选是Python呢?2024/8/114外经贸-信息学院第一部分初识Python第二部分基本概念变量、注释、print函数、数据类型、算术运算符、类型转换第三部分数据的容器列表、元组、字典、集合第四部分控制结构与推导式2024/8/115外经贸-信息学院第五部分数据的读写操作2024/8/116外经贸-信息学院第六部分错误类型和异常捕获第七部分字符编码问题处理第八部分编写函数处理数据第九部分变量作用域2024/8/117外经贸-信息学院第十部分Python中的模块第十一部分Python中的类第十五部分Numpy基础知识
3、第十六部分Pandas数据分析第十三部分正则表达式第十四部分日期数据的处理第一部分第一部分 初识初识PythonPythonPython语言的诞生和发展历史Python语言的特点运行环境及安装2024/8/118外经贸-信息学院PythonPython语言的诞生和发展历史语言的诞生和发展历史Python语言是一种解释型、面向对象、动态数据类型的高级程序设计语言Python语言是数据分析师的首选数据分析语言,也是智能硬件的首选语言数据分析数据分析创建复杂的Web应用程序游戏开发游戏开发动画电影效果动画电影效果网站开发智能硬件开发智能硬件开发2024/8/119外经贸-信息学院Python与蟒蛇有
4、关?GuidovanRossum于1989年在荷兰国家数学和计算机科学研究所设计出来的Python语言的诞生BBC“MontyPythonsFlyingCircus”(蒙提派森的飞行马戏团)GuidovanRossum(人称“龟叔”)2024/8/1110外经贸-信息学院Python2.0版本于2000年10月发布。在2008年12月,Python3.0发布,此版本没有完全兼容之前的Python2.0Python也因此分为了Python3.5派系和Python2.7派系两大阵营Python语言的发展历史2024/8/1111外经贸-信息学院TIOBEINDEX:编程语言流行程度排行榜Pytho
5、n语言的TIOBEINDEX2024/8/1112外经贸-信息学院Python曾在2007年和2010年两度被TIOBE排行榜评为“年度编程语言”现已成为了第五大流行编程语言(截至2016年10月)Python语言的TIOBEINDEX2024/8/1113外经贸-信息学院PythonPython语言的特点语言的特点优点一:优雅、简单、明确(减少花哨、晦涩或以“炫技”为目的的代码)让数据分析师们摆脱了程序本身语法规则的泥潭,更快的进行数据分析C语言Python语言2024/8/1114外经贸-信息学院优点二:强大的标准库完善的基础代码库,覆盖了网络通信、文件处理、数据库接口、图形系统、XML处
6、理等大量内容,被形象地称为“内置电池”(batteriesincluded)Python使用者“调包侠”2024/8/1115外经贸-信息学院优点三:良好的可扩展性大量的第三方模块,覆盖了科学计算、Web开发、数据接口、图形系统等众多领域,开发的代码通过很好的封装,也可以作为第三方模块给别人使用。如Pandas、Numpy、Seaborn、Scikit-learn等等优点四:免费、开源2024/8/1116外经贸-信息学院缺点一:运行速度慢缺点二:加密难缺点三:缩进规则缺点四:多线程灾难Python语言的缺点2024/8/1117外经贸-信息学院Python语言与Java动态类型和静态类型Py
7、thon中一切皆对象括号与缩进应用领域2024/8/1118外经贸-信息学院Python语言与R语言机器学习的一把利器可读性强,便于上手灵活性强:可与其他如Web应用程序进行整合以统计推断为导向数据分析之外的领域有所限制包凌乱且一致性较差2024/8/1119外经贸-信息学院Python语言与R语言的应用场景对比网络爬虫连接数据库内容管理系统API构建统计分析互动式图标/面板2024/8/1120外经贸-信息学院运行环境及安装运行环境及安装推荐使用Anaconda进行Python安装、环境配置及工具包管理IpythonqtconsolePyCharmJupyterNotebookSpyder2
8、024/8/1121外经贸-信息学院IPython鼓励一种“执行-探索”(execute-explore)的工作模式输入代码之后,按下回车,便会立即得到代码运行结果交互式计算和开发环境:IPython2024/8/1122外经贸-信息学院交互式计算和开发环境:IPython输入“?”获得IPython的详细介绍输入“%quickref”获得IPython的快速参考2024/8/1123外经贸-信息学院交互式计算和开发环境:IPython输入“help()”查看IPython的帮助文档使用内省“pandas?”查看Pandas的帮助文档2024/8/1124外经贸-信息学院基于Qt框架的GUI控
9、制台qtconsole为终端应用程序提供诸如内嵌图片、多行编辑、语法高亮之类的富文本编辑功能启动命令:jupyterqtconsole缺点:功能少、用户友好性不够2024/8/1125外经贸-信息学院JupyterNotebookJulia+Python+R=Jupyter基于Web技术的交互式计算文档格式支持Markdown和Latex语法支持代码运行、文本输入、数学公式编辑、内嵌式画图和其他如图片文件的插入,是一个对代码友好的笔记本2024/8/1126外经贸-信息学院JupyterNotebookJupyter支持包含Rkernel(支持R语言)启动命令:jupyternotebook2
10、024/8/1127外经贸-信息学院JupyterNotebook推荐使用JupyterNotebook进行数据分析,并将自己数据分析的思考过程写在其中,方便之后整理思路以及向别人展示数据分析结果从左至右分别是默认Python终端、IPython和Jupyter Notebook2024/8/1128外经贸-信息学院RNotebook2016年10月,R语言的集成环境RStudio也拥有了自己的RNotebook了2024/8/1129外经贸-信息学院集成开发环境IDEPyCharm&Spyder2024/8/1130外经贸-信息学院数据科学计算平台Anaconda“leadingopenda
11、tascienceplatformpoweredbyPython自动配置Python环境,下载并安装JupyterNotebook、qtconsole和集成开发环境Spyder包管理器conda2024/8/1131外经贸-信息学院总结总结Python语言的特点:优雅、简单、易学Python语言的诞生与发展历史Python语言的运行环境:IPython、JupyterNotebook、SpyderPython语言的数据科学计算平台:Anaconda2024/8/1132外经贸-信息学院实践案例1:PyCharm下HelloWorld通过例子说明Python与其他语言的区别万物皆对象空格控制结构
12、报错8/11/2024外经贸-信息学院33第二部分第二部分 基本概念基本概念变量、注释、print函数、数据类型算术运算符、类型转换2024/8/1134外经贸-信息学院解释型语言解释型语言PythonPythonPython语言是一种解释型解释型、面向对象、动态数据类型的高级程序设计语言2024/8/1135外经贸-信息学院数据集变量及相关含义公开数据集资源UCI数据集KaggleKaggle数据集数据集Yahoo!股票价格数据2024/8/1136外经贸-信息学院用来存储一些之后可能会变化的值对科比投篮ID为1的一次投篮进行分析,那么我们就可以创建一个名称为shot_id的变量,并且将1值
13、储存在变量shot_id中如果之后我们想要分析科比的另外一次投篮,比如投篮ID为2的投篮,我们只需要修改变量shot_id 的赋值,将shot_id 赋值为2 即可变量和常量变量变量2024/8/1137外经贸-信息学院变量名必须是大小写英文字母、数字或下划线_ 的组合,不能用数字开头,并且对大小写敏感关键字不能用于命名变量(31个),如and、as、assert、break、class、continue、def、del等变量命名规则2024/8/1138外经贸-信息学院通过赋值运算符=变量名和想要赋予变量的值连接起来,变量的赋值操作就完成了声明和定义的的过程,在其他语言中需要制定类型;同一变
14、量可以反复赋值,而且可以是不同类型的变量,这也是Python语言称之为动态语言的原因变量赋值2024/8/1139外经贸-信息学院常量表示“不能变”的变量Python中是没有常量的关键字的,只是我们常常约定使用大写字母组合的变量名表示常量,也有不要对其进行赋值”的提醒作用常量2024/8/1140外经贸-信息学院如同我们在看书时做笔记一样Python语言会通过注释符号识别出注释的部分,将它们当做纯文本,并在执行代码时跳过这些纯文本在Python语言中,使用#进行行注释注释注释2024/8/1141外经贸-信息学院多行注释使用连续单个单引号或者双引号2024/8/1142外经贸-信息学院在Pyt
15、hon2.x版本中,同时兼容print 和print()在Python3.x版本中,print 函数为带括号的print()如果想要看变量的值,则直接在print后面加上变量名即可。如果是想要输出提示信息,如一句话,那我们需要将提示信息用单引号包裹起来(这使得内容构成一个字符串)print函数函数2024/8/1143外经贸-信息学院使用逗号,隔开变量与其他剩余内容,则print 在输出时会依次打印各个字符串或变量,遇到逗号,时会输出一个空格print 函数不仅可以打印变量值,也可以打印计算结果2024/8/1144外经贸-信息学院Python语言的数据类型包括整型、浮点型、字符串、布尔型和空
16、值整型(int)整型的取值为整数,有正有负,如 2,-666,666 等。在科比投篮数据集中,shot_id、game_event_id、game_id、loc_x、loc_y、minutes_remaining、period、playoffs、seconds_remaining、shot_distance、shot_made_flag、team_id都是整型变量数据类型数据类型2024/8/1145外经贸-信息学院浮点型的取值为小数,当计算有精度要求时被使用,由于小数点可以在相应的二进制的不同位置浮动,故而称为浮点数如 3.14,-6.66 等,但是如果是非常大或者非常小的浮点数,就需要使用
17、科学计数法表示,用 e 代替 10 。科比投篮数据集中的lat 和lon 为浮点型变量。浮点型(float)2024/8/1146外经贸-信息学院字符串(str)字符串是以两个单引号或两个双引号包裹起来的文本字符串Jump Shot包括J,u,m,p,空格,S,h,o,t 这9个字符字符串(str)2024/8/1147外经贸-信息学院转义字符:字符串里常常存在一些如换行、制表符等有特殊含义的字符,这些字符称之为转义字符比如 n 表示换行, t 表示制表符,Python还允许用r“”表示“”内部的字符串默认不转义2024/8/1148外经贸-信息学院布尔型(bool)布尔型只有 True 和
18、False 两种值。比较运算和条件表达式都会产生 True 或 False 布尔型(bool)2024/8/1149外经贸-信息学院布尔型(bool)布尔值可以进行 and 、 or 和 not 运算, and 和 or 运算分别用 & 和 | 表示and运算or运算2024/8/1150外经贸-信息学院布尔型(bool) not 运算为非运算,即把 True 变成 False , False 变成 True 。2024/8/1151外经贸-信息学院空值是Python里一个特殊的值,用 None 表示,一般用 None 填充表格中的缺失值使用type() 函数来获取某值的类型空值(NoneTy
19、pe)2024/8/1152外经贸-信息学院数据集变量的数据类型总结int64、float64分别表示64位的整型和64位的浮点型2024/8/1153外经贸-信息学院日期数据类型还有一种特殊的数据类型日期类型这种类型数据在金融、交通等领域十分常见,我们将在日期数据的处理这一部分对这一类型的数据分析进行详细讲解2024/8/1154外经贸-信息学院二元数学运算符算术运算符算术运算符2024/8/1155外经贸-信息学院Python2.x版本与Python3.x版本(以下简称Python2和Python3)的整除是不同的。2024/8/1156外经贸-信息学院函数int()、float()、st
20、r() 和bool() 分别用于将变量转换成整型、浮点型、字符串和布尔型变量类型转换类型转换2024/8/1157外经贸-信息学院某些变量无法转换成数值型变量2024/8/1158外经贸-信息学院只有在变量值为0时,bool 转换的结果才为False:2024/8/1159外经贸-信息学院除了使用type() 外,我们还可以使用isinstance() 来获得数据类型2024/8/1160外经贸-信息学院总结总结数据类型、算术运算符、类型转换变量、注释、print函数2024/8/1161外经贸-信息学院第三部分第三部分 数据的容器(结构)数据的容器(结构)列表、元组、字典、集合2024/8/
21、1162外经贸-信息学院列表列表科比投篮数据集列表(list)是一个有序的有序的序列结构,序列中的元素可以是不同的数据类型列表可以进行一系列序列操作,如索引、切片、加、乘和检查成员等2024/8/1163外经贸-信息学院将列表中的各元素用逗号分隔开,并用中括号将所有元素包裹起来列表创建2024/8/1164外经贸-信息学院使用append()方法添加元素,该方法会在列表末尾位置添加数据元素使用remove()方法删除元素列表对象的增减2024/8/1165外经贸-信息学院实践练习现有一空的列表“kobe_list”用来存入科比某次投篮的信息请利用append()方法将投篮ID2、投篮类型Jum
22、pShot、科比所在球队LosAngelesLakers和对手POR按顺序加入到列表变量kobe_list中8/11/2024外经贸-信息学院66remove()方法适用于知道要删除的值的情况,当我们不知道具体元素值,但是知道元素的索引位置时,我们可以使用del 函数配合列表索引,删除索引位置的元素或者使用pop()方法列表对象的增减2024/8/1167外经贸-信息学院通过insert() 方法在指定的索引位置添加数据元素列表对象的增减2024/8/1168外经贸-信息学院实践练习kobe_list=2,LosAngelesLakers,JumpShot,POR现在需要添加更多关于科比某次投
23、篮的信息,包括投篮位置(按区域划分)、比赛日期和对阵形式(主场或者客场)在kobe_list插入LeftSide(L),2000-10-31,和LALPOR并删除数据元素2在LosAngelesLakers之后加上matchup的值8/11/2024外经贸-信息学院69Python语言中所有的索引都是从0开始计数的,如果列表中有n个元素,那么最后一个元素的索引是n-1 如果我们想要获取kobe_list中第3个元素及倒数第二个元素列表索引2024/8/1170外经贸-信息学院Python内置的用于判断列表长度的函数为len()列表长度2024/8/1171外经贸-信息学院切片操作需要提供起始索
24、引位置和最后索引位置,然后用冒号:将两者分开如果未输入步长,则默认步长为1切片操作返回一系列从起始索引位置开始到最后索引位置结束的数据元素需要注意的是,起始索引位置的值包含在返回结果中,而最后索引位置的值不包含在返回结果中列表切片2024/8/1172外经贸-信息学院切片操作需要提供起始索引位置和最后索引位置,然后用冒号:将两者分开列表切片2024/8/1173外经贸-信息学院逆向切片我们可以省略起始索引位置,表示从最开始进行切片,当我们将两个索引都省略之后,我们将按原样复制一个列表,如果想要将列表的顺序颠倒,则可以使用:-1列表切片2024/8/1174外经贸-信息学院列表中的元素也可以是列
25、表,这样可以将列表看成更高维的数组拆开很容易理解嵌套列表2024/8/1175外经贸-信息学院实践练习现有科比某次投篮信息的列表kobe_listkobe_list=LosAngelesLakers,LALPOR,JumpShot,POR,LeftSide(L),2000-10-31请使用切片方法取出索引位置3到5的元素,并存入到列表three_five中并提取比赛日期中的年份存入变量year中提示:读取年份时,先使用索引方法将kobe_list或者three_five最后一个日期元素值2000-10-13提取出来,索引位置为-1,然后对该字符串进行切片操作,切片为0:48/11/2024外经
26、贸-信息学院76元组元组元组(tuple)数据结构与列表类似,其中元素可以有不同的类型但是元组中的元素是不可变元素是不可变的,即一旦初始化之后,就不能够再做修改(报错:元组对象不支持赋值)2024/8/1177外经贸-信息学院由于元组是不可变的,因此元组对象没有append()、insert()和del这样的方法。实际上,tuple的使用可以使得代码更安全,防止错误赋值导致重要对象的改变。2024/8/1178外经贸-信息学院实践练习现有科比某次投篮信息的元组kobe_tuplekobe_tuple=(2,JumpShot,LosAngelesLakers,POR)请将kobe_tuple中的
27、投篮ID由2改为3,投篮类型由JumpShot改为SlamDunkShot提示:通过kobe_tuple方式访问元组中的列表元素中的某一个元素8/11/2024外经贸-信息学院79字典字典字典(dict)在其他语言中被称作哈希映射(hashmap)或者相关数组(associativearrays)字典是一种大小可变的键值对集,其中的键(key)和值(value)都是Python对象字典用在需要高速查找的地方2024/8/1180外经贸-信息学院字典的创建使用大括号 包含键值对,并用冒号: 分隔键和值,形成键:值 对可以看出,字典中的数据元素是无序的,并不会按照初始化的顺序排列。不同键所对应的值
28、可以相同,但是字典中的键必须是唯一的字典创建2024/8/1181外经贸-信息学院利用for循环和zip()函数创建字典zip()函数用于将多个序列(列表、元组等)中的元素配对,产生一个如(列表1元素,列表2元素),(,) 的新的元组列表;for循环用于重复执行将值放入键中的操作。字典创建2024/8/1182外经贸-信息学院实践练习请创建关于科比投篮信息的字典kobe_dict,键为shot_id,值为shot_zone_area其中列表shot_id与列表shot_zone_area应按照顺序一一对应shot_id=1,2,3shot_zone_area=RightSide(R),Left
29、Side(L),LeftSideCenter(LC)8/11/2024外经贸-信息学院83字典的元素访问(以及插入、设置)方式与列表和元组一样。不同的是,列表和元组的索引号是按照顺序自动生成,而字典的索引号是键字典索引字典中某值的索引还可以通过get方法,如果字典不包含某个键,可以返回None,或者自己指定的值2024/8/1184外经贸-信息学院如果在字典中不存在索引的键,则系统会报错字典索引2024/8/1185外经贸-信息学院我们可以通过in 判断是否存在某个键,其语法跟在列表和元组中判断是否存在某个值是相同的,也可以使用内置的has_key() 方法字典索引2024/8/1186外经贸
30、-信息学院如果不太确定字典中有哪些键或者值,我们可以使用keys() 方法或者values()方法字典索引2024/8/1187外经贸-信息学院在有些情况下,我们需要取出字典中的键值对用于下一步的分析,此时可以使用items() 方法,该方法将返回所有键值对,并将其保存在一个元组列表(列表中的元素为元组)中字典索引2024/8/1188外经贸-信息学院字典的删减有三种方法使用del 函数对单一元素或者整个字典进行删除使用pop() 方法删除单一元素使用clear()方法清空词典的所有元素字典元素删减2024/8/1189外经贸-信息学院集合集合集合(set)是一种无序集,它是一组键的集合,不存
31、储值在集合中,重复的键是不被允许的。集合可以用于去除重复值集合也可以进行数学集合运算,如并、交、差以及对称差等。应用:应用:去重。把一个列表变成集合,就自动去重了关系测试。测试两组数据之前的交集、差集、并集等关系2024/8/1190外经贸-信息学院集合的创建有两种方式:使用set() 函数或者使用大括号需要注意的是,创建空集合,必须使用set() ,而不是,因为表示创建一个空的字典集合创建2024/8/1191外经贸-信息学院集合支持数学集合运算,如并、交、差以及对称差等集合运算2024/8/1192外经贸-信息学院集合支持数学集合运算,如并、交、差以及对称差等集合运算2024/8/1193
32、外经贸-信息学院总结总结创建、索引、增减、切片操作列表、元组、字典、集合2024/8/1194外经贸-信息学院第四部分第四部分 控制结构控制结构if选择结构、for循环结构、while循环结构2024/8/1195外经贸-信息学院布尔值布尔值在这个世界上,文字和认知中有真和假的判断,而对于计算机而言,布尔值True和False就表示真和假True、False是比较显式的真和假,而在Python中以下值都会被看作是假(False):2024/8/1196外经贸-信息学院=符号是判断两个值、变量之间是否相等的操作符,相等则返回布尔值True对于字符型变量也是可以这么操作的:= 符号2024/8/1
33、197外经贸-信息学院if 选择结构选择结构判断条件为真(True)的时候才执行冒号后下面的语句比如现在我们已有一个精灵宝贝的HP值,而我只希望当这个HP值大于20的时候才打印出来2024/8/1198外经贸-信息学院除了if语句外,还有if-else、if-elif语句2024/8/1199外经贸-信息学院for 循环结构循环结构for循环是可以依次得到序列循环中每个元素,并依次处理2024/8/11100外经贸-信息学院现在有一个列表,这个列表存放的是10个小精灵的HP数值,现在希望得到里面每个数字都乘以22024/8/11101外经贸-信息学院while 循环结构循环结构while循环和
34、for循环不同的是,它的停止条件是个人自己设定的:判断条件和if语句是相同的,而什么时候用while呢?在你确定满足条件而不确定需要的循环次数时,那么while是最好的选择。现在有一个小精灵的HP数值变量,我希望它在大于20的时候,逐次变小,直到等于20为止。2024/8/11102外经贸-信息学院组合使用组合使用除了单独使用上述控制结构之外,我们还可以嵌套使用。比如说在前面的HP序列,我只希望其中的偶数乘以”2”,奇数不变。2024/8/11103外经贸-信息学院lpython作为一种简洁、直接、贴近人类自然语言的计算机语言,它对于基础的数据结构tuple、list、dict内嵌了很多十分方
35、便的函数和操作。l在前面章节介绍的方法之外,这章将介绍在list/dict内部使用for循环来构造list/dict的方法。这些方法将让我们更加美观可读、方便简洁地实现一些功能。列表推导式列表推导式2024/8/11104外经贸-信息学院列表推导式llist是使用python过程中是一个非常常用的数据结构,无论是作为最终数据的保存结果,还是中间数据结果的临时存储,都能提供很方便的功能。使用列表推导式可以让循环在列表内完成。2024/8/11105外经贸-信息学院l以下为例子,对列表中每个数值逐个减去均值2024/8/11106外经贸-信息学院l含义解析:l关键词for循环后跟的是循环语法,这部
36、分不变;而在for循环真正表达式部分则在列表推导式中移前,运算结果直接添加入列表中。2024/8/11107外经贸-信息学院l字典也可以用推导式,但没有列表推导式那么常用。l字典推导式多用于需要元素有一一对应关系时,比如前面谈到当变量是字符型时,需要将字符转换为一一对应的数值型。字典推导式字典推导式2024/8/11108外经贸-信息学院lUnitedStatesEnergy,Census,andGDP2010-2014数据集中Region变量是字符型,如现需要对其进行数值转换。2024/8/11109外经贸-信息学院lenumerate是Python的一个常用内置函数,它用在列表中时,不但会
37、产生列表内的元素,并且会从0开始按顺序生成序号。2024/8/11110外经贸-信息学院总结总结for循环、while循环布尔值、if条件判断列表推导式、字典推导式2024/8/11111外经贸-信息学院第五部分第五部分 数据文件的读写操作数据文件的读写操作2024/8/11112外经贸-信息学院数据的读取数据的读取对文件操作之前需要用open() 函数打开文件mode 参数中的r指读出,w指写入打开之后将返回一个文件对象(fileobject),后续对文件内数据的操作都是基于这个文件对象的方法(method)来实现的2024/8/11113外经贸-信息学院数据的读取数据的读取对文件数据的读取
38、是用的read() 方法,read() 方法将返回文件中的所有内容用print打印所有内容会显示Hello, world! ,记得每次用完文件后,都要关闭文件f.close()。否则,文件就会一直被Python占用,不能被其他进程使用2024/8/11114外经贸-信息学院数据的读取数据的读取也可以使用with open() as f: 在操作后自动关闭文件2024/8/11115外经贸-信息学院数据的读取数据的读取在read() 中加入数字,可指定读取的字符数2024/8/11116外经贸-信息学院数据的写入数据的写入写入的操作和读取是类似的,不过用的是write() 函数,同时需要将打开文
39、件的mode参数设置为w2024/8/11117外经贸-信息学院文本文件的操作文本文件的操作常见的数据文件包括txt格式或者csv(逗号分隔值文件格式)格式文2024/8/11118外经贸-信息学院文本文件的读取文本文件的读取通过open()函数打开文件,返回文件对象对文件对象进行读取操作,除了前面介绍的read() 之外还有两种读取数据的方法:readline() 是每次读入一条数据的方式,readlines() 是一次性读入文件所有数据2024/8/11119外经贸-信息学院文本文件的读取文本文件的读取readlines() 读取后得到的是每行数据组成的列表,但是一行样本数据全部存储为一个
40、字符串,并且数据读入后并没有将换行符去掉(windows系统的换行符是rn ,linux系统的换行符号是n)在读入数据之后,用for循环对每一个元素去除换行符,并将每一个变量值用字符串处理方法.split() 分隔开来2024/8/11120外经贸-信息学院文本文件的读取文本文件的读取.strip() 本身是一个对字符串指定字符去除的方法,但括号里参数为空的时候,就会去除r n t2024/8/11121外经贸-信息学院文本文件的写入文本文件的写入设置参数mode=w。write()、writelines()是两个对文件对象的写入数据的方法。write()是逐次写入,writelines()可
41、对一个列表里的所有数据一次性写入文件中如果有换行需要,则要在每条数据后增加换行符,同时用字符串.join() 的方法将每个变量数据联合成一个字符串并增加间隔符t2024/8/11122外经贸-信息学院逗号分隔值文件的操作逗号分隔值文件的操作csv文件用逗号,作为分隔符2024/8/11123外经贸-信息学院逗号分隔值文件的读取逗号分隔值文件的读取利用Python内置的 csv 模块读取数据2024/8/11124外经贸-信息学院逗号分隔值文件的写入逗号分隔值文件的写入引入csv模块 open() 打开文件,使用csv.writer() 作为写入器,writerow()方法逐行写入2024/8/
42、11125外经贸-信息学院总结总结open()、write()、readlines() 、.strip()、.join()文本文件读写操作、逗号分隔值文件读写操作csv模块、csv.reader()、csv.writer()2024/8/11126外经贸-信息学院实践案例实践案例 2 2: 白葡萄酒品质探索白葡萄酒品质探索2024/8/11127外经贸-信息学院第六部分第六部分 错误类型和异常捕获错误类型和异常捕获错误类型语法错误异常捕获异常assert、with语句自助控制异常爬虫HTTP异常处理2024/8/11128外经贸-信息学院错误类型语法错误(Syntaxerrors)代码编译编译
43、时的错误,不符合Python语言规则的代码会停止编译并返回错误信息异常(Exceptions)相较于语法错误,异常比较难发现,因为它只在代码运行运行时才会发生,如类型错误、数值错误、索引错误和属性错误等。语法错误包含在异常基类中错误类型错误类型2024/8/11129外经贸-信息学院错误类型PythonPython与与JavaJava异常类层级区别异常类层级区别Java异常类层级BaseExceptionExceptionStandardErrorRuntimeErrorMemoryErrorRuntimeErrorSyntaxErrorStopIterationWarningSystemEx
44、itKeyboardInterruptGeneratorExitPython异常类层级2024/8/11130外经贸-信息学院语法错误常见的语法错误(SyntaxError)包括:缺少起始符号或结尾符号(括号、引号等)缩进错误关键词拼写错误语法错误语法错误2024/8/11131外经贸-信息学院语法错误常见的语法错误(SyntaxError)包括:缺少起始符号或结尾符号(括号、引号等)缩进错误关键词拼写错误语法错误语法错误2024/8/11132外经贸-信息学院语法错误常见的语法错误(SyntaxError)包括:缺少起始符号或结尾符号(括号、引号等)缩进错误关键词拼写错误语法错误语法错误修改
45、语法错误实战演练http:/ Exception根异常,其他异常都继承于根异常好处1:API代码层次更清晰好处2:API与调用程序代码隔离如:需要做一个链接数据库服务的模块,提供一个connect函数用于链接,链接可能出现情况:Socket连接超时Socket拒绝连接聚类分析以定义API异常为例2024/8/11150外经贸-信息学院这样精确定义多个异常,使得代码层次清晰,增强了可读性在代码的最后还捕获了Error以及Exception两个异常,这两个操作分别对应于可拓展性与健壮性的目的聚类分析调用API时异常捕获的技巧2024/8/11151外经贸-信息学院编写工具类函数时,函数处理流程会产
46、生很多状态用返回值代表函数处理状态,调用者需要去理解每个状态码的意义,存在学习成本聚类分析使用异常代替返回状态码2024/8/11152外经贸-信息学院使用异常的方式2024/8/11153外经贸-信息学院增强代码的鲁棒性而不必影响程序的主逻辑,专注程序主逻辑,保持代码的简洁清晰异常判断是就地实时的,与代码运行是实时的一些低调用级别的代码块没有判断和处理其上级调用模块的权限或者根本无法判断,只能由其上级调用模块来决定下一步怎么做,这时当前模块可以不用处理,将错误抛出给调用者利用抛出异常并处理的优点利用抛出异常并处理的优点2024/8/11154外经贸-信息学院异常处理应该与正常流程控制分离异常
47、处理与流程控制异常处理与流程控制异常处理搞乱了代码逻辑将异常代码块抽离到另外的函数中2024/8/11155外经贸-信息学院网络爬虫框架爬虫爬虫HTTPHTTP异常处理异常处理URL管理模块,负责管理、调度所有URL爬虫启动的入口,通常是一组URL下载模块,为了提高效率,Crawler通常是并行的。解析模块,从网页中解析出有价值的信息,并将新发现的URL加入到URLQueue中。存储模块,将数据存在存储介质中,通常是文件或数据库。2024/8/11156外经贸-信息学院1.获取要访问的URL的IP地址(右图中标号为1、2)2.向WebServer请求资源(右图中标号为3)3.WebServer
48、收到请求,将响应返回给客户端(右图中标号为4)聚类分析HTTP请求过程2024/8/11157外经贸-信息学院URLError:不能够处理一个response网络无连接,即本机无法上网连接不到特定的服务器服务器不存在聚类分析HTTP请求过程的两种常见异常2024/8/11158外经贸-信息学院HTTPError:URLError的子类,在特定的HTTPURLs中产生每一个HTTP响应对象response包含一个数字“状态码”urllib2 会帮助处理重定向问题,不能处理则产生HTTPError状态码:404-页面无法找到,403-请求禁止,401-带验证请求2024/8/11159外经贸-信息
49、学院捕获到HTTPError,输出code,不再处理URLError异常。如果发生的不是HTTPError,则去捕获URLError异常,输出错误原因聚类分析异常处理技巧2024/8/11160外经贸-信息学院异常处理技巧利用 hasattr 方法提前对异常的属性进行判断,以免出现属性输出报错的现象2024/8/11161外经贸-信息学院只处理你知道的异常,避免捕获所有异常然后吞掉它们抛出的异常应该说明原因,有时候你知道异常类型也猜不出所以然的不要使用异常来控制流程,那样你的程序会无比难懂和难维护如果有需要,切记使用finally来释放资源一些经验一些经验2024/8/11162外经贸-信息学
50、院总结总结捕获异常语法错误和异常抛出异常,自定义异常类assert,with语句爬虫HTTP异常处理,URLError,HTTPError,code,reason2024/8/11163外经贸-信息学院第七部分第七部分 字符编码问题处理字符编码问题处理编码和解码编码集解决乱码2024/8/11164外经贸-信息学院编码是为了让机器读懂语言。即输入的是字符“中文”,那么编码就是将“中文”编码为二进制格式让机器读懂在Python中,机器其实是不认识unicode的,而是接收的 str 即使输入的数据是unicode的,而在Python内部都会将 unicode 自动转为str编码和解码编码和解码电
51、脑编码(encode)strunicode解码(decode)2024/8/11165外经贸-信息学院编码和解码编码和解码进攻编码鼓声士兵解码行为2024/8/11166外经贸-信息学院str通过解码函数decode()转换为unicode,unicode通过编码函数encode() 转换为 str http:/ 1二进制数值,从一开始,人们想到的方法就是赋予每一个字符唯一的一串0 1 编码表示。这是一个ASCII编码集中对字符A的编码,这是一个八位0/1 数字01000001编码集编码集2024/8/11168外经贸-信息学院在1967年出现了ASCII标准,这主要是基于拉丁字母的一套电脑编
52、码系统ASCII标准是每个英文字母有一一对应独立的8位数字串,比如说字母A,ASCII中对应的二进制值为01000001 。这样,我在输入A的时候,编译器会借助编码集将A转换为01000001聚类分析01000001ASCII编码集2024/8/11169外经贸-信息学院ASCII总共可以存储256个字符,1967年制定这套标准的人只考虑英语世界的使用者。那么256个编码集对于使用英语和拉丁语系是够用的,但是对于中文、日文、韩文,就完全不够用了ASCII聚类分析ASCII编码集2024/8/11170外经贸-信息学院聚类分析ASCII聚类分析ASCII编码集2024/8/11171外经贸-信息
53、学院聚类分析GB2312编码集是由中国国家标准总局发布1981年5月1日实施的一套收录了6763个汉字、拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个字符的标准。但是这套标准没有包含部分罕见字和繁体字,于是后面出现GBK、GB18030在GB2312的基础上进行扩充解决。GBK2024/8/11172外经贸-信息学院聚类分析Unicode是标准统一所有语言文字的标准编码集,它目前已经收录超过十万个字符Unicode包括两个方面编码方式(一个字符对应编码集中的二进制数值)实现方式(传输、存储):UTF-8、UTF-16Unicode2024/8/11173外经贸-信息学
54、院Python2.x版本有两种用于字符处理的数据格式:str和unicodestr 字节流是以两个单引号或两个单引号“”来赋值的,访问一个元素就是一个字节PythonPython字符串字符串2024/8/11174外经贸-信息学院PythonPython字符串字符串unicode 字符串是在或“”前加u来赋值的,同时访问一个元素则是一个字符http:/ 3.x3.x版本中的字符串版本中的字符串Python3.x版本有两种表示字符串的类型:bytes 和str , str 类中包含了unicode 字符,非unicode编码如UTF-8、GBK被定义成了bytes使用encode() 和deco
55、de() 函数进行相互转换2024/8/11176外经贸-信息学院如果出现乱码的状况,那肯定是编码转码出现了问题,这不外乎有以下几个关键点:Python解释器设置的默认编码源文件设置的编码终端编码解决乱码解决乱码2024/8/11177外经贸-信息学院Python解释器的编码指Python内部认为的字符 str 的编码,即一个str变量,要转换为unicode时,Python解释器默认的转换方式Python的默认转换方式是ASCII,sys.getdefaultencoding() 函数可以获得默认编码信息聚类分析解释器编码2024/8/11178外经贸-信息学院在ASCII默认编码条件下对中
56、文字符编码会出现错误,因为ASCII不能对中文进行编码聚类分析解释器编码2024/8/11179外经贸-信息学院通过前面介绍的encode()函数和decode() 函数可以设置参数,指定编码方式对中文字符进行GBK编码和UTF-8编码聚类分析解释器编码2024/8/11180外经贸-信息学院中文字符str的解码问题聚类分析解释器编码2024/8/11181外经贸-信息学院想要得到GBK编码的str:先对其进行UTF-8解码,再对其进行GBK编码聚类分析解释器编码http:/ 编写函数处理数据编写函数处理数据函数的语法规则参数设定lambda函数实例:平方函数,输入变量x返回其平方值x2函数的
57、语法规则函数的语法规则函数的语法规则函数的语法规则几种参数设定方法顺序传入关键词默认参数不定长参数参数设定参数设定按照输入参数列表的顺序传入x=1,y=2,z=3聚类分析顺序传入直接在参数列表里设定关键词确定聚类分析关键词可以将位置和关键词的方法混合使用如果传入的第一个参数是用关键词传入的,那么后面每个参数都需要是关键词传入,否则会出现语法错误聚类分析关键词输入的参数可以是事先设定好赋值,也就是默认值。在调动函数的时候,可以不输入参数,函数内部会直接调用默认参数值。例如默认z=3聚类分析默认参数默认参数的默认值是可以修改的,将上面的z值传入设置为4需要注意的是,默认参数必须放到参数列表的末位聚
58、类分析默认参数这是为了解决,不确定需要传入参数个数的情况聚类分析不定长参数*args*args如果输入是一个list,那么可以用*list 的方式传入聚类分析不定长参数*args函数定义时,*可以将按位置传递进来的参数“打包”成元组(tuple)类型函数调用时,*可以“解压”待传递到函数中的元组、列表、集合、字符串等类型,并按位置传递到函数入口参数中聚类分析不定长参数*args*args*args传入的时候,如果调用函数使用关键词传入参数时会出错不定长参数聚类分析不定长参数*args*kwargs*kwargs 的出现便是解决需要传入特定关键词参数的情况聚类分析不定长参数*kwargs聚类分析
59、常见包中的不定参数scikit-learn中的测试集训练集划分函数def train_test_split(*array, *options)函数定义时*可以将按位置传递进来的参数“打包”成元组(tuple)类型*可以将按关键字传递进来的参数“打包”成字典(dictionary)类型聚类分析函数定义与调用时,不定长参数的传入函数调用时*可以“解压”待传递到函数中的元组、列表、集合、字符串等类型,并按位置传递到函数入口参数中*可以“解压”待传递到函数中的字典,并按关键字传递到函数入口参数中简化的函数定义方式lambda函数函数总结总结位置传入、关键词、默认参数、不定长参数参数定义的顺序:必选参数
60、、默认参数、可变参数和关键字参数函数的语法规则lambda函数第九部分第九部分 变量作用域变量作用域局部变量全局变量局部变量转为全局变量同名变量引用聚类分析局部变量局部变量是指那些有固定的变量作用域,只有在此作用域内才能调用此变量。具体而言,比如函数内的局部变量的作用域仅限于函数内。以下建立一个新的函数,命名为mean(),用于求平均局部变量局部变量聚类分析局部变量在关键词 def 定义函数的范围内,新定义/赋值的变量都是局部变量,在该函数之外引用函数内命名的变量的时候会报错全局变量全局变量是相对局部变量而言的作用范围在全局,即在初始定义赋值后,无论是函数、类、lambda函数内都可以引用全局
61、变量。在关键词 def、class、lambda之外定义的变量,都作为全局变量。在上面的mean()函数内定义的length变量移至关键词def之外即变为全局变量:全局变量全局变量有时候会有在函数内定义的局部变量在函数外引用的需求,比如前面的mean()函数中最开始length定义时是局部变量,现只需要在定义变量时使用关键词global即可将其定义为全局变量局部变量转为全局变量局部变量转为全局变量当某局部变量和全局变量都有相同变量名时,函数内引用该变量会直接调用函数内定义的局部变量。问题:如果有嵌套函数,并且有多个同名变量该怎么办?同名变量引用同名变量引用聚类分析LEGB原理简要介绍当一个函数
62、体内需要引用一个变量的时候,会按照如下顺序查找:首先查找局部变量(Locals);如果找不到叫做该名称的局部变量,则去函数体的外层去寻找局部变量(Enclosingfunctionlocals)。(适用于嵌套函数的情况)如果函数体外部的局部变量中也找不到叫做该名称的局部变量,则从全局变量(Global)中寻找。再找不到,只好去找内置库(Bulit-in)像C语言就没有这种机制,局部区找不到就直接跳到静态变量(static)区了当前栈框当前栈框前一个栈框前一个栈框再前一个栈框再前一个栈框全局区(栈底)全局区(栈底)第十部分第十部分PythonPython中的模块中的模块模块简介数据分析领域常用的
63、包搜索路径管理模块的导入利用csv、pandas导入数据缺失值处理使用matplotlib绘图模块简介模块简介内置电池(batteriesincluded)基础代码库,覆盖了网络通信、文件处理、数据库接口、图形系统、XML处理第三方工具包P Pandasandas:数据处理与分析N Numpyumpy:科学计算BeautifulSoup4BeautifulSoup4:处理HTML文档MMatplotlibatplotlib:绘图Scikit-learnScikit-learn:基于SciPy和Numpy的开源机器学习模块TensorflowTensorflow:深度学习框架PythonPyth
64、on程序的架构程序的架构Python程序的构架指:将一个程序分割为源代码文件的集合以及将这些部分连接在一起的方法Python源代码文件:*.py一个py文件是一个模块(module)多个模块可以组成一个包(package)模块1函数类模块2函数类包模块的执行环境模块的执行环境模块的执行环境:模块包含变量、函数、类以及其他的模块(如果导入的话),而函数也有自己的本地变量模块内的情况及模块的交互模块内的情况及模块的交互模块全局变量局部变量函数成员类变量import其他模块(Python或C)变量函数类其他模块(Python或C)变量函数类importimport模块的作用模块的作用pyprojec
65、t_init_.pymodule0.pyPackage_a_init_.pymodule1.pymodule2.pyPackage_b_init_.pymodule3.py模块是Python中的最高级别组织单元,它将程序代码和数据封装起来以便重用模块的三个角色:1.代码重用2.系统命名空间的划分(模块可理解为变量名的封装,即模块就是命名空间)3.实现共享服务和数据一个简单的一个简单的PythonPython项目项目数据库IO类数据分析领域常用的包数据分析领域常用的包描述性统计类文本基本操作回归假设检验时间序列支持向量机(SVM)模块的导入模块的导入pyproject_init_.pymodul
66、e0.pyPackage_a_init_.pymodule1.pymodule2.pyPackage_b_init_.pymodule3.py导入从本质上讲,就是在一个文件中载入另一个文件,并且能够读取那个文件的内容。一个模块内的内容通过这样的方法其属性(object,attribute)能够被外界使用模块导入的方式模块导入的方式pyproject_init_.pymodule0.pyPackage_a_init_.pymodule1.pymodule2.pyPackage_b_init_.pymodule3.pyimport Package_a.module1import Package_b
67、.module3from Package_a.module1 import *import module0from module0 import *import Package_a.module1 as m1t = m1.Test()from Package_a.module1 import * t = Test()注意使用区别注意使用区别import xfrom x import *from x import a,b,c模块的方式非常简单,在import后加上模块名称就可以了。通过这一句,计算机就在指定的位置找到了numpy.py文件,并准备好该文件拥有的之后会用到的函数和属性。在导入num
68、py后,我们就可以通过点符号.连接模块名称和函数名,使用该模块中的函数和属性。导入整个模块指定的方式是采用import模块名称as别名。我们可以将numpy简记为np,并且在调用时,直接使用np就可以:别名此过程的实现方式是“from 模块名称import函数名称,但是要注意我们只拿到了某个具体的工具,而没有拿到整个工具箱只导入某个对象import模块模块时,时,PythonPython都做了哪些事情?都做了哪些事情?是使用当前存在的模块对象Python解释器检查module registry(sys.modules)部分模块先前是否已经导入?否创建一个新的、空的module对象在sys.mo
69、dule字典中插入该模块对象加载该模块代码所对应的对象然后在新的模块命名空间、执行该模块代码对象(codeobject)。所有由该代码指定的变量均可以通过该模块对象引用import搜索的路径顺序搜索的路径顺序程序的主目录PYTHONPATH(环境变量)目录标准链接库目录任何.pth文件的内容以上四个组件组合起来就变成了sys.path,其保存了模块搜索路径在机器上的实际配置,可以通过打印内置的sys.path列表来查看这些路径搜索路径和是系统自定义的,而和可以用于拓展路径,从而加入自己的源代码目录通过通过.pth文件修改搜索路径文件修改搜索路径1.通过site模块的getsitepackage
70、s() 函数获得包文件位置2.新建myworkpath.pth 文件,列出模块搜索路径3.将myworkpath.pth 文件放在包文件目录下4.查看路径是否添加成功临时修改模块搜索路径临时修改模块搜索路径使用sys.path在Python程序运行时临时修改模块搜索路径。我们将使用一份包含5000个样本的美国高中生社交网络信息数据集。数据均采样于2006年,对应于高中四年级的毕业生。每个样本包含40个变量,其中gradyear、gender、age和friends四个变量分别代表毕业生的毕业年份、性别、年龄和好友数。社交网络信息数据集介绍利用CSV模块导入数据利用利用csv模块导入数据模块导入
71、数据其余36个变量代表了36个词语,这36个词语代表了毕业生的5大基本特征:课外活动、时尚、宗教、浪漫和反社会行为。每个词语变量的取值代表对应的词语在高中生的社交网络服务平台发布的消息中出现的频次。社交网络信息数据集介绍通过“csv”模块导入数据集文件teenager_sns.csv中的数据利用CSV模块导入数据读完数据后,我们得到一个二维列表teenager_sns,列表中的一个元素为文件中的一行,第一个元素为变量名列表,之后的一个元素对应着一个样本。我们以第一个元素和第二个元素为例:我们发现所有的变量值都为字符型,所以在后面的分析中需要对数据进行类型转换。在导入数据之后,我们首先要做的事情
72、就是初探我们的数据。利用CSV模块导入数据利用CSV模块导入数据缺失值处理缺失值处理接下来,我们来分析一下数据集中的age变量,看看美国高中毕业生的年龄特征。为了得到完整的age列表,我们使用了以下方式:缺失值处理缺失值处理我们先来看看缺失值的占比情况缺失值处理缺失值处理计算得到的缺失值占比为0.1602,也就是说,大约每5个样本里就有一个样本有缺失值,这样的占比还是比较大的,所以我们不能直接删除存在缺失值的样本,直接删除会影响数据的客观性和结果的准确性。一种非常合理的方式是使用均值对缺失值进行填补。缺失值处理缺失值处理下面,我们对数据集中的毕业生年龄进行分析,我们使用Python内置的max
73、() 和min() 函数得到age_without_missing中的最大值和最小值:这种偏离变量实际范围的值称为异常值。我们将在类的部分对异常值进行检测和处理。社交网络信息数据集介绍利用CSV模块导入数据利用利用pandas导入数据导入数据利用pandas将数据存入一个DataFrame数据结构中得到了一个pandas内置的DataFrame类的实例提取age列,并得到其描述统计信息使用pandas内置的mean()和fillna()方法进行缺失值填补使用pandas内置的hist()方法画出缺失值填补后的年龄分布图社交网络信息数据集介绍利用CSV模块导入数据利用利用 matplotlib
74、画出年龄的分布图画出年龄的分布图结合pandas和numpy进行绘图绘制分布图有利于观察出异常情况总结总结数据分析领域常用的包什么是模块?搜索路径管理,模块的导入利用csv模块导入数据、缺失值处理利用pandas导入数据及缺失值处理、使用matplotlib绘制分布图第十一部分第十一部分PythonPython中的类中的类对象和类类的创建初始化方法_init_检测缺失值的方法成员私有化类的继承类存在的意义面向对象编程语言面向对象编程语言Python语言是一种面向对象编程语言(Object-OrientedProgrammingLanguage),简称为OOPOOP语言语言无论是变量还是函数,它
75、们都是属于某一个特定的类(class)。类中的对象叫做该类的实例(实例(instanceinstance)特定类的所有对象都与方法(方法(methodmethod)相关联,这些方法类似于一个函数,我们编写一次之后,可以重复的调用一旦某个对象属于某个特定类之后,该对象就可以使用该类的所有方法面向对象编程语言面向对象编程语言一个人(NBA球员)人的组成元素头、五官、四肢性别、血型、身高、名字所在球队、球衣号码人的行为吃喝跑步、跳跃运球、投篮、传球、抢断、传球类(类(classclass)高中生类属性:姓名、年龄、性别、分数方法:对属性进行查询或修改、与其他同类发生一些关系、运算等等对象(对象(ob
76、jectobject)高中生1高中生2对象的属性姓名:王耀华年龄:18性别:男成绩:3.51对象的属性姓名:刘美丽年龄:19性别:女成绩:3.78共有的方法:改变姓名、改变成绩等等高中生类代码中的类和对象代码中的类和对象类名类名初始化方法初始化方法参数参数初始化变量初始化变量类中的方法:类中的方法:方法名方法名函数体函数体对象名对象名对象的初始化对象的初始化对象调用类中的方法对象调用类中的方法用class类名 即可以创建一个类在类名的程序块中可以定义这个类的属性、方法等等类的创建类的创建创建实例创建实例创建相应的实例查看实例属性_init_是一种特殊的方法,使得实例一开始就拥有类模板所具有的属
77、性self参数是类中函数定义时必须使用的参数,并且永远是第一个参数,该参数表示创建的实例本身初始化方法初始化初始化_init_方法方法一旦_init_存在除了self之外的参数,那么在创建实例student_a时,我们就需要传入相应的参数值(不过self不需要传入数值,Python解释器会自动将实例变量传入)正确地初始化对象如果我们传入了两个参数 18 与 M,则我们可以成功创建一个高中生对象,这个高中生的年龄是18,性别是M我们可以不断创建拥有不同年龄与性别的高中生对象实例正确地初始化对象检测实例对象中的age属性是否为缺省值,自定义相应的missing_detecting方法自定义检测缺失
78、值的方法自定义检测缺失值的方法类中的方法的第一个参数必须为self。下面我们首先创建实例student_a,然后调用missing_detecting方法:使用自定义的类方法在每一次创建实例的时候,自动导入数据,并且定义与数据有关的变量初始化方法在在_init_方法中导入数据方法中导入数据面向对象的语言一般都对对象有一些统一的要求。例如封装性。封装性的意思是指,一个对象的成员属性要得到一定程度的保护。例如,要对一个对象的成员属性进行修改或访问,就必须通过对象允许的方法来进行(例如要求输入密码以确认拥有此权限等)。这样可以保护对象,使程序不易出错。C+与Java语言中,严格地实现了对象的封装性。
79、成员的私有化成员的私有化例如在上面的High_school_student类中,虽然数据已经被封装在类里面,但是我们还是可以通过外部访问其中的变量。我们可以在外部对age进行修改:对象的封装性说明这个High_school_student类没有进行有效的封装!设计封装的逻辑往往要耗费一定的精力,并且会导致代码更加冗长、不易读等等Python的语言风格没有特别强调封装性。它主张程序员自己通过更加严谨的方式组织程序以避免出错,而不是通过在语言层面实现封装达到这一点但是,在Python中仍然可以实现对象的(非严格意义上的)封装Python对于封装性的看法如果我们希望某些内部属性不被外部访问,我们可以
80、在属性名称前加上两个下划线_,表示将该属性成员私有化,该成员在内部可以被访问,但是在外部是不能够访问的。成员私有化并不是代表完全不能够从外部访问成员,而是提高了访问的门槛,防止意外或者随意改变成员,引发错误。我们仍然可以通过_类名+私有变量,对变量进行访问这也是我们说Python没有严格意义上的封装性的原因!成员私有化不仅包括属性的私有化,也包括了方法的私有化,在方法名称前加上_也可以使得函数只能被内部访问,不能够被外部访问:Python的封装对missing_detecting方法的访问将被阻止!与封装性一样,继承性是面向对象程序设计的另一种重要的属性。类的继承好比孩子与父母之间的继承关系一
81、样,孩子拥有父母所拥有的许多特性。在编程语言中,如果一个新的类继承另外一个类,那么这个新的类成为子类(Subclass),被子类继承的类称为父类我们可以把更加一般、范围大的类的属性在父类定义,把更加具体、范围小的特点在子类定义。类的继承类的继承定义子类在定义好High_school_student后,可以定义两个子类Male_student与female_student继承它父类的定义子类继承父类没有定义专属于子类的属性/方法子类Male_student的实例male_student继承了父类的初始化属性self.teenager_sns同样的,子类也继承missing_detecting和o
82、utlier_detecting两个实例方法:子类继承父类属性及实例化方法比如,我们试试在子类中也定义一个missing_detecting方法:然后试试创建子类实例并调用missing_detecting方法:可以看出这里我们用的是子类的missing_detecting,而不是父类的missing_detecting!如果不注意继承性的这个特点,有可能导致错误!子类中定义_init_方法总结总结类的初始化:_init_函数创建对象的属性对象与类Python的继承性:子类继承父类,子类会覆盖父类Python的封装性:提高访问门槛以防出错类存在的意义实践案例实践案例 3 3:青年失业率探索:青
83、年失业率探索第十三部分第十三部分 正则表达式正则表达式正则表达式简介正则表达式匹配过程正则表达式语法re模块正则表达式应用正则表达式解析HTMLDOS操作系统通配符:文件名描述中可以使用两个通配符* 和? ? 可以与任何实际字符匹配* 可与任意一串字符匹配dir *.txt命令输出了所有以txt结尾的文件名错误类型错误类型cmdcmd的通配符的通配符在普通字符串的基础上增加通配符,形成了一种功能更强的模式语言一个模式描述一集字符串a?ba* b缺点:加入了通配符的模式语言还不够灵活(描述能力不够强)逻辑学家Kleene提出正则表达式(RegularExpression,regex,regexp
84、,RE,re)错误类型错误类型cmdcmd的通配符的通配符错误类型正则表达式(regularexpression),又记作re或regex是用来简洁表达一组字符串的表达式正则表达式简介正则表达式简介PPytPythPythoPythonP(y|yt|yth|ytho)?n一组字符串正则表达式:一行就是特征(模式)PPyPyyPyyPy+错误类型1956年,一位叫StephenKleene的数学家在McCulloch和Pitts早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念随后,将这一工作应用于使用KenThompson的计算搜索算法的一些早期研究,Ken
85、Thompson是Unix的主要发明人正则表达式的第一个应用程序就是Unix中的qed 编辑器从那时起直到现在:则表达式都是基于文本的编辑器和搜索工具中的一个重要部分聚类分析正则表达式历史错误类型正则表达式是一种通用的字符串表达框架Java:util.regrex包Linux/Unix:grepawksed等Perl:正则表达式模块C+:GNURegexLibrary,Boost.Regex,PCRE,PCRE+Python:re库聚类分析各个编程语言的正则表达式工具许多计算机应用的最基本操作是字符串匹配:如编辑器或字处理系统工作时,在文本中查找单词或句子(中文字或词语),在程序里找拼写错误的
86、标识符等email程序的垃圾邮件过滤器,google等网络检索系统各种防病毒软件,主要靠在文件里检索病毒模式串聚类分析串匹配字符串匹配的应用在分子生物学领域:DNA内有四种碱基:腺嘌吟(adenine),胞嘧啶(cytosine),鸟嘌吟(guanine),胸腺嘧啶(thymine)。它们的不同组合翻译形成不同的氨基酸、蛋白质和其他更高级的生命结构DNA片段可看作是A、T、C、G、U构成的模式,如ACGGCTAATTCDNA的酶切过程聚类分析串匹配字符串匹配的应用串匹配串匹配的基础是逐个比较字符如果从目标串的某个位置开始,模式串的每个字符都与目标串里的对应字符相同,这就是一个匹配如果出现一对不
87、同字符,就是不匹配算法设计的关键:1,怎样比较字符;2,发现不匹配后下一步怎么做对上述两点采用不同的策略,就形成了不同的算法聚类分析串匹配字符串匹配算法设计聚类分析朴素算法朴素匹配算法:1,从左到右匹配;2,发现不匹配时,考虑目标串里的下一位置是否存在匹配朴素匹配算法简单,易理解,但效率低最坏情况是每趟比较都在最后出现不等,最多比较nm1趟,总比较次数为m*(nm1),所以算法时间复杂性为O(m*n)聚类分析KMP算法介绍KMP算法的基本想法:在匹配失败时,利用已做匹配中得到的信息,把模式串尽可能前移。匹配中只做不得不做的字符比较,不回溯具体算法过于复杂,不做详细介绍利用第一次匹配失败所获得的
88、信息,第二次直接就前进了两格。正则表达式错误类型正则表达式匹配过程正则表达式匹配过程正则表达式引擎编译正则表达式对象匹配结果匹配正则表达式文本需要匹配的文本依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功一旦有匹配不成功的字符则匹配失败正则表达式语言的基本成分是字符集里的普通字符,另外还有几种特殊的组合结构,最基本的是:正顺序组合 选择组合 | 星号*括号():将括号中的内容当成一个单位,一起操作要注意的是,这里的*的含义(重复任意次)和cmd里面的*(任意串)含义不同。正则表达式语法正则表达式语法举例:abca(b*)(c*) a(b|c)*) 这里不需要cmd中的通配符
89、 ? 和* 通配符?可以用|描述(由于字符集是有穷集)通配符*可以通过 | 和星号描述正则表达式语法正则表达式语法正则表达式常用操作符正则表达式常用操作符正则表达式常用操作符正则表达式常用操作符聚类分析匹配集合与补集l字符组表达式.匹配括号中列出的任一个字符labc可以匹配字符a或b或cl区间形式0-9是顺序列出的缩写,匹配所有十进制数字l字符0-9a-zA-Z匹配所有字母(英文字母)和数字l.中的表示求补,这种模式匹配所有未在括号里列出的字符l0-9匹配所有非十进制数字的字符ltvnfr匹配所有非空白字符(非空格/制表符/换行符)l如果需要在字符组里包括,就不能放在第一个位置,以免混淆含义。
90、可以写恢复其本来含义;如果需要在字符组包括-,也必须写-或聚类分析常规字符匹配非特殊字符称为常规字符,是描述正则表达式的基础。正则表达式串里的常规字符在匹配中只与自己匹配r1=pile(abc) 只有在pattern中运用了之前所说的特殊字符之后,才能使得正则表达式获得更加强大的匹配功能。聚类分析常用字符组1.为了方便,re用换意串形式定义了几个常用字符组,包括:1.d:与十进制数字匹配,等价于0-92.D:与非十进制数字的所有字符匹配,等价于0-93.s:与所有空白字符匹配,等价于tvnfr4.S:与所有非空白字符匹配,等价于tvnfr5.w:与所有字母数字字符匹配,等价于0-9a-zA-Z
91、6.W:与所有非字母数字字符匹配,等价于0-9a-zA-Z2.圆点字符.可以匹配任意一个字符1.a.b匹配所有以a开头b结束的四字符串聚类分析重复l常希望写重复匹配的模式(部分),任意次或若干次重复:l基本重复运算符是*,*与的0次或任意多次出现匹配l例如1-90-9*或者1-9d*代表任意大的正整数l与*略微不同的重复运算符+表示1次或多次重复l例:允许以0开头时,描述正整数的一种简单写法d+l+,等价于*聚类分析重复l常希望写重复匹配的模式(部分),任意次或若干次重复l用?运算符表示?表示0次或1次重复l例,描述整数(表示整数的字符串)的一种简单模式-?d+,其前面的-?部分表示可以以负号
92、开头。l确定次数的重复用n表示,n与匹配的串的n次重复匹配l描述北京常规的固话号码:(010-)?2-90-97表示可选010前缀,2-9开头,后面的任意数字加起来一共可以有七位。聚类分析重复l常希望写重复匹配的模式(部分),任意可以在指定范围内重复l重复范围用m,n表示,m,n与匹配的串的m到n次重复匹配la3,7与3到7个a构成的串匹配lgo2,10gle与google,gooogle,.,goooooooooogle匹配l重复范围中的m和n均可以省略,,n表示0,n,而m,表示m,infinity。l之前介绍的几种重复都可以用这个形式表示:n等价于n,n,?等价于0,1*等价于0,inf
93、inity,+等价于1,infinity聚类分析重复l要特别注意的是,所有涉及重复的地方都会涉及一个概念叫做贪婪匹配l例如:字符串为abcdddddddd,正则表达式为abcd3:5l那么,正则表达式可以匹配abcddd、abcdddd、abcdddddl但是一般程序设计语言中,大多会默认正则表达式进行贪婪匹配,即可以匹配的多个互相有包含关系的时候,只匹配最大的那一个l在后面讲述Python中正则表达式的用法时,我们会有具体的例子聚类分析括号l如果没有括号,则运算为顺序运算。所有运算符仅仅作用一个单位。l在正则表达式中使用括号()与一般括号的含义一样:即将内部的东西形成一个整体,再整体进行外部
94、的运算l例如:ab*代表一个a与许多个b连在一起l而使用(ab)*代表任意多个(ab)连在一起l在正则表达式较大、较复杂的时候,要特别注意运算的规则,以及运用括号达到自己真正需要表达的意思。聚类分析首尾匹配l行首匹配:以符号开头的模式,只能与一行的前缀子串匹配l例如for只能匹配以for为前缀的一行。如果将其与一行booksforchildren匹配,将得到Nonel行尾匹配:以$符号结尾的模式,只与一行的后缀匹配l例如fish$只匹配以fish为后缀的一行。如果将其与一行catsliketoeatfishes匹配,将得到Nonel很多语言中$都分别代表行首/行尾的标记。例如文本编辑器VIM聚
95、类分析Python正则表达式语法总结l刚才,我们已经介绍了所有的特殊字符。进行一个总结:l转义字符l选择字符|l集合字符、-l通配符.l重复字符*、?、+、l括号()l首尾字符、$l以及其他一些被转义的普通字符可以发挥特殊的作用,如DdSs等等聚类分析首尾匹配l注意:上面所说的与$代表的一行的开头与结束,而不是整个字符串的开头与结束。如果一个字符串中出现了多个换行符号,则模式或许可能与多个行首、行尾形成匹配。l串首匹配:A开头的模式只与被匹配串的前缀匹配l例如Afor即只能与以for开头的字符串形成匹配。l串尾匹配:Z结束的模式只与被匹配串的后缀匹配聚类分析正则表达式语法实例P(y|yt|yt
96、h|ytho)?nPython+PythonPyth?onPy:3nPn、Pytn、Pythn、PythonPython、Pythonn、PythonnnPyton、PyhonPyon、PyaonPyton、PyhonPn、Pyn、Pyyn、Pyyyn正则表达式对应字符串聚类分析经典正则表达式语法实例A-Za-z+$A-Zaz0-9+$-?d+$0-9*1-90-9*$1-9d5u4e00-u9fa5d3-d8|d4-d7由26个字母组成的字符串由26个字母和数字组成的字符串整数形式的字符串正整数形式的字符串中国境内邮政编码,6位匹配中文字符国内电话号码正则表达式说明聚类分析匹配IP地址的正则
97、表达式0-99 1-9?d100-199 1d2200-249 20-4d250-255 250-5精确写法IP地址字符串形式的正则表达式(IP地址分为4段,每段0-255)d+.d+.d+.d+ 或d1,3.d1,3.d1,3.d1,3(1-9?d|1d2|20-4d|250-5).)3(1-9?d|1d2|20-4d|250-5)匹配Ip地址聚类分析Python的正则表达式正则表达式是独立于语言存在的,不同语言有不同的实现方式| 与* 是正则表达式的通用语法,Python中使用正则表达式时,包括但不限于这些简单的语法Python:内置模块re聚类分析pattern 类Python的正则表达
98、式包re中,最基本的类就是pattern正则表达式的对象可以从普通的字符串生成,语句为:r1 = pile(普通字符串普通字符串) 聚类分析re模块lre模块中的函数有:searchfindallfinditermatchfullmatchsplitsub subnpattern聚类分析re模块lsearchsearchl用法是re.search(pattern,字符串字符串)l对字符串进行模式搜索,如果找到第一个匹配的位置,返回一个MatchObject对象;这个对象中储存了匹配位置、匹配内容等信息。后面我们会详细讲。l若该字符串没有模式匹配,则返回None。l例如:手机评论数据中出现很多的
99、关于屏幕、音频、拍照之类的功能评价,那么在实际数据分析中,我们可能需要看评论中是否会出现屏幕。re.search()函数便是根据需要匹配的模式进行搜索的函数聚类分析手机评论数据集l数据集是从某手机评论网站上爬下来的,共25068条记录。每条记录都已经分好词、去除标点符号,数据可以直接使用。以下显示前五条分好词记录:聚类分析re模块lsearchsearchl我们用正则表达式屏幕.*好坏去search我们的评论,得到了一个MatchObject,其中记录了匹配的内容屏幕的质量很好与匹配的位置(从第7到第14位)聚类分析re模块lsearchsearchl如前所述,需要多次复用我们可以先生成一个正
100、则表达式对象,以提高效率。聚类分析re模块lsearchsearchl要注意的是,search进行的是贪婪匹配,即寻找最大的匹配l为了避免上述的错误,可以把中间的*改为:n,限制间隔的字数有两段(有包含关系)都可以匹配pattern:屏幕很坏屏幕很坏,还不够我家厕所窗户好贪婪匹配选择包含关系中最大的一段聚类分析re模块lsearchsearchl要注意的是,search只是寻找从左到右第一个与正则表达式匹配,而不是找到所有匹配位置。贪婪指的是匹配的最大,而不是最多。l遇到这个问题应该用findall函数Pattern代表屏幕与好坏只相隔一个字。有两个独立的部分可以匹配pattern:屏幕很好屏
101、幕很坏只选择第一个匹配聚类分析re模块lfindallfindalll刚才介绍的search函数只能从左到右找出第一个最大的匹配。而findall函数可以找出所有匹配,并把它们从左到右作为一个列表返回。如果无匹配,返回空列表。注意这里屏幕与好/坏中间只隔了一个通配符.,所以能帮我们得到正确答案。聚类分析re模块lfindallfindalll要注意,re模块的规则都是贪婪匹配的,findall也不例外l贪婪匹配的含义不是要找出最多的匹配,而是要在每一次匹配的时候找到最大的匹配。这提醒我们,一定要当心使用*,最好都改为由限定范围的:n注意这里屏幕与好/坏中间隔了任意个通配符.*,所以会导致错误。
102、聚类分析re模块lfinditerfinditerlfinditer函数与findall函数的作用基本是一样的。不同的是finall返回的是一个列表,finditer返回的是一个迭代器。迭代器用完之后可以自动释放内存。l在处理的数据较大的时候,finditer或许会发挥其作用。但如果数据较小、不重视内存,或者手动释放,则finditer的功能可以完全被findall取代。聚类分析re模块lmatchmatchl用法是re.match(pattern,字符串),和re.search()类似,唯一不同的是re.match()只从头开始匹配,re.search()可以匹配任一位置的字符串。l即如果符
103、合正则表达式的字符串如果出现在开头,那么使用re.match()后会返回MatchObject对象,但如果出现在中间位置或没有,则返回None。l也可以等价于在search函数的pattern前增加一个表示字符串开头的A字符lMatch函数也是贪婪的。并且,它显然不存在匹配第一个还是多个这样的问题。因为从头开始的贪婪匹配显然只能有一种结果。聚类分析re模块lmatchmatch这个例子说明了match只是从头开始匹配聚类分析re模块lfullmatchfullmatchl用法和match类似,但它不但是从头匹配,而是从头到尾匹配l可以说,fullmatch就是用来检测pattern与整个str
104、ing是不是匹配的String1是整体与是整体与pattern匹配的匹配的String2只有前缀与只有前缀与pattern匹配匹配聚类分析re模块lsplitsplitl一般的字符串也有split函数,用法是string.split(sep=分隔符分隔符)l则得到一个将字符串按照分隔符划分而成的表格:l但是只能用一种字符串做为sep来进行切分,功能不够强大聚类分析re模块lsplitsplitl使用re.split(pattern,string)可以将string中所有与pattern匹配的东西做为分割符,继而将字符串分割为一张表。l例如上例以所有小写字母为分隔符划分了字符串,形成列表聚类分析
105、re模块lsplitsplitl要注意re中函数都是贪婪匹配的,split也不例外l例如上例以所有小写字母重复任意次为分割符,那么所有内容都是分割符。所以,string就变成了两个空字符串聚类分析re模块lsplitsplitlsplit函数还可以指定maxsplit参数,规定最大被划分多少次lmaxsplit=3表示只取前三个与pattern匹配的来分隔,即将字符串划分为4份。注意不要以为maxsplit=3就是划分为3份!聚类分析re模块lsubsubre.sub(pattern,repl,字符串字符串)方法用于对符合正则表达式字符串的替换。像是前面触摸屏、屏幕可认为是同义词的情况,是可以
106、进行词替换的,这样可以减少进入训练模型的特征维度。聚类分析re模块lsubsub可以指定一个count的参数,限制最大的匹配替换次数。上例中,由于指定了count=1,所以只有第一个匹配触摸屏被替换了,第二个匹配的显示屏并没有被替换。聚类分析re模块lsubnsubn与sub的使用方式与结果介乎是一样的,不同的是,subn返回的对象是一个被替换后的字符串与替换次数的两元组:上例返回的元组是替换后的字符串以及一共替换了两次的信息聚类分析re模块lr re e函数总结(函数总结(对于一个正则表达式与一个字符串):):lfullmatch二者是否匹配,match检查是否与字符串前缀匹配lsearch
107、找出字符串第一个匹配的部分lfindall找出所有匹配的部分形成一个列表,finditer找出所有迭代部分形成一个迭代器lsplit找出所有匹配部分,用其作为分隔符划分字符串lsub将所有匹配部分替换为指定字符串,sub额外返回替换次数l要注意所有的匹配都带有贪婪匹配的性质!334目录第一部分手机评论数据集第二部分字符串的性质第三部分串匹配第四部分正则表达式第五部分Python的re模块第六部分正则表达式应用聚类分析正则表达式应用l去掉去掉标点符号标点符号通常来说,在拿到中文文本数据之后,首先把标点符号去掉,然后再进行分词。而中文数据中的标点符号不仅有用英文的还有中文,我们可以自定义标点符号的
108、正则表达式来将标点符号替换为,这样就可以把标点符号去掉了。聚类分析正则表达式应用l去掉去掉标点符号标点符号要注意的是:中文的标点符号大多是没有歧义的。而英文的标点符号大多数本来就是正则表达式中有特殊含义的符号。所以,必须在前面运用转义字符才能将特殊含义转换为其原来的含义。然后使用re.sub函数即可以将标点符号替换为空字符聚类分析正则表达式应用l重组分词重组分词用分词工具分词之后的语句中,仍然有很多分错的情况。对于分错的解决方法有两种,第一种是将分错的词作为词典加入分词工具的词典中再重新分词;第二种是用正则表达式将这个词提取出来进行替换。第一种方法其实更常用一些,但是有时候可能仅仅需要暂时替换
109、查看效果,那么所有句子都重新分词的成本看起来就比较大了。所以第二种方法也是需要掌握的。聚类分析正则表达式应用l定义一个函数,求字符串中出现的所有整数之和定义一个函数,求字符串中出现的所有整数之和聚类分析正则表达式应用l刚才我们介绍过,re.sub(pattern,repl,string)可以把string中所有与pattern匹配的内容全部替换为repl。lre.sub还有一个特殊的功能,如果使用re.sub(pattern,function,string),其中function是一个函数。则可以把所有匹配的对象全部替换为作用function后的对象。聚类分析正则表达式应用l利用这个功能,我们
110、可以实现一些更加强大的效果。l例如把Python中自定义的变量、函数、对象都加上前缀my_错误类型HTML可以看作是带有特殊标签的纯文本文件,使用正则表达式,对标签进行匹配,抽取数据尝试抽取数据嗨客平台上所有课程的名称正则表达式解析正则表达式解析HTMLHTML聚类分析使用正则表达式抽取数据显示网页源代码名称嵌在和之中写出对应的正则表达式(.+?)字符. 负责匹配除了换行字符意外的任何字符字符+? 负责字符匹配的范围() 区别于字符集合 ,代表捕获组(.+?) 表示匹配标签之间的所有内容可以利用findall方法抽取数据聚类分析使用正则表达式抽取数据可以利用pattern进行逐行匹配聚类分析使
111、用正则表达式抽取数据请尝试抽取每个课程的课程状态网页是具有树形结构的数据,每个标签都是树形结构的一个节点定位节点,找到与节点相关的数据聚类分析使用BeautifulSoup模块抽取数据调用findAll()函数,去定位标签,抽取所有与之相关的数据聚类分析使用BeautifulSoup模块抽取数据进一步确定标签属性class值为title聚类分析使用BeautifulSoup模块抽取数据错误类型练习练习尝试提取某网站书籍名称、作者、出版社、价格信息?错误类型解析网页到底用不用正则解析?观点一:不用HTML不是正则语言,无法真正地用正则表达式解析虽然直接用正则更快,但更麻烦,容易出错类似爬虫,HT
112、ML复杂度的不可预见性合法的HTML无法用正则解析,更不用说会碰到不合法但是浏览器可以支持的HTML网页是动态的,今天写的不见得明天有用正则表达式解析正则表达式解析HTMLHTML错误类型解析网页到底用不用正则解析?观点二:用获取链接建议用正则表达式解析整个HTML非常耗时,哪怕使用最快的lxml,相差四倍以上可以总结一些不正常的URL,过滤掉即可正则表达式解析正则表达式解析HTMLHTML建议:简单网页用正则、复杂网页正则搞不定的用lxml等解析器错误类型HTML解析器ElementTree是标准库的一部分BeautifulSoup是一个流行的第三方库lxml是一个功能齐全基于c的快速解析库
113、正则表达式解析正则表达式解析HTMLHTML总结总结正则表达式匹配过程及表示类型正则表达式简介正则表达式语法及应用re模块:search,findall,finditer,match,fullmatch正则表达式解析HTMLre模块:split,sub,subn,pattern第十四部分第十四部分 日期数据的处理日期数据的处理datatime模块应用聚类分析上证指数l上海证券综合指数,英文是:Shanghai(securities)compositeindex.通常简称:“Shanghaicompositeindex”(上证综指)。“上海证券综合指数”它是上海证券交易所编制的,以上海证券交易所
114、挂牌上市的全部股票为计算范围,以发行量为权数综合。上证综指反映了上海证券交易市场的总体走势。聚类分析上证指数l数据集抽取的是2015年1月1日至2016年1月1日上证指数每日的成交量、开盘、收盘、最高、最低指数聚类分析读取数据l下面,我们将上证指数的数据读取进来l每一行的数据包括日期时间与股票的open、close、high、low等等价格聚类分析datetime模块l可以看到,时间变量date下表示具体日期的值2015-01-05是一个字符串。其实如果所有时间都是这种YYYY-MM-DD比较规范的格式,那么是不需要将日期专门转为datetime类,普通的字符串处理方法就能够处理大多数规范格式
115、的数据。l但实际上,很多日期数据读进计算机的时候是一个字符串,但是不是所有都会是一个格式的。另外,十分关键的一点是,如果用字符串处理方法,那就需要每次都输入想要的日期所在字符串的位置,这是比较容易写错的,而且并不通用。聚类分析datetime模块ldatetime是Python一个专门用于时间处理的模块,这个模块主要包含三个类:Timedatedatetimel三个类的方法属性类似,其中time主要包含一天内的小时、分钟、秒、毫秒信息;date类包含年、月、日;datetime则是前两者的结合。数据集中的数据既需要date信息,也需要time信息,所以这章只用到datetime类。熟悉date
116、time类后其余的time、date都会很好上手。聚类分析datetime模块l转为datetime类型datetime.strptime()是专门用于将字符串转换为datetime类型的方法,其用法为: datetime.strptime(datetime.strptime(date_string,format) )date_string:指日期字符串format:日期字符串的日期格式聚类分析datetime模块l转为datetime类型日期格式format用具体例子来说,对于上面的2015-01-05的日期格式就是%Y-%m-%d。下面为所有表示时间的格式:%y两位数的年份表示,区间为00
117、,99%Y四位数的年份表示,区间为000,9999%m月份01-12%d月内中的一天0-31%H24小时制小时数0-23%I12小时制小时数01-12%M分钟数00=59%S秒00-59%a本地简化星期名称%A本地完整星期名称v%b本地简化的月份名称%B本地完整的月份名称%c本地相应的日期表示和时间表示%j年内的一天001-366%p本地A.M.或P .M. 的等价符%U一年中的星期数00-53星期天为星期的开始%w星期0-6,星期天为星期的开始%W一年中的星期数00-53星期一为星期的开始%x本地相应的日期表示%X本地相应的时间表示%Z当前时区的名称%号本身聚类分析datetime模块l转为
118、datetime类型四位年,两位的月份,两位日期,中间用“”分隔所以采用format1 = %Y/%m/%d聚类分析datetime模块l转为datetime类型四位年,两位的月份、日期“-”分隔两位的小时、分钟、秒,中间用“:”分隔format2 = %Y-%m-%d %H:%M:%S聚类分析datetime模块l转为datetime类型和上例相比,没有后面的:秒钟所以format比上例少了后面的”:%S”format3 = %Y-%m-%d %H:%M聚类分析datetime模块我们把一个str转换为一个datetime类之后,就可以开始使用这个类例如用左边的方法可以判断时间是处于哪一年。
119、利用这个属性,我们可以对日期数据进行批量的处理,例如把同一年的所有数据都挑出来。聚类分析datetime模块ldatetime对象的属性“datetime”对象有各个具体时间单位的属性:datetime.year 获得年份datetime.month 月份datetime.day日期datetime.hour小时datetime.minute分钟datetime.second秒datetime.microsecond毫秒聚类分析datetime模块ldatetime对象的方法datetime对象可以直接进行减法这段代码的计算出两个日期之这段代码的计算出两个日期之间相差了间相差了752天多三个小
120、时天多三个小时事实上,这返回了一个事实上,这返回了一个timedelta对象对象聚类分析datetime模块ldatetime对象的方法要注意的是datetime对象不能进行加法,因为这没有意义聚类分析datetime模块ldatetime对象的方法isweekday() 是一个很方便的方法,可以直接查看这个日期对象是星期几:这段代码的含义是:这段代码的含义是:2017年年4月月15日是星期日是星期6聚类分析datetime模块ldatetime对象的方法weekday() 是一个类似的方法,但要注意的是,这里星期一是0,星期二是1,星期天是6。这符合计算机从0开始的规则。但是不符合人的直观。
121、这段代码的含义是:这段代码的含义是:2017年年4月月15日是星期日是星期6,而不是星期,而不是星期5聚类分析datetime模块ldatetime对象的方法fromordinal() 接受一个整型的天数数值,返回一个天数所等价的年数、月数、日数的date对象。这段代码的含义是:这段代码的含义是:如果现在是如果现在是1年年1月月1日日则则1000天后是天后是3年年9月月27日日聚类分析datetime模块ldatetime对象的方法fromtimestamp() 接收一个浮点型的时间戳,返回一个从1970年起+时间戳的秒数对应的年、月、日的date对象。这段代码的含义是:这段代码的含义是:从从
122、1970年年1月月1日日0点开始,过了点开始,过了10亿秒钟之后,亿秒钟之后,是是2001年年9月月9日日9点点46分分40秒。秒。聚类分析datetime模块ldatetime模块的其他方法利用now函数,可以获得现在的时间:聚类分析datetime模块l利用now函数与timedelta,可以实现计时功能两次计时之间过去了0.529秒聚类分析应用l事实上,股票不是每一天都开盘交易的。在节假日,股票市场一般不会交易。l下面我们尝试着统计一下一年间各个月份中各有多少个交易日l想法:将每一个出现过的日期按照月份分类,统计各个类出现的数量。聚类分析应用l我们创立一个字典,形式为:月份:天数l然后,
123、我们遍历所有的日期数据,将其中的月份抽取出来,将其放进字典中。l当我们遍历完毕所有数据集之后,我们将字典中所有内容打印出来。第十五部分第十五部分NumpyNumpy基础知识基础知识基本数据结构ndarray相关操作结构化的数据内置操作函数线性代数模块linalg随机模块random2024/8/11376外经贸-信息学院Python在科学计算方面有很多不断改良的库,结合其在通用编程方面的强大实力,使其在数据处理、交互探索性计算以及数据可视化方面深受广大编程者的喜爱Python有着一个强大的科学计算生态圈,已经完全可以媲美MATLAB、R等特定编程语言/工具377PythonPython科学计算
124、生态圈科学计算生态圈2024/8/11外经贸-信息学院Numpy是一个专门用于矩阵化运算、科学计算的开源PythonNumPy将Python相当于变成一种免费的更强大的Matlab系统1.强大的ndarray多维数组结构2.成熟的函数库3.用于整合C/C+和Fortran代码的工具包4.实用的线性代数、傅里叶变换和随机数模块5.Numpy和稀疏矩阵运算包scipy配合使用非常方便NumpyNumpy 介绍介绍2024/8/11378外经贸-信息学院矩阵表示:使用Numpy,易得到二维矩阵基本数据结构基本数据结构 ndarray2024/8/11379外经贸-信息学院作为ndarray对象里的数
125、据有时并不是所需要的,那么可以使用ndarray对象的astype() 方法转为指定的数据类型基本数据结构基本数据结构 ndarrayhttp:/ hstack 沿横轴拼接通过concatenate进行拼接2024/8/11390外经贸-信息学院ndarray相关操作:转置、翻转相关操作:转置、翻转转置:transpose方法、在数组后加.T2024/8/11391外经贸-信息学院ndarray相关操作:转置、翻转相关操作:转置、翻转翻转:fliplr左右翻转、flipud 上下翻转2024/8/11392外经贸-信息学院对位运算对位运算指ndarray进行加减乘除运算时,使对应位置的数值进行
126、加减乘除运算2024/8/11393外经贸-信息学院对位运算对位运算当两个ndarray的维度不一致时,则没有对齐的维度上会分别执行对位运算,这种机制叫做广播(broadcasting)2024/8/11394外经贸-信息学院给你的变量命名结构化的数据结构化的数据2024/8/11395外经贸-信息学院上证指数数据中,数据sh_content的第一个元素是每个变量的命名,对其命名重新设置参数dtype结构化的数据结构化的数据2024/8/11396外经贸-信息学院按命名索引结构化的数据结构化的数据2024/8/11397外经贸-信息学院内置操作函数内置操作函数内置操作函数numpy.log()
127、函数是numpy模块提供的现成自然对数函数数学函数统计函数运算函数2024/8/11398外经贸-信息学院在计算的时候,会用到差分、累加的情况。Numpy提供很多相关的运算函数以计算差分的numpy.diff()方法为例:内置操作函数内置操作函数内置操作函数数学函数统计函数运算函数2024/8/11399外经贸-信息学院对于二维矩阵,需要指明是对哪一个维度进行差分内置操作函数内置操作函数内置操作函数统计函数运算函数数学函数2024/8/11400外经贸-信息学院numpy提供了很多计算最大值、最小值、均值、中位数等统计量的函数,比如统计最大值的函数numpy.amax()内置操作函数内置操作函
128、数内置操作函数统计函数运算函数数学函数2024/8/11401外经贸-信息学院内置操作函数内置操作函数内置操作函数统计函数运算函数数学函数2024/8/11402外经贸-信息学院线性代数模块线性代数模块linalgNumpy广泛应用于数值计算过程,其线性代数模块linalg常用于向量及矩阵的基本运算以及特征值分解、SVD分解等矩阵分解过程2024/8/11403外经贸-信息学院线性代数模块线性代数模块linalg特征值分解、Cholesky分解、SVD分解2024/8/11404外经贸-信息学院线性代数模块线性代数模块linalg2024/8/11405外经贸-信息学院随机模块随机模块rand
129、om伪随机数的产生,可从离散分布和连续分布中产生在蒙特卡洛方法、随机积分、随机过程模拟等很多方面都有应用指定随机种子(seed)产生相同的随机数序列2024/8/11406外经贸-信息学院random.seed(666)指定全局种子,也可以使用random.RandomState(666) 的方式指定局部种子,在指定局部种子的情况下,使用局部种子产生的随机数不改变全局种子与局部种子2024/8/11407外经贸-信息学院常见分布的产生方式2024/8/11408外经贸-信息学院产生二项分布图练习要求产生B(10,0.5)B(5,0.5)B(1,0.5)二项分布图(分别从二项分布B(10,0.5
130、)、B(5,0.5)、B(1,0.5)中产生10000个样本存入数组)2024/8/11409外经贸-信息学院模拟实验三扇门,其中一扇门后有奖品,这扇门只有主持人知道。选手先随机选一扇门,但并不打开,主持人看到后,会打开其余两扇门中没有奖品的一扇门。然后,主持人问选手,是否要改变一开始的选择?你会改变选择吗?改变2/3选对不改变1/3选对?2024/8/11410外经贸-信息学院模拟实验2024/8/11411外经贸-信息学院模拟实验2024/8/11412外经贸-信息学院总结总结ndarray相关操作:索引、切分、重构、拼接、转置与翻转Numpy基本数据结构ndarray内置操作函数:数学函
131、数、运算函数、统计函数对位运算原则,结构化的数据线性代数模块linalg,随机模块random2024/8/11413外经贸-信息学院案例实践案例实践 4 4:飞机失事事故探索:飞机失事事故探索2024/8/11414外经贸-信息学院第十六部分Pandas数据分析415PythonPython科学计算生态圈科学计算生态圈lPython在科学计算方面有很多不断改良的库,结合其在通用编程方面的强大实力,使其在数据处理、交互探索性计算以及数据可视化方面深受广大编程者的喜爱lPython有着一个强大的科学计算生态圈,已经完全可以媲美MATLAB、R等特定编程语言/工具416PythonPython科学
132、计算生态圈科学计算生态圈-Numpy-NumpylNumPy是Python科学计算基础包,提供了以下功能(仅列举了几条)快速高效的多维数组对象ndarray用于对数组执行元素级计算以及直接对数组执行数学运算的函数用于读写硬盘上基于数组的数据集的工具线性代数运算、傅里叶变换以及随机数生成用于集成由C、C+、Fortran等语言编写的代码的工具l对于数值型数据,NumPy数组在存储和处理数据时要比内置的Python数据结构高效得多417PythonPython科学计算生态圈科学计算生态圈-Scipy-ScipylSciPy是一组专门解决科学计算中各种标准问题域的包的集合,跟NumPy的有机结合完全
133、可以替代MATLAB的计算功能scipy.integrate:数值积分和微分方程求解器scipy.linalg:扩展了由numpy.linalg提供的线性代数和矩阵分解功能scipy.optimize:函数优化器以及根查找算法scipy.special:SPECFUN(实现了许多常用数学函数如伽玛函数的Fortran库)的包装器scipy.stats:标准概率分布、各种统计检验方法以及更好的描述统计法scipy.weave:利用内联C+代码加速数组计算的工具418PythonPython科学计算生态圈科学计算生态圈-Pandas-Pandaslpandas提供了使我们能够快速便捷地处理结构化数
134、据的大量数据结构和函数lpandas兼具NumPy高性能的数组计算功能以及电子表格和关系型数据库灵活的数据处理功能l对于金融行业的用户,pandas提供了大量适合于金融数据的高性能时间序列功能和工具l学统计的人会对R语言比较熟悉,R提供的data.frame对象功能仅仅是pandas的DataFrame所提供的功能的一个子集419420目录第一部分文件读写第二部分变量离散化第三部分缺失值填补第四部分数据标准化第五部分数据合并第六部分数据组合第七部分数字编码第八部分OneHot编码421数据文件操作读入数据pandas提供了一些用于将表格型数据读取为DataFrame对象的函数,常用的函数为re
135、ad_csv和read_table函数的选项可以划分为几个大类索引:将一个或多个列当做返回的DataFrame处理,以及是否从文件、用户获取列名类型推断和数据转换:包括用户定义值的转换、缺失值标记列表等日期解析:包括组合功能,比如将分散在多个列中的日期时间信息组合起来迭代:支持对大文件进行逐块迭代不规整数据问题:跳过一些行、页脚、注释或其他一些不重要的东西422文件读写Pandas提供了一些用于将表格型数据读取位DataFrame对象的函数。其中最常用的为read_csv和read_table。read_csv从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为逗号。read_tabl
136、e从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为制表符(“t”)In19:df = pd.read_csv(iris.csv)df.head()Out19: sepal_len sepal_wh petal_len petal_wh target0 5.1 3.5 1.4 0.2 01 4.9 3.0 1.4 0.2 02 4.7 3.2 1.3 0.2 03 4.6 3.1 1.5 0.2 04 5.0 3.6 1.4 0.2 0423文件读写使用read_table从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为制表符(“t”)In20:df = pd.read_
137、table(./iris.csv,sep=,)df.head()Out20: sepal_len sepal_wh petal_len petal_wh target0 5.1 3.5 1.4 0.2 01 4.9 3.0 1.4 0.2 02 4.7 3.2 1.3 0.2 03 4.6 3.1 1.5 0.2 04 5.0 3.6 1.4 0.2 0424文件读写read_csv/read_table常用参数介绍:path:表示文件系统位置、URL、文件型对象的字符串sep/delimiter:用于对行中个字段进行拆分的字符序列或正则表达式header:用做列名的行号。默认为0(第一行),
138、若无header行,设为Nonenames:用于结果的列名列表,结合header=Noneskiprows:需要忽略的行数na_values:一组用于替换NA的值nrows:需要读取的行数(从文件开始处算起)verbose:打印各种解析器信息,比如“非数值列中缺失值的数量”encoding:用于unicode的文本格式编码。例如,“utf-8”表示用UTF-8编码的文本425文件读写在处理不规则文件时,skiprows可以帮助跳过文件中的若干行。df = pd.read_csv(iris.csv,skiprows=0,2,3)df.head()Out57: 5.1 3.5 1.4 0.2 00
139、 4.6 3.1 1.5 0.2 01 5.0 3.6 1.4 0.2 02 5.4 3.9 1.7 0.4 03 4.6 3.4 1.4 0.3 04 5.0 3.4 1.5 0.2 0426文件读写可以在读取文件时处理数据中的缺失值,要用到参数na_values。tips = pd.read_csv(tips.csv)tips.head()Out70: Unnamed: 0 total_bill tip sex smoker day time size0 0 16.99 1.01 Female No Sun Dinner 21 1 10.34 1.66 Male No Sun Dinner
140、 32 2 21.01 3.50 Male No Sun Dinner 33 3 23.68 3.31 Male No Sun Dinner 24 4 24.59 3.61 Female No Sun Dinner 4427文件读写na_values可以接受一组表示缺失值的字符串,用字典将列的特定值指定为NaN。map_id = sex:Female,size:3tips = pd.read_csv(tips.csv,na_values=map_id)tips.head()Out71: Unnamed: 0 total_bill tip sex smoker day time size0 0
141、16.99 1.01 NaN No Sun Dinner 21 1 10.34 1.66 Male No Sun Dinner NaN2 2 21.01 3.50 Male No Sun Dinner NaN3 3 23.68 3.31 Male No Sun Dinner 24 4 24.59 3.61 NaN No Sun Dinner 4428文件读写在处理较大文件时,有两种方式:通过nrows指定读取的行;通过设置chunksize,逐块读取。In66:chunker = pd.read_csv(iris.csv, chunksize=50)#输出每一块的长度for piece in
142、chunker: print len(piece)Out66:505050In79:pd.read_csv(iris.csv,nrows=5)Out79: sepal_len sepal_wh petal_len petal_wh target0 5.1 3.5 1.4 0.2 01 4.9 3.0 1.4 0.2 02 4.7 3.2 1.3 0.2 03 4.6 3.1 1.5 0.2 04 5.0 3.6 1.4 0.2 0429数据文件操作写出数据使用to_csv写出数据到文件,默认会写出行和列的标签,可以设置index和header选项进行选择。In10:df = pd.read_c
143、sv(iris.csv)df.to_csv(out.csv)!type out.csvOut10:,a,b,c,dSepal_len,sepal_wh,petal_len,petal wh,target5.1,3.5,1.4,0.2,04.9,3.0,1.4,0.2,04.7,3.2,1.3,0.2,04.6,3.1,1.5,0.2,0In11:df.to_csv(out.csv,index=False,header=False)!type out.csv5.1,3.5,1.4,0.2,04.9,3.0,1.4,0.2,04.7,3.2,1.3,0.2,04.6,3.1,1.5,0.2,043
144、0文件读写小结431文件读写小结432目录第一部分文件读写第二部分变量离散化第三部分缺失值填补第四部分数据标准化第五部分数据合并第六部分数据组合第七部分数字编码第八部分OneHot编码433变量离散化为了便于分析,连续数据常常被离散化或拆分为“bin”。要实现该功能,需要使用pandas的cut函数。pandas返回的是一个特殊的Categorical对象,可以将其看做一组表示“bin”名称的字符串。实际上,它含有一个表示不同分类名称的levels数组以及一个为要划分特征数据进行标号的labels属性:sl = dfusepal_lenbins = 4,5,6,7,8cats = pd.cut
145、(sl, bins)cats:5Out19: 0 (5, 61 (4, 52 (4, 53 (4, 54 (4, 5Name: sepal length (cm), dtype: categoryCategories (4, object): (4, 5 (5, 6 (6, 7 (7, 8434变量离散化与“区间”的数学符号一样,圆括号表示开区间,二方括号表示闭区间,可以通过right参数修改区间。pd.cut(sl,bins,right=False)Out53: 0 5, 6)1 4, 5)2 4, 5)3 4, 5)4 5, 6)5 5, 6)435变量离散化qcut是一个非常类似于cut
146、的函数,它可以根据样本分位数对数据进bin划分。相比cut,qcut使用样本分位数,可以得到大小基本相等的bin。cats = pd.qcut(sl,4)cats.head() Out55: 0 4.3, 5.11 4.3, 5.12 4.3, 5.13 4.3, 5.14 4.3, 5.1Name: sepal length (cm), dtype: categoryCategories (4, object): 4.3, 5.1 (5.1, 5.8 (5.8, 6.4 (6.4, 7.9pd.value_counts(cats)Out56: 4.3, 5.1 41(5.1, 5.8 39(
147、6.4, 7.9 35(5.8, 6.4 35dtype: int64436目录第一部分文件读写第二部分变量离散化第三部分缺失值填补第四部分数据标准化第五部分数据合并第六部分数据组合第七部分数字编码第八部分OneHot编码437处理缺失数据pandas使用浮点值NaN(NotaNumber)表示浮点和非浮点数组中的缺失数据,它只是一个便于被检测出来的标记而已;Python内置的None值也会被当做NA处理In 2: string_data=Series(None,b,np.nan,d)In 3: string_dataIn 4: string_data.isnull()Out3: Out4:
148、0 None0 True1 b1 False2 NaN2 True3 d3 Falsedtype: objectdtype: bool438处理缺失值对于DataFrame对象,dropna默认丢弃任何含有缺失值的行,how=all只丢弃全为NA的那些行,axis=1指定丢弃列teenager = pd.read_csv(teenager_sns.csv)teenager = teenager.ix:,0,1,2,3,4teenager.head()Out9: gradyear gender age friends basketball0 2006 M 18.980 2 01 2006 F 1
149、8.801 0 02 NaN NaN NaN NaN NaN3 2006 F 18.875 0 04 2006 NaN 18.995 NaN 0teenager.dropna().head()Out10: gradyear gender age friends basketball0 2006 M 18.980 2 01 2006 F 18.801 0 03 2006 F 18.875 0 06 2006 F 18.930 72 07 2006 M 18.322 17 0439处理缺失值丢弃数据中全部为缺失值的行。In11:teenager.dropna(how=all).head()Out1
150、1: gradyear gender age friends basketball0 2006 M 18.980 2 01 2006 F 18.801 0 03 2006 F 18.875 0 04 2006 NaN 18.995 NaN 05 2006 F NaN 142 0440处理缺失值丢弃数据中全部为缺失值的列。In13:teenagernewcol = np.NaNteenager.head()Out13: gradyear gender age friends basketball newcol0 2006 M 18.980 2 0 NaN1 2006 F 18.801 0 0 N
151、aN2 NaN NaN NaN NaN NaN NaN3 2006 F 18.875 0 0 NaN4 2006 NaN 18.995 NaN 0 NaNIn14:teenager = teenager.dropna(how=all,axis=1)teenager.head()Out14: gradyear gender age friends basketball0 2006 M 18.980 2 01 2006 F 18.801 0 02 NaN NaN NaN NaN NaN3 2006 F 18.875 0 04 2006 NaN 18.995 NaN 0441处理缺失数据使用fill
152、na方法可以填充缺失数据,并且可以增加不同的选项In15:teenager.fillna(0).head()Out15: gradyear gender age friends basketball0 2006 M 18.980 2 01 2006 F 18.801 0 02 0 0 0.000 0 03 2006 F 18.875 0 04 2006 0 18.995 0 0442处理缺失数据使用字典和method方式填充,method=ffill或bfill(前向或后向填充),limit可以调节最大填充数量In17:teenager.fillna(gender:M,friend:0).he
153、ad()Out17: gradyear gender age friends basketball0 2006 M 18.980 2 01 2006 F 18.801 0 02 NaN M NaN NaN NaN3 2006 F 18.875 0 04 2006 M 18.995 NaN 0In18:teenager.fillna(method=ffill).head()Out18: gradyear gender age friends basketball0 2006 M 18.980 2 01 2006 F 18.801 0 02 2006 F 18.801 0 03 2006 F 18
154、.875 0 04 2006 F 18.995 0 0443目录第一部分文件读写第二部分变量离散化第三部分缺失值填补第四部分数据标准化第五部分数据合并第六部分数据组合第七部分数字编码第八部分OneHot编码444数据标准化Pandas中并没有提供直接进行数据标准化的方式,可以使用scikit-learn中preprocessing的方法进行数据的标准化操作。标准化有两种处理方式:Z-score标准化和min-max标准化。在一些机器学习算法中(如,支持向量机的RBF核,线性模型中的L1和L2正则化),算法要求输入的数据特征均值为0,并且方差在相同数量级。这一操作可以调用preprocessin
155、g的scale方法和StandardScaler类实现。在线性模型的计算过程中,要求输入数据特征在同一个数量级上,为了实现这一操作,可以调用preprocessing的MinMaxScaler方法。445数据标准化df = pd.read_csv(iris.csv)x = preprocessing.scale(df)x:5Out93: array(-0.90068117, 1.03205722, -1.3412724 , -1.31297673, -1.22474487, -1.14301691, -0.1249576 , -1.3412724 , -1.31297673, -1.22474
156、487, -1.38535265, 0.33784833, -1.39813811, -1.31297673, -1.22474487, -1.50652052, 0.10644536, -1.2844067 , -1.31297673, -1.22474487, -1.02184904, 1.26346019, -1.3412724 , -1.31297673, -1.22474487)#标准化数据的均值In94:x.mean(axis=0)Out94: array( -2.77555756e-16, -5.14033260e-16, 1.15463195e-16, 9.25185854e-
157、16, 1.18423789e-17)#标准化数据的方差In95:x.std(axis=0)Out95: array( 1., 1., 1., 1., 1.)446数据标准化preprocessing模块提供了StandardScaler工具类,包含名为Transformer的API,可以在训练集上计算均值和标准差,并且能够在之后将同样的转换应用于测试集。scaler = preprocessing.StandardScaler().fit(df)#应用于新数据 scaler.transform(-1., 1., 0.,4.,3.) Out97: array(-8.29192127, -4.7
158、530169 , -2.13739226, 3.68299613, 2.44948974)447数据标准化preprocessing中提供了MinMaxScalar方法对数据进行0,1标准化min_max_scaler = preprocessing.MinMaxScaler()scaler = min_max_scaler.fit_transform(df)scalerOut98: array( 0.22222222, 0.625 , 0.06779661, 0.04166667, 0. , 0.16666667, 0.41666667, 0.06779661, 0.04166667, 0.
159、 , 0.11111111, 0.5 , 0.05084746, 0.04166667, 0. , 0.08333333, 0.45833333, 0.08474576, 0.04166667, 0. , 0.19444444, 0.66666667, 0.06779661, 0.04166667, 0. , 0.30555556, 0.79166667, 0.11864407, 0.125 , 0. X_test = np.array( -3., -1., 4., 0., 7.)min_max_scaler.transform(X_test)Out99: array(-2.02777778,
160、 -1.25 , 0.50847458, -0.04166667, 3.5 )448目录第一部分文件读写第二部分变量离散化第三部分缺失值填补第四部分数据标准化第五部分数据合并第六部分数据组合第七部分数字编码第八部分OneHot编码449数据库风格的DataFrame合并数据集的合并或连接运算通过一个或多个键将行连接起来,pandas中主要使用merge函数In 55: df1=DataFrame(lkey:b,b,a,c, .: data1:range(4)In 56: df2=DataFrame(rkey:a,b,b,d, .: data2:range(4)450数据库风格的DataFram
161、e合并默认情况下merge会将重叠列的列名当做键,可以显示地用left_on和right_on指定;连接的时候产生的是行的笛卡尔积,如下面合并结果所示有4个“b”行。In 59: pd.merge(df1,df2,left_on=lkey,right_on=rkey)Out59: data1 lkey data2 rkey0 0 b 1 b1 0 b 2 b2 1 b 1 b3 1 b 2 b4 2 a 0 a451数据库风格的DataFrame合并默认情况下,merge做的是“inner”连接,结果中的键是交集,其他方式还有“left”、“right”以及“outer”In 60: pd.m
162、erge(df1,df2,left_on=lkey,right_on=rkey,how=outer)Out60: data1 lkey data2 rkey0 0 b 1 b1 0 b 2 b2 1 b 1 b3 1 b 2 b4 2 a 0 a5 3 c NaN NaN6 NaN NaN 3 d452索引上的合并有时候,DataFrame中的连接键位于其索引上,此时可以传入left_index=True或right_index=True(或两个都传)以说明索引应该被用作连接键In 63: left1=DataFrame(key:a,b,a,a,b,c,value:range(6)In 64:
163、 right1=DataFrame(group_val:3.5,7,index=a,b)In 65: pd.merge(left1,right1,left_on=key,right_index=True,how=outer)Out65: key value group_val0 a 0 3.52 a 2 3.53 a 3 3.51 b 1 7.04 b 4 7.05 c 5 NaN453轴向连接使用concat函数可以将不同的Series或DataFrame进行轴向连接;传入axis=1可以在列上进行轴向连接In 2: s1=Series(0,1,index=a,b)In 3: s2=Seri
164、es(3,4,index=c,d)In 4: pd.concat(s1,s2)Out4: a 0b 1c 3d 4dtype: int64In 5: pd.concat(s1,s2,axis=1)Out5: 0 1a 0 NaNb 1 NaNc NaN 3d NaN 4454轴向连接在列上进行轴向连接得到的是基于索引外连接的结果,使用join=inner可得到基于索引的内连接结果。In 6: s3=pd.concat(s1*5,s2)In 7: pd.concat(s1,s3,axis=1)Out7: 0 1a 0 0b 1 5c NaN 3d NaN 4In 8: pd.concat(s1,
165、s3,axis=1,join=inner)Out8: 0 1a 0 0b 1 5455轴向连接对DataFrame进行轴向连接也是同样的效果,有时候行索引是没有意义的,可以传入ignore_index=TrueIn 11: df1=DataFrame(np.arange(4).reshape(2,2),columns=a,b)In 12: df2=DataFrame(np.arange(4).reshape(2,2),columns=a,c)In 13: pd.concat(df1,df2,ignore_index=True)Out13: a b c0 0 1 NaN1 2 3 NaN2 0
166、NaN 13 2 NaN 3456目录第一部分文件读写第二部分变量离散化第三部分缺失值填补第四部分数据标准化第五部分数据合并第六部分数据组合第七部分数字编码第八部分OneHot编码457数据组合对数据集进行分组并对各组应用一个函数,这是数据分析过程中的一个重要环节。在数据集准备好之后,通常的任务就是计算分组统计或生成透视表。Pandas提供了一个灵活高效的groupby功能,它使你能以一种自然的方式对数据集进行切片、切块、摘要等操作。458数据组合对数据分组并对各组应用一个函数,是数据分析工作的一个主要环节。Pandas中对象可以在行(axis=0)或列(axis=1)上进行分组,然后将一个函
167、数应用(apply)到个分组并产生一个新值。最后所有这些函数的执行结果会被合并(combine)到最终结果对象中。459数据组合下面的例子按照sex进行分组,并计算tip列的平均值。df = pd.read_csv(tips.csv)#按照sex进行分组,并计算tip列的平均值grouped = dftip.groupby(dfsex)groupedgrouped.mean()Out100: sexFemale 2.833448Male 3.089618Name: tip, dtype: float64460数据组合一次传入多个数组,通过两个键对进行分组,得到的Series具有一个层次化索引m
168、eans = dftip.groupby(dfsex,dftime).mean()meansOut101: sex time Female Dinner 3.002115 Lunch 2.582857Male Dinner 3.144839 Lunch 2.882121Name: tip, dtype: float64means.unstack()Out102: time Dinner Lunchsex Female 3.002115 2.582857Male 3.144839 2.882121461数据组合利用agg()使用自定义聚合函数,一次传入多个聚合函数。def peak_to_pea
169、k(arr): return arr.max() - arr.min()grouped.agg(peak_to_peak)Out107: sexFemale 5.5Male 9.0Name: tip, dtype: float64grouped.agg(mean,std, peak_to_peak)Out108: mean std peak_to_peaksex Female 2.833448 1.159495 5.5Male 3.089618 1.489102 9.0462数据处理小结463目录第一部分文件读写第二部分变量离散化第三部分缺失值填补第四部分数据标准化第五部分数据合并第六部分数据
170、组合第七部分数字编码第八部分OneHot编码464数字编码使用map函数和replace函数可以将Series或DataFrame中的值进行替换,In109:df = pd.read_csv(tips.csv)dftime.value_counts()Out109: Dinner 176Lunch 68Name: time, dtype: int64In110:dftime.replace(Dinner,Lunch,0,1).value_counts()Out110: 0 1761 68Name: time, dtype: int64465数字编码In110:dftime.replace(Di
171、nner,Lunch,0,1).value_counts()Out110: 0 1761 68Name: time, dtype: int64In111:map_id = Dinner:0,Lunch:1dftime.map(map_id).value_counts()Out111: 0 1761 68Name: time, dtype: int64466数据清理小结467目录第一部分文件读写第二部分变量离散化第三部分缺失值填补第四部分数据标准化第五部分数据合并第六部分数据组合第七部分数字编码第八部分OneHot编码468OneHot编码在机器学习中,一种常用的分类变量转换方式为将分类变量转换
172、为“哑变量矩阵”或“指标矩阵”。如果DataFrame的某一列含有k个不同的值,则可以派生出一个k列矩阵(其值全为1或0)。pandas有一个get_dummies函数可以实现该功能。dummies = pd.get_dummies(dfsex)dummies.head()Out116: Female Male0 1 01 0 12 0 13 0 14 1 0469OneHot编码有时候,你可能想给指标DataFrame的列加上一个前缀,以便能够跟其他数据进行合并。get_dummies的prefix参数可以实现这个功能:dummies = pd.get_dummies(dfsex,prefi
173、x=key)df_with_dummy = dfsex.join(dummies)df_with_dummy.head()Out117: sex key_Female key_Male0 Female 1 01 Male 0 12 Male 0 13 Male 0 14 Female 1 0470OneHot编码一个有用的秘诀是:结合get_dummies和诸如cut之类的离散化函数。bins = 1,3,6,10pd.get_dummies(pd.cut(dftip,bins).head()Out118: (1, 3 (3, 6 (6, 100 1 0 01 1 0 02 0 1 03 0 1 04 0 1 0