數據采集與預處理 習題及答案 安俊秀 第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

提交評論