REST API 與 TEJ API 使用差異

TEJ API Rest API
Photo Credits: Unsplash

本文重點概要

  • 文章難度:★☆☆☆☆
  • 以兩種方式撈取股價與財務資料
  • 閱讀建議:本篇文章嘗試找出 REST API 與 TEJ API 在資料撈取、處理上的異同,以幫助讀者選擇最符合自身習慣的撈取資料方式,故在閱讀本文之前可以先瀏覽 透過TEJ API打造自己的資料庫TEJ REST API 使用手冊 先對兩者有初步的了解

前言

TEJ 提供許多透過程式語言來去存取 TEJ 資料庫的方式,像是可以使用 Python 搭配 https存取的 REST APITEJ API模組導入,或是利用 R語言的 R API,以及 NET語言的 .Net API雖然運作原理有些不同,但撈取資料的邏輯、參數的讀取還是有許多類似的地方,進而方便使用者能隨時轉換。因此本文以先前做過介紹的REST API、TEJ API進行探討, 看看兩者串接 TEJ 資料庫的差異吧 !

編輯環境及模組需求

本文使用 Windows OS 並以 Jupyter Notebook 作為編輯器

#通用功能模組
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
#REST API 所需功能模組
import requests, json
#TEJ API 所需模組與參數設定(將Your Key替換成當初購買的金鑰編碼)
import tejapi
tejapi.ApiConfig.api_key = 'Your Key'

資料庫使用

主要差異

Case1: 非完整(單頁)股價資料撈取

方法A: REST API

  • 網頁連結設定與讀取
key = "&api_key=" + "Your Key" 
database = 'TWN/APRCD'                               
coid = "&coid=" + "2454,3034,2379"                    
date_start = "&mdate.gte=" + "2000-01-01"           
date_end = "&mdate.lte=" + "2020-12-31"         
columns = "&opts.columns="+ "coid,mdate,open_d,high_d,low_d,close_d" 
paginate = ''

key: 資料庫金鑰,將Your Key改成當初購買取得的金鑰

database: 資料庫代碼,選取的是未調整股價(日)資料庫

coid: 股價代碼,這邊選擇的是 2454、3034、2379 這三家公司,若想選取所有公司,則填入空字串 coid = “”

date_start: 資料起始時間,若無限制則填入空字串 date_start = “”

date_end: 資料結束時間,若無限制則填入空字串 date_end = “”

columns: 選取欄位,欄位代碼參考該資料庫欄位說明,若想選取所有欄位,則填入空字串 columns = “”

paginate: 這邊一律預設為空字串,之後會隨著迴圈做變動

url = "https://api.tej.com.tw/api/datatables/" + database + ".json?" + coid + date_start + date_end + columns + key + paginate 
rq = requests.get(url)

將上面建立的變數,附加在網頁基本連結後方,中間穿插的 .json? 代表的是我們選擇的資料輸出格式為 json,並以 requests.get() 讀取該網站,並存入 rq ,接著用json()顯示內容,可以看到是以字典的方式呈現

rq.json()
  • 撈取中文欄位
column_info = rq.json()['datatable']['columns']

這邊以字典取值的方式,先取得 key 為 datatable 的對應值,因為該對應值也是字典,因此進一步取得該字典 key 為 columns 的值,內容為欄位資訊

chinese_columns = [i['cname'] for i in column_info]

取得這個欄位資訊的中文欄位

  • 取得股價資料,並與中文欄位形成表格
data = rq.json()['datatable']['data']

這邊則是取得第二層字典 key 為 data 的值,此即為股價資料

data_table_a = pd.DataFrame(data, columns = chinese_columns)

形成 DataFrame格式的資料,故可與方法 B的結果進行對照

因為TEJ單次取得資料限制最多10,000筆,故上述資料可能不完整

next_cursor_id = rq.json()['meta']['next_cursor_id']
print(next_cursor_id)

可以此方式確認該頁資料是否為最後一頁,若不是則會如同上方顯示一串編碼,可以把它想成下一頁的連結;若印出 None則代表該頁為最後一頁。要注意的是每次呼叫 requests.get(),next_cursor_id都會改變,即使重新 requests.get() 讀取同個網頁連結,next_cursor_id也會變化

方法B: TEJ API

data_table_b = tejapi.get('TWN/APRCD',
                          coid = ['2454','3034','2379'],
                          mdate = {'gte':'2000-01-01', 'lte':'2020-12-31'},
                          opts = {'columns':['coid','mdate','open_d','high_d','low_d','close_d']},
                          chinese_column_name = True)

對照REST API的格式,可以發現兩者資料的範圍選取方式極為類似,而TEJ API輸出的資料格式即是 DataFrame,不需要另外合併股價資料與欄位

完整程式碼

返回總覽頁
Procesing