PyNaiD / app.py
Pattr's picture
Update app.py
5123ae9 verified
raw
history blame
4 kB
import gradio as gr
import pandas as pd
import numpy as np
from prophet import Prophet
from mysql import connector
import json
import random
from prophet.serialize import model_from_json
def get_data():
_conn = connector.connect(
host='110.238.111.32',
user = 'outsider',
password='Hack2024',
database = 'TheSimp'
)
_cursor = _conn.cursor()
_query = "SELECT name , province ,a_type ,genre ,close ,hour ,link FROM places"
_cursor.execute(_query)
_data = _cursor.fetchall()
_cursor.close()
_conn.close()
_df = pd.DataFrame(_data,columns=['name','province','a_type','genre','close','hour','link'])
return _df
def get_dataset():
_conn = connector.connect(
host='110.238.111.32',
user = 'outsider',
password='Hack2024',
database = 'TheSimp'
)
_cursor = _conn.cursor()
_query = "SELECT id , ds ,a_temp ,m_temp ,n_temp ,y ,a_pres ,m_pres ,a_ws ,m_ws ,a_humi ,m_humi ,n_humi ,a_vis flat,m_vis ,n_vis FROM weather_new"
_cursor.execute(_query)
_data = _cursor.fetchall()
_cursor.close()
_conn.close()
_df = pd.DataFrame(_data,columns=['id','ds','a_temp','m_temp','n_temp','y','a_pres','m_pres','a_ws','m_ws','a_humi','m_humi','n_humi' ,'a_vis','m_vis' ,'n_vis']).drop('id',axis=1)
return _df
places = get_data()
places.replace({'indoor ': 'indoor', 'outdoor ': 'outdoor'}, inplace=True)
province_mapping = {
'Bangkok': 'กรุงเทพฯ',
'Nakohn Pathom': 'นครปฐม',
'Pathum Thani': 'ปทุมธานี',
'Nakohn Nayok': 'นครนายก',
'Nonthaburi': 'นนทบุรี',
'Samut Songkhram': 'สมุทรสงคราม'
}
#with open('prophet_model.json', 'r') as fin:
# prophet_model = model_from_json(json.load(fin))
params = {
'changepoint_prior_scale': 0.1,
'seasonality_prior_scale': 0.1,
'interval_width' : 0.2,
}
model = Prophet(**params)
model.fit(get_dataset())
def will_rain(year, month, date):
_date = pd.to_datetime(f'{year}-{month}-{date}')
_df = pd.DataFrame({'ds': [_date]})
_prediction = prophet_model.predict(_df)
_prediction = float(_prediction['yhat'])
return _prediction >= 0.5
def get_advice(province, activity, purpose, year, month, date):
is_rain = will_rain(year, month, date)
activity = 'indoor' if is_rain else activity.lower()
province = province_mapping[province]
places = places[(places['province'] == province) & (places['a_type'] == activity) & (places['genre'] == purpose.lower())]
random_idx = np.random.randint(0, len(places))
place_name = places.iloc[random_idx]['name']
close_day = places.iloc[random_idx]['close']
open_hour = places.iloc[random_idx]['hour']
advice = f"It might rain on {year}-{month}-{date}, so we suggest you to go indoor place such as {place_name}." if is_rain else f"It might not rain on {year}-{month}-{date}, so we suggest you to go to place such as {place_name}."
return advice, place_name, close_day, open_hour
iface = gr.Interface(
fn=get_advice,
inputs=[
gr.Dropdown(["Bangkok", 'Nakohn Pathom', 'Pathum Thani', 'Nakohn Nayok', 'Nonthaburi', 'Samut Songkhram'], label="Province",),
gr.Dropdown(["indoor", "outdoor"], label="Activity"),
gr.Dropdown(["shopping", "relax", 'education', 'culture', 'nature'], label="Purpose"),
gr.Dropdown([2024], label="Year"),
gr.Dropdown([i for i in range(1, 13)], label="Month"),
gr.Dropdown([i for i in range(1, 32)], label="Date"),
],
outputs=[
gr.components.Textbox(label='Advice'),
gr.components.Textbox(label="Place Name"),
gr.components.Textbox(label="Close day"),
gr.components.Textbox(label="Open hour"),
],
live=True,
title="Right place, Right day",
description="Get the weather forecast for a place you would like to go.",
theme="default"
)
iface.launch()