「跟著黑蛋用Streamlit速成天文資料分析Web App」系列文[12]:加上系外行星資料表距離欄位的單位轉換功能

「嗨,黑蛋,咦? 你那邊怎麼會有鳥叫聲?喔,原來你在山上呀。對了,客戶表示目前系外行星資料表中,『與地球的距離』欄位的值是以秒差距這個單位呈現,他希望有可以切換成其他單位的功能,像是光年天文單位與公里,以便他能因應不同狀況而匯出不同距離單位的資料表。」

其實黑蛋一直很納悶何謂秒差距,結束通話後,他便詢問Google大神。在看完「星空500秒:ep8 視差現象與秒差距」這個由中央大學天文所陳文屏教授所解說的影片後,黑蛋俯瞰山腳,想像山腳下兩頭的人分別望向他所在的這座山時所造成的視角差異,體會到這便是用來定義秒差距的視差現象吧。

在略懂秒差距後,黑蛋開始著手進行單位轉換功能的開發。為了方便將秒差距換算成其他距離單位,他先是用了Astropy這個Python套件中的天文常用單位轉換功能astropy.units,來計算1個秒差距等於多少光年、多少天文單位、多少公里。然後,他加上st.radio元件,讓使用者能在頁面上切換距離單位,並搭配convert_exoplanet_table_distance_unit()函式,來換算資料表中『與地球的距離』欄位的值。最後,為了讓使用者了解不同單位如何換算,他以st.markdown加上說明。

# 02_Exoplanet_table_filter.py
import streamlit as st
import astropy.units as u

# 前略

def get_distance_unit_dict():
    parsec = 1 * u.parsec
    parsec_to_lightyear = parsec.to(u.lyr)
    parsec_to_au = parsec.to(u.au)
    parsec_to_km = parsec.to(u.km)
    distance_unit_dict = {
        '秒差距': parsec,
        '光年': parsec_to_lightyear,
        '天文單位': parsec_to_au,
        '公里': parsec_to_km
    }

    return distance_unit_dict

def convert_exoplanet_table_distance_unit(
    exoplanet_table, distance_unit_dict, distance_unit
):
    exoplanet_table['與地球的距離'] = exoplanet_table[
        '與地球的距離'] * distance_unit_dict.get(distance_unit).value
    exoplanet_table = exoplanet_table.rename(
        columns={'與地球的距離': f'與地球的距離(單位:{distance_unit})'}
    )

    return exoplanet_table

# 中略

distance_unit_dict = get_distance_unit_dict()
distance_unit = st.radio(
    '切換表格中的距離單位', list(distance_unit_dict.keys()), horizontal=True
)
exoplanet_table = convert_exoplanet_table_distance_unit(
    exoplanet_table, distance_unit_dict, distance_unit
)

with st.expander('各距離單位的換算'):
    st.markdown('[秒差距](https://zh.wikipedia.org/zh-tw/%E7%A7%92%E5%B7%AE%E8%B7%9D)、[光年](https://zh.wikipedia.org/zh-tw/%E5%85%89%E5%B9%B4)和[天文單位](https://zh.wikipedia.org/zh-tw/%E5%A4%A9%E6%96%87%E5%96%AE%E4%BD%8D)都是常用來描述星體距離的長度單位')
    st.markdown('1秒差距約為 $3.09*10^{13}$ 公里')
    st.markdown('1光年約為 $9.46*10^{12}$ 公里')
    st.markdown('1天文單位是地球和太陽的平均距離,約為 $1.5*10^{8}$ 公里')

# 後略

此系列文由蘇羿豪撰寫,以「創用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.