《Python與數(shù)據(jù)科學(xué)》課件-二、分析編_第1頁
《Python與數(shù)據(jù)科學(xué)》課件-二、分析編_第2頁
《Python與數(shù)據(jù)科學(xué)》課件-二、分析編_第3頁
《Python與數(shù)據(jù)科學(xué)》課件-二、分析編_第4頁
《Python與數(shù)據(jù)科學(xué)》課件-二、分析編_第5頁
已閱讀5頁,還剩142頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

本編主要內(nèi)容Python數(shù)據(jù)獲取與數(shù)據(jù)預(yù)處理

利用Python進(jìn)行數(shù)據(jù)分析3Python數(shù)據(jù)獲取與數(shù)據(jù)預(yù)處理華東師范大學(xué)出版社(1)從鍵盤、文本文件、Office文件獲取數(shù)據(jù)每種語言獲取數(shù)據(jù)最基本的方式往往都是通過用戶輸入從鍵盤獲取,Python亦不例外。這里我們將介紹兩個(gè)很有用的內(nèi)置函數(shù)即raw_input和input。①從鍵盤獲取數(shù)據(jù)A用raw_input函數(shù)獲取數(shù)據(jù)3.1Python數(shù)據(jù)獲取>>>line=raw_input()GalapagosIsland>>>printlineGalapagosIsland>>>line=raw_input()123>>>printline123如果您希望用戶輸入一個(gè)數(shù)字,那么就必須用int或float將得到的字符串轉(zhuǎn)換為所需的類型:>>>value=raw_input()123>>>value=int(value)>>>printvalue*22463.1Python數(shù)據(jù)獲取而含有字母或下劃線的字符串是無法用int或float轉(zhuǎn)換成數(shù)字類型的:>>>value=float(raw_input())Galapagos

Traceback(mostrecentcalllast):File"<pyshell#13>",line1,in<module>value=float(raw_input())ValueError:couldnotconvertstringtofloat:Galapagos3.1Python數(shù)據(jù)獲取此外,raw_input還可以接收一個(gè)字符串參數(shù),該參數(shù)將用于對(duì)用戶進(jìn)行提示:>>>name=raw_input('Pleaseenteraname:')Pleaseenteraname:Darwin>>>printnameDarwin3.1Python數(shù)據(jù)獲取B用input函數(shù)獲取數(shù)據(jù)raw_input是把讀入的數(shù)據(jù)轉(zhuǎn)換成字符串;而input是把讀入的數(shù)據(jù)默認(rèn)為Python表達(dá)式。其實(shí),這兩個(gè)函數(shù)均能接收字符串,但raw_input直接讀取控制臺(tái)的輸入(任何類型的輸入它都可以接收)。而對(duì)于input,直接輸入字符串會(huì)引發(fā)報(bào)錯(cuò)。3.1Python數(shù)據(jù)獲取>>>line=input()GalapagosIslandTraceback(mostrecentcalllast):File"<pyshell#18>",line1,in<module>line=input()File"<string>",line1GalapagosIslandSyntaxError:unexpectedEOFwhileparsing>>>line=input()'GalapagosIsland'>>>printlineGalapagosIsland3.1Python數(shù)據(jù)獲取A用open函數(shù)獲取文件內(nèi)容為了從一個(gè)文件中讀取數(shù)據(jù),我們必須先將其打開(利用Python的內(nèi)置函數(shù)open):代碼如下:其中:第一個(gè)參數(shù)是文件名稱,包括路徑;第二個(gè)參數(shù)是打開的模式mode'r':只讀(缺省。如果文件不存在,則拋出錯(cuò)誤)'w':只寫(如果文件不存在,則自動(dòng)創(chuàng)建文件)'a':附加到文件末尾'r+':讀寫如果需要以二進(jìn)制方式打開文件,需要在mode后面加上字符"b",比如"rb""wb"等②從文本文件獲取數(shù)據(jù)f=open("d:\test.txt","r")3.1Python數(shù)據(jù)獲取讀取數(shù)據(jù):f.read(size)參數(shù)size表示讀取的數(shù)量,可以省略。如果省略size參數(shù),則表示讀取文件所有內(nèi)容。f.readline()讀取文件一行的內(nèi)容f.readlines()讀取所有的行到數(shù)組里面[line1,line2,...lineN]。在避免將所有文件內(nèi)容加載到內(nèi)存中,這種方法常常使用,便于提高效率。3.1Python數(shù)據(jù)獲取示例:上面的代碼則會(huì)把第一行的數(shù)據(jù)打印在編譯器中,如果想要打印出所有的數(shù)據(jù),則需要使用readlines()。3.1Python數(shù)據(jù)獲取file=open('C:\Test\data0102.txt','r')line=file.readline()printlinefile.close()file=open('C:\Test\data0102.txt','r')lines=file.readlines()forlineinlines:line=line.strip()printlinefile.close()在執(zhí)行完畢之后,為了安全起見,最好還是給打開的文件對(duì)象指定一個(gè)名字,這樣在完成操作之后可以迅速關(guān)閉文件,防止一些無用的文件對(duì)象占用內(nèi)存。除非要讀取的文件非常巨大,不然一次性讀出所有內(nèi)容放進(jìn)內(nèi)存并進(jìn)一步處理是最快和最方便的辦法。3.1Python數(shù)據(jù)獲取B用linecache模塊獲取指定行的內(nèi)容與open函數(shù)不同,使用linecache模塊可以進(jìn)行緩存優(yōu)化,日常編程中涉及讀取大文件,可以提高讀取文件的效率。如果我們要從一個(gè)文件中讀取其第2行數(shù)據(jù):引入linecache模塊,該模塊允許使用getline(filename,lineno)函數(shù)從任意文件里得到任意的行;使用getlines(filename)函數(shù)從文件中得到全部?jī)?nèi)容,輸出為列表格式。使用clearcache()函數(shù)清除緩存。3.1Python數(shù)據(jù)獲取importlinecacheprintlinecache.getline('C:\Test\data0102.txt',2)③從Microsoft軟件的文檔中獲取數(shù)據(jù)A從MicrosoftWord獲取數(shù)據(jù)要先下載安裝win32com包,下載地址:/projects/pywin32/files/;其次,加載包,創(chuàng)建對(duì)象實(shí)例;再次,打開并輸出Word文件(例如Word文件010301.doc);最后,關(guān)閉文檔。代碼如下:fromwin32comimportclient#從win32com包引入client包word=client.Dispatch('Word.Application')#創(chuàng)建對(duì)象實(shí)例doc=word.Documents.Open(r'C:\Test\data010301.doc')#打開printdoc.content#打印doc.Close()#關(guān)閉word.Quit()3.1Python數(shù)據(jù)獲取B從MicrosoftExcel獲取數(shù)據(jù)從MicrosoftExcel獲取數(shù)據(jù),有多種途徑和方式,我們將分別介紹以下4種:1、查看所有標(biāo)簽的名稱;2、獲取行數(shù)和列數(shù);3、獲取整行或整列的值,4、獲取特定單元格內(nèi)的值。首先,要先下載安裝xlrd包,下載地址:/pypi/xlrd;其次,加載包;然后,打開Excel文件010302.xls(可以用自己的excel文件),按照以下代碼運(yùn)行:#導(dǎo)入模塊importxlrd#打開excel#data=xlrd.open_workbook('excelFile.xls')data=xlrd.open_workbook('C:\Test\data010302.xls')#1.查看并打印文件中包含sheet的名稱sheet_names=data.sheet_names()print"sheetnames:",sheet_names#通過索引順序獲取table=data.sheet_by_index(0)3.1Python數(shù)據(jù)獲取#2.獲取第一張工作表的行數(shù)和列數(shù)nrows=table.nrowsprint"rowsnumber:",nrowsncols=table.ncolsprint"colsnumber:",ncols#3.分別獲取第一張工作表的第2行和第2列的值(數(shù)組)print"Thevalueofthe2ndrow:",table.row_values(2)print"Thevalueofthe2ndcol:",table.col_values(2)#4.分別獲取特定單元格的值print"Thevalueofthe1strowofthe1stcol:",table.cell_value(0,0)print"Thevalueofthe1strowofthe2stcol:",table.cell_value(0,1)運(yùn)行結(jié)果如下:sheetnames:[u'Sheet1',u'Sheet2',u'Sheet3']rowsnumber:3colsnumber:3Thevalueofthe2ndrow:[u'g',u'h',u'i']Thevalueofthe2ndcol:[u'c',u'f',u'i']Thevalueofthe1strowofthe1stcol:aThevalueofthe1strowofthe2stcol:b3.1Python數(shù)據(jù)獲?、茝臄?shù)據(jù)庫獲取數(shù)據(jù)Python標(biāo)準(zhǔn)數(shù)據(jù)庫接口為PythonDB-API,PythonDB-API為開發(fā)人員提供了數(shù)據(jù)庫應(yīng)用編程接口。Python數(shù)據(jù)庫接口支持非常多的數(shù)據(jù)庫,你可以選擇適合你項(xiàng)目的數(shù)據(jù)庫:GadFly、mSQL、MySQL、PostgreSQL、MicrosoftSQLServer、Informix、Interbase、Oracle、Sybase不同的數(shù)據(jù)庫你需要下載不同的DBAPI模塊,例如你需要訪問Oracle數(shù)據(jù)庫和Mysql數(shù)據(jù),你需要下載Oracle和MySQL數(shù)據(jù)庫模塊。DB-API是一個(gè)規(guī)范.它定義了一系列必須的對(duì)象和數(shù)據(jù)庫存取方式,以便為各種各樣的底層數(shù)據(jù)庫系統(tǒng)和多種多樣的數(shù)據(jù)庫接口程序提供一致的訪問接口。Python的DB-API,為大多數(shù)的數(shù)據(jù)庫實(shí)現(xiàn)了接口,使用它連接各數(shù)據(jù)庫后,就可以用相同的方式操作各數(shù)據(jù)庫。3.1Python數(shù)據(jù)獲取PythonDB-API使用流程:a)引入API模塊。b)獲取與數(shù)據(jù)庫的連接。c)執(zhí)行SQL語句和存儲(chǔ)過程。d)關(guān)閉數(shù)據(jù)庫連接。DBAPI中定義了一些數(shù)據(jù)庫操作的錯(cuò)誤及異常,下表列出了這些錯(cuò)誤和異常:3.1Python數(shù)據(jù)獲取異常描述Warning當(dāng)有嚴(yán)重警告時(shí)觸發(fā),例如插入數(shù)據(jù)是被截?cái)嗟鹊?。必須是StandardError的子類。Error警告以外所有其他錯(cuò)誤類。必須是StandardError的子類。InterfaceError當(dāng)有數(shù)據(jù)庫接口模塊本身的錯(cuò)誤(而不是數(shù)據(jù)庫的錯(cuò)誤)發(fā)生時(shí)觸發(fā)。必須是Error的子類。DatabaseError和數(shù)據(jù)庫有關(guān)的錯(cuò)誤發(fā)生時(shí)觸發(fā)。必須是Error的子類。DataError當(dāng)有數(shù)據(jù)處理時(shí)的錯(cuò)誤發(fā)生時(shí)觸發(fā),例如:除零錯(cuò)誤,數(shù)據(jù)超范圍等等。必須是DatabaseError的子類。OperationalError指非用戶控制的,而是操作數(shù)據(jù)庫時(shí)發(fā)生的錯(cuò)誤。例如:連接意外斷開、數(shù)據(jù)庫名未找到、事務(wù)處理失敗、內(nèi)存分配錯(cuò)誤等等操作數(shù)據(jù)庫是發(fā)生的錯(cuò)誤。必須是DatabaseError的子類。IntegrityError完整性相關(guān)的錯(cuò)誤,例如外鍵檢查失敗等。必須是DatabaseError子類。InternalError數(shù)據(jù)庫的內(nèi)部錯(cuò)誤,例如游標(biāo)(cursor)失效了、事務(wù)同步失敗等等。必須是DatabaseError子類。ProgrammingError程序錯(cuò)誤,例如數(shù)據(jù)表(table)沒找到或已存在、SQL語句語法錯(cuò)誤、參數(shù)數(shù)量錯(cuò)誤等等。必須是DatabaseError的子類。NotSupportedError不支持錯(cuò)誤,指使用了數(shù)據(jù)庫不支持的函數(shù)或API等。例如在連接對(duì)象上使用.rollback()函數(shù),然而數(shù)據(jù)庫并不支持事務(wù)或者事務(wù)已關(guān)閉。必須是DatabaseError的子類。表3-1PythonDB-API操作異常代碼3.1Python數(shù)據(jù)獲取MicrosoftSQLServer2008是在Microsoft的數(shù)據(jù)平臺(tái)上發(fā)布的,在工作學(xué)習(xí)中十分常見好用且基礎(chǔ)易學(xué)的一種數(shù)據(jù)庫。我們常常需要從該數(shù)據(jù)庫中獲取數(shù)據(jù)。首先,要下載并安裝pymssql包,下載地址:/pypi/pymssql/2.1.1;其次,引入包;再次,執(zhí)行指定的SQL語句,讀取并打印master.dbo.spt_value中第一行的數(shù)據(jù);最后,關(guān)閉數(shù)據(jù)庫鏈接。使用pymssql.connect()來初始化創(chuàng)建一個(gè)數(shù)據(jù)庫連接,host是服務(wù)器的ip地址,如果是本機(jī)可以用“.”,user是訪問用戶名,password是密碼,database是數(shù)據(jù)庫名,比ADO的連接似乎簡(jiǎn)單一些。conn=pymssql.connect(host=".",user="sa",password="twinflag",database="bbs")①從MicrosoftSQLServer獲取數(shù)據(jù)3.1Python數(shù)據(jù)獲?、趶腗ySQL數(shù)據(jù)庫獲取數(shù)據(jù)MySQLdb是用于Python鏈接Mysql數(shù)據(jù)庫的接口,它實(shí)現(xiàn)了Python數(shù)據(jù)庫API規(guī)范V2.0,基于MySQLCAPI上建立的。首先,安裝MySQL-python,下載地址:/pypi/MySQL-python/,下載MySQL-python-1.2.5.zip文件之后直接解壓。進(jìn)入MySQL-python-1.2.5目錄,在DOS命令行下執(zhí)行:pythonsetup.pyinstall其次,測(cè)試安裝的模塊是否可以使用。測(cè)試非常簡(jiǎn)單,檢查MySQLdb模塊是否可以正常導(dǎo)入。

importMySQLdb沒有報(bào)錯(cuò)提示MySQLdb模塊找不到,說明安裝好了。在使用python操作數(shù)據(jù)庫之前,讀者最好要掌握mysql的基本操作。3.1Python數(shù)據(jù)獲取importMySQLdb#打開數(shù)據(jù)庫連接db=MySQLdb.connect("localhost","testuser","test123","TESTDB")#使用cursor()方法獲取操作游標(biāo)cursor=db.cursor()#使用execute方法執(zhí)行SQL語句cursor.execute("SELECTVERSION()")#使用fetchone()方法獲取一條數(shù)據(jù)庫。data=cursor.fetchone()print"Databaseversion:%s"%data#關(guān)閉數(shù)據(jù)庫連接db.close()以下實(shí)例鏈接Mysql的TESTDB數(shù)據(jù)庫,請(qǐng)讀者對(duì)照自己的數(shù)據(jù)庫進(jìn)行相關(guān)的修改3.1Python數(shù)據(jù)獲?、蹚腗ongoDB獲取數(shù)據(jù)MongoDB是一個(gè)面向文檔的數(shù)據(jù)庫,是目前非常流行的一種非關(guān)系型數(shù)據(jù)庫(NoSql),mongodb中有三元素:數(shù)據(jù)庫,集合,文檔,其中“集合”就是對(duì)應(yīng)關(guān)系數(shù)據(jù)庫中的“表”,“文檔”對(duì)應(yīng)“行”。Python來開發(fā)MongoDB程序需要安裝pymongo。首先運(yùn)行easy_installpymongo命令安裝pymongo。然后執(zhí)行操作:A創(chuàng)建連接創(chuàng)建Connection時(shí),指定host及port參數(shù)(假設(shè)你是默認(rèn)安裝在本機(jī)):frompymongoimportMongoClientconn=MongoClient.Connection(host='',port=27017)B連接數(shù)據(jù)庫(假設(shè)數(shù)據(jù)庫為ChatRoom,有一個(gè)集合是Account)db=conn.ChatRoom或db=conn['ChatRoom']C連接集合account=db.Account或account=db["Account"]3.1Python數(shù)據(jù)獲取D查看全部集合名稱db.collection_names()E查看集合的一條記錄db.Account.find_one()db.Account.find_one({"UserName":"keyword"})F查看聚集的字段>>>db.Account.find_one({},{"UserName":1,"Email":1}){u'UserName':u'libing',u'_id':ObjectId('4ded95c3b7780a774a099b7c'),u'Email':u'libing@35.cn'}>>>db.Account.find_one({},{"UserName":1,"Email":1,"_id":0}){u'UserName':u'libing',u'Email':u'libing@35.cn'}G查看聚集的多條記錄>>>foritemindb.Account.find():item>>>foritemindb.Account.find({"UserName":"libing"}):item["UserName"]H查看聚集的記錄統(tǒng)計(jì)>>>db.Account.find().count()>>>db.Account.find({"UserName":"keyword"}).count()3.1Python數(shù)據(jù)獲?、菑幕ヂ?lián)網(wǎng)上獲取數(shù)據(jù)爬蟲,即網(wǎng)絡(luò)爬蟲,網(wǎng)絡(luò)爬蟲(又被稱為網(wǎng)頁蜘蛛,網(wǎng)絡(luò)機(jī)器人,在FOAF社區(qū)中間,更經(jīng)常的稱為網(wǎng)頁追逐者),是一種按照一定的規(guī)則,自動(dòng)的抓取萬維網(wǎng)信息的程序或者腳本。I聚集查詢結(jié)果排序>>>db.Account.find().sort("UserName")--默認(rèn)為升序>>>db.Account.find().sort("UserName",pymongo.ASCENDING)--升序>>>db.Account.find().sort("UserName",pymongo.DESCENDING)--降序J聚集查詢結(jié)果多列排序>>>db.Account.find().sort([("UserName",pymongo.ASCENDING),("Email",pymongo.DESCENDING)])3.1Python數(shù)據(jù)獲?、凫o態(tài)網(wǎng)頁的抓取在網(wǎng)站設(shè)計(jì)中,純粹HTML(標(biāo)準(zhǔn)通用標(biāo)記語言下的一個(gè)應(yīng)用)格式的網(wǎng)頁通常被稱為“靜態(tài)網(wǎng)頁”,靜態(tài)網(wǎng)頁是標(biāo)準(zhǔn)的HTML文件,它的文件擴(kuò)展名是.htm、.html,可以包含文本、圖像、聲音、FLASH動(dòng)畫、客戶端腳本和ActiveX控件及JAVA小程序等。靜態(tài)網(wǎng)頁是網(wǎng)站建設(shè)的基礎(chǔ),早期的網(wǎng)站一般都是由靜態(tài)網(wǎng)頁制作的。靜態(tài)網(wǎng)頁是相對(duì)于動(dòng)態(tài)網(wǎng)頁而言,是指沒有后臺(tái)數(shù)據(jù)庫、不含程序和不可交互的網(wǎng)頁。靜態(tài)網(wǎng)頁相對(duì)更新起來比較麻煩,適用于一般更新較少的展示型網(wǎng)站。在python中,自帶的模塊urllib以及urllib也可以對(duì)靜態(tài)網(wǎng)頁進(jìn)行抓取,但是由于效率的原因,在此不做考慮,而是利用第三方模塊requests來對(duì)網(wǎng)頁進(jìn)行抓取,并將抓取到的數(shù)據(jù)以需要的格式保存到excel中。背景:抓取泡泡網(wǎng)的顯示器論壇某一品牌的帖子的信息,如發(fā)帖人,發(fā)帖時(shí)間,回復(fù)數(shù),瀏覽數(shù)等等。網(wǎng)址:/forum-30-1.htmlA安裝模塊,所需模塊為:requests,lxml,xlwtB抓取帖子標(biāo)題中有優(yōu)派兩個(gè)字的帖子的信息

(具體代碼見書上84-87頁)3.1Python數(shù)據(jù)獲?、趧?dòng)態(tài)網(wǎng)頁的抓取與靜態(tài)網(wǎng)頁相對(duì)的則是動(dòng)態(tài)網(wǎng)頁。所謂的動(dòng)態(tài)網(wǎng)頁,是指跟靜態(tài)網(wǎng)頁相對(duì)的一種網(wǎng)頁編程技術(shù)。靜態(tài)網(wǎng)頁,隨著html代碼的生成,頁面的內(nèi)容和顯示效果就基本上不會(huì)發(fā)生變化了——除非你修改頁面代碼。而動(dòng)態(tài)網(wǎng)頁則不然,頁面代碼雖然沒有變,但是顯示的內(nèi)容卻是可以隨著時(shí)間、環(huán)境或者數(shù)據(jù)庫操作的結(jié)果而發(fā)生改變的。值得強(qiáng)調(diào)的是,不要將動(dòng)態(tài)網(wǎng)頁和頁面內(nèi)容是否有動(dòng)感混為一談。這里說的動(dòng)態(tài)網(wǎng)頁,與網(wǎng)頁上的各種動(dòng)畫、滾動(dòng)字幕等視覺上的動(dòng)態(tài)效果沒有直接關(guān)系,動(dòng)態(tài)網(wǎng)頁也可以是純文字內(nèi)容的,也可以是包含各種動(dòng)畫的內(nèi)容,這些只是網(wǎng)頁具體內(nèi)容的表現(xiàn)形式,無論網(wǎng)頁是否具有動(dòng)態(tài)效果,只要是采用了動(dòng)態(tài)網(wǎng)站技術(shù)生成的網(wǎng)頁都可以稱為動(dòng)態(tài)網(wǎng)頁??傊瑒?dòng)態(tài)網(wǎng)頁是基本的html語法規(guī)范與Java、VB、VC等高級(jí)程序設(shè)計(jì)語言、數(shù)據(jù)庫編程等多種技術(shù)的融合,以期實(shí)現(xiàn)對(duì)網(wǎng)站內(nèi)容和風(fēng)格的高效、動(dòng)態(tài)和交互式的管理。因此,從這個(gè)意義上來講,凡是結(jié)合了HTML以外的高級(jí)程序設(shè)計(jì)語言和數(shù)據(jù)庫技術(shù)進(jìn)行的網(wǎng)頁編程技術(shù)生成的網(wǎng)頁都是動(dòng)態(tài)網(wǎng)頁。3.1Python數(shù)據(jù)獲取由于動(dòng)態(tài)網(wǎng)頁是由JS動(dòng)態(tài)生成的,所以在此需要模擬瀏覽器。在python中selenium模塊以及Phantomjs插件。

Selenium是一個(gè)用于Web應(yīng)用程序測(cè)試的工具。Selenium測(cè)試直接運(yùn)行在瀏覽器中,就像真正的用戶在操作一樣。支持的瀏覽器包括IE、MozillaFirefox、Chrome等。PhantomJS是一個(gè)服務(wù)器端的JavaScriptAPI的WebKit。其支持各種Web標(biāo)準(zhǔn):DOM處理,CSS選擇器,JSON,Canvas,和SVG。安裝selenium模塊在此不在細(xì)說。Phantomjs則要到其官方網(wǎng)站/download.html,下載“Downloadphantomjs-1.9.0-windows.zip(7.1MB)”;隨后打開這個(gè)壓縮包,將phantomjs.exe這一個(gè)文件解壓到系統(tǒng)路徑所能找到的地方,如果之前已經(jīng)將“C:\Python27\Scripts”目錄添加入PATH之中,則可直接解壓到這個(gè)目錄。3.1Python數(shù)據(jù)獲?、蹖?shí)際案例背景:太平洋顯示器論壇的帖子的相關(guān)信息是由JS動(dòng)態(tài)生成的。網(wǎng)址:/diy/f300118.html?qq-pf-to=pcqq.group抓取字段:帖子類型、帖子類型鏈接、帖子標(biāo)題、帖子所在頁、帖子排名、帖子鏈接、帖子作者、帖子、發(fā)帖時(shí)間、帖子回復(fù)數(shù)、帖子瀏覽數(shù)、帖子回復(fù)ID、帖子回復(fù)時(shí)間代碼見書上88-91頁3.1Python數(shù)據(jù)獲?、全@取數(shù)據(jù)過程中的常見問題數(shù)據(jù)獲取常常會(huì)碰到很多問題,總結(jié)如下:第一,用戶輸入的數(shù)據(jù),用不同的模塊、函數(shù),在不同的模式下需要用戶輸入不同的格式的數(shù)據(jù)。需要在程序設(shè)計(jì)之初,做好準(zhǔn)備工作,提醒用戶注意輸入的格式。第二,數(shù)據(jù)源格式不通,要注意用不同的編碼處理。數(shù)據(jù)源格式常常各異,涉及不同的數(shù)值、貨比、時(shí)間、日期、分?jǐn)?shù),尤其是語言類型,需要用不同的方式處理。而中文編碼是最常見的問題,我們?cè)趯?shí)踐中一定要切實(shí)注意。第二,數(shù)據(jù)源版本、環(huán)境不同,常常引發(fā)數(shù)據(jù)無法獲取的問題。獲取數(shù)據(jù)的來源如數(shù)據(jù)庫、網(wǎng)絡(luò)接口等版本的不同,以及計(jì)算機(jī)系統(tǒng)版本、環(huán)境的不同,尤其是當(dāng)Python程序需要加載特定的包獲取數(shù)據(jù)時(shí),常常會(huì)碰到各種各樣的問題,這就需要我們耐心調(diào)試,可以通過各種途徑學(xué)習(xí)相應(yīng)的解決辦法,必要時(shí)也可以嘗試換不同的包或代碼獲取數(shù)據(jù),以及將數(shù)據(jù)源轉(zhuǎn)換成代碼可以獲取的版本等方法解決。第三,數(shù)據(jù)獲取量很大時(shí),注意選擇高效的獲取方式。當(dāng)數(shù)據(jù)獲取量很大時(shí),一方面,要注意選擇合適的模塊、函數(shù),否則不止影響計(jì)算速度,更甚可能造成電腦死機(jī)。另一方面,我們?cè)讷@取數(shù)據(jù)時(shí),需要根據(jù)項(xiàng)目的要求,靈活的選取可能有用的數(shù)據(jù)源。對(duì)于無用的數(shù)據(jù)源,可以放棄獲取,而不必拘泥于非要把整個(gè)數(shù)據(jù)庫、整張表、整個(gè)網(wǎng)站或整張網(wǎng)頁的數(shù)據(jù)都獲取到??傊?,除此之外,在數(shù)據(jù)獲取的實(shí)踐中還會(huì)碰到很多的、細(xì)小的、瑣碎的問題。我們要明白“千里之行,始于足下?!弊鳛閿?shù)據(jù)挖掘的第一步工作,難免會(huì)碰到很多困難,我們一定都要有耐心和信心,同時(shí)更要不是靈活的處理問題。

3.1Python數(shù)據(jù)獲取對(duì)于數(shù)據(jù)分析而言,數(shù)據(jù)是顯而易見的核心。但是并不是所有的數(shù)據(jù)都是有用的,大多數(shù)數(shù)據(jù)是參差不齊的,概念層次不清的,數(shù)量級(jí)不同的,這就給后續(xù)的數(shù)據(jù)分析和數(shù)據(jù)挖掘帶來了極大的麻煩,甚至導(dǎo)致錯(cuò)誤的結(jié)論。所以有必要對(duì)數(shù)據(jù)進(jìn)行預(yù)處理。數(shù)據(jù)預(yù)處理(Datapreprocessing)是指在對(duì)數(shù)據(jù)進(jìn)行數(shù)據(jù)挖掘以前,先對(duì)原始數(shù)據(jù)進(jìn)行必要的清洗、集成、轉(zhuǎn)換、離散和歸約等等一系列的處理工作,以達(dá)到挖掘算法進(jìn)行知識(shí)獲取研究所要求的最低規(guī)范和標(biāo)準(zhǔn)。通常數(shù)據(jù)預(yù)處理包含四個(gè)部分:數(shù)據(jù)清洗、數(shù)據(jù)集成、數(shù)據(jù)變換和數(shù)據(jù)規(guī)約。3.2Python數(shù)據(jù)預(yù)處理(1)數(shù)據(jù)清洗數(shù)據(jù)清洗指的是填充缺失數(shù)據(jù)、消除噪聲數(shù)據(jù)等操作,主要是通過分析“臟數(shù)據(jù)”的產(chǎn)生原因和存在形式,利用現(xiàn)有的數(shù)據(jù)挖掘手段和方法去清洗“臟數(shù)據(jù)”,將“臟數(shù)據(jù)”轉(zhuǎn)化為滿足數(shù)據(jù)質(zhì)量要求或應(yīng)用要求的數(shù)據(jù),從而提高數(shù)據(jù)集的質(zhì)量,滿足現(xiàn)階段數(shù)據(jù)分析的需求。①數(shù)據(jù)質(zhì)量從宏觀上說,數(shù)據(jù)質(zhì)量的研究目標(biāo)是確保正當(dāng)?shù)睦嫦嚓P(guān)者在正確的地點(diǎn)和時(shí)間,擁有正確格式的正確信息。目前,數(shù)據(jù)質(zhì)量的定義還沒有統(tǒng)一的形式。其中的一些定義如下:數(shù)據(jù)質(zhì)量指信息系統(tǒng)滿足模式和數(shù)據(jù)實(shí)例的一致性、正確性、完整性和最小性4個(gè)指標(biāo)的程度。數(shù)據(jù)質(zhì)量是數(shù)據(jù)適合使用的程度(Fitforuse)。數(shù)據(jù)質(zhì)量是數(shù)據(jù)滿足特定用戶期望的程度。數(shù)據(jù)質(zhì)量維度是數(shù)據(jù)質(zhì)量的特征,它們?yōu)槎攘亢凸芾頂?shù)據(jù)的質(zhì)量提供了一種途徑和標(biāo)準(zhǔn)。每一數(shù)據(jù)質(zhì)量維度需要不同的度量工具。3.2Python數(shù)據(jù)預(yù)處理數(shù)據(jù)質(zhì)量主要有如下10個(gè)維度:數(shù)據(jù)規(guī)范(Dataspecification):對(duì)數(shù)據(jù)標(biāo)準(zhǔn)、數(shù)據(jù)模型、業(yè)務(wù)規(guī)則、元數(shù)據(jù)和參考數(shù)據(jù)進(jìn)行有關(guān)存在性、完整性、質(zhì)量及歸檔的測(cè)量標(biāo)準(zhǔn);數(shù)據(jù)完整性準(zhǔn)則(Dataintegrityfundamentals):對(duì)數(shù)據(jù)進(jìn)行有關(guān)存在性、有效性、結(jié)構(gòu)、內(nèi)容及其他基本數(shù)據(jù)特征的測(cè)量標(biāo)準(zhǔn);重復(fù)(Duplication):對(duì)存在于系統(tǒng)內(nèi)或系統(tǒng)間的特定字段、記錄或數(shù)據(jù)集意外重復(fù)的測(cè)量標(biāo)準(zhǔn);準(zhǔn)確性(Accuracy):對(duì)數(shù)據(jù)內(nèi)容正確性進(jìn)行測(cè)量的標(biāo)準(zhǔn);一致性和同步(Consistencyandsynchronization):對(duì)各種不同的數(shù)據(jù)倉庫、應(yīng)用和系統(tǒng)中所存儲(chǔ)或使用的信息等價(jià)程度的測(cè)量,以及使數(shù)據(jù)等價(jià)處理流程的測(cè)量標(biāo)準(zhǔn);及時(shí)性和可用性(Timelinessandavailability):在預(yù)期時(shí)段內(nèi)數(shù)據(jù)對(duì)特定應(yīng)用的及時(shí)程度和可用程度的測(cè)量標(biāo)準(zhǔn);易用性和可維護(hù)性(Easeofuseandmaintainability):對(duì)數(shù)據(jù)可被訪問和使用的程度,以及數(shù)據(jù)能被更新、維護(hù)和管理程度的測(cè)量標(biāo)準(zhǔn);數(shù)據(jù)覆蓋(Datacoverage):相對(duì)于數(shù)據(jù)總體或全體相關(guān)對(duì)象數(shù)據(jù)的可用性和全面性的測(cè)量標(biāo)準(zhǔn);表達(dá)質(zhì)量(Presentationquality):如何進(jìn)行有效信息表達(dá)以及如何從用戶中收集信息的測(cè)量標(biāo)準(zhǔn);可理解性、相關(guān)性和可信度(Perception,relevanceandtrust):數(shù)據(jù)質(zhì)量的可理解性和數(shù)據(jù)質(zhì)量中執(zhí)行度的測(cè)量標(biāo)準(zhǔn),以及對(duì)業(yè)務(wù)所需數(shù)據(jù)的重要性、實(shí)用性及相關(guān)性的測(cè)量標(biāo)準(zhǔn)。3.2Python數(shù)據(jù)預(yù)處理根據(jù)數(shù)據(jù)源為單數(shù)據(jù)源或多數(shù)據(jù)源,數(shù)據(jù)質(zhì)量問題出現(xiàn)在模式層或?qū)嵗龑樱蓪?shù)據(jù)質(zhì)量問題分為單數(shù)據(jù)源模式層、單數(shù)據(jù)源實(shí)例層、多數(shù)據(jù)源模式層和多數(shù)據(jù)源實(shí)例層4類問題,如圖3-1所示。列出了每一類典型的數(shù)據(jù)質(zhì)量問題。圖3-13.2Python數(shù)據(jù)預(yù)處理單數(shù)據(jù)源數(shù)據(jù)質(zhì)量問題可以分別從模式層和實(shí)例層兩個(gè)方面來考慮。模式層問題主要由缺少完整性約束和低水平模式設(shè)計(jì)造成。有些單數(shù)據(jù)源,如文件和Web數(shù)據(jù)沒有數(shù)據(jù)模式,缺少統(tǒng)一的模式規(guī)范,使得錯(cuò)誤和不一致問題更易發(fā)生;盡管數(shù)據(jù)庫系統(tǒng)具有特定的數(shù)據(jù)模型和完整性約束,但也會(huì)因缺少完備的數(shù)據(jù)模型或特定的完整性約束而引起數(shù)據(jù)質(zhì)量問題??梢酝ㄟ^改進(jìn)模式設(shè)計(jì)和模式轉(zhuǎn)化避免模式層問題。實(shí)例層問題在模式層次上不可見,很難通過改進(jìn)模式避免。經(jīng)常會(huì)由于人為失誤造成拼寫錯(cuò)誤和相似或重復(fù)記錄等問題。如某字段是自由格式的字符串類型,地址信息和參考文獻(xiàn)等其他類別的內(nèi)容也可能存儲(chǔ)到該字段中。3.2Python數(shù)據(jù)預(yù)處理多數(shù)據(jù)源中的模式層問題除了低水平的模式設(shè)計(jì),還存在命名沖突和結(jié)構(gòu)沖突等問題。多數(shù)據(jù)源中,不同的對(duì)象可能使用同一名稱命名,同一對(duì)象也可能使用不同的名稱命名;同一對(duì)象在多數(shù)據(jù)源中的表示方式會(huì)不同,如字段類型、組織結(jié)構(gòu)或完整性約束不同,會(huì)導(dǎo)致結(jié)構(gòu)沖突。多數(shù)據(jù)源中模型和模式的不同,在數(shù)據(jù)匯總中很容易帶來質(zhì)量問題。在實(shí)例層,單數(shù)據(jù)源中出現(xiàn)的問題在多數(shù)據(jù)源中都有可能發(fā)生。同時(shí),還會(huì)出現(xiàn)矛盾數(shù)據(jù)和不一致問題。盡管多數(shù)據(jù)源中同一字段表示同一內(nèi)容,但表達(dá)方式不同也會(huì)帶來問題,如性別字段,有的數(shù)據(jù)源可能用“0/1”表示,其他數(shù)據(jù)源可能用“F/M”表示;對(duì)貨物質(zhì)量的描述,有的數(shù)據(jù)源用kg(公斤)表示,其他數(shù)據(jù)源用t(噸)表示。3.2Python數(shù)據(jù)預(yù)處理②數(shù)據(jù)質(zhì)量問題分類數(shù)據(jù)質(zhì)量問題在模式層和實(shí)例層都可能出現(xiàn),本章主要討論實(shí)例層數(shù)據(jù)質(zhì)量問題。數(shù)據(jù)在其生命周期內(nèi),要經(jīng)歷人員交互、計(jì)算和傳輸?shù)炔僮鞑襟E,每一環(huán)節(jié)都可能引入錯(cuò)誤,產(chǎn)生數(shù)據(jù)異常,導(dǎo)致數(shù)據(jù)的質(zhì)量問題。主要包括以下4種數(shù)據(jù)質(zhì)量問題來源:A數(shù)據(jù)錄入/更新當(dāng)錄入人員從聲音中提取信息,及依據(jù)書寫或打印資料鍵入數(shù)據(jù)時(shí),由于印刷錯(cuò)誤或?qū)υ紨?shù)據(jù)資料的曲解,可能造成數(shù)據(jù)錄入錯(cuò)誤;當(dāng)錄入人員不知道正確值時(shí),經(jīng)常編造一個(gè)容易輸入的默認(rèn)值,或他們認(rèn)為的典型值錄入,引入“臟數(shù)據(jù)”以達(dá)到所謂的偽完整性(Spuriousintegrity),這樣的數(shù)據(jù)通常可以通過數(shù)據(jù)完整性約束和數(shù)據(jù)輸入系統(tǒng)的數(shù)據(jù)完整性初步測(cè)試,而在數(shù)據(jù)庫中沒有無意義或異常的跡象,具有相當(dāng)?shù)碾[蔽性;軟件缺陷也可造成數(shù)據(jù)異常,如刪除某條記錄時(shí),沒有刪除與其關(guān)聯(lián)的記錄,再進(jìn)行添加操作而引起了錯(cuò)誤。B測(cè)量不包括測(cè)量工具本身的問題,主要指以下兩類人為引入的數(shù)據(jù)異常:無意的人為錯(cuò)誤,如方案問題(如不合適的調(diào)研和采集策略等),以及方案執(zhí)行中的問題(如測(cè)量工具誤用等);有意的人為舞弊,即出于某種不良意圖的造假,如虛產(chǎn)品產(chǎn)量和夸大設(shè)備完好率等,該類數(shù)據(jù)可以直接導(dǎo)致統(tǒng)計(jì)分析系統(tǒng)決策錯(cuò)誤,造成嚴(yán)重后果。3.2Python數(shù)據(jù)預(yù)處理C簡(jiǎn)化許多情況下,原始數(shù)據(jù)入庫前需預(yù)處理和簡(jiǎn)化,這一過程中多種操作可以導(dǎo)致信息損失:如減少原始數(shù)據(jù)復(fù)雜性或噪聲;執(zhí)行數(shù)據(jù)庫管理員對(duì)所不了解的統(tǒng)計(jì)分析,使用一些編輯偏好以減少數(shù)據(jù)占用存儲(chǔ)空間為目的的簡(jiǎn)單處理(如數(shù)據(jù)稀化)。以上操作導(dǎo)致在入庫的簡(jiǎn)化數(shù)據(jù)中,或與簡(jiǎn)化相關(guān)的最終分析中產(chǎn)生錯(cuò)誤風(fēng)險(xiǎn),造成數(shù)據(jù)質(zhì)量下降。D數(shù)據(jù)集成在數(shù)據(jù)庫建立過程中,常將多個(gè)數(shù)據(jù)源中的數(shù)據(jù)并入一個(gè)數(shù)據(jù)庫,這種數(shù)據(jù)集成任務(wù)需解決數(shù)據(jù)庫之間的不一致或沖突問題,在模式層主要是命名沖突和結(jié)構(gòu)沖突,在實(shí)例層主要指因集成而產(chǎn)生的相似或重復(fù)問題。一些文獻(xiàn)將各數(shù)據(jù)源之間的不一致和沖突視為數(shù)據(jù)質(zhì)量問題,其實(shí),在沒有事先約定的情況下,多數(shù)據(jù)源之間的沖突和不一致的存在是正常的,合并過程中解決這些不一致和沖突是數(shù)據(jù)集成過程中必要的步驟,模式層問題主要用數(shù)據(jù)提取轉(zhuǎn)換和加載工具解決。在解決多數(shù)據(jù)源之間的不一致和沖突時(shí),基于多數(shù)據(jù)源的數(shù)據(jù)集成過程中可能會(huì)導(dǎo)致數(shù)據(jù)異常,如不一致和沖突的解決不徹底,甚至可能引入新的異常,或沖突記錄的誤識(shí)別。因此,數(shù)據(jù)集成是造成數(shù)據(jù)質(zhì)量問題的一個(gè)來源。3.2Python數(shù)據(jù)預(yù)處理③數(shù)據(jù)清洗的定義數(shù)據(jù)清洗(DataCleaning),又叫數(shù)據(jù)清理(Datacleansing)或數(shù)據(jù)凈化(Datascrubbing),主要應(yīng)用于數(shù)據(jù)倉庫、數(shù)據(jù)挖掘和全面數(shù)據(jù)質(zhì)量管理三個(gè)方面。針對(duì)這些不同的方面,對(duì)于數(shù)據(jù)清洗的認(rèn)識(shí)也不盡相同。目前為止,數(shù)據(jù)清洗還沒有一個(gè)公認(rèn)的定義,但主要內(nèi)容大體相同。一般來說,只要是有助于解決數(shù)據(jù)質(zhì)量問題的處理過程就被認(rèn)為是數(shù)據(jù)清洗。不同領(lǐng)域的數(shù)據(jù)清洗定義有所不同:

在數(shù)據(jù)倉庫領(lǐng)域中,數(shù)據(jù)清洗被定義為清除錯(cuò)誤和不一致數(shù)據(jù)的處理過程,同時(shí)需要解決重復(fù)問題和數(shù)據(jù)孤立點(diǎn)問題等。數(shù)據(jù)清洗并不是簡(jiǎn)單地對(duì)臟數(shù)據(jù)進(jìn)行檢測(cè)和修正,還涉及到一部分?jǐn)?shù)據(jù)的整合與分解。

在數(shù)據(jù)挖掘領(lǐng)域中,數(shù)據(jù)預(yù)處理過程就是數(shù)據(jù)清洗的過程。各種不同的數(shù)據(jù)挖掘系統(tǒng)都是針對(duì)特定的應(yīng)用領(lǐng)域進(jìn)行數(shù)據(jù)清洗的。

在全面數(shù)據(jù)質(zhì)量管理領(lǐng)域中,一般將數(shù)據(jù)清洗過程定義為一個(gè)評(píng)價(jià)數(shù)據(jù)正確性并改善其質(zhì)量的過程。全面數(shù)據(jù)質(zhì)量管理可以有效解決整個(gè)信息業(yè)務(wù)過程中的數(shù)據(jù)質(zhì)量問題以及數(shù)據(jù)集成問題。3.2Python數(shù)據(jù)預(yù)處理現(xiàn)今數(shù)據(jù)清洗的研究主要涉及到以下幾個(gè)方面:

Web領(lǐng)域的數(shù)據(jù)清洗研究:搜索引擎為用戶在互聯(lián)網(wǎng)上查找信息提供了方便,它通過為網(wǎng)頁內(nèi)容進(jìn)行索引而實(shí)現(xiàn)。但是具體到對(duì)網(wǎng)頁中的哪些部分需要進(jìn)行索引是一個(gè)很重要的問題,比如網(wǎng)頁中的廣告及一些Flash動(dòng)畫就不需要索引。按照網(wǎng)絡(luò)數(shù)據(jù)清洗的粒度不同,可以將網(wǎng)絡(luò)數(shù)據(jù)清洗劃分為兩類:Web頁面級(jí)別的數(shù)據(jù)清洗和基于頁面內(nèi)部元素級(jí)別的數(shù)據(jù)清洗。前者以Google公司提出的PageRank算法和IBM公司Clever系統(tǒng)的HITS(HypertextInducedTopicSearch)算法為代表;而后者思路則集中體現(xiàn)在作為MSN搜索引擎核心技術(shù)之一的VIPS算法上。

特殊領(lǐng)域的數(shù)據(jù)清洗研究:主要針對(duì)金融、保險(xiǎn)等行業(yè)中存在的“臟數(shù)據(jù)”的數(shù)據(jù)清洗研究。這些臟數(shù)據(jù)包括錯(cuò)誤數(shù)據(jù)、不一致數(shù)據(jù)、重復(fù)數(shù)據(jù)以及業(yè)務(wù)邏輯錯(cuò)誤的數(shù)據(jù)。這些數(shù)據(jù)主要指的是實(shí)例層的數(shù)據(jù)。

數(shù)字化文獻(xiàn)服務(wù)領(lǐng)域的數(shù)據(jù)清洗研究:在進(jìn)行數(shù)字化文獻(xiàn)資源加工時(shí),OCR軟件有時(shí)會(huì)造成字符識(shí)別錯(cuò)誤,標(biāo)引人員的疏忽也可能導(dǎo)致標(biāo)引詞的錯(cuò)誤等,這些錯(cuò)誤的糾正都是數(shù)據(jù)清洗需要完成的任務(wù)。

射頻識(shí)別(RadioFrequencyIdentification,RFID)領(lǐng)域的數(shù)據(jù)清洗研究:隨著云計(jì)算研究的興起,射頻識(shí)別也已經(jīng)成為研究的熱點(diǎn)。射頻識(shí)別領(lǐng)域中的信息識(shí)別問題是一個(gè)很重要的問題,例如識(shí)別一些模糊不清的數(shù)據(jù)以及一部分信息丟失的數(shù)據(jù)。3.2Python數(shù)據(jù)預(yù)處理④數(shù)據(jù)清洗原理數(shù)據(jù)清洗的原理就是通過分析臟數(shù)據(jù)的產(chǎn)生原因及存在形式,對(duì)數(shù)據(jù)流的過程進(jìn)行考察、分析,并總結(jié)出一些方法(數(shù)理統(tǒng)計(jì)、數(shù)據(jù)挖掘或預(yù)定義規(guī)則等方法),將臟數(shù)據(jù)轉(zhuǎn)化成滿足數(shù)據(jù)質(zhì)量要求的數(shù)據(jù)。⑤數(shù)據(jù)清洗的基本方法數(shù)據(jù)清洗是提高數(shù)據(jù)質(zhì)量技術(shù)中的主要研究?jī)?nèi)容,主要針對(duì)實(shí)例層的數(shù)據(jù)進(jìn)行清洗。清洗內(nèi)容主要包括:缺失數(shù)據(jù)處理、相似重復(fù)對(duì)象檢測(cè)、異常數(shù)據(jù)處理、邏輯錯(cuò)誤檢測(cè)和不一致數(shù)據(jù)等。下面分別介紹這5種清洗方法:A缺失數(shù)據(jù)處理缺失值問題是真實(shí)數(shù)據(jù)集中一種普遍現(xiàn)象,一種處理缺失值的簡(jiǎn)單方法是忽略含有缺失值的實(shí)例或?qū)傩裕抢速M(fèi)的數(shù)據(jù)可能相當(dāng)多,且不完整的數(shù)據(jù)集可能帶來統(tǒng)計(jì)分析的偏差。所以,需要根據(jù)數(shù)據(jù)間的關(guān)聯(lián)性估計(jì)出準(zhǔn)確的缺失值,并通過合適的方法對(duì)缺失值進(jìn)行填充??梢圆捎萌斯ぬ顚懣杖敝捣ㄊ止z測(cè)并填寫屬性值,對(duì)于有些不影響整體數(shù)據(jù)情況的空值可以采用忽略元組法。在有些特殊情況中,也可以使用屬性的平均值、中間值、最大值、最小值或更為復(fù)雜的概率統(tǒng)計(jì)函數(shù)值填充空缺值法。如果擁有合適的填補(bǔ)方法,則能得到高質(zhì)量的數(shù)據(jù),數(shù)據(jù)挖掘結(jié)果也會(huì)得到改善。3.2Python數(shù)據(jù)預(yù)處理B相似重復(fù)對(duì)象檢測(cè)對(duì)多數(shù)據(jù)源和單數(shù)據(jù)源數(shù)據(jù)進(jìn)行集成時(shí),多個(gè)記錄代表同一實(shí)體的現(xiàn)象經(jīng)常存在,這些記錄稱為重復(fù)記錄。同時(shí),有些記錄并非完全重復(fù),其個(gè)別字段存在一定差別,但表示的卻是同一對(duì)象,此類記錄即為相似重復(fù)記錄。相似重復(fù)記錄檢測(cè)是數(shù)據(jù)清洗研究的重要方面,在信息集成系統(tǒng)中,重復(fù)記錄不僅導(dǎo)致數(shù)據(jù)冗余,浪費(fèi)了網(wǎng)絡(luò)帶寬和存儲(chǔ)空間,還提供給用戶很多相似信息,起到誤導(dǎo)作用。重復(fù)數(shù)據(jù)檢測(cè)主要分為兩個(gè)方面:基于字段和基于記錄的重復(fù)檢測(cè)?;谧侄蔚闹貜?fù)檢測(cè)算法主要包括編輯距離(如SmithWaterman、Jaro)算法、樹編輯距離算法、TISimilarity相似匹配算法、Cosine相似度函數(shù)算法等。其中,編輯距離算法是最常用的算法,易于實(shí)現(xiàn),但是對(duì)于單詞位置互換及長(zhǎng)詞的插入、刪除操作結(jié)果較差;TISimilarity算法的時(shí)間復(fù)雜度較小,并具有較好的適用性,但是對(duì)于縮寫字符串的比較存在不足;而Cosine算法更多地適用于文本的字段重復(fù)檢測(cè)?;谟涗浀闹貜?fù)檢測(cè)算法主要包括排序鄰居算法(Sorted-NeighborhoodMethod,SNM)、優(yōu)先隊(duì)列算法、Canopy聚類算法。排序鄰居算法相對(duì)較小,但是該算法過于依賴關(guān)鍵字,關(guān)鍵字的選取對(duì)算法的結(jié)果影響較大;優(yōu)先隊(duì)列算法的適應(yīng)性較好,但是對(duì)于閾值的設(shè)置尤為關(guān)鍵;Canopy算法采用“分類+合并刪除”的思路進(jìn)行檢測(cè),降低了算法的計(jì)算量。但是,不易選取參數(shù)K(距離閾值),而參數(shù)K會(huì)影響算法的準(zhǔn)確程度。3.2Python數(shù)據(jù)預(yù)處理排序鄰居算法(SNM)基于排序比較的思想,已得到廣泛使用。利用依賴圖的概念,計(jì)算數(shù)據(jù)表中的關(guān)鍵屬性,根據(jù)關(guān)鍵屬性值將記錄集劃分為小記錄集,在每個(gè)小記錄集中進(jìn)行相似重復(fù)記錄檢測(cè)。分割法,將某一字符串分割成幾個(gè)組成部分來處理,一定程度上能夠解決同一對(duì)象多種表示形式的問題。非結(jié)構(gòu)化數(shù)據(jù)清洗是清洗技術(shù)的難點(diǎn),近年來,針對(duì)非結(jié)構(gòu)化數(shù)據(jù)的重復(fù)檢測(cè)技術(shù)也在不斷發(fā)展。C異常數(shù)據(jù)處理異常數(shù)據(jù)指數(shù)據(jù)庫或數(shù)據(jù)倉庫中不符合一般規(guī)律的數(shù)據(jù)對(duì)象,又稱為孤立點(diǎn)。異常數(shù)據(jù)可能由執(zhí)行失誤造成,也可能因設(shè)備故障而導(dǎo)致結(jié)果異常。異常數(shù)據(jù)可能是去掉的噪聲,也可能是含有重要信息的數(shù)據(jù)單元。異常數(shù)據(jù)的探測(cè)主要有基于統(tǒng)計(jì)學(xué)、基于距離和基于偏離3類方法。采用數(shù)據(jù)審計(jì)的方法可以實(shí)現(xiàn)異常數(shù)據(jù)的自動(dòng)化檢測(cè),該方法也稱為數(shù)據(jù)質(zhì)量挖掘(DQM)。DQM主要由2步構(gòu)成:第一步,采用數(shù)理統(tǒng)計(jì)方法對(duì)數(shù)據(jù)分布進(jìn)行概化描述,自動(dòng)獲得數(shù)據(jù)的總體分布特征;第二步,針對(duì)特定的數(shù)據(jù)質(zhì)量問題進(jìn)行挖掘以發(fā)現(xiàn)數(shù)據(jù)異常。3.2Python數(shù)據(jù)預(yù)處理D邏輯錯(cuò)誤檢測(cè)數(shù)據(jù)邏輯錯(cuò)誤指數(shù)據(jù)集中的屬性值與實(shí)際值不符,或違背了業(yè)務(wù)規(guī)則或邏輯。在實(shí)際信息系統(tǒng)中,對(duì)于具體應(yīng)用采用一定的方法解決數(shù)據(jù)邏輯錯(cuò)誤問題,具有實(shí)際意義。不合法的屬性值是一種常見的數(shù)據(jù)邏輯錯(cuò)誤,如某人的出生日期為“1986/13/25”,超出了月份的最大值。通過檢測(cè)字段中各屬性值有效數(shù)值范圍,可以判斷該值是否正確。屬性錯(cuò)誤值檢測(cè)主要包括統(tǒng)計(jì)法、聚類方法以及關(guān)聯(lián)規(guī)則方法,這些方法都是以統(tǒng)計(jì)和總結(jié)規(guī)律的方式計(jì)算并查找錯(cuò)誤值,進(jìn)而修正錯(cuò)誤數(shù)據(jù)。Fellgi于1976年提出了一個(gè)嚴(yán)格的形式化模型——Fellegi-Hot模型。其主要思路是:在具體的應(yīng)用領(lǐng)域,根據(jù)相應(yīng)領(lǐng)域知識(shí)制定約束規(guī)則,利用數(shù)學(xué)方法獲得規(guī)則閉集,并自動(dòng)判斷字段值是否違反規(guī)則約束。該方法數(shù)學(xué)基礎(chǔ)嚴(yán)密,自動(dòng)生成規(guī)則,在審計(jì)和統(tǒng)計(jì)領(lǐng)域得到了廣泛應(yīng)用。3.2Python數(shù)據(jù)預(yù)處理E不一致數(shù)據(jù)多數(shù)據(jù)源數(shù)據(jù)集成時(shí),由于不同數(shù)據(jù)源對(duì)同一現(xiàn)實(shí)事物可能存在不一致的表示,從而產(chǎn)生不一致的數(shù)據(jù)。不一致數(shù)據(jù)一般通過手工或者自動(dòng)化方式檢查。常見的不一致數(shù)據(jù)有:(1)包含大量空數(shù)據(jù)值的列,如個(gè)人對(duì)某些敏感信息回避,故意漏填部分信息;(2)包含過多或者過少的單一狀態(tài)的列,如一對(duì)一關(guān)系的列,或者僅包含一個(gè)值的列;(3)遠(yuǎn)離或超出某列正態(tài)分布的記錄,如出現(xiàn)負(fù)工資和課程零學(xué)時(shí)的問題;(4)不符合特定格式的行,如不同的日期格式;(5)同一記錄的不同屬性比較時(shí),缺失意義的列,如客戶選購某產(chǎn)品的日期早于該顧客的出生日期。目前,常用的消除數(shù)據(jù)不一致的方法有排序、融合和基于規(guī)則3種方法。3.2Python數(shù)據(jù)預(yù)處理⑥數(shù)據(jù)清洗模型的簡(jiǎn)介在數(shù)據(jù)清洗問題研究的過程中,人們總結(jié)并提出了一些數(shù)據(jù)清洗模型,用于企業(yè)和生產(chǎn)管理。主要的數(shù)據(jù)清洗模型包括以下幾類:ATrillium的過程模型。它是由HarteHanksDataTechnologies的TrilliumSoftwareSystem部門創(chuàng)建的企業(yè)范圍的數(shù)據(jù)清洗工具。主要處理常見數(shù)據(jù)包括名稱、頭銜、電話號(hào)碼、身份證號(hào)碼、自由文本等,它可接受多種方式格式化和編碼的數(shù)據(jù),具有可伸縮性,獨(dú)立于平臺(tái)并適合多種環(huán)境。此模型主要應(yīng)用于專業(yè)的金融、保險(xiǎn)等行業(yè)。BAJAX的過程模型。該模型是邏輯層面的模型,以數(shù)據(jù)的業(yè)務(wù)邏輯流程作為主要的檢測(cè)過程,分別通過數(shù)據(jù)映射、匹配、聚集操作、數(shù)據(jù)合并以及數(shù)據(jù)視圖顯示5個(gè)過程進(jìn)行數(shù)據(jù)清洗。該模型從數(shù)據(jù)輸入開始檢測(cè),直到數(shù)據(jù)輸出檢測(cè)結(jié)束,檢測(cè)范圍囊括了數(shù)據(jù)流的整個(gè)過程,主要應(yīng)用在數(shù)據(jù)挖掘方面。CKimball的過程模型。它認(rèn)為數(shù)據(jù)清洗絕不是簡(jiǎn)單地將記錄更新為正確的數(shù)據(jù),還包括嚴(yán)肅的數(shù)據(jù)凈化過程,如數(shù)據(jù)的解析和重新裝配。此模型的提出加深了人們對(duì)數(shù)據(jù)清洗問題的理解,讓人們更加重視數(shù)據(jù)的解析后的數(shù)據(jù)清洗問題。3.2Python數(shù)據(jù)預(yù)處理⑦數(shù)據(jù)清洗框架和工具數(shù)據(jù)清洗研究基本針對(duì)具體應(yīng)用和特定領(lǐng)域展開,由于領(lǐng)域相關(guān)性強(qiáng),數(shù)據(jù)清洗框架的通用性、可擴(kuò)展性研究發(fā)展受到限制。為了使數(shù)據(jù)清洗具有一定的通用性,提出提出一個(gè)數(shù)據(jù)清洗的一般性系統(tǒng)框架,該框架由準(zhǔn)備(Preparation)、檢測(cè)(Detection)、定位(Location)、修正(Modification)、驗(yàn)證(Validation)5部分組成,簡(jiǎn)稱為PDLMV,如圖3-2所示。3.2Python數(shù)據(jù)預(yù)處理圖3-23.2Python數(shù)據(jù)預(yù)處理對(duì)圖3-2中的一般性系統(tǒng)框架的5個(gè)部分進(jìn)一步說明如下。A準(zhǔn)備。包括需求分析、信息環(huán)境分析、任務(wù)定義、方法定義、基本配置,以及基于以上工作獲得數(shù)據(jù)清洗方案等。通過需求分析明確信息系統(tǒng)的數(shù)據(jù)清洗需求,通過信息環(huán)境分析明確數(shù)據(jù)所處的信息環(huán)境特點(diǎn),任務(wù)定義要明確具體的數(shù)據(jù)清洗任務(wù)目標(biāo),方法定義確定合適的數(shù)據(jù)清洗方法,基本配置完成數(shù)據(jù)接口等的配置,要形成完整的數(shù)據(jù)清洗方案,并整理歸檔。B檢測(cè)。包括檢測(cè)必需的數(shù)據(jù)預(yù)處理,并進(jìn)行相似重復(fù)記錄、不完整記錄、邏輯錯(cuò)誤、異常數(shù)據(jù)等數(shù)據(jù)質(zhì)量問題的檢測(cè),對(duì)檢測(cè)結(jié)果進(jìn)行統(tǒng)計(jì),以獲得全面的數(shù)據(jù)質(zhì)量信息,并將相關(guān)信息整理歸檔。C定位。包括數(shù)據(jù)質(zhì)量問題定位、數(shù)據(jù)追蹤分析,并根據(jù)檢測(cè)結(jié)果對(duì)數(shù)據(jù)質(zhì)量進(jìn)行評(píng)估,分析問題數(shù)據(jù)及修正的業(yè)務(wù)影響,分析產(chǎn)生數(shù)據(jù)質(zhì)量問題的根本原因;進(jìn)而確定數(shù)據(jù)質(zhì)量問題性質(zhì)及位置,給出數(shù)據(jù)修正方案,并將相關(guān)信息歸檔。根據(jù)定位分析情況,可能需要返回“檢測(cè)”。D修正。在定位分析的基礎(chǔ)上,對(duì)檢測(cè)出的實(shí)例層數(shù)據(jù)質(zhì)量問題進(jìn)行修正,具體包括問題數(shù)據(jù)標(biāo)記、不可用數(shù)據(jù)刪除、重復(fù)記錄合并、缺失數(shù)據(jù)估計(jì)與填充等,并對(duì)數(shù)據(jù)修正過程進(jìn)行數(shù)據(jù)世系管理。E驗(yàn)證。驗(yàn)證修正后的數(shù)據(jù)與任務(wù)定義的符合性(用到部分檢測(cè)操作),如果結(jié)果與任務(wù)目標(biāo)不符合,則做進(jìn)一步定位分析與修正,甚至返回“準(zhǔn)備”中調(diào)整相應(yīng)準(zhǔn)備工作。3.2Python數(shù)據(jù)預(yù)處理⑵數(shù)據(jù)集成數(shù)據(jù)集成是指將多個(gè)數(shù)據(jù)源中的數(shù)據(jù)合并并存放到一個(gè)一致的數(shù)據(jù)存儲(chǔ)(如數(shù)據(jù)倉庫)中。這些數(shù)據(jù)源可能包括多個(gè)數(shù)據(jù)庫、數(shù)據(jù)立方體或一般文件。在數(shù)據(jù)集成時(shí),有許多問題需要考慮,例如模式集成和對(duì)象匹配可能需要技巧;來自多個(gè)信息源的現(xiàn)實(shí)世界的等價(jià)實(shí)體如何實(shí)現(xiàn)匹配。這涉及實(shí)體識(shí)別問題。每個(gè)屬性的元數(shù)據(jù)包括名字、含義、數(shù)據(jù)類型和屬性的允許取值范圍,以及處理空白、零或null值的空值規(guī)則。這樣的元數(shù)據(jù)可以用來幫助避免模式集成的錯(cuò)誤。元數(shù)據(jù)還可以用來幫助變換數(shù)據(jù)。另外冗余也是一個(gè)重要問題。一個(gè)屬性可能是冗余的,如果它能由另一個(gè)或另一組屬性導(dǎo)出。屬性或維命名的不一致也可能導(dǎo)致結(jié)果數(shù)據(jù)集中的冗余。數(shù)據(jù)集成的第三個(gè)重要問題是數(shù)據(jù)值沖突的檢測(cè)與處理。例如,對(duì)于現(xiàn)實(shí)世界的同一實(shí)體,來自不同數(shù)據(jù)源的屬性值可能不同。3.2Python數(shù)據(jù)預(yù)處理⑶數(shù)據(jù)變換數(shù)據(jù)變換是不同來源所得到的數(shù)據(jù)可能導(dǎo)致不一致,所以需要進(jìn)行數(shù)據(jù)變換,構(gòu)成一個(gè)適合數(shù)據(jù)挖掘的描述形式。數(shù)據(jù)轉(zhuǎn)換包含的處理內(nèi)容有:①屬性的數(shù)據(jù)類型轉(zhuǎn)換。當(dāng)屬性之間的取值范圍可能相差很大時(shí),要進(jìn)行數(shù)據(jù)的映射處理,映射關(guān)系可以去平方根、標(biāo)準(zhǔn)方差以及區(qū)域?qū)?yīng)。當(dāng)屬性的取值類型較小時(shí),分析數(shù)據(jù)的頻率分布,然后進(jìn)行數(shù)值轉(zhuǎn)換,將其中字符型的屬性轉(zhuǎn)換為枚舉型。②屬性構(gòu)造。根據(jù)已有的屬性集構(gòu)造新的屬性,以幫助數(shù)據(jù)挖掘過程。很多情況下需要從原始數(shù)據(jù)中生成一些新的變量作為預(yù)測(cè)變量。3.2Python數(shù)據(jù)預(yù)處理③數(shù)據(jù)離散化。將連續(xù)取值的屬性離散化成若干區(qū)間,來幫助消減一個(gè)連續(xù)屬性的取值個(gè)數(shù)。例如年齡字段取值大于0,為了分析的方便,根據(jù)經(jīng)驗(yàn),可以將用戶的年齡段分成幾個(gè)不同的區(qū)間:0~15、16~24、25~35、36~55、大于55,分別用1,2,3,4,5來表示。④數(shù)據(jù)標(biāo)準(zhǔn)化。不同來源所得到的相同字段定義可能不一樣。如性別有男、女來表示,需要將定義標(biāo)準(zhǔn)化,把它們的定義和取值區(qū)間統(tǒng)一起來。如性別定義1(男)、2(女)、3(缺失)。數(shù)據(jù)標(biāo)準(zhǔn)化過程還用來消除變量之間不同數(shù)量級(jí)造成的數(shù)值之間的懸殊差異,消除個(gè)別數(shù)值較高的屬性對(duì)聚類結(jié)果的影響。3.2Python數(shù)據(jù)預(yù)處理⑷數(shù)據(jù)歸約對(duì)海量數(shù)據(jù)進(jìn)行復(fù)雜的數(shù)據(jù)分析和挖掘?qū)⑿枰荛L(zhǎng)時(shí)間,使得這種分析不具有可操作性。數(shù)據(jù)歸約技術(shù)可以減小數(shù)據(jù)集容量,但仍接近保持原數(shù)據(jù)的完整性。這樣,對(duì)歸約后的數(shù)據(jù)集挖掘?qū)⒏行?,并產(chǎn)生相同(或幾乎相同)的分析結(jié)果。用于數(shù)據(jù)歸約的計(jì)算時(shí)間不應(yīng)當(dāng)超過或“抵消”對(duì)歸約數(shù)據(jù)挖掘節(jié)省的時(shí)間。①數(shù)據(jù)立方體存儲(chǔ)多維聚集信息每個(gè)單元存放一個(gè)聚集值,對(duì)應(yīng)于多維空間的一個(gè)數(shù)據(jù)點(diǎn),每個(gè)屬性可能存在概念分層,允許在多個(gè)抽象層進(jìn)行數(shù)據(jù)分析。數(shù)據(jù)立方體提供對(duì)預(yù)計(jì)算的匯總數(shù)據(jù)進(jìn)行快速訪問,因此,適合聯(lián)機(jī)數(shù)據(jù)分析處理和數(shù)據(jù)挖掘。在最低抽象層創(chuàng)建的立方體稱為基本方體(basecuboid)?;痉襟w應(yīng)當(dāng)對(duì)應(yīng)于感興趣的個(gè)體實(shí)體。即最低層應(yīng)當(dāng)是對(duì)于分析可用的或有用的。最高層抽象的立方體稱為頂點(diǎn)方體(apexcuboid)。對(duì)不同抽象層創(chuàng)建的數(shù)據(jù)立方體稱為方體(cuboid),因此數(shù)據(jù)立方體可以看作方體的格(latticeofcuboids)。每個(gè)較高層抽象將進(jìn)一步減少結(jié)果數(shù)據(jù)的規(guī)模。當(dāng)回答數(shù)據(jù)挖掘查詢時(shí),應(yīng)當(dāng)使用與給定任務(wù)相關(guān)的最小可用方體。3.2Python數(shù)據(jù)預(yù)處理②屬性子集選擇用于分析的數(shù)據(jù)集可能包含數(shù)以百計(jì)的屬性,其中大部分屬性與挖掘任務(wù)不相關(guān)或冗余。屬性子集選擇的基本方法包括以下幾種:A逐步向前選擇:該過程由空屬性集作為歸約集開始,確定原屬性集中最好的屬性,并將它添加到歸約集中。在其后的每一次迭代步,將剩下的原屬性集中最好的屬性添加到該集合中。B逐步向后刪除:該過程由整個(gè)屬性集開始。在每一步,刪除尚在屬性集中最差的屬性。向前選擇和向后刪除的結(jié)合:可以將逐步向前選擇和向后刪除方法結(jié)合在一起,每一步選擇一個(gè)最好的屬性,并在剩余屬性中刪除一個(gè)最差的屬性。C決策樹歸納:決策樹算法最初是用于分類的。決策樹歸納構(gòu)造一個(gè)類似于流程圖的西南結(jié)構(gòu),其中每個(gè)內(nèi)部(非樹葉)節(jié)點(diǎn)表示一個(gè)屬性的測(cè)試,每個(gè)分枝對(duì)應(yīng)于測(cè)試的一個(gè)輸出;每個(gè)外部(樹葉)節(jié)點(diǎn)表示一個(gè)類預(yù)測(cè)。在每個(gè)節(jié)點(diǎn),算法選擇“最好”的屬性,將數(shù)據(jù)劃分成類。3.2Python數(shù)據(jù)預(yù)處理③維度歸約使用編碼機(jī)制減小數(shù)據(jù)集的規(guī)模,如:小波變換和主成分分析。A小波變換離散小波變換是一種線性信號(hào)處理技術(shù),當(dāng)用于數(shù)據(jù)向量X時(shí),將它變換成數(shù)值上不同的小波系數(shù)向量x'。兩個(gè)向量具有相同的長(zhǎng)度。當(dāng)這種技術(shù)用于數(shù)據(jù)歸約時(shí),每個(gè)元組看作一個(gè)n維數(shù)據(jù)向量X=(xl,xZ,…,`),用來描述n個(gè)數(shù)據(jù)庫屬性在元組上的n個(gè)測(cè)量值。于小波變換后的數(shù)據(jù)可以截短。僅存放一小部分最強(qiáng)的小波系數(shù),就能保留近似的壓縮數(shù)據(jù)。B主成分分析搜索k個(gè)最能代表數(shù)據(jù)的n維正交向量,其中k<=n。這樣,原來的數(shù)據(jù)投影到一個(gè)小得多的空間,導(dǎo)致維度歸約。PCA通過創(chuàng)建一個(gè)替換的、更小的變量集“組合”屬性的基本要素。原數(shù)據(jù)可以投影到該較小的集合中。PCA常常揭示先前未曾察覺的聯(lián)系,并因此允許解釋不尋常的結(jié)果④數(shù)值歸約用替代的、較小的數(shù)據(jù)表示替換或估計(jì)數(shù)據(jù),如參數(shù)模型(只需要存放模型參數(shù),不是實(shí)際數(shù)據(jù))或非參數(shù)方法,如聚類、抽樣和使用直方圖。⑤離散化和概念分層產(chǎn)生屬性的原始數(shù)據(jù)值用區(qū)間值或較高層的概念替換。數(shù)據(jù)離散化是一種數(shù)據(jù)歸約形式,對(duì)于概念分層的自動(dòng)產(chǎn)生是有用的。離散化和概念分層產(chǎn)生是數(shù)據(jù)挖掘強(qiáng)有力的工具,允許挖掘多個(gè)抽象層的數(shù)據(jù)。3.2Python數(shù)據(jù)預(yù)處理⑸利用Pythonpandas進(jìn)行數(shù)據(jù)預(yù)處理在此,我們將介紹python中強(qiáng)大的pandas庫來對(duì)數(shù)據(jù)進(jìn)行清洗。Pandas是python的一個(gè)數(shù)據(jù)分析包,最初由AQRCapitalManagement于2008年4月開發(fā),并于2009年底開源出來,目前由專注于Python數(shù)據(jù)包開發(fā)的PyData開發(fā)team繼續(xù)開發(fā)和維護(hù),屬于PyData項(xiàng)目的一部分。Pandas最初被作為金融數(shù)據(jù)分析工具而開發(fā)出來,因此,pandas為時(shí)間序列分析提供了很好的支持。Pandas的名稱來自于面板數(shù)據(jù)(paneldata)和python數(shù)據(jù)分析(dataanalysis)。paneldata是經(jīng)濟(jì)學(xué)中關(guān)于多維數(shù)據(jù)集的一個(gè)術(shù)語,在Pandas中也提供了panel的數(shù)據(jù)類型。pandas是基于Numpy構(gòu)建的含有更高級(jí)數(shù)據(jù)結(jié)構(gòu)和工具的數(shù)據(jù)分析包。①pandas的引入在python中,我們習(xí)慣這樣引入pandas:3.2Python數(shù)據(jù)預(yù)處理>>>frompandasimportSeries,DataFrame>>>importpandasaspd>>>importnumpyasnp②pandas中的數(shù)據(jù)結(jié)構(gòu)在pandas中有以下幾種數(shù)據(jù)結(jié)構(gòu):

Series:一維數(shù)組,與Numpy中的一維array類似。二者與Python基本的數(shù)據(jù)結(jié)構(gòu)List也很相近,其區(qū)別是:List中的元素可以是不同的數(shù)據(jù)類型,而Array和Series中則只允許存儲(chǔ)相同的數(shù)據(jù)類型,這樣可以更有效的使用內(nèi)存,提高運(yùn)算效率。

Time-Series:以時(shí)間為索引的Series。

DataFrame:二維的表格型數(shù)據(jù)結(jié)構(gòu)。很可以將DataFrame理解為Series的容器。

Panel:三維的數(shù)組,可以理解為DataFrame的容器。Panel很少使用,然而是很重要的三維數(shù)據(jù)容器。Paneldata源于經(jīng)濟(jì)學(xué),也是pan(el)-da(ta)-s的來源。

Panel4D:Panel4D是像Panel一樣的4維容器,作為N維容器的一個(gè)測(cè)試。

PanelND:PanelND是一個(gè)擁有factory集合,可以創(chuàng)建像Panel4D一樣N維命名容器的模塊。因在實(shí)際使用中,series與dataframe最常見,因此在此介紹series與dataframe的相關(guān)知識(shí)。3.2Python數(shù)據(jù)預(yù)處理A.Series>>>s=Series([1,2,3.0,'abc'])>>>s0112233abcctdtype:obje3.2Python數(shù)據(jù)預(yù)處理Series是一個(gè)一維的類似的數(shù)組對(duì)象,包含一個(gè)數(shù)組的數(shù)據(jù)(任何NumPy的數(shù)據(jù)類型)和一個(gè)與數(shù)組關(guān)聯(lián)的數(shù)據(jù)標(biāo)簽,被叫做索引。最簡(jiǎn)單的Series是由一個(gè)數(shù)組的數(shù)據(jù)構(gòu)成。Series對(duì)象包含兩個(gè)主要的屬性:index和values,分別為上例中左右兩列。因?yàn)閭鹘o構(gòu)造器的是一個(gè)列表,所以index的值是從0起遞增的整數(shù),如果傳入的是一個(gè)類字典的鍵值對(duì)結(jié)構(gòu),就會(huì)生成index-value對(duì)應(yīng)的Series;或者在初始化的時(shí)候以關(guān)鍵字參數(shù)顯式指定一個(gè)index對(duì)象:BDataFrame一個(gè)Datarame表示一個(gè)表格,類似電子表格的數(shù)據(jù)結(jié)構(gòu),包含一個(gè)經(jīng)過排序的列表集,它們每一個(gè)都可以有不同的類型值(數(shù)字,字符串,布爾等等)。DataFrame有行和列的索引;它可以被看作是一個(gè)Series的字典(每個(gè)Series共享一個(gè)索引)。有很多方法來構(gòu)建一個(gè)DataFrame,但最常用的一個(gè)是用一個(gè)相等長(zhǎng)度列表的字典或NumPy數(shù)組:3.2Python數(shù)據(jù)預(yù)處理>>>data={'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],'year':[2000,2001,2002,2001,2002],'pop':[1.5,1.7,3.6,2.4,2.9]}>>>frame=DataFrame(data)由此產(chǎn)生的DataFrame和Series一樣,它的索引會(huì)自動(dòng)分配,并且對(duì)列進(jìn)行了排序:3.2Python數(shù)據(jù)預(yù)處理>>>framepopstateyear01.5Ohio200011.7Ohio200123.6Ohio200232.4Nevada200142.9Nevada2002如果你設(shè)定了一個(gè)列的順序,DataFrame的列將會(huì)精確的按照你所傳遞的順序排列:>>>DataFrame(data,columns=['year','state','pop'])yearstatepop02000Ohio1.512001Ohio1.722002Ohio3.632001Nevada2.442002Nevada2.93.2Python數(shù)據(jù)預(yù)處理和Series一樣,如果你傳遞了一個(gè)行,但不包括在data中,在結(jié)果中它會(huì)表示為NA值:>>>frame2=DataFrame(data,columns=['year','state','pop','debt'],index=['one','two','three','four','five'])>>>frame2yearstatepopdebtone2000Ohio1.5NaNtwo2001Ohio1.7NaNthree2002Ohio3.6NaNfour2001Nevada2.4NaNfive2002Nevada2.9NaN3.2Python數(shù)據(jù)預(yù)處理和Series一樣,在DataFrame中的一列可以通過字典記法或?qū)傩詠頇z索:>>>frame2['state']oneOhiotwoOhiothreeOhiofourNevadafiveNevadaName:state,dtype:object3.2Python數(shù)據(jù)預(yù)處理行也可以使用一些方法通過位置或名字來檢索,例如ix索引成員(field)。列可以通過賦值來修改。例如,空的‘debt’列可以通過一個(gè)純量或一個(gè)數(shù)組來賦值:>>>frame2.ix['three']year2002stateOhiopop3.6debtNaNName:three,dtype:object>>>frame2['debt']=16.5>>>frame2yearstatepopdebtone2000Ohio1.516.5two2001Ohio1.716.5three2002Ohio3.616.5four2001Nevada2.416.5five2002Nevada2.916.53.2Python數(shù)據(jù)預(yù)處理③數(shù)據(jù)清洗A處理缺失數(shù)據(jù)缺失數(shù)據(jù)(Missingdata)在大部分?jǐn)?shù)據(jù)分析應(yīng)用中都很常見。pandas的設(shè)計(jì)目標(biāo)之一就是讓缺失數(shù)據(jù)的處理任務(wù)盡量輕松。pandas使用浮點(diǎn)值NaN(NotaNumber)表示浮點(diǎn)和非浮點(diǎn)數(shù)組中的缺失數(shù)據(jù)。它只是一個(gè)便于被檢測(cè)出來的標(biāo)記而已:3.2Python數(shù)據(jù)預(yù)處理>>>string_data=Series(['aardvark','artichoke1','np.nan','avocado'])>>>string_data0aardvark1artichoke12np.nan3avocadodtype:object>>>string_data.isnull()0False1False2False3Falsedtype:boolPython內(nèi)置的None值也會(huì)被當(dāng)做NA處理:>>>string_data[0]=None>>>string_data.isnull()0True1False2False3Falsedtype:bool3.2Python數(shù)據(jù)預(yù)處理pandas中NA的主要表現(xiàn)為np.nan,另外Python內(nèi)建的None也會(huì)被當(dāng)做NA處理。處理NA的方法有四種:dropna,fillna,isnull,notnull。is(not)null,這一對(duì)方法對(duì)對(duì)象做元素級(jí)應(yīng)用,然后返回一個(gè)布爾型數(shù)組,一般可用于布爾型索引。過濾掉缺失數(shù)據(jù)的辦法有很多種。純手工操作永遠(yuǎn)都是一個(gè)辦法,但dropna可能會(huì)更實(shí)用一些。對(duì)于一個(gè)Series,dropna返回一個(gè)僅含非空數(shù)據(jù)和索引值的Series:>>>fromnumpyimportnanasNA>>>data=Series([1,NA,3.5,NA,7])>>>data.dropna()01.023.547.0dtype:float643.2Python數(shù)據(jù)預(yù)處理而對(duì)于DataFrame對(duì)象,事情就有點(diǎn)復(fù)雜了。你可能希望丟棄全NA或含有NA的行或列。dropna默認(rèn)丟棄任何含有缺失值的行:>>>data=DataFrame([[1.,6.5,3],[1.,NA,NA],[NA,NA,NA],[NA,6.5,3.]])>>>cleaned=data.dropna()>>>data012016.5311NaNNaN2NaNNaNNaN3NaN6.53>>>cleaned012016.533.2Python數(shù)據(jù)預(yù)處理傳入however將只丟棄全為NA的那些行:>>>data.dropna(how='all')012016.5311NaNNaN3NaN6.533.2Python數(shù)據(jù)預(yù)處理要用這種方式丟棄列,只需傳入axis=1即可:>>>data[4]=NA>>>data0124016.53NaN11NaNNaNNaN2NaNNaNNaNNaN3NaN6.53NaN>>>data.dropna(axis=1,how='all')012016.5311NaNNaN2NaNNaNNaN3NaN6.533.2Python數(shù)據(jù)預(yù)處理另一個(gè)濾除DataFrame行的問題涉及時(shí)間序列數(shù)據(jù)。假設(shè)你只想留下一部分觀測(cè)數(shù)據(jù),可以用thresh參數(shù)實(shí)現(xiàn)此目的:3.2Python數(shù)據(jù)預(yù)處理>>>df=DataFrame(np.random.randn(7,3))>>>df.ix[:4,1]=NA;df.ix[:2,2]=NA>>>df0120-0.904724NaNNaN1-0.378840NaNNaN20.781048NaNNaN30.514541NaN0.35156241.348453NaN1.88072650.6241530.120450-1.3324366-0.174811-1.265515-1.250462>>>df.dropna(thresh=3)01250.6241530.120450-1.3324366-0.174811-1.265515-1.250462不想濾除缺失數(shù)

溫馨提示

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

評(píng)論

0/150

提交評(píng)論