會議中,PM貳婰舞跟黑蛋說:「客戶對於我們之前透過NASA系外行星資料庫網站手動匯出的CSV檔,表示有太多不必要的欄位,希望聚焦幾個欄位且名稱要以中文呈現,他要求的欄位有『行星名稱』、『所屬恆星名稱』、『與地球的距離』、『行星軌道週期』、『行星質量』、『行星半徑』、『發現年份』、『發現方法』。」
黑蛋回說:「看來需要先過濾處理資料表,我會再研究看看是否有相關API可以取得資料,這樣就能以Python程式自動化產出整理過後的報表,若未來資料庫有新增行星資料,也不用透過網站手動下載,排程定期產出CSV檔即可。」
結束視訊會議後,他憶起之前在NASA系外行星資料庫網站首頁左下方有看到新舊版API的說明頁面入口:
新版API是基於Table Access Protocol(TAP)標準,其說明頁面除了描述API的使用方法,也說明各資料表欄位所代表的意義。這個API是使用Astronomical Data Query Language(ADQL)語法來查詢資料表並過濾欄位,該語法是基於SQL。
應客戶需求,黑蛋在API網址中用ADQL的select…from語法,查詢能一行綜觀同個行星所有欄位值的資料表「Planetary Systems Composite Parameters」,並選取所需欄位。他還發現在API中加入format=csv參數,就能在Python script中用Pandas的read_csv()函式,直接將API回傳的資料表讀進DataFrame中,以便將欄位名稱改成中文。最後,他用以下Python script自動匯出客戶此次要求的CSV檔。
# exoplanet_table_exporter.py
import pandas as pd
from datetime import datetime
def get_exoplanet_table_by_nasa_api():
table_name = 'pscomppars'
columns = 'pl_name,hostname,sy_dist,pl_orbper,pl_bmasse,pl_rade,disc_year,discoverymethod'
nasa_exoplanet_archive_api = 'https://exoplanetarchive.ipac.caltech.edu/TAP/sync?query='
nasa_exoplanet_archive_api += f'select+{columns}+from+{table_name}&format=csv'
exoplanet_table = pd.read_csv(nasa_exoplanet_archive_api)
exoplanet_table = exoplanet_table.rename(
columns={
'pl_name': '行星名稱',
'hostname': '所屬恆星名稱',
'sy_dist': '與地球的距離(單位:秒差距)',
'pl_orbper': '行星軌道週期(單位:天)',
'pl_bmasse': '行星質量(單位:地球質量)',
'pl_rade': '行星半徑(單位:地球半徑)',
'disc_year': '發現年份',
'discoverymethod': '發現方法'
}
)
exoplanet_table.sort_values(
by='發現年份', ascending=False, inplace=True, ignore_index=True
)
return exoplanet_table
exoplanet_table = get_exoplanet_table_by_nasa_api()
exoplanet_table.to_csv(
f"./exoplanet_table_{datetime.today().strftime('%Y%m%d')}.csv", index=False
)
此系列文由蘇羿豪撰寫,以「創用CC 姓名標示 4.0(CC BY 4.0)國際版授權條款」釋出。此系列文也同步在Matters及Mirror平台連載。