数据采集与预处理 习题及答案 安俊秀 第4-8章_第1页
数据采集与预处理 习题及答案 安俊秀 第4-8章_第2页
数据采集与预处理 习题及答案 安俊秀 第4-8章_第3页
数据采集与预处理 习题及答案 安俊秀 第4-8章_第4页
数据采集与预处理 习题及答案 安俊秀 第4-8章_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

第4章1.数据清洗主要包括那几个方面。答:数据清洗主要是包括三个方面,分别是缺失数据处理,异常数据处理和数据转化处理。2.造成缺失值的因素有哪些。答:造成缺失值的主要原因主要有一下六个方面,分别是信息无法获取,信息遗漏,属性不可使用,不重要而被舍弃,数据获取成本过大,以及对于该数据要求实时性高。3.处理缺失值的方法有什么。具体原理是什么。答:缺失值处理的方法主要有三个,分别是删除元组、数据补齐、不处理。删除元组是直接将相关的缺失数据直接删除,适用与删除后对结果影响较小的情况下;数据补齐则是利用多种数据补齐的方法,例如平均值填充,热卡填充等将数据缺失部分补上;不处理则是尽可能保持数据原生模样,防止人为理解的偏差造成的数据分析结果错误。4.删除重复值的时候使用了什么函数。具体如何使用的。答:删除重复值时使用了drop_duplicates()函数,需要去重的函数自生调用该方法,可以通过调整subset和keep参数设置按照那一列去重和保留那个数据。5.检验异常值的方法有哪些。答:检测方法有很多,但是主要思路都是先确立检测标准,将标准转化为具体条件然后进行过滤。本书中介绍的方法为简单描述统计分析,3∂partial原则方法以及Z-score方法。6.数据转换有哪些方法。答:数据转化主要有六种方法,分别为数据类型转化,函数或映射转化,重命名轴索引,连续数据离散化,哑变量处理,数据标准化。7.什么是映射。映射在Python中是如何表现的。答:映射来源于数学中的概念,是指两个元素的集之间元素相互“对应”的关系。在python中主要是通过字典的形式来表现的,分为key值和value值,一一对应的关系。8.map函数是用来干什么的?如何使用。答:map函数在python中是用来处理映射的,map()函数会根据提供的函数对指定序列做映射。使用方法为map(function,iterable,...)。9.什么是哑变量,为什么要使用哑变量。答:哑变量是指将数据转换为一种编码形式进行分析的方法。数据收集过程中很多数据并不是直接为数字表示,这种情况下为了适应算法和库便将数据进行编码转换,通过这种方式方便数据的处理。10.自己编写代码尝试规范化下列数字:200,300,400,600,1000。答:这里采用最大最小规范化,令min=0,max=1,结果分别为:[0,0.125,0.25,0.5,1]第5章1.数据联合的方法中,pandas.merge、pandas.concat与numpy.concatenate三个函数的作用和区别是什么?轴向连接(concatenation):pandas.concat()

可以沿一个轴将多个DataFrame对象连接在一起,形成一个新的Dataframe对象融合(merging):pandas.merge()方法可以根据一个或多个键将不同DataFrame中的行连接起来。数组轴向链接(arrayconcatenation):numpy.concatenate()和pandas.concat()很相似,不同的只在于前者专门针对数组操作,后者专门针对DataFrame对象进行操作。2.多层索引结构的数据中如何选取元素?stack和unstack两个函数的作用和联系?对于多层索引结构,可以使用[]的形式以及loc()和iloc()函数来选取元素。使用[]来选取元素时,不可直接使用最外层以外的其他层级。以下图为例,以下四种元素选取方式都是等价的。#根据多层索引联合取值:#以下4句代码等效:df['math','term2']df.loc[:,('math','term1')]df['math']['term2']df[('math','term1')]stack()为“堆叠”的意思,其作用是将列旋转到行,而unstack()为stack()的反操作,其作用是将行旋转到列。3.为何要使用pivot函数?如何使用unstack函数来达到pivot函数的效果?unstack()方法和pivot()方法是很像的,主要的不同在于,unstack()方法是针对索引或者标签的,即将列索引转成最内层的行索引;而pivot()方法则是针对列的值,即指定某列的值作为行索引,指定某列的值作为列索引,然后再指定哪些列作为索引对应的值。因此,总结起来一句话就是:unstack()针对索引进行操作,pivot()针对值进行操作。但实际上,两者在功能往往可以互相实现,且pivot只是封装了unstack的一个快捷方式而已,其本质上还是先用set_index建立层次化索引,然后用unstack进行重塑,但当多层索引不是原数据自带的,而是由其他列数据转化而来,则此时pivot()函数更加灵活和方便,若原数据中本身带有多层次索引,那么用unstack()就会简单很多,因此,用什么方法取决于原数据的构成。pivot()的函数原型为:DataFrame.pivot(index=None,columns=None,values=None):ReturnreshapedDataFrameorganizedbygivenindex/columnvalues.函数中有3个参数,pivot每次只能处理3个列,其中一个作为行转列后的index,另一个作为行转列之后的columns,最后一个作为行转列后的表格values。pivot会忽略除了以上3个列之外的其他列数据,因此需要使用DataFrame切片、聚合等操作来达成特定的行列转换目标。unstack()和pivot()函数的等价操作如下。首先创建一个DataFrame。importpandasaspddata_df=pd.DataFrame({'userNum':['001','002','003','001','002','003'],'score':[90,96,93,87,82,80],'subjectCode':['01','01','01','02','02','02'],'subjectName':['语文','语文','语文','数学','数学','数学'],'userName':['张三','李四','王五','张三','李四','王五']})data_df结果如下图所示。针对以上数据,我们将userNum和subjectName设置为两层索引,同时使用unstack()将最内层索引subjectName转化为列索引,以此达到了用学号和学科来共同展示学生成绩信息的目的。结果如下图所示。data_df.set_index(['userNum','subjectName']).unstack()而如果我们只需要使用学号和学科来展示学生得分数据的话,还需要单独选取score这一列。data_df.set_index(['userNum','subjectName']).unstack()['score']而想要完成以上操作,pivot()函数只需要一行就能达到与上图完全相同的结果。data_df.pivot(index='userNum',columns='subjectName',values='score')4.简述groupby机制。想要理解GroupBy机制,就必须理解底层逻辑“分拆-应用-聚合”。(1)分拆:之所以叫GroupBy,正是因为有“Group”这个概念。我们用到Group,是因为需要按某个属性(字段)将数据区分为不同的Group,该属性我们通常称之为“分组键”,分组后便可以对每个Group进行操作(如求和、求平均),避免了数据集作为一个整体不好操作的问题。(2)应用:将数据切分为不同的Group并不是最终的目的,我们的目标是针对每个小的group执行一个操作,得到一个结果,这个过程就是“应用”,也是整个GroupBy中最复杂、最有发挥空间的部分。这里的操作可以是最简单的描述性统计和汇总统计,比如求和、求最大值、求最小值、求平均,它们得到的结果通常是一个标量值,也就是一个数。此外还可以加入略复杂的要求,比如同时返回每组最大值和最小值,得到的结果可以是一个Series、列表、字典、DataFrame或是任意你定义的对象类型。比如下图所示便是一个典型的拆分-应用过程。针对上图可以看出,分拆后的结果有以下特点:①分拆后的小group的列(columns)和原数据集是一样的;②分拆后的小group的分组键对应的列的值都是相等的,比如第一个小group里面,部门都是A;第二个则部门都是B③分拆形成的小group的个数,取决于原数据集中分组键对应的列的值去重后的个数,比如上图中原数据集中有4个数据,但是只有A、B、C3个部门,所以最终拆出来的小group就有3个。(3)聚合:聚合相对来说比较好理解一些了,从前面的图中我们可以看到,“应用”是对每一个小group执行了一种或简单或复杂的操作,但是不可能就这么返回给你,所以需要把这些数据给聚合起来,构成一个可读性更高的数据形式给你。简单来说,可以认为在这里pandas对“应用”完成后的每个小group的操作结果做了一个concat操作,也就是轴向上的聚合,也就是从上到下把他们像“堆俄罗斯方块”一样堆起来。在pandas中,堆叠起来的数据要么是Series,要么是DataFrame,也就是说,无论中间对每个小group的操作操作有多复杂,最后返回的结果无外乎就是Series和DataFrame。整个分拆-应用-聚合过程由下图所示。5.(1)按Type分组,求Price的最大值和最小值。(2)按Type分组,对HP进行归一化。(3)按位置分成三组,求Price的平均值。答案:#1result=data.groupby('Type').agg({'Price':['max'],'HP':['min']})print(result)#2defnormalize(x):xMin,xMax=x.min(),x.max()result=(x-xMin)/(xMax-xMin)returnresultresult=data.groupby('Type')['HP'].transform(normalize).head()print(result)#3#可以先看数据的行列:print(data.shape)输出:(60,9)#说明数据有60行,9列condition=['Head']*20+['Mid']*20+['Tail']*20result=data.groupby(condition)['Price'].mean()print(result)第6章1.如何从宏观到微观的对网页内容进行有效的爬取?(1)从宏观上观察网页结构,确定需要爬取的目标位置和结构。在整体上需要把控爬取目标的结构路径以及爬取逻辑和顺序,为后续实际代码的编写做好规划,使后续工作更有条理,避免出错。(2)宏观把控后,针对爬取目标结构进行微观的观察,确定定位时所需的路径和标签,以及对目标需要获取的包或者是进一步的URL链接等元素,或者是以什么样的方式来获取信息、需要对数据进行什么样的预先处理等,敲定为每一部分爬取的代码细节。2.如何使用正则表达式对网页文本内容进行提取?正则表达式(RegularExpression,RE)描述了一种字符串匹配的模式(Pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。正则表达式主要是针对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。所以针对网页某些目标信息内容的提取,正则表达式就是使用写好的匹配公式,通过在网页源码字符串内容中搜寻目标,来过滤出我们想要的信息。使用步骤如下:(1)首先获取网页源码的HTML字符串内容(2)然后编写正则表达式,例如第六章中针对影片详情链接所书写的表达式。#影片详情链接findlink=pile(r'<ahref="(.*?)">')(3)最后对目标使用正则匹配,提取信息,并保存结果。例如对详情链接的提取代码。#影片详情的链接link=re.findall(findlink,item)[0]data.append(link)3.如何将整理好的数组或列表数据按一定格式保存到本地?按照到第六章对整理好数据的保存过程为例,整个步骤如下:(1)首先创建Workbook对象,并设置编码。book=xlwt.Workbook(encoding="utf-8",style_compression=0)(2)然后创建excel中的表单sheet=book.add_sheet('豆瓣电影Top250',cell_overwrite_ok=True)(3)接着对数组或列表进行元素定位,以行列为坐标确定当前书写的单元格,将数据写入。以第六章中二维数组的写入为例。#外层循环定位行foriinrange(0,250):print("第%d条"%i)data=datalist[i]#内层循环,定位列forjinrange(0,8):sheet.write(i+1,j,data[j])(4)最后按照保存路径,对Excel表格进行保存。book.save(savepath)4.数据预处理的常见步骤和常用包有哪些?数据预处理一般包含以下四个步骤。(1)数据清洗:按需处理重复值、缺失值、异常值等数据。(2)数据集成:按一定格式将多个数据源中的数据结合起来存放在一致的数据存储中。(3)数据变换:把当前数据转换成为适合后续数据分析的形式。(4)数据规约:按业务需求和一定形式,将数据进行压缩,或是提取出所需要的属性数据。降维、分组聚合、采样等方式属于这一步骤。一般情况数据处理与分析需要三个包,分别为Pandas、NumPy、Matplotlib这三个包,前两个用于数据读取与分析,最后一个用于绘图。第7章1.在对爬取的数据添加年份时,我们发现实际爬取的数据日期其实出现了跨年份的现象,统一拼接为2022年显然不妥。针对这一情况该如何解决呢?通过datetime.now().year我们可以获得当前的年份数字,将获取到的2022直接减一即可得到前一年的年份,最后在恰当索引的地方拼接不同年份即可。#拼接当前年份temp=''.join([str(datetime.now().year-1),res])具体方法可以是采用iloc分别选取今年的数据和去年的数据,分别拼接不同年份,最后将两个拼接好的数据使用pd.concat()函数的进行纵向合并即可。2.通过最后的词云图可以看到,图中依然有一些无意义的词语或者是杂乱的内容,如何优化我们的文本分词操作,让绘制的词云图更完美?词云图不够完美一般都是因为对文本的预处理和分词操作不够完善,想要从分词上优化这一点无非两个操作:①增加停用词②添加分词字典。第一个方法可以利用根据业务添加的停用词,有效的去除原本词云图中出现的一系列无意义词语,如下图所示,可以人为地添加想要去除的词语。第二个方法则可以有效的对分词错误的部分根据业务术语进行矫正,比如“三大指数”和“元宇宙”被分词为了“股三大”和“宇宙”,这种明显的错误可以通过jieba.add_word()函数来动态添加词典,或者使用jieba.load_userdict()来直接加载本地的自定义词典,进行批量的处理。代码如下所示:jieba.add_word('元宇宙')jieba.load_userdict("my_dict.txt")自定义词典如下如所示。3.如何运用generate_from_frequencies()函数和jieba.analyse模块以更少的代码逻辑绘制出词云图?进行分词时,我们可以直接使用jieba.analyse来进行去除停用词和分词操作。使用extract_tags()函数可以获得指定权重排名数量的关键字词频权重元组列表,将该列表重组为字典后,便可以直接使用在generate_from_frequencies()函数上面生成词云图。使用这种方法的好处是不用手动去除停用词,并且可以修改词频权重从而调节词云图中的细节,不像直接使用WC.generate()无法控制词云图的生成结果。同时结合上题中的内容,我们手动添加新的停用词和词典来进行分词操作,最终形成词云图,下面的代码以comment的内容为例。#jieba.add_word('元宇宙')#加载自定义词典jieba.load_userdict("my_dict.txt")defautoCut(content):#输入停用词jieba.analyse.set_stop_words('cn_stopwords.txt')#去除停用词+词频分析word_list=\jieba.analyse.extract_tags(content,topK=50,withWeight=True)#转化为字典形式以便做词云图word_dict={}foriinword_list:word_dict[i[0]]=i[1]returnword_dict#调用函数进行分词title=autoCut(title)comment=autoCut(comment)importmatplotlib.pyplotaspltfromwordcloudimportWordCloudWC=WordCloud(font_path='C:\\Windows\\Fonts\\STFANGSO.TTF',max_words=50,height=800,width=800,background_color='white',mode='RGBA',collocations=False)#根据给定词频生成词云WC.generate_from_frequencies(comment)#WC.generate(space_comment)plt.figure(figsize=(6,4),dpi=350)#不显示坐标轴plt.axis("off")plt.imshow(WC)最后的绘制结果如下图所示。可以看到这一次的本的词云图更加完善,突出的关键词表达更加清晰。4.简述本章Scrapy项目运行原理,各组件之间是如何协同工作的?Scrapy中的数据流由引擎控制,项目运行原理和各组件的协同过程如下所示:(1)Engine首先打开一个网站,找到处理该网站的Spider,并向该Spider请求第一个要

爬取的URL。(2)

Engine从Spider中获取到第一

个要爬取的URL,并通过Scheduler以Request的形式调度。(3)

Engine向Scheduler请求下一个要爬取的URL。(4)

Scheduler返回下一个要爬取的URL给Engine,Engine

将URL通过Downloader

Middlewares转发给Downloader下载。(5)

一旦页面下载完毕,Downloader生成该页面的Response,并将其通过Downloader

Middlewares发送给Engine。(6)Engine从下载器中接收到Response,并将其通过Spider

Middlewares发送给Spider处理。(7)Spider处理Response,并返回提取到的Item及新的Request给Engine。(8)

Engine将Spider返回的Item给Item

Pipeline,将新的Request给Scheduler。(9)重复第(2)步到第(8)步,直到Scheduler中没有更多的Request,Engine

关闭该网站,爬取结束。利用通过多个组件的相互协作、不同组件完成工作的不同、组件对异步处理的支持,Scrapy最大限度地利用了网络带宽,

大大提高了数据爬取和处理的效率。第8章1.为什么要求数据尽量服从正态分布?在机器学习中,许多模型对具有正态分布的数据训练效果更好,学习速度更快,并且正态分布数据的泛化性更高,因为自然界很多事物的概率密度大多是正态分布的。此外从目标分布来说,非正态分布会导致标签数据的损失值出现误导,或许结果看着很小,但实际结果很大。尤其在回归问题上,对正态分布的数据有着较高的要求。2.如何大量的属性字段之间选取想要的特征?当数据集中数据字段属性特别多,但又不是很清楚哪些属性是我们所需要的时候,有必要先进行合理的数据属性规约,提取出关联度高,有明显线性关系的属性特征来进行后续数据预处理所需要的属性特征。在选择过程中我们可以使用关联矩阵来判断不同属性间的关联性,而关联矩阵可以使用热度图(Heatmap)来表达各个特征之间的关联程度。利用相关性计算可以选取出与目标属性关联性最密切的一些特征。我们使用常用的corr()函数来计算不同变量之间的相关性,从而使用seaborn中的heatmap()函数可以直观地展现不同变量间的相关性。同时nlargest()函数可以指定以某列为基准以降序方式返回前n个最大值的列,利用此方法可以自由指定想要最高相关性属性数量,从而达到灵活选取特征的目的。3.如何绘制属性字段相关性的热力图?首先使用corr()函数来计算不同变量之间的相关性;然后相关性结果使用nlargest()函数进行最大相关性排序,返回索引值,这些索引的内容就是排好序的列名;接着使用排好序的列名在原数据中选取对应的属性列,再次计算相关性系数;最后将再次计算出的相关性系数矩阵应用在heatmap()函数中便可以绘制出热力图。4.如何根据实际情况填充缺失值?对缺失值处理方法一共有三种:①删除②填充③不处理。删除和不处理都比较容易理解,但要注意他们都是在数据量较小或者是极大的时候采取的措施。而针对于填充的操作则比较复杂。主要的几种填充方式介绍如下:(1)特殊值填充。将空值作为一种特殊的属性值来处理,它不同于其他的任何属性值。如所有的空值都用“unknown”填充。但这样操作可能导致严重的数据偏离,一般情况不太推荐使用。(2)平均值填充。将信息表中的属性分为数值属性和非数值属性来分别进行处理。如果空值是数值型的,就根据该属性在其他所有对象的取值的平均值来填充该缺失的属性值;如果空值是非数值型的,就根据统计学中的众数原理,用该属性在其他所有对象的取值次数最多的值(即出现频率最高的值)来补齐该缺失的属性值。另外有一种与其相似的方法叫条件平均值填充法(ConditionalMeanCompleter)。在该方法中,缺失属性值的补齐同样是靠该属性在其他对象中的取值求平均得到,但不同的是用于求平均的值并不是从信息表所有对象中取,而是从与该对象具有相同决策属性值的对象中取得。这两种数据的补齐方法,其基本的出发点都是一样的,以最大概率可能的取值来补充缺失的属性值,只是在具体方法上有一点不同。与其他方法相比,它是用现存数据的多数信息来推测缺失值。(3)中位数填充。针对于一些可能非正态分布的数据,偏态分布数据,则使用中位数填充比较好反映实际的数据情况。(4)插值法。计算的是缺失值前一个值和后一个值的平均数从而进行填充。(5)热卡填充。对于一个包含空值的对象,热卡填充法在完整数据中找到一个与它最相似的对象,然后用这个相似对象的

温馨提示

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

评论

0/150

提交评论