ヒトリ歩き

愚痴とかいろいろ書きます

Streamlitで簡単なフォームを作成にチャレンジ

前回はstreamlitを使ってみたので、今回はstreamlitで簡単なフォーム画面を作成してみる。

kotapontan.hatenablog.com

作成する画面

簡単な映画の評価アンケートを入力する画面を作成する。
性別と映画の視聴頻度は、ラジオボタンを使って、評価はスライダーを使用する。
年齢は数字用のテキストフィールドを使用。
また、送信用のボタンをクリックした際に、データベースにデータを登録する。

データベースは、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の知識不足でやり切れなかった。
ちょっとお勉強して、グラフにもチャレンジしてみる。