JSON에서 대시 보드까지 : Streamlit에서 DuckDB 쿼리 시각화


편집자에 의한 이미지 | chatgpt
틀 소개
데이터는 회사의 가장 중요한 자원이며 데이터의 통찰력은 이익과 실패의 차이를 만들 수 있습니다. 그러나 원시 데이터는 이해하기 어렵 기 때문에 대시 보드로 시각화하여 비 기술적 인 사람들이 더 잘 탐색 할 수 있습니다.
특히 JSON 데이터로 작업 할 때 대시 보드를 구축하는 것은 간단하지 않습니다. 운 좋게도 많은 파이썬 라이브러리를 결합하여 유용한 도구를 만들 수 있습니다.
이 기사에서는 간소화를 사용하여 대시 보드를 개발하는 방법을 배우고 JSON 파일의 데이터에서 DuckDB 쿼리를 시각화하기 위해 플롯 링합니다.
궁금한? 들어가자.
틀 대시 보드 개발
대시 보드를 개발하기 전에 사용할 도구에 대해 조금 배우겠습니다.
먼저 JSON 또는 JavaScript 객체 표기법은 키 값 쌍 및 배열을 사용하여 데이터를 저장하고 전송하기위한 텍스트 기반 형식입니다. 시스템 간 API 및 데이터 교환에 일반적으로 사용되는 형식입니다.
다음, DuckDB 분석 워크로드 용으로 설계된 오픈 소스 RDBMS (관계형 데이터베이스 관리 시스템)입니다. 별도의 서버를 관리 할 필요없이 Python 프로세스에서 직접 실행되는 Process In Online Analytical Processing (OLAP) SQL 데이터베이스입니다. 또한 빠른 실행에 최적화되어 있으며 대규모 데이터 세트를 사용한 데이터 분석에 이상적입니다.
간소 종종 대시 보드 개발에 사용됩니다. Python을 사용하여 대화식 데이터 웹 응용 프로그램을 개발하기위한 오픈 소스 프레임 워크입니다. 대시 보드를 개발하기 위해 HTML, CSS 또는 JavaScript를 이해할 필요가 없습니다.
우리는 또한 사용할 것입니다 팬더파이썬의 데이터 조작 및 분석을위한 강력한 라이브러리.
마지막으로, 줄거리 대화식 그래프 및 차트를 개발하기위한 오픈 소스 라이브러리입니다. Streamlit과 같은 대시 보드 개발 라이브러리와 통합 될 수 있습니다.
이것이 우리가 사용할 도구에 대한 기본 설명입니다. JSON 대시 보드 개발을 시작합시다. 우리는 다음 구조를 사용하므로 다음과 같이 작성하십시오.
JSON_Dashboard/
├── data/
│ └── sample.json
├── app.py
└── requirements.txt
다음으로 필요한 모든 정보로 파일을 작성해 봅시다. 먼저, JSON 예제 데이터를 아래의 데이터와 같은 데이터로 보자. 항상 자신의 데이터를 사용할 수 있지만 여기에 사용할 수있는 예입니다.
[
{"id": 1, "category": "Electronics", "region": "North", "sales": 100, "profit": 23.5, "date": "2024-01-15"},
{"id": 2, "category": "Furniture", "region": "South", "sales": 150, "profit": 45.0, "date": "2024-01-18"},
{"id": 3, "category": "Electronics", "region": "East", "sales": 70, "profit": 12.3, "date": "2024-01-20"},
{"id": 4, "category": "Clothing", "region": "West", "sales": 220, "profit": 67.8, "date": "2024-01-25"},
{"id": 5, "category": "Furniture", "region": "North", "sales": 130, "profit": 38.0, "date": "2024-02-01"},
{"id": 6, "category": "Clothing", "region": "South", "sales": 180, "profit": 55.2, "date": "2024-02-05"},
{"id": 7, "category": "Electronics", "region": "West", "sales": 90, "profit": 19.8, "date": "2024-02-10"},
{"id": 8, "category": "Furniture", "region": "East", "sales": 160, "profit": 47.1, "date": "2024-02-12"},
{"id": 9, "category": "Clothing", "region": "North", "sales": 200, "profit": 62.5, "date": "2024-02-15"},
{"id": 10, "category": "Electronics", "region": "South", "sales": 110, "profit": 30.0, "date": "2024-02-20"}
]
다음으로, 우리는 requirements.txt
대시 보드 개발에 사용할 라이브러리와 파일.
streamlit
duckdb
pandas
plotly
그런 다음 다음 코드를 실행하여 필요한 라이브러리를 설치하십시오. 환경을 설정할 때 가상 환경을 사용하는 것이 좋습니다.
pip install -r requirements.txt
모든 것이 준비되면 대시 보드를 개발할 것입니다. 논리를 따라갈 수 있도록 응용 프로그램 코드를 단계별로 탐색 할 것입니다.
대시 보드에 필요한 라이브러리를 가져 오는 것으로 시작하겠습니다.
import streamlit as st
import duckdb
import pandas as pd
import plotly.express as px
다음으로 DuckDB에 필요한 연결을 설정합니다.
@st.cache_resource
def get_conn():
return duckdb.connect()
위의 코드는 DuckDB 연결을 캐시하여 Dashboard가 다시 실행되면 간소화 대시 보드를 다시 연결하지 않아도됩니다.
그런 다음 다음 코드를 사용하여 JSON 데이터를 읽도록 코드를 준비합니다.
@st.cache_data
def load_data(path):
df = pd.read_json(path, convert_dates=["date"])
return df
위의 코드에서는 JSON 파일을 팬더로 변환합니다. DataFrame
데이터를 캐시하여 필터가 변경 될 때 다시 읽을 필요가 없습니다.
데이터로드 및 연결이 준비된 후 DUCKDB에 연결하여 JSON 데이터를 저장합니다. 언제든지 데이터 위치와 테이블 이름을 변경할 수 있습니다.
conn = get_conn()
df_full = load_data("data/sample.json")
conn.execute("CREATE OR REPLACE TABLE sales AS SELECT * FROM df_full")
위의 코드에서 우리는 등록합니다 DataFrame
SQL 테이블로 명명되었습니다 sales
DuckDB 내부. 별도의 스크립트에서 지속성을 설정하지 않기 때문에 테이블은 매번 재실행마다 메모리에서 새로 고침됩니다.
그게 백엔드를위한 것입니다. 유선형 대시 보드를 준비합시다. 먼저 대시 보드 제목과 사이드 바 필터를 준비합시다.
st.title("From JSON to Dashboard: DuckDB SQL Visualizer")
st.sidebar.header("Filter Options")
category = st.sidebar.multiselect("Select Category:", df_full['category'].unique())
region = st.sidebar.multiselect("Select Region:", df_full['region'].unique())
date_range = st.sidebar.date_input("Select Date Range:", [df_full['date'].min(), df_full['date'].max()])
위의 사이드 바는로드 된 데이터의 동적 필터가되며,이 필터를 기반으로 SQL 쿼리를 변경할 수 있습니다.
그런 다음 다음 코드로 필터에 따라 SQL 쿼리를 빌드합니다.
query = "SELECT * FROM sales WHERE TRUE"
if category:
query += f" AND category IN {tuple(category)}"
if region:
query += f" AND region IN {tuple(region)}"
query += f" AND date BETWEEN '{date_range[0]}' AND '{date_range[1]}'"
위의 쿼리는 사용자의 선택에 따라 동적으로 구축됩니다. 우리는 a로 시작합니다 WHERE TRUE
추가 필터를 추가하는 조건 AND
.
쿼리 생성이 준비되면 다음 코드와 함께 쿼리 및 결과 데이터를 표시합니다.
st.subheader("Generated SQL Query")
st.code(query, language="sql")
df = conn.execute(query).df()
st.subheader(f"Query Results: {len(df)} rows")
st.dataframe(df)
위의 코드는 DuckDB에서 데이터를 검색하는 데 사용되는 SQL 쿼리를 보여주고 결과를 팬더로 변환합니다. DataFrame
필터링 된 테이블을 표시합니다.
마지막으로 필터링 된 데이터를 사용하여 플롯 시각화를 준비합니다.
if not df.empty:
col1, col2 = st.columns(2)
with col1:
st.markdown("### Scatter Plot: Sales vs Profit by Region")
scatter_fig = px.scatter(df, x="sales", y="profit", color="region", hover_data=["category", "date"])
st.plotly_chart(scatter_fig, use_container_width=True)
with col2:
st.markdown("### Bar Chart: Total Sales by Category")
bar_fig = px.bar(df.groupby("category", as_index=False)["sales"].sum(), x="category", y="sales", text_auto=True)
st.plotly_chart(bar_fig, use_container_width=True)
st.markdown("### Line Chart: Daily Sales Trend")
line_fig = px.line(df.groupby("date", as_index=False)["sales"].sum(), x="date", y="sales")
st.plotly_chart(line_fig, use_container_width=True)
else:
st.warning("No data found for the selected filters.")
위의 코드에서 산점도, 막대 차트 및 라인 차트의 세 가지 다른 플롯을 만듭니다. 필요에 따라 항상 차트 유형을 전환 할 수 있습니다.
모든 코드를 준비하면 다음 명령을 실행하여 Streamlit Dashboard를 시작합니다.
이제 아래 이미지처럼 보이는 대시 보드에 액세스 할 수 있습니다.
플롯은 아래 이미지처럼 보입니다.
시각화는 플롯을 사용하므로 아래 줄 차트에 표시된 것처럼 대화식으로 탐색 할 수 있습니다.
그게 당신이 알아야 할 전부입니다. 대시 보드에 항상 복잡성을 추가하고 비즈니스에 배포 할 수도 있습니다.
틀 결론
데이터는 회사가 가질 수있는 가장 귀중한 리소스이며 대시 보드에서 시각화하는 것은 비즈니스 사람들이 통찰력을 얻는 방법입니다. 이 기사에서는 DuckDB에 저장된 JSON 파일의 데이터에 연결하면서 간단한 대시 보드를 개발하는 방법을 배웠습니다.
이것이 도움이 되었기를 바랍니다!
Cornellius Yudha Wijaya 데이터 과학 보조 관리자 및 데이터 작성자입니다. 그는 Allianz Indonesia에서 풀 타임으로 일하는 동안 소셜 미디어 및 작문 미디어를 통해 Python과 데이터 팁을 공유하는 것을 좋아합니다. Cornellius는 다양한 AI 및 기계 학습 주제에 대해 글을 씁니다.
Post Comment