Feed_Reminder / app.py
Rahatara's picture
Create app.py
e12e40e verified
import gradio as gr
import pandas as pd
from datetime import datetime, timedelta
import os
CSV_LOG = "baby_log.csv"
# Load or initialize log
if os.path.exists(CSV_LOG):
log_df = pd.read_csv(CSV_LOG)
log_df["datetime"] = pd.to_datetime(log_df["datetime"])
else:
log_df = pd.DataFrame(columns=["datetime", "event"])
def save_logs():
log_df.to_csv(CSV_LOG, index=False)
def parse_time(hour, minute, ampm):
hour = int(hour)
minute = int(minute)
if ampm == "PM" and hour < 12:
hour += 12
if ampm == "AM" and hour == 12:
hour = 0
now = datetime.now()
return now.replace(hour=hour, minute=minute, second=0, microsecond=0)
def get_next_feeding_time(last_time):
hour = last_time.hour
if 21 <= hour or hour < 10:
return last_time + timedelta(hours=4)
else:
return last_time + timedelta(hours=2)
def summarize_today(df):
today = datetime.now().date()
df_today = df[df["datetime"].dt.date == today]
return f"๐Ÿผ Feedings today: {len(df_today)}"
def avg_feed_gap(df):
df = df.sort_values("datetime")
df_today = df[df["datetime"].dt.date == datetime.now().date()]
times = df_today["datetime"].tolist()
if len(times) < 2:
return "โฑ๏ธ Avg Gap: N/A"
gaps = [(t2 - t1).total_seconds() for t1, t2 in zip(times[:-1], times[1:])]
avg_gap = sum(gaps) / len(gaps)
avg_td = timedelta(seconds=avg_gap)
return f"โฑ๏ธ Avg Gap: {str(avg_td).split('.')[0]}"
def log_feeding(hour_str, minute_str, ampm):
global log_df
try:
hour = int(hour_str)
minute = int(minute_str)
except:
return "Invalid time input", pd.DataFrame(), "", ""
feed_time = parse_time(hour, minute, ampm)
new_entry = pd.DataFrame([{"datetime": feed_time, "event": "Feed"}])
log_df = pd.concat([log_df, new_entry], ignore_index=True)
save_logs()
summary = summarize_today(log_df)
gap = avg_feed_gap(log_df)
next_feed_time = get_next_feeding_time(feed_time)
return next_feed_time.strftime("%I:%M %p"), log_df.tail(50).reset_index(drop=True), summary, gap
def check_next_feeding():
if log_df.empty:
return "No previous feeding logged."
last_time = log_df["datetime"].max()
next_time = get_next_feeding_time(last_time)
return f"Next feeding should be around: {next_time.strftime('%I:%M %p')}"
def visualize_log():
return log_df.tail(50).reset_index(drop=True), summarize_today(log_df), avg_feed_gap(log_df)
with gr.Blocks() as app:
gr.Markdown("## ๐Ÿ‘ถ Smart Baby Feed Tracker")
with gr.Row():
hour_input = gr.Textbox(label="Hour (1-12)", value="10")
minute_input = gr.Textbox(label="Minute (0-59)", value="00")
ampm_dropdown = gr.Dropdown(["AM", "PM"], label="AM/PM", value="AM")
log_btn = gr.Button("โœ”๏ธ Log Feeding")
next_feed_time = gr.Textbox(label="โญ๏ธ Next Feeding Time")
feed_table = gr.Dataframe(label="Recent Feed Log")
today_summary = gr.Textbox(label="Today's Feed Count")
avg_gap = gr.Textbox(label="Average Feed Gap")
log_btn.click(log_feeding, inputs=[hour_input, minute_input, ampm_dropdown],
outputs=[next_feed_time, feed_table, today_summary, avg_gap])
gr.Markdown("### ๐Ÿ“‹ View Log & Stats Anytime")
view_btn = gr.Button("๐Ÿ“Š Visualize Log")
view_table = gr.Dataframe(label="Recent Feed Log")
view_summary = gr.Textbox(label="Today's Feed Count")
view_gap = gr.Textbox(label="Average Feed Gap")
view_btn.click(visualize_log, inputs=[], outputs=[view_table, view_summary, view_gap])
gr.Markdown("### ๐Ÿ”„ Check From Last Feeding")
check_btn = gr.Button("โญ๏ธ Predict Next Feeding Time")
next_check = gr.Textbox(label="Predicted Time From Log")
check_btn.click(check_next_feeding, inputs=[], outputs=next_check)
app.launch()