【資料科學】 Numpy, Pandas

TEJ 台灣經濟新報
TEJ-API 金融資料分析
10 min readMar 22, 2021

透過numpy及pandas對資料進行初步處裡/分析

* 前言

透過前兩篇文章想必大家應該都已經知道要如何透過TEJ API來抓取資料,然後再儲存到適合的格式,最後再定期更新了吧!那本篇文章就是在跟大家說明,如何透過python當中最重要的兩個資料工具包Numpy及Pandas對抓下來的資料進行第一步地處理&分析~

* 本文重點概要

  • 🌟 Numpy 介紹/使用
  • 🌟 Pandas 介紹/使用

🚪本次使用的相關網站連結🚪

* Numpy 是甚麼?要怎麼用?

Numpy的設計主要是為了方便且高效的來處理n維且大量數據的陣列,並搭配內建函數給予使用者對資料進行初步快速地處裡。

  • 基礎應用-單維
import numpy as npa = np.array([0, 0.5, 1.0, 1.5, 2.0]) #float ndarray -1-1.
b = np.array(['a', 'b', 'c']) #string ndarray -1-2.
c = np.arange(0, 10, 2) #array([0, 2, 4, 6, 8]) -2.
c[2:] #array([4, 6, 8]) -3.
c[:2] #array([0, 2]) -4.

上面的例子分別代表的是:

  1. 建立一個資料為float型態的陣列;建立一個資料為string型態的陣列
  2. 透過np.arange(),建立一個起始為0,終點為8,跳躍值為2的陣列。
  3. 在python當中,中括號"[]"表示選取":"表示到…,但要注意的是,在python中第一個數值的位置是0而不是1。因此,c[2:]表示從選取一個從陣列位置為2到最後(包含最後)的陣列。
  4. 作法同上,但不同的地方是,如果改為c[:2],則是代表選取一個從頭到陣列位置為2(不包含2)的陣列。
  • 數學工具
a = np.arange(0, 30, 2) #array([0, 2, 4, ..., 28])a.sum() #210                                      -1-1.
a.mean() #14.0 -1-2.
a.std() #8.640987 -1-3.
a.cumsum() #array([0, 2, 6, 12, ...,210]) -1-4.
lst = [0, 2, 4]
lst*2 = [0, 2, 4, 0, 2, 4] -2-1
a+a #array([0, 4, 8, ..., 56]) -2-2.
a*a #array([0, 4, 16, ..., 784]) -2-3.

上面的例子分別代表的是:

  1. a陣列的加總;平均值;標準差;累加
  2. a陣列對應位置直接相加;直接相乘

其中第一個用法即是透過numpy內建的大量方法直接計算。
而在第二個例子裏面就可以看到numpy的向量化數學運算,因為如果是在一般的list下(2–1),可以看到把list乘2的話會把list當中的元素量變成原來的兩倍而不是數值變兩倍,但如果是numpy(2–2, 2–3)則是可以把陣列裡面的元素相對應位置進行數學運算~💪💪

  • 基礎應用-多維
b = np.array([a, a*2]) #array([0, 2, 4, ..., 28],
[0, 4, 8, ..., 56])
b[0] #array([0, 2, 4, ..., 28]) -1-1.
b[0][1] #2 -1-2.
b.sum(axis = 1) #array([210, 420]) -1-3.
b.shape #(2, 15) -2-1.
b.reshape(5,6) #array([0, 2, 4, 6, 8, 10], -2-2.
...
[36, 40, ..., 56]])

上面的例子分別代表的是:

  1. b陣列選取第一列;選取第一列第二個位置的元素;b陣列之列總和
  2. b陣列之外形(2*15);改成新的外形(2*15 -> 5*6)

接下來看到的是numpy在多維陣列的表現,在選擇上一樣是透過"[]"進行,不同的地方是因為能選的東西變多了,所以可以透過兩個"[][]"分別代表先選哪一列,再選甚麼位置
那如果是要做一些矩陣運算的時候,就可以透過shape找到現在陣列的形狀再用reshape改成想要的形狀後就可以做運算~💪💪

  • 其他應用-布林、隨機變數、財務…
#boolean
b > 15 #array([False, False, ..., True], -1-1.
[False, False, ..., True])
np.where(b>15, 1, 0) #array([0, 0, ..., 1], -1-2.
[0, 0, ..., 1])
#random variable
np.random.normal(5, 2, 10) -2-1.
np.random.standard_normal(5) -2-2.
#financial
pip install numpy_financial
import numpy_financial as npf
npf.fv(0.03, 5, 0, -1000) #1159.27 -3-1.
#fv(rate, nper, pmt, pv)
npf.irr([-95, 3, 3, 3, 103]) #0.0439 -3-2.
#irr(values)

上面的例子分別代表的是:

  1. 布林陣列:
    可以直接透過不等式(例子中是>15)在numpy陣列中找出對應的T/F陣列,又或是透過np.where()對T/F做出新的判別方式(例子中T為1,F為0)。
  2. 隨機變數:
    搭配統計當中不同的分佈函數去產生隨機變數,如例子中的常態分佈(均值5、標準差2、10個元素)、標準常態分佈等等。
  3. 財務函數:
    在numpy當中,還有針對財務工具所推出的工具包,但我們需要另外下載這個package,安裝好且import之後,就可以使用一些像是fv、irr等折現時候會用到的函數工具拉,全部的函數可以上這裡查詢~

其實numpy還有許許多多針對陣列當中數據處裡的應用,小編很難只透過一篇文章就全數道盡 😢,剩下的大家有興趣可以透過Numpy官方網站或是在下方告訴我們囉!💪💪

* Pandas 又是甚麼?又該怎麼用?

Pandas是一種專門分析表格資料的工具包,就如同Excel一樣,他是以一種叫做DataFrame類別的方式將資料以表格的方式呈現,以協助使用者更為方便的分析資料,尤其是以時間序列為主的金融資料。

  • 基礎應用
import pandas as pddf = pd.DataFrame([1, 2, 3, 4],
columns = ['Numbers'],
index = ['index_a','index_b','index_c','index_d'])

從上面可以看到我們透過上述程式碼產出一個,欄位名稱為Numbers,列名稱分別為index_a,b,c,d的表格

df.loc['index_a'] #Numbers 1                                  -1-1.df.iloc[0:2] #參考完整程式碼                                    -1-2.df * 2 #same as numpy                                         -1-3.#新增"Name"欄位
df['Name'] = ['Amy', 'Bob', 'Catherine', 'Duke'] -2-1.
#選取整個欄
df['Numbers'] -2-2.
#刪除欄位
df.drop('欄位名 ', axis=1) -2-3.
#Math
df['Numbers'].sum() #10 -3-1.
df['Numbers'].mean() #2.5 -3-2.
df['Numbers'].std() #1.291 -3-3.

上面的例子分別代表的是:

  1. 透過loc與iloc去索引對應的值,要注意的是loc是欄/列位名稱所以選擇時要輸入的是名稱,而iloc則是該元素對應的位置,以例子來說就是選擇位置為0到2(不含3)的元素。
  2. 新增/選取/刪除欄位
  3. df的加總;平均值;標準差

Pandas的基礎應用當中,其實大多數跟我們之前如同我們之前提過的numpy陣列,在選擇上一樣透過中括號對["欄位名稱"]進行新增/選擇,但如果是要刪除的話,則要透過drop()的方式對已有欄位進行刪去。在運算上,Pandas DataFrame 一樣可以直接對欄位裡面的數值進行基本的統計值運算~💪💪

  • 基礎分析
import tejapi
tejapi.ApiConfig.api_key = “你的api_key”
df = tejapi.get('TWN/EWPRCD',
coid = ['2330'],
mdate={'gte':'2020-01-01', 'lte':'2020-12-31'},
opts={'columns': ['mdate','open_d','high_d','low_d','close_d']},
paginate=True
)
#Math
df.describe()
np.mean(df)
np.log(df)
#作圖
df['close_d'].plot()
敘述統計表

在pandas資料基本分析裡面,我們採用的例子一樣是透過TEJ API得到的2330股價日資料,然後就可以直接透過describe()的方式得到大部分可能會需要用到的敘述統計值(如上圖👆),而如果想要對這些數值進行運算,就可以透過我們之前提到的numpy工具直接對整個表格進行運算噢!

股價變化圖(日)

最後就是基本作圖,在Python的作圖方法裡面也是有數種操作方式,而Pandas則是提供了小編覺得其中最為簡便的一種。如果想要呈現的圖表並不複雜的話(如股價走勢、股價報酬率變化等),可以直接透過選取該欄位資料然後加上.plot(),就可以直接看到結果啦(如上圖👆)

而在這邊唯一要注意的是,圖表中的X與Y軸分別代表的是Index以及欄位資料,所以才會對原先抓下來的資料先做一個set_index()的動作噢!

* 結語

這次分享給大家的是如何使用Python當中的Numpy還有Pandas工具包對資料進行初步整理/分析,但這兩個工具裡面的功能其實包山包海,短短一篇文章實在是難以詳述,所以~如果有興趣或者疑問可以上他們的網站亦或是在下方留言告我們 ❗️❗️那麼在這篇文章之後,我們就會進入透過這兩個工具包對金融資料進行分析應用啦,請大家好好期待 ❗️❗️

最後,如果喜歡本篇文章的內容請幫我們點擊下方圖示👏 ,給予我們更多支持與鼓勵,有任何的問題都歡迎在下方留言/來信,我們會盡快回覆大家👍👍

* 再次附上相關網站連結 💪

🌟有任何使用上的問題都歡迎與我們聯繫:聯絡資訊🌟

附上完整程式碼 🚪

--

--

TEJ 台灣經濟新報
TEJ-API 金融資料分析

TEJ 為台灣本土第一大財經資訊公司,成立於 1990 年,提供金融市場基本分析所需資訊,以及信用風險、法遵科技、資產評價、量化分析及 ESG 等解決方案及顧問服務。鑒於財務金融領域日趨多元與複雜,TEJ 結合實務與學術界的精英人才,致力於開發機器學習、人工智慧 AI 及自然語言處理 NLP 等新技術,持續提供創新服務