WebashalarForML commited on
Commit
8735586
·
verified ·
1 Parent(s): 2e0bc7c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +53 -135
app.py CHANGED
@@ -79,45 +79,34 @@ os.makedirs(app.config['MODEL_FOLDER'], exist_ok=True)
79
  # ------------------------------
80
 
81
  # Prediction analysis models loaded from Hugging Face.
82
- src_path = hf_hub_download(
83
- repo_id="WebashalarForML/Diamond_model_",
84
- filename="models_list/mkble/DecisionTree_best_pipeline_mkble_1_to_1.49.pkl",
85
- cache_dir=MODEL_FOLDER
86
- )
87
- dst_path = os.path.join(MODEL_FOLDER, "DecisionTree_best_pipeline_mkble_1_to_1.49.pkl")
88
- shutil.copy(src_path, dst_path)
89
- makable_model = load(dst_path)
90
 
91
- '''
92
  src_path = hf_hub_download(
93
  repo_id="WebashalarForML/Diamond_model_",
94
- filename="models_list/grd/StackingRegressor_best_pipeline_grd_0_to_1.01.pkl",
95
  cache_dir=MODEL_FOLDER
96
  )
97
- dst_path = os.path.join(MODEL_FOLDER, "StackingRegressor_best_pipeline_grd_0_to_1.01.pkl")
98
  shutil.copy(src_path, dst_path)
99
- grade_model = load(dst_path)
100
-
101
 
102
  src_path = hf_hub_download(
103
  repo_id="WebashalarForML/Diamond_model_",
104
- filename="models_list/bygrad/StackingRegressor_best_pipeline_bygrad_0_to_1.01.pkl",
105
  cache_dir=MODEL_FOLDER
106
  )
107
- dst_path = os.path.join(MODEL_FOLDER, "StackingRegressor_best_pipeline_bygrad_0_to_1.01.pkl")
108
  shutil.copy(src_path, dst_path)
109
- bygrade_model = load(dst_path)
110
-
111
 
 
112
  src_path = hf_hub_download(
113
  repo_id="WebashalarForML/Diamond_model_",
114
- filename="models_list/gia/StackingRegressor_best_pipeline_gia_0_to_1.01.pkl",
115
  cache_dir=MODEL_FOLDER
116
  )
117
- dst_path = os.path.join(MODEL_FOLDER, "StackingRegressor_best_pipeline_gia_0_to_1.01.pkl")
118
  shutil.copy(src_path, dst_path)
119
- gia_model = load(dst_path)
120
- '''
121
 
122
  #classsification model on the task
123
  src_path = hf_hub_download(
@@ -129,49 +118,13 @@ dst_path = os.path.join(MODEL_FOLDER, "3_pipeline.pkl")
129
  shutil.copy(src_path, dst_path)
130
  mkble_amt_class_model = load(dst_path)
131
 
132
-
133
-
134
-
135
- print("makable_model type:", type(makable_model))
136
  #print("grade_model type:", type(grade_model))
137
  #print("bygrade_model type:", type(bygrade_model))
138
  #print("gia_model type:", type(gia_model))
139
  print("================================")
140
  print("mkble_amt_class_model type:", type(mkble_amt_class_model))
141
 
142
- #gia_model = load("models/StackingRegressor_best_pipeline_mkble_0_to_1.01.pkl")
143
- #grade_model = load("models/StackingRegressor_best_pipeline_grd_0_to_1.01.pkl")
144
- #bygrade_model = load("models/StackingRegressor_best_pipeline_bygrad_0_to_1.01.pkl")
145
- #makable_model = load("models/StackingRegressor_best_pipeline_gia_0_to_1.01.pkl")
146
-
147
-
148
- # Classification models loaded using joblib.
149
- '''
150
- col_model = load(os.path.join(MODEL_DIR, 'classification_LogisticRegression_col.joblib'))
151
- cts_model = load(os.path.join(MODEL_DIR, 'classification_LogisticRegression_cts.joblib'))
152
- cut_model = load(os.path.join(MODEL_DIR, 'classification_LogisticRegression_cut.joblib'))
153
- qua_model = load(os.path.join(MODEL_DIR, 'classification_LogisticRegression_qua.joblib'))
154
- shp_model = load(os.path.join(MODEL_DIR, 'classification_LogisticRegression_shp.joblib'))
155
-
156
- blk_eng_to_mkbl_model = load(os.path.join(MODEL_DIR, 'classification_LogisticRegression_mkbl_blk.joblib'))
157
- wht_eng_to_mkbl_model = load(os.path.join(MODEL_DIR, 'classification_LogisticRegression_mkbl_wht.joblib'))
158
- open_eng_to_mkbl_model = load(os.path.join(MODEL_DIR, 'classification_LogisticRegression_mkbl_open.joblib'))
159
- pav_eng_to_mkbl_model = load(os.path.join(MODEL_DIR, 'classification_LogisticRegression_mkbl_pav.joblib'))
160
- blk_eng_to_grade_model = load(os.path.join(MODEL_DIR, 'classification_LogisticRegression_grade_blk.joblib'))
161
- wht_eng_to_grade_model = load(os.path.join(MODEL_DIR, 'classification_LogisticRegression_grade_wht.joblib'))
162
- open_eng_to_grade_model = load(os.path.join(MODEL_DIR, 'classification_LogisticRegression_grade_open.joblib'))
163
- pav_eng_to_grade_model = load(os.path.join(MODEL_DIR, 'classification_LogisticRegression_grade_pav.joblib'))
164
- blk_eng_to_bygrade_model = load(os.path.join(MODEL_DIR, 'classification_LogisticRegression_bygrade_blk.joblib'))
165
- wht_eng_to_bygrade_model = load(os.path.join(MODEL_DIR, 'classification_LogisticRegression_bygrade_wht.joblib'))
166
- open_eng_to_bygrade_model = load(os.path.join(MODEL_DIR, 'classification_LogisticRegression_bygrade_open.joblib'))
167
- pav_eng_to_bygrade_model = load(os.path.join(MODEL_DIR, 'classification_LogisticRegression_bygrade_pav.joblib'))
168
- blk_eng_to_gia_model = load(os.path.join(MODEL_DIR, 'classification_LogisticRegression_gia_blk.joblib'))
169
- wht_eng_to_gia_model = load(os.path.join(MODEL_DIR, 'classification_LogisticRegression_gia_wht.joblib'))
170
- open_eng_to_gia_model = load(os.path.join(MODEL_DIR, 'classification_LogisticRegression_gia_open.joblib'))
171
- pav_eng_to_gia_model = load(os.path.join(MODEL_DIR, 'classification_LogisticRegression_gia_pav.joblib'))
172
- '''
173
-
174
-
175
  # List of label encoder names.
176
  encoder_list = [
177
  'Tag', 'EngShp', 'EngQua', 'EngCol', 'EngCut', 'EngPol', 'EngSym', 'EngFlo',
@@ -265,7 +218,7 @@ def process_dataframe(df):
265
 
266
  # Create two DataFrames: one for prediction and one for classification.
267
  df_pred = df[required_columns].copy()
268
- df_pred = df_pred[(df_pred[['EngCts']] > 0.99).all(axis=1) & (df_pred[['EngCts']] < 1.50).all(axis=1)]
269
  df_pred[['EngBlk', 'EngWht', 'EngOpen', 'EngPav']]=df_pred[['EngBlk', 'EngWht', 'EngOpen', 'EngPav']].fillna("NA")
270
  df_class = df[required_columns_2].fillna("NA").copy()
271
 
@@ -297,95 +250,60 @@ def process_dataframe(df):
297
  # Prediction Report Section
298
  # -------------------------
299
  try:
300
- x = df_pred.copy()
301
- #df_pred['GIA_Predicted'] = pd.DataFrame(np.expm1(gia_model.predict(x)), columns=["Predicted"])
302
- #df_pred['Grade_Predicted'] = pd.DataFrame(np.expm1(grade_model.predict(x)), columns=["Predicted"])
303
- #df_pred['ByGrade_Predicted'] = pd.DataFrame(np.expm1(bygrade_model.predict(x)), columns=["Predicted"])
304
- df_pred['change_in_amt_mkble'] = pd.DataFrame(mkble_amt_class_model.predict(x), columns=["pred_change_in_eng_to_mkble"])
305
- #print(df_pred.columns)
306
- df_pred = df_pred[['Tag', 'EngCts', 'EngShp', 'EngQua', 'EngCol', 'EngCut', 'EngPol',
307
  'EngSym', 'EngFlo', 'EngNts', 'EngMikly', 'EngBlk', 'EngWht', 'EngOpen',
308
  'EngPav', 'EngAmt',
309
  'change_in_amt_mkble'
310
  ]]
311
- df_pred['Makable_Predicted'] = pd.DataFrame(np.expm1(makable_model.predict(df_pred)), columns=["Predicted"])
312
- print(df_pred.columns)
313
- #df_pred['GIA_Diff'] = df_pred['EngAmt'] - df_pred['GIA_Predicted']
314
- #df_pred['Grade_Diff'] = df_pred['EngAmt'] - df_pred['Grade_Predicted']
315
- #df_pred['ByGrade_Diff'] = df_pred['EngAmt'] - df_pred['ByGrade_Predicted']
316
- df_pred['Makable_Diff'] = df_pred['EngAmt'] - df_pred['Makable_Predicted']
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
317
 
318
  for col in ['Tag', 'EngShp', 'EngQua', 'EngCol', 'EngCut', 'EngPol', 'EngSym', 'EngFlo', 'EngNts', 'EngMikly','EngBlk', 'EngWht', 'EngOpen', 'EngPav']:
319
  try:
320
- df_pred[col] = loaded_label_encoder[col].inverse_transform(df_pred[col].astype(int))
321
  except ValueError as e:
322
  print(f'inverse transform fails value in column {col}: {e}', 'error')
323
 
324
  except ValueError as e:
325
  print(f'pred model error----->: {e}', 'error')
326
 
327
- # -------------------------
328
- # Classification Report Section
329
- # -------------------------
330
- '''
331
- try:
332
- x2 = df_class.copy()
333
- dx = df_pred.copy() # Start with the prediction data.
334
- dx['col_change'] = col_model.predict(x2)
335
- dx['cts_change'] = cts_model.predict(x2)
336
- dx['cut_change'] = cut_model.predict(x2)
337
- dx['qua_change'] = qua_model.predict(x2)
338
- dx['shp_change'] = shp_model.predict(x2)
339
- except ValueError as e:
340
- print(f'class model error----->: {e}', 'error')
341
-
342
- try:
343
- dx['Change_Blk_Eng_to_Mkbl_value'] = blk_eng_to_mkbl_model.predict(x)
344
- dx['Change_Wht_Eng_to_Mkbl_value'] = wht_eng_to_mkbl_model.predict(x)
345
- dx['Change_Open_Eng_to_Mkbl_value'] = open_eng_to_mkbl_model.predict(x)
346
- dx['Change_Pav_Eng_to_Mkbl_value'] = pav_eng_to_mkbl_model.predict(x)
347
- dx['Change_Blk_Eng_to_Grd_value'] = blk_eng_to_grade_model.predict(x)
348
- dx['Change_Wht_Eng_to_Grd_value'] = wht_eng_to_grade_model.predict(x)
349
- dx['Change_Open_Eng_to_Grd_value'] = open_eng_to_grade_model.predict(x)
350
- dx['Change_Pav_Eng_to_Grd_value'] = pav_eng_to_grade_model.predict(x)
351
- dx['Change_Blk_Eng_to_ByGrd_value'] = blk_eng_to_bygrade_model.predict(x)
352
- dx['Change_Wht_Eng_to_ByGrd_value'] = wht_eng_to_bygrade_model.predict(x)
353
- dx['Change_Open_Eng_to_ByGrd_value'] = open_eng_to_bygrade_model.predict(x)
354
- dx['Change_Pav_Eng_to_ByGrd_value'] = pav_eng_to_bygrade_model.predict(x)
355
- dx['Change_Blk_Eng_to_Gia_value'] = blk_eng_to_gia_model.predict(x)
356
- dx['Change_Wht_Eng_to_Gia_value'] = wht_eng_to_gia_model.predict(x)
357
- dx['Change_Open_Eng_to_Gia_value'] = open_eng_to_gia_model.predict(x)
358
- dx['Change_Pav_Eng_to_Gia_value'] = pav_eng_to_gia_model.predict(x)
359
- except ValueError as e:
360
- print(f'grade_code model error----->: {e}', 'error')
361
-
362
- # Inverse transform classification predictions.
363
- dx['col_change'] = loaded_label_encoder['Change_color_value'].inverse_transform(dx['col_change'])
364
- dx['cts_change'] = loaded_label_encoder['Change_cts_value'].inverse_transform(dx['cts_change'])
365
- dx['cut_change'] = loaded_label_encoder['Change_cut_value'].inverse_transform(dx['cut_change'])
366
- dx['qua_change'] = loaded_label_encoder['Change_quality_value'].inverse_transform(dx['qua_change'])
367
- dx['shp_change'] = loaded_label_encoder['Change_shape_value'].inverse_transform(dx['shp_change'])
368
- dx['Change_Blk_Eng_to_Mkbl_value'] = loaded_label_encoder['Change_Blk_Eng_to_Mkbl_value'].inverse_transform(dx['Change_Blk_Eng_to_Mkbl_value'])
369
- dx['Change_Wht_Eng_to_Mkbl_value'] = loaded_label_encoder['Change_Wht_Eng_to_Mkbl_value'].inverse_transform(dx['Change_Wht_Eng_to_Mkbl_value'])
370
- dx['Change_Open_Eng_to_Mkbl_value'] = loaded_label_encoder['Change_Open_Eng_to_Mkbl_value'].inverse_transform(dx['Change_Open_Eng_to_Mkbl_value'])
371
- dx['Change_Pav_Eng_to_Mkbl_value'] = loaded_label_encoder['Change_Pav_Eng_to_Mkbl_value'].inverse_transform(dx['Change_Pav_Eng_to_Mkbl_value'])
372
- dx['Change_Blk_Eng_to_Grd_value'] = loaded_label_encoder['Change_Blk_Eng_to_Grd_value'].inverse_transform(dx['Change_Blk_Eng_to_Grd_value'])
373
- dx['Change_Wht_Eng_to_Grd_value'] = loaded_label_encoder['Change_Wht_Eng_to_Grd_value'].inverse_transform(dx['Change_Wht_Eng_to_Grd_value'])
374
- dx['Change_Open_Eng_to_Grd_value'] = loaded_label_encoder['Change_Open_Eng_to_Grd_value'].inverse_transform(dx['Change_Open_Eng_to_Grd_value'])
375
- dx['Change_Pav_Eng_to_Grd_value'] = loaded_label_encoder['Change_Pav_Eng_to_Grd_value'].inverse_transform(dx['Change_Pav_Eng_to_Grd_value'])
376
- dx['Change_Blk_Eng_to_ByGrd_value'] = loaded_label_encoder['Change_Blk_Eng_to_ByGrd_value'].inverse_transform(dx['Change_Blk_Eng_to_ByGrd_value'])
377
- dx['Change_Wht_Eng_to_ByGrd_value'] = loaded_label_encoder['Change_Wht_Eng_to_ByGrd_value'].inverse_transform(dx['Change_Wht_Eng_to_ByGrd_value'])
378
- dx['Change_Open_Eng_to_ByGrd_value'] = loaded_label_encoder['Change_Open_Eng_to_ByGrd_value'].inverse_transform(dx['Change_Open_Eng_to_ByGrd_value'])
379
- dx['Change_Pav_Eng_to_ByGrd_value'] = loaded_label_encoder['Change_Pav_Eng_to_ByGrd_value'].inverse_transform(dx['Change_Pav_Eng_to_ByGrd_value'])
380
- dx['Change_Blk_Eng_to_Gia_value'] = loaded_label_encoder['Change_Blk_Eng_to_Gia_value'].inverse_transform(dx['Change_Blk_Eng_to_Gia_value'])
381
- dx['Change_Wht_Eng_to_Gia_value'] = loaded_label_encoder['Change_Wht_Eng_to_Gia_value'].inverse_transform(dx['Change_Wht_Eng_to_Gia_value'])
382
- dx['Change_Open_Eng_to_Gia_value'] = loaded_label_encoder['Change_Open_Eng_to_Gia_value'].inverse_transform(dx['Change_Open_Eng_to_Gia_value'])
383
- dx['Change_Pav_Eng_to_Gia_value'] = loaded_label_encoder['Change_Pav_Eng_to_Gia_value'].inverse_transform(dx['Change_Pav_Eng_to_Gia_value'])
384
-
385
- '''
386
-
387
  # Final return with full data for pagination.
388
- return df_pred, df_pred
389
  except Exception as e:
390
  print(f'Error processing file: {e}', 'error')
391
  return pd.DataFrame(), pd.DataFrame()
@@ -437,4 +355,4 @@ def download_class():
437
  return send_file(CLASS_OUTPUT_FILE, as_attachment=True)
438
 
439
  if __name__ == "__main__":
440
- app.run(debug=True)
 
79
  # ------------------------------
80
 
81
  # Prediction analysis models loaded from Hugging Face.
 
 
 
 
 
 
 
 
82
 
 
83
  src_path = hf_hub_download(
84
  repo_id="WebashalarForML/Diamond_model_",
85
+ filename="models_list/mkble/DecisionTree_best_pipeline_mkble_0_to_0.99_al.pkl",
86
  cache_dir=MODEL_FOLDER
87
  )
88
+ dst_path = os.path.join(MODEL_FOLDER, "DecisionTree_best_pipeline_mkble_0_to_0.99_al.pkl")
89
  shutil.copy(src_path, dst_path)
90
+ makable_model_0 = load(dst_path)
 
91
 
92
  src_path = hf_hub_download(
93
  repo_id="WebashalarForML/Diamond_model_",
94
+ filename="models_list/mkble/DecisionTree_best_pipeline_mkble_1_to_1.49.pkl",
95
  cache_dir=MODEL_FOLDER
96
  )
97
+ dst_path = os.path.join(MODEL_FOLDER, "DecisionTree_best_pipeline_mkble_1_to_1.49.pkl")
98
  shutil.copy(src_path, dst_path)
99
+ makable_model_1 = load(dst_path)
 
100
 
101
+ # Prediction analysis models loaded from Hugging Face.
102
  src_path = hf_hub_download(
103
  repo_id="WebashalarForML/Diamond_model_",
104
+ filename="models_list/mkble/DecisionTree_best_pipeline_mkble_1.50_to_1.99.pkl",
105
  cache_dir=MODEL_FOLDER
106
  )
107
+ dst_path = os.path.join(MODEL_FOLDER, "DecisionTree_best_pipeline_mkble_1.50_to_1.99.pkl")
108
  shutil.copy(src_path, dst_path)
109
+ makable_model_2 = load(dst_path)
 
110
 
111
  #classsification model on the task
112
  src_path = hf_hub_download(
 
118
  shutil.copy(src_path, dst_path)
119
  mkble_amt_class_model = load(dst_path)
120
 
121
+ #print("makable_model type:", type(makable_model))
 
 
 
122
  #print("grade_model type:", type(grade_model))
123
  #print("bygrade_model type:", type(bygrade_model))
124
  #print("gia_model type:", type(gia_model))
125
  print("================================")
126
  print("mkble_amt_class_model type:", type(mkble_amt_class_model))
127
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
128
  # List of label encoder names.
129
  encoder_list = [
130
  'Tag', 'EngShp', 'EngQua', 'EngCol', 'EngCut', 'EngPol', 'EngSym', 'EngFlo',
 
218
 
219
  # Create two DataFrames: one for prediction and one for classification.
220
  df_pred = df[required_columns].copy()
221
+ #df_pred = df_pred[(df_pred[['EngCts']] > 0.99).all(axis=1) & (df_pred[['EngCts']] < 1.50).all(axis=1)]
222
  df_pred[['EngBlk', 'EngWht', 'EngOpen', 'EngPav']]=df_pred[['EngBlk', 'EngWht', 'EngOpen', 'EngPav']].fillna("NA")
223
  df_class = df[required_columns_2].fillna("NA").copy()
224
 
 
250
  # Prediction Report Section
251
  # -------------------------
252
  try:
253
+
254
+ # for model 0 to 0.99
255
+ df_pred_0 = df_pred[(df_pred[['EngCts']] > 0.00).all(axis=1) & (df_pred[['EngCts']] < 0.99).all(axis=1)]
256
+ df_pred_0['change_in_amt_mkble'] = pd.DataFrame(mkble_amt_class_model.predict(df_pred_0), columns=["pred_change_in_eng_to_mkble"])
257
+ print(df_pred_0.columns)
258
+ df_pred_0 = df_pred_0[['Tag', 'EngCts', 'EngShp', 'EngQua', 'EngCol', 'EngCut', 'EngPol',
 
259
  'EngSym', 'EngFlo', 'EngNts', 'EngMikly', 'EngBlk', 'EngWht', 'EngOpen',
260
  'EngPav', 'EngAmt',
261
  'change_in_amt_mkble'
262
  ]]
263
+ df_pred_0['Makable_Predicted'] = pd.DataFrame(np.expm1(makable_model_0.predict(df_pred_0)), columns=["Predicted"])
264
+ print(df_pred_0.columns)
265
+
266
+ # for model 1 to 1.49
267
+
268
+ df_pred_1 = df_pred[(df_pred[['EngCts']] > 0.99).all(axis=1) & (df_pred[['EngCts']] < 1.50).all(axis=1)]
269
+ df_pred_1['change_in_amt_mkble'] = pd.DataFrame(mkble_amt_class_model.predict(df_pred_1), columns=["pred_change_in_eng_to_mkble"])
270
+ print(df_pred_1.columns)
271
+ df_pred_1 = df_pred_1[['Tag', 'EngCts', 'EngShp', 'EngQua', 'EngCol', 'EngCut', 'EngPol',
272
+ 'EngSym', 'EngFlo', 'EngNts', 'EngMikly', 'EngBlk', 'EngWht', 'EngOpen',
273
+ 'EngPav', 'EngAmt',
274
+ 'change_in_amt_mkble'
275
+ ]]
276
+ df_pred_1['Makable_Predicted'] = pd.DataFrame(np.expm1(makable_model_1.predict(df_pred_1)), columns=["Predicted"])
277
+ print(df_pred_1.columns)
278
+
279
+ # for model 1.50 to 1.99
280
+
281
+ df_pred_2 = df_pred[(df_pred[['EngCts']] > 1.49).all(axis=1) & (df_pred[['EngCts']] < 2.00).all(axis=1)]
282
+ df_pred_2['change_in_amt_mkble'] = pd.DataFrame(mkble_amt_class_model.predict(df_pred_2), columns=["pred_change_in_eng_to_mkble"])
283
+ print(df_pred_2.columns)
284
+ df_pred_2 = df_pred_2[['Tag', 'EngCts', 'EngShp', 'EngQua', 'EngCol', 'EngCut', 'EngPol',
285
+ 'EngSym', 'EngFlo', 'EngNts', 'EngMikly', 'EngBlk', 'EngWht', 'EngOpen',
286
+ 'EngPav', 'EngAmt',
287
+ 'change_in_amt_mkble'
288
+ ]]
289
+ df_pred_2['Makable_Predicted'] = pd.DataFrame(np.expm1(makable_model_2.predict(df_pred_2)), columns=["Predicted"])
290
+ print(df_pred_2.columns)
291
+
292
+
293
+ df_pred_main = pd.concat([df_pred_0, df_pred_1, df_pred_2])
294
+ df_pred_main['Makable_Diff'] = df_pred_main['EngAmt'] - df_pred_main['Makable_Predicted']
295
 
296
  for col in ['Tag', 'EngShp', 'EngQua', 'EngCol', 'EngCut', 'EngPol', 'EngSym', 'EngFlo', 'EngNts', 'EngMikly','EngBlk', 'EngWht', 'EngOpen', 'EngPav']:
297
  try:
298
+ df_pred_main[col] = loaded_label_encoder[col].inverse_transform(df_pred_main[col].astype(int))
299
  except ValueError as e:
300
  print(f'inverse transform fails value in column {col}: {e}', 'error')
301
 
302
  except ValueError as e:
303
  print(f'pred model error----->: {e}', 'error')
304
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
305
  # Final return with full data for pagination.
306
+ return df_pred_main, df_pred_main
307
  except Exception as e:
308
  print(f'Error processing file: {e}', 'error')
309
  return pd.DataFrame(), pd.DataFrame()
 
355
  return send_file(CLASS_OUTPUT_FILE, as_attachment=True)
356
 
357
  if __name__ == "__main__":
358
+ app.run(debug=True)