Table of Contents
TEJ 提供許多透過程式語言來去存取 TEJ 資料庫的方式,像是可以使用 Python 搭配 https存取的 REST API、TEJ 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'
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也會變化
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,不需要另外合併股價資料與欄位
電子報訂閱