primenumbersam's picture
initial commit
f46608b
# -*- coding: utf-8 -*-
"""streamlit_altair.ipynb
Automatically generated by Colab.
Original file is located at
https://colab.research.google.com/drive/1KiJCGzPr79u2mN7nXBz-smug7tEclhJE
"""
#!pip install -q streamlit
# streamlit and other required libraries should be written in requirements.txt in Github repo
import streamlit as st
import altair as alt
import numpy as np
import pandas as pd
from vega_datasets import data
from faker import Faker
# 1. Main Page Config
st.set_page_config(
page_title="Streamlit Multi-Page Demo",
page_icon="πŸš€",
layout="wide",
initial_sidebar_state="expanded",
)
# Sidebar Navigation Hint
st.sidebar.success("λŠμ’‹ 데이러 μ‹Έμ΄μ–ΈμŠ€")
# Landing Page Content (Kept as per user request for markdown additions)
st.title("πŸš€ Streamlit Multi-Page Lab")
st.markdown("""
Welcome to your integrated Streamlit workspace! This project combines multiple quickstart templates and interactive demos into a single multi-page application.
### πŸ§ͺ Available Demos:
1. **Home (This page)**: Current Altair and Interactive Dataframe demo.
2. **🌍 [Top Stocks](./us-stock-top-mktcap)**: Ranking of the world's largest companies by market cap with logos.
3. **πŸ“ˆ [US Top Stock Peers](./us-stock-top-compare)**: Comparative analysis of stock market peers using Yahoo Finance.
4. **πŸ—ΊοΈ [GDP Dashboard](./global-gdp-compare)**: Global GDP analysis from World Bank data.
5. **πŸ€– [Gemini File Q&A](./llm-gemini-rag)**: Document answering using Google Gemini (PDF/TXT/MD support).
---
""")
@st.cache_data # Streamlit will only download the data once since the data will be saved in a cache
def get_data():
source = data.stocks()
source = source[source.date.gt("2006-01-01")]
return source
def get_profile_dataset(number_of_items: int = 20, seed: int = 0) -> pd.DataFrame:
new_data = []
fake = Faker()
np.random.seed(seed)
Faker.seed(seed)
for i in range(number_of_items):
profile = fake.profile()
new_data.append(
{
"name": profile["name"],
"daily_activity": np.random.rand(25),
"activity": np.random.randint(2, 90, size=12),
}
)
profile_df = pd.DataFrame(new_data)
return profile_df
#######################################
st.title("Altair")
stock_data = get_data()
# Events in altair
# Note: selection_single is deprecated in Altair 5+, but we use selection_point for compatibility
# while maintaining the original logic functionality.
hover = alt.selection_point(
fields=["date"],
nearest=True,
on="mouseover",
empty=False,
)
lines = (
alt.Chart(stock_data, title="Evolution of stock prices")
.mark_line()
.encode(
x="date",
y="price",
color="symbol",
)
)
points = lines.transform_filter(hover).mark_circle(size=65)
tooltips = (
alt.Chart(stock_data)
.mark_rule()
.encode(
x="yearmonthdate(date)",
y="price",
opacity=alt.condition(hover, alt.value(0.3), alt.value(0)),
tooltip=[
alt.Tooltip("date", title="Date"),
alt.Tooltip("price", title="Price (USD)"),
],
)
.add_params(hover)
)
# Combine the lines, points, and tooltips into a single chart.
data_layer = lines + points + tooltips
# Build the annotation layer
ANNOTATIONS = [
("Sep 01, 2007", 450, "πŸ™‚", "Something's going well for GOOG & AAPL."),
("Nov 01, 2008", 220, "πŸ™‚", "The market is recovering."),
("Dec 01, 2007", 750, "😱", "Something's going wrong for GOOG & AAPL."),
("Dec 01, 2009", 680, "😱", "A hiccup for GOOG."),
]
annotations_df = pd.DataFrame(
ANNOTATIONS, columns=["date", "price", "marker", "description"]
)
annotations_df.date = pd.to_datetime(annotations_df.date)
annotation_layer = (
alt.Chart(annotations_df)
.mark_text(size=20, dx=-10, dy=0, align="left")
.encode(x="date:T", y=alt.Y("price:Q"), text="marker", tooltip="description")
)
# Define the combined chart.
combined_chart = data_layer + annotation_layer
# enable panning and zooming
# combined_chart = (data_layer + annotation_layer).interactive()
# Display the chart in Streamlit.
st.altair_chart(combined_chart, use_container_width=True)
#######################################
st.title("Get dataframe row-selections")
column_configuration = {
"name": st.column_config.TextColumn(
"Name", help="The name of the user", max_chars=100, width="medium"
),
"activity": st.column_config.LineChartColumn(
"Activity (1 year)",
help="The user's activity over the last 1 year",
width="large",
y_min=0,
y_max=100,
),
"daily_activity": st.column_config.BarChartColumn(
"Activity (daily)",
help="The user's activity in the last 25 days",
width="medium",
y_min=0,
y_max=1,
),
}
select, compare = st.tabs(["Select members", "Compare selected"])
with select:
st.header("All members")
df = get_profile_dataset()
event = st.dataframe(
df,
column_config=column_configuration,
use_container_width=True,
hide_index=True,
on_select="rerun",
selection_mode="multi-row",
)
st.header("Selected members")
people = event.selection.rows
filtered_df = df.iloc[people]
st.dataframe(
filtered_df,
column_config=column_configuration,
use_container_width=True,
)
with compare:
activity_df = {}
for person in people:
activity_df[df.iloc[person]["name"]] = df.iloc[person]["activity"]
activity_df = pd.DataFrame(activity_df)
daily_activity_df = {}
for person in people:
daily_activity_df[df.iloc[person]["name"]] = df.iloc[person]["daily_activity"]
daily_activity_df = pd.DataFrame(daily_activity_df)
if len(people) > 0:
st.header("Daily activity comparison")
st.bar_chart(daily_activity_df)
st.header("Yearly activity comparison")
st.line_chart(activity_df)
else:
st.markdown("No members selected.")