Spaces:
Sleeping
Sleeping
| #!/usr/bin/env python3 | |
| # Function should get the data and run the whole model, return a single prediction based on the time | |
| from getDailyData import get_daily | |
| from model_intra_v3 import walk_forward_validation | |
| from model_day_v2 import walk_forward_validation_seq as walk_forward_validation_daily | |
| import pandas as pd | |
| import json | |
| from dbConn import connection, engine, insert_dataframe_to_sql | |
| import numpy as np | |
| from datetime import time, timedelta | |
| import datetime | |
| from pandas.tseries.offsets import BDay | |
| import holidays | |
| from dotenv import load_dotenv | |
| load_dotenv() | |
| def is_trading_day_and_time(): | |
| # Get the current local time (assuming the machine is set to EST) | |
| now = datetime.datetime.now() | |
| # Check if today is a weekend (Saturday=5, Sunday=6) | |
| if now.weekday() >= 5: | |
| return False | |
| # Check if today is a US public holiday | |
| us_holidays = holidays.US() | |
| if now.date() in us_holidays: | |
| return False | |
| # Define trading hours (9:30 AM to 4:00 PM) | |
| start_time = datetime.time(9, 30, 0) | |
| end_time = datetime.time(16, 0, 0) | |
| # Check if current time is within trading hours | |
| if now.time() >= start_time and now.time() <= end_time: | |
| return True | |
| else: | |
| return False | |
| def is_refresh_time(): | |
| # Get the current local time (assuming the machine is set to EST) | |
| now = datetime.datetime.now() | |
| # Check if today is a weekend (Saturday=5, Sunday=6) | |
| if now.weekday() >= 5: | |
| return False | |
| # Check if today is a US public holiday | |
| us_holidays = holidays.US() | |
| if now.date() in us_holidays: | |
| return False | |
| # Define trading hours (9:30 AM to 4:00 PM) | |
| refresh_time = datetime.time(16, 15, 0) | |
| # Check if current time is within trading hours | |
| if now.time() >= refresh_time: | |
| return True | |
| else: | |
| return False | |
| def lambda_handler(periods_30m): | |
| if periods_30m > 0: | |
| data, df_final, final_row = get_daily(mode='intra', periods_30m=periods_30m) | |
| res, _ = walk_forward_validation(df_final.drop(columns=['Target']).dropna(), 'Target_clf', 1, mode='single') | |
| elif periods_30m == 0: | |
| data, df_final, final_row = get_daily() | |
| res, _, _ = walk_forward_validation_daily(df_final.dropna(), 'Target_clf', 'Target', 200, 1) | |
| # Get results, run calibration and pvalue | |
| df_results = pd.read_sql_query(f'select * from results where ModelNum = {str(periods_30m)}', con = engine) | |
| # Calibrate Probabilities | |
| def get_quantiles(df, col_name, q): | |
| return df.groupby(pd.cut(df[col_name], q))['IsTrue'].mean() | |
| pct = res['Predicted'].iloc[-1] | |
| df_q = get_quantiles(df_results, 'Predicted', 10) | |
| for q in df_q.index: | |
| if q.left <= pct <= q.right: | |
| p = df_q[q] | |
| calib_scores = np.abs(df_results['Predicted'].iloc[:-1] - 0.5) | |
| score = abs(pct - 0.5) | |
| pv = np.mean(calib_scores >= score) | |
| asof = datetime.datetime.combine(data.index[-1], time(9,30)) + (periods_30m * timedelta(minutes=30)) | |
| blob = { | |
| 'Datetime': str(res.index[-1]), | |
| 'IsTrue':df_final['Target_clf'].iloc[-1], | |
| 'Predicted': pct, | |
| 'CalibPredicted': p, | |
| 'Pvalue':pv, | |
| 'ModelNum':periods_30m, | |
| 'AsOf':str(asof) | |
| } | |
| # Write to DB | |
| df_write = pd.DataFrame.from_dict({k:[v] for k, v in blob.items()}) | |
| cursor = connection.cursor() | |
| insert_dataframe_to_sql('results', df_write, cursor) | |
| cursor.close() | |
| connection.close() | |
| return blob | |
| if __name__ == '__main__': | |
| # Code that, based on the time of the day, return which data/model to run | |
| game_time = is_trading_day_and_time() | |
| refresh_time = is_refresh_time() | |
| if game_time: | |
| now = datetime.datetime.now() | |
| # Change this for debugging -- should be EST | |
| morning_start = datetime.datetime.combine(now.date(), time(9, 30)) | |
| delta = now - morning_start | |
| print(delta) | |
| intervals = max(1,min((delta.total_seconds() / 60 / 30) // 1, 12)) | |
| print(f'running for {str(intervals)}') | |
| j = lambda_handler(intervals) | |
| elif refresh_time: | |
| times_list = np.arange(0,13) | |
| for i in times_list: | |
| j = lambda_handler(i) | |
| # print(j) | |
| else: | |
| print("It's either a weekend, a holiday, or outside RTH. Do not run the script.") |