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)

END

Close