File size: 5,984 Bytes
91f3d9a
 
 
 
 
9e56881
91f3d9a
 
 
 
 
 
 
 
 
 
 
 
 
 
9e56881
 
 
 
 
91f3d9a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9e56881
 
 
 
 
 
 
 
 
 
 
 
91f3d9a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9e56881
 
 
 
 
 
 
 
 
 
 
 
 
91f3d9a
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
import streamlit as st
import requests
from bs4 import BeautifulSoup
import pandas as pd
import plotly.express as px
import time

def main():
    st.set_page_config(page_title="奇美醫院病床占用率查詢", layout="wide")
    
    st.title("奇美醫院病床占用率查詢系統")
    st.write("此應用程式顯示奇美醫院的即時病床占用情況")
    
    # 添加刷新按鈕
    if st.button("刷新數據"):
        st.cache_data.clear()
    
    # 獲取病床數據
    df = get_hospital_bed_data()
    
    # 如果數據獲取失敗,提供示例數據
    if df.empty:
        st.warning("⚠️ 無法連接到奇美醫院網站。顯示示例數據以供參考。")
        df = get_sample_data()
    
    # 顯示數據
    col1, col2 = st.columns([2, 3])
    
    with col1:
        st.subheader("病床占用數據表")
        st.dataframe(df, use_container_width=True)
        
        # 計算總數
        total_beds = df['總床數'].sum()
        total_occupied = df['佔床數'].sum()
        total_available = df['空床數'].sum()
        overall_rate = f"{(total_occupied / total_beds * 100):.2f}%" if total_beds > 0 else "0%"
        
        st.subheader("總計")
        total_data = pd.DataFrame({
            '項目': ['總病床數', '總佔床數', '總空床數', '整體佔床率'],
            '數值': [total_beds, total_occupied, total_available, overall_rate]
        })
        st.dataframe(total_data, use_container_width=True, hide_index=True)
    
    with col2:
        st.subheader("病床占用率視覺化")
        
        # 創建占用率條形圖
        fig = px.bar(
            df,
            x='病床類別',
            y='佔床數',
            text='佔床率',
            color='佔床率',
            color_continuous_scale='RdYlGn_r',  # 紅(高)-黃-綠(低)色彩範圍
            labels={'佔床數': '已占用病床數', '病床類別': '病床類型', '佔床率': '占用率'},
            height=500
        )
        fig.update_layout(xaxis={'categoryorder': 'total descending'})
        st.plotly_chart(fig, use_container_width=True)
        
        # 創建餅圖顯示空床/占床比例
        pie_data = pd.DataFrame({
            '狀態': ['已占用', '可用'],
            '數量': [total_occupied, total_available]
        })
        pie_fig = px.pie(
            pie_data, 
            values='數量', 
            names='狀態',
            color='狀態',
            color_discrete_map={'已占用': 'red', '可用': 'green'},
            hole=0.4
        )
        st.plotly_chart(pie_fig, use_container_width=True)

@st.cache_data(ttl=300)  # 資料快取5分鐘
def get_hospital_bed_data():
    """獲取奇美醫院病床占用數據"""
    try:
        # URL of the page to scrape
        url = "https://www.chimei.org.tw/%E4%BD%94%E5%BA%8A%E7%8E%87%E6%9F%A5%E8%A9%A2/%E4%BD%94%E5%BA%8A%E7%8E%87%E6%9F%A5%E8%A9%A2.aspx?ihospital=10&ffloor="
        
        # 設置請求頭,模擬瀏覽器訪問
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'Accept-Language': 'zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7',
            'Connection': 'keep-alive',
            'Upgrade-Insecure-Requests': '1',
            'Referer': 'https://www.chimei.org.tw/'
        }
        
        # Send HTTP request with timeout and headers
        response = requests.get(url, headers=headers, timeout=10)
        response.encoding = 'utf-8'  # Set encoding to handle Chinese characters
        
        # Create BeautifulSoup object
        soup = BeautifulSoup(response.text, 'html.parser')
        
        # Find the target table (DG1)
        target_table = soup.find('table', {'id': 'DG1'})
        
        # Extract data from the table
        data = []
        if target_table:
            rows = target_table.find_all('tr')
            
            # Skip the header row
            for row in rows[1:]:
                cols = row.find_all('td')
                if len(cols) == 5:  # Ensure row has 5 columns
                    bed_type = cols[0].text.strip()
                    total_beds = int(cols[1].text.strip())
                    occupied_beds = int(cols[2].text.strip())
                    available_beds = int(cols[3].text.strip())
                    occupancy_rate = cols[4].text.strip()
                    
                    data.append({
                        '病床類別': bed_type,
                        '總床數': total_beds,
                        '佔床數': occupied_beds,
                        '空床數': available_beds,
                        '佔床率': occupancy_rate
                    })
        
        # Create pandas DataFrame
        df = pd.DataFrame(data)
        return df
    
    except Exception as e:
        st.error(f"獲取數據時發生錯誤: {e}")
        return pd.DataFrame()

def get_sample_data():
    """提供示例數據,當無法從網站獲取數據時使用"""
    data = [
        {'病床類別': '一般病床', '總床數': 1200, '佔床數': 980, '空床數': 220, '佔床率': '81.67%'},
        {'病床類別': '加護病床', '總床數': 120, '佔床數': 98, '空床數': 22, '佔床率': '81.67%'},
        {'病床類別': '燒燙傷病床', '總床數': 30, '佔床數': 18, '空床數': 12, '佔床率': '60.00%'},
        {'病床類別': '負壓隔離病床', '總床數': 24, '佔床數': 10, '空床數': 14, '佔床率': '41.67%'},
        {'病床類別': '急診觀察病床', '總床數': 60, '佔床數': 45, '空床數': 15, '佔床率': '75.00%'},
        {'病床類別': '精神科病床', '總床數': 80, '佔床數': 65, '空床數': 15, '佔床率': '81.25%'}
    ]
    return pd.DataFrame(data)

if __name__ == "__main__":
    main()