1+ # from flask import Flask, request, render_template, jsonify
2+ # import joblib
3+ # import numpy as np
4+ # import pandas as pd
5+ # from config.paths_config import MODEL_PATH, SCALER_PATH
6+ # from src.logger import get_logger
7+ # from src.feature_store import RedisFeatureStore
8+ # from alibi_detect.cd import KSDrift
9+ # import os
10+
11+ # app = Flask(__name__, template_folder='templates', static_folder='static')
12+ # logger = get_logger(__name__)
13+
14+ # # Redis configuration
15+ # REDIS_HOST = os.environ.get('REDIS_HOST', 'localhost')
16+ # REDIS_PORT = int(os.environ.get('REDIS_PORT', 6379))
17+ # REDIS_DB = int(os.environ.get('REDIS_DB', 0))
18+
19+ # # Define the top 12 features
20+ # TOP_12_FEATURES = [
21+ # 'multiple_deliveries', 'Road_traffic_density', 'Vehicle_condition', 'Delivery_person_Ratings',
22+ # 'distance_deliveries', 'Weather_conditions', 'Festival', 'distance_traffic', 'distance',
23+ # 'Delivery_person_Age', 'prep_traffic', 'City'
24+ # ]
25+
26+ # # Load model and scaler
27+ # try:
28+ # model = joblib.load(MODEL_PATH)
29+ # scaler = joblib.load(SCALER_PATH)
30+ # logger.info("Model and scaler loaded successfully from %s and %s", MODEL_PATH, SCALER_PATH)
31+ # except Exception as e:
32+ # logger.error(f"Error loading model or scaler: {e}")
33+ # raise
34+
35+ # # Initialize RedisFeatureStore and fetch reference data
36+ # try:
37+ # feature_store = RedisFeatureStore(host=REDIS_HOST, port=REDIS_PORT, db=REDIS_DB)
38+ # entity_ids = feature_store.get_all_entity_ids()
39+ # if not entity_ids:
40+ # raise ValueError("No reference data found in Redis")
41+ # batch_features = feature_store.get_batch_features(entity_ids[:1000])
42+ # reference_df = pd.DataFrame([features for features in batch_features.values()], columns=TOP_12_FEATURES)
43+ # reference_data = scaler.transform(reference_df)
44+ # logger.info(f"Fetched and transformed {len(reference_data)} reference rows from RedisFeatureStore")
45+ # except Exception as e:
46+ # logger.error(f"Error fetching reference data from Redis: {e}")
47+ # raise
48+
49+ # # Mapping dictionaries for dropdowns
50+ # WEATHER_CONDITIONS = {'Sunny': 0, 'Cloudy': 1, 'Fog': 2, 'Sandstorms': 3, 'Stormy': 4, 'Windy': 5}
51+ # TRAFFIC_DENSITY = {'Low': 0, 'Medium': 1, 'High': 2, 'Jam': 3}
52+ # VEHICLE_CONDITION = {'Poor': 0, 'Good': 1, 'Excellent': 2}
53+ # FESTIVAL = {'No': 0, 'Yes': 1}
54+ # CITY = {'Urban': 0, 'Semi-Urban': 1, 'Metropolitan': 2}
55+
56+ # # Initialize drift detector
57+ # ksd = KSDrift(x_ref=reference_data, p_val=0.05)
58+
59+ # @app.route('/')
60+ # def index():
61+ # return render_template('index.html')
62+
63+ # @app.route('/predict', methods=['POST'])
64+ # def predict():
65+ # try:
66+ # data = request.form.to_dict()
67+ # logger.info(f"Received form data: {data}")
68+
69+ # def validate_dropdown(value, mapping, field_name):
70+ # if value not in mapping:
71+ # raise ValueError(f"Invalid value '{value}' for {field_name}. Valid options: {list(mapping.keys())}")
72+ # return mapping[value]
73+
74+ # input_data = {
75+ # 'multiple_deliveries': float(data['multiple_deliveries']),
76+ # 'Road_traffic_density': validate_dropdown(data['Road_traffic_density'], TRAFFIC_DENSITY, 'Road_traffic_density'),
77+ # 'Vehicle_condition': validate_dropdown(data['Vehicle_condition'], VEHICLE_CONDITION, 'Vehicle_condition'),
78+ # 'Delivery_person_Ratings': float(data['Delivery_person_Ratings']),
79+ # 'distance_deliveries': float(data['distance_deliveries']),
80+ # 'Weather_conditions': validate_dropdown(data['Weather_conditions'], WEATHER_CONDITIONS, 'Weather_conditions'),
81+ # 'Festival': validate_dropdown(data['Festival'], FESTIVAL, 'Festival'),
82+ # 'distance_traffic': float(data['distance_traffic']),
83+ # 'distance': float(data['distance']),
84+ # 'Delivery_person_Age': float(data['Delivery_person_Age']),
85+ # 'prep_traffic': float(data['prep_traffic']),
86+ # 'City': validate_dropdown(data['City'], CITY, 'City')
87+ # }
88+ # df = pd.DataFrame([input_data], columns=TOP_12_FEATURES)
89+
90+ # # Scale incoming data
91+ # features_scaled = scaler.transform(df)
92+
93+ # # Data drift detection
94+ # drift_result = ksd.predict(features_scaled)
95+ # drift_detected = drift_result['data']['is_drift']
96+ # if drift_detected:
97+ # logger.warning(f"Data drift detected! p-values: {drift_result['data']['p_val']}")
98+ # else:
99+ # logger.info("No data drift detected.")
100+
101+ # # Predict
102+ # prediction = float(model.predict(features_scaled)[0])
103+ # logger.info(f"Prediction: {prediction}")
104+
105+ # # Return prediction and drift status
106+ # return jsonify({
107+ # 'prediction': round(prediction, 2),
108+ # 'drift_detected': bool(drift_detected),
109+ # 'drift_p_values': drift_result['data']['p_val'].tolist() # Convert to list for JSON
110+ # })
111+ # except KeyError as e:
112+ # logger.error(f"Missing field: {e}")
113+ # return jsonify({'error': f"Missing required field: {e}"}), 400
114+ # except ValueError as e:
115+ # logger.error(f"Invalid input: {e}")
116+ # return jsonify({'error': str(e)}), 400
117+ # except Exception as e:
118+ # logger.error(f"Error in prediction: {e}")
119+ # return jsonify({'error': 'Internal server error'}), 500
120+
121+ # if __name__ == '__main__':
122+ # port = int(os.environ.get('PORT', 5000))
123+ # app.run(debug=True, host='0.0.0.0', port=port)
124+
125+
126+ ############################################################################################################################################
127+
128+ # for deployment purpose i am out of aws credits so i am removing data drift detection and redis feature store
129+
1130from flask import Flask , request , render_template , jsonify
2131import joblib
3132import numpy as np
4133import pandas as pd
5134from config .paths_config import MODEL_PATH , SCALER_PATH
6135from src .logger import get_logger
7- from src .feature_store import RedisFeatureStore
8- from alibi_detect .cd import KSDrift
9136import os
10137
11138app = Flask (__name__ , template_folder = 'templates' , static_folder = 'static' )
12139logger = get_logger (__name__ )
13140
14- # Redis configuration
15- REDIS_HOST = os .environ .get ('REDIS_HOST' , 'localhost' )
16- REDIS_PORT = int (os .environ .get ('REDIS_PORT' , 6379 ))
17- REDIS_DB = int (os .environ .get ('REDIS_DB' , 0 ))
18-
19141# Define the top 12 features
20142TOP_12_FEATURES = [
21143 'multiple_deliveries' , 'Road_traffic_density' , 'Vehicle_condition' , 'Delivery_person_Ratings' ,
32154 logger .error (f"Error loading model or scaler: { e } " )
33155 raise
34156
35- # Initialize RedisFeatureStore and fetch reference data
36- try :
37- feature_store = RedisFeatureStore (host = REDIS_HOST , port = REDIS_PORT , db = REDIS_DB )
38- entity_ids = feature_store .get_all_entity_ids ()
39- if not entity_ids :
40- raise ValueError ("No reference data found in Redis" )
41- batch_features = feature_store .get_batch_features (entity_ids [:1000 ])
42- reference_df = pd .DataFrame ([features for features in batch_features .values ()], columns = TOP_12_FEATURES )
43- reference_data = scaler .transform (reference_df )
44- logger .info (f"Fetched and transformed { len (reference_data )} reference rows from RedisFeatureStore" )
45- except Exception as e :
46- logger .error (f"Error fetching reference data from Redis: { e } " )
47- raise
48-
49157# Mapping dictionaries for dropdowns
50158WEATHER_CONDITIONS = {'Sunny' : 0 , 'Cloudy' : 1 , 'Fog' : 2 , 'Sandstorms' : 3 , 'Stormy' : 4 , 'Windy' : 5 }
51159TRAFFIC_DENSITY = {'Low' : 0 , 'Medium' : 1 , 'High' : 2 , 'Jam' : 3 }
52160VEHICLE_CONDITION = {'Poor' : 0 , 'Good' : 1 , 'Excellent' : 2 }
53161FESTIVAL = {'No' : 0 , 'Yes' : 1 }
54162CITY = {'Urban' : 0 , 'Semi-Urban' : 1 , 'Metropolitan' : 2 }
55163
56- # Initialize drift detector
57- ksd = KSDrift (x_ref = reference_data , p_val = 0.05 )
58-
59164@app .route ('/' )
60165def index ():
61166 return render_template ('index.html' )
@@ -90,23 +195,13 @@ def validate_dropdown(value, mapping, field_name):
90195 # Scale incoming data
91196 features_scaled = scaler .transform (df )
92197
93- # Data drift detection
94- drift_result = ksd .predict (features_scaled )
95- drift_detected = drift_result ['data' ]['is_drift' ]
96- if drift_detected :
97- logger .warning (f"Data drift detected! p-values: { drift_result ['data' ]['p_val' ]} " )
98- else :
99- logger .info ("No data drift detected." )
100-
101198 # Predict
102199 prediction = float (model .predict (features_scaled )[0 ])
103200 logger .info (f"Prediction: { prediction } " )
104201
105- # Return prediction and drift status
202+ # Return prediction
106203 return jsonify ({
107- 'prediction' : round (prediction , 2 ),
108- 'drift_detected' : bool (drift_detected ),
109- 'drift_p_values' : drift_result ['data' ]['p_val' ].tolist () # Convert to list for JSON
204+ 'prediction' : round (prediction , 2 )
110205 })
111206 except KeyError as e :
112207 logger .error (f"Missing field: { e } " )
@@ -120,4 +215,4 @@ def validate_dropdown(value, mapping, field_name):
120215
121216if __name__ == '__main__' :
122217 port = int (os .environ .get ('PORT' , 5000 ))
123- app .run (debug = True , host = '0.0.0.0' , port = port )
218+ app .run (debug = True , host = '0.0.0.0' , port = port )
0 commit comments