import streamlit as st version 1
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)