from flask import Flask, request, jsonify, render_template import joblib import pandas as pd import warnings warnings.filterwarnings('ignore') # Compatibility patch for sklearn 1.6.1 pickles on newer sklearn from sklearn.compose import _column_transformer class _RemainderColsList(list): def __init__(self, columns, future_dtype=None): super().__init__(columns) self.future_dtype = future_dtype _column_transformer._RemainderColsList = _RemainderColsList app = Flask(__name__) preprocessor = joblib.load('preprocessor1.pkl') model = joblib.load('randomforestmodel.pkl') TRANSACTION_TYPES = ['CASH_IN', 'CASH_OUT', 'DEBIT', 'PAYMENT', 'TRANSFER'] @app.route('/') def index(): return render_template('index.html') @app.route('/predict', methods=['POST']) def predict(): try: d = request.get_json() old_org = float(d['oldbalanceOrg']) new_org = float(d['newbalanceOrig']) old_dest = float(d['oldbalanceDest']) new_dest = float(d['newbalanceDest']) amount = float(d['amount']) err_orig = old_org - amount - new_org err_dest = new_dest - old_dest - amount df = pd.DataFrame([{ 'step': float(d['step']), 'type': d['type'], 'amount': amount, 'oldbalanceOrg': old_org, 'newbalanceOrig': new_org, 'oldbalanceDest': old_dest, 'newbalanceDest': new_dest, 'errorBalanceOrig': err_orig, 'errorBalanceDest': err_dest, }]) X = preprocessor.transform(df) proba = model.predict_proba(X)[0] return jsonify({ 'legit_prob': round(float(proba[0]) * 100, 2), 'fraud_prob': round(float(proba[1]) * 100, 2), 'error_balance_orig': round(err_orig, 2), 'error_balance_dest': round(err_dest, 2), }) except Exception as e: return jsonify({'error': str(e)}), 400 if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=False)