Skip to content

Commit b80da1f

Browse files
updates in app.py for render
1 parent 38248a0 commit b80da1f

File tree

1 file changed

+132
-37
lines changed

1 file changed

+132
-37
lines changed

app.py

Lines changed: 132 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,143 @@
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+
1130
from flask import Flask, request, render_template, jsonify
2131
import joblib
3132
import numpy as np
4133
import pandas as pd
5134
from config.paths_config import MODEL_PATH, SCALER_PATH
6135
from src.logger import get_logger
7-
from src.feature_store import RedisFeatureStore
8-
from alibi_detect.cd import KSDrift
9136
import os
10137

11138
app = Flask(__name__, template_folder='templates', static_folder='static')
12139
logger = 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
20142
TOP_12_FEATURES = [
21143
'multiple_deliveries', 'Road_traffic_density', 'Vehicle_condition', 'Delivery_person_Ratings',
@@ -32,30 +154,13 @@
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
50158
WEATHER_CONDITIONS = {'Sunny': 0, 'Cloudy': 1, 'Fog': 2, 'Sandstorms': 3, 'Stormy': 4, 'Windy': 5}
51159
TRAFFIC_DENSITY = {'Low': 0, 'Medium': 1, 'High': 2, 'Jam': 3}
52160
VEHICLE_CONDITION = {'Poor': 0, 'Good': 1, 'Excellent': 2}
53161
FESTIVAL = {'No': 0, 'Yes': 1}
54162
CITY = {'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('/')
60165
def 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

121216
if __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

Comments
 (0)