前回はstreamlitを使ってみたので、今回はstreamlitで簡単なフォーム画面を作成してみる。
作成する画面
簡単な映画の評価アンケートを入力する画面を作成する。
性別と映画の視聴頻度は、ラジオボタンを使って、評価はスライダーを使用する。
年齢は数字用のテキストフィールドを使用。
また、送信用のボタンをクリックした際に、データベースにデータを登録する。
データベースは、timescaledbを使用することにする。 timescaledbにテーブルと1件のデータを登録しておく。
CREATE TABLE movie_questionnaire ( time timestamp NOT NULL, gender TEXT NOT NULL, age int NOT NULL, frequency_show TEXT NOT NULL, good_movie int NOT NULL ); SELECT create_hypertable('movie_questionnaire', 'time'); INSERT INTO movie_questionnaire VALUES ('2024-02-27 06:47:00', 'Male', 25, '見ない', 5);
streamlitで画面を作成。
import streamlit as st from sqlalchemy import create_engine from sqlalchemy.types import Integer, String, DateTime from sqlalchemy.orm import DeclarativeBase from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.orm import sessionmaker import datetime class Base(DeclarativeBase): pass class Moviequestionnaire(Base): __tablename__ = "movie_questionnaire" time: Mapped[datetime.datetime] = mapped_column(DateTime, primary_key=True, nullable=False) gender: Mapped[str] = mapped_column(String, nullable=False) age: Mapped[int] = mapped_column(Integer, nullable=False) frequency_show: Mapped[str] = mapped_column(String, nullable=False) good_movie: Mapped[int] = mapped_column(Integer, nullable=False) # DBエンジンを作成 url = "postgresql://postgres:example@localhost:5432/postgres" engine = create_engine(url, echo=True) # セッションの作成 SessionClass = sessionmaker(engine) session = SessionClass() with st.form("my_form"): st.title("Let's try!!!") gender = st.radio("Gender", ["Male", "Female"]) age = st.number_input("Age", min_value=20, max_value=60, format="%d") frequency_show = st.radio('映画はよく見ますか?', ["月5回以上", "月1回", "半年に1回", "見ない"]) good_movie = st.slider("今回の映画の評価を教えてください(0-5)", 0, 5, 0) submitted = st.form_submit_button("送信") if submitted: movie_questionnaire = Moviequestionnaire(time=datetime.datetime.now(), gender=gender, age=age, frequency_show=frequency_show, good_movie=good_movie) session.add(movie_questionnaire) session.commit()
streamlitコマンドで画面を起動すると、画面が表示される。
streamlit run main.py
登録前のデータを確認
select * from movie_questionnaire; time | gender | age | frequency_show | good_movie ----------------------------+--------+-----+----------------+------------ 2024-02-27 06:47:00 | Male | 25 | 見ない | 5 2024-02-28 06:34:58.851004 | Male | 20 | 月5回以上 | 1 2024-02-28 06:53:32.887118 | Female | 40 | 月1回 | 4 (3 rows)
登録するデータを画面で設定して、送信ボタンをクリックする。
データベースを検索して、設定したデータが登録されていることを確認。
select * from movie_questionnaire; time | gender | age | frequency_show | good_movie ----------------------------+--------+-----+----------------+------------ 2024-02-27 06:47:00 | Male | 25 | 見ない | 5 2024-02-28 06:34:58.851004 | Male | 20 | 月5回以上 | 1 2024-02-28 06:53:32.887118 | Female | 40 | 月1回 | 4 2024-02-29 21:53:45.414323 | Male | 32 | 月1回 | 3 (4 rows)
まとめ
streamlitを使ったフォーム画面を作成してみた。
本当に数行でフォーム画面が簡単に作れて、データベースにもデータを登録することができた。
本当はグラフまでやってみたかったが、timescaledbの知識不足とPandasの知識不足でやり切れなかった。
ちょっとお勉強して、グラフにもチャレンジしてみる。