Rahatara commited on
Commit
e12e40e
·
verified ·
1 Parent(s): 60ea7ba

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +105 -0
app.py ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import pandas as pd
3
+ from datetime import datetime, timedelta
4
+ import os
5
+
6
+ CSV_LOG = "baby_log.csv"
7
+
8
+ # Load or initialize log
9
+ if os.path.exists(CSV_LOG):
10
+ log_df = pd.read_csv(CSV_LOG)
11
+ log_df["datetime"] = pd.to_datetime(log_df["datetime"])
12
+ else:
13
+ log_df = pd.DataFrame(columns=["datetime", "event"])
14
+
15
+ def save_logs():
16
+ log_df.to_csv(CSV_LOG, index=False)
17
+
18
+ def parse_time(hour, minute, ampm):
19
+ hour = int(hour)
20
+ minute = int(minute)
21
+ if ampm == "PM" and hour < 12:
22
+ hour += 12
23
+ if ampm == "AM" and hour == 12:
24
+ hour = 0
25
+ now = datetime.now()
26
+ return now.replace(hour=hour, minute=minute, second=0, microsecond=0)
27
+
28
+ def get_next_feeding_time(last_time):
29
+ hour = last_time.hour
30
+ if 21 <= hour or hour < 10:
31
+ return last_time + timedelta(hours=4)
32
+ else:
33
+ return last_time + timedelta(hours=2)
34
+
35
+ def summarize_today(df):
36
+ today = datetime.now().date()
37
+ df_today = df[df["datetime"].dt.date == today]
38
+ return f"🍼 Feedings today: {len(df_today)}"
39
+
40
+ def avg_feed_gap(df):
41
+ df = df.sort_values("datetime")
42
+ df_today = df[df["datetime"].dt.date == datetime.now().date()]
43
+ times = df_today["datetime"].tolist()
44
+ if len(times) < 2:
45
+ return "⏱️ Avg Gap: N/A"
46
+ gaps = [(t2 - t1).total_seconds() for t1, t2 in zip(times[:-1], times[1:])]
47
+ avg_gap = sum(gaps) / len(gaps)
48
+ avg_td = timedelta(seconds=avg_gap)
49
+ return f"⏱️ Avg Gap: {str(avg_td).split('.')[0]}"
50
+
51
+ def log_feeding(hour_str, minute_str, ampm):
52
+ global log_df
53
+ try:
54
+ hour = int(hour_str)
55
+ minute = int(minute_str)
56
+ except:
57
+ return "Invalid time input", pd.DataFrame(), "", ""
58
+ feed_time = parse_time(hour, minute, ampm)
59
+ new_entry = pd.DataFrame([{"datetime": feed_time, "event": "Feed"}])
60
+ log_df = pd.concat([log_df, new_entry], ignore_index=True)
61
+ save_logs()
62
+ summary = summarize_today(log_df)
63
+ gap = avg_feed_gap(log_df)
64
+ next_feed_time = get_next_feeding_time(feed_time)
65
+ return next_feed_time.strftime("%I:%M %p"), log_df.tail(50).reset_index(drop=True), summary, gap
66
+
67
+ def check_next_feeding():
68
+ if log_df.empty:
69
+ return "No previous feeding logged."
70
+ last_time = log_df["datetime"].max()
71
+ next_time = get_next_feeding_time(last_time)
72
+ return f"Next feeding should be around: {next_time.strftime('%I:%M %p')}"
73
+
74
+ def visualize_log():
75
+ return log_df.tail(50).reset_index(drop=True), summarize_today(log_df), avg_feed_gap(log_df)
76
+
77
+ with gr.Blocks() as app:
78
+ gr.Markdown("## 👶 Smart Baby Feed Tracker")
79
+
80
+ with gr.Row():
81
+ hour_input = gr.Textbox(label="Hour (1-12)", value="10")
82
+ minute_input = gr.Textbox(label="Minute (0-59)", value="00")
83
+ ampm_dropdown = gr.Dropdown(["AM", "PM"], label="AM/PM", value="AM")
84
+ log_btn = gr.Button("✔️ Log Feeding")
85
+
86
+ next_feed_time = gr.Textbox(label="⏭️ Next Feeding Time")
87
+ feed_table = gr.Dataframe(label="Recent Feed Log")
88
+ today_summary = gr.Textbox(label="Today's Feed Count")
89
+ avg_gap = gr.Textbox(label="Average Feed Gap")
90
+ log_btn.click(log_feeding, inputs=[hour_input, minute_input, ampm_dropdown],
91
+ outputs=[next_feed_time, feed_table, today_summary, avg_gap])
92
+
93
+ gr.Markdown("### 📋 View Log & Stats Anytime")
94
+ view_btn = gr.Button("📊 Visualize Log")
95
+ view_table = gr.Dataframe(label="Recent Feed Log")
96
+ view_summary = gr.Textbox(label="Today's Feed Count")
97
+ view_gap = gr.Textbox(label="Average Feed Gap")
98
+ view_btn.click(visualize_log, inputs=[], outputs=[view_table, view_summary, view_gap])
99
+
100
+ gr.Markdown("### 🔄 Check From Last Feeding")
101
+ check_btn = gr.Button("⏭️ Predict Next Feeding Time")
102
+ next_check = gr.Textbox(label="Predicted Time From Log")
103
+ check_btn.click(check_next_feeding, inputs=[], outputs=next_check)
104
+
105
+ app.launch()