import streamlit as st version 1

2026/01/15 01:40 by platycodon9000
  :追加された部分   :削除された部分
(差分が大きい場合、文字単位では表示しません)
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)      

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)