지난번 포스팅에서 Data.go.kr의 공공데이터로 제공하는 기상청 날씨API를 사용하여 일기예보를 확인해봤습니다.(이전글)
이번에는 지난번에 만든 파이썬코드에다 사용자가 원하는 지역을 선택하면 API제공자료로 제공되는 엑셀파일의 날씨정보 좌표를 찾아와 날씨를 확인하도록 추가해보겠습니다.
문제 해결 방법
각 지역의 x,y좌표가 담긴 엑셀파일 입니다. 사용자는 1단계, 2단계, 3단계 세번의 선택을하면 그에맞는 격자 X와 격자 Y값을 제공해주려고 합니다.
하지만 엑셀의 데이터가 너무 방대하므로 중복되는 시를 제외하고 하나로 일치하는 시끼리만 목록형으로 제공해주면 선택이 편하겠다고 생각했습니다. 터미널 환경에서는 사용자에게 선택지를 보여주는 것이 제한적이기 떄문에 웹 기반으로하여 어떤 환경에서든 쉽게 접근하여 선택할수 있도록 하겠습니다.
웹기반 선택지 제공하기
Streamlit이라는 파이썬 라이브러리를 활용하여, 사용자가 자신이 원하는 지역을 선택할 수 있도록 하겠습니다. 그리고 선택된 지역을 기반으로 날짜별 날씨 예보 데이터를 제공해드리겠습니다.
pip install streamlit
streamlit run filename.py #how to use
pip 명령을 사용하여 필요한 패키지를 설치해주세요.
두번째 줄은 streamlit으로 파이썬 파일을 실행하는 예시입니다.
import streamlit as st #web
import pandas as pd #excel
기존에 작성한 코드에서 상단에 사용할 라이브러리를 추가하겠습니다.
streamlit은 현재의 코드를 웹 기반 환경으로 전환해주는 역할을 하며, pandas는 엑셀파일의 내용을 읽어와 사용자의 선택에 따른 일치하는 항목을 찾고 웹에 표현해주는 기능을 담당하게 됩니다.
df = pd.read_excel('data.xlsx') # 'file_path.xlsx' 부분을 실제 파일 경로로 대체
# 1단계 값 리스트 추출
values_1st = df['1단계'].unique().tolist()
# 사용자 인터페이스
selected_1st = st.selectbox('1단계를 선택하세요', values_1st)
# 선택된 1단계 값에 따라 2단계 값 리스트 추출
values_2nd = df[df['1단계'] == selected_1st]['2단계'].unique().tolist()
# 사용자 인터페이스
selected_2nd = st.selectbox('2단계를 선택하세요', values_2nd)
# 선택된 1단계, 2단계 값에 따라 3단계 값 리스트 추출
values_3rd = df[(df['1단계'] == selected_1st) & (df['2단계'] == selected_2nd)]['3단계'].unique().tolist()
# 사용자 인터페이스
selected_3rd = st.selectbox('3단계를 선택하세요', values_3rd)
# 데이터 필터링
filtered_df = df[(df['1단계'] == selected_1st) &
(df['2단계'] == selected_2nd) &
(df['3단계'] == selected_3rd)]
st.write(filtered_df[['격자 X', '격자 Y']])
if not filtered_df.empty: #사용자가 선택을 하여 filtered값이 비어있지 않으면 다음코드 작동
# '격자 X', '격자 Y'의 첫 번째 값만 각각의 변수에 저장
x_value = filtered_df['격자 X'].values[0]
y_value = filtered_df['격자 Y'].values[0]
위 코드를 추가하면, 중복되는 단계의 텍스트를 하나로 모아서 간결하게 선택지를 제공하게 됩니다. 사용자가 3단계까지 선택을 완료하면, 그에 해당하는 X, Y 값을 x_value 변수와 y_value 변수에 저장하게 됩니다.
이때, 현재 파이썬 파일과 같은 위치에 엑셀 파일을 위치시키고, 엑셀 파일의 이름을 코드에 맞춰 변경해주셔야 합니다(예: data.xlsx) 1line
마지막으로, 'if'문 안에 기존의 코드를 추가합니다. 이는 사용자가 3단계까지 선택을 완료한 후에만 날씨 정보를 제공하기 위함입니다.
st.write("전체예보")
df = pd.DataFrame(result)
st.table(df)
마지막으로, 출력 부분의 코드를 작성합니다.
streamlit에서 웹페이지에 데이터를 출력하기위해서는 st함수를 사용하여 wirte로 출력할 수 있습니다.
이 코드 역시 'if'문 안에 작성되어야 합니다. 이전 코드에서 사용자가 3단계까지 선택을 완료하고 x, y 값을 받아온 후에, '전체예보'라는 텍스트를 화면에 출력합니다(1 line).
그 다음으로, API를 사용하여 가져왔던 result에 저장된 날씨 예보 데이터를 pandas 데이터프레임으로 변환하고, 그 결과를 'df'라는 변수에 저장합니다(2 line).
df의 데이터를 웹에 테이블 형태로 출력합니다(3 line).
웹에서 실행하기
streamlit으로 파이썬 파일을 실행시키겠습니다.
streamlit 명령을 실행하고 웹페이지가 준비되면 자동으로 웹브라우저가 열리게됩니다. 만약 자신의 사이트로 이동되지 않는다면 터미널을 확인하여 자신의 local URL주소를 브라우저에 붙여넣어 이동하세요.
사용자 선택을 위한 각 세가지의 st박스가 존재합니다.
중복되는 도시는 한번만 표시하며 각 선택가능한 시를 표시합니다. 이중에 하나를 선택해보겠습니다.
1,2단계를 선택하면 해당하는 동만 목록으로 출력됩니다. 3단계까지 선택을 완료하면 격자 X와 격자 Y의 값을 엑셀에서 가져와 일기예보 조회코드를 실행합니다.
사진에 나오는 데이터처럼 이전에 터미널에서 출력되었던 데이터보다 더 보기좋게 데이터가 출력되는걸 확인할 수 있습니다.
전체코드 - Github