0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Hướng dẫn chi tiết về công cụ trực quan hóa dữ liệu: Streamlit, Dash và Bokeh

Đăng vào 7 tháng trước

• 8 phút đọc

Công cụ Trực quan hóa Dữ liệu Hiện đại: Hướng Dẫn Toàn Diện về Streamlit, Dash và Bokeh

Giới thiệu

Trong kỷ nguyên dữ liệu hiện nay, khả năng tạo ra những hình ảnh trực quan hấp dẫn và tương tác là vô cùng quan trọng đối với các nhà khoa học dữ liệu, nhà phân tích và lập trình viên. Trong khi các thư viện vẽ đồ thị truyền thống như Matplotlib và Seaborn rất tốt cho việc hình ảnh tĩnh, các ứng dụng hiện đại yêu cầu khả năng tạo bảng điều khiển tương tác và báo cáo theo thời gian thực.

Bài viết này sẽ khám phá ba framework Python mạnh mẽ xuất sắc trong việc tạo ra các ứng dụng trực quan hóa dữ liệu trên web: Streamlit, Dash và Bokeh. Mỗi công cụ đều có những điểm mạnh và trường hợp sử dụng riêng, và chúng tôi sẽ xây dựng các ví dụ thực tiễn để minh họa khả năng của chúng.

Streamlit: Sự kết hợp giữa Đơn giản và Mạnh mẽ

Streamlit đã trở nên rất phổ biến nhờ cách tiếp cận cực kỳ đơn giản trong việc xây dựng ứng dụng dữ liệu. Chỉ với một vài dòng mã Python, bạn có thể tạo ra các ứng dụng web tương tác mà không cần bất kỳ kiến thức phát triển web nào.

Tính năng chính:

  • Không cần HTML, CSS, hoặc JavaScript
  • Tính năng phản ứng và caching tự động
  • Các widget và thành phần tích hợp sẵn
  • Tùy chọn triển khai dễ dàng
  • Cộng đồng và hệ sinh thái mạnh mẽ

Ví dụ Streamlit: Bảng điều khiển Doanh số

Dưới đây là mã để xây dựng một bảng điều khiển doanh số tổng hợp:

python Copy
import streamlit as st
import pandas as pd
import numpy as np
import plotly.express as px
from datetime import datetime

# Thiết lập cấu hình trang
st.set_page_config(
    page_title="Bảng phân tích Doanh số",
    page_icon="📊",
    layout="wide",
)

# Tạo dữ liệu mẫu
@st.cache_data
def load_data():
    np.random.seed(42)
    dates = pd.date_range(start='2023-01-01', end='2024-12-31', freq='D')
    data = []
    for date in dates:
        for region in ['Bắc Mỹ', 'Châu Âu', 'Châu Á', 'Nam Mỹ']:
            for product in ['Sản phẩm A', 'Sản phẩm B', 'Sản phẩm C', 'Sản phẩm D']:
                sales = np.random.normal(1000, 200)
                profit_margin = np.random.uniform(0.1, 0.3)
                data.append({
                    'date': date,
                    'region': region,
                    'product': product,
                    'sales': max(0, sales),
                    'profit': max(0, sales * profit_margin),
                    'units_sold': max(1, int(sales / np.random.uniform(50, 150)))
                })
    return pd.DataFrame(data)

# Tải dữ liệu
df = load_data()

# Bộ lọc bên
st.sidebar.header("Bộ lọc Bảng điều khiển")

# Bộ lọc khoảng thời gian
date_range = st.sidebar.date_input(
    "Chọn khoảng thời gian",
    value=[df['date'].min().date(), df['date'].max().date()],
)

# Bộ lọc vùng miền
regions = st.sidebar.multiselect(
    "Chọn vùng miền",
    options=df['region'].unique(),
    default=df['region'].unique()
)

# Bộ lọc sản phẩm
products = st.sidebar.multiselect(
    "Chọn sản phẩm",
    options=df['product'].unique(),
    default=df['product'].unique()
)

# Lọc dữ liệu
filtered_df = df[
    (df['date'].dt.date >= date_range[0]) &
    (df['date'].dt.date <= date_range[1]) &
    (df['region'].isin(regions)) &
    (df['product'].isin(products))
]

# Bảng điều khiển chính
st.title("🏢 Bảng phân tích Doanh số")

# Thống kê chính
col1, col2, col3, col4 = st.columns(4)

with col1:
    total_sales = filtered_df['sales'].sum()
    st.metric(
        label="Doanh số tổng",
        value=f"${total_sales:,.0f}",
    )

with col2:
    total_profit = filtered_df['profit'].sum()
    st.metric(
        label="Lợi nhuận tổng",
        value=f"${total_profit:,.0f}",
    )

# Biểu đồ
st.subheader("📈 Xu hướng Doanh số theo Thời gian")

# Dữ liệu tổng hợp theo ngày
    daily_sales = filtered_df.groupby('date')['sales'].sum().reset_index()
    fig_trend = px.line(
        daily_sales,
        x='date',
        y='sales',
        title="Hiệu suất Doanh số Hàng ngày"
    )
    st.plotly_chart(fig_trend, use_container_width=True)

# Kết thúc
st.markdown("---")
st.markdown(
    "<div style='text-align: center'>
        <p>Được xây dựng với ❤️ bằng Streamlit | Dữ liệu được làm mới hàng ngày</p>
    </div>",
    unsafe_allow_html=True
)

Tập tin yêu cầu cho Streamlit:

Copy
streamlit==1.28.0
pandas==2.0.3
numpy==1.24.3
plotly==5.15.0

Dash: Giải pháp Doanh nghiệp

Plotly Dash là lựa chọn hoàn hảo cho việc xây dựng các ứng dụng web phân tích sẵn sàng sản xuất. Nó cung cấp nhiều quyền kiểm soát hơn về bố cục và kiểu dáng so với Streamlit, khiến nó trở nên lý tưởng cho các bảng điều khiển doanh nghiệp.

Tính năng chính:

  • Tùy chỉnh cao với các thành phần HTML/CSS
  • Hệ thống callback tuyệt vời cho tính tương tác
  • Xây dựng trên React.js cho hiệu suất mạnh mẽ
  • Tùy chọn kiểu dáng và chủ đề phong phú
  • Tích hợp mạnh mẽ với các biểu đồ Plotly

Ví dụ Dash: Trình theo dõi Danh mục Đầu tư

python Copy
import dash
from dash import dcc, html, Input, Output
import plotly.express as px
import pandas as pd
import yfinance as yf

# Khởi tạo ứng dụng Dash
app = dash.Dash(__name__)
app.title = "Bảng phân tích Danh mục"

# Dữ liệu danh mục mẫu
PORTFOLIO = {
    'AAPL': {'shares': 100, 'purchase_price': 150},
    'GOOGL': {'shares': 50, 'purchase_price': 2500},
}

# Lấy dữ liệu cổ phiếu thực tế
@app.callback(
    Output('portfolio-content', 'children'),
    Input('refresh-button', 'n_clicks')
)
def update_portfolio(n_clicks):
    # Lấy giá cổ phiếu hiện tại
    symbols = list(PORTFOLIO.keys())
    stock_data = yf.download(symbols, period="1y", group_by='ticker')
    # Tính toán các chỉ số danh mục
    portfolio_value = 0
    portfolio_data = []
    for symbol, details in PORTFOLIO.items():
        current_price = stock_data[symbol]['Close'].iloc[-1]
        shares = details['shares']
        current_value = current_price * shares
        portfolio_value += current_value
        portfolio_data.append({
            'Symbol': symbol,
            'Current Value': f"${current_value:.2f}"
        })
    return portfolio_data

# Bố cục ứng dụng
app.layout = html.Div([
    html.H1("📈 Bảng phân tích Danh mục"),
    html.Button("Làm mới Dữ liệu", id="refresh-button")
])

if __name__ == '__main__':
    app.run_server(debug=True)

Tập tin yêu cầu cho Dash:

Copy
dash==2.14.0
plotly==5.15.0
pandas==2.0.3
yfinance==0.2.18

Bokeh: Trực quan hóa Web Tương tác

Bokeh vượt trội trong việc tạo ra các hình ảnh tương tác, sẵn sàng xuất bản cho trình duyệt web. Nó đặc biệt mạnh mẽ cho các tập dữ liệu lớn và các tương tác phức tạp.

Tính năng chính:

  • Tính năng trực quan hóa hiệu suất cao cho các tập dữ liệu lớn
  • Khả năng tương tác linh hoạt và mạnh mẽ
  • Ứng dụng máy chủ cho dữ liệu theo thời gian thực
  • Đầu ra đẹp, sẵn sàng xuất bản
  • Thư viện widget phong phú

Ví dụ Bokeh: Giám sát Dữ liệu theo Thời gian Thực

python Copy
from bokeh.plotting import figure, curdoc
from bokeh.models import ColumnDataSource, Select, Button, Div
import numpy as np
import pandas as pd

# Tạo dữ liệu mẫu
# ...
# Khởi tạo dữ liệu
# ...

# Bố cục chính
curdoc().add_root(dashboard_layout)

Tập tin yêu cầu cho Bokeh:

Copy
bokeh==3.2.0
pandas==2.0.3

Hướng dẫn Triển khai

Triển khai Streamlit (Streamlit Cloud)

  1. Đẩy mã của bạn lên GitHub.
  2. Truy cập share.streamlit.io.
  3. Kết nối repo GitHub của bạn.
  4. Triển khai chỉ với một cú nhấp chuột!

Triển khai Dash (Heroku)

bash Copy
# Tạo Procfile
echo "web: gunicorn app:server" > Procfile
# Thêm vào requirements.txt
echo "gunicorn==20.1.0" >> requirements.txt
# Triển khai lên Heroku
heroku create your-dash-app
git push heroku main

Triển khai Bokeh (Bokeh Server)

bash Copy
# Chạy cục bộ
bokeh serve dashboard.py --show
# Triển khai lên máy chủ đám mây
bokeh serve dashboard.py --host 0.0.0.0 --port 5006 --allow-websocket-origin=*

Thực hành Tốt nhất

Đối với Tất cả Các Công Cụ:

  1. Tối ưu hóa Tải Dữ liệu: Sử dụng cơ chế caching.
  2. Thiết kế Phản hồi: Đảm bảo tương thích với di động.
  3. Xử lý Lỗi: Thực hiện các chế độ thất bại nhẹ nhàng.
  4. Trải nghiệm Người Dùng: Cung cấp chỉ báo tải và phản hồi.
  5. Bảo mật: Xác thực đầu vào và làm sạch dữ liệu.

Kết luận

Cảnh quan các công cụ trực quan hóa dữ liệu trong Python cung cấp điều gì đó cho mọi trường hợp sử dụng. Streamlit nổi bật với việc prototyping nhanh chóng và đơn giản, lý tưởng cho các nhà khoa học dữ liệu muốn chia sẻ công việc của họ. Dash cung cấp độ tin cậy và tùy chỉnh cần thiết cho các ứng dụng sản xuất, trong khi Bokeh mang lại sự linh hoạt vô song cho các hình ảnh tương tác phức tạp.

Câu hỏi thường gặp

1. Streamlit có khó sử dụng không?
Streamlit rất dễ sử dụng, đặc biệt là nếu bạn đã quen thuộc với Python.

2. Dash có thể xử lý lượng người dùng lớn không?
Có, Dash được thiết kế cho các ứng dụng doanh nghiệp có thể mở rộng.

3. Bokeh có thể tạo ra các biểu đồ tương tác không?
Có, Bokeh rất mạnh mẽ cho việc tạo ra các biểu đồ tương tác phức tạp.

4. Tôi có thể sử dụng các công cụ này cho ứng dụng thương mại không?
Có, cả ba công cụ đều có thể được triển khai cho các ứng dụng thương mại.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào