「跟著黑蛋用Streamlit速成天文資料分析Web App」系列文[5]:用Astroquery套件取得系外行星資料表

就在黑蛋用API取得系外行星資料表,並將它整理匯出成客戶所需的CSV檔後的隔天,他意外發現「以Astroquery套件擷取線上天文觀測資料」這場2018年台灣Python年會的演講。看完演講錄影後,黑蛋了解到,Astroquery是一個用來查詢、取得天文資料的Python套件,它能針對不同天文資料庫服務,用統一的Python語法,以星體名稱、星體座標範圍或其它篩選條件,過濾出資料庫所屬資料。藉由Astroquery,可以取得同類型星體的參數統整資料表,或是特定星體在不同電磁波段的影像、光譜、時序等觀測資料。

# Astroquery能針對不同天文資料庫服務,用統一的Python語法,以星體名稱、星體座標範圍或其它篩選條件,過濾出資料庫所屬資料
from astroquery.database_service import DatabaseService

object_result = DatabaseService.query_object(object_name='')
region_result = DatabaseService.query_region(coordinates='', radius='')
criteria_result = DatabaseService.query_criteria(**criteria)

這套件引起黑蛋的興趣 ,若Astroquery也能取得NASA系外行星資料庫的資料,或許能讓程式更為簡潔,不用寫上落落長的API網址。啊哈,他在Astroquery文件中找到他要的資訊,可以用以下程式碼取得系外行星資料表:

from astroquery.ipac.nexsci.nasa_exoplanet_archive import NasaExoplanetArchive

exoplanet_table = NasaExoplanetArchive.query_criteria(
    table='資料表名稱', select='要取得的欄位,以逗號區隔'
)

另外,他還發現Astroquery回傳的資料表是一個叫做astropy.table的物件,若要將資料表轉成Pandas的DataFrame,需要用該物件的to_pandas()方法。最後,他用Astroquery改寫了昨天用來匯出系外行星資料表CSV檔的Python script。

# Astroquery版的exoplanet_table_exporter.py
from datetime import datetime
from astroquery.ipac.nexsci.nasa_exoplanet_archive import NasaExoplanetArchive

def get_exoplanet_table_by_astroquery():
    table_name = 'pscomppars'
    columns = 'pl_name,hostname,sy_dist,pl_orbper,pl_bmasse,pl_rade,disc_year,discoverymethod'
    exoplanet_table = NasaExoplanetArchive.query_criteria(
        table=table_name, select=columns
    )
    exoplanet_table = exoplanet_table.to_pandas()
    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_astroquery()
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.