小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

最全攻略:數(shù)據(jù)分析師必備Python編程基礎(chǔ)知識(shí)

 heii2 2018-12-22

導(dǎo)讀:本文主要介紹使用Python進(jìn)行數(shù)據(jù)分析時(shí)必備的編程基礎(chǔ)知識(shí),主要涉及Python的基本數(shù)據(jù)類型、數(shù)據(jù)結(jié)構(gòu)、程序控制、讀寫數(shù)據(jù)等內(nèi)容。


Python編寫代碼時(shí),是以縮進(jìn)作為代碼塊的標(biāo)識(shí),而不是使用花括號(hào)等字符,這與其它語(yǔ)言有較大差別。這種方式顯示的代碼可讀性更高,通常使用四個(gè)空格或一個(gè)tab作縮進(jìn),如果是Python編程的新手,要注意這一點(diǎn)。


作者:常國(guó)珍、趙仁乾、張秋劍

本文摘編自《Python數(shù)據(jù)科學(xué):技術(shù)詳解與商業(yè)實(shí)踐》,如需轉(zhuǎn)載請(qǐng)聯(lián)系大數(shù)據(jù)(ID:hzdashuju)



01 Python的基本數(shù)據(jù)類型


Python的基本數(shù)據(jù)類型包括幾種,如下表:


名稱

解釋

示例

str

字符串

'a','1'

float

浮點(diǎn)數(shù)

1.23,11.0

int

整數(shù)

3,4

bool

布爾

True,False

complex

復(fù)數(shù)

1+2j,2+0j

▲表3-1 Python基礎(chǔ)數(shù)據(jù)類型


下面一一進(jìn)行詳述。


1. 字符串(str)


Python中,單引號(hào)、雙引號(hào)、三引號(hào)包圍的都是字符串,如下所示:


'spam eggs'
'spam eggs'

'spam eggs'

'spam eggs'

'''spam eggs'''
'spam eggs'

type('spam eggs')
str


此外,Python中的字符串也支持一些格式化輸出,例如換行符“\n”和制表符“\t”:


print('First line.\nSecond line.')
First line.
Second line.

print('1\t2')
1    2


當(dāng)然,有時(shí)候?yàn)楸苊饣煜?,也?huì)使用轉(zhuǎn)義字符“\”,用于轉(zhuǎn)義“\”后一位的字符為原始輸出。


'\'Yes,\' he said.'
''Yes,' he said.'


此外還可以通過(guò)在引號(hào)前加r來(lái)表示原始輸出:


print('C:\some\name')  #有換行符的輸出
C:\some
Ame

print(r'C:\some\name'#原始輸出
C:\some\name


Python中字符串支持加運(yùn)算表示字符串拼接:


'pyt'+'hon'
'python'


2. 浮點(diǎn)數(shù)和整數(shù)(float,int)


Python可以處理任意大小的整數(shù),當(dāng)然包括負(fù)整數(shù),在程序中的表示方法和數(shù)學(xué)上的寫法一模一樣。


 1+1
2


Python支持?jǐn)?shù)值的四則運(yùn)算,如下所示:


 1+1 #加法
2
 1-1 #減法
0
 1*1 #乘法
1
 2**2 #2的2次方
4
 2/3 #除法
0.6666666666666666
 5//2 #除法(整除)
2
 5%2 #余數(shù)
1


Python可以處理雙精度浮點(diǎn)數(shù),可以滿足絕大部分?jǐn)?shù)據(jù)分析的需求,要精確空值數(shù)字精度,還可以使用numpy擴(kuò)展庫(kù)。


此外,可以使用內(nèi)置函數(shù)進(jìn)行數(shù)值類型轉(zhuǎn)換,例如轉(zhuǎn)換數(shù)值字符為數(shù)值:


float('1')
1.0
int('1')
1


3. 布爾值 (Bool:True/False)


Python布爾值一般通過(guò)邏輯判斷產(chǎn)生,只有兩個(gè)可能結(jié)果:True/False


整型、浮點(diǎn)型的“0”和復(fù)數(shù)0+0j也可以表示False,其余整型、浮點(diǎn)型、復(fù)數(shù)數(shù)值都被判斷為True,如下代碼通過(guò)邏輯表達(dá)式創(chuàng)建bool邏輯值:


1 == 1
True

1 > 3
False

'a' is 'a'
True


當(dāng)然,Python中提供了邏輯值的運(yùn)算即“且”、“或”、“非”運(yùn)算,


True and False #且
False

True
 or False #或
True

not
 True #非
False


布爾邏輯值轉(zhuǎn)換可以使用內(nèi)置函數(shù)bool,除數(shù)字0外,其他類型用bool轉(zhuǎn)換結(jié)果都為True。


bool(1)
False

bool('0'
True

bool(0)
False


Python中對(duì)象類型轉(zhuǎn)換可參考表3-2。


數(shù)據(jù)類型

中文含義

轉(zhuǎn)換函數(shù)

Str

字符串

str()

Float

浮點(diǎn)類型

float()

Int

整數(shù)

Int()

Bool

邏輯

bool()

Complex

復(fù)數(shù)

complex()

表3-2 Python數(shù)據(jù)類型轉(zhuǎn)換


4. 其他


Python中,還有一些特殊的數(shù)據(jù)類型,例如無(wú)窮值,nan(非數(shù)值),None等。可以通過(guò)以下方式創(chuàng)建:


float('-inf'#負(fù)無(wú)窮
-inf

float('+inf'#正無(wú)窮
inf


下面是無(wú)窮值的一些運(yùn)算,注意正負(fù)無(wú)窮相加返回nan(not a number),表示非數(shù)值


float('-inf')+1
-inf

float('-inf')/-1
inf

float('+inf')+1
inf

float('+inf')/-1
-inf

float('-inf')+float('+inf')
nan


非數(shù)值nan在Python中與任何數(shù)值的運(yùn)算結(jié)果都會(huì)產(chǎn)生nan,nan甚至不等于自身。如下所示。nan可用于表示缺失值。


float('nan') == float('nan')
False


此外,python中提供了None來(lái)表示空,其僅僅支持判斷運(yùn)算,如下所示


x = None
 x is None
True



02 Python的基本數(shù)據(jù)結(jié)構(gòu)


Python的基本數(shù)據(jù)類型包括以下幾種,這些數(shù)據(jù)類型表示了自身在Python中的存儲(chǔ)形式。在Python中可以輸入type(對(duì)象)查看數(shù)據(jù)類型。


1. 列表(list)


1.1 列表簡(jiǎn)介


列表list是Python內(nèi)置的一種數(shù)據(jù)類型,是一種有序的集合,用來(lái)存儲(chǔ)一連串元素的容器,列表用[]來(lái)表示,其中元素的數(shù)據(jù)類型可不相同。


list1 = [1,'2',3,4]
list1
[1,'2',3,4]


除了使用“[]”創(chuàng)建列表外,還可以使用list()函數(shù):


list([1,2,3])
[123]

list('abc')
['a''b''c']


可以通過(guò)索引對(duì)訪問(wèn)或修改列表相應(yīng)位置的元素,使用索引時(shí),通過(guò)”[]”來(lái)指定位置。在Python中,索引的起始位置為0,例如取list1的第一個(gè)位置的元素:


list1[0]
1


可以通過(guò)”:”符號(hào)選取指定序列的位置的元素,例如取第1到第3個(gè)位置的元素,注意這種索引取數(shù)是前包后不包的(包括0位置,但不包括3位置,即取0,1,2位置的元素):


list1[0:3]

[1'2'3]


此外,Python中的負(fù)索引表示倒序位置,例如-1代表list1最后一個(gè)位置的元素:


list1[-1]

4


列表支持加法運(yùn)算,表示兩個(gè)或多個(gè)列表合并為一個(gè)列表,如下所示:


[1,2,3]+[4,5,6]

[123456]


1.2 列表的方法


Python中,列表對(duì)象內(nèi)置了一些方法。這里介紹append方法和extend方法,append方法表示在現(xiàn)有列表中添加一個(gè)元素,在循環(huán)控制語(yǔ)句中,append方法使用較多,以下是示例:


list2 = [1,2]
list2.append(3)
list2

[1 ,2 ,3]


extend方法類似于列表加法運(yùn)算,表示合并兩個(gè)列表為一個(gè)列表:


list2 = [1,2]
list2.extend([3,4,5])
list2

[1234,5]


2. 元組(tuple)


元組與列表類似,區(qū)別在于在列表中,任意元素可以通過(guò)索引進(jìn)行修改。而元組中,元素不可更改,只能讀取。下面展示了元組和列表的區(qū)別,列表可以進(jìn)行賦值,而同樣的操作應(yīng)用于元組則報(bào)錯(cuò)。


list0 = [1,2,3]
tuple0 = (1,2,3)
list0[1] = 'a'
list0

[1'a'3]

tuple0[1] = 'a'
TypeError      Traceback (most recent call last)
<>-35-2bfd4f0eedf9> in ()
----> 1 tuple0[1] = 'a'
TypeError: 'tuple' object does not support item assignment


這里通過(guò)”()”創(chuàng)建元組,python中,元組類對(duì)象一旦定義雖然無(wú)法修改,但支持加運(yùn)算,即合并元組。


(1,2,3)+(4,5,6

(123456)


元組也支持像列表那樣通過(guò)索引方式進(jìn)行訪問(wèn)。


t1 = (1,2,3)
 t1[0]
1

t1[0:2]
(1,2)


3. 集合(set)


Python中,集合(set)是一組key的集合,其中key不能重復(fù)??梢酝ㄟ^(guò)列表、字典或字符串等創(chuàng)建集合,或通過(guò)“{}”符號(hào)進(jìn)行創(chuàng)建。Python中集合主要有兩個(gè)功能,一個(gè)功能是進(jìn)行集合操作,另一個(gè)功能是消除重復(fù)元素。


basket = {'apple''orange''apple''pear''orange''banana'}
basket
{'apple''banana''orange''pear'}

basket = set(['apple''orange''apple''pear''orange''banana'])
basket
{'apple''banana''orange''pear'}

basket = set(('apple''orange''apple''pear''orange''banana'))
basket
{'apple''banana''orange''pear'}


Python支持?jǐn)?shù)學(xué)意義上的集合運(yùn)算,比如差集、交集、補(bǔ)集、并集等,例如如下集合:


A = {1,2,3}
B = {3,4,5}


A,B的差集,即集合A的元素去除AB共有的元素:


A – B

{12}


A,B的并集,即集合A與集合B的全部唯一元素:


A | B

{12345}


A,B的交集,即集合A和集合B共有的元素:


A & B

{3}


A,B的對(duì)稱差,即集合A與集合B的全部唯一元素去除集合A與集合B的公共元素:


A ^ B

{12,45}


需要注意集合不支持通過(guò)索引訪問(wèn)指定元素。


4. 字典(dict)


Python內(nèi)置了字典dict,在其他語(yǔ)言中也稱為map,使用鍵-值(key-value)存儲(chǔ),具有極快的查找速度,其格式是用大括號(hào){}括起來(lái)key和value用冒號(hào)“:”進(jìn)行對(duì)應(yīng)。例如以下代碼創(chuàng)建了一個(gè)字典:


dict1 = {'Nick':28,'Lily':28,'Mark':24}
 dict1
 
{'Lily'28'Mark'24'Nick'28}


字典本身是無(wú)序的,可以通過(guò)方法keys和values取字典鍵值對(duì)中的鍵和值,如下所示:


dict1.keys()
['Nick''Lily''Mark']
 dict1.values()
 
[282824]


字典支持按照鍵訪問(wèn)相應(yīng)值的形式,如下所示:


dict1['Lily']

28


這里需要注意定義字典時(shí),鍵不能重復(fù),否則重復(fù)的鍵值會(huì)替代原先的鍵值,如下所示,鍵’Lily’產(chǎn)生重復(fù),其值被替換。


dict3 = {'Nick':28,'Lily':28,'Mark':24,'Lily':33}

{'Lily'33'Mark'24'Nick'28}



03 Python的程序控制


程序控制結(jié)構(gòu)是編程語(yǔ)言的核心基礎(chǔ),Python的編程結(jié)構(gòu)有3種,本節(jié)將詳細(xì)地介紹這3種結(jié)構(gòu)。


1. 三種基本的編程結(jié)構(gòu)簡(jiǎn)介


簡(jiǎn)單來(lái)說(shuō),程序結(jié)構(gòu)分為三種:順承結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)(圖3-1)。


▲圖3-1程序執(zhí)行結(jié)構(gòu)


  • 順承結(jié)構(gòu)的程序特點(diǎn)是依照次序?qū)⒋a一個(gè)一個(gè)地執(zhí)行,并返回相應(yīng)的結(jié)果,這種結(jié)構(gòu)較為簡(jiǎn)單,易于理解;

  • 分支結(jié)構(gòu)的程序多出了條件判斷,即滿足某種條件就繼續(xù)執(zhí)行,否則跳轉(zhuǎn)到另外的條件上進(jìn)行執(zhí)行;

  • 循環(huán)結(jié)構(gòu)用于處理可以迭代的對(duì)象,這種結(jié)構(gòu)通過(guò)循環(huán)可迭代的對(duì)象,然后對(duì)每一個(gè)對(duì)象執(zhí)行程序并產(chǎn)生結(jié)果。在迭代次數(shù)較多的情況下,使用順承結(jié)構(gòu)往往要寫非常長(zhǎng)的代碼,而循環(huán)結(jié)構(gòu)則非常簡(jiǎn)單。 


這些結(jié)構(gòu)中,分支結(jié)構(gòu)往往需要條件判斷語(yǔ)句進(jìn)行控制,比如if、else等,而循環(huán)結(jié)構(gòu)則需要循環(huán)語(yǔ)句for進(jìn)行控制,當(dāng)然分支結(jié)構(gòu)與循環(huán)結(jié)構(gòu)完全可以混合,這時(shí)就可以通過(guò)條件循環(huán)語(yǔ)句while進(jìn)行控制。 


下面我們具體看看這幾個(gè)結(jié)構(gòu)的程序。


2. 順承結(jié)構(gòu)


2.1 順承結(jié)構(gòu)


現(xiàn)在創(chuàng)建一個(gè)列表a:


a = [1,2,3,4,5]


需要打印列表a中的所有元素,可以有如下寫法,雖然煩瑣但完成了任務(wù)。這種順序執(zhí)行的編程結(jié)構(gòu)就是順承結(jié)構(gòu):


print(a[0])
print(a[1])
print(a[2])
print(a[3])
print(a[4])

1
2
3
4
5


2.2 邏輯行與物理行


Python中,代碼是逐行提交給解釋器進(jìn)行編譯的,這里的一行稱為邏輯行,實(shí)際代碼也確實(shí)是一行,那么代碼的物理行就只有一行,例如上述print代碼,邏輯行和物理行是統(tǒng)一的。


但某些情況下,編寫者寫入一個(gè)邏輯行的代碼過(guò)長(zhǎng)時(shí),可以分拆為多個(gè)物理行執(zhí)行,例如:


tuple(set(list([1,2,3,4,5,6,7,8])))
(12345678)


可以寫為如下方式,符號(hào)’\’是換行的標(biāo)識(shí),此時(shí)代碼還是一個(gè)邏輯行,但有兩個(gè)物理行。


tuple(set(list([1,2,3,\
                     4,5,6,7,8])))
(12345678)


當(dāng)多個(gè)邏輯行代碼過(guò)短時(shí):


x = 1
y = 2
z = 3
print(x,y,z)

(123)


可以使用分號(hào)“;”將多個(gè)邏輯行轉(zhuǎn)化為一個(gè)物理行執(zhí)行:


x = 1;y = 2;z = 3;print(x,y,z)

(123)


3. 分支結(jié)構(gòu)


分支結(jié)構(gòu)的分支用于進(jìn)行條件判斷,Python中,使用if 、elif、else、冒號(hào)與縮進(jìn)表達(dá)。詳細(xì)語(yǔ)法可見以下示例,下面的語(yǔ)法的判斷邏輯為 : 


  • 若數(shù)值x小于0,令x等于0,若成立則打印信息'Negative changed to zero';

  • 若第一個(gè)條件不成立,判斷x是否為0,若成立打印'Zero';

  • 若第一、第二個(gè)條件不成立,再判斷x是否為1,若成立打印’single’;

  • 若第一、第二、第三個(gè)條件都不成立,打印’more’。


以x=-2測(cè)試結(jié)果:


x = -2
if x <>0
    x = 0
    print('Negative changed to zero')
elif x == 0
    print('Zero')
elif x == 1
    print('Single')
else
    print('More')
     
'Negative changed to zero'


這里,if,elif,else組成的邏輯是一個(gè)完整的邏輯,即程序執(zhí)行的時(shí),任何條件成立時(shí),會(huì)停止后面的條件判斷。這里需注意,當(dāng)多個(gè)if存在時(shí)的條件判斷的結(jié)果:若把上述代碼中的elif改為if后,程序執(zhí)行的結(jié)果會(huì)發(fā)生變化,如下所示:


 x = -2
if x <>0
     x = 0
     print('Negative changed to zero')
if x == 0
     print('Zero')
if x == 1
     print('Single')
else
     print('More')
'Negative changed to zero'
'Zero'
'More'


此時(shí),上述程序的中任何if判斷結(jié)果無(wú)論是否成立都會(huì)依次執(zhí)行一遍,所以x=-2會(huì)被賦值為0后繼續(xù)執(zhí)行,第二個(gè)if判斷為真,第三個(gè)if判斷為假時(shí),再跳到else進(jìn)行執(zhí)行,此時(shí)第三個(gè)if和else才是一個(gè)完整的邏輯。在寫條件判斷結(jié)構(gòu)的程序時(shí)需要注意。


4. 循環(huán)結(jié)構(gòu)


這里介紹Python中的for循環(huán)結(jié)構(gòu)和while循環(huán)結(jié)構(gòu),循環(huán)語(yǔ)句用于遍歷枚舉一個(gè)可迭代對(duì)象的所有取值或其元素,每一個(gè)被遍歷到的取值或元素執(zhí)行指定的程序并輸出。這里可迭代對(duì)象指可以被遍歷的對(duì)象,比如列表、元組、字典等。


4.1 For循環(huán)


下面是一個(gè)for循環(huán)的例子, i用于指代一個(gè)可迭代對(duì)象中a中的一個(gè)元素,for循環(huán)寫好條件后以冒號(hào)結(jié)束,并換行縮進(jìn),第二行是針對(duì)每次循環(huán)執(zhí)行的語(yǔ)句,這里是打印列表a中的每一個(gè)元素。


a = [1,2,3,4,5]
for i in a:
   print(i)

1
2
3
4
5


上述操作也可以通過(guò)遍歷一個(gè)可迭代對(duì)象的索引來(lái)完成,a列表一共5個(gè)元素,range(len(a))表示生成a的索引序列,這里打印索引并打印a向量索引下的取值。


a = ['Mary''had''a''little''lamb']
for i in range(len(a)):
   print(i, a[i])
   
(0'Mary')
(1'had')
(2'a')
(3'little')
(4'lamb')


4.2 while循環(huán)


while循環(huán)一般會(huì)設(shè)定一個(gè)終止條件,條件會(huì)隨著循環(huán)的運(yùn)行而發(fā)生變化,當(dāng)條件滿足時(shí),循環(huán)終止。while循環(huán)可以通過(guò)條件制定循環(huán)次數(shù),例如通過(guò)計(jì)數(shù)器來(lái)終止掉循環(huán),如下所示,計(jì)數(shù)器count每循環(huán)一次自增1,但count為5時(shí),while條件為假,終止循環(huán)。


count = 1
while count <>5:
    count = count + 1
    print(count)

2
3
4
5


以下是一個(gè)比較特殊的示例,演示如何按照指定條件循環(huán)而不考慮循環(huán)的次數(shù),例如編寫循環(huán),使x不斷減少,當(dāng)x小于0.0001時(shí)終止循環(huán),如下所示,循環(huán)了570次,最終x取值滿足條件,循環(huán)終止。


x=10
count = 0 
while True:
    count = count + 1
    x = x - 0.02*x
    if x<>0.0001:
        break
print (x,count)

(9.973857171889038e-05570)


4.3 break、continue、pass


上例中while循環(huán)代碼中使用了break表示滿足條件時(shí)終止循環(huán)。此外,也可通過(guò)continue、pass對(duì)循環(huán)進(jìn)行控制。Continue表示繼續(xù)進(jìn)行循環(huán),例如如下代碼嘗試打印10以內(nèi)能夠被3整除的整數(shù),注意continue和break的區(qū)別:


count = 0 
while count <>10:
    count = count + 1
    if count % 3 == 0:
        print(count)  
        continue

3
6
9


使用break:


count = 0 
while count <>10:
    count = count + 1
if count % 3 == 0:
        print(count)  
        break

3


pass語(yǔ)句一般是為了保持程序的完整性而作為占位符使用,例如以下代碼中pass沒有任何操作。


count = 0 
while count <>10:
    count = count + 1
    if count % 3 == 0:
        pass
else:
        print(count)

1
2
4
5
7
8
10


4.4 表達(dá)式


在Python中,諸如列表、元組、集合、字典都是可迭代對(duì)象,Python為這些對(duì)象的遍歷提供了更加簡(jiǎn)潔的寫法。例如如下列表對(duì)象x的遍歷,且每個(gè)元素取值除以10:


x = [1,2,3,4,5]
[i/10 for i in x]
[0.10.20.30.40.5]


上述[i/10 for i in x]的寫法稱為列表表達(dá)式,這種寫法比f(wàn)or循環(huán)更加簡(jiǎn)便。此外對(duì)于元組對(duì)象、集合對(duì)象、字典對(duì)象,這種寫法依舊適用,最終產(chǎn)生一個(gè)列表對(duì)象。


x = (1,2,3,4,5#元組
[i/10 for i in x]

[0.10.20.30.40.5]

x = set((1,2,3,4,5))#集合
[i/10 for i in x]

[0.10.20.30.40.5]

x = {'a':2,'b':2,'c':5}#字典
[i for i in x.keys()]

['a''c''b']

[i for i in x.values()]

[132]


此外Python還支持集合表達(dá)式與字典表達(dá)式用于創(chuàng)建集合、字典,例如如下形式創(chuàng)建集合:


{i for i in [1,1,1,2,2]} 

{12}


字典表達(dá)式可以以如下方式創(chuàng)建:


{key:value for key,value in [('a',1),('b',2),('c',3)]}

{'a'1'b'2'c'3}



04 Python的函數(shù)與模塊


1. Python的函數(shù)


函數(shù)是用來(lái)封裝特定功能的實(shí)體,可對(duì)不同類型和結(jié)構(gòu)的數(shù)據(jù)進(jìn)行操作,達(dá)到預(yù)定目標(biāo)。像之前的數(shù)據(jù)類型轉(zhuǎn)換函數(shù)入str,float等就屬于函數(shù)。當(dāng)然除了python的內(nèi)置函數(shù)與第三方庫(kù)的函數(shù)外,還可以自定義函數(shù)從而完成指定任務(wù)。


1.1 自定義函數(shù)示例


例如自定義求一個(gè)列表對(duì)象均值的函數(shù)avg,sum與len函數(shù)是python內(nèi)置函數(shù),分別表示求和與長(zhǎng)度:


def avg(x):
    mean_x = sum(x)/len(x)
    return(mean_x)


運(yùn)行完畢后,就可以調(diào)用該函數(shù)進(jìn)行運(yùn)算了:


avg([23,34,12,34,56,23])

30


1.2 函數(shù)的參數(shù)


函數(shù)的參數(shù)可以分為形式參數(shù)與實(shí)際參數(shù),形式參數(shù),形式參數(shù)作用于函數(shù)的內(nèi)部,其不是一個(gè)實(shí)際存在的變量,當(dāng)接受一個(gè)具體值時(shí)(實(shí)際參數(shù)),負(fù)責(zé)將具體值傳遞到函數(shù)內(nèi)部進(jìn)行運(yùn)算,例如之前定義的函數(shù)avg,形式參數(shù)為x。


def avg(x):
    mean_x = sum(x)/len(x)
    return(mean_x)


實(shí)際參數(shù)即具體值,通過(guò)形式參數(shù)傳遞到函數(shù)內(nèi)部參與運(yùn)算并輸出結(jié)果,剛才的例子中,實(shí)際參數(shù)為一個(gè)列表:


>avg([23,34,12,34,56,23])


函數(shù)參數(shù)的傳遞有兩種方式:按位置和按關(guān)鍵字。當(dāng)函數(shù)的形式參數(shù)過(guò)多時(shí),一般采用按關(guān)鍵字傳遞的方式,通過(guò)形式參數(shù)名=實(shí)際參數(shù)的方式傳遞參數(shù),如下所示,函數(shù)age有四個(gè)參數(shù),可以通過(guò)指定名稱的方式使用,也可按照順序進(jìn)行匹配:


def age(a,b,c,d):
    print(a)
    print(b)
    print(c)
    print(d)

age(a = 'young',b = 'teenager',c = 'median',d = 'old'#按關(guān)鍵字指定名稱

young
teenager
median
old

age('young','teenager','median','old'#按位置順序匹配

young
teenager
median
old


函數(shù)的參數(shù)中,亦可以指定形式參數(shù)的默認(rèn)值,此時(shí)該參數(shù)稱為可選參數(shù),表示使用時(shí)可以不定義實(shí)際參數(shù),例如如下例子,函數(shù)f有兩個(gè)參數(shù),其中參數(shù)L指定了默認(rèn)值None:


def f(a, L=None):
    if L is None:
        L = []
    L.append(a)
    return L


使用該函數(shù)時(shí),只需指定a參數(shù)的值,該函數(shù)返回一個(gè)列表對(duì)象,若不給定初始列表L,則創(chuàng)建一個(gè)列表,再將a加入到列表中:


f(3)

[3]


也可指定可選參數(shù)L的取值:


f(3,L = [1,2])

[123]


1.3 匿名函數(shù)lambda


Python中設(shè)定了匿名函數(shù)lambda,簡(jiǎn)化了自定義函數(shù)定義的書寫形式。使得代碼更為簡(jiǎn)潔。例如通過(guò)lambda函數(shù)定義一個(gè)函數(shù)g:


g = lambda x:x+1
g(1)

 2


該函數(shù)相當(dāng)于如下自定義函數(shù):


def g(x):
   return(x+1)
g(1)

2


2. Python的模塊


為了編寫可維護(hù)的代碼,可以把很多函數(shù)分組,分別放到不同的文件里,這樣,每個(gè)文件包含的代碼就相對(duì)較少,很多編程語(yǔ)言都采用這種組織代碼的方式。在Python中,一個(gè).py文件就稱之為一個(gè)模塊(Module),其內(nèi)容形式是文本,可以在IDE中或者使用常用的文本編輯器進(jìn)行編輯。


  • 自定義模塊


使用文本編輯器創(chuàng)建一個(gè)mod.py文件,其中包含一個(gè)函數(shù),如下所示:


# module
def mean(x):
return(sum(x)/len(x))


使用自定義模塊時(shí),將mod.py放置在工作目錄下,通過(guò)“import 文件名”命令載入:


import mod


在使用該模塊的函數(shù)時(shí),需要加入模塊名的信息,如下:


mod.mean([1,2,3])

2


載入模塊還有很多方式,如下(注意別名的使用):


import mod as m# as后表示別名
m.mean([1,2,3])

2

from modimport mean #從mod中載入指定函數(shù)mean
mean([1,2,3])

2

from modimport * # 從mod中載入所有函數(shù)
mean([1,2,3])

2


  • 載入第三方庫(kù)


import命令還可以載入已經(jīng)下載好的第三方庫(kù),使用方式與上面所展示的一致。例如,載入numpy模塊:


import numpyas np


此時(shí)就可以使用Numpy模塊中的函數(shù)了,例如Numpy中提供的基本統(tǒng)計(jì)函數(shù):


x = [1,2,3,4,5]
np.mean(x)# 均值

3.0

np.max(x)# 最大值

5

np.min(x)# 最小值

1

np.std(x)# 標(biāo)準(zhǔn)差

1.41421356237

np.median(x)# 中位數(shù)

3.0


Numpy提供了強(qiáng)大的多維數(shù)組、向量、稠密矩陣、稀疏矩陣等對(duì)象,支持線性代數(shù)、傅里葉變換等科學(xué)運(yùn)算,提供了C/C++及Fortron代碼的整合工具。


Numpy的執(zhí)行效率要比Python自帶的數(shù)據(jù)結(jié)構(gòu)要高效的多,在Numpy的基礎(chǔ)上,研究者們開發(fā)了大量用于統(tǒng)計(jì)學(xué)習(xí)、機(jī)器學(xué)習(xí)等科學(xué)計(jì)算的框架,基于Numpy的高效率,這些計(jì)算框架具備了較好的實(shí)用性。可以說(shuō), Numpy庫(kù)極大地推動(dòng)了Python在數(shù)據(jù)科學(xué)領(lǐng)域的流行。


若不太清楚如何使用Python 中(含第三方包和庫(kù))的方法和對(duì)象,可以查閱相關(guān)文檔或使用幫助功能,代碼中獲取幫助信息的方式有多種,比如如下幾種:


?np.mean
??np.mean
help(np.mean)
np.mean??



05 pandas 讀取結(jié)構(gòu)化數(shù)據(jù)


Numpy中的多維數(shù)組、矩陣等對(duì)象具備極高的執(zhí)行效率,但是在商業(yè)數(shù)據(jù)分析中,我們不僅需要一堆數(shù)據(jù),還需要了解各行、列的意義,同時(shí)會(huì)有針對(duì)結(jié)構(gòu)化數(shù)據(jù)的相關(guān)計(jì)算,這些是Numpy不具備的。為了方便分析,研究者們開發(fā)了Pandas用于簡(jiǎn)化對(duì)結(jié)構(gòu)化數(shù)據(jù)的操作。


Pandas是一個(gè)基于Numpy開發(fā)的更高級(jí)的結(jié)構(gòu)化數(shù)據(jù)分析工具,提供了Series、DataFrame、Panel等數(shù)據(jù)結(jié)構(gòu),可以很方便地對(duì)序列、截面數(shù)據(jù)(二維表)、面板數(shù)據(jù)進(jìn)行處理。


DataFrame即是我們常見的二維數(shù)據(jù)表,包含多個(gè)變量(列)和樣本(行),通常稱為數(shù)據(jù)框;Series是一個(gè)一維結(jié)構(gòu)的序列,會(huì)包含指定的索引信息,可以視作是DataFrame中的一列或一行,操作方法與DataFrame十分相似;Panel是包含序列及截面信息的三維結(jié)構(gòu),通常稱為面板數(shù)據(jù),通過(guò)截取會(huì)獲得對(duì)應(yīng)的Series和DataFrame。


由于這些對(duì)象的常用操作方法是十分相似的,本節(jié)讀取與保存數(shù)據(jù)以及后續(xù)章節(jié)進(jìn)行的數(shù)據(jù)操作,都主要使用DataFrame進(jìn)行演示。


1. 讀取數(shù)據(jù)


1.1 使用Pandas讀取文件


Python的Pandas庫(kù)提供了便捷讀取本地結(jié)構(gòu)化數(shù)據(jù)的方法,這里主要以csv數(shù)據(jù)為例。pandas.read_csv函數(shù)可以實(shí)現(xiàn)讀取csv數(shù)據(jù),讀取方式見以下代碼,其中'data/sample.csv'表示文件路徑:


import pandas as pd
csv = pd.read_csv('data/sample.csv')
csv

id name   scores
0   1   小明     78.0
1   2   小紅     87.0
2   3   小白     99.0
3   4   小青  99999.0
4   5   小蘭      NaN


按照通常的慣例,Pandas會(huì)以pd做為別名,pd.read_csv讀取指定路徑下的文件,然后返回一個(gè)DataFrame對(duì)象。在命令行中打印DataFrame對(duì)象其可讀性可能會(huì)略差一些,如果在jupyter notebook 中執(zhí)行的話,則DataFrame的可讀性會(huì)大幅提升:


▲圖3-2 jupyter notebook中的DataFrame展現(xiàn)


打印出來(lái)的DataFrame包含了索引(index,第一列),列名(column,第一行)及數(shù)據(jù)內(nèi)容(values,除第一行和第一列之外的部分)。


此外,read_csv函數(shù)有很多參數(shù)可以設(shè)置,這里列出常用參數(shù),如表3-3所示。


參數(shù)

說(shuō)明

filepath_or_buffer

csv文件的路徑

sep = ','

分隔符,默認(rèn)逗號(hào)

header = 0

intlist of ints類型,0代表第一行為列名,若設(shè)定為None將使用數(shù)值列名

names = [...]

list,重新定義列名,默認(rèn)None

usecols = [...]

list,讀取指定列,設(shè)定后將縮短讀取數(shù)據(jù)的時(shí)間與內(nèi)存消耗,適合大數(shù)據(jù)量讀取,默認(rèn)None

dtype = {...}

dict,定義讀取列的數(shù)據(jù)類型,默認(rèn)None

nrows = None

int類型,指定讀取大數(shù)據(jù)量的前多少行,默認(rèn)None

na_values = ...

str類型,listdict,指定讀取為缺失值的值

na_filter = True

bool類型,自動(dòng)發(fā)現(xiàn)數(shù)據(jù)中的缺失值功能,默認(rèn)打開(True),若確定數(shù)據(jù)無(wú)缺失可以設(shè)定為False以提高數(shù)據(jù)載入的速度

chunksize = 1000

int類型,分塊讀取,當(dāng)數(shù)據(jù)量較大時(shí)可以設(shè)定分塊讀取的行數(shù),默認(rèn)為None,若設(shè)定將返回一個(gè)迭代器

encoding = 'utf-8'

str類型,數(shù)據(jù)的編碼,python3默認(rèn)為'utf-8',python2默認(rèn)為'ascii'

表3-3 pandas.read_csv參數(shù)一覽


Pandas除了可以直接讀取csv、Excel、Json、html等文件生成DataFrame,也可以從列表、元組、字典等數(shù)據(jù)結(jié)構(gòu)創(chuàng)建DataFrame,


1.2 讀取指定行和指定列


使用參數(shù)usecol和nrows讀取指定的列和前n行,這樣可以加快數(shù)據(jù)讀取速度。如下所示,讀取原數(shù)據(jù)的兩列、兩行:


csv = pd.read_csv('data/sample.csv',\
                   usecols=['id','name'],\
                   nrows=2#讀取'id'和'name'兩列,僅讀取前兩行
csv

id name
0   1   小明
1   2   小紅


1.3 使用分塊讀取


參數(shù)chunksize可以指定分塊讀取的行數(shù),此時(shí)返回一個(gè)可迭代對(duì)象,這里big.csv是一個(gè)4500行4列的csv數(shù)據(jù),這里設(shè)定chunksize=900,分5塊讀取數(shù)據(jù),每塊900行,4個(gè)變量,如下所示:


csvs = pd.read_csv('data/big.csv',chunksize=900)
for i in csvs:
   print (i.shape)

(9004)
(9004)
(9004)
(9004)
(9004)


可以使用pd.concat函數(shù)再讀取全部數(shù)據(jù)。


csvs = pd.read_csv('data/big.csv',chunksize=900)
dat = pd.concat(csvs,ignore_index=True)
dat.shape

(45004)


1.4 缺失值操作


使用na_values參數(shù)指定預(yù)先定義的缺失值,數(shù)據(jù)sample.csv中,“小青”的分?jǐn)?shù)有取值為99999的情況,這里令其讀取為缺失值,操作如下


csv = pd.read_csv('data/sample.csv',
                  na_values='99999')
csv

id name  scores
0   1   小明    78.0
1   2   小紅    87.0
2   3   小白    99.0
3   4   小青     NaN
4   5   小蘭     NaN


1.5 文件編碼


讀取數(shù)據(jù)時(shí),常遇到亂碼的情況,這里需要先弄清楚原始數(shù)據(jù)的編碼形式是什么,再以指定的編碼形式進(jìn)行讀取,例如sample.csv編碼為'utf-8',這里以指定編碼(參數(shù)encoding)讀取。


csv = pd.read_csv('data/sample.csv',
                  encoding='utf-8')
csv

id name   scores
0   1   小明     78.0
1   2   小紅     87.0
2   3   小白     99.0
3   4   小青  99999.0
4   5   小蘭      NaN


2. 寫出數(shù)據(jù)


pandas的數(shù)據(jù)框?qū)ο笥泻芏喾椒?,其中方法“to_csv”可以將數(shù)據(jù)框?qū)ο笠詂sv格式寫入到本地中。to_csv方法的常見參數(shù)見表3-4:


參數(shù)

解釋

path_or_buf

寫到本地csv文件的路徑

sep = ','

分隔符,默認(rèn)逗號(hào)

na_rep = ''

缺失值寫入代表符號(hào),默認(rèn)''

header = True

bool,是否寫入列名,默認(rèn)True

cols = [...]

list,寫入指定列,默認(rèn)None

index = True

bool,是否將行數(shù)寫入指定列,默認(rèn)true

encoding = str

str,以指定編碼寫入

表3-4 pandas.to_csv參數(shù)一覽


例如以以下方式寫出,'data/write.csv'表示寫出的路徑,encoding = 'utf-8'表示以'utf-8'編碼方式輸出,index=False表示不寫出索引列。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多