from datetime import date, datetime, timedelta from sklearn.model_selection import train_test_split from sklearn.neural_network import MLPClassifier import pandas as pd import plotly.graph_objects as go def hour_rounder(t): if int(t.minute)>= 30: time_1 = str(int(t.hour)+1) if len(time_1) == 1: return "0"+time_1+":00" else: return str(time_1)+":00" else: if len(str(t.hour)) == 1: return "0"+str(t.hour)+":00" else: return str(t.hour)+":00" def peak_hours(t): peak = ['07:00', "08:00", '09:00', "17:00", "18:00", "19:00"] if t in peak: return 1 else: return 0 def weekend(w): end = ['Saturday', 'Sunday'] if w in end: return 1 else: return 0 def vehicle_cat(v): if v >= 0 and v < 20: return 0 elif v >= 20 and v < 50: return 1 elif v >= 50 and v < 80: return 2 elif v >= 80 and v < 120: return 3 else: return 4 def data_split(final_table): X = final_table.loc[:,['day', 'hour','view']] Y = final_table.loc[:,'cat'] X = pd.get_dummies(X) X.loc[:,['peak', 'weekend']] = final_table.loc[:,['peak', 'weekend']] x_train, x_test, y_train, y_test = train_test_split(X, Y, train_size=0.7, test_size=0.3, shuffle=True, random_state=13) return x_train, x_test, y_train, y_test def convert_date(date): return datetime.strptime(date, "%Y-%m-%d").strftime('%A') def create_row(x_train, date_d, hour, view): if date_d is None: date_d = "2023-04-11" if hour is None: hour = "09:00" if view is None: view = "Johor-Tuas" features = x_train.columns d_dict = {} day = datetime.strptime(date_d, "%Y-%m-%d").strftime('%A') hour = str(hour) view = str(view) col_day = "day_" + day col_hour = 'hour_'+ hour col_view = 'view_'+view for i in features: if i == col_day or i == col_hour or i == col_view: d_dict[i] = [1] else: d_dict[i] = [0] end = ['Saturday', 'Sunday'] peak = ['07:00', "08:00", '09:00', "17:00", "18:00", "19:00"] if day in end: d_dict['weekend'] = 1 if hour in peak: d_dict['peak'] = 1 result = pd.DataFrame.from_dict(d_dict, orient='columns') for i in features: result[i] = result[i].astype('category') return result def prep_data_pred_plot(df): df = df.sort_values(by=['date']).reset_index(drop=True) df['date'] = pd.to_datetime(df['date'], format = "%Y-%m-%d") df['day'] = df['date'].dt.day_name() df.drop(columns=['motorcycle'], axis=1, inplace=True) df['vehicle'] = df['car'] + df['large_vehicle'] transfer = {"View_from_Second_Link_at_Tuas_to_sg": 'Johor-Tuas', "View_from_Second_Link_at_Tuas_to_jh": 'Tuas-Johor', "View_from_Tuas_Checkpoint_to_sg": 'Johor-Tuas', "View_from_Tuas_Checkpoint_to_jh": 'Tuas-Johor', "View_from_Woodlands_Causeway_Towards_Johor_to_sg": 'Johor-Woodlands', "View_from_Woodlands_Causeway_Towards_Johor_to_jh": 'Woodlands-Johor', "View_from_Woodlands_Checkpoint_Towards_BKE_to_sg": 'Johor-Woodlands', "View_from_Woodlands_Checkpoint_Towards_BKE_to_jh": 'Woodlands-Johor'} new_table = df.replace({'view':transfer}) options = ['Johor-Woodlands','Woodlands-Johor','Johor-Tuas','Tuas-Johor'] final_df = new_table[new_table['view'].isin(options)] final_df.loc[:, 'time'] = pd.to_datetime(final_df.loc[:,'time'], format='%H:%M:%S') final_df.loc[:,'hour'] = final_df.loc[:,'time'].apply(hour_rounder) final_table = final_df.groupby(['view', 'day', 'hour']).sum().reset_index().loc[:,['day', 'hour','view', 'vehicle']] final_table.loc[:,'peak'] = final_table.loc[:,'hour'].apply(peak_hours) final_table.loc[:,'peak'] = final_table.loc[:,'peak'].astype('category') final_table.loc[:,'weekend'] = final_table.loc[:,'day'].apply(weekend) final_table.loc[:,'weekend'] = final_table.loc[:,'weekend'].astype('category') final_table.loc[:,'cat'] = final_table.loc[:,'vehicle'].apply(vehicle_cat) final_table.loc[:,'cat'] = final_table.loc[:,'cat'].astype('category') return final_table def gen_fig(): figs = [] for i in range(5): midway = [15, 40, 70, 110, 150] cat = ['No Traffic', 'Minimal Traffic', 'Mild Traffic', 'Moderate Traffic', 'Peak Traffic'] figure = go.Figure(go.Indicator( mode = "gauge", value = midway[i], domain = {'x': [0, 1], 'y': [0, 1]}, title = {'text': cat[i], 'font': {'size': 24}}, gauge = { 'axis': {'range': [None, 156], 'tickwidth': 1, 'tickcolor': "darkblue"}, 'bar': {'color': "blue"}, 'bgcolor': "white", 'borderwidth': 2, 'bordercolor': "gray", 'steps': [ {'range': [0, 19], 'color': 'darkgreen'}, {'range': [20, 49], 'color': 'green'}, {'range': [50, 79], 'color': 'yellow'}, {'range': [80, 119], 'color': 'orange'}, {'range': [120, 160], 'color': 'red'}], 'threshold': { 'line': {'color': "red", 'width': 4}, 'thickness': 0.75, 'value': 490}})) figure.update_layout(paper_bgcolor = "lavender", font = {'color': "darkblue", 'family': "Arial"}) figs.append(figure) return figs def predicted_figure(clf, x, figs): result = create_row(x[0], x[1], x[2], x[3]) pred_val = clf.predict(result)[0] return figs[pred_val] def get_today(): t = str(date.today()).split('-') today = [] for i in t: if t[0] =='0': today.append(int(t[1:])) else: today.append(int(i)) return today def update_output(date_value): string_prefix = 'Travel Day: ' if date_value is not None: date_string = convert_date(date_value) return string_prefix + date_string def update_final_output_hour(starter_variables, my_date_picker_single, hours_dropdown_id, direction_id): # starter_variables = [clf, str(date.today()), "07:00", "Tuas-Johor"] starter_variables[1] = str(my_date_picker_single) starter_variables[2] = str(hours_dropdown_id) starter_variables[3] = str(direction_id) fig = predicted_figure(starter_variables) return fig def train_model(x_train, y_train): clf = MLPClassifier(solver='lbfgs', alpha=3, hidden_layer_sizes=(5,4), random_state=2, max_iter=3000) clf.fit(x_train, y_train) return clf