Streamlit은 데이터를 기반으로 한 애플리케이션 개발에 적합하며, 외부 API와의 통합은 Streamlit의 활용도를 한층 높여준다. 이번 포스트에서는 외부 API를 Streamlit과 연동하여 데이터를 가져오고 이를 시각화하는 방법을 단계별로 설명하고자 한다.
Streamlit과 API 연동의 개요
외부 API를 활용하면 Streamlit 애플리케이션에서 다양한 데이터를 실시간으로 가져와 시각화할 수 있으므로 활용도가 다양해지게 된다.
주요 활용 사례
- 실시간 날씨 대시보드
- 주식 데이터 분석
- 머신러닝 모델 예측 결과 API 호출
- 사용자 정의 API 호출 및 데이터 표시
사용 기술 스택
- Python: 데이터 처리 및 API 호출
- Streamlit: UI 및 대시보드 제작
- Requests 라이브러리: API 호출
- 외부 API
예제 코드 – 실시간 날씨 대시보드 만들기
코드
import streamlit as st
from meteostat import Point, Daily
import pandas as pd
import datetime
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
# Streamlit 페이지 설정
st.set_page_config(page_title="Weather Dashboard", page_icon="🌤️", layout="wide")
# Streamlit UI 구성
st.title("🌤️ Weather Dashboard")
# 도시 설정
city_name = st.selectbox(
"Select City:",
["Seoul", "New York", "London", "Tokyo", "Sydney"],
index=0
)
start_date = st.date_input("Start:", value=datetime.date(2024, 12, 1))
end_date = st.date_input("End:", value=datetime.date(2024, 12, 10))
# 도시 좌표
city_coordinates = {
"Seoul": (37.5665, 126.9780),
"New York": (40.7128, -74.0060),
"London": (51.5074, -0.1278),
"Tokyo": (35.6895, 139.6917),
"Sydney": (-33.8688, 151.2093)
}
# 선택한 도시의 좌표 가져오기
latitude, longitude = city_coordinates[city_name]
#데이터 요청 및 처리
def fetch_weather_data(lat, lon, start, end):
location = Point(lat, lon)
start = pd.to_datetime(start)
end = pd.to_datetime(end)
data = Daily(location, start, end)
data = data.fetch()
return data.reset_index()
#데이터 가져오기
if st.button("Weather Data Check"):
if start_date > end_date:
st.error("The end date must be after the start date.")
else:
weather_data = fetch_weather_data(latitude, longitude, start_date, end_date)
if weather_data.empty:
st.warning("There is no data for that period.")
else:
st.subheader(f"📊 {city_name} Weather Data ({start_date} ~ {end_date})")
st.dataframe(weather_data)
fig, ax = plt.subplots(figsize=(10, 4))
ax.xaxis.set_major_formatter(mdates.DateFormatter("%m-%d"))
ax.plot(weather_data['time'], weather_data['tavg'], label="Avg Temp (°C)", color="blue", linewidth=2)
ax.bar(weather_data['time'], weather_data['prcp'], label="PRCP (mm)", color="cyan", alpha=0.6)
ax.set_title(f"{city_name} Weather", fontsize=16)
ax.set_xlabel("Date", fontsize=12)
ax.set_ylabel("Temp (°C) / Prcp (mm)", fontsize=12)
ax.legend(fontsize=10)
plt.xticks(fontsize=10)
plt.yticks(fontsize=10)
plt.grid(alpha=0.3)
st.pyplot(fig)
st.metric("Average Temperature", f"{weather_data['tavg'].mean():.2f}°C")
st.metric("Precipitation", f"{weather_data['prcp'].sum():.2f} mm")
코드 설명
meteostat
라이브러리- Meteostat의 Python 라이브러리는 데이터를 간단히 조회하고 DataFrame 형태로 반환한다.
- 주요 클래스:
Point
: 특정 지리적 위치를 지정.Daily
: 특정 날짜 범위에 대한 일일 날씨 데이터 조회.
- 도시 선택과 좌표 매핑
- 도시 이름과 좌표를 사용하여 사용자가 선택한 도시의 좌표를 가져온다.
- 날씨 데이터 조회
Daily(location, start_date, end_date)
로 특정 위치와 날짜 범위에 대한 데이터를 가져온다.fetch()
메서드로 Pandas DataFrame 형식의 데이터를 반환한다.
- Streamlit UI
- 사용자가 도시와 날짜 범위를 선택하면 버튼 클릭 시 데이터를 가져온다.
st.dataframe
으로 데이터를 표 형태로 표시하고,st.line_chart
로 그래프를 생성한다.- 평균 온도와 총 강수량을
st.metric
으로 표시하여 데이터를 요약한다.
이와 같이 외부 API 또한 기존 python과 동일하게 사용가능하며, 대시보드의 형태로 시각화 할 수 있어 활용도가 매우 높다. 이를 확장하면 다양한 API와의 통합으로 더욱 풍부한 애플리케이션을 제작할 수 있을 것이다.