import json import xgboost as xgb import pickle import pandas as pd import numpy as np def predict(json_input:str): with open('app/metadata.pkl','rb') as f: to_remove,use_small,evacuations,encoders = pickle.load(f) data = pd.DataFrame(json.loads(json_input[1:-1]),index=[0]) data.drop(columns=['dateandtime','skiarea_id','day_of_year','minute_of_day','year'], inplace=True, errors='ignore') ##evacuation_vehicles must be explicitated and workaround for other! evacuation = data.evacuation_vehicles.values[0] if isinstance(evacuation,str): evacuation = [evacuation] for c in evacuations: data[c] = False for c in evacuation: data[c] = True for c in evacuation: if c not in evacuations: data['other'] = True break data.drop(columns=['town','province','evacuation_vehicles'],inplace=True, errors='ignore') data['age'] = data['age'].astype(np.float32) for c in data.columns: if c not in ['india','age','season','skiarea_name','destination']: data[c] = data[c].astype('str') if use_small: for c in to_remove.keys(): for k in to_remove[c]: data.loc[data[c]==k,c] = 'other' for c in data.columns: if c not in ['age','season','skiarea_name','india']: data[c] = data[c].fillna('None') if use_small: data[c] = pd.Categorical( encoders['small'][c].transform(data[c]), categories=list(range(len(encoders['small'][c].classes_))), ordered=False) else: data[c] = pd.Categorical( encoders['normal'][c].transform(data[c]), categories=list(range(len(encoders['normal'][c].classes_))), ordered=False) bst_FS = xgb.Booster() bst_FS.load_model("app/model.json") dtest_FS = xgb.DMatrix(data[bst_FS.feature_names],enable_categorical=True) preds = bst_FS.predict(dtest_FS) return preds[0]*100