就在黑蛋用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)國際版授權條款」釋出。此系列文也同步在Matters及Mirror平台連載。