數據采集與預處理安俊秀習題答案_第1頁
數據采集與預處理安俊秀習題答案_第2頁
數據采集與預處理安俊秀習題答案_第3頁
數據采集與預處理安俊秀習題答案_第4頁
數據采集與預處理安俊秀習題答案_第5頁
已閱讀5頁,還剩25頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第1章1.大數據的“5V”特征是什么?大數據的“5V”特征使得數據采集的挑戰愈發突出,其分別為Volume(大體量)、Velocity(時效性)、Variety(多樣性)、Value(高價值)與Veracity(準確性)。2.Flume中最小日志采集單位是什么,包括哪些部分?Flume被設計成一個分布式的管道架構,可以看作在數據源和目標地之間是一個由Agent(代理,最小日志采集單位)構成的網絡。Agent主要由Source、Channel與Sink三個組件組成。3.請概述三大數據采集工具Flume、Logstash、Fluentd之間的區別。不同組件之間有著不同的優勢和劣勢,總結以下特點。(1)在數據傳輸方面,Flume更注重于數據的傳輸,而在數據預處理方面不如Logstash,而在傳輸上Flume比Logstash更可靠,因為數據會持久化存儲在channel中,只有當數據存儲在sink端中才會從channel中刪除,這個過程保證了數據的可靠性。(2)在數據預處理方面,Logstash屬于ELK組件之一,一般會同ELK其它組件一起配合使用,所以其更注重于數據的預處理。(3)在插件和可擴展性方面Logstash有比Flume豐富的插件可選,所以在擴展功能上比Flume全面,而且對比與Fluentd而言Logstash也更加優秀,相比起來Fluentd插件質量不夠好,第三方插件大多是使用者根據自己業務需要編寫,只為實現特定需求,沒有足夠的泛化,也沒有足夠的測試和性能評估。(4)此外在性能和內存占用方面,Fluentd雖然有高性能這一項,可能相對于logstash要好很多,但在實際使用中,解析->轉換->入庫整個過程性能并不理想。此外Fluentd的性能既因為Ruby消耗過多計算和內存資源,又因為Ruby難以受益于多核,所以對數據吞吐量大的業務來說它是很昂貴的。4.請列舉三個常見的爬蟲應用場景。爬蟲的應用場景已經覆蓋到我們生活的方方面面,互聯網的各個領域都有爬蟲技術的應用,最常見的爬蟲應用就是以谷歌、百度為代表的搜索引擎,除此之外爬蟲的應用十分廣泛,部分應用場景舉例如下:(1)購物網站比價系統如今各大電商平臺為了活躍用戶進行各種秒殺活動并推出各種優惠券等,同樣的一件商品在不同網購平臺價格可能不同,這就催生各種比價網站。那么這些網站是如何在秒級的時間內知道一件商品在某站有優惠?這就需要一個爬蟲系統來實時監控各站的價格浮動。先采集商品的價格,規格,數量等,再做處理,分析,反饋。(2)輿情分析系統顧名思義就是輿論發展的情況有正面和負面之分,利用爬蟲技術來監測搜索引擎、新聞門戶、論壇、博客、微博、微信、報刊、視頻的輿情。根據預定的監控關鍵詞,實現全媒體一鍵搜索,保證信息搜集的全面性;同時為了豐富數據的多樣性,除了采集文本信息之外,還對圖像、視頻等信息進行采集;為保證其時效性,采用全棧式的響應機制,對于目標網站發布目標信息后,可以在分鐘級內采集到本地數據庫內。(3)資訊推薦系統通過爬蟲技術抓取數新聞源,然后以用戶行為屬性標簽歸納和深度自然語言搜索優化手段來分發給用戶,做到千人千面的閱讀體驗,達到最可觀的搜索優化程度。(4)數據買賣利用爬蟲收集信息,將數據提供給買數據的公司。比如天眼查,企查查這些公司。5.數據預處理流程中主要包括哪些方法?數據預處理的方法主要包括:數據清洗,數據集成,數據變換,數據規約。第2章1.JSON、CSV數據格式分別是什么樣的。答:簡單形式的JSON:{"people":[{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},{"firstName":"Jason","lastName":"Hunter","email":"bbbb"},{"firstName":"Elliotte","lastName":"Harold","email":"cccc"}]}復雜形式的JSON:{"programmers":[{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},{"firstName":"Jason","lastName":"Hunter","email":"bbbb"},{"firstName":"Elliotte","lastName":"Harold","email":"cccc"}],"authors":[{"firstName":"Isaac","lastName":"Asimov","genre":"sciencefiction"},{"firstName":"Tad","lastName":"Williams","genre":"fantasy"},{"firstName":"Frank","lastName":"Peretti","genre":"christianfiction"}],"musicians":[{"firstName":"Eric","lastName":"Clapton","instrument":"guitar"},{"firstName":"Sergei","lastName":"Rachmaninoff","instrument":"piano"}]}CSV的格式規范(格式規范定義來源于RFC4180),一共七點:(1)每一行記錄位于一個單獨的行上,用回車換行符CRLF(也就是\r\n)分割。(2)文件中的最后一行記錄可以有結尾回車換行符,也可以沒有。(3)第一行可以存在一個可選的標題頭,格式和普通記錄行的格式一樣。標題頭要包含文件記錄字段對應的名稱,應該有和記錄字段一樣的數量。(在MIME類型中,標題頭行的存在與否可以通過MIMEtype中的可選“header”參數指明)。(4)在標題頭行和普通行每行記錄中,會存在一個或多個由半角逗號(,)分隔的字段。整個文件中每行應包含相同數量的字段,空格也是字段的一部分,不應被忽略。每一行記錄最后一個字段后不能跟逗號(通常用逗號分隔,也有其他字符分隔的CSV,需事先約定)。(5)每個字段可用也可不用半角雙引號(’’)括起來(不過有些程序,如Microsoft的Excel就根本不用雙引號)。如果字段沒有用引號括起來,那么該字段內部不能出現雙引號字符。(6)字段中若包含回車換行符、雙引號或者逗號,該字段需要用雙引號括起來。(7)如果用雙引號括字段,那么出現在字段內的雙引號前必須加一個雙引號進行轉義。2.通用網絡爬蟲的流程。答:(1)獲取初始URL。初始的URL地址可以由人為地指定,也可以由用戶指定的某個或幾個初始爬蟲網頁決定。(2)根據初始的URL爬取頁面并獲得新的URL。獲得初始的URL地址之后,首先需要爬取對應URL地址中的網頁,爬取了對應的URL地址中的網頁后,將網頁存儲到原始數據庫中,并且在爬取網頁的同時,發現新的URL地址,同時將已經爬取的URL地址存放到一個URL列表中保存,用于去重以及判斷爬取的進程。(3)將新的URL放到URL隊列中。在第2步中,獲取到了下一個新的需要爬取的URL地址后,會將新的URL地址放到URL隊列中。(4)從URL隊列中讀取新的URL,并依據新的URL爬取網頁,同時從新網頁中獲取URL,并存放上述爬取過程。(5)滿足爬蟲系統設置的停止條件時,停止爬取。在編寫爬蟲的時候,一般會設置相應的停止條件。如果沒有設置停止條件,爬蟲則會一直爬取下去,一直到無法獲取新的URL地址為止,若設置了停止條件,爬蟲則會在停止條件滿足時停止爬取。3.寫出核對電話號碼的正則表達式。答:myreg=/^[1][3,4,5,7,8][0-9]{9}$/;這個表達式的意思是:1--以1為開頭;2--第二位可為3,4,5,7,8,中的任意一位;3--最后以0-9的9個整數結尾。本來只容13,15,17,18,開頭的手機號,但是測試mm說有14開頭的號碼,所以添加了14;當然,如果以后要是發展成有16,或者19,之類的開頭號碼的話,在[3,4,5,7,8]中添加即可。4.代理如何使用。答:#建立屬于自己的開放代理IP池importrequestsimportrandomimporttimefromlxmlimportetreefromfake_useragentimportUserAgentclassIpPool:def__init__(self):#測試ip是否可用urlself.test_url='/get'#獲取IP的目標urlself.url='/index_{}.html'self.headers={'User-Agent':UserAgent().random}#存儲可用ipself.file=open('ip_pool.txt','wb')defget_html(self,url):'''獲取頁面'''html=requests.get(url=url,headers=self.headers).textreturnhtmldefget_proxy(self,url): '''數據處理獲取ip和端口'''html=self.get_html(url=url)#print(html)elemt=etree.HTML(html)ips_list=elemt.xpath('//table/tbody/tr/td[1]/text()')ports_list=elemt.xpath('//table/tbody/tr/td[2]/text()')forip,portinzip(ips_list,ports_list):#拼接ip與portproxy=ip.strip()+":"+port.strip()#print(proxy)#95:9999self.test_proxy(proxy)deftest_proxy(self,proxy):'''測試代理IP是否可用'''proxies={'http':'http://{}'.format(proxy),'https':'https://{}'.format(proxy),}#參數類型#proxies#proxies={'協議':'協議://IP:端口號'}#timeout超時設置網頁響應時間3秒超過時間會拋出異常try:resp=requests.get(url=self.test_url,proxies=proxies,headers=self.headers,timeout=3)#獲取狀態碼為200ifresp.status_code==200:print(proxy,'\033[31m可用\033[0m')#可以的IP寫入文本以便后續使用self.file.write(proxy)else:print(proxy,'不可用')exceptExceptionase:print(proxy,'不可用')defcrawl(self):'''執行函數'''#快代理每頁url的區別#/free/inha/1/#/free/inha/2/# #提供的免費ip太多#這里只獲取前100頁提供的免費代理IP測試foriinrange(1,101):#拼接完整的urlpage_url=self.url.format(i)#注意抓取控制頻率time.sleep(random.randint(1,4))self.get_proxy(url=page_url)#執行完畢關閉文本self.file.close()if__name__=='__main__':ip=IpPool()ip.crawl()5.數據存儲到MySQL數據庫中,創建表、增刪改查數據的主要方法。答:創建庫:importpymysqldb=pymysql.connect(host='localhost',user='root',password='123456',port=3306)cursor=db.cursor()cursor.execute('selectversion()')data=cursor.fetchone()print('Databaseversion:',data)cursor.execute('createdatabasespidersdefaultcharactersetutf8')db.close()創建表:importpymysqldb=pymysql.connect(host='localhost',user='root',password=’123456’,port=3306,db='spiders')cursor=db.cursor()sql='createtableifnotexistsstudents(idvarchar(255)notnull,namevarchar(255)notnull,ageintnotnull,primarykey(id))'cursor.execute(sql)db.close()插入數據importpymysqlid='1234325'name='lili'age='20'db=pymysql.connect(host='localhost',user='root',password='123456',port=3306,db='spiders')cursor=db.cursor()sql='insertintostudents(id,name,age)values(%s,%s,%s)'try:cursor.execute(sql,(id,name,age))mit()except:db.rollback()db.close()更新數據:importpymysqldb=pymysql.connect(host='localhost',user='root',password=’123456’,port=3306,db='spiders')cursor=db.cursor()sql='updatestudentssetage=%swherename=%s'try:cursor.execute(sql,(25,'Wangwu'))mit()except:db.rollback()db.close()刪除數據:importpymysqldb=pymysql.connect(host='localhost',user='root',password='sjy147hhxxttxs',port=3306,db='spiders')cursor=db.cursor()table='students'con='age>18'sql='deleteform{table}where{con}'.format(table=table,con=con)try:cursor.execute(sql)mit()except:db.rollback()db.close()查詢數據:importpymysqldb=pymysql.connect(host='localhost',user='root',password='123456',port=3306,db='spiders')cursor=db.cursor()sql='select*fromstudentswhereage>10'try:cursor.execute(sql)print('count:',cursor.rowcount)one=cursor.fetchone()print('first:',one)res=cursor.fetchall()print('res:',res)print('type:',type(res))forrowinres:print(row)except:print('error')第3章1.什么是ajax?答:ajax是Web數據交互方式,使用Ajax技術網頁應用能夠快速地將增量更新呈現在用戶界面上,而不需要重載整個頁面。其作為一種創建交互式、快速動態網頁應用的網頁開發技術,在無需重新加載整個網頁的情況下,就能夠更新部分網頁。2.獲取ajax數據的方法和爬取過程有哪些?答:一種是通過瀏覽器的審查元素來獲取解析地址,另一種是通過Selenium模擬瀏覽器抓取。比較簡單的爬取過程如下:(1)打開瀏覽器的檢查功能。(2)找到數據的真實地址,單擊頁面中的Network選項,然后刷新網頁,進行“抓包”。(3)用request請求這個地址來獲取數據。3.如何用瀏覽器的審查元素來獲取解析地址的方式獲取豆瓣熱門電視劇信息。答:#coding=gbkimporturllib.request,urllib.errordefmain():url="/j/search_subjects?type=tv&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0"askURL(url)defaskURL(url):head={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64;rv:84.0)Gecko/20100101Firefox/84.0'}request=urllib.request.Request(url,headers=head,method='GET')#通過請求函數,給它一個請求頭html=""try:response=urllib.request.urlopen(request)html=response.read().decode('utf-8')print(html)excepturllib.error.URLErrorase:ifhasattr(e,"code"):print(e.code)ifhasattr(e,"reason"):print(e.reason)returnhtmlif__name__=='__main__':main()4.Selenium是什么?一些動態渲染的頁面是請求不到數據應該如何處理?答:Selenium是一個用于Web應用程序測試的工具。Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣。針對動態渲染頁面,一是我們可以分析ajax請求,分析ajax參數發現其規律,自行模擬ajax請求,二是如果通過ajax參數無法發現其規律,可以利用selenium來模擬瀏覽器,即通過selenium和chrome

driver利用代碼來模擬用戶在瀏覽器上的各種交互。5.如何通過Selenium來獲取豆瓣熱門電視劇網頁的信息。答:fromseleniumimportwebdriverimporttime#初始化一個driver,指定Chrome瀏覽器driver=webdriver.Chrome()#隱式等待:在查找所有元素時,如果尚未被加載,則等10秒driver.implicitly_wait(10)#請求豆瓣電影劇情排行榜driver.get("/tv/#!type=tv&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0")#通過page_source獲取網頁源代碼time.sleep(10)#要等它加載一段時間,才會有數據print(driver.page_source.encode('GBK','ignore').decode('GBK'))#忽略掉非法字符在編譯6.如何獲取豆瓣熱門電視劇前五十?答:importtimefromseleniumimportwebdriverdefclick_to_bottom():js="returnaction=document.body.scrollHeight"height=0#初始化現在滾動條所在高度為0new_height=driver.execute_script(js)#當前窗口總高度whileheight<new_height:#通過模擬點擊加載更多將滾動條調整至頁面底部foriinrange(height,new_height,200):driver.find_element_by_class_name('more').click()time.sleep(0.5)height=new_heighttime.sleep(0.5)new_height=driver.execute_script(js)ifcondition():break#終止條件defcondition():try:#終止條件是第五十個item的xpathdriver.find_element_by_xpath('//*[@id="content"]/div/div[1]/div/div[4]/div/a[50]')returnTrueexcept:returnFalseif__name__=='__main__':#初始化一個driver,指定Chrome瀏覽器driver=webdriver.Chrome()#請求豆瓣熱門電視劇前五十driver.get("/tv/#!type=tv&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0")click_to_bottom()#通過find_element_css_selector方法,將前50個寫入數組teleplay中teleplayList=driver.find_elements_by_css_selector('#content>div>div.article>div>div.list-wp>div>a>p')[:50]i=1withopen("teleplay_Top50.txt",'w')asf:forteleplayinteleplayList:f.writelines("NO.{}{}\n".format(i,teleplay.text))i+=1driver.quit()7.什么是Scarpy?Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架。Scrapy

使用了

Twisted

異步網絡庫來處理網絡通訊,該框架用途廣泛,可以應用在包括數據挖掘,檢測和自動化測試,信息處理或存儲歷史數據等一系列的任務場景中。8.爬蟲框架機制是什么?通用爬蟲框架定義了編寫一個網絡爬蟲最基本的過程。一個通用的爬蟲框架通常包含待抓取的URL列表、已抓取的URL列表、URL下載器、URL解析器、數據庫等幾個模塊。根據任務的需求,還可以加入監控模塊、定時啟動模塊等。第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.如何大量的屬性字段之間選取想要的特征?當數據集中數據字段屬性特別多,但又不是很清楚哪些屬性是我們所需要的時候,有必要先進行合理的數據屬性規約,提取出關聯度高,有明顯線性關系的屬性特征來進行后續數據預處理所需要的屬性特征。在選擇過程中我們可以使用關聯矩陣來判斷不同屬性間的關聯性,而

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論