Spaces:
Running
Running
import gradio as gr | |
import matplotlib.pyplot as plt | |
import matplotlib.dates as mdates | |
import pandas as pd | |
from datetime import datetime, timedelta | |
from sqlite_handler import load_records # DBからレコード読み込み | |
import matplotlib.font_manager as fm | |
import os | |
# 日本語フォント設定 | |
font_path = "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc" | |
if os.path.exists(font_path): | |
jp_font = fm.FontProperties(fname=font_path) | |
plt.rcParams["font.family"] = jp_font.get_name() | |
else: | |
jp_font = None | |
def filter_data_by_range(df, days=None): | |
if days is None: | |
return df | |
limit = datetime.now() - timedelta(days=days) | |
return df[df["timestamp"] >= limit] | |
def plot_history_graph(period_option): | |
df = load_records() | |
if df.empty: | |
fig, ax = plt.subplots() | |
ax.set_title("データがありません", fontproperties=jp_font) | |
return fig | |
df["timestamp"] = pd.to_datetime(df["timestamp"]) | |
if period_option != "全期間": | |
days = {"1日": 1, "1週間": 7, "1か月": 30}[period_option] | |
df = filter_data_by_range(df, days) | |
fig, ax1 = plt.subplots() | |
ax1.plot(df["timestamp"], df["current_bg"], label="血糖値", color="blue", marker="o") | |
ax1.set_ylabel("血糖値 (mg/dL)", fontproperties=jp_font, color="blue") | |
ax1.tick_params(axis='y', labelcolor='blue') | |
ax2 = ax1.twinx() | |
ax2.plot(df["timestamp"], df["total_insulin"], label="インスリン", color="red", marker="x") | |
ax2.set_ylabel("インスリン量 (単位)", fontproperties=jp_font, color="red") | |
ax2.tick_params(axis='y', labelcolor='red') | |
ax1.set_title(f"血糖値とインスリン量の推移({period_option})", fontproperties=jp_font) | |
ax1.set_xlabel("日時", fontproperties=jp_font) | |
fig.autofmt_xdate() | |
return fig | |
def get_recent_table(): | |
df = load_records() | |
if df.empty: | |
return pd.DataFrame() | |
df["timestamp"] = pd.to_datetime(df["timestamp"]) | |
week_ago = datetime.now() - timedelta(days=7) | |
df_week = df[df["timestamp"] >= week_ago] | |
return df_week[["timestamp", "current_bg", "total_insulin"]].fillna("") | |
def get_insulin_summary(): | |
df = load_records() | |
if df.empty: | |
return "データがありません" | |
df["timestamp"] = pd.to_datetime(df["timestamp"]) | |
two_weeks_ago = datetime.now() - timedelta(days=14) | |
df_recent = df[df["timestamp"] >= two_weeks_ago] | |
total = df_recent["total_insulin"].fillna(0).sum() | |
return f"直近2週間のインスリン合計: {total:.1f} 単位" | |
def create_history_tab(): | |
with gr.Tab("履歴管理"): | |
with gr.Row(): | |
period_selector = gr.Radio(choices=["1日", "1週間", "1か月", "全期間"], value="1週間", label="表示期間") | |
plot = gr.Plot() | |
table = gr.Dataframe(headers=["日時", "血糖値", "インスリン量"], interactive=False) | |
insulin_summary = gr.Textbox(label="インスリン統計", interactive=False) | |
period_selector.change(fn=plot_history_graph, inputs=period_selector, outputs=plot) | |
period_selector.change(fn=get_recent_table, inputs=None, outputs=table) | |
period_selector.change(fn=get_insulin_summary, inputs=None, outputs=insulin_summary) | |