素早くインタラクティブにデータを描画できる Streamlit in Snowflake

    この投稿をXにポストするこの投稿をFacebookにシェアするこのエントリーをはてなブックマークに追加

はじめに

Roundaでインターンをしている村田と申します。
今回は自身も興味がある分野の中でも、Streamlit かつ Snowflakeにピックアップして記事を記載します。

Streamlitは、動的な描画をブラウザ上に簡単に作成できるツールです。特に、他の描画ツールよりも作法が簡単になっていて、数行のコードでデータを可視化し、動的な描画を作成できるなど、扱いやすくなっています。本記事ではStreamlitの機能を、世界の太陽光発電所の位置と発電容量を可視化する事例とあわせて紹介します。
また、描画の公開に際しては、作ったアプリケーションのデプロイが簡単にできるSnowflakeというデータウェアハウスサービスを用いています。

データの準備

まず、Snowflake上へのデータのアップロードからやっていきます。データを格納するためのデータベースであるテーブルにデータをロードします。
ちなみに元のデータは下記のリンクから参照しています。

Global Power Plant Database

  • https://datasets.wri.org/dataset/globalpowerplantdatabase
  • グローバルな発電所のデータで、167 か国の約 35,000 の発電所をカバーしており、火力発電所 (石炭、ガス、石油、原子力、バイオマス、廃棄物、地熱など) と再生可能エネルギー (水力、風力、太陽光など) が含まれています


このデータをsnowflakeのワークシート上で読み込むことで、当該データをもとにしたアプリケーションの公開が簡単にできるというイメージです。

データのロードができたら、以下のコードをワークシート上で実行していきます。


#データの準備
import streamlit as st
import pandas as pd
from snowflake.snowpark.context import get_active_session

# セッションを作成
session = get_active_session()

# SQLクエリを定義
sql = f"SELECT * FROM STREAMLIT_APPS.PUBLIC.STREAMLIT_TABLE_20240729 LIMIT 30000;"

# データを取得
data = session.sql(sql).collect()

# データフレームに変換
data = pd.DataFrame(data)

# 緯度と経度を数値型に変換し、無効なデータを除外
data['LATITUDE'] = pd.to_numeric(data['LATITUDE'], errors='coerce')
data['LONGITUDE'] = pd.to_numeric(data['LONGITUDE'], errors='coerce')
data = data.dropna(subset=['LATITUDE', 'LONGITUDE'])

# 太陽光発電所のみをフィルタリング
solar_data = data[data['PRIMARY_FUEL'] == 'Solar']

# CAPACITY_MW 列のデータを数値型に変換
solar_data['CAPACITY_MW'] = pd.to_numeric(solar_data['CAPACITY_MW'], errors='coerce')


地図上に可視化してみる

ここまでできたら、可視化のためのアプリケーションの設定をしていきましょう。今回は、streamlitの機能のうち、

  • 地図を用いた可視化
  • サイドバーによるフィルタリング
  • フィルタリング結果を踏まえた分布の可視化
  • フィルタリング結果を用いた要約統計量の算出

を実装していきます。


# サイドバーにフィルタリングオプションを追加
st.sidebar.title('Filters')
min_capacity = int(solar_data['CAPACITY_MW'].min())
max_capacity = int(solar_data['CAPACITY_MW'].max())
selected_capacity = st.sidebar.slider('Capacity (MW)', min_capacity, max_capacity, (min_capacity, max_capacity))

# フィルタリング
filtered_data = solar_data[(solar_data['CAPACITY_MW'] >= selected_capacity[0]) & 
                           (solar_data['CAPACITY_MW'] <= selected_capacity[1])]

# 地図表示
st.title('発電可能量 {} から {} MWの太陽光発電所'.format(selected_capacity[0], selected_capacity[1]))
st.map(filtered_data[['LATITUDE', 'LONGITUDE']])

# 発電容量の分布を表示
st.subheader('発電量ごとの分布')

# 発電容量の分布を集計
capacity_counts = filtered_data['CAPACITY_MW'].value_counts().sort_index()
capacity_counts.index = capacity_counts.index.astype(str)  # インデックスを文字列型に変換

# 棒グラフを表示
st.bar_chart(capacity_counts)

# 選択した範囲のデータの統計情報
st.subheader('選択した範囲のデータの統計情報')
st.write(filtered_data.describe())

# 接続を閉じる
session.close()

それぞれのオプションを追加するのに必要なコードは数行で済んでいますね。かなり簡易なコードで実装できることがお分かりいただけると思います。作成したアプリは以下のようなイメージです。


Videotogif.gif


公式の情報

snowflake公式文書を参照すると、下記の通り優れた点がわかります。

snowflake cortex

snowflake cortexは、Mistral、Reka、Meta、Googleの大規模言語モデル(LLM)をホストし、設定不要でSQLやPythonからアクセス可能なプラットフォームのことです。主な機能として、プロンプトに基づく応答生成、テキストの埋め込み、非構造化データからの回答抽出、感情分析、要約、翻訳などがあります。CORTEX_USERロールを使用してアクセスでき、snowflake cortexを使用することで、streamlitのUIでLLMを使用してデータに対する知見を得ることができます。これを利用して、複雑なデータ解析や予測モデルの構築に際して、その前処理などに必要な知見が簡単に得られます。
今回のデータでいえば、例えばデータセットを基にして、次年度の太陽光発電量を予測するなどの分析をするイメージです。
https://docs.snowflake.com/en/user-guide/snowflake-cortex/llm-functions

データアクセスについて

Streamlit in Snowflakeは、アプリケーションから直接Snowflakeデータにアクセスできる環境を提供できるので、データを外部に移動する必要がなく、安全かつ効率的にデータを扱うことができます​。
https://docs.snowflake.com/en/developer-guide/streamlit/example-access-snowflake

パッケージの充実

streamlit in snowflakeは、python、streamlit、snowflake-snowpark-pythonパッケージが事前にインストールされた環境を提供し、追加のパッケージも簡単にインストールできます。environment.ymlファイルを使って、必要なパッケージを指定するだけで、アプリケーション環境をカスタマイズすることもできます​。
https://docs.snowflake.com/en/developer-guide/streamlit/create-streamlit-sql

Time Travel機能

snowflakeのTime Travel機能は、過去のデータにアクセスできる機能です。これにより、データの変更履歴を追跡したり、誤って削除されたデータを復元したりすることができます。
https://docs.snowflake.com/ja/user-guide/data-time-travel

クローン機能

クローン機能を使用すると、テーブル、スキーマ、データベースのスナップショットを即座に作成できます。これにより、実際のデータを変更せずに、安全なテストなどが可能になります。
また、このクローン機能は、変更差分でしかお金がかからないものになっています。クローン用のテーブルは作成されますが、元のテーブルが100行あっても変更が1行なら1行分しか課金が発生しないことになります。

https://docs.snowflake.com/ja/user-guide/object-clone#cloning-and-managed-access-schemas


その他 snowflake の便利な点とまとめ

簡単なインターフェース

上記のように、streamlitはシンプルなコードで動的な描画ができるツールです。
複雑な知識がなくても、データの視覚化や操作を行うことができました。

リアルタイムの更新

streamlitにはデータやパラメータの変更に応じてリアルタイムでアプリケーションを更新する機能もあります。

豊富な機能

Streamlitを使うことで、スライダー、テキスト入力、ボタンなど、様々な動的な機能をつけることができます。

ビジュアライゼーション

今回は実装しませんでしたが、StreamlitはMatplotlib、Altair、Plotly、Foliumなどのビジュアライゼーションライブラリと統合でき、豊富なグラフや地図を簡単に作成できます。今回の例では、Foliumを使用して地図を描画しました。


おわりに

Streamlitを使うことで、データの視覚化における動的な描画を行うのが非常に簡単になります。コードの簡易性により扱いやすくなっているうえ、可読性も向上するのでおすすめです。


宣伝

Snowflakeを用いたデータ基盤運用を検討していきたい方はもちろんのこと
関連サービスの利用を検討している方や、LLMの利用検討を始めたが進め方に懸念がある方に対して
弊社では支援やサポートを行っております。ぜひHPより気軽にご相談ください。

また、採用と雑談もよければお待ちしています!


    この投稿をXにポストするこの投稿をFacebookにシェアするこのエントリーをはてなブックマークに追加