iT邦幫忙

2022 iThome 鐵人賽

DAY 13
0
AI & Data

跟著黑蛋用Streamlit速成天文資料分析Web App系列 第 13

[12]:加上系外行星資料表距離欄位的單位轉換功能

PM貳婰舞開啟與黑蛋的語音通話。

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

其實黑蛋一直很納悶何謂秒差距,結束通話後,他便詢問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)國際版授權條款」釋出。此系列文也同步在MattersMirror平台連載。


上一篇
[11]:用streamlit-aggrid美化系外行星資料表
下一篇
[13]:用Plotly繪製系外行星資料統計圖
系列文
跟著黑蛋用Streamlit速成天文資料分析Web App30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言