--- Title: '' Author: platycodon9000 Web: https://mimemo.io/m/kWVal69e5JoBEqd --- import streamlit as st import altair as alt import pandas as pd import io st.set_page_config(initial_sidebar_state="collapsed", page_title="My App", layout="wide") df = pd.read_excel(r"C:\Users\toi.watanabe\Desktop\streamlit\data.xlsx") df["取引日時"]=pd.to_datetime(df["取引日時"]) st.sidebar.header("フィルター") category = st.sidebar.multiselect( "カテゴリー", options=df["カテゴリー"].unique(), default=df["カテゴリー"].unique(), label_visibility="visible" ) start_date, end_date = st.sidebar.date_input( "期間", [df["取引日時"].min(), df["取引日時"].max()] ) filtered_df = df[ (df["カテゴリー"].isin(category)) & (df["取引日時"].between(pd.to_datetime(start_date), pd.to_datetime(end_date))) ] st.dataframe(filtered_df, use_container_width=False) #🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢 def create_excel(dataframe): buffer = io.BytesIO() with pd.ExcelWriter(buffer, engine="xlsxwriter") as writer: dataframe.to_excel(writer, index=False, sheet_name="data") return buffer.getvalue() st.download_button( label="Excelダウンロード", data=create_excel(filtered_df), # ← 押されたときに初めて実行される file_name="data.xlsx", mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ) #🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢 chart_df = df[(df["取引日時"].between(pd.to_datetime(start_date), pd.to_datetime(end_date)))] # 状態をセッションに保持 if "toggle_state" not in st.session_state: st.session_state.toggle_state = False # 押すたびに状態を反転させる関数 def toggle(): st.session_state.toggle_state = not st.session_state.toggle_state # ボタン st.button("グラフ切替", on_click=toggle) # 状態に応じて表示 if st.session_state.toggle_state: st.write("折れ線グラフ") # 線は単色 line_layer = ( alt.Chart(chart_df) .mark_line(color="white") .encode( x="取引日時:T", y="取引後残高:Q" ) ) st.altair_chart(line_layer, use_container_width=True) else: st.write("ローソク足チャート") # ポイントはカテゴリー別に色分け line_layer = ( alt.Chart(chart_df) .mark_line(color="white") .encode( x="取引日時:T", y="取引後残高:Q" ) ) point_layer = ( alt.Chart(chart_df) .mark_point(filled=True, size=100) .encode( x=alt.X("取引日時:T",axis=alt.Axis(format="%m月%d日")), y="取引後残高:Q", color=alt.Color("カテゴリー:N",legend=None), tooltip=[ alt.Tooltip("取引日時:T", format='%Y-%m-%d %H:%M:%S', title=None), "取引金額", "取引後残高", "カテゴリー" ] ) ) #縦線レイヤー highlight_date = "2026-01-30 00:00:00" vline = alt.Chart(pd.DataFrame({'検知日': [highlight_date]})).mark_rule( color='red', # 線の色 strokeDash=[5,5], # 破線 size=4 # 線の太さ ).encode( x=alt.X("検知日:T",axis=alt.Axis(format="%m月%d日")), tooltip=[ alt.Tooltip("検知日:T", format='%Y-%m-%d %H:%M:%S'), ] ) chart = (line_layer + point_layer + vline).add_selection(alt.selection_interval(bind='scales',encodings=['x'])) st.altair_chart(chart, use_container_width=True) def my_function(): st.write("関数が実行されました!") st.button("実行", on_click=my_function)