見出し画像

Frosty Friday Week8 Streamlit

Basicもついに4回目。
今日はWeek8を解きます。
ついに!Streamlit!!!
Streamlitは1年ほど前に30days of Streamlitでチャレンジしたものの実務で使わずですっかり忘れてしまいました(アカンやつ)。
Pythonとも仲良くなりたいので、楽しんで取り組みたいと思います。

それでははじめますよー!

Frosty Fridayとは

Snowflakeユーザの
 Snowflakeユーザによる
  Snowflakeのための
Snowflakeのスキルアップウィークリーチャレンジ です。

SnowVillage

Frosty Friday Live Challenge Vol 3

解説のYoutubeはこちらにあります。

番外編:はじめてのStreamlit in Snowflake

使いたかったので、Streamlit in Snowflakeで解いてみたい!
が、スタートガイドがわからないので先に頼りになるBucciさんのこのブログを読んでまず一通りやってみよう。

そういえば、ブログの時代(2023年9月)はAnacondaを有効にしないと始まらなかったけど、今はStreamlitアプリを新規作成したら自動的に出てきますね。

新規作成を押しただけでサンプルコードと画面が表示されました。

一度このサンプルコードを全部消してから、30days of Streamlitの21日目のコードをコピー&ペーストしてみたいと思います。

全消し!
import streamlit as st
import time

st.title('st.progress')

with st.expander('About this app'):
     st.write('You can now display the progress of your calculations in a Streamlit app with the `st.progress` command.')

my_bar = st.progress(0)

for percent_complete in range(100):
     time.sleep(0.05)
     my_bar.progress(percent_complete + 1)

st.balloons()

貼り付けて実行ボタンを押してみる

風船が飛んできた!できたみたいです。

Week8の問題

さて、ある会社には、ここで見つけることができるシンプルでわかりやすい支払いファクト テーブルがあります。彼らは、FrostyData にデータを取り込んで以下の折れ線グラフを作成する手助けをしてほしいと考えています。

  1. スクリプトはパスワードを公開してはなりません。これは非常に危険であるため、代わりに Streamlit シークレットを使用する必要があります。

  2. タイトルは「2021 年の支払い」にする必要があります。

  3. ユーザーが選択できる最も早い日付を指定する「最小日付」フィルターが必要です。デフォルトでは、これは可能な限り早い日付に設定する必要があります。

  4. ユーザーが選択できる最新の日付を指定する「最大日付」フィルターが必要です。デフォルトでは、これは可能な限り最新の日付に設定する必要があります。

  5. X 軸に日付、Y 軸に金額を示す折れ線グラフが必要です。データは週単位で集計する必要があります。

csvデータの取り込み

csvデータはこちらでダウンロードできますのでローカルPCにダウンロードします。
PublicスキーマのGUI画面で
作成→テーブル→ファイルからを押下します。(2個目ブルしか見えてないですがテーブルって書いています)

まずはローカルファイルにダウンロードしたpayment.csvを指定します。
そのあと、一番下までスクロールしてから
テーブルの名前を付けて次へ

ただ取り込むだけではエラーが起きるようです。
ヘッダーのオプションを変えてみて進めてみます。
ヘッダーなしに帰るとデータのプレビューが表示されました。
どうやらc1列にヘッダが設定されていなかったことが問題だったようです。

c1列にはidという列名を設定し、それ以外の列名はもともとヘッダーに設定していた列名を設定します。
さぁこれで、最初の行をスキップすれば行けるやろ・・・!と思ってヘッダーのオプションを変えてみたら
列名が初期化された・・・悲しすぎます。

列名がc1~c4に戻っている・・・😿

気を取り直して、列名を設定してロードします.

やったぜ!取り込み完了!

取り込んだデータの確認

自分で考えて週単位に集計した金額を表示するまでのSQLがこちら。

use database FF_WEEK8;

--10件だけ内容を確認する
select * from FF_WEEK8.PUBLIC.WEEK8_PAYMENT limit 10;

--週単位に金額を集計する
select date_trunc('week',payment_date) as payment_weekdate,
    sum(amount_spent) as week_amount_spent
  from FF_WEEK8.PUBLIC.WEEK8_PAYMENT 
  group by payment_weekdate
  order by payment_weekdate;

動いた!なんとなく、集計関数はTableauの計算フィールドと似ていますね。親近感。

sakatokuさんのYoutubeを見ていてびっくり!
なんすか group by 1って?!?!

group by 1?

つまり1列目でGroup byをしてと言っている。なるほど。列番号でGroup byできちゃうんですねぇ。

あれ、to_dateっていう関数がくっついていることにも気づきました。
timestamp関数とdate関数は異なるってことなんですかね?
確かに時間・分・秒が消えて日付だけになりました。

いよいよStreamlit in Snowflake!

sakatokuさんの解説ではvscodeバージョンと、SiSバージョンとLLMバージョンがありましたが私はStreamlit in Snowflake(SiS)で解きたいのでsakatokuさんが書いているコードを写経していきたいと思います。

Snowpark?

Youtubeの解説でSnowparkを使ってコーディングしますという説明があって、Snowparkとはなんぞや?がわからずまたAIさんに聞いてみました。
当初私はSnowparkっていう画面がどこかにあって、そこを起動するとSnowparkが機能するものだと思っていたのですが、間違っていたようです。

Snowparkは、Snowflakeのプラットフォーム上で、より高度なデータ処理や分析を行うための機能です。特定の「画面」というよりは、SQLやプログラミング言語を使ってSnowflakeのデータを操作するための環境として捉えることができます。

Gemini

確かに、SnowflakeはSQLだけでなくPythonもかけるし、どういった仕組みなんだっけ?って疑問に思ったことがあるのですが多言語対応できるようにSnowparkという機能を用意してくれていたのだな、と腑に落ちました。

Sakatokuさんのコードを写経

Streamlit in Snowflakeはどちらかというとpythonをどういった文体で書けるのか(例:セミコロン入れるの?とかコロン入れるの?とか)
が分かりにくそうだったので、Sakatokuさんが書いていたコードを手入力で写経しました。

##ここでSnowparkというライブラリを使うってことか!
##命令は小文字、インデントでエラーになることもある
import streamlit as st
from snowflake.snowpark.context import get_active_session
import pandas as pd

st.title("Payments in 2021")

session = get_active_session()

#cur = connect_to_Snowflake()

def  execute_query(session):
##ここでWeek8のcsvを取り込んだ時に週単位に集計したSQLをコピペする
    query ="""
    select date_trunc('week',to_date(payment_date)) as payment_weekdate,
    sum(amount_spent) as week_amount_spent
    from FF_WEEK8.PUBLIC.WEEK8_PAYMENT 
        group by payment_weekdate
        order by payment_weekdate;
    """
    snowpark_df = session.sql(query)
    df = snowpark_df.to_pandas()
    return df

df = execute_query(session)
#デバッグ用に内容を確認する(うまく動いたらコメントアウト)
#st.write(df)

min_date = df["PAYMENT_WEEKDATE"].min()
max_date = df["PAYMENT_WEEKDATE"].max()

selected_dates = st.slider("Select min and max date", min_date,max_date,(min_date,max_date))
condition_min = df["PAYMENT_WEEKDATE"] >= selected_dates[0]
condition_max = df["PAYMENT_WEEKDATE"] <= selected_dates[1]
df = df[condition_min & condition_max]
#デバッグ用に内容を確認する(うまく動いたらコメントアウト)
#st.dataframe(df)

st.line_chart (df,x="PAYMENT_WEEKDATE",y="WEEK_AMOUNT_SPENT")

完成!

動くと本当にうれしいね!

まとめ

Streamlit in Snowflakeを初めてきちんと動かせたのが感動でした。
1年ほど前に30days of Streamlitを勉強したのですが、すっかり忘れているのでもう1度やり直そうかな・・・と思っています。
もしかしたら、Frosty Fridayを進めるより先に30days of Streamlitをやり直すかもしれません。PC新しくなったのでちょうどいいタイミングだし。

ありがとうございました!!!!