Python数据挖掘算法与应用 课件全套 刘金岭 第1-10章 数据挖掘概述- 深度学习简介_第1页
Python数据挖掘算法与应用 课件全套 刘金岭 第1-10章 数据挖掘概述- 深度学习简介_第2页
Python数据挖掘算法与应用 课件全套 刘金岭 第1-10章 数据挖掘概述- 深度学习简介_第3页
Python数据挖掘算法与应用 课件全套 刘金岭 第1-10章 数据挖掘概述- 深度学习简介_第4页
Python数据挖掘算法与应用 课件全套 刘金岭 第1-10章 数据挖掘概述- 深度学习简介_第5页
已阅读5页,还剩790页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章

数据挖掘概述什么是数据挖掘1.2学习目标1.11.31.41.51.6数据挖掘的基本步骤及方法数据挖掘与统计学的关系数据挖掘与机器学习的关系数据挖掘十大经典算法数据挖掘的典型应用1什么是数据挖掘WHATISDATAMINING1.1数据、信息、知识和智慧01数据数据是对客观事物记录下来的、可以鉴别的符号。数据经过处理后仍然是数据,处理数据是为了便于更好地解释,只有经过解释,数据才有意义,才能够成为信息。02信息信息是对客观世界各种事物的特征的反映,是关于客观事实的可通讯的知识。03知识知识是反映各种事物的信息进入人们大脑,对神经细胞产生作用后留下的痕迹,知识是由信息形成的智慧智慧是人类做出正确判断的能力和对知识的正确使用,智慧可以回答为什么的问题,判断是非、对错、好坏,关注未来,试图理解过去没有理解的东西04数据挖掘的定义数据源必须是真实的、大量的、有噪声的。发现的知识是可接受、可理解、可运用的。发现对用户有价值的知识。并不要求发现放之四海而皆准的知识,仅支持特定的发现问题。数据挖掘的功能数据总结继承于数据分析中的统计分析。数据总结目的是对数据进行浓缩,给出它的紧凑描述。功能分类目的是构造一个分类函数或分类模型,该模型能把数据库中的数据项映射到给定类别中的某一个。聚类是把整个数据集分成不同的群组,目的是使群组与群组之间差别很明显,而同一个群组之间的数据尽量相似。关联分析寻找数据的相关性。两种常用的技术是关联规则和序列模式。预测把握分析对象发展的规律,对未来的趋势做出预见。偏差检测对分析对象中少数的、极端特例的描述,揭示内在的原因。数据挖掘的发展简史数据挖掘起始于20世纪下半叶。这期间计算机领域的人工智能也取得了巨大进展,进入了机器学习阶段。20世纪下半叶1989年8月召开的第11届国际人工智能联合会议的专题讨论会上首次出现了知识发现(KDD)这个术语。1989年8月1995年在美国计算机年会上,开始把数据挖掘视为数据库知识发现的一个基本步骤。1995年到目前为止,KDD的重点已经从发现方法转向了实践应用。而数据挖掘则是知识发现(KDD)的核心部分。到目前为止数据挖掘已经成为一门比较成熟的交叉学科,并且数据挖掘技术也伴随着信息技术的发展日益成熟起来。进入21世纪2数据挖掘的基本步骤及方法TheBasicStepsandMethodsofDataMining1.2数据挖掘的基本步骤01问题定义02建立数据挖掘库在开始数据挖掘之前,最先的也是最重要的要求就是熟悉领域知识,弄清用户的需求。要想充分发挥数据挖掘的价值,必须对目标有一个清晰明确的定义,即决定到底想干什么。要进行数据挖掘必须收集要挖掘的数据资源。一般建议把要挖掘的数据都收集到一个数据库中,而不是采用原有的数据库或数据仓库。03分析数据04调整数据分析数据的目的是找到对预测输出影响最大的数据字段,和决定是否需要定义导出字段。针对问题的需求对数据进行增删,按照对整个数据挖掘过程的新认识组合或生成一个新的变量,以体现对状态的有效描述。05建立模型06测试模型建立模型是一个反复的过程。需要仔细考察不同的模型以判断哪个模型对具体问题最有用。先用一部分数据建立模型,然后再用剩下的数据来测试和验证这个模型。模型建立好之后,必须评价得到的结果、解释模型的价值。从测试集中得到的准确率只对用于建立模型的数据有意义。07实施模型建立并经验证之后,可以有两种主要的使用方法。第一种是提供给分析人员做参考;另一种是把此模型应用到不同的数据集上。数据挖掘的任务任务关联分析关联分析的目的是找出数据库中隐藏的关联(简单关联、时序关联、因果关联)网,用于发现隐藏在大型数据集中的令人感兴趣的联系。聚类分析聚类是把数据按照相似性归纳成若干类别,同一类中的数据彼此相似,不同类中的数据相异。分类分类就是找出一个类别的概念描述,它代表了这类数据的整体信息,即该类的内涵描述,并用这种描述来构造模型,一般用规则或决策树模式表示。回归分析预测它是在分析自变量和因变量之间相关关系的基础上,建立变量之间的回归方程,并将回归方程作为预测模型,根据自变量在预测期的数量变化来预测因变量关系并表现为相关关系。时序模式它是指通过时间序列搜索出的重复发生概率较高的模式。与回归一样,它也是用己知的数据预测未来的值,但这些数据的区别是变量所处时间的不同。偏差分析在偏差中包括很多有用的知识,数据库中的数据存在很多异常情况,发现数据库中数据存在的异常情况是非常重要的。偏差检验的基本方法就是寻找观察结果与参照之间的差别。数据挖掘分析方法估值估值与分类类似,但估值最终的输出结果是连续型的数值,估值的量并非预先确定。估值可以作为分类的准备工作。它首先从数据中选出已经分好类的训练集,在该训练集上运用数据挖掘技术,建立一个分类模型,再将该模型用于对没有分类的数据进行分类。分类预测其目的是发现哪些事情总是一起发生。相关性分组或关联规则它是通过分类或估值来进行,通过分类或估值的训练得出一个模型,如果对于检验样本组而言该模型具有较高的准确率,可将该模型用于对新样本的未知变量进行预测。聚类它是自动寻找并建立分组规则的方法,它通过判断样本之间的相似性,把相似样本划分在一个簇中。3数据挖掘与统计学的关系RelationshipbetweenDataMiningandStatistics1.3数据挖掘与统计学的联系数据挖掘来源于统计分析,而又不同于统计分析。数据挖掘不是为了替代传统的统计分析技术,相反,数据挖掘是统计分析方法的扩展和延伸。由于数据挖掘和统计分析根深蒂固的联系,常用的据挖掘工具都能够通过可选件或自身提供统计分析功能。这些功能对于数据挖掘的前期数据探索和数据挖掘之后对数据进行总结和分析都是十分必要的。统计分析所提供的诸如方差分析、假设检验、相关性分析、线性预测、时间序列分析等功能都有助于数据挖掘前期对数据进行探索,发现数据挖掘的课题、找出数据挖掘的目标、确定数据挖掘所需涉及的变量、对数据源进行抽样等等。所有这些前期工作会对数据挖掘的效果产生重大影响。而数据挖掘的结果也需要统计分析的描述功能(如最大值、最小值、平均值、方差、四分位、个数、概率分配等)进行具体描述,使数据挖掘的结果能够被用户理解。因此,统计分析和数据挖掘是相辅相成的过程,两者的合理配合是数据挖掘成功的重要条件。数据挖掘与统计学的区别数据挖掘常常是根据一个特定属性去处理一个大数据集,这就意味着,传统统计学由于可行性的原因,常常是利用一个样本来分析处理,而所描述的样本取自于那个大数据集。其实数据挖掘问题也常常是需要得到数据总体,例如关于一个公司的所有职工数据,数据库中的所有客户资料,去年的所有业务等。在这种情形下,统计学的推断就没有价值了。很多情况下,数据挖掘的本质是很偶然的发现、非预期但很有价值的信息。这说明数据挖掘过程本质上是实验性的。这和确定性的分析是不同的,即它不能完全确定一个理论的,而是只能提供证据和不确定的证据。确定性分析着眼于最适合的模型,即建立一个推荐模型,这个模型也许不能很好的解释观测到的数据。而大部分统计分析提出的是确定性的分析。4数据挖掘与机器学习的关系RelationshipbetweenDataMiningandMachineLearning1.4数据挖掘与机器学习的联系数据挖掘中用到了大量的机器学习提供的数据分析技术和数据库提供的数据管理技术。学习能力是智能行为的一个非常重要的特征。不具有学习能力的系统很难称之为一个真正的智能系统,而机器学习则希望系统(计算机)能够利用经验来改善自身的性能,因此该领域一直是人工智能的核心研究领域之一。在计算机系统中,“经验”通常是以数据的形式存在的,因此,机器学习不仅涉及对人的认知学习过程的探索,还涉及对数据的分析处理。实际上,机器学习已经成为计算机数据分析技术的创新源头之一。由于几乎所有的学科都要面对数据分析任务,因此机器学习已经开始影响到计算机科学的众多领域,甚至影响到计算机科学之外的很多学科。机器学习是数据挖掘中的一种重要工具。然而数据挖掘不仅仅要研究、拓展、应用一些机器学习方法,还要通过许多非机器学习技术解决数据仓储、大规模数据、数据噪声等实践问题。数据挖掘与机器学习的区别数据挖掘机器学习数据挖掘使用了大量的机器学习算法,也使用了一系列的工程技术。机器学习是以统计学为支撑的一门面向理论的学科,其不需要考虑诸如数据仓库,OLAP等应用工程技术数据挖掘是从目的而言的,常用在数据挖掘上的方法只是“从数据学习”机器学习是从方法而言的,机器学习不仅仅可以用在数据挖掘上,一些机器学习的子领域甚至与数据挖掘关系不大,如增强学习与自动控制等。数据挖掘则是使用了包括机器学习算法在内的众多知识的一门应用学科,它主要是使用一系列处理方法挖掘数据背后的信息。机器学习是一门更加偏向理论性学科,其目的是为了让计算机不断学习找到接近目标函数f的假设h。5数据挖掘十大经典算法TenClassicAlgorithmsforDataMining1.5数据挖掘十大经典算法01C4.5C4.5算法是机器学习算法中的一种分类决策树算法,其核心算法是ID3算法.C4.5算法有如下优点:产生的分类规则易于理解,准确率较高。其缺点是:在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。02K-MeansK-Means算法是一种聚类算法,把n个对象根据它们的属性分为k个簇,k<n。它与处理混合正态分布的最大期望算法很相似,因为它们都试图找到数据中自然聚类的中心。它假设对象属性来自于空间向量,并且目标是使各个簇内部的均方误差总和最小。03支持向量机支持向量机是一种监督式学习的方法,它广泛的应用于统计分类以及回归分析中。支持向量机将向量映射到一个更高维的空间里,在这个空间里建立一个最大间隔超平面。在分开数据的超平面的两边建有两个互相平行的超平面。分隔超平面使两个平行超平面的距离最大化。04AprioriApriori算法是一种最有影响的挖掘布尔关联规则频繁项集的算法。其核心是基于两阶段频繁项集思想的递推算法。该关联规则在分类上属于单维、单层、布尔关联规则。在这里,所有支持度大于最小支持度的项集称为频繁项集。然后由频繁项集产生强关联规则,这些规则必须满足最小支持度和最小可信度。05EM在统计计算中,最大期望EM(ExpectationMaximization)算法是在概率模型中寻找参数最大似然估计的算法,其中概率模型依赖于无法观测的隐藏变量。最大期望算法经常应用于机器学习和计算机视觉的数据集聚领域。数据挖掘十大经典算法06PageRankPageRank算法又称网页排名,它是根据网站外部链接和内部链接的数量和质量来衡量网站的价值。算法原理为:每个到页面的链接都是对该页面的一次投票,被链接的越多,就意味着被其他网站投票越多,这个就是所谓的“链接流行度”,由此来衡量多少人愿意将他们的网站和该网站挂钩。07AdaBoostAdaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。其算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。08KNNKNN算法也称为K最近邻分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的原理是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。09NaiveBayes朴素贝叶斯模型发源于古典数学理论,有着坚实的数学基础及稳定的分类效率。同时,NBC模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。在属性个数比较多或者属性之间相关性较大时,NBC模型的分类效率比不上决策树模型。而在属性相关性较小时,NBC模型的性能最为良好。10CARTCART算法也称为分类与回归树。在分类树下面有两个关键的思想。第一个是关于递归地划分自变量空间的想法(二元切分法);第二个想法是用验证数据进行剪枝(预剪枝、后剪枝)。在回归树的基础上的模型树构建难度可能增加了,但同时其分类效果也有提升。6数据挖掘的典型应用TypicalApplicationsofDataMining1.6数据挖掘的典型应用应用于医学方面,提高诊断准确率众所周知,人体奥秘无穷无尽,遗传密码、人类疾病等方面都蕴含了海量数据信息。而传统研究模式,单纯依靠人工无法探索真正的秘密。而利用数据挖掘技术能够有效解决这些问题,给医疗工作者带来了极大的便利。同时,医疗体制改革背景下,医院内部医疗器具的管理、病人档案资料整理等方面同样涉及数据,引进数据挖掘技术,能够深入分析疾病之间的联系及规律,帮助医生诊断和治疗,以达到事半功倍的效果,为保障人类健康等提供强大的技术支持。应用于金融方面,提高工作有效性银行及金融机构中涉及储蓄、信贷等大量数据信息。利用数据挖掘技术管理和应用这些数据信息,能够帮助金融机构更好地适应互联网金融时代的发展趋势。提高金融数据的完整性、可靠性,为金融决策提供科学依据。金融市场变幻莫测,要想在竞争中提升自身核心竞争力,需要对数据进行多维分析和研究。在应用中,特别是针对侦破洗黑钱等犯罪活动,可以采取孤立点分析等工具进行分析,为相关工作有序开展奠定坚实的基础。数据挖掘的典型应用应用于高校日常管理方面,实现高校信息化建设当前,针对高校中存在的贫困大学生而言,受到自身家庭等因素的影响,他们学业与生活存在很多困难,而高校给予了贫困生很多帮助。为此将数据挖掘技术引入到贫困生管理工作中,能够将校内贫困生群体作为主要研究对象,采集和存储在校生生活、学习等多方面信息,然后构建贫困生认定模型,并将此作为基础进行查询和统计,为贫困生的管理工作提供技术支持,从而提高高校学生管理质量和效率,促进高校和谐、有序发展。应用于电信方面,实现经济效益最大化目标现代社会发展趋势下,电信产业已经不仅限于传统意义上的语音服务提供商,而将语音、文字、视频等有机整合成为一项数据通信综合业务。电信网、因特网等网络已经融合在一起,在该背景下,数据挖掘技术应用能够帮助运营商更好地开展业务,如利用多维分析电信数据;或者采用聚类等方法查找异常状态及盗用模式等,不断提高数据资源利用率,为深入地了解用户行为,促进电信业务的推广及应用,从而实现经济效益最大化目标。本章结束啦!欢迎课后继续交流~第2章

Python数据分析基础FundamentalsofPythondataanalysisPython程序概述2.2学习目标2.12.32.4Python常用的内置数据结构正则表达式文件操作1Python程序概述OverviewofPythonProgramsChapter012.1.1基础数据类型数据类型在数据结构中定义为一组性质相同值的集合以及定义在这个集合上一组操作的总称。Python3中有六种标准的数据类型:Number(数字)、String(字符串)、List(列表)、Tuple(元组)、Set(集合)和Dictionary(字典)。其中,不可变数据类型有Number、String和Tuple;可变数据类型有List、Dictionary和Set。2.1.2变量和赋值

变量是用来存储数据的,它是程序中一个已经命名的存储单元。变量具有名字和数据类型,Python中的变量使用前不需要声明数据类型,但必须赋值,仅当变量赋值后才会被创建。赋值号为“=”,同一变量可以反复赋值,而且可以是不同类型的值。例2.1

变量赋值示例。a,b,c=12,’Python’,34.567print(a,b,c)

2.1.3操作符和表达式Python的算术表达式具有结合性和优先级。结合性是指表达式按照从左到右、先乘除后加减的原则进行计算。Python运算符及优先级如表所示。优先级运算符说明1**指数2~、+、-按位翻转、一元加号、减号(正负号)3*、/、%、//乘,除,取模、取整除4+、-加法、减法5>>、<<右移、左移运算符6&按位与7^、|按位异或、按位或8<=、<、>、>=小于等于、小于、大于、大于等于9==、!=等于、不等于10=、%=、/=、//=、-=、+=、*=、**=赋值、取模赋值、除法赋值、整除赋值、减法赋值、加法赋值、乘法赋值、幂赋值

加法赋值、乘法赋值、幂运算赋值11is、isnot同一对象、不同对象12in、notin属于、不属于13not、or、and非、或、与2.1.3操作符和表达式

表达式是运算符和操作数所构成的序列。Python中运算符的优先级也可以用括号来改变,就和数学公式里面一样,先计算最里面的括号,之后就是外面的括号。此外,Python还支持形如3<4<5的表达式。2.1.4字符串——转义字符

所谓转义字符是指那些字符串里具有特殊含义的字符,它们是以反斜杠(“\”)开头的。Python中常用的转义字符如表所示。转义字符说明\n换行符,将光标位置移到下一行开头\r回车符,将光标位置移到本行开头\t水平制表符,即Tab键,一般相当于4~8个空格\b退格(Backspace),将光标位置移到前一列\在字符串行尾的续行符,即一行未完,转到下一行继续写2.1.4字符串——转义字符(1)转义字符在书写形式上由多个字符组成,但Python

将它们看作是一个整体,表示一个字符。例2.2

转义字符示例。info="Python教程:/python/\n\C++教程:/cplus/\n\Linux教程:/linux_tutorial/"print(info)运行结果如图所示。2.1.4字符串——转义字符(2)Python允许用'r'或'R'表示字符串内部的字符不转义。例2.3

转义字符示例。print('\\\t\\')print(r'\\\t\\')运行结果如图2.2所示。2.1.4字符串——转义字符(3)Python允许用'''...'''的格式表示多行内容的字符串。例2.4

多行内容的字符串示例。print('''line1...line2...line3''')运行结果如图2.3所示。2.1.4字符串——常用操作(1)字符串运算字符串的常用运算如表所示,其中str1=’Hello’,str2=’Python’。运算符说明示例结果+字符串连接str1+str2HelloPython*重复输出字符串str1*2HelloHelloin判断子串是否属于字符串'th'instr2Truenotin判断子串是否不属于字符串'th'notinstr2False2.1.4字符串——常用操作(2)字符串切片

字符串的本质就是字符序列,可以通过在字符串后面添加[],在[]里面指定偏移量,用于提取该位置的单个字符。①

正向搜索:最左侧第一个字符,偏移量是0,第二个偏移量是

1,以此类推。直到len(str)-1为止。其中str为字符串变量。②

反向搜索:最右侧第一个字符,偏移量是-1,倒数第二个偏移量是-2,以此类推,直到-len(str)为止。其中str为字符串变量。

切片(slice)操作可以快速的提取子字符串。标准格式为:

<字符串>[start:end:step]

其中start、end和step都是整数,分别表示起始偏移量、终止偏移量和步长。提取字符串操作遵循着“左闭右开”的原则。

假设str='Pythonprogram',当start、end、step全为正数情况下的典型操作如表2.4所示。2.1.4字符串——常用操作操作格式说明示例结果[:]提取整个字符串str[:]Pythonprogram[start:]从start索引开始到结尾str[4:]onprogram[:end]从头开始直到end-1str[:10]Pythonpro[start:end]从start到end-1str[4:10]onpro[start:end:step]从start提取到end-1,步长是stepstr[4:14:2]orga[:end]从开始到倒数-end个字符str[:-4]Pythonpro[start:end]从倒数第-start个到倒数第-end字符str[-10,-3]onprog[::step]从末尾开始,自右向左反向提取,步长-stepstr[::-2]mropnhy2.1.4字符串——常用方法字符串的常用方法如表2.6所示。假设str='classtissla\n',jn1='-'。方法说明示例结果len()字符串长度len(str)12strip()去掉字符串两端的空格和换行符str.strip()classtisslacount(<子串>)查找子串在字符串中出现的次数str.count('ss')2find(<子串>)找到子串返回下标,多个时返回第一个str.find('ss')3replace(<串1>,<串2>)在字符串中<串1>被<串2>替换str.replace('ss','gg')claggtiggla\nsplit(<子串>)利用子串切割字符串str.split('ss')'cla','ti','la\n'join(<字符串>)将序列中的元素以指定的字符连接生成一个新的字符串。jn1.join(str)c-l-a-s-s-t-i-s-s-l-a-2.1.5流程控制——语句块

在Python中,语句块(Statement-block)是在条件为真(条件语句)时执行或者执行多次(循环语句)的一组语句。在代码前放置空格来缩进语句即可创建语句块,语句块中的每行必须具有同样的缩进量。

Python编程中的流程控制语句分为顺序语句、分支语句和循环语句,其中顺序语句不需要单独的关键字来控制,就是一行行的执行,也不需要特殊的说明。这里主要介绍的是分支语句和循环语句。2.1.5流程控制——分支语句

分支语句是通过条件表达式的判断结果(True/False)来决定执行哪个分支的代码块。Python中提供的分支语句为:if…else语句。有以下几种形式:

(1)单分支if<condition>:<statementblock>

(2)双分支if<condition>:<statement_block_1>else:<statement_block_2>

(3)多分支if<condition_1>:<statement_block_1>elif<condition_2>:<statement_block_2>......elif<condition_n>:<statement_block_n>else:

<default_statement_block>

其中各语句块中的行必须具有相同的缩进量,但不同语句块之间的缩进量可以不同。2.1.5流程控制——分支语句例2.5输入学生的成绩,利用多分支判断出该成绩符合的等级。90分以上为优,80~89为良,70~79为中,60~69为及格,60分以下为不及格。程序语句如下:score=input('请输入成绩:')

#手动输入成绩score=int(score)

#将输入的字符串转换为数值ifscore>=90andscore<=100:print('优')elifscore>=80:print('良')elifscore>=70:print('中')elifscore>=60:print('及格')elifscore>=0andscore<60:print('不及格')else:

#输入>100或<0的分数时报错

print('成绩输入错误!')2.1.5流程控制——循环语句

当需要多次执行一个代码语句或代码块时,可以使用循环语句。Python中提供的循环语句有:while循环和for循环。(1)while循环语句

while循环语句的基本形式如下:while<condition>:

<statement_block>(2)for循环

for循环的基本形式:for<variable>in<string|range|set>:

<statement_block>2.1.5流程控制——循环语句例2.6用辗转相除法求最大公约数。具体方法为:两个正整数a和b,它们的最大公约数等于a除以b的余数r和b之间的最大公约数。程序语句如下:a=int(input('输入正整数a:'))b=int(input('输入正整数b:'))ifa<b:a,b=b,ar=a%bwhiler!=0:a,b=b,rr=a%bprint(’最大公约数:’+str(b))2.1.6用户函数Python用户函数是预先组织好的,可重复使用的,用来实现单一或相关联功能的代码段。函数能提高应用的模块性和代码的重复利用率。函数仅在调用时运行,它将数据(称为参数)传递到函数内进行处理,最后把结果数据返回。在Python中,使用

def关键字定义函数,语句形式为:def<function_name>(arguments):<statement_block>[return[returned_value]]2.1.6用户函数例2.7

定义判定素数的函数,利用该函数输出100~200之间素数的个数。defis_prime(n):mark=Trueforiinrange(2,n//2+1):ifn%i==0:mark=Falsereturnmarknum=0forkinrange(100,201):ifis_prime(k):num=num+1print('100~200之间素数个数为'+str(num))2.1.7lambda函数lambda函数在Python编程语言中使用频率非常高,使用起来非常灵活、巧妙。该函数是匿名函数,即没有名字的函数。lambd

函数的语法只包含一个语句,常用形式为:lambda[arg_1[,arg_2,…,arg_n]]:expression

其中lambda

Python预留的关键字;arg_1、arg_2、…、arg_n是参数列表,它的结构与

Python中函数的参数列表是一样的;expression是单行的、唯一的参数表达式。lambd

函数返回通过计算表达式expression得到的值。

如用户定义函数:defsum(x,y):returnx+y

用lambda来实现为:p=lambdax,y:x+yprint(p(4,6))lambda函数可以接收任意多个参数(包括可选参数),只能返回单个表达式的值。如:a=lambdax,y,z:(x+8)*y-zprint(a(5,6,8))2Python常用的内置数据结构Built-inDataStructuresCommonlyUsedinPythonChapter02内置函数数据结构有几种?通俗说法列表字典集合元组ListTupleDictionarySet2.2.1列表——列表的创建

列表是最常用的Python数据类型,它表示为一个方括号内由逗号分隔的若干元素,常见创建列表的形式有如下4种:中括号创建的形式为:<List_name>=[<element_1>,<element_2>,…,<element_n>]。(2)list创建的形式为:<List_name>=list(<tuple|string>)。(3)range()创建整数列表的形式为:<list_name>=range([<start_value>,]<end_value>[,<step>])。Python3中

range()返回的是一个range对象,而不是列表;我们需要通过

list()方法将其转换成列表对象。(4)使用列表推导式可以非常方便的创建列表,在软件开发中经常使用。常用形式为:①

[<expression>for<variable>in<list>]。如:[iforiinrange(1,11)],创建集合为[1,2,3,4,5,6,7,8,9,10]。②[<expression>for<variable>in<list>if<condition>]。如:[x*2forxinrange(100)ifx%9==0],创建集合为[0,18,36,54,72,90,108,126,144,162,180,198]。

列表的元素不需要具有相同的类型,它是一种有序的集合,可以随时添加、删除和修改其中的元素。2.2.1列表——列表的创建例2.8创建列表示例。list1=['S1','张三','男',20,'计算机系']list2=list('Pythonprogram')list3=range(-3,16,2)list4=[x*3forxinrange(5)]print('list1=',list1)print('list2=',list2)print('list3=',list3)print('list4=',list4)运行结果如图2.4所示。2.2.1列表——列表的基本操作我们可以对列表的元素进行读取、增加、删除、修改和嵌套操作。(1)读取元素按下标读取元素,形式为:<list_name>[<index>]。按项遍历整个列表,形式为:for<variable>in<list_name>:print(<variable>)。按序号遍历整个列表,形式为:for<index>inrange(len(list_name)):print(list_name[index])。例2.9查找列表元素示例。lst=['S1','张三','男',20,'计算机系']print(lst[3])forseinlst:print(se,end='')print('\r')foriinrange(len(lst)):print(lst[i],end=',')

2.2.1列表——列表的基本操作(2)添加元素在尾部追加元素,形式为:<list_name>.append(<element>)。在某个位置插入元素,形式为:<list_name>.insert(<index>,<element>)。例2.10

列表中添加元素示例。lst=['S1','张三','男',20,'计算机系']lst.append('山东青岛')lst.insert(3,'团员')print(lst)2.2.1列表——列表的基本操作(3)删除元素删除列表中元素,形式为:<list_name>.remove(<element>)。按下标删除元素,形式为:<list_name>.pop(<index>)。切片删除元素,形式为:del<list_name>[<start>:<end>]。清空列表,形式为:<list_name>.clear()。例2.11利用remove删除列表中元素示例。lst=['S1','张三','男',20,'计算机系','山东青岛']lst.remove('计算机系')print(lst)例2.12利用pop删除列表中元素示例。lst=['S1','张三','男',20,'计算机系','山东青岛']lst.pop(3)print(lst)例2.13利用del删除列表中元素示例。lst=['S1','张三','男',20,'计算机系','山东青岛']dellst[2:4]print(lst)2.2.1列表——列表的基本操作(4)修改元素

按下标修改元素,形式为:<list_name>[<index>]=<new_element>;也可以先删除列表的元素,然后再增加新元素。(5)嵌套

如果列表的元素还是列表,则称为列表嵌套。最常用的是多维数组可以用列表嵌套表示。如3×3矩阵。

列表嵌套为:matrix=[[12,-5,3],[0,14,-11],[23,-45,8]]matrix=2.2.1列表——列表的基本操作(6)排序列表元素按值升序,形式为:<list_name>.sort()。列表元素按值降序,形式为:<list_name>.sort(reverse=True)。列表元素翻转逆序,形式为:<list_name>.reverse()。例2.14列表排序示例。lst=['s','d','r','w','k','h','e']print(lst)lst.sort()print('升序排序结果:',lst)lst.sort(reverse=True)print('降序排序结果:',lst)此程序运行结果如图所示。(7)长度列表元素个数形式为:len(<list_name>)。2.2.2元组——元组的创建

元组表示为一个小括号内由逗号分隔的若干元素。访问的方式和列表一样,使用元组的下标进行访问。常见创建元组的形式有:圆括号创建的形式为:<tuple_name>=(<element_1>,<element_2>,…,<element_n>)。(2)逗号创建的形式为:<tuple_name>=<element_1>,<element_2>,…,<element_n>。(3)tuple创建形式为:<tuple_name>=tuple(<list_name>)。(4)单元素创建形式为:<tuple_name>=(<element>,)。

元组可以认为是封闭的列表,一旦定义,就不可以改变(不能添加、删除或修改)。2.2.2元组——元组的基本操作元组元素是不可变的,顺序是有序的。(1)读取元素

按下标读取元素,形式为:<tuple_name>[<index>]

读取元素下标,形式为:<tuple_name>.index(<element>)(2)合并

可以直接使用+号进行元组合并,形式为:<tuple_name_1>+<tuple_name_2>例2.15元组基本操作示例。tup_1=('S3','许文秀','女',20,'计算机系')tup_2=('S7','刘德峰','男',22,'电信系')tup=tup_1+tup_2print(tup)2.2.3字典——字典的创建字典是另一种可变容器模型,且可存储任意类型对象。字典的元素由键和值构成,键和值用冒号分割,每个元素之间用逗号分割,整个字典的元素包含在花括号中。花括号创建的形式为:<dict_name>={<key_1>:<value_1>,<key_2>:<value_2>,…,<key_n>:<value_n>}。(2)空字典创建的形式为:<dict_name>={}|dict()。关于键,说明两点:程序需要通过键来访问值,因此字典中的键尽量不要重复。键必须不可变。可以用数字、字符串或元组作为键,但不能用列表。2.2.3字典——字典的基本操作

字典中包含多个<key>:<value>对,而<key>是字典的关键数据,因此程序对字典的操作都是基于key的。读取values,可以通过下标读取值的形式为:<dict_name>[<key>]。(2)添加元素,形式为:<dict_name>[<key>]=<value>。(3)删除元素,形式为:del<dict_name>[<key>]。(4)修改元素,形式为:<dict_name>[<key>]=<new_value>。(5)判断字典中是否包含某键,形式为:<key>in|notin<dict_name>。2.2.3字典——字典的基本操作例2.16

字典基本操作示例。

dit={'学号':'S1','姓名':'许文秀','性别':'女','年龄':20,'系部':'计算机系'}print('读取字典值:')forkeyindit.keys():print(dit[key],end='')dit['籍贯']='广西北海'print('\n添加元素:籍贯:广西北海:')print(dit)deldit['性别']print('删除元素:性别:女:')print(dit)dit['年龄']=22print('修改年龄为22:')print(dit)

程序运行结果如图所示。2.2.3字典——字典常用方法(1)clear()该方法用于清空字典中所有的元素,形式为:<dict_name>.clear()(2)get()该方法根据<key>来获取<value>,形式为:<dict_name>.get(<key>)(3)update()该方法可使用一个字典所包含的元素来更新已有的字典。在执行

update()方法时,如果被更新的字典中已包含对应的元素,那么原值会被覆盖;如果被更新的字典中不包含对应的元素,则该元素被添加进去。形式为:<dict_name>.update(<dict_name_new>)(4)items()、keys()和values()这三个方法(mathod)分别用于获取字典中的所有元素、所有键和所有值,形式为:<dict_name>.<mathod>2.2.3字典——字典常用方法例2.17字典常用方法示例。dit={'学号':'S1','姓名':'许文秀','性别':'女','系部':'计算机系'}dit1={'学号':'S1','姓名':'王萍','数据库原理':82,'数据挖掘':92}dit.update(dit1)print('update方法更新字典:')print(dit)dit2=dit.items()print('获取字典所有元素:')print(dit2)

程序运行结果如图所示。2.2.4集合——集合的创建大括号创建的形式为:<set_name>={<element_1>,<element_2>,…,<element_n>}。(2)函数set()创建形式为:set(<list_name>|<string>)。(3)空集合创建的形式为:{}|set()。因为集合元素具有不重复的特点,所以若传入的参数有重复,则会自动忽略。因此它非常适合用来消除重复元素。

例2.18

利用集合消除重复元素示例。se1=set([23,32,-4,56,-4,23,-4])se2=set('sretopsww')print(se1,'\n',se2)集合(Set)是一个无序且不重复的元素集合,是一种类似列表和字典的数据结构。2.2.4集合——集合的基本操作因为集合是无序的,所以不可以用索引访问集合元素,也不能做切片操作,更没有键可用来获取集合中元素的值。(1)读取集合成员读取集合大小,形式为:len(<set_name>)。读取集合成员,形式为:for<variable>in<set_name>:print(<variabl>)。(2)添加元素,形式为:<set_name>.add(<element>)。(3)删除元素,形式为:<set_name>.discard|remove(<element>)。(4)抛出元素,形式为:<set_name>.pop()。例2.19集合的基本操作示例se={23,32,-4,56,4,’a’,’m’}forxinse: print(x,end=’’)se.add('##')se.discard(32)print('\r')forxinse: print(x,end='')print('\n',se.pop())2.2.4集合——集合运算集合之间可以进行数学集合运算(例如:并、交、差等),可以利用相应的操作符或方法来实现。假设se1={'b','a','d','e','c'},se2={'p','r','b','o','t','e','c'},集合运算及示例如表所示。运算符含义方法说明示例结果|并union()se1∪se2se1|se2{'e','c','o','t','b','d','r','p','a'}&交Intersection()se1∩se2se1&se2{'e','c','b'}-差Difference()se1-se2se1-se2{'d','a'}^异或sysmmetricdifferencese1∪se2-se1∩se2se1^se2{'d','o','r','p','t','a'}3正则表达式RegularExpressionChapter032.3正则表达式

正则表达式是一个特殊的字符序列,可以方便的检查一个字符串是否与某种模式匹配,利用它可以方便地进行字符串的检索、替换、匹配等操作。Python语言中re(RegularExpression)模块拥有全部的正则表达式功能。2.3正则表达式——概述Python支持的正则表达式中常用字符及含义如表所示。模式说明示例\d匹配一个数字“\d{3}\s+\d{2,8}”的含义如下:\d{3}:表示匹配3个数字,例如'028';\s+:表示匹配至少一个空格;\d{2,8}:表示匹配2~8个数字,例如'1245’。该表达式可以匹配以任意个空格隔开区号的电话号码。例如'01057216520'\D匹配非数字\w匹配一个字符:[A-Za-z0-9_]\W匹配非字母字符,即匹配特殊字符.匹配除换行符外的任意一个字符\s匹配任意一个空白字符,等价于[\t\n\r\f]*匹配任意个字符,包括0个+匹配至少一个字符?匹配0个或一个字符{n,m}匹配n~m个字符{n}允许前一个字符只能出现n次a{3}b:可以匹配'aaab'a|b匹配a或者b(P|p)ython:可以匹配'Python'或者'python'^匹配行首^\d:表示行必须以数字开头$匹配行尾$\d:表示行必须以数字结尾2.3正则表达式——概述表达式说明[0-9a-zA-Z\_]匹配一个数字、大小写字母或者下划线[0-9a-zA-Z\_]+匹配至少由一个数字、大小写字母或者下划线组成的字符串[a-zA-Z\_][0-9a-zA-Z\_]*匹配由字母或下划线开头,后边任意个有数字、字母或者下划线组成的字符串[a-zA-Z\_][0-9a-zA-Z\_]{0,19}精确地限制了变量的长度是1-20个字符

用[]来表示范围,表给出了常用正则表达式及含义。2.3正则表达式——match()方法Match()方法从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。匹配到的数据通常使用方法group(num)(返回num小组字符串)或groups()(返回所有小组字符串)等方法来提取(字符串格式),match()方法常用形式如下:re.match(<pattern>,<string>[,flags=0])参数说明:(1)pattern:匹配的正则表达式。(2)string:要匹配的字符串。(3)

flgs:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。多个标志可以通过按位

OR(|)来指定。如re.I|re.M被设置成

I

和M

标志。可选标志修饰符如表所示。要使用Python3中的re则必须引入re模块,该模块提供了一些正则表达式的处理方法,这些方法使用一个模式字符串做为它们的第一个参数。2.3正则表达式——match()方法修饰符说明re.I使匹配忽略大小写re.L做本地化识别(locale-aware)匹配re.M多行匹配,影响“^”和“$”re.S表示“.”的作用扩展到整个字符串,包括“\n”re.U根据Unicode字符集解析字符。这个标志影响“\w”,“\W”re.X该标志通过更灵活的格式以便将正则表达式写得更易于理解表

可选标志修饰符2.3正则表达式——match()方法例2.20match()方法应用示例。importrestr1='hello123456789word_thisisjustatest'parttern='^Hello\s\d{9}.*test$''''“^”标识开头,这里匹配以Hello开头的字符串;“\s”匹配空白字符串;“\d{9}”匹配9位数字;“.”匹配除了换行符之外的任意字符;“*”匹配零次或多次,二者结合起来能够匹配任意字符(除换行符);“$”标识结尾,这里匹配以test结尾的字符串'''result=re.match(parttern,str1,re.I)print(result)print(result.group())#group()方法输出匹配到的内容print(result.span())#span()方法输出匹配的范围2.3正则表达式——search()方法Search()方法扫描整个字符串并返回第一个成功的匹配,search()方法常用形式如下:re.search(<pattern>,<string>[,flags=0])参数同match()方法。例2.21search()方法应用示例。importreline='Infact,catsaresmarterthandogs'result=re.search(r'(.*)are(.*?).*',line,re.M|re.I)ifresult:print('result.group():',result.group())print('result.group(1):',result.group(1))print('result.group(2):',result.group(2))2.3正则表达式——search()方法例2.22match()和search()比较示例。importreline=’Inface,catsaresmarterthandogs’matchstr=re.match(r'dogs',line,re.M|re.I)ifmatchstr:print("match-->matchstr.group():",matchstr.group())else:print("Nomatch!!")matchstr=re.search(r'dogs',line,re.M|re.I)ifmatchstr:print("search-->matchstr.group():",matchstr.group())else:print("Nomatch!!")程序运行结果如图2.8所示。match()方法只检测字符串开头位置是否匹配,匹配成功才会返回结果,否则返回None;而search()方法会在整个字符串内查找模式匹配,直到找到第一个匹配后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。

2.3正则表达式——sub()方法Sub()方法通过正则表达式,实现比字符串函数replace()更加强大的替换功能。sub()方法常用形式如下:sub(pattern,repl,string,count=0,flag=0)参数说明:(1)pattern:正则表达式的字符串。(2)repl被替换的内容。(3)string正则表达式匹配的内容。(4)count:由于正则表达式匹配的结果是多个,使用count来限定替换的个数(从左向右),默认值是0。(5)flags是匹配模式,可以使用按位或者“|”表示同时生效,也可以在正则表达式字符串中指定。2.3正则表达式——sub()方法例2.23

sub()方法应用示例。importrephone='0517-3214-7231#这是一个公司的电话号码'num=re.sub(r'#.*$','',phone)#删除注释print('电话号码:',num)num=re.sub(r'\D','',phone)#移除非数字的内容print('电话号码:',num)2.3正则表达式——findall()方法Findall()方法在字符串中找到正则表达式所匹配的所有子串,并返回一个列表;如果没有找到匹配的,则返回空列表。findall()方法常用形式如下:findall(pattern,string,flags=0)参数说明:(1)pattern:正则表达式。(2)string:需要处理的字符串。(3)flags:说明匹配模式。例2.24提取完整的年月日和时间字段。importrestr1='se2342022-10-0907:30:002022-10-1007:25:00最新疫情'p=r'\d{4}-\d{2}-\d{2}\d{2}:\d{2}:\d{2}'content=re.findall(p,str1,re.M)print(content)2.3正则表达式——提取网页中的信息例2.25提取字符串中的汉字。importrestr1='<h1>hello你好,world世界</h1>'chinese_pattern='[\u4e00-\u9fa5]+'#汉字编码范围chinese_str=re.findall(chinese_pattern,str1)forchinchinese_str:print(ch,end='')2.3正则表达式——提取网页中的信息例2.26提取字符串中的URL。importredefFind(string):url_pattern=r'[]a-zA-Z.)+://[^\s]*'url=re.findall(url_pattern,string)returnurlstr_url='我们常用网站很多,下面列出两个,如Runoob的网页地址为:,Goog的网址为:'str1=Find(str_url)forchinstr1:ifch!='':print(ch,end='')2.3正则表达式——提取网页中的信息例2.27抓取网页,提取网页中的网址和汉字信息。fromurllib.requestimporturlopen

#

urllib.request.urlopen()函数用于实现对目标url的访问importretext=urlopen('').read().decode()#正则表达式提取网页中的网址s='/message.asp?id=35'ret=re.sub(r'(https://.+?)/.*',lambdax:x.group(1),s)print('在网页数据中提取的网址:\n',ret)str1=re.findall(u'[\u4e00-\u9fa5]+',text)print('在网页数据中提取汉字信息:\n',str1)4文件操作FileOperationChapter042.4文件操作——文件的打开与关闭

文件处理的流程为:先打开文件,得到文件句柄并赋值给一个变量;再通过句柄对文件进行操作;最后关闭文件。

用Python内置的open()函数打开一个文件,创建一个file对象,并用相关的方法才可以调用它进行读写。open()函数常用形式为:file<file_variable>=open(<file_name>[,<mode>][,<buffering>])参数说明:(1)

file_name:是指打开的文件名,若非当前路径,需指出具体路径。(2)mode:是指打开文件的模式,如下表所示。2.4文件操作——文件的打开与关闭模式功能说明r只读模式默认模式,文件必须存在,否则抛出异常w只写模式不可读;不存在则创建;存在则清空内容x只写模式不可读;不存在则创建,存在则报错a追加模式可读;不存在则创建;存在则只追加内容,文件指针自动移到文件尾说明:“+”表示可以同时读写某个文件。如r+、w+、x+、a+均表示对打开的文件进行可读,可写。“b”表示以字节的方式操作,以二进制模式打开文件,而不是以文本模式。如:rb

r+b、wb

w+b、xb

w+b、ab

a+b。但是以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码。

文件使用完毕后必须关闭,语法形式为:<file_variable>.close()2.4文件操作——读文件操作Python文件对象提供了三个“读”方法:read()、readline()和readlines()。每种方法可以接受一个变量以限制每次读取的数据量。(1)read()函数每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。如果文件大于可用内存,为了保险起见,可以反复调用read(size)方法,每次最多读取size个字节(小于可用内存)的内容。(2)readline()函数每次只读取一行,通常比readlines()

慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用readline()。(3)readlines()函数一次读取整个文件,像read()

一样。readlines()

自动将文件内容分成一个行的列表,该列表可以由Python的for

...in

...结构进行处理。

注意:这三种方法是把每行末尾的'\n'也读进来了,它并不会默认的把'\n'去掉。需要去掉时,我们可以手动去掉。2.4文件操作——读文件操作例2.28读取文件示例。文件名为D:\\Data_Mining\Poetry.txt,内容为如下:春夜喜雨杜甫好雨知时节,当春乃发生,随风潜入夜,润物细无声。野径云俱黑,江船火独明,晓看红湿处,花重锦官城。将文件内容读出并显示出来。file='D:\\Data_Mining\poetry.txt'f=open(file,'r',encoding='utf-8')#存储txt文件时,“编码”必须选“UTF-8”foriinrange(2):

first_line=f.readline()#读第1行

print(first_line)#输出第1行data=f.read()#读取剩下的所有内容,文件大时不要用print(data)#输出读取内容f.close()#关闭文件2.4文件操作——写文件操作

在进行文件写操作时,如果该文件不存在,则会创建文件。如果文件存在,则将原文件中的内容删除,再写入新内容。需要说明的是,在写文件时,只有调用close()方法时,操作系统才能保证把没有写入的数据全部写入磁盘。write()函数是文件写操作中一个比较简单的操作,它将字符串写入文件,没有返回值。(2)writelines()函数,这个函数是向文件中写入一个序列字符串列表。2.4文件操作——写文件操作例2.29文件写操作示例。在文件D:\\DATA_Mining\Poetry.txt中最后一行添加内容“《春夜喜雨》是唐诗名篇之一,是杜甫上元二年(761年)在成都草堂居住时所作。”

file='D:\\DATA_Mining\poetry.txt'f=open(file,'a+',encoding='utf-8')#打开文件str1='《春夜喜雨》是唐诗名篇之一,是杜甫上元二年(761年)在成都草堂居住时所作。'f.write('\n')f.write(str1)f.close()f=open(file,'r',encoding='utf-8')data=f.read()print(data)f.close()

程序运行结果如图所示。2.4文件操作——文件的其他操作

如果对文件指定的位置进行读写操作,就需要先将文件读写指针移动到我们想要的位置,然后再对文件进行写入等操作。seek()方法用于移动文件读取指针到指定位置。常用形式为:<file_variable>.seek(offset[,whence])参数说明:(1)offset:开始的偏移量,代表需要移动偏移的字节数。(2)whence:可选,默认值为0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。

返回值:如果操作成功,则返回指定的文件位置,如果操作失败,则返回-1。2.4文件操作——文件的其他操作例2.30seek()方法应用示例。file='D:\\Data_Mining\poetry.txt'f=open(file,'r+',encoding='utf-8')print('文件名为:',)line=f.readline()print('读取的数据为:',line)f.seek(0,1)#重新设置文件读取指针到开头line=f.readline()print('读取的数据为:',line)f.close()程序运行结果如图所示。本章结束啦!欢迎课后继续交流~第3章Python数据挖掘中的常用模块CommonModulesinPythonDataMiningNumPy模块3.2学习目标3.13.33.43.5Pandas模块Matplotlib图表绘制基础Scikit-learn股票数据简单分析Python数据挖掘中的常用模块Python具有强大的扩展能力,其中的数据分析与挖掘常用模块几乎可以满足各种需求。科学计算模块NumPy提供了矩阵运算;基于NumPy的数据分析处理模块Pandas提供了一些数据挖掘的工具;数据可视化模块Matplotlib

具有Python中类似MATLAB的绘图工具;针对Python编程语言免费软件的机器学习模块Scikit-learn具有常用的分类、回归和聚类等算法。

1NumPy模块NumPyModule3.13.1.1NumPy数据类型

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论