1. 程式人生 > >python《資料科學入門》學習筆記第二章 2018-8-17開始

python《資料科學入門》學習筆記第二章 2018-8-17開始

昨天早晨發現新買不到一週的自行車被偷了,我的2000大洋啊,心在滴血,小偷我草你媽,去學校安保處與派出所報警也花了一上午,下午接到朋友電話,被告知那個她找了新的男朋友,生活真是日了狗了。苟延殘喘。

經過三個來月的python程式設計,雖然能夠寫一些複雜的演算法。但是編寫速度很慢,原因是基本功不紮實,當時直接就編寫演算法。導致程式碼出錯率極高。因此我又重新過一遍基礎程式碼,看一看哪裡有需要記住的地方。

參考書目:《資料科學入門》中國工信出版集團

列表

1.   比如說x=[1,2,3],我經常使用的是 x.append(_),這是加單個元素,原因是總寫迴圈語句,符合條件的時候就加進去。其實還有兩種方法,但是用的較少:

#第一種:
x.extend([4,5,6])  #這種方法就像append一樣直接加入到x當中去。

#第二種:
x+[4,5,6]   #這種方法需要另一個變數對其賦值。不會直接更改x

2.   一般的賦值,比如說 x,y=[1,2],這樣1賦值給x,2賦值給y。 如果你不想要前面的值  可以這麼寫

_,y=[1,2]
print(y)
_,_,y=[1,2,3]
print(y)

元組

昨天沒寫完,今天上午本來想看演算法的,結果心不在焉。又找了找演算法導論等等的書籍,看了一看黑客滲透技術,攻防技術的梗概,看來我還是不適合跨學科跨專業,還是好好在一畝三分地上搞資料科學吧。

元組建立的形式,有兩種

tuple1=(1,2,3)   #這是最常見的元組建立方法
type(tuple1)

tuple2=1,2,3     #這個我是頭一次見到,估計以後也許會不經意間出錯,建立了個元組,需要注意
type(tuple2)

#又比如說這個函式,返回值就是一個元組
def sum_and_subtract(x,y):
    return (x+y),(x-y)
a=sum_and_subtract(1,2)
type(a)   #這裡a就是一個元組

字典

在python中,字典有很重要的應用,比如說pandas包裡面的資料框,其實有一部分用法可以從字典中借鑑。比如說用key值查詢,資料框格式也可以這麼查詢,比如說

grade={"Jerry":90,"Tom":60}
grade["Jerry"]  #用中括號查詢,這個比較常見了,不管是列表陣列還是等等的都是拿中括號查詢

一個新函式:dict.get("key",value)

grade={"Jerry":90,"Tom":60}
grade.get("Jerry",0)
#返回值為:90
#也就是說當某個key值存在於字典的時候,就返回那個值,
grade.get("master",0)
#返回值為:0
#當不存在某個key值得時候,返回值為0
grade.get("No One")
#什麼也不返回,我覺得不可能用到這個函式

新增值和替換值都比較傳統。

字典裡的value與key都是必須要加“s”與括號的,其中items()是返回多組元組的

grade={"Jerry":90,"Tom":60}
#查詢value值
grade.values()
#查詢key值
grade.keys()
#檢視匹配值
grade.items()  #返回多組元組
#對於這裡面返回的元組,不能進行查詢
#比如說這個方法就是錯誤的
grade.items()[1]  #結果報錯:不支援索引值

在字典中,defaultdict函式是一個不可多得的函式,比如這樣一個列表

count={"Tom","Jerry","Master","Tom","Jerry"}

我想統計每個單詞出現的頻次,當然可以用Counter函式來計算,但是暫時不考慮那個。我就可以用這樣的程式碼來算

number={}
for word in count:
    if word in count:
        number[word] +=1
    else :
        number[word]=0
#當然也可以用剛學的get函式來計算
for word in count:
    number[word]=count.get(word,0)+1

這兩種方法可以,但是比較麻煩,如果有一個預設值那就好了defaultdict函式就是這樣能夠定義一個預設值

number=defaultdict(int)   #這裡由於是計數,所以選用int,如果是列表,就list等等
for word in count:
    number[word] +=1
#當然你也可以設定預設值,比如我初始的預設值設定為1
number=defaultdict(lambda :1)

這樣就寫好了。非常簡單。至於Counter函式比較簡單,就先不說了。

排序

基礎的排序程式碼比較簡單

L=[3,2,5,4,1,6,2]
sorted(L) #從小到大進行排序
sorted(L,reverse=True) #從大到小進行排序

至於按某一列為主進行排序,用的時候再說吧

列表解析

我現在才知道,我總用的這樣的程式碼叫做列表解析

L=[x for x in range(5)]

下劃線真是神器啊,我以前一直是這麼寫的

L=list(range(5))
#要產生與這個長度相同的0
[0 for i in range(len(L))]
#但是我可以用下劃線這麼寫
[0 for _ in L]

迭代器

在Python中,我寫程式碼的時候,處理大資料最頭疼的就是記憶體佔用率的問題。先開始處理大概2個g的資料的時候,跑關聯規則,先開始選擇了記憶體佔用率比較高的程式碼,動不動空間就用完,所以這個還是比較頭疼的。所以在python中,迭代器就是一種降低記憶體佔用率的一種方法。

有兩種建立迭代器的方法:

#這是第一種方法,
def create_counter(n):
    print("This is a counter")
    while True:
        yield n
        print("This is: ",n)
        n +=1
cns= create_counter(5)
print(cns)
print(next(cns))
#這是第二種方法:
(i**2 for i in range(5))

其中第一種方法利用了yield函式對每個n進行迭代。其中cns代表著一個空間,而next(cns)就是一個數。

第二種方法注意用的是小括號“()”,如果是中括號的話就相當於一個列表。

函式式工具

經過了三四天的思想鬥爭,心情平復了很多。做人啊,還是應該向前看。

在Python中,定義函式是最基本的,用 def 函式就可以實現。看這本書又新學了一個函式:partial。直接幹程式碼

from functools import partial
#定義加法
def plus(a,b):
    return a+b
#定義減法
def subtraction(a,b):
    return a-b
#運用partial函式
plus1=partial(plus,5)
plus1(5)   #在這裡,python預設將plus函式第一個引數賦值為5.可以從減法中看出

sub=partial(subtraction,10)
sub(5)     #結果為5

看到這我才知道map函式可以有三個變數

list(map(lambda x,y:x+y,range(5),range(5)))
#第一個引數是方程,第二和第三個引數是數字
#結果為[0,2,4,6,8]

我又看到了一個函式:filter 。這個函式感覺挺有用的。但是是第一次見。以後多用

這個函式必須設定兩個引數,第一個引數是函式,用來返回是否為True的函式。第二個引數是為了給第一個引數代值的:

def is_even(x):
    return x%2==0
#這個函式返回的是True 或者False 
list(filter(is_even,[1,2,3,4]))
#結果為:[2,4]

然後我立馬想到 由於is_even返回的是 正確或者錯誤。那麼我直接定義行不行

filter([True,False,True,False],[1,2,3,4])
#返回值為<filter at 0x8f7bfd0>

然後返回值就變不回人能夠理解的數字了。暫時不太懂怎麼變,以後再說吧

列舉

呵,看這本書我才知道原來我一直寫的不是Python風格。先開始用R,很多大牛說R風格,,,然後現在Python還有風格。。。腦闊疼

比如說這種風格,就不是Python風格

x=list(range(10))
for i in range(len(x)):
    print(i)
    print(x[i])

這樣也不是Python風格

x=list(range(10))
i=0
for a in x:
    print(a)
    i+=1
    print(i)

這些都不是Python風格,只有這種的才是Python風格

x=list(range(10))
for i,a in enumerate(x):
    print(i)
    print(a)

#或者你只想要 i或者只想要a 就用下劃線“_”來代替

for _,a in enumerate(x):
    print(a)

壓縮和解壓

經常用到zip函式,我先在才知道這個函式叫做壓縮函式

一般我都是這麼用的,在一個for迴圈當中,我想迴圈兩個列表。這時候可以運用zip函式。

a=range(1,10,2)
b=range(0,10,2)
for i,j in zip(a,b):
    print(i+j)

書上又介紹了一個解壓的方法。不過我覺得沒啥用

a=range(1,10,2)
b=range(0,10,2)
c=list(zip(a,b))
#此時c的形式為[(1, 0), (3, 2), (5, 4), (7, 6), (9, 8)] 這樣
#解壓
d,e=zip(*c)

然後就相當於d=a,e=c了。不過我覺得沒什麼用,對於特定的列表,列表由元組構成的這種東西能解壓。

又一種解壓的方式比較不錯

a=[1,2]
print(*a)  #這種方式直接將a中的元素單獨列出來了

def plus(a,b):
    return a+b
plus(*a) #結果為3

但是這種方式不能直接賦值,也就是說這種方式不對:

a=[1,2]
*a   #錯誤
b,c=*a  #錯誤

也就是說 這種解壓方式只能講*a作為一個函式的引數。

最後的*args與**kwargs 比較常見

這就是《資料科學入門》第二章閱讀筆記。還有很長的路要走

2018-8-20 11:10