🏖️

Snowflake上でStreamlitアプリを動かしてみた

2023/09/24に公開

はじめに

みなさん、こんにちは。細々とデータエンジニアをやっていますUzuraです。
ついにStreamlitアプリをSnowflake上でデプロイできるようになりましたね。

しかしながら、現在Snowflakeが公式に提供している Quickstart(https://quickstarts.snowflake.com/guide/getting_started_with_snowpark_for_python_streamlit/index.html )はEnvironment Data Atlas(AWS US WestにホストしているSnowflakeアカウントでのみ使用可能) を使ったチュートリアルとなっており、多くの日本ユーザーが使っているであろうAsia Pacific(Tokyo)からはチュートリアルができないかなと思います。

今回はAsia Pacific(Tokyo)からも利用可能なデータを使って、簡単なStreamlitアプリを使うところまでやって見ました。
※ちなみに筆者はStreamlit初心者なので、間違っている、変なライブラリの使い方をしている等の場合は教えていただけるととても嬉しいです!!

1.利用するデータ

今回はSnowflake Marketplaceで公開されているジオテクノロジーズ株式会社 / GeoTechnologies, Inc.さんのメッシュ滞在人口サンプルを使います。ジオテクノロジーズ株式会社さんに感謝!
インストールしておきましょう。
※データ選定理由は何となく面白そうだったからです。

2. データ加工

今回は「2022年10月豊洲エリアにおいて年代ごとの人口が時間帯でどう変化するか」という分析シナリオで可視化をしてみようと思います。
上記分析シナリオに合うように、以下のようにViewを作成します。
※Snowsightのワークシートで実行する場合は、Viewを作成するDB、Schemaを指定してください。本投稿ではDEV_DBというDBのDEV_SAMPLE_LAKEというスキーマを使用します。

USE DEV_DB.DEV_SAMPLE_LAKE;
CREATE OR REPLACE VIEW TOYOSU_MESH_POPULATION_V
AS
SELECT CAST(TIME AS STRING) AS TIME_HOUR
       ,AGE_RANGE
       ,CAST(AVG(POPULATION) AS INTEGER) AS AVG_POPULATION
FROM __DYNAMIC_POPULATION_SAMPLES.SAMPLES.DYNAMIC_POPULATION_TOYOSU
WHERE YEAR_MONTH = '202210'
GROUP BY TIME_HOUR, AGE_RANGE
ORDER BY TIME_HOUR, AGE_RANGE;

3. Streamlitコードの記述

続いてSnowsightの左メニューから Streamlit > +Streamlitアプリのようにクリックします。するとサンプルアプリとコードエディタが表示されます。コードエディタの内容を下記コードに置換します。

from snowflake.snowpark.context import get_active_session
from snowflake.snowpark.functions import sum, col
import altair as alt
import streamlit as st

# Set page config
st.set_page_config(layout="wide")

# Get current session
session = get_active_session()

@st.cache_data()
def load_data():
    # Load population mesh data
    snow_df_toyosu = session.table("DEV_DB.DEV_SAMPLE_LAKE.TOYOSU_MESH_POPULATION_V")
    return snow_df_toyosu.to_pandas()

# Load and cache data
df_toyosu = load_data()

def get_population(df):
    st.subheader('Population by Age Over Time')
    age_range = ['age_10','age_20','age_30','age_40','age_over_50']
    selected_age_range = st.multiselect('',age_range, default = ['age_10','age_20','age_30','age_40','age_over_50'])
    st.markdown("___")

    # Display an interactive chart to visualize population over time by the selected countries
    with st.container():
        age_range_list = age_range if len(selected_age_range) == 0 else selected_age_range
        df_filtered = df[df['AGE_RANGE'].isin(age_range_list)]
        line_chart = alt.Chart(df_filtered).mark_line(
            color="lightblue",
            line=True,
            point=alt.OverlayMarkDef(color="red")
        ).encode(
            x='TIME_HOUR',
            y='AVG_POPULATION',
            color='AGE_RANGE',
            tooltip=['AGE_RANGE','TIME_HOUR','AVG_POPULATION']
        )
        st.altair_chart(line_chart, use_container_width=True)

st.header("メッシュ滞在人口サンプル(豊洲)")
get_population(df_toyosu)

4.アプリの実行

コード置換が完了したら、右上にある「実行」をクリックします。人口推移のグラフが表示されます。もし画面がうまく更新されない場合はブラウザを再ロードしてみてください。

最後に

本投稿では、Snowflake上での簡単なStreamlitアプリの作成について紹介しました。
現状、Power BIやTableauなどのデータ可視化ツールが既に導入されている組織は多いと思いますが、Streamlit on Snowflakeは自分でコードを記載することでより柔軟なデータアプリが作れると感じました。

まだ発展途上の機能だとは思いますが、今後のアップデートに注目したいと思います!
Snowflakeさん、楽しみにしています!

Discussion