Python 學習筆記 #008:模組、套件、NumPy 與 Pandas

【Python 學習筆記】系列文預計會有 10 篇文,會從最基礎的 Python 簡介開始,再到迴圈、if 判斷式等基礎程式語法,最後會利用 Python 豐富的套件,學習 pillow 圖片處理、matplotlib 繪製圖表、scrapy 爬蟲等功能。之後會再慢慢更新吧 XDD
標題訂為「學習筆記」是因為我也是 Python 的初學者,之前雖有寫 C 語言的經驗,但是上完課後就幾乎沒有再使用,想藉由寫學習筆記的系列文,要求自己複習上課學到的 Python 的語法,希望有朝一日能將 Python 變為自己的「第三外語」。

上一篇 Python 學習筆記:

前往 Medium.com 檢視

【Python 學習筆記】系列文的內容大多參考《第一次學 Python 就上手》這本書,所以想要自學 Python 的人可以將這本書列為你的 Python 入門參考書!

前往 Medium.com 檢視

模組 Module

模組(module),是一個名稱為 modulename.py 的檔案,檔案內定義了一些資料、函式或類別。

如果想要使用一個模組,會用 import modulename 匯入模組。平常我們使用、存取的檔案都在 python 的資料夾下。

import os
print(os.__file__)

C:\Users\User Name\Anaconda3\lib\os.py

import modulename as alias
alias.method()

之前也使用過這個語法,目的是為了將冗長的 modulename 換成比較簡短、自己也比較清楚的名字,例如說, import random as rd 就是一個例子。 alias 只是個別名而已。

from modulename import classname/methodname
methodname()

這個語法只把模組內的某些方法或類別導入,除了那些有特別導入的內容外,其他方法不會導入。用這個方法就可以不用在 methodname 前面加 modulename. 了!

如果想要引用模組內的全部類別與方法,也可以用 * ,但是對 Python 的負擔比較大,所以盡量別用。

dir()

dir() 會傳會傳回目前存取範圍內的名稱,這些名稱前面不加 xxx. 也不會錯。Import 後,會出現 import 後的名稱,可以用來確認是不是已經 import 了。

套件 Package

套件中存放了多個模組,就像一個資料夾存放了很多檔案一樣。只要有 __init__.py 檔案的資料夾就會被視為 python 套件。

標準函式庫(standard library)/內建函式庫(built-in library)是安裝 python 時一併安裝的套件。如:math, random, time, calendar, datetime, turtle。

外部函式庫(external library)是需要另外安裝的模組與套件。

import importlib as imp
print(imp.util.find_spec('numpy'))

ModuleSpec(name=’numpy’, loader=<_frozen_importlib_external.SourceFileLoader object at 0x000001B5B2EC57B8>, origin=’C:\\Users\\User Name\\Anaconda3\\lib\\site-packages\\numpy\\__init__.py’, submodule_search_locations=[‘C:\\Users\\User Name\\Anaconda3\\lib\\site-packages\\numpy’])

利用上面的程式碼,可以尋找已經安裝的套件的儲存地點。

第三方套件 Third Party Package

▸Django, Web2py, Flask:web框架,快速架設網站
▸Numpy:陣列與科學計算;矩陣運算、FFT、線性代數
▸SciPy:科學計算
▸Pandas:數據處理與資料分析
▸Matplotlib:2D視覺化工具
▸PyGtk, PyQt, WxPython, tkinter:GUI程式開發
▸BeautifulSoup:HTML/XML解析器
▸Pillow/PIL(舊):圖形處理
▸PyGame:多媒體與遊戲開發
▸Requests:存取網際網路資料
▸Scikit-learn:機器學習套件
▸Scrapy:網路爬蟲工具

如何安裝上述這些第三方套件呢?

首先,要先確認 Python 已在 Windows 的環境變數中。

有兩種方法:

  1. 自行到環境變數中的 PATH 加上 Python 執行檔的路徑
  2. 下載 Python 安裝檔,執行,再勾選添加 Python 到環境變數(Add Python 3.7 to PATH)。

用 PIP 安裝第三方套件

PIP 是 Python 中的套件管理工具,可以用來查看、安裝、升級、解除安裝與管理套件。用 PIP 套件需要在環境變數內加上 Python,最簡單的方式是點開安裝檔,再打勾。

有關 PIP 的指令:

pip list :可以用來列出目前安裝的套件與版本。

pip install 套件名稱 :可以用來安裝套件。

pip show 套件名稱 :可以用來查詢已安裝的套件。

pip uninstall 套件名稱 :解除安裝套件。

用 PYPI 安裝第三方套件

首先先到 pypi.org 這個網址,利用指令搜尋想要的套件,再進行安裝。

如果是在 Jupyter Notebook 裡面安裝第三方套件,記得在指令前加上 ! ,例如 !pip install scrapy 。Jupyter Notebook 內建會額外安裝一些常用的套件例如 numpy, matplotlib 等。

NumPy

NumPy 是 Numeric Python 的簡寫,是一個陣列處理套件,支援多維陣列與矩陣運算。若讀者對這些子套件有興趣,可以到 NumPy 官方網站(http://www.numpy.org/)查詢。

NumPy 的陣列

陣列(array)是一種資料結構,與 list 非常類似,可以存放元素(element),裡⾯有各自的值(value),有索引去區分每個元素在哪。

同質陣列(homogeneous array)是指每個元素都是同樣型別的陣列,可以依據維度分為一維陣列(1-dimensional array)多維陣列列(multi-dimensional array)。

numpy 裡的 ndarray(n-dimensional array)是同質的⼀維或多維陣列,使用 numpy.array() 可以宣告這種陣列,宣告方式跟 list() 類似。

import numpy
A = numpy.array([10, 20, 30])

ndarray.ndim :陣列維度。

ndarray.shape :陣列的形狀,整數 tuple 代表每個維度的元素個數。

ndarray.size :陣列的元素個數。

ndarray.dtype :陣列的元素類別,可以是 int, float, bool, str 或者 Numpy 的 numpy.int32, numpy.int16, numpy.float64 等。

ndarray.itemsize :陣列內每個元素的大小,int32=32 位元(bit)=32/8 位元組=4 位元組(byte)。

ndarray.data :真正包含資料的緩衝區。

dtype 可以拿來指定資料型別(避免錯誤植入),或協助轉換(需要是broadcastable)。

import numpy as np
int_array = np.array([1.0,2.0,True],dtype=float)
int_array.dtype

dtype(‘float64’)

Arange

import numpy as np
A = np.arange([start,] stop [, step, dtype = None])

range() 非常相似,只是是回傳一個 ndarray。

start :起始值,可不填,預設為 0。

stop :終止值,需要提供,且不包含 stop 的值。

step :每個值中間間隔多少,預設為 1,有提供 step 就要有 start。

dtype :資料的型別,不提供的話,numpy 會根據輸入⾃動辨別。

A = np.arange(50)
print(A)

[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
 48 49]

Linspace

import numpy as np
A = np.linspace(start, stop [, num, endpoint = True, retstep = False, dtype = None)

回傳將 start-stop 的數字切成 num 個的 ndarray。

num :將這段數字切成多少個,預設 50。

endpoint :預設為 True,即包含 stop,如果為 False 則 start-stop 取 num+1 個。

restep :回傳使用的 step,True 會回傳。

dtype :資料的型別,不提供的話,numpy 會根據輸入⾃動辨別。

B = np.linspace(0, 100, 50, retstep = True, dtype=int)
print(B)

(array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24,
 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 51,
 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77,
 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 100]), 2.0408163265306123)

Concatenate

import numpy as np
A = np.array([10, 20])
B = np.concatenate((A, A)) #[10, 20, 10 ,20]
C = np.concatenate((A, [30]) #[10, 20, 30]

concatenate((陣列1, 陣列2)) ,回傳兩個陣列接在一起後的結果,注意有兩層 (())

NumPy 的運算

以下都回傳一個 numpy.ndarray / scalar(當兩個都不是陣列的時候):

add(x1, x2) :加法,x1+x2。

subtract(x1, x2) :減法,x1-x2。

multiply(x1, x2) :乘法,x1*x2。

divide(x1, x2) :除法,x1/x2。

mod(x1, x2) :餘數,x1%x2。

power(x1, x2) :冪次,x1**x2。

isfinite(x) :傳回參數 x 是否為有限。

isinf(x) :傳回參數 x 是否為無限。

isnan(x) :傳回參數 x 是否為 NaN(Not a Number)。

sign(x) :負數回傳 -1,正數回傳 1,0 回傳 0。

negative(x) :傳回 x 的負數。

absolute(x) :傳回 x 的絕對值。

sum(x) :回傳 x 的總和。

max(x) :回傳 x 中的最大值。

argmax(x) :回傳 x 中的最大值的索引。

min(x) :回傳 x 中的最小值。

argmin(x) :回傳 x 中的最小值的索引。

floor(x) :回傳 x 的地板(⼩數點無條件捨棄)。

sqrt(x) :回傳 x 的平方根。

square(x) :回傳 x 的平方。

exp(x) :回傳自然對數 e 的 x 次方。

exp2(x) :回傳 2 的 x 次⽅。

log(x) :回傳 x 取⾃然對數 e 的結果。

log2(x) :回傳 x 取底數為 2 的對數的結果。

log10(x) :回傳 x 取底數為 10 的對數的結果。

sin(x), cos(x), tan(x), acos(x), asin(x), atan(x) :三角函數,注意 x 是弧度。

mean(x) :回傳 x 的平均值。

median(x) :回傳 x 的中位數。

std(x) :回傳 x 的標準差。

二維陣列

二維陣列是一維陣列的延伸,如果說一維陣列是呈線性的一度空間,那麼二維陣列就是平面的二度空間。

初始化的時候就是二維的 list 或者 tuple。

np.array([[95, 100, 100], [86, 90, 75]]) #2*3的二維陣列

也可以使用 reshape() 回傳形狀為 newshape 的新陣列。

numpy.reshape(a, newshape, order)

a :輸入的陣列。

newshape :新的形狀,應該要是 int 或者 int tuple。新形狀咬與原本的形狀可以轉化,例如說 13 個無法轉成 4*3 的陣列。如果使用 ndarray.reshape 的話 tuples 可以沒有 ()

A = np.array([1,2,3,4,5,6,7,8,9,10,11,12]).reshape(4,3)

numpy.append(x1, x2 [, axis])

axis :要在第幾個維度將 x1, x2 併在一起,如果沒有提供的話,陣列會先被攤平再合在一起。

另外,值得注意的是,NumPy 中 a=b,如果更改任何一個其他也會跟著改變,記得用 a=b.copy()。

numpy.dot(x1, x2) :可以處理矩陣乘法,也可以用 x1@x2

numpy.insert(array, index, value, axis)

index :插入的索引位置。

value :插入的值,多個的話可以插入 list。

axis :插入的維度,不指定會把原本的 array 攤平。

broadcast numpy:會努力把插入的值,調整到可以盡可能符合維度形狀的長度。

import numpy as np 
a = np.array([[1,2],[3,4],[5,6]])

print(a.T) #轉置矩陣的語法
print(‘Original array:\n’, a)
print(‘Axis parameter not passed. The input array is flattened before insertion.’)
print(np.insert(a,3,[11,12]) )
print(‘Axis parameter passed. The values array is broadcast to match input array.’)
print(‘Broadcast along axis 0:\n’,np.insert(a,1,[11],axis = 0) )
print(‘Broadcast along axis 1:\n’, np.insert(a,1,11,axis = 1) )

[[1 3 5]
 [2 4 6]]
Original array:
 [[1 2]
 [3 4]
 [5 6]]
Axis parameter not passed. The input array is flattened before insertion.
[ 1 2 3 11 12 4 5 6]
Axis parameter passed. The values array is broadcast to match input array.
Broadcast along axis 0:
 [[ 1 2]
 [11 11]
 [ 3 4]
 [ 5 6]]
Broadcast along axis 1:
 [[ 1 11 2]
 [ 3 11 4]
 [ 5 11 6]]

np.clip(array, array_min, array_max)

np.clip(a, 0, 999)

array([[1, 2],
 [3, 4],
 [5, 6]])

np.reshape()

a = np.array(range(12))
a.reshape((12))

array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])

其他的初始化方式:

a = np.zeros((4,3))
b = np.ones((2,6))
c = np.full((3,3),-1)
print(a)
print(b)
print(c)

[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]
[[1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1.]]
[[-1 -1 -1]
 [-1 -1 -1]
 [-1 -1 -1]]


文章看到這裡的妳/你,如果覺得我的文章有幫助,可以幫我點下方的 Likecoin 五下

謝謝妳/你支持創作者!

https://button.like.co/b04602009

可以點選【我的推薦連結】創辦一個 Likecoin 的帳號,你也可以因此獲得 8 個 Likecoin!

Pandas

Pandas 是基於 NumPy 建構的套件。那與 NumPy 的差別為何?

NumPy 主要資料結構是 Ndarray,類似 list;而 Pandas 主要資料結構是 Series 和 DataFrame,類似 dict。

Series:有索引的陣列,預設索引 0~N-1
DataFrame:表格型的數據結構,預設索引也是 0~N-1

Series

import pandas as pd
A = pd.Series([1,3,5,12,5])

0 1
1 3
2 5
3 12
4 5
dtype: int64

A = pd.Series([1,2,3,None,3],['a','b','c','d','e'])
print(A)
B = pd.Series(['a','b','c','d','e'],[1,2,3,None,3])
print(B)
C = pd.Series(['a','b','c','d','e'])
print(C)

a 1.0
b 2.0
c 3.0
d NaN
e 3.0
dtype: float64
1 a
2 b
3 c
NaN d
3 e
dtype: object
0 a
1 b
2 c
3 d
4 e
dtype: object

DataFrame

import pandas as pd
import numpy as np
dates = pd.date_range('20160101',periods=6, freq='w-MON')
print(dates)
col = ['a','b','c','d']
data = np.random.randn(6,4)
df = pd.DataFrame(data, index=dates, columns=col)
print(df)
#為求美觀,所以以等寬字型輸出結果
DatetimeIndex(['2016-01-04', '2016-01-11', '2016-01-18', '2016-01-25','2016-02-01', '2016-02-08'], dtype='datetime64[ns]', freq='W-MON') #freq表示以每周一為間隔
                   a         b         c         d
2016-01-04  0.744791 -0.373153  0.982891  0.333078
2016-01-11  0.360187 -0.406994  0.515021 -0.206013
2016-01-18  0.415132  1.757737 -1.286703  0.978017
2016-01-25  1.050627  0.009218 -0.785219 -0.310091
2016-02-01 -0.734791  0.201462  1.467542 -0.709621
2016-02-08 -0.067650  2.280087 -1.578596 -0.619466

df.columns
df.index
df['b']
#為求美觀,所以以等寬字型輸出結果
2016-01-04   -0.373153
2016-01-11   -0.406994
2016-01-18    1.757737
2016-01-25    0.009218
2016-02-01    0.201462
2016-02-08    2.280087
Freq: W-MON, Name: b, dtype: float64

df2 = pd.DataFrame({‘A’ : [1,2.5,32,None],\
 ‘B’ : pd.Timestamp(‘20130102’),\
 ‘C’ : pd.Series(1,index=list(range(4)),dtype=’float32'),\
 ‘D’ : np.array([3] * 4,dtype=’int32'),\
 ‘E’ : pd.Categorical([“test”,”train”,”test”,”train”]),\
 ‘F’ : ‘foo’})
df2
df2 的輸出結果。
df2.describe()
df2.describe() 的輸出結果。

DataFrame 資料篩選

#loc是標籤
df.loc[:,['a','c']]
df.loc 的輸出結果。
#iloc是標籤的索引
df.iloc[[1,3],[0,1,3]]
df.iloc 的輸出結果。
df[df.a>0.3] #[]內放bool判斷

pd.dropna() :去掉所有 NA 或 NaN 的欄或列。

pd.fillna(value = 0) :將所有 NA 或 NaN 的資料取代為 value

pd.isnull() :去掉所有 NA 或 NaN 的資料取代為是不是 null。

DataFrame 資料合併

pd.concat([df1,...], axis = 0 [, ignore_index = False, join = 'outer'])

ignore_index :重置 index(重新給 index)。

join = 'outer' :如果沒有的欄位就填 NaN。

join = 'inner' :如果沒有的欄位就不顯⽰。

axis :根據 0, 1 決定哪個維度會合併。

pd.append(...)

只有縱向合併

pd.merge(left, right, on = [key, ...], how = 'inner')

根據 on 的 key 值,將 left 與 right 合併。

how = 'inner' :沒有的欄位不顯⽰。

how = 'outer' :沒有的欄位顯示 NaN。

how = 'left' :left 的資料保留,right 沒有的欄位顯示 NaN。

how = 'right' :right 的資料保留,left 沒有的欄位顯示 NaN。

謝謝看到最後的你

如果你覺得這篇文章不錯,請不吝給我 1~10 個掌聲(Claps)
如果你喜歡這篇文章,也歡迎分享到社群媒體給更多的朋友與持續關注我的最新文章

【Python 學習筆記】系列文連結:
1. 學習筆記 #001:輸出、輸入、型別介紹、運算子
2. 學習筆記 #002:數值處理、字串處理、選擇結構
3. 學習筆記 #003:選擇結構、迴圈結構
4. 學習筆記 #004:While 迴圈、Break and Continue、函式 Function
5. 學習筆記 #005:遞迴關係式、串列 List、List 函式、List 的處理方法
6. 學習筆記 #006:序對 Tuple、集合 Set 與字典 Dict 的介紹與使用方法
7. 學習筆記 #007:物件導向、檔案存取
8. 學習筆記 #008:模組、套件、NumPy 與 Pandas
9. 學習筆記 #009:Scrapy 網路爬蟲、CSV 模組、用 Pandas 讀取 CSV、Matplotlib 畫出各種圖形
10.學習筆記 #010:用 TK Inter 模組開始設計自己的程式介面吧!

發表留言