Python-與大數(shù)據(jù)分析(Python基礎(chǔ))_第1頁(yè)
Python-與大數(shù)據(jù)分析(Python基礎(chǔ))_第2頁(yè)
Python-與大數(shù)據(jù)分析(Python基礎(chǔ))_第3頁(yè)
Python-與大數(shù)據(jù)分析(Python基礎(chǔ))_第4頁(yè)
Python-與大數(shù)據(jù)分析(Python基礎(chǔ))_第5頁(yè)
已閱讀5頁(yè),還剩458頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

Python與大數(shù)據(jù)分析

——對(duì)外經(jīng)貿(mào)大學(xué)信息學(xué)院

2023/11/202023最新整理收集do

something自我介紹劉寧寧對(duì)外經(jīng)濟(jì)貿(mào)易大學(xué)信息學(xué)院講師。專注于對(duì)圖像分類(VisualObjectClassification)、文本處理(NaturalLanguageProcessing)、模式識(shí)別(PatternRecognition)等方面的研究。6.00@163.com2023/11/20為什么大數(shù)據(jù)首選是Python呢?2023/11/20第一部分初識(shí)Python第二部分基本概念變量、注釋、print函數(shù)、數(shù)據(jù)類型、算術(shù)運(yùn)算符、類型轉(zhuǎn)換第三部分?jǐn)?shù)據(jù)的容器列表、元組、字典、集合第四部分控制結(jié)構(gòu)與推導(dǎo)式2023/11/20第五部分?jǐn)?shù)據(jù)的讀寫操作2023/11/20第六部分錯(cuò)誤類型和異常捕獲第七部分字符編碼問題處理第八部分編寫函數(shù)處理數(shù)據(jù)第九部分變量作用域2023/11/20第十部分Python中的模塊第十一部分Python中的類第十五部分Numpy基礎(chǔ)知識(shí)第十六部分Pandas數(shù)據(jù)分析第十三部分正則表達(dá)式第十四部分日期數(shù)據(jù)的處理第一部分

初識(shí)PythonPython語言的誕生和發(fā)展歷史Python語言的特點(diǎn)運(yùn)行環(huán)境及安裝2023/11/20Python語言的誕生和發(fā)展歷史Python語言是一種解釋型、面向?qū)ο?、?dòng)態(tài)數(shù)據(jù)類型的高級(jí)程序設(shè)計(jì)語言Python語言是數(shù)據(jù)分析師的首選數(shù)據(jù)分析語言,也是智能硬件的首選語言數(shù)據(jù)分析創(chuàng)建復(fù)雜的Web應(yīng)用程序游戲開發(fā)動(dòng)畫電影效果……網(wǎng)站開發(fā)智能硬件開發(fā)2023/11/20Python與蟒蛇有關(guān)?Guido

van

Rossum于1989年在荷蘭國(guó)家數(shù)學(xué)和計(jì)算機(jī)科學(xué)研究所設(shè)計(jì)出來的Python語言的誕生BBC

“MontyPython‘sFlyingCircus”(蒙提·派森的飛行馬戲團(tuán))GuidovanRossum(人稱“龜叔”)2023/11/20Python2.0版本于2000年10月發(fā)布。在2008年12月,Python3.0發(fā)布,此版本沒有完全兼容之前的Python

2.0Python也因此分為了Python3.5派系和Python2.7派系兩大陣營(yíng)Python語言的發(fā)展歷史2023/11/20TIOBE

INDEX:編程語言流行程度排行榜Python語言的TIOBE

INDEX2023/11/20Python曾在2007年和2010年兩度被TIOBE排行榜評(píng)為“年度編程語言”現(xiàn)已成為了第五大流行編程語言(截至2016年10月)Python語言的TIOBE

INDEX2023/11/20Python語言的特點(diǎn)優(yōu)點(diǎn)一:優(yōu)雅、簡(jiǎn)單、明確(減少花哨、晦澀或以“炫技”為目的的代碼)讓數(shù)據(jù)分析師們擺脫了程序本身語法規(guī)則的泥潭,更快的進(jìn)行數(shù)據(jù)分析C語言Python語言2023/11/20優(yōu)點(diǎn)二:強(qiáng)大的標(biāo)準(zhǔn)庫(kù)完善的基礎(chǔ)代碼庫(kù),覆蓋了網(wǎng)絡(luò)通信、文件處理、數(shù)據(jù)庫(kù)接口、圖形系統(tǒng)、XML處理等大量?jī)?nèi)容,被形象地稱為“內(nèi)置電池”(batteriesincluded)Python使用者——“調(diào)包俠”2023/11/20優(yōu)點(diǎn)三:良好的可擴(kuò)展性大量的第三方模塊,覆蓋了科學(xué)計(jì)算、Web開發(fā)、數(shù)據(jù)接口、圖形系統(tǒng)等眾多領(lǐng)域,開發(fā)的代碼通過很好的封裝,也可以作為第三方模塊給別人使用。如Pandas、Numpy、Seaborn、Scikit-learn等等優(yōu)點(diǎn)四:免費(fèi)、開源2023/11/20缺點(diǎn)一:運(yùn)行速度慢缺點(diǎn)二:加密難缺點(diǎn)三:縮進(jìn)規(guī)則缺點(diǎn)四:多線程災(zāi)難Python語言的缺點(diǎn)2023/11/20Python語言與Java動(dòng)態(tài)類型和靜態(tài)類型Python中一切皆對(duì)象括號(hào)與縮進(jìn)應(yīng)用領(lǐng)域2023/11/20Python語言與R語言機(jī)器學(xué)習(xí)的一把利器可讀性強(qiáng),便于上手靈活性強(qiáng):可與其他如Web應(yīng)用程序進(jìn)行整合以統(tǒng)計(jì)推斷為導(dǎo)向數(shù)據(jù)分析之外的領(lǐng)域有所限制包凌亂且一致性較差2023/11/20Python語言與R語言的應(yīng)用場(chǎng)景對(duì)比網(wǎng)絡(luò)爬蟲連接數(shù)據(jù)庫(kù)內(nèi)容管理系統(tǒng)API構(gòu)建統(tǒng)計(jì)分析互動(dòng)式圖標(biāo)/面板2023/11/20運(yùn)行環(huán)境及安裝推薦使用Anaconda進(jìn)行Python安裝、環(huán)境配置及工具包管理IpythonqtconsolePyCharmJupyter

NotebookSpyder2023/11/20IPython鼓勵(lì)一種“執(zhí)行-探索”(execute-explore)的工作模式輸入代碼之后,按下回車,便會(huì)立即得到代碼運(yùn)行結(jié)果交互式計(jì)算和開發(fā)環(huán)境:IPython2023/11/20交互式計(jì)算和開發(fā)環(huán)境:IPython輸入“?”獲得IPython的詳細(xì)介紹輸入“%quickref”獲得IPython的快速參考2023/11/20交互式計(jì)算和開發(fā)環(huán)境:IPython輸入“help()”查看IPython的幫助文檔使用內(nèi)省“pandas?”查看Pandas的幫助文檔2023/11/20基于Qt框架的GUI控制臺(tái)——qtconsole為終端應(yīng)用程序提供諸如內(nèi)嵌圖片、多行編輯、語法高亮之類的富文本編輯功能啟動(dòng)命令:jupyter

qtconsole缺點(diǎn):功能少、用戶友好性不夠2023/11/20Jupyter

NotebookJulia+Python+R

=

Jupyter基于Web技術(shù)的交互式計(jì)算文檔格式支持Markdown和Latex語法支持代碼運(yùn)行、文本輸入、數(shù)學(xué)公式編輯、內(nèi)嵌式畫圖和其他如圖片文件的插入,是一個(gè)對(duì)代碼友好的筆記本2023/11/20Jupyter

NotebookJupyter支持包含R

kernel(支持R語言)啟動(dòng)命令:jupyter

notebook2023/11/20Jupyter

Notebook推薦使用JupyterNotebook進(jìn)行數(shù)據(jù)分析,并將自己數(shù)據(jù)分析的思考過程寫在其中,方便之后整理思路以及向別人展示數(shù)據(jù)分析結(jié)果從左至右分別是默認(rèn)Python終端、IPython和Jupyter

Notebook2023/11/20R

Notebook2016年10月,R語言的集成環(huán)境RStudio也擁有了自己的RNotebook了2023/11/20集成開發(fā)環(huán)境IDE——PyCharm

&

Spyder2023/11/20數(shù)據(jù)科學(xué)計(jì)算平臺(tái)——Anaconda“l(fā)eadingopendatascienceplatformpoweredbyPython自動(dòng)配置Python環(huán)境,下載并安裝JupyterNotebook、qtconsole和集成開發(fā)環(huán)境Spyder包管理器conda2023/11/20總結(jié)Python語言的特點(diǎn):優(yōu)雅、簡(jiǎn)單、易學(xué)Python語言的誕生與發(fā)展歷史Python語言的運(yùn)行環(huán)境:IPython、Jupyter

Notebook、Spyder…Python語言的數(shù)據(jù)科學(xué)計(jì)算平臺(tái):Anaconda2023/11/20實(shí)踐案例1:PyCharm下

HelloWorld通過例子說明Python與其他語言的區(qū)別萬物皆對(duì)象空格控制結(jié)構(gòu)報(bào)錯(cuò)2023/11/20第二部分

基本概念變量、注釋、print函數(shù)、數(shù)據(jù)類型算術(shù)運(yùn)算符、類型轉(zhuǎn)換2023/11/20解釋型語言PythonPython語言是一種解釋型、面向?qū)ο?、?dòng)態(tài)數(shù)據(jù)類型的高級(jí)程序設(shè)計(jì)語言2023/11/20數(shù)據(jù)集變量及相關(guān)含義公開數(shù)據(jù)集資源

UCI數(shù)據(jù)集

Kaggle數(shù)據(jù)集

Yahoo!股票價(jià)格數(shù)據(jù)

……2023/11/20用來存儲(chǔ)一些之后可能會(huì)變化的值對(duì)科比投籃ID為

1的一次投籃進(jìn)行分析,那么我們就可以創(chuàng)建一個(gè)名稱為shot_id的變量,并且將

1值儲(chǔ)存在變量shot_id

中如果之后我們想要分析科比的另外一次投籃,比如投籃ID為

2的投籃,我們只需要修改變量shot_id

的賦值,將shot_id

賦值為2

即可變量和常量變量2023/11/20變量名必須是大小寫英文字母、數(shù)字或下劃線_

的組合,不能用數(shù)字開頭,并且對(duì)大小寫敏感關(guān)鍵字不能用于命名變量(31個(gè)),如and、as、assert、break、class、continue、def、del等變量命名規(guī)則2023/11/20通過賦值運(yùn)算符

=變量名和想要賦予變量的值連接起來,變量的賦值操作就完成了聲明和定義的的過程,在其他語言中需要制定類型;同一變量可以反復(fù)賦值,而且可以是不同類型的變量,這也是Python語言稱之為動(dòng)態(tài)語言的原因變量賦值2023/11/20常量表示“不能變”的變量Python中是沒有常量的關(guān)鍵字的,只是我們常常約定使用大寫字母組合的變量名表示常量,也有不要對(duì)其進(jìn)行賦值”的提醒作用常量2023/11/20如同我們?cè)诳磿鴷r(shí)做筆記一樣Python語言會(huì)通過注釋符號(hào)識(shí)別出注釋的部分,將它們當(dāng)做純文本,并在執(zhí)行代碼時(shí)跳過這些純文本在Python語言中,使用

#進(jìn)行行注釋注釋2023/11/20多行注釋使用連續(xù)單個(gè)單引號(hào)或者雙引號(hào)2023/11/20在Python2.x版本中,同時(shí)兼容print

和print()在Python3.x版本中,print

函數(shù)為帶括號(hào)的print()如果想要看變量的值,則直接在

print后面加上變量名即可。如果是想要輸出提示信息,如一句話,那我們需要將提示信息用‘單引號(hào)包裹起來(這使得內(nèi)容構(gòu)成一個(gè)字符串)print函數(shù)2023/11/20使用逗號(hào),隔開變量與其他剩余內(nèi)容,則print

在輸出時(shí)會(huì)依次打印各個(gè)字符串或變量,遇到逗號(hào),時(shí)會(huì)輸出一個(gè)空格print

函數(shù)不僅可以打印變量值,也可以打印計(jì)算結(jié)果2023/11/20Python語言的數(shù)據(jù)類型包括整型、浮點(diǎn)型、字符串、布爾型和空值整型(int)整型的取值為整數(shù),有正有負(fù),如

2,-666,666

等。在科比投籃數(shù)據(jù)集中,shot_id、game_event_id、game_id、loc_x、loc_y、minutes_remaining、period、playoffs、seconds_remaining、shot_distance、shot_made_flag、team_id都是整型變量數(shù)據(jù)類型2023/11/20浮點(diǎn)型的取值為小數(shù),當(dāng)計(jì)算有精度要求時(shí)被使用,由于小數(shù)點(diǎn)可以在相應(yīng)的二進(jìn)制的不同位置浮動(dòng),故而稱為浮點(diǎn)數(shù)如

3.14,-6.66

等,但是如果是非常大或者非常小的浮點(diǎn)數(shù),就需要使用科學(xué)計(jì)數(shù)法表示,用

e

代替

10

。科比投籃數(shù)據(jù)集中的

lat

和lon

為浮點(diǎn)型變量。浮點(diǎn)型(float)2023/11/20字符串(str)字符串是以兩個(gè)單引號(hào)或兩個(gè)雙引號(hào)包裹起來的文本字符串JumpShot包括J,u,m,p,空格,S,h,o,t

這9個(gè)字符字符串(str)2023/11/20轉(zhuǎn)義字符:字符串里常常存在一些如換行、制表符等有特殊含義的字符,這些字符稱之為轉(zhuǎn)義字符比如

\n

表示換行,

\t

表示制表符,Python還允許用r“

”表示“”內(nèi)部的字符串默認(rèn)不轉(zhuǎn)義2023/11/20布爾型(bool)布爾型只有

True

False

兩種值。比較運(yùn)算和條件表達(dá)式都會(huì)產(chǎn)生

True

False

布爾型(bool)2023/11/20布爾型(bool)布爾值可以進(jìn)行

and

、

or

not

運(yùn)算,

and

or

運(yùn)算分別用

&

|

表示and運(yùn)算or運(yùn)算2023/11/20布爾型(bool)

not

運(yùn)算為非運(yùn)算,即把

True

變成

False

,

False

變成

True

。2023/11/20空值是Python里一個(gè)特殊的值,用

None

表示,一般用

None

填充表格中的缺失值使用type()

函數(shù)來獲取某值的類型空值(NoneType)2023/11/20數(shù)據(jù)集變量的數(shù)據(jù)類型總結(jié)int64、float64分別表示64位的整型和64位的浮點(diǎn)型2023/11/20日期數(shù)據(jù)類型還有一種特殊的數(shù)據(jù)類型——日期類型這種類型數(shù)據(jù)在金融、交通等領(lǐng)域十分常見,我們將在日期數(shù)據(jù)的處理這一部分對(duì)這一類型的數(shù)據(jù)分析進(jìn)行詳細(xì)講解2023/11/20二元數(shù)學(xué)運(yùn)算符算術(shù)運(yùn)算符2023/11/20Python2.x版本與Python3.x版本(以下簡(jiǎn)稱Python2和Python3)的整除是不同的。2023/11/20函數(shù)

int()、float()、str()

和bool()

分別用于將變量轉(zhuǎn)換成整型、浮點(diǎn)型、字符串和布爾型變量類型轉(zhuǎn)換2023/11/20某些變量無法轉(zhuǎn)換成數(shù)值型變量2023/11/20只有在變量值為0時(shí),bool

轉(zhuǎn)換的結(jié)果才為False:2023/11/20除了使用type()

外,我們還可以使用isinstance()

來獲得數(shù)據(jù)類型2023/11/20總結(jié)數(shù)據(jù)類型、算術(shù)運(yùn)算符、類型轉(zhuǎn)換變量、注釋、print函數(shù)2023/11/20第三部分

數(shù)據(jù)的容器(結(jié)構(gòu))列表、元組、字典、集合2023/11/20列表科比投籃數(shù)據(jù)集列表(list)是一個(gè)有序的序列結(jié)構(gòu),序列中的元素可以是不同的數(shù)據(jù)類型列表可以進(jìn)行一系列序列操作,如索引、切片、加、乘和檢查成員等2023/11/20將列表中的各元素用逗號(hào)分隔開,并用中括號(hào)將所有元素包裹起來列表創(chuàng)建2023/11/20使用append()方法添加元素,該方法會(huì)在列表末尾位置添加數(shù)據(jù)元素使用remove()方法刪除元素列表對(duì)象的增減2023/11/20實(shí)踐練習(xí)現(xiàn)有一空的列表“kobe_list”用來存入科比某次投籃的信息請(qǐng)利用append()方法將投籃ID2、投籃類型'JumpShot'、科比所在球隊(duì)'LosAngelesLakers'和對(duì)手'POR'按順序加入到列表變量kobe_list中2023/11/20remove()方法適用于知道要?jiǎng)h除的值的情況,當(dāng)我們不知道具體元素值,但是知道元素的索引位置時(shí),我們可以使用del

函數(shù)配合列表索引,刪除索引位置的元素或者使用pop()方法列表對(duì)象的增減2023/11/20通過insert()

方法在指定的索引位置添加數(shù)據(jù)元素列表對(duì)象的增減2023/11/20實(shí)踐練習(xí)kobe_list=[2,'LosAngelesLakers','JumpShot','POR']現(xiàn)在需要添加更多關(guān)于科比某次投籃的信息,包括投籃位置(按區(qū)域劃分)、比賽日期和對(duì)陣形式(主場(chǎng)或者客場(chǎng))在kobe_list插入‘LeftSide(L)’,‘2000-10-31’,和'LAL@POR'并刪除數(shù)據(jù)元素2在'LosAngelesLakers'之后加上matchup的值2023/11/20Python語言中所有的索引都是從0開始計(jì)數(shù)的,如果列表中有n個(gè)元素,那么最后一個(gè)元素的索引是n-1

如果我們想要獲取kobe_list中第3個(gè)元素及倒數(shù)第二個(gè)元素列表索引2023/11/20Python內(nèi)置的用于判斷列表長(zhǎng)度的函數(shù)為len()列表長(zhǎng)度2023/11/20切片操作需要提供起始索引位置和最后索引位置,然后用冒號(hào):將兩者分開如果未輸入步長(zhǎng),則默認(rèn)步長(zhǎng)為1切片操作返回一系列從起始索引位置開始到最后索引位置結(jié)束的數(shù)據(jù)元素需要注意的是,起始索引位置的值包含在返回結(jié)果中,而最后索引位置的值不包含在返回結(jié)果中列表切片2023/11/20切片操作需要提供起始索引位置和最后索引位置,然后用冒號(hào):將兩者分開列表切片2023/11/20逆向切片我們可以省略起始索引位置,表示從最開始進(jìn)行切片,當(dāng)我們將兩個(gè)索引都省略之后,我們將按原樣復(fù)制一個(gè)列表,如果想要將列表的順序顛倒,則可以使用::-1列表切片2023/11/20列表中的元素也可以是列表,這樣可以將列表看成更高維的數(shù)組拆開很容易理解嵌套列表2023/11/20實(shí)踐練習(xí)現(xiàn)有科比某次投籃信息的列表kobe_listkobe_list=['LosAngelesLakers','LAL@POR','JumpShot','POR','LeftSide(L)','2000-10-31']請(qǐng)使用切片方法取出索引位置3到5的元素,并存入到列表three_five中并提取比賽日期中的年份存入變量year中提示:讀取年份時(shí),先使用索引方法將kobe_list或者three_five最后一個(gè)日期元素值'2000-10-13'提取出來,索引位置為-1,然后對(duì)該字符串進(jìn)行切片操作,切片為0:42023/11/20元組元組(tuple)數(shù)據(jù)結(jié)構(gòu)與列表類似,其中元素可以有不同的類型但是元組中的元素是不可變的,即一旦初始化之后,就不能夠再做修改(報(bào)錯(cuò):元組對(duì)象不支持賦值)2023/11/20由于元組是不可變的,因此元組對(duì)象沒有append()、insert()和del這樣的方法。實(shí)際上,tuple的使用可以使得代碼更安全,防止錯(cuò)誤賦值導(dǎo)致重要對(duì)象的改變。2023/11/20實(shí)踐練習(xí)現(xiàn)有科比某次投籃信息的元組kobe_tuplekobe_tuple=([2,'JumpShot'],'LosAngelesLakers','POR')請(qǐng)將kobe_tuple中的投籃ID由2改為3,投籃類型由JumpShot改為'SlamDunkShot'提示:通過kobe_tuple[][]方式訪問元組中的列表元素中的某一個(gè)元素2023/11/20字典字典(dict)在其他語言中被稱作哈希映射(hashmap)或者相關(guān)數(shù)組(associativearrays)字典是一種大小可變的鍵值對(duì)集,其中的鍵(key)和值(value)都是Python對(duì)象字典用在需要高速查找的地方2023/11/20字典的創(chuàng)建使用大括號(hào){}

包含鍵值對(duì),并用冒號(hào):

分隔鍵和值,形成鍵:值對(duì)可以看出,字典中的數(shù)據(jù)元素是無序的,并不會(huì)按照初始化的順序排列。不同鍵所對(duì)應(yīng)的值可以相同,但是字典中的鍵必須是唯一的字典創(chuàng)建2023/11/20利用for循環(huán)和zip()函數(shù)創(chuàng)建字典zip()函數(shù)用于將多個(gè)序列(列表、元組等)中的元素配對(duì),產(chǎn)生一個(gè)如[(列表1元素,列表2元素),(,)]

的新的元組列表;for循環(huán)用于重復(fù)執(zhí)行將值放入鍵中的操作。字典創(chuàng)建2023/11/20實(shí)踐練習(xí)請(qǐng)創(chuàng)建關(guān)于科比投籃信息的字典kobe_dict,鍵為shot_id,值為shot_zone_area其中列表shot_id與列表shot_zone_area應(yīng)按照順序一一對(duì)應(yīng)shot_id=[1,2,3]shot_zone_area=['RightSide(R)','LeftSide(L)','LeftSideCenter(LC)']2023/11/20字典的元素訪問(以及插入、設(shè)置)方式與列表和元組一樣。不同的是,列表和元組的索引號(hào)是按照順序自動(dòng)生成,而字典的索引號(hào)是鍵字典索引字典中某值的索引還可以通過get方法,如果字典不包含某個(gè)鍵,可以返回None,或者自己指定的值2023/11/20如果在字典中不存在索引的鍵,則系統(tǒng)會(huì)報(bào)錯(cuò)字典索引2023/11/20我們可以通過in

判斷是否存在某個(gè)鍵,其語法跟在列表和元組中判斷是否存在某個(gè)值是相同的,也可以使用內(nèi)置的has_key()

方法字典索引2023/11/20如果不太確定字典中有哪些鍵或者值,我們可以使用keys()

方法或者values()方法字典索引2023/11/20在有些情況下,我們需要取出字典中的鍵值對(duì)用于下一步的分析,此時(shí)可以使用items()

方法,該方法將返回所有鍵值對(duì),并將其保存在一個(gè)元組列表(列表中的元素為元組)中字典索引2023/11/20字典的刪減有三種方法使用del

函數(shù)對(duì)單一元素或者整個(gè)字典進(jìn)行刪除使用pop()

方法刪除單一元素使用clear()方法清空詞典的所有元素字典元素刪減2023/11/20集合集合(set)是一種無序集,它是一組鍵的集合,不存儲(chǔ)值在集合中,重復(fù)的鍵是不被允許的。集合可以用于去除重復(fù)值集合也可以進(jìn)行數(shù)學(xué)集合運(yùn)算,如并、交、差以及對(duì)稱差等。應(yīng)用:

去重。把一個(gè)列表變成集合,就自動(dòng)去重了

關(guān)系測(cè)試。測(cè)試兩組數(shù)據(jù)之前的交集、差集、并集等關(guān)系2023/11/20集合的創(chuàng)建有兩種方式:使用set()

函數(shù)或者使用大括號(hào){}需要注意的是,創(chuàng)建空集合,必須使用set()

,而不是{},因?yàn)閧}表示創(chuàng)建一個(gè)空的字典集合創(chuàng)建2023/11/20集合支持?jǐn)?shù)學(xué)集合運(yùn)算,如并、交、差以及對(duì)稱差等集合運(yùn)算2023/11/20集合支持?jǐn)?shù)學(xué)集合運(yùn)算,如并、交、差以及對(duì)稱差等集合運(yùn)算2023/11/20總結(jié)創(chuàng)建、索引、增減、切片操作列表、元組、字典、集合2023/11/20第四部分

控制結(jié)構(gòu)if選擇結(jié)構(gòu)、for循環(huán)結(jié)構(gòu)、while循環(huán)結(jié)構(gòu)2023/11/20布爾值在這個(gè)世界上,文字和認(rèn)知中有真和假的判斷,而對(duì)于計(jì)算機(jī)而言,布爾值True和False就表示真和假

True、False是比較顯式的真和假,而在Python中以下值都會(huì)被看作是假(False):2023/11/20==

符號(hào)是判斷兩個(gè)值、變量之間是否相等的操作符,相等則返回布爾值True對(duì)于字符型變量也是可以這么操作的:==

符號(hào)2023/11/20if選擇結(jié)構(gòu)判斷條件為真(True)的時(shí)候才執(zhí)行冒號(hào)后下面的語句比如現(xiàn)在我們已有一個(gè)精靈寶貝的HP值,而我只希望當(dāng)這個(gè)HP值大于

20的時(shí)候才打印出來2023/11/20除了if語句外,還有if-else、if-elif語句2023/11/20for循環(huán)結(jié)構(gòu)

for循環(huán)是可以依次得到序列循環(huán)中每個(gè)元素,并依次處理2023/11/20現(xiàn)在有一個(gè)列表,這個(gè)列表存放的是10個(gè)小精靈的HP數(shù)值,現(xiàn)在希望得到里面每個(gè)數(shù)字都乘以2

2023/11/20while循環(huán)結(jié)構(gòu)while循環(huán)和for循環(huán)不同的是,它的停止條件是個(gè)人自己設(shè)定的:判斷條件和if語句是相同的,而什么時(shí)候用while呢?在你確定滿足條件而不確定需要的循環(huán)次數(shù)時(shí),那么while是最好的選擇?,F(xiàn)在有一個(gè)小精靈的HP數(shù)值變量,我希望它在大于20的時(shí)候,逐次變小,直到等于20為止。2023/11/20組合使用除了單獨(dú)使用上述控制結(jié)構(gòu)之外,我們還可以嵌套使用。比如說在前面的HP序列,我只希望其中的偶數(shù)乘以”2”,奇數(shù)不變。2023/11/20python作為一種簡(jiǎn)潔、直接、貼近人類自然語言的計(jì)算機(jī)語言,它對(duì)于基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)tuple、list、dict內(nèi)嵌了很多十分方便的函數(shù)和操作。在前面章節(jié)介紹的方法之外,這章將介紹在list/dict內(nèi)部使用for循環(huán)來構(gòu)造list/dict的方法。這些方法將讓我們更加美觀可讀、方便簡(jiǎn)潔地實(shí)現(xiàn)一些功能。列表推導(dǎo)式2023/11/20列表推導(dǎo)式list是使用python過程中是一個(gè)非常常用的數(shù)據(jù)結(jié)構(gòu),無論是作為最終數(shù)據(jù)的保存結(jié)果,還是中間數(shù)據(jù)結(jié)果的臨時(shí)存儲(chǔ),都能提供很方便的功能。使用列表推導(dǎo)式可以讓循環(huán)在列表內(nèi)完成。2023/11/20以下為例子,對(duì)列表中每個(gè)數(shù)值逐個(gè)減去均值2023/11/20含義解析:關(guān)鍵詞for循環(huán)后跟的是循環(huán)語法,這部分不變;而在for循環(huán)真正表達(dá)式部分則在列表推導(dǎo)式中移前,運(yùn)算結(jié)果直接添加入列表中。2023/11/20字典也可以用推導(dǎo)式,但沒有列表推導(dǎo)式那么常用。字典推導(dǎo)式多用于需要元素有一一對(duì)應(yīng)關(guān)系時(shí),比如前面談到當(dāng)變量是字符型時(shí),需要將字符轉(zhuǎn)換為一一對(duì)應(yīng)的數(shù)值型。字典推導(dǎo)式2023/11/20UnitedStatesEnergy,Census,andGDP2010-2014數(shù)據(jù)集中Region變量是字符型,如現(xiàn)需要對(duì)其進(jìn)行數(shù)值轉(zhuǎn)換。2023/11/20enumerate

是Python的一個(gè)常用內(nèi)置函數(shù),它用在列表中時(shí),不但會(huì)產(chǎn)生列表內(nèi)的元素,并且會(huì)從"0"開始按順序生成序號(hào)。2023/11/20總結(jié)for循環(huán)、while循環(huán)布爾值、if條件判斷列表推導(dǎo)式、字典推導(dǎo)式2023/11/20第五部分

數(shù)據(jù)文件的讀寫操作2023/11/20數(shù)據(jù)的讀取對(duì)文件操作之前需要用open()

函數(shù)打開文件

mode

參數(shù)中的r指讀出,

w指寫入打開之后將返回一個(gè)文件對(duì)象(fileobject),后續(xù)對(duì)文件內(nèi)數(shù)據(jù)的操作都是基于這個(gè)文件對(duì)象的方法(method)來實(shí)現(xiàn)的2023/11/20數(shù)據(jù)的讀取對(duì)文件數(shù)據(jù)的讀取是用的read()

方法,read()

方法將返回文件中的所有內(nèi)容用print打印所有內(nèi)容會(huì)顯示Hello,world!

,記得每次用完文件后,都要關(guān)閉文件f.close()。否則,文件就會(huì)一直被Python占用,不能被其他進(jìn)程使用2023/11/20數(shù)據(jù)的讀取也可以使用withopen()asf:

在操作后自動(dòng)關(guān)閉文件2023/11/20數(shù)據(jù)的讀取在

read()

中加入數(shù)字,可指定讀取的字符數(shù)2023/11/20數(shù)據(jù)的寫入寫入的操作和讀取是類似的,不過用的是write()

函數(shù),同時(shí)需要將打開文件的mode參數(shù)設(shè)置為

w

2023/11/20文本文件的操作常見的數(shù)據(jù)文件包括txt

格式或者csv(逗號(hào)分隔值文件格式)格式文2023/11/20文本文件的讀取通過open()函數(shù)打開文件,返回文件對(duì)象對(duì)文件對(duì)象進(jìn)行讀取操作,除了前面介紹的read()

之外還有兩種讀取數(shù)據(jù)的方法:

readline()

是每次讀入一條數(shù)據(jù)的方式,readlines()

是一次性讀入文件所有數(shù)據(jù)2023/11/20文本文件的讀取

readlines()

讀取后得到的是每行數(shù)據(jù)組成的列表,但是一行樣本數(shù)據(jù)全部存儲(chǔ)為一個(gè)字符串,并且數(shù)據(jù)讀入后并沒有將換行符去掉(windows系統(tǒng)的換行符是

\r\n

,linux系統(tǒng)的換行符號(hào)是

\n)在讀入數(shù)據(jù)之后,用

for循環(huán)對(duì)每一個(gè)元素去除換行符,并將每一個(gè)變量值用字符串處理方法

.split()

分隔開來2023/11/20文本文件的讀取

.strip()

本身是一個(gè)對(duì)字符串指定字符去除的方法,但括號(hào)里參數(shù)為空的時(shí)候,就會(huì)去除\r\n\t

2023/11/20文本文件的寫入設(shè)置參數(shù)mode=w。

write()、writelines()

是兩個(gè)對(duì)文件對(duì)象的寫入數(shù)據(jù)的方法。write()是逐次寫入,writelines()可對(duì)一個(gè)列表里的所有數(shù)據(jù)一次性寫入文件中如果有換行需要,則要在每條數(shù)據(jù)后增加換行符,同時(shí)用字符串.join()

的方法將每個(gè)變量數(shù)據(jù)聯(lián)合成一個(gè)字符串并增加間隔符

\t2023/11/20逗號(hào)分隔值文件的操作csv文件用逗號(hào),作為分隔符2023/11/20逗號(hào)分隔值文件的讀取利用Python內(nèi)置的

csv

模塊讀取數(shù)據(jù)2023/11/20逗號(hào)分隔值文件的寫入引入csv模塊

open()

打開文件,使用csv.writer()

作為寫入器,

writerow()方法逐行寫入2023/11/20總結(jié)open()、write()、readlines()、.strip()、.join()文本文件讀寫操作、逗號(hào)分隔值文件讀寫操作csv模塊、csv.reader()、csv.writer()2023/11/20實(shí)踐案例2:

白葡萄酒品質(zhì)探索2023/11/20第六部分

錯(cuò)誤類型和異常捕獲錯(cuò)誤類型語法錯(cuò)誤異常捕獲異常assert、with語句自助控制異常爬蟲HTTP異常處理2023/11/20錯(cuò)誤類型語法錯(cuò)誤(Syntaxerrors)代碼編譯時(shí)的錯(cuò)誤,不符合Python語言規(guī)則的代碼會(huì)停止編譯并返回錯(cuò)誤信息異常(Exceptions)相較于語法錯(cuò)誤,異常比較難發(fā)現(xiàn),因?yàn)樗辉诖a運(yùn)行時(shí)才會(huì)發(fā)生,如類型錯(cuò)誤、數(shù)值錯(cuò)誤、索引錯(cuò)誤和屬性錯(cuò)誤等。語法錯(cuò)誤包含在異?;愔绣e(cuò)誤類型2023/11/20錯(cuò)誤類型Python與Java異常類層級(jí)區(qū)別Java異常類層級(jí)BaseExceptionExceptionStandardErrorRuntimeErrorMemoryErrorRuntimeErrorSyntaxError……StopIterationWarningSystemExitKeyboardInterruptGeneratorExitPython異常類層級(jí)2023/11/20語法錯(cuò)誤常見的語法錯(cuò)誤(SyntaxError)包括:缺少起始符號(hào)或結(jié)尾符號(hào)(括號(hào)、引號(hào)等)縮進(jìn)錯(cuò)誤關(guān)鍵詞拼寫錯(cuò)誤語法錯(cuò)誤2023/11/20語法錯(cuò)誤常見的語法錯(cuò)誤(SyntaxError)包括:缺少起始符號(hào)或結(jié)尾符號(hào)(括號(hào)、引號(hào)等)縮進(jìn)錯(cuò)誤關(guān)鍵詞拼寫錯(cuò)誤語法錯(cuò)誤2023/11/20語法錯(cuò)誤常見的語法錯(cuò)誤(SyntaxError)包括:缺少起始符號(hào)或結(jié)尾符號(hào)(括號(hào)、引號(hào)等)縮進(jìn)錯(cuò)誤關(guān)鍵詞拼寫錯(cuò)誤語法錯(cuò)誤修改語法錯(cuò)誤實(shí)戰(zhàn)演練http:///learn/course/2/lecture/148/2023/11/20異常通常由以下問題引起:在定義函數(shù)之前就引用該函數(shù)調(diào)用不屬于某個(gè)對(duì)象的方法或者屬性試圖將某個(gè)值轉(zhuǎn)換為不恰當(dāng)?shù)臄?shù)據(jù)類型異常2023/11/20除零錯(cuò)誤(ZeroDivisionError):除數(shù)為0名稱錯(cuò)誤(NameError):變量使用前未進(jìn)行申明或者初始化聚類分析六種典型的異常2023/11/20類型錯(cuò)誤(TypeError):某些函數(shù)或者方法只適用于特定的數(shù)據(jù)類型,如果對(duì)數(shù)據(jù)類型的操作不當(dāng),就會(huì)產(chǎn)生類型錯(cuò)誤數(shù)值錯(cuò)誤(ValueError):在輸入類型正確的情況下,具體輸入值錯(cuò)誤聚類分析六種典型的異常2023/11/20索引錯(cuò)誤(IndexError):超出序列長(zhǎng)度的索引操作屬性錯(cuò)誤(AttributeError):方法或者屬性不適用該對(duì)象聚類分析六種典型的異常2023/11/20異常層級(jí)檢查、修改語法錯(cuò)誤和異常實(shí)戰(zhàn)演練http:///learn/course/2/lecture/149/2023/11/20代碼編寫環(huán)境自帶的高亮顯示便于發(fā)現(xiàn)常規(guī)語法錯(cuò)誤但難于發(fā)現(xiàn)異常Jupyter

NotebookPyCharm捕獲異常2023/11/20程序要遇到異常的時(shí)候,往往是直接中斷,跳出執(zhí)行。但是有些時(shí)候,我們需要在遇到異常的時(shí)候另外處理,而不是直接停止。解決方法:try...except...語句try...except...else語句finally子句捕獲異常2023/11/20捕獲異常try...except...語句

try關(guān)鍵詞內(nèi)執(zhí)行的是正常代碼,當(dāng)這部分代碼出錯(cuò)的時(shí)候,會(huì)跳過錯(cuò)誤代碼后進(jìn)入

except關(guān)鍵詞內(nèi)部,執(zhí)行此部分的代碼2023/11/20try...except...else語句當(dāng)在

try...except...后加入的

else

指,當(dāng)程序沒發(fā)生錯(cuò)誤時(shí)執(zhí)行的部分2023/11/20try...except...else…工作原理是執(zhí)行第一個(gè)匹配該異常的except子句開始執(zhí)行try部分try部分執(zhí)行異常否執(zhí)行else部分語句,控制流通過整個(gè)try語句2023/11/20finally子句

finally語句是指,無論程序運(yùn)行對(duì)或錯(cuò),都會(huì)執(zhí)行的部分2023/11/20assert關(guān)鍵字當(dāng)Expression部分為True時(shí),則正確執(zhí)行,程序繼續(xù)下去;當(dāng)判斷為False時(shí),則拋出后面的e錯(cuò)誤提示。在大型的項(xiàng)目中,assert常被用來作為“防御性編程”assert、with語句2023/11/20with語句有時(shí)候打開了文件卻忘記關(guān)閉,或者是在讀取文件過程出錯(cuò),那么"with"語句能夠很好解決關(guān)于文件讀取、寫入的問題上面的語句等價(jià)于兩種特殊的簡(jiǎn)便方法2023/11/20自主控制異常除了在代碼運(yùn)行出錯(cuò)時(shí)觸發(fā)錯(cuò)誤,我們還可以主動(dòng)控制拋出異常,通過使用關(guān)鍵詞

raise(類似Java語言中的throw)自主控制異常:拋出異常2023/11/20自主控制異常自定義異常的原因Python提供的內(nèi)建異常不夠用可以預(yù)估某個(gè)錯(cuò)誤的產(chǎn)生自主控制異常:用戶自定義異常定義異常類繼承于Exception類,由它開始擴(kuò)展2023/11/20自主定義的NotIntError異常類,捕獲非整型錯(cuò)誤ASCII編碼集2023/11/20在編寫API時(shí),定義一個(gè)Root

Exception根異常,其他異常都繼承于根異常好處1:API代碼層次更清晰好處2:API與調(diào)用程序代碼隔離如:需要做一個(gè)鏈接數(shù)據(jù)庫(kù)服務(wù)的模塊,提供一個(gè)connect函數(shù)用于鏈接,鏈接可能出現(xiàn)情況:Socket連接超時(shí)Socket拒絕連接聚類分析以定義API異常為例2023/11/20這樣精確定義多個(gè)異常,使得代碼層次清晰,增強(qiáng)了可讀性在代碼的最后還捕獲了Error以及Exception兩個(gè)異常,這兩個(gè)操作分別對(duì)應(yīng)于可拓展性與健壯性的目的聚類分析調(diào)用API時(shí)異常捕獲的技巧2023/11/20編寫工具類函數(shù)時(shí),函數(shù)處理流程會(huì)產(chǎn)生很多狀態(tài)用返回值代表函數(shù)處理狀態(tài),調(diào)用者需要去理解每個(gè)狀態(tài)碼的意義,存在學(xué)習(xí)成本聚類分析使用異常代替返回狀態(tài)碼2023/11/20使用異常的方式2023/11/20增強(qiáng)代碼的魯棒性而不必影響程序的主邏輯,專注程序主邏輯,保持代碼的簡(jiǎn)潔清晰異常判斷是就地實(shí)時(shí)的,與代碼運(yùn)行是實(shí)時(shí)的一些低調(diào)用級(jí)別的代碼塊沒有判斷和處理其上級(jí)調(diào)用模塊的權(quán)限或者根本無法判斷,只能由其上級(jí)調(diào)用模塊來決定下一步怎么做,這時(shí)當(dāng)前模塊可以不用處理,將錯(cuò)誤拋出給調(diào)用者利用拋出異常并處理的優(yōu)點(diǎn)2023/11/20異常處理應(yīng)該與正常流程控制分離異常處理與流程控制異常處理搞亂了代碼邏輯將異常代碼塊抽離到另外的函數(shù)中2023/11/20網(wǎng)絡(luò)爬蟲框架爬蟲HTTP異常處理URL管理模塊,負(fù)責(zé)管理、調(diào)度所有URL爬蟲啟動(dòng)的入口,通常是一組URL下載模塊,為了提高效率,Crawler通常是并行的。解析模塊,從網(wǎng)頁(yè)中解析出有價(jià)值的信息,并將新發(fā)現(xiàn)的URL加入到URLQueue中。存儲(chǔ)模塊,將數(shù)據(jù)存在存儲(chǔ)介質(zhì)中,通常是文件或數(shù)據(jù)庫(kù)。2023/11/20獲取要訪問的URL的IP地址(右圖中標(biāo)號(hào)為1、2)向WebServer請(qǐng)求資源(右圖中標(biāo)號(hào)為3)WebServer收到請(qǐng)求,將響應(yīng)返回給客戶端(右圖中標(biāo)號(hào)為4)聚類分析HTTP請(qǐng)求過程2023/11/20①URLError:不能夠處理一個(gè)response網(wǎng)絡(luò)無連接,即本機(jī)無法上網(wǎng)連接不到特定的服務(wù)器服務(wù)器不存在聚類分析HTTP請(qǐng)求過程的兩種常見異常2023/11/20②HTTPError:URLError的子類,在特定的HTTP

URLs中產(chǎn)生每一個(gè)HTTP響應(yīng)對(duì)象response包含一個(gè)數(shù)字“狀態(tài)碼”urllib2

會(huì)幫助處理重定向問題,不能處理則產(chǎn)生HTTPError狀態(tài)碼:404-頁(yè)面無法找到,403-請(qǐng)求禁止,401-帶驗(yàn)證請(qǐng)求2023/11/20①捕獲到HTTPError,輸出code,不再處理URLError異常。如果發(fā)生的不是HTTPError,則去捕獲URLError異常,輸出錯(cuò)誤原因聚類分析異常處理技巧2023/11/20異常處理技巧②利用

hasattr

方法提前對(duì)異常的屬性進(jìn)行判斷,以免出現(xiàn)屬性輸出報(bào)錯(cuò)的現(xiàn)象2023/11/20只處理你知道的異常,避免捕獲所有異常然后吞掉它們拋出的異常應(yīng)該說明原因,有時(shí)候你知道異常類型也猜不出所以然的不要使用異常來控制流程,那樣你的程序會(huì)無比難懂和難維護(hù)如果有需要,切記使用finally來釋放資源一些經(jīng)驗(yàn)2023/11/20總結(jié)捕獲異常語法錯(cuò)誤和異常拋出異常,自定義異常類assert,with語句爬蟲HTTP異常處理,URLError,HTTPError,code,reason2023/11/20第七部分

字符編碼問題處理編碼和解碼編碼集解決亂碼2023/11/20編碼是為了讓機(jī)器讀懂語言。即輸入的是字符“中文”,那么編碼就是將“中文”編碼為二進(jìn)制格式讓機(jī)器讀懂在Python中,機(jī)器其實(shí)是不認(rèn)識(shí)unicode的,而是接收的

str

即使輸入的數(shù)據(jù)是unicode的,而在Python內(nèi)部都會(huì)將

unicode

自動(dòng)轉(zhuǎn)為str

編碼和解碼電腦編碼(encode)strunicode解碼(decode)2023/11/20編碼和解碼進(jìn)攻編碼鼓聲士兵解碼行為2023/11/20

str通過解碼函數(shù)decode()轉(zhuǎn)換為unicode,unicode通過編碼函數(shù)encode()

轉(zhuǎn)換為

str

http:///learn/course/2/lecture/96/2023/11/20電腦只”認(rèn)識(shí)”

0

1二進(jìn)制數(shù)值,從一開始,人們想到的方法就是賦予每一個(gè)字符唯一的一串0

1

編碼表示。這是一個(gè)ASCII編碼集中對(duì)字符

A的編碼,這是一個(gè)八位0/1

數(shù)字01000001編碼集2023/11/20在1967年出現(xiàn)了ASCII標(biāo)準(zhǔn),這主要是基于拉丁字母的一套電腦編碼系統(tǒng)ASCII標(biāo)準(zhǔn)是每個(gè)英文字母有一一對(duì)應(yīng)獨(dú)立的8位數(shù)字串,比如說字母A,ASCII中對(duì)應(yīng)的二進(jìn)制值為01000001

。這樣,我在輸入A的時(shí)候,編譯器會(huì)借助編碼集將A轉(zhuǎn)換為01000001聚類分析01000001ASCII編碼集2023/11/20ASCII總共可以存儲(chǔ)256個(gè)字符,1967年制定這套標(biāo)準(zhǔn)的人只考慮英語世界的使用者。那么256個(gè)編碼集對(duì)于使用英語和拉丁語系是夠用的,但是對(duì)于中文、日文、韓文,就完全不夠用了ASCII聚類分析ASCII編碼集2023/11/20聚類分析ASCII聚類分析ASCII編碼集2023/11/20聚類分析GB2312編碼集是由中國(guó)國(guó)家標(biāo)準(zhǔn)總局發(fā)布1981年5月1日實(shí)施的一套收錄了6763個(gè)漢字、拉丁字母、希臘字母、日文平假名及片假名字母、俄語西里爾字母在內(nèi)的682個(gè)字符的標(biāo)準(zhǔn)。但是這套標(biāo)準(zhǔn)沒有包含部分罕見字和繁體字,于是后面出現(xiàn)GBK、GB18030在GB2312的基礎(chǔ)上進(jìn)行擴(kuò)充解決。GBK2023/11/20聚類分析Unicode是標(biāo)準(zhǔn)統(tǒng)一所有語言文字的標(biāo)準(zhǔn)編碼集,它目前已經(jīng)收錄超過十萬個(gè)字符Unicode包括兩個(gè)方面編碼方式(一個(gè)字符對(duì)應(yīng)編碼集中的二進(jìn)制數(shù)值)實(shí)現(xiàn)方式(傳輸、存儲(chǔ)):UTF-8、UTF-16Unicode2023/11/20Python

2.x版本有兩種用于字符處理的數(shù)據(jù)格式:str和unicodestr

字節(jié)流是以兩個(gè)單引號(hào)

‘’或兩個(gè)單引號(hào)

“”來賦值的,訪問一個(gè)元素就是一個(gè)字節(jié)Python字符串2023/11/20Python字符串unicode

字符串是在‘’或“”前加u來賦值的,同時(shí)訪問一個(gè)元素則是一個(gè)字符http:///learn/course/2/lecture/94/2023/11/20Python

3.x版本中的字符串Python3.x版本有兩種表示字符串的類型:bytes

和str,str

類中包含了unicode

字符,非unicode編碼如UTF-8、GBK被定義成了bytes使用

encode()

和decode()

函數(shù)進(jìn)行相互轉(zhuǎn)換2023/11/20如果出現(xiàn)亂碼的狀況,那肯定是編碼轉(zhuǎn)碼出現(xiàn)了問題,這不外乎有以下幾個(gè)關(guān)鍵點(diǎn):Python解釋器設(shè)置的默認(rèn)編碼源文件設(shè)置的編碼終端編碼解決亂碼2023/11/20Python解釋器的編碼指Python內(nèi)部認(rèn)為的字符

str

的編碼,即一個(gè)str變量,要轉(zhuǎn)換為unicode時(shí),Python解釋器默認(rèn)的轉(zhuǎn)換方式Python的默認(rèn)轉(zhuǎn)換方式是ASCII,sys.getdefaultencoding()

函數(shù)可以獲得默認(rèn)編碼信息聚類分析解釋器編碼2023/11/20在ASCII默認(rèn)編碼條件下對(duì)中文字符編碼會(huì)出現(xiàn)錯(cuò)誤,因?yàn)锳SCII不能對(duì)中文進(jìn)行編碼聚類分析解釋器編碼2023/11/20通過前面介紹的encode()函數(shù)和decode()

函數(shù)可以設(shè)置參數(shù),指定編碼方式對(duì)中文字符進(jìn)行GBK編碼和UTF-8編碼聚類分析解釋器編碼2023/11/20中文字符str的解碼問題聚類分析解釋器編碼2023/11/20想要得到GBK編碼的str:先對(duì)其進(jìn)行

UTF-8解碼,再對(duì)其進(jìn)行GBK編碼聚類分析解釋器編碼http:///learn/course/2/lecture/97/2023/11/20源文件編碼也就是代碼文件的編碼,文件不僅可以保存代碼,而且還可以對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)文件保存數(shù)據(jù)也是有編碼的,如果源文件中有中文,那么直接按照默認(rèn)的編碼方式運(yùn)行Python文件的時(shí)候會(huì)出現(xiàn)編碼錯(cuò)誤,若想要在源碼中寫非ASCII文字,可以在源碼文件開頭加入一行:或者聚類分析源文件編碼2023/11/20這個(gè)指使用終端顯示的時(shí)候會(huì)出現(xiàn)的問題windows中文版終端用的是CP936,通常被等同認(rèn)為是GBK而linux系統(tǒng)終端用的是utf-8所以若不想在終端打印顯示出來的字符出現(xiàn)亂碼,則在打印前需要將打印的內(nèi)容按照終端相同的編碼方式進(jìn)行轉(zhuǎn)換聚類分析終端編碼2023/11/20在數(shù)據(jù)分析中,出現(xiàn)編碼問題最多的還是在文件讀寫這個(gè)階段使用read()讀取的文件內(nèi)容,得到的是str格式的聚類分析文件讀寫編碼2023/11/20用UTF-8解碼再用GBK編碼打印出來的是亂碼,這就是編碼不同導(dǎo)致的亂碼聚類分析文件讀寫編碼2023/11/20用write()方法寫入的時(shí)候也需要是str格式。也就是說,如果寫入的數(shù)據(jù)是unicode時(shí),將會(huì)出錯(cuò)聚類分析文件讀寫編碼2023/11/20解決辦法:先將unicode格式編碼為str,再寫入聚類分析文件讀寫編碼2023/11/20如果你發(fā)現(xiàn)常用的

gbk、

utf-8編碼解碼都沒辦法解決亂碼問題,那么有可能該文本使用了這兩種之外的編碼方式chardet是一個(gè)Python包,提供測(cè)試文本的編碼方法,最后返回的是對(duì)編碼方法的一個(gè)估計(jì)聚類分析編碼檢測(cè)工具——chardet2023/11/20總結(jié)ASCII,GBK,Unicode編碼和解碼亂碼問題:Python解釋器設(shè)置的默認(rèn)編碼、源文件的編碼、終端編碼Python

2.x和Python

3.x版本的字符串編碼檢測(cè)工具chardet2023/11/20第八部分

編寫函數(shù)處理數(shù)據(jù)函數(shù)的語法規(guī)則參數(shù)設(shè)定lambda函數(shù)2023/11/20實(shí)例:平方函數(shù),輸入變量x返回其平方值x2函數(shù)的語法規(guī)則2023/11/20函數(shù)的語法規(guī)則2023/11/20幾種參數(shù)設(shè)定方法順序傳入關(guān)鍵詞默認(rèn)參數(shù)不定長(zhǎng)參數(shù)參數(shù)設(shè)定2023/11/20按照輸入?yún)?shù)列表的順序傳入x=1,y=2,z=3聚類分析順序傳入2023/11/20直接在參數(shù)列表里設(shè)定關(guān)鍵詞確定聚類分析關(guān)鍵詞2023/11/20可以將位置和關(guān)鍵詞的方法混合使用如果傳入的第一個(gè)參數(shù)是用關(guān)鍵詞傳入的,那么后面每個(gè)參數(shù)都需要是關(guān)鍵詞傳入,否則會(huì)出現(xiàn)語法錯(cuò)誤聚類分析關(guān)鍵詞2023/11/20輸入的參數(shù)可以是事先設(shè)定好賦值,也就是默認(rèn)值。在調(diào)動(dòng)函數(shù)的時(shí)候,可以不輸入?yún)?shù),函數(shù)內(nèi)部會(huì)直接調(diào)用默認(rèn)參數(shù)值。例如默認(rèn)z=3聚類分析默認(rèn)參數(shù)2023/11/20默認(rèn)參數(shù)的默認(rèn)值是可以修改的,將上面的z值傳入設(shè)置為4

需要注意的是,默認(rèn)參數(shù)必須放到參數(shù)列表的末位聚類分析默認(rèn)參數(shù)2023/11/20這是為了解決,不確定需要傳入?yún)?shù)個(gè)數(shù)的情況聚類分析不定長(zhǎng)參數(shù)*args2023/11/20*args如果輸入是一個(gè)list,那么可以用*list

的方式傳入聚類分析不定長(zhǎng)參數(shù)*args2023/11/20函數(shù)定義時(shí),*可以將按位置傳遞進(jìn)來的參數(shù)“打包”成元組(tuple)類型函數(shù)調(diào)用時(shí),*可以“解壓”待傳遞到函數(shù)中的元組、列表、集合、字符串等類型,并按位置傳遞到函數(shù)入口參數(shù)中聚類分析不定長(zhǎng)參數(shù)*args2023/11/20*args*args傳入的時(shí)候,如果調(diào)用函數(shù)使用關(guān)鍵詞傳入?yún)?shù)時(shí)會(huì)出錯(cuò)不定長(zhǎng)參數(shù)聚類分析不定長(zhǎng)參數(shù)*args2023/11/20**kwargs**kwargs

的出現(xiàn)便是解決需要傳入特定關(guān)鍵詞參數(shù)的情況聚類分析不定長(zhǎng)參數(shù)**kwargs2023/11/20聚類分析常見包中的不定參數(shù)scikit-learn中的測(cè)試集訓(xùn)練集劃分函數(shù)def

train_test_split(*array,**options)2023/11/20函數(shù)定義時(shí)*可以將按位置傳遞進(jìn)來的參數(shù)“打包”成元組(tuple)類型

**可以將按關(guān)鍵字傳遞進(jìn)來的參數(shù)“打包”成字典(dictionary)類型聚類分析函數(shù)定義與調(diào)用時(shí),不定長(zhǎng)參數(shù)的傳入函數(shù)調(diào)用時(shí)*可以“解壓”待傳遞到函數(shù)中的元組、列表、集合、字符串等類型,并按位置傳遞到函數(shù)入口參數(shù)中

**可以“解壓”待傳遞到函數(shù)中的字典,并按關(guān)鍵字傳遞到函數(shù)入口參數(shù)中2023/11/20簡(jiǎn)化的函數(shù)定義方式lambda函數(shù)2023/11/20總結(jié)位置傳入、關(guān)鍵詞、默認(rèn)參數(shù)、不定長(zhǎng)參數(shù)參數(shù)定義的順序:必選參數(shù)、默認(rèn)參數(shù)、可變參數(shù)和關(guān)鍵字參數(shù)函數(shù)的語法規(guī)則lambda函數(shù)2023/11/20第九部分

變量作用域局部變量全局變量局部變量轉(zhuǎn)為全局變量同名變量引用2023/11/20聚類分析局部變量局部變量是指那些有固定的變量作用域,只有在此作用域內(nèi)才能調(diào)用此變量。具體而言,比如函數(shù)內(nèi)的局部變量的作用域僅限于函數(shù)內(nèi)。以下建立一個(gè)新的函數(shù),命名為mean(),用于求平均局部變量2023/11/20聚類分析局部變量在關(guān)鍵詞

def

定義函數(shù)的范圍內(nèi),新定義/賦值的變量都是局部變量,在該函數(shù)之外引用函數(shù)內(nèi)命名的變量的時(shí)候會(huì)報(bào)錯(cuò)2023/11/20聚類分析局部變量同理,在局部區(qū)域引用局部區(qū)域以外的變量,也會(huì)引起報(bào)錯(cuò)。2023/11/20全局變量全局變量是相對(duì)局部變量而言的作用范圍在全局,即在初始定義賦值后,無論是函數(shù)、類、lambda函數(shù)內(nèi)都可以引用全局變量。在關(guān)鍵詞

def

、class、lambda之外定義的變量,都作為全局變量。在上面的mean()函數(shù)內(nèi)定義的length變量移至關(guān)鍵詞

def之外即變?yōu)槿肿兞浚喝肿兞?023/11/20有時(shí)候會(huì)有在函數(shù)內(nèi)定義的局部變量在函數(shù)外引用的需求,比如前面的mean()函數(shù)中最開始"length"定義時(shí)是局部變量,現(xiàn)只需要在定義變量時(shí)使用關(guān)鍵詞"global"即可將其定義為全局變量局部變量轉(zhuǎn)為全局變量2023/11/20當(dāng)某局部變量和全局變量都有相同變量名時(shí),函數(shù)內(nèi)引用該變量會(huì)直接調(diào)用函數(shù)內(nèi)定義的局部變量。問題:如果有嵌套函數(shù),并且有多個(gè)同名變量該怎么辦?同名變量引用2023/11/20聚類分析LEGB原理簡(jiǎn)要介紹當(dāng)一個(gè)函數(shù)體內(nèi)需要引用一個(gè)變量的時(shí)候,會(huì)按照如下順序查找:首先查找局部變量(Locals);如果找不到叫做該名稱的局部變量,則去函數(shù)體的外層去尋找局部變量(Enclosingfunctionlocals)。(適用于嵌套函數(shù)的情況)如果函數(shù)體外部的局部變量中也找不到叫做該名稱的局部變量,則從全局變量(Global)中尋找。再找不到,只好去找內(nèi)置庫(kù)(Bulit-in)像C語言就沒有這種機(jī)制,局部區(qū)找不到就直接跳到靜態(tài)變量(static)區(qū)了當(dāng)前??蚯耙粋€(gè)棧框再前一個(gè)棧框全局區(qū)(棧底)……2023/11/20第十部分Python中的模塊模塊簡(jiǎn)介數(shù)據(jù)分析領(lǐng)域常用的包搜索路徑管理模塊的導(dǎo)入利用csv、pandas導(dǎo)入數(shù)據(jù)缺失值處理使用matplotlib繪圖2023/11/20模塊簡(jiǎn)介內(nèi)置電池(batteries

included)

基礎(chǔ)代碼庫(kù),覆蓋了網(wǎng)絡(luò)通信、文件處理、數(shù)據(jù)庫(kù)接口、圖形系統(tǒng)、XML處理第三方工具包Pandas:數(shù)據(jù)處理與分析Numpy:科學(xué)計(jì)算BeautifulSoup4:處理HTML文檔Matplotlib:繪圖Scikit-learn:基于SciPy和Numpy的開源機(jī)器學(xué)習(xí)模塊Tensorflow:深度學(xué)習(xí)框架2023/11/20Python程序的架構(gòu)

Python程序的構(gòu)架指:將一個(gè)程序分割為源代碼文件的集合以及將這些部分連接在一起的方法Python源代碼文件:*.py一個(gè)py文件是一個(gè)模塊(module)多個(gè)模塊可以組成一個(gè)包(package)模塊1函數(shù)類模塊2函數(shù)類包2023/11/20模塊的執(zhí)行環(huán)境模塊的執(zhí)行環(huán)境:模塊包含變量、函數(shù)、類以及其他的模塊(如果導(dǎo)入的話),而函數(shù)也有自己的本地變量模塊內(nèi)的情況及模塊的交互模塊全局變量局部變量函數(shù)成員類變量import其他模塊(Python或C)變量函數(shù)類其他模塊(Python或C)變量函數(shù)類importimport2023/11/20模塊的作用pyproject__init__.pymodule0.pyPackage_a__init__.pymodule1.pymodule2.pyPackage_b__init__.pymodule3.py模塊是Python中的最高級(jí)別組織單元,它將程序代碼和數(shù)據(jù)封裝起來以便重用模塊的三個(gè)角色:代碼重用系統(tǒng)命名空間的劃分(模塊可理解為變量名的封裝,即模塊就是命名空間)實(shí)現(xiàn)共享服務(wù)和數(shù)據(jù)一個(gè)簡(jiǎn)單的Python項(xiàng)目2023/11/20數(shù)據(jù)庫(kù)IO類數(shù)據(jù)分析領(lǐng)域常用的包2023/11/20描述性

統(tǒng)計(jì)類文本基本操作2023/11/20回歸假設(shè)檢驗(yàn)時(shí)間序列支持向量機(jī)(SVM)2023/11/20模塊的導(dǎo)入pyproject__init__.pymodule0.pyPackage_a__init__.pymodule1.pymodule2.pyPackage_b__init__.pymodule3.py導(dǎo)入從本質(zhì)上講,就是在一個(gè)文件中載入另一個(gè)文件,并且能夠讀取那個(gè)文件的內(nèi)容。一個(gè)模塊內(nèi)的內(nèi)容通過這樣的方法其屬性(object,attribute)能夠被外界使用2023/11/20模塊導(dǎo)入的方式pyproject__init__.pymodule0.pyPackage_a__init__.pymodule1.pymodule2.pyPackage_b__init__.pymodule3.pyimport

Package_a.module1import

Package_b.module3from

Package_a.module1

import*import

module0from

module0

import*import

Package_a.module1

as

m1t

=

m1.Test()from

Package_a.module1

import*t

=

Test()注意使用區(qū)別import

xfrom

x

import

*from

x

import

a,b,c①②③2023/11/20模塊的方式非常簡(jiǎn)單,在"import"后加上"模塊名稱"就可以了。通過這一句,計(jì)算機(jī)就在指定的位置找到了"numpy.py"文件,并準(zhǔn)備好該文件擁有的之后會(huì)用到的函數(shù)和屬性。在導(dǎo)入"numpy"后,我們就可以通過點(diǎn)符號(hào)"."連接模塊名稱和函數(shù)名,使用該模塊中的函數(shù)和屬性。導(dǎo)入整個(gè)模塊2023/11/20指定的方式是采用"import

模塊名稱as

別名"。我們可以將"numpy"簡(jiǎn)記為"np",并且在調(diào)用時(shí),直接使用"np"就可以:別名2023/11/20此過程的實(shí)現(xiàn)方式是“from

模塊名稱

import

函數(shù)名稱",但是要注意我們只拿到了某個(gè)具體的工具,而沒有拿到整個(gè)工具箱只導(dǎo)入某個(gè)對(duì)象2023/11/20import模塊時(shí),Python都做了哪些事情?是使用當(dāng)前存在的模塊對(duì)象Python解釋器檢查module

registry(sys.modules)部分模塊先前是否已經(jīng)導(dǎo)入?否①創(chuàng)建一個(gè)新的、空的module對(duì)象②在sys.module字典中插入該模塊對(duì)象③加載該模塊代碼所對(duì)應(yīng)的對(duì)象然后在新的模塊命名空間、執(zhí)行該模塊代碼對(duì)象(codeobject)。所有由該代碼指定的變量均可以通過該模塊對(duì)象引用2023/11/20import搜索的路徑順序①程序的主目錄②PYTHONPATH(環(huán)境變量)目錄③標(biāo)準(zhǔn)鏈接庫(kù)目錄④任何.pth文件的內(nèi)容以上四個(gè)組件組合起來就變成了sys.path,其保存了模塊搜索路徑在機(jī)器上的實(shí)際配置,可以通過打印內(nèi)置的sys.path

列表來查看這些路徑搜索路徑①和③是系統(tǒng)自定義的,而②和④可以用于拓展路徑,從而加入自己的源代碼目錄2023/11/20通過.pth文件修改搜索路徑通過site模塊的getsitepackages()

函數(shù)獲得包文件位置新建

myworkpath.pth

文件,列出模塊搜索路徑2023/11/20將myworkpath.pth

文件放在包文件目錄下查看路徑是否添加成功2023/11/20臨時(shí)修改模塊搜索路徑使用sys.path在Python程序運(yùn)行時(shí)臨時(shí)修改模塊搜索路徑。2023/11/20我們將使用一份包含5000個(gè)樣本的美國(guó)高中生社交網(wǎng)絡(luò)信息數(shù)據(jù)集。數(shù)據(jù)均采樣于2006年,對(duì)應(yīng)于高中四年級(jí)的畢業(yè)生。每個(gè)樣本包含40個(gè)變量,其中"gradyear"、"gender"、"age"和"friends"四個(gè)變量分別代表畢業(yè)生的畢業(yè)年份、性別、年齡和好友數(shù)。社交網(wǎng)絡(luò)信息數(shù)據(jù)集介紹利用CSV模塊導(dǎo)入數(shù)據(jù)利用csv模塊導(dǎo)入數(shù)據(jù)2023/11/20其余36個(gè)變量代表了36個(gè)詞語,這36個(gè)詞語代表了畢業(yè)生的5大基本特征:課外活動(dòng)、時(shí)尚、宗教、浪漫和反社會(huì)行為。每個(gè)詞語變量的取值代表對(duì)應(yīng)的詞語在高中生的社交網(wǎng)絡(luò)服務(wù)平臺(tái)發(fā)布的消息中出現(xiàn)的頻次。社交網(wǎng)絡(luò)信息數(shù)據(jù)集介紹2023/11/20通過“csv”模塊導(dǎo)入數(shù)據(jù)集文件

teenager_sns.csv

中的數(shù)據(jù)利用CSV模塊導(dǎo)入數(shù)據(jù)2023/11/20讀完數(shù)據(jù)后,我們得到一個(gè)二維列表"teenager_sns",列表中的一個(gè)元素為文件中的一行,第一個(gè)元素為變量名列表,之后的一個(gè)元素對(duì)應(yīng)著一個(gè)樣本。我們以第一個(gè)元素和第二個(gè)元素為例:我們發(fā)現(xiàn)所有的變量值都為字符型,所以在后面的分析中需要對(duì)數(shù)據(jù)進(jìn)行類型轉(zhuǎn)換。在導(dǎo)入數(shù)據(jù)之后,我們首先要做的事情就是初探我們的數(shù)據(jù)。利用CSV模塊導(dǎo)入數(shù)據(jù)2023/11/20利用CSV模塊導(dǎo)入數(shù)據(jù)2023/11/20缺失值處理接下來,我們來分析一下數(shù)據(jù)集中的

age變量,看看美國(guó)高中畢業(yè)生的年齡特征。為了得到完整的

age列表,我們使用了以下方式:2023/11/20缺失值處理我們先來看看缺失值的占比情況2023/11/20缺失值處理計(jì)算得到的缺失值占比為0.1602,也就是說,大約每5個(gè)樣本里就有一個(gè)樣本有缺失值,這樣的占比還是比較大的,所以我們不能直接刪除存在缺失值的樣本,直接刪除會(huì)影響數(shù)據(jù)的客觀性和結(jié)果的準(zhǔn)確性。一種非常合理的方式是使用均值對(duì)缺失值進(jìn)行填補(bǔ)。2023/11/20缺失值處理下面,我們對(duì)數(shù)據(jù)集中的畢業(yè)生年齡進(jìn)行分析,我們使用Python內(nèi)置的

max()

min()

函數(shù)得到

age_without_missing

中的最大值和最小值:這種偏離變量實(shí)際范圍的值稱為異常值。我們將在類的部分對(duì)異常值進(jìn)行檢測(cè)和處理。2023/11/20社交網(wǎng)絡(luò)信息數(shù)據(jù)集介紹利用CSV模塊導(dǎo)入數(shù)據(jù)利用pandas導(dǎo)入數(shù)據(jù)利用pandas將數(shù)據(jù)存入一個(gè)DataFrame數(shù)據(jù)結(jié)構(gòu)中2023/11/20得到了一個(gè)pandas內(nèi)置的DataFrame類的實(shí)例提取age列,并得到其描述統(tǒng)計(jì)信息2023/11/20使用pandas內(nèi)置的mean()和fillna()方法進(jìn)行缺失值填補(bǔ)2023/11/20使用pandas內(nèi)置的hist()方法畫出缺失值填補(bǔ)后的年齡分布圖2023/11/20社交網(wǎng)絡(luò)信息數(shù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論