「跟著黑蛋用Streamlit速成天文資料分析Web App」系列文[4]:用NASA系外行星資料庫的API取得資料表

會議中,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)國際版授權條款」釋出。

Subscribe to 天文背包黑客
Receive the latest updates directly to your inbox.
Mint this entry as an NFT to add it to your collection.
Verification
This entry has been permanently stored onchain and signed by its creator.