File size: 3,246 Bytes
aa412a0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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)