數(shù)據(jù)采集與預(yù)處理(微課版) 課件 安俊秀 第7、8章 Scrapy與Selenium采集股市每日點評數(shù)據(jù)并可視化、房產(chǎn)數(shù)據(jù)預(yù)處理_第1頁
數(shù)據(jù)采集與預(yù)處理(微課版) 課件 安俊秀 第7、8章 Scrapy與Selenium采集股市每日點評數(shù)據(jù)并可視化、房產(chǎn)數(shù)據(jù)預(yù)處理_第2頁
數(shù)據(jù)采集與預(yù)處理(微課版) 課件 安俊秀 第7、8章 Scrapy與Selenium采集股市每日點評數(shù)據(jù)并可視化、房產(chǎn)數(shù)據(jù)預(yù)處理_第3頁
數(shù)據(jù)采集與預(yù)處理(微課版) 課件 安俊秀 第7、8章 Scrapy與Selenium采集股市每日點評數(shù)據(jù)并可視化、房產(chǎn)數(shù)據(jù)預(yù)處理_第4頁
數(shù)據(jù)采集與預(yù)處理(微課版) 課件 安俊秀 第7、8章 Scrapy與Selenium采集股市每日點評數(shù)據(jù)并可視化、房產(chǎn)數(shù)據(jù)預(yù)處理_第5頁
已閱讀5頁,還剩69頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第七章Scrapy與Selenium采集股市每日點評數(shù)據(jù)并可視化“Python數(shù)據(jù)采集與預(yù)處理目錄CONTENTS采集目標(biāo)和準(zhǔn)備工作7.1大盤每日點評網(wǎng)頁結(jié)構(gòu)分析7.2使用Scrapy與Selenium爬取信息7.3數(shù)據(jù)預(yù)處理和可視化7.4學(xué)習(xí)目標(biāo)掌握Scrapy框架爬取數(shù)據(jù)的邏輯和流程掌握Scrapy框架組件使用方式掌握Scrapy框架與Selenium擴展的結(jié)合使用掌握數(shù)據(jù)存儲至數(shù)據(jù)庫的基本方式掌握詞云圖的繪制方式采集目標(biāo)和準(zhǔn)備工作017.1采集目標(biāo)和準(zhǔn)備工作采集目標(biāo)在本章的案例中,通過運行編寫的Scrapy爬蟲,可以自動爬取收集來源于支付寶基金板塊所收錄的大盤每日點評數(shù)據(jù)信息,并且最終將獲取的數(shù)據(jù)存入數(shù)據(jù)庫。本章的數(shù)據(jù)采集目標(biāo)主要為每日點評的日期信息、一句話盤前盤后概述和首頁大盤點評文本信息。根據(jù)采集的數(shù)據(jù),以詞云圖和統(tǒng)計圖表的形式進行可視化展示,將每日的一句話盤前盤后概述和首頁大盤點評文本信息制作為詞云圖,將不同詞根據(jù)詞頻的大小進行排序,以詞在圖中出現(xiàn)的大小來代表相應(yīng)的詞頻大小,從而進行可視化展示,以這樣的形式我們可以更直觀地了解近期金融市場的趨勢和狀況。7.1采集目標(biāo)和準(zhǔn)備工作采集目標(biāo)在頁面該位置往下瀏覽,可以看到每篇點評的日期時間信息,和一句話概述標(biāo)題以及首頁的點評文本,每一條資訊數(shù)據(jù)都是一塊塊有規(guī)律地存放在相應(yīng)版塊中,同時繼續(xù)往下瀏覽可以看到每次進入頁面只刷新加載出10條信息,想要看到更多的內(nèi)容,需要手動繼續(xù)往下滑到頁面底端才能如圖7-3所示加載出更多,這無疑是一種動態(tài)渲染。動態(tài)渲染的爬取思路一種是分析Ajax請求,找到其對應(yīng)的接口抓取,獲取相應(yīng)的JSON數(shù)據(jù)包,Scrapy可以使用這種方式爬??;另一種則是結(jié)合Selenium來模擬瀏覽器進行訪問抓取,直接獲得最后渲染好的整體頁面,在該頁面的基礎(chǔ)上再定位元素進行信息采集。7.1采集目標(biāo)和準(zhǔn)備工作采集目標(biāo)在準(zhǔn)備爬取數(shù)據(jù)之前,請確保裝已經(jīng)安裝好了Scrapy框架、pymysql庫、Selenium庫。在有了這幾個庫的基礎(chǔ)上,開始創(chuàng)建Scrapy項目。打開PyCharm,創(chuàng)建一個新的工程文件ScrapyStudy,然后在該工程文件夾下面點擊“Terminal”進入PyCharm的終端界面,輸入命令:scrapystartprojecttutorial創(chuàng)建一個新的Scrapy項目。創(chuàng)建完成Scrapy項目后便可以開始編寫自己的爬蟲程序了。但在進行爬蟲編寫之前,還需要對爬取目標(biāo)有一個明確的定位與分析,接下來對爬取頁面的網(wǎng)頁結(jié)構(gòu)進行分析介紹。大盤每日點評網(wǎng)頁結(jié)構(gòu)分析027.2大盤每日點評網(wǎng)頁結(jié)構(gòu)分析用元素選取工具選中存放整個界面數(shù)據(jù)的模塊,發(fā)現(xiàn)其為一個列表<li>結(jié)構(gòu),將<li>標(biāo)簽進一步展開至<div>下,可看到其下共有兩個<div>,第一個<div>中包含了日期時間數(shù)據(jù),第二個<div>中又囊括了兩個<div>,其分別存儲了一句話概述文本和每日點評文本。從圖中可以清晰看到,每一次的盤前盤后點評都存儲在一個個<li>標(biāo)簽中,其中所包含的三個<div>結(jié)構(gòu)中是我們所需要的數(shù)據(jù)信息,從上至下的三個圖中紅框選出來的<div>中的內(nèi)容分別為“日期時間”、“一句話概述標(biāo)題”和“每日點評文本”,由此可以確定爬取順序和數(shù)據(jù)的字段含義。使用Scrapy與Selenium爬取信息037.3.1編寫item.py與spider.py由于需要爬取“日期時間”、“一句話概述標(biāo)題”和“每日點評文本”三個字段的內(nèi)容,所以在item里設(shè)置三個字段“date_details”、“title_details”和“text_details”。item.py第一步先初步實現(xiàn)自己定義的Spider類,定義類屬性以及start_requests()方法。其用于生成初始請求,構(gòu)造生成Request提交給調(diào)度器Scheduler,通過DownloaderMiddlewares轉(zhuǎn)發(fā)給Downloader下載,并且指定提取數(shù)據(jù)的回調(diào)函數(shù)為self.parse。第二部構(gòu)造解析頁面函數(shù)parse(),其將會接受Downloader或DownloaderMiddlewares回傳的Response對象進行解析。這兩個函數(shù)構(gòu)成了我們Spider類的主要內(nèi)容。spider.pyimportscrapyfromscrapyimportFieldclassCovidItem(scrapy.Item): text_details=Field()title_details=Field()date_details=Field()7.3.1編寫item.py與spider.pyimportscrapyfromtutorial.itemsimportCovidItem#定義自己的Spider類classQuotesSpider(scrapy.Spider):name="study"allowed_domains=[""]#start_urls=\#['/infofront/antIndex/99d79444-5226-11e6-a786-40f2e968ab88']

#定義start_requests()函數(shù)用于生成初始請求

defstart_requests(self):urls=[“/infofront/antIndex/99d79444-5226-11e6-a786-40f2e968ab88”]forurlinurls:yieldscrapy.Request(url=url,callback=self.parse)7.3.1編寫item.py與spider.pydefparse(self,response):#獲取日期和文本兩個板塊的div標(biāo)簽代碼內(nèi)容text_items=response.xpath('//*[@id="__layout"]/div/div/div/section/ul/li/div[2]’)date_items=response.xpath('//*[@id="__layout"]/div/div/div/section/ul/li/div[1]')print('總共獲取數(shù)據(jù):{},{}\n'.format(len(text_items),len(date_items)))#構(gòu)造我們自己定義的item的對象,且定義兩個存儲具體信息的列表

items=CovidItem()text_details=[]title_details=[]date_details=[]#提取一句話概述和點評文本

foritemintext_items:title=item.xpath('./div[1]/span/text()').extract_first()text=item.xpath('./div[2]/text()').extract_first()#去掉爬取到的點評文本中網(wǎng)頁自帶的一些特殊符號

text=re.sub('[a-zA-Z#$&\s\n\r]+',"",text)text=''.join(text)title_details.append(title)text_details.append(text)#提取日期時間數(shù)據(jù)

foritemindate_items:date=item.xpath('./span/text()').getall()date=''.join(date)date_details.append(date)#將數(shù)據(jù)存儲在CovidItem對象中并返回給pipelinesitems['title_details']=title_detailsitems['text_details']=text_detailsitems['date_details']=date_detailsyielditems7.3.2編寫middlewares.pyclassSeleniumMiddleware(object):

def__init__(self):self.browser=webdriver.Chrome()#設(shè)置瀏覽器窗口大小

self.browser.set_window_size(1400,700)#設(shè)置隱式等待

self.browser.implicitly_wait(10)defprocess_request(self,request,spider): #瀏覽器使用get()訪問Request的對應(yīng)URLself.browser.get(request.url)time.sleep(2)#對頁面元素進行定位

target=self.browser.find_element_by_xpath('//*[@id="__layout"]/div/div/div/section/div[3]/img')middlewares.py對相應(yīng)URL的內(nèi)容采集,本節(jié)使用Scrapy對接Selenium的方式來實現(xiàn),整個過程采用DownloaderMiddlewares來編寫。我們自定義一個SeleniumMiddleware類,其中將會定義Middlewares里面的process_request()方法,方法中將根據(jù)Request中的URL來進行處理,用Selenium啟動瀏覽器進行頁面渲染,最后以HtmlResponse的形式返回完整渲染好的頁面對象。7.3.2編寫middlewares.py#往后繼續(xù)刷新10頁,一共獲取110條數(shù)據(jù)內(nèi)容

foriinrange(10):#定位頁面底端后要重定位到上一條每日點評,避免無法控制刷新次數(shù)

stop=self.browser.find_element_by_xpath('//*[@id="__layout"]/div/div/div/section/ul/li[{}]'.format(i*10+10))#使用JS語句來定位元素

self.browser.execute_script("arguments[0].scrollIntoView();",target)self.browser.execute_script("arguments[0].scrollIntoView();",stop)#也可以不使用JS,而采取直接找到元素并對其做出某些操作的方式來定位頁面

#button=self.browser.find_element_by_xpath('//*[@id="__layout"]/div/div/div/section/div[3]/img')#button.click()#休眠三秒等待刷新

time.sleep(3)#獲取網(wǎng)頁源碼

data=self.browser.page_sourceself.browser.close() #構(gòu)造返回HtmlResponse對象,提交給Spider處理

returnHtmlResponse(url=request.url,body=data,request=request,encoding='utf-8',status=200)7.2.2編寫middlewares.py在上面代碼中,主要做的事情就是在process_request()函數(shù)中使用__init__()中初始化好的瀏覽器對象browser,來對request.url進行訪問,通過xpath定位頁面末尾的公司聲明內(nèi)容的元素標(biāo)簽,從而使頁面開始自動加載新的數(shù)據(jù)。同時在這里有一個細節(jié)需要讀者注意,Request請求實際上在Middlewares中間件這里已經(jīng)被處理了,其不會再被傳給Downloader完成下載,而是由SeleniumMiddleware類的process_request()方法直接構(gòu)造了一個HtmlResponse對象返回,其為Response對象子類。根據(jù)process_request()函數(shù)的特性,當(dāng)其返回Response對象時,低優(yōu)先級的DownloaderMiddlewares中的process_request()方法便不會再被調(diào)用了,轉(zhuǎn)而會去執(zhí)行每一個DownloaderMiddlewares的process_response()方法,本案例middlewares.py中的process_response()方法沒有任何處理,只有一句returnresponse,于是構(gòu)造的HtmlResponse對象將會直接被返回給Spider。7.3.3編寫pipelines.pyItemPipeline為項目管道,當(dāng)Item對象構(gòu)建好后,通過yield可以將其提交到ItemPipeline中進行處理,在ItemPipeline中將Item中的內(nèi)容存儲到MySql數(shù)據(jù)庫中。本案例中實現(xiàn)ItemPipeline只需要定義一個MySpiderPipeline類,讓其實現(xiàn)process_item()方法即可,該方法必須返回數(shù)據(jù)字典或者是拋出異常。pipelines.py中需要導(dǎo)入pymysql、traceback和time這三個包。item.pyclassMySpiderPipeline(object):def__init__(self,host,database,user,password,port):self.host=hostself.database=databaseself.user=userself.password=passwordself.port=port@classmethoddeffrom_crawler(cls,crawler):returncls(host=crawler.settings.get('MYSQL_HOST'),database=crawler.settings.get('MYSQL_DATABASE'),user=crawler.settings.get('MYSQL_USER'),password=crawler.settings.get('MYSQL_PASSWORD'),port=crawler.settings.get('MYSQL_PORT'),)7.3.3編寫pipelines.py在以上代碼中,定義了一個MySpiderPipeline類,在初始化方法__init__()中,初始化了連接數(shù)據(jù)庫時所需的所有參數(shù),但此處需要注意的一個點是,初始化參數(shù)的內(nèi)容都來源于from_crawler()這個類方法,其用@classmethod標(biāo)識。該方法中傳入一個參數(shù)crawler,通過該對象可以從crawler.settiings中讀取最高優(yōu)先級的settiings,獲取settings中最常見的項目設(shè)置信息。cls參數(shù)為Class,該方法最后返回一個Class實例。繼續(xù)我們定義了open_spider()函數(shù)和close_spider()函數(shù)。這兩個函數(shù)分別在Spider開啟和關(guān)閉的時候被調(diào)用,我們可以在其中做一些初始化和結(jié)尾工作,比如上面代碼中的初始化數(shù)據(jù)庫連接對象conn和關(guān)閉數(shù)據(jù)庫連接對象conn操作。item.py#創(chuàng)建數(shù)據(jù)庫連接和游標(biāo)

defopen_spider(self,spider):self.conn=pymysql.connect(host=self.host,user=self.user,passwd=self.password,database=self.database,charset='utf8',port=self.port)self.cursor=self.conn.cursor()#關(guān)閉數(shù)據(jù)庫

defclose_spider(self,spider):self.conn.close()7.3.3編寫pipelines.py接下來則是最重要的process_item()函數(shù)的定義,主要的數(shù)據(jù)處理工作都是在其中進行的。在process_item()函數(shù)中,首先從接收到的item里面拿出三各字段的數(shù)據(jù),保存在臨時變量中,然后書寫兩條sql語句,第一條sql_delete負責(zé)每次將舊的歷史數(shù)據(jù)清空,第二條sql_insert負責(zé)按照格式插入數(shù)據(jù)。接下來便執(zhí)行第一條sql語句清空舊記錄,再將三個變量用zip打包后,共同組成一個元組,并將這些元組組成列表返回。遍歷列表中的元組將數(shù)據(jù)一條條插入數(shù)據(jù)庫。最后使用commit()提交以上操作即可。item.py#將數(shù)據(jù)存儲到數(shù)據(jù)庫中defprocess_item(self,item,spider):try:dat=item['date_details']title=item['title_details']context=item['text_details’]sql_delete="truncatetablestock_comment"sql_insert="insertintostock_comment(date,title,text)values(%s,%s,%s)"#time.asctime()不加參數(shù)就是默認time.localtime()返回的時間

print(f"{time.asctime()}開始更新數(shù)據(jù)")self.cursor.execute(sql_delete)#將三個列表取出打包為元組

ford,t,cinzip(dat,title,context):self.cursor.execute(sql,(d,t,c))mit()print(f"{time.asctime()}更新到最新數(shù)據(jù)")except: traceback.print_exc()returnitem7.3.3編寫pipelines.py在執(zhí)行上面操作前,可以先將item內(nèi)容輸出到終端,觀察一下數(shù)據(jù)結(jié)構(gòu)形式,這樣更加方便代碼邏輯的編寫。數(shù)據(jù)爬取結(jié)果7.3.4設(shè)置settings.pysettings.py的主要任務(wù)就是定義項目的全局配置項,在其中可以定制Scrapy組件。你可以控制包括核心(core),插件(extension),ItemPipelines及Middlewares等組件,設(shè)置項目下所有爬蟲的一些公共變量。整個settings設(shè)定為代碼形式,其提供了以key-value映射的配置值的全局命名空間(namespace)。settings.py①日志等級LOG_LEVEL="WARNING"②是否遵守robots協(xié)議ROBOTSTXT_OBEY=False③數(shù)據(jù)庫全局參數(shù)變量MYSQL_HOST=''MYSQL_DATABASE='mytext'MYSQL_USER='root'MYSQL_PASSWORD='123456'MYSQL_PORT=3306④下載中間件設(shè)置DOWNLOADER_MIDDLEWARES={#'tutorial.middlewares.TutorialDownloaderMiddleware':543,'tutorial.middlewares.SeleniumMiddleware':543,}⑤項目管道設(shè)置ITEM_PIPELINES={'tutorial.pipelines.MySpiderPipeline':300,}7.3.5運行結(jié)果編寫好所有代碼后,便可以在終端運行我們的Scrapy爬蟲項目了。首先,進入項目目錄tutorial,輸入命令cdtutorial;然后輸入命令scrapycrawlstudy即可運行項目;最后可以在終端看見運行結(jié)束的提示。運行結(jié)果使用Navicat進入數(shù)據(jù)庫可以看到Scrapy項目爬取到的內(nèi)容已存放在下圖所示的stock_comment這張表中。數(shù)據(jù)預(yù)處理與可視化047.4.1數(shù)據(jù)預(yù)處理導(dǎo)入所需庫導(dǎo)入本案例數(shù)據(jù)預(yù)處理與可視化所需要的庫。Pandas、NumPy、Matplotlib用于處理數(shù)據(jù)與繪制統(tǒng)計圖,Pymsql用于數(shù)據(jù)庫操作,Jieba和Re用于處理文本生成詞云圖。#導(dǎo)入包和模塊importpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltimportpymysqlimportjieba.analysefromjieba.analyseimportextract_tagsimportre7.4.1數(shù)據(jù)預(yù)處理數(shù)據(jù)讀取數(shù)據(jù)預(yù)處理第一步需要將數(shù)據(jù)從數(shù)據(jù)庫中讀取出來,本案例在JupyterNotebook中。完成數(shù)據(jù)預(yù)處理與可視化操作defget_conn():#創(chuàng)建連接

conn=pymysql.connect(host="localhost",user="root",password="123456",db="mytext",charset="utf8")#創(chuàng)建游標(biāo)cursor=conn.cursor()returnconn,cursor#關(guān)閉連接defclose_conn(conn,cursor):cursor.close()conn.close()#查詢defquery(sql,*args):conn,cursor=get_conn()cursor.execute(sql,args)res=cursor.fetchall()close_conn(conn,cursor)returnresdefget_data():sql="select*fromstock_comment"res=query(sql)returnrestext=get_data()7.4.1數(shù)據(jù)預(yù)處理數(shù)據(jù)轉(zhuǎn)換由于爬取到的數(shù)據(jù)十分規(guī)整,于是可以直接開始數(shù)據(jù)轉(zhuǎn)換操作,將數(shù)據(jù)類型從元組轉(zhuǎn)換為DataFrame,重命名列索引,并且對其中用需要轉(zhuǎn)化為日期時間類型的字符串?dāng)?shù)據(jù)進行映射轉(zhuǎn)換。在日期時間數(shù)據(jù)中,字符串形式的日期數(shù)據(jù)明顯不規(guī)整,最好將其轉(zhuǎn)化為日期形式數(shù)據(jù)。這里使用iloc定位下標(biāo)或使用列名選取的形式選中所需要轉(zhuǎn)換的列,賦值給result變量,然后使用apply()函數(shù)對result應(yīng)用自定義函數(shù)date_transform(),將其中的所有內(nèi)容轉(zhuǎn)換為日期類型數(shù)據(jù)。fromdatetimeimportdatetime#數(shù)據(jù)類型轉(zhuǎn)換為DataFrametext=pd.DataFrame(text,columns=['id','date','title','comment’])result=text['date']#result=text.iloc[:,0]defdate_transform(res):#去掉多余文字

res=res.replace('月盤前','')res=res.replace('月盤后','')#拼接當(dāng)前年份

temp=''.join([str(datetime.now().year),res])#轉(zhuǎn)化年份

datetime_object=datetime.strptime(temp,'%Y%d%m%H:%M:%S')#返回數(shù)據(jù)

returndatetime_object#使用自定義函數(shù)并替換原數(shù)據(jù)列result=result.apply(date_transform)text['date']=result7.4.1數(shù)據(jù)預(yù)處理轉(zhuǎn)換結(jié)果其實從上面的結(jié)果中可以看出,我們爬取的數(shù)據(jù)日期其實出現(xiàn)了跨年份的現(xiàn)象,統(tǒng)一拼接為2022年顯然不妥。針對這一情況該如何解決呢?交給同學(xué)們思考。7.4.1數(shù)據(jù)預(yù)處理數(shù)據(jù)規(guī)約經(jīng)過數(shù)據(jù)轉(zhuǎn)換后,通過標(biāo)準(zhǔn)化的日期統(tǒng)計,可以進行很多觀察與總結(jié),比如可以直觀地看出我們爬取數(shù)據(jù)的時間跨度,并且在根據(jù)文本情感進行預(yù)測分析的時候,日期需要與每日點評文本一一對應(yīng),這些時候標(biāo)準(zhǔn)化日期就顯得十分必要。但在本章制作詞云圖中不需要日期,因為制作詞云時需要將所有點評拼接為一個大文本,所以date列可以拋棄。此外用于數(shù)據(jù)在數(shù)據(jù)庫中保證排列順序的id列也不需要,可以刪去。#數(shù)據(jù)規(guī)約text.drop(labels=['id','date'],axis=1,inplace=True)7.4.1數(shù)據(jù)預(yù)處理文本預(yù)處理在制作文本詞云圖之前,需要對文本進行預(yù)處理,轉(zhuǎn)化為方便進行詞云圖可視化的格式。第一步需要獲得一個純文字內(nèi)容的大文本。首先,需要將文本從DataFrame中提取出來合并在一起,形成一個大文本,講兩個字段的大文本分別賦值給title和comment;然后利用re.findall()函數(shù)將文本中各種標(biāo)點符號給清除,使其只留下文字內(nèi)容;最后將re.findall()函數(shù)返回的數(shù)組內(nèi)容title和comment再次拼接為一個大文本。#將每一行的文本數(shù)據(jù)拼接到一起,形成一個大文本content=text.sum()title=content.titlecomment=ment#對大文本去除各種符號,只剩下文字內(nèi)容#只要字符串中的中文,字母,數(shù)字title=re.findall('[\u4e00-\u9fa5a-zA-Z0-9]+',title,re.S)comment=re.findall('[\u4e00-\u9fa5a-zA-Z0-9]+',comment,re.S)#重新拼接結(jié)果title="".join(title)comment="".join(comment)7.4.1數(shù)據(jù)預(yù)處理文本預(yù)處理第二步則需要對大文本進行分詞操作,這里通過自定義函數(shù)curWords()來完成。在函數(shù)中首先使用jieba分詞庫對傳入的content進行分詞操作,lcut()函數(shù)以數(shù)組形式返回分詞結(jié)果;然后對分詞結(jié)果去除停用詞和數(shù)字內(nèi)容,這些內(nèi)容在詞云圖中沒有分析價值,這里用到了停用詞表和isdigit()函數(shù)。停用詞表中包括了常見的停用詞,isdigit()用于判斷字符串是否只由數(shù)字組成,利用讀取的cn_stopwords.txt中的停用詞和isdigit()函數(shù)可以得到一個不包括停用詞和數(shù)字的列表words;最后將words返回。defcutWords(content):#進行分詞wordlist_jieba=jieba.lcut(content)#讀取停用詞表withopen(r'D:\stopwords\cn_stopwords.txt',encoding='utf-8')asf:stopwords=f.read()words=[]forwordinwordlist_jieba: #去除停用詞和數(shù)字內(nèi)容

ifwordnotinstopwordsandnotword.isdigit():words.append(word)returnwords#進行分詞處理title=cutWords(title)comment=cutWords(comment)7.4.1數(shù)據(jù)預(yù)處理文本預(yù)處理第三步需要對兩個變量進一步處理得到一個以空格分割的大文本。觀察分詞后的title內(nèi)容可以發(fā)現(xiàn),其中有很多的“盤前”“盤后”,這兩個詞對于詞云圖的表達沒有任何意義,可以刪除,而comment中有很多重復(fù)的“市場”“表現(xiàn)”這兩個詞,由于本身就是對市場的表現(xiàn)做出點評,我們更加關(guān)心對市場里面的哪些內(nèi)容進行點評,所以兩詞可以刪去,其他的分詞結(jié)果均可保留,使用join()函數(shù)將處理結(jié)果合并為一個大文本。#處理titlewhile'盤前'intitle:title.remove('盤前')while'盤后'intitle:title.remove('盤后')space_title=''.join(title)#處理commentwhile'市場'incomment:comment.remove('市場')while'表現(xiàn)'incomment:comment.remove('表現(xiàn)')space_comment=''.join(comment)7.4.1數(shù)據(jù)預(yù)處理預(yù)處理結(jié)果一句話標(biāo)題概述文本預(yù)處理結(jié)果每日點評文本預(yù)處理結(jié)果7.4.2數(shù)據(jù)可視化文本預(yù)處理詞云圖又叫文字云,是對文本數(shù)據(jù)中出現(xiàn)頻率較高的關(guān)鍵詞予以視覺上的突出,用來展現(xiàn)高頻關(guān)鍵詞的可視化表達。其通過文字、色彩、圖形的搭配,產(chǎn)生有沖擊力地視覺效果,從而形成“對關(guān)鍵詞的渲染”,結(jié)果形成類似云一樣的彩色圖片,從而過濾掉大量的不相關(guān)文本信息,使人一眼就可以領(lǐng)略文本數(shù)據(jù)的主要表達意思。近年來詞云圖被廣泛的應(yīng)用到宣傳、報告、數(shù)據(jù)分析、文章配圖等領(lǐng)域中,本小節(jié)便以詞云圖來完成每日點評文本的可視化分析。繪制詞云圖的方法如下:首先,導(dǎo)入繪制詞云圖所需要的庫wordcloud,使用其中的WordCloud類創(chuàng)建一個詞云對象WC,然后調(diào)用WC中的generate()函數(shù)便可以生成詞云,最后使用plt中的函數(shù)來進行圖像設(shè)置,將詞云圖顯示到頁面上。由于針對space_title和space_comment兩個內(nèi)容的詞云圖繪制過程一致,這里的代碼以space_title為例,想要繪制space_comment的詞云圖只需修改generate()傳入的參數(shù)即可。7.4.2數(shù)據(jù)可視化繪制詞云圖fromwordcloudimportWordCloud#創(chuàng)建詞云對象WC=WordCloud(font_path='C:\\Windows\\Fonts\\STFANGSO.TTF’,max_words=100,height=800,width=800,background_color='white',mode='RGBA',collocations=False)#根據(jù)給定詞頻生成詞云#WC.generate_from_frequencies(r)#根據(jù)給定文本生成詞云WC.generate(space_title)#設(shè)置頁面大小和清晰度plt.figure(figsize=(6,6),dpi=350)plt.axis("off")plt.imshow(WC)①font_path:字體路徑(需要設(shè)置什么樣的字體,就將字體路徑以字符串的形式傳入。默認為wordcloud庫下的DroidSansMono.ttf字體)如果選用默認字體的話,是不能夠顯示中文字的。為使得能夠顯示中文,可以自己設(shè)置字體。系統(tǒng)字體一般都在C:\Windows\Fonts目錄下。②max_words:number(默認為200)最大顯示單詞字數(shù)。③width:畫布寬度。(默認為400像素)④height:畫布高度(默認為200)⑤background_color:colorvalue(默認為“black”)詞云圖像的背景色。⑥mode:string(默認為“RGB”)當(dāng)mode=“RGBA”且background_color=“None”時,將生成透明的背景。⑦collocations:bool,(默認為True)

是否包括兩個詞的搭配(雙賓語)。該參數(shù)會統(tǒng)計搭配詞。比如一個分詞結(jié)果為“我在拜訪客戶”,當(dāng)collocations為True時,就會把“拜訪客戶”也當(dāng)作一個詞進行統(tǒng)計,所以會出現(xiàn)重復(fù)統(tǒng)計的內(nèi)容。7.4.2數(shù)據(jù)可視化繪制結(jié)果分析space_comment詞云圖效果space_title詞云圖效果7.4.2數(shù)據(jù)可視化繪制結(jié)果分析從上面兩幅詞云圖我們可以直觀的看出最近的市場形勢,以及點評所重點關(guān)注的內(nèi)容。從第一幅圖可以看出,在一句話標(biāo)題概述中重點關(guān)注了市場指數(shù)的變化,指數(shù)這兩個字占據(jù)了圖中很大的篇幅。接著比指數(shù)稍微小一點的詞有“市場”“回升”“探底”“反彈”,這些詞語占據(jù)了圖中第二大篇幅,明確的總結(jié)出市場近55天的形勢:市場較為低迷,在探底反彈間徘徊,有回升的希望。再往小一點的詞看,有“回落”“震蕩”“有望”等,也從側(cè)面印證了我們的觀點。從第二幅圖中可以看出,點評文本中除了關(guān)注指數(shù)的同時還關(guān)注各個市場板塊的變化,同時從圖像正中間“創(chuàng)業(yè)板”這個詞可以看出最近比較受關(guān)注的板塊是創(chuàng)業(yè)板。除此之外,其他較小的詞中有“震蕩”“反彈”“回落”“走強”等詞語,也向我們展現(xiàn)了市場的震蕩行情。從上面的分析中可以看到,繪制詞云圖可以方便的提取出巨量文本中的關(guān)鍵詞以供我們分析解讀,是文本分析領(lǐng)域的一個強大方法。最后需要注意一點是,在制作詞云圖時,有更加準(zhǔn)確且自定義化的方法——使用WordCloud中的generate_from_frequencies()函數(shù)。其根據(jù)給定的詞頻或是關(guān)鍵詞權(quán)重來繪制詞云,該函數(shù)適用于已知詞及其對應(yīng)的詞頻是多少,不需要自動生成的情況,這種方法可操作空間更大,在有些情景下可以更加方便的定義想要繪制的詞云圖。generate_from_frequencies()函數(shù)需要傳入一個字典形式,字典結(jié)構(gòu)為詞和詞頻(權(quán)重)的鍵值對,例如:{word1:fre1,word2:fre2,,wordn:fren}。generate_from_frequencies()函數(shù)結(jié)合jieba.analyse模塊可以用更少的代碼邏輯,方便地繪制出詞云圖。這種繪制方式交給讀者自己實現(xiàn)。第七章BUSINESSPLANFORWORK謝謝觀看“Python數(shù)據(jù)采集與預(yù)處理第八章房產(chǎn)數(shù)據(jù)預(yù)處理“Python數(shù)據(jù)采集與預(yù)處理目錄CONTENTS研究背景和目標(biāo)分析8.1數(shù)據(jù)描述與探索8.2數(shù)據(jù)預(yù)處理8.3學(xué)習(xí)目標(biāo)掌握計算屬性間相關(guān)性方法掌握對缺失值數(shù)據(jù)處理方法掌握對離散數(shù)據(jù)進行觀察和處理操作掌握對非正態(tài)分布數(shù)據(jù)進行糾偏操作掌握Box-Cox的變換和反變換操作研究背景和目標(biāo)分析018.1研究背景和目標(biāo)分析研究背景對于當(dāng)代的年輕人來說,尤其是對剛畢業(yè)的年輕人,租房幾乎成為了一種剛需,然而租房并不是一種長遠之策,購買屬于自己的房產(chǎn)是更加明智的選擇。因此房產(chǎn)價格將會持續(xù)的成為人們關(guān)注的焦點,并且針對房屋價格的分析和預(yù)測研究也會層出不窮?;谝陨媳尘?,本講將會針對一套完整的國外房價數(shù)據(jù)集進行分析并可視化,帶領(lǐng)讀者尋找數(shù)據(jù)中的規(guī)律,探究如何合理構(gòu)造模型將會用到的特征數(shù)據(jù)。目標(biāo)分析本章中使用的數(shù)據(jù)是來自kaggle上的國外房屋價格公開數(shù)據(jù)集。打開本書配套資料中的房價數(shù)據(jù)集csv文件可以看到如圖所示具體的內(nèi)容。8.1研究背景和目標(biāo)分析準(zhǔn)備工作在開始工作之前,我們需要導(dǎo)入所需的Python三方庫,如以下代碼所示。本章的所有工作都在jupyternotebook上完成。importwarnings#過濾一些不影響代碼運行的警告warnings.filterwarnings('ignore')fromscipyimportstatsimportnumpyasnpimportpandasaspdimportseabornassnsimportmatplotlib.pyplotasplt#該語句功能是可以內(nèi)嵌繪圖,并可省略plt.show()這一步,但在jupyter中可有可無%matplotlibinline數(shù)據(jù)描述與探索028.2數(shù)據(jù)描述與探索數(shù)據(jù)讀取讀取后的數(shù)據(jù)展示如圖所示,可以看到數(shù)據(jù)字段非常多,并且具有大量空值,此外“Id”和索引重復(fù),均按序記錄了行數(shù),后面視需求可以選擇刪除。同時左下角為我們展示了整個數(shù)據(jù)一共有1460條,每條數(shù)據(jù)有81個字段。#讀取全部數(shù)據(jù)train_datatrain_data=pd.read_csv('D:/Anaconda3/jupyter_work/house-prices/train.csv',encoding='utf-8')train_data查看列名由于字段太多,為了更加清晰的觀察所有字段,將列名如下單獨列出,結(jié)果如下圖所示。在如此多的字段中如何提取出重要的信息呢?既然是研究銷售價格的規(guī)律,則必然要尋找這些字段中哪些和銷售價格聯(lián)系最緊密,這也是之后預(yù)處理工作中需要完成的目標(biāo)。#顯示所有列名稱train_data.columns查看缺失值在第一個步驟中我們已經(jīng)初步發(fā)現(xiàn)了數(shù)據(jù)集中存在很多缺失值,但具體是哪些字段具有數(shù)據(jù)缺失需要找出來,方便后續(xù)的預(yù)處理工作。代碼如下所示,缺失值字段如右圖所示。#統(tǒng)計所有列的缺失值is_null=train_data.isnull().sum()is_null[is_null!=0]8.2數(shù)據(jù)描述與探索查看信息描述使用info()函數(shù)和describe()函數(shù)可以查看Dataframe中的整體描述和數(shù)學(xué)統(tǒng)計信息。對整體數(shù)據(jù)使用info()函數(shù)可以看到不同字段內(nèi)容數(shù)據(jù)類型已經(jīng)對應(yīng),不用再進行數(shù)據(jù)類型轉(zhuǎn)換,其部分結(jié)果如左圖所示;對“SalePrice”字段使用describe()函數(shù)可以看到所有房屋銷售價格的數(shù)學(xué)統(tǒng)計結(jié)果,結(jié)果如右圖所示。#查看describe和info信息print(train_data['SalePrice'].describe())print(train_())8.2數(shù)據(jù)描述與探索查看價格是否正態(tài)分布在機器學(xué)習(xí)中,許多模型對具有正態(tài)分布的數(shù)據(jù)訓(xùn)練效果更好,學(xué)習(xí)速度更快,并且正態(tài)分布數(shù)據(jù)的泛化性更高,因為自然界很多事物的概率密度大多是正態(tài)分布的。此外從目標(biāo)分布來說,非正態(tài)分布會導(dǎo)致標(biāo)簽數(shù)據(jù)的損失值出現(xiàn)誤導(dǎo),或許結(jié)果看著很小,但實際結(jié)果很大。尤其在回歸問題上,對正態(tài)分布的數(shù)據(jù)有著較高的要求。檢查目標(biāo)變量是否滿足正態(tài)分布一般有三種常用方法:直方圖、KDE分布圖、Q-Q圖。直方圖和KDE分布圖可以比較直觀的看出數(shù)據(jù)樣本本身的分布特征,推薦使用seaborn中的distplot()函數(shù),它的主要功能是繪制單變量的直方圖,且還可以在直方圖的基礎(chǔ)上加入kdeplot和rugplot的部分內(nèi)容,是一個功能非常強大且實用的函數(shù)。Q-Q圖則推薦使用scipy中的proplot()函數(shù)來繪制。8.2數(shù)據(jù)描述與探索查看價格是否正態(tài)分布#設(shè)置圖像大小與清晰度plt.figure(figsize=(10,6),dpi=150)#設(shè)置子圖間的間距等條件plt.subplots_adjust(left=None,bottom=None,right=None,top=None,wspace=0.1,hspace=0.4)#繪制第一個子圖plt.subplot(211)plt.title('PriceDistribution')#銷售價格的數(shù)量分布曲線sns.distplot(train_data['SalePrice'],hist=True,kde=True,rug=False)#繪制第二個子圖plt.subplot(212)#繪制Q-Q圖bplot(train_data['SalePrice'],plot=plt)plt.title("PriceDistribution")plt.show()8.2數(shù)據(jù)描述與探索查看價格是否正態(tài)分布從上面的圖中可以看出,銷售價格并沒有嚴格呈現(xiàn)正態(tài)分布,雖然類似于正態(tài)分布的形狀,但是在圖像右方數(shù)據(jù)有很大的偏度,這種情況稱為偏態(tài)分布。偏態(tài)分布是指頻數(shù)分布不對稱,集中位置偏向一側(cè)。若集中位置偏向數(shù)值小的一側(cè),稱為正(右)偏態(tài)分布;集中位置偏向數(shù)值大的一側(cè),稱為負(左)偏態(tài)分布。與正態(tài)分布相對而言,偏態(tài)分布有兩個特點:①左右不對稱(即所謂偏態(tài))②當(dāng)樣本增大時,其均數(shù)趨向正態(tài)分布?;谝陨咸攸c,在后續(xù)的預(yù)處理工作中,則需要調(diào)整目標(biāo)數(shù)據(jù)至正態(tài)分布。8.2數(shù)據(jù)描述與探索數(shù)據(jù)預(yù)處理038.3數(shù)據(jù)預(yù)處理屬性規(guī)約由于數(shù)據(jù)集中數(shù)據(jù)字段數(shù)量過于龐大,雜亂的屬性特別多,有必要先進行合理的數(shù)據(jù)屬性規(guī)約,提取出關(guān)聯(lián)度高,有明顯線性關(guān)系的屬性特征來進行后續(xù)的數(shù)據(jù)預(yù)處理。那么在如此多的屬性字段中如何找尋與銷售價格高度關(guān)聯(lián),有重要影響作用的屬性呢?我們可以使用關(guān)聯(lián)矩陣來判斷不同屬性間的關(guān)聯(lián)性,而關(guān)聯(lián)矩陣可以使用熱度圖(Heatmap)來表達各個特征之間的關(guān)聯(lián)程度。繪制熱度圖一般使用seaborn中的heatmap()函數(shù),而我們的繪制依據(jù)是數(shù)據(jù)相關(guān)性分析中常用到的corr()函數(shù),該函數(shù)計算了不同變量之間的相關(guān)性,取值范圍為[-1,1],取值接近-1,表示反相關(guān),類似反比例函數(shù),取值接近1,表正相關(guān)。函數(shù)默認使用皮爾遜(Pearson)標(biāo)準(zhǔn)相關(guān)系數(shù)來進行相關(guān)系數(shù)的計算。此外,由于特征字段過多,我們繪圖時提前做出篩選,只展示前十個由最高相關(guān)性的特征。使用nlargest()函數(shù)可以指定以某列為基準(zhǔn)以降序方式返回前n個最大值的列,我們利用其來顯示和SalePrice高度相關(guān)的十個特征所共同構(gòu)成的關(guān)系矩陣。屬性規(guī)約k=10#關(guān)系矩陣中將顯示10個特征plt.figure(figsize=(7,7),dpi=100)corrmat=train_data.corr()#計算相關(guān)系數(shù)#顯示和saleprice相近的十個關(guān)系變量矩陣,#nlargest()是輸出最大相關(guān)排序,排完了之后選取salprice列的索引cols=corrmat.nlargest(k,'SalePrice')['SalePrice'].index#根據(jù)排好序的cols來生成Pearson相關(guān)系數(shù)矩陣cm=np.corrcoef(train_data[cols].values.T)sns.set(font_scale=1.25)#繪制熱力圖hm=sns.heatmap(cm,cbar=True,annot=True,square=True,fmt='.2f',annot_kws={'size':10},yticklabels=cols.values,xticklabels=cols.values)plt.show()8.3數(shù)據(jù)預(yù)處理屬性規(guī)約8.3數(shù)據(jù)預(yù)處理利用前面的操作我們獲得了十個與銷售價格SalePrice最相關(guān)的特征,將這十個特征與SalePrice的相關(guān)性以水平條形圖繪制出,在DataFrame的plot()函數(shù)中設(shè)置kind參數(shù)為barh既可以調(diào)整繪制的水平條形圖,繪制結(jié)果如所示,代碼如下所示。plt.figure(figsize=(12,6),dpi=150)#計算相關(guān)系數(shù)矩陣后進行排序,在排好序的結(jié)果基礎(chǔ)上進行繪圖train_data.corr()['SalePrice'][cols].sort_values(ascending=False).plot(kind='barh',figsize=(12,6),title='VariableCorrelationwithSalePrice')屬性規(guī)約8.3數(shù)據(jù)預(yù)處理為了進一步縮小特征變量的范圍,通過觀察上圖,決定保留相關(guān)性在0.6以上的屬性。所以最終所選取的特征為:SalePrice(銷售價格)、OverallQual(房屋整體材料和質(zhì)量)、GrLivArea(可居住面積)、GarageCars(車庫可容納車輛)、GarageArea(車庫面積)、TotalBsmtSF(全部地下室面積)、1stFlrSF(一樓面積大?。?。#選取前七個與銷售價格相關(guān)性最高的字段(包括了SalePrice)feature_data=train_data[cols[:7]]feature_data缺失值處理8.3數(shù)據(jù)預(yù)處理在本章中針對于重復(fù)值本數(shù)據(jù)集不進行處理,因為不同于客戶信息等類型的數(shù)據(jù),房屋信息允許有重復(fù)值的出現(xiàn)。對缺失值進行處理我們使用代碼檢查屬性規(guī)約中提取出的特征列,發(fā)現(xiàn)沒有數(shù)據(jù)缺失,這從某種層面上也證明了所選取特征的重要性。(往往越不重要的屬性字段會出現(xiàn)越多的缺失值)為了作為示例,我們針對其他有代表性的列進行缺失值填充。通過代碼觀察下數(shù)據(jù)集中的數(shù)據(jù)缺失情況。#統(tǒng)計train_data中的缺失值train_data[cols].isnull().sum()#統(tǒng)計所有列缺失值并排序total=train_data.isnull().sum().sort_values(ascending=False)#計算缺失比率percent=(train_data.isnull().sum()/train_data.isnull().count())\.sort_values(ascending=False)missing_data=pd.concat([total,percent],axis=1,keys=['Total','Percent'])missing_data.head(15)缺失值處理8.3數(shù)據(jù)預(yù)處理從右圖數(shù)據(jù)中可以看到,前五行所展示的屬性列中缺失值都達到了15%以上,則這五列字段完全可以視作無效數(shù)據(jù)刪除。針對其他缺失數(shù)據(jù)列,主要分三種情況填充,分別為中位數(shù)填充、眾數(shù)填充、None值填充。以LotFrontage(到街道的距離)為例,我們選擇使用中位數(shù)填充而不用均值,因為某些比較大或比較小的特殊值可能會使均值無法更好地反映平均數(shù)值,所以這里選用中位數(shù)更加好。以GarageType(車庫類型)和MasVnrArea(砌體面積)為例,這兩個字段在實際情境中確實可能是沒有內(nèi)容或者是難以統(tǒng)計,所以在不曲解原數(shù)據(jù)的原則上我們可以根據(jù)實際情況補全None或0值。以Electrical(電力系統(tǒng))和KitchenQual(廚房品質(zhì))為例,這兩個字段代表內(nèi)容在實際住房情景中都是不可或缺且方便統(tǒng)計的,并且和前面的街道距離所不同的是,這兩個字段內(nèi)容都是離散的選項,并非分布具有連續(xù)性的數(shù)值,所以不能使用中位數(shù)或者均值,而應(yīng)該使用眾數(shù)來填充。缺失值處理8.3數(shù)據(jù)預(yù)處理以上情況填充代碼如下:#到街道的距離train_data['LotFrontage']=train_data.groupby('Neighborhood')['LotFrontage'].transform(lambdax:x.fillna(x.median()))#車庫和砌體部分字段train_data['GarageType']=train_data['GarageType'].fillna('None')train_data['MasVnrArea']=train_data['MasVnrArea'].fillna(0)#電力系統(tǒng)和廚房品質(zhì)train_data['Electrical']=train_data['Electrical'].fillna(train_data['Electrical'].mode()[0])train_data['KitchenQual']=train_data['KitchenQual'].fillna(train_data['KitchenQual'].mode()[0])異常值處理8.3數(shù)據(jù)預(yù)處理針對異常值的處理,我們使用直方圖和散點圖來結(jié)合觀察。首先繪制所選的特征列的直方統(tǒng)計圖。從圖中我們可以看到,與銷售價格相關(guān)的六個特征中,除了離散型分布的變量外,連續(xù)型分布的數(shù)據(jù)中都存在著小部分的離群點,這些離群點由于過于偏離而可以被視作異常值刪除。其次,具體應(yīng)不應(yīng)該刪除或是要如何刪除這些離群點,我們還需要繪制散點圖,以此來更加詳細的觀察數(shù)據(jù)特點。#選取除SalePrice以外的所有列來繪制直方圖feature_data.iloc[:,1:].hist(figsize=(20,15),bins=50,grid=False,color='red')plt.show()異常值處理8.3數(shù)據(jù)預(yù)處理直方圖繪制結(jié)果。異常值處理8.3數(shù)據(jù)預(yù)處理plt.figure(figsize=(14,10),dpi=200)plt.subplots_adjust(left=None,bottom=None,right=None,top=None,wspace=0.3,hspace=0.3)#繪制第一個散點子圖plt.subplot(221)plt.scatter(x=train_data['GrLivArea'],y=train_data['SalePrice'],color='red',edgecolor='black')plt.title('GrLivArea',fontsize=15)#繪制第二個散點子圖plt.subplot(222)plt.scatter(x=train_data['1stFlrSF'],y=train_data['SalePrice'],color='green',edgecolor='black')plt.title('1stFlrSF',fontsize=15)異常值處理8.3數(shù)據(jù)預(yù)處理#繪制第三個散點子圖plt.subplot(223)plt.scatter(x=train_data['GarageArea'],y=train_data['SalePrice'],color='yellow',edgecolor='black')plt.title('GarageArea',fontsize=15)#繪制第四個散點子圖plt.subplot(224)plt.scatter(x=train_data['TotalBsmtSF'],y=train_data['SalePrice'],color='blue',edgecolor='black')plt.title('TotalBsmtSF',fontsize=15)plt.show()異常值處理8.3數(shù)據(jù)預(yù)處理通過觀察散點圖的的分布情況,可以看到GrLivArea與1stFlrSF在大于4000處都有明顯的離群點,我們可以將其刪去;GarageArea和TotalBsmtSF分別在大于1200和4000處有離群點,可以將其刪除。刪除前和刪除后的散點圖,分別如左圖和右圖所示。數(shù)據(jù)轉(zhuǎn)換8.3數(shù)據(jù)預(yù)處理由前面小節(jié)中的內(nèi)容可以知道,我們的目標(biāo)數(shù)據(jù)并不服從完全的正態(tài)分布,而是一種具有偏尾的偏態(tài)分布。為了解決這一問題,從而將SalePrice數(shù)據(jù)映射為正態(tài)分布,需要利用函數(shù)變換的手段來調(diào)整數(shù)據(jù),進行目標(biāo)數(shù)據(jù)糾偏。廣義上說,如果我們有一個樣本量為n的樣本yi(i=1,2,3,…,n),數(shù)據(jù)變換指的就是選擇某個函數(shù)f(x),將其作用在樣本上,得到新的樣本f(yi)的過程。在本節(jié)中,我們的變換函數(shù)的任務(wù)就是要把樣本分布偏出來的“尾巴”給縮回去。數(shù)據(jù)轉(zhuǎn)換8.3數(shù)據(jù)預(yù)處理在Pandas中有skew()方法來表示偏態(tài),大于0右偏,小于0左偏。在pandas中使用kurtosis()方法來表示峰度,kurtosis>0,尖峰態(tài)(leptokurtic),數(shù)據(jù)集比較分散,極端數(shù)值較多。kurtosis<0,低峰態(tài)(platykurtic),數(shù)據(jù)集比較集中,兩側(cè)的數(shù)據(jù)比較少。下面代碼計算了偏態(tài)和峰度,結(jié)果偏度Skewness為1.882876,峰度Kurtosis為6.536282。由此可見目標(biāo)數(shù)據(jù)右偏,并且為尖峰態(tài)。#計算偏態(tài)和峰度print("Skewness:%f"%train_data['SalePrice'].skew())print("Kurtosis:%f"%train_data['SalePrice'].kurt())數(shù)據(jù)轉(zhuǎn)換8.3數(shù)據(jù)預(yù)處理通常來說,可以嘗試一下幾種方法:(1)如果數(shù)據(jù)高度偏態(tài),則使用對數(shù)變換。①對數(shù)變換,即將原始數(shù)據(jù)

溫馨提示

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

評論

0/150

提交評論