「まいにち記録カレンダーアプリ」を改良した
学んだこと(5/24,5/29)
グラフを追加
-
「
df["列名"].value_counts()」 → 表の中にある特定の文字が、それぞれ「何個ずつあるか」を自動で集計して数え上げてくれるPandasの便利技 -
「
st.bar_chart(集計データ)」 → 数え上げたデータを渡すだけで、スマホやパソコンの画面幅にぴったり合う綺麗な棒グラフを自動で描いてくれるStreamlitの道具
グラフをカラフルに
-
「
import plotly.express as px」 → 標準のグラフよりも、圧倒的にカラフルで、マウスを乗せると数字が浮き出るようなリッチなグラフを作るための強力な道具箱 -
「
color_discrete_map = { "キー": "カラーコード" }」 → 「この文字のときはこの色にしてね!」と、プログラムに1対1の色指定を教えるための地図(辞書データ) -
「
px.bar(データ, x="横軸", y="縦軸", color="色分けの基準", color_discrete_map=地図)」 → 色付けの地図を読み込ませて、指定通りのカラーで棒グラフを組み立てるPlotlyのメソッド -
「
color_discrete_map」 :グラフの色を「◎=ピンク、▲=水色」にするための特注の色の指示書。 -
「
st.plotly_chart(fig)」 :別の道具で作ったグラフの完成品(fig)を、Streamlitの画面に表示させるための接着剤。
月別絞り込み機能を追加
-
「
df["列名"].str[:7]」 → 日付データ(例:2026-05-22)の文字の先頭から7文字目(2026-05)までをスパスパッと一斉に切り落として取り出す Pandas のスライステクニック -
「
df["列名"].unique()」 → 列の中に何回も出てくる同じ文字を、ダブりなしで1つずつ(ユニークに)まとめる道具 -
「
sorted(リスト)」 → バラバラの文字や数字を、古い順・小さい順にきれいに並べ替えてくれるPythonの基本機能 -
「
st.selectbox("タイトル", リスト)」 → クリックすると下に選択肢がズラーッと広がる「ドロップダウンメニュー」を設置し、選ばれた文字を変数に格納する道具 -
「
df[df["列名"] == 目標の文字]」 → 表の中から、指定した条件に一致する行だけを、網で一網打尽にしてすくい取る Pandas 最重要のフィルタリング文法
AIもどきのコメント機能を追加
-
「
import random」 → Pythonで「運に任せる」ような処理(サイコロを振る、ランダムに選ぶ)をするための基本の道具箱 -
「
random.choice(リスト)」 → リスト(複数の選択肢)の中から、全自動でランダムに1つだけをすくい上げてくれるメソッド -
「
st.balloons()」 → この命令を書くだけで、画面の下からカラフルな風船がプカプカと湧き上がってくる、Streamlit純正の可愛い演出パーツ
削除ボタンを追加
-
「
st.checkbox("文字")」 → 画面にポチッとレ点を入れるチェックボックスを設置する。チェックが入ると True(はい)、外れていると False(いいえ)というデータに変身する道具 -
「
os.remove(ファイル名)」 → パソコンのフォルダ内にある特定のファイルを、プログラムの力で一撃でゴミ箱にも残さず完全消去(デリート)する禁断のメソッド -
「
st.warning("文字")」 → 画面に黄色の注意勧告ボックスを表示する。注意書きや警告を出したいときに一番見やすい親切パーツ -
「
st.error("文字")」 → 画面に赤色のエラーボックスを表示する。ユーザーに「操作が間違ってるよ!」と強めに伝えたいときに使うパーツ
全体のコード
import streamlit as st
import pandas as pd
import os
from datetime import datetime
import plotly.express as px
import random
# アプリのタイトル
st.title("🍀 まいにち記録カレンダー")
st.write("今日の日付を選んで、記号と一言メモを記録しよう。")
# 1. 入力フォームの作成
selected_date = st.date_input("日付を選択してください:", datetime.now())
status = st.radio("今日の運勢・気分は?", ["◎ 幸運だった!", "〇 普通だった", "▲ 不幸・不調だった"], horizontal=True)
bad_memo = st.text_input("😢 不幸だったこと(一行メモ):", placeholder="例:お気に入りの傘を忘れた")
good_memo = st.text_input("✨ 幸運だったこと(一行メモ):", placeholder="例:欲しかったお菓子が買えた")
# 2. 保存ボタンが押されたときの処理
if st.button("今日の記録を保存する"):
# 保存するデータを表の形にする
new_row = pd.DataFrame({
"日付": [str(selected_date)],
"状態": [status[0]], # 「◎」「〇」「▲」の1文字目だけを取得
"不幸だったこと": [bad_memo],
"幸運だったこと": [good_memo]
})
csv_file = "diary.csv"
# すでにファイルがあれば追記、なければ新規作成
if os.path.exists(csv_file):
new_row.to_csv(csv_file, mode='a', header=False, index=False)
else:
new_row.to_csv(csv_file, mode='w', header=True, index=False)
st.success(f"【{selected_date}】の記録を保存しました!")
# 💬 AIコメント機能
st.subheader("🤖 今日の気分への一言メッセージ ")
messages_good = [
"最高の一日でしたね!その調子で明日も笑顔でいきましょう!🐱",
"欲しかったお菓子が買えたなんて、まさにハッピー!明日もいいことあるかも?🎈",
"そんな日は、夜も特別なご褒美タイムにしちゃいましょう!🍰"
]
messages_normal = [
"普通が一番!安定した一日、お疲れ様でした。🍵",
"何事もなかった今日は、きっと明日のための準備期間ですね。ゆっくり休んで!💤",
"平凡な日常の中に、小さな幸せが隠れているかもしれませんよ。👀"
]
messages_bad = [
"今日が雨でも、いつかは晴れます。安心して眠りましょう!☔",
"不幸だったことも、寝て忘れればOK!明日はきっといい日☔",
"そんな日は、自分をいっぱい甘やかしてください。お風呂でリラックス!🛁"
]
current_status = status[0]
if current_status == "◎":
ai_comment = random.choice(messages_good)
elif current_status == "〇":
ai_comment = random.choice(messages_normal)
else:
ai_comment = random.choice(messages_bad)
st.info(ai_comment)
st.balloons()
# 3. 過去の記録を表示する
csv_file = "diary.csv"
if os.path.exists(csv_file):
df = pd.read_csv(csv_file)
st.subheader("📊 気分のあゆみ(グラフ)")
status_counts = df["状態"].value_counts().reset_index()
status_counts.columns = ["状態", "回数"]
color_map = {"◎": "#ffb6c1", "〇": "#ffe4b5", "▲": "#87ceeb"}
fig = px.bar(status_counts, x="状態", y="回数", color="状態", color_discrete_map=color_map, labels={"回数": "記録された回数", "状態": "今日の気分"})
st.plotly_chart(fig, use_container_width=True)
st.subheader("📖 過去の記録一覧")
st.dataframe(df, use_container_width=True)
# 🧹 【ここから追加:データの削除処理】 🧹
st.write("---") # 画面に区切り線(横線)を引く
st.subheader("🗑️ データの全削除(リセット)")
st.write("ボタンを押すと、これまでのすべての記録が完全に消去されます。元に戻せないので注意してください。")
# 誤操作を防ぐために「本当に削除しますか?」のチェックボックスを設置
confirm_delete = st.checkbox("本当にデータをすべて削除して良い場合はチェックを入れてください")
if st.button("全データを削除する"):
if confirm_delete:
# パソコン内にあるファイルを物理的に消し去る魔法の命令!
os.remove(csv_file)
st.warning("これまでのすべてのデータを消去しました。ページを更新(リロード)してください。")
else:
st.error("エラー:上のチェックボックスにチェックが入っていません!")
# 🧹 【追加ここまで】 🧹
else:
st.info("まだ記録がありません。上のフォームから最初の記録を保存してみましょう!")