From ead9a776dae59a3bbff694f3adf5b89dc4808bc0 Mon Sep 17 00:00:00 2001 From: admin user Date: Wed, 12 Mar 2025 16:12:18 +0000 Subject: [PATCH] Advanced M series V1 model block --- README.md | 4 +- block.py | 189 ++++++++++++++++++++++++--- category_orders_train.json | 88 +++++++++++++ post_processing.py | 25 ++++ pre_processing.py | 254 +++++++++++++++++++++++++++++++++++++ processing.py | 46 +++++++ request_schema.json | 96 +++++++++++++- requirements.txt | 7 +- response_schema.json | 35 ++++- test_block.py | 45 +++++++ xgboost_model.joblib | Bin 0 -> 452922 bytes 11 files changed, 767 insertions(+), 22 deletions(-) create mode 100644 category_orders_train.json create mode 100644 post_processing.py create mode 100644 pre_processing.py create mode 100644 processing.py create mode 100644 test_block.py create mode 100644 xgboost_model.joblib diff --git a/README.md b/README.md index 59a3efc..92008a8 100644 --- a/README.md +++ b/README.md @@ -1 +1,3 @@ -**Hello world!!!** +## Advanced M series V1 model block + +M Series Model trained on historical data to identify fraudulent patterns. \ No newline at end of file diff --git a/block.py b/block.py index 3b227f9..5da574a 100644 --- a/block.py +++ b/block.py @@ -1,21 +1,174 @@ -@flowx_block -def example_function(request: dict) -> dict: +import pandas as pd +import logging +import json +import jmespath +import regex as re +from pre_processing import pre_processing +from processing import processing +from post_processing import post_processing - # Processing logic here... +# Configure logging +logging.basicConfig( + level=logging.INFO, + format="%(asctime)s [%(levelname)s] %(name)s - %(message)s", +) +logger = logging.getLogger(__name__) - return { - "meta_info": [ - { - "name": "created_date", - "type": "string", - "value": "2024-11-05" - } + +def extract_value(blob, expression): + try: + return jmespath.search(expression, blob) + except Exception: + return None + +# Coalesce function to return the first non-None value +def coalesce(*args): + for value in args: + if value is not None: + return value + return None + +# New sanitize blob function +def sanitize_blob(blob): + try: + blob = re.sub(r'"(\w+)":"(\{[^}]+\})"', r'"\1":\2', blob) + blob = re.sub(r'"tps_vendor_raw_response"\s*:\s*"\?\{', '"tps_vendor_raw_response":{', blob) + blob = blob.replace('\\"', '"') + blob = blob.replace('\\n', '') + blob = blob.replace('\\t', '') + blob = blob.replace('\\\\', '') + blob = re.sub(r'(\}\})"', r'\1', blob) + blob = re.sub(r',\s*([\}\]])', r'\1', blob) + return json.loads(blob) + except json.JSONDecodeError as e: + logger.error(f"JSON Decode Error: {e}") + error_pos = e.pos + snippet = blob[max(0, error_pos - 50): error_pos + 50] + logger.error(f"Error near:\n{snippet}") + return None +#---------------- Sanitise ends here + +# Function to extract a value using JMESPath +# Expressions to extract values +expressions = { + "first_seen_days": [ + "tps_vendor_raw_response.query.results[0].first_seen_days", + "emailage.emailriskscore.first_seen_days" ], - "fields": [ - { - "name": "", - "type": "", - "value": "" - } - ] - } + "ea_score": [ + "tps_vendor_raw_response.query.results[0].EAScore", + "emailage.emailriskscore.eascore" + ], + "email_creation_days": [ + "tps_vendor_raw_response.query.results[0].email_creation_days" + ], + "summary_risk_score": ["summary_risk_score"], + "digital_id_trust_score_rating": ["digital_id_trust_score_rating"], + "os_version": ["os_version"], + "account_email_worst_score": ["account_email_worst_score"], + "true_ip_score": ["true_ip_score"], + "ip_net_speed_cell": [ + "tps_vendor_raw_response.query.results[0].ip_netSpeedCell", + # "true_ip_connection_type" + ], + "account_email_score": ["account_email_score"], + "true_ip_worst_score": ["true_ip_worst_score"], + "proxy_ip_worst_score": ["proxy_ip_worst_score"], + "proxy_ip_score": ["proxy_ip_score"], + "fuzzy_device_score": ["fuzzy_device_score"], + "ip_region_confidence": ["tps_vendor_raw_response.query.results[0].ip_regionconf"], + "true_ip_state_confidence": ["true_ip_state_confidence"], + "fuzzy_device_worst_score": ["fuzzy_device_worst_score"], + "digital_id_confidence_rating": ["digital_id_confidence_rating"] +} + + +def __main__( + #Application-> + application_key: str, + application_timestamp: str, + application_ssn : str, + application_email_address: str, + application_bank_account_number: str, + application_is_rejected: str, + application_date_of_birth: str, + #uprovaloanapplication-> + educationlevel:str, + employmentstatus: str, + lengthatbank: str, + lengthatjob: str, + ownhome: str, + payfrequency: str, + monthsatresidence: str, + #thxresponse-> + EventType: str, + DigitalIdConfidence: str, + RiskRating: str, + TmxSummaryReasonCode: str, + TrueIpGeo: str, + Blob:str, + DeviceId:str, + FuzzyDeviceId: str + ) -> dict: + + # Convert input parameters into a flat dictionary + data = { + "application_key" : application_key, + "application_timestamp" : application_timestamp, + "application_ssn " : application_ssn , + "application_email_address" : application_email_address, + "application_bank_account_number" : application_bank_account_number, + "application_is_rejected" : application_is_rejected, + "application_date_of_birth" : application_date_of_birth, + "educationlevel" : educationlevel, + "employmentstatus" : employmentstatus, + "lengthatbank" : lengthatbank, + "lengthatjob" : lengthatjob, + "ownhome" : ownhome, + "payfrequency" : payfrequency, + "monthsatresidence" : monthsatresidence, + "EventType" : EventType, + "DigitalIdConfidence" : DigitalIdConfidence, + "RiskRating" : RiskRating, + "TmxSummaryReasonCode" : TmxSummaryReasonCode, + "TrueIpGeo" : TrueIpGeo, + "Blob" : Blob, + "DeviceId" : DeviceId, + "FuzzyDeviceId" : FuzzyDeviceId + } + + # Convert dictionary to a single-row DataFrame + combined_df = pd.DataFrame([data]) + combined_df.columns = combined_df.columns.str.lower() + combined_df["application_email_address"] = combined_df["application_email_address"].str.lower() + if Blob: + combined_df["blob"] = combined_df["blob"].apply(sanitize_blob) + + # Step 2: Extract values using the expressions dictionary + for column, expressions_list in expressions.items(): + combined_df[column] = combined_df["blob"].apply(lambda x: coalesce(*[extract_value(x, expr) for expr in expressions_list])) + + logger.info("pre_flowx data") + logger.info(combined_df.iloc[0].drop('blob').to_dict()) + else: + for column, expressions_list in expressions.items(): + combined_df[column] = None + logger.info("pre_flowx data") + logger.info(combined_df.iloc[0].to_dict()) + pre_processed_data = pre_processing(combined_df) + # logger.info(f"pre_processed_data: {pre_processed_data}") + logger.info("pre_processed data") + logger.info(pre_processed_data.iloc[0].to_dict()) + df = processing(pre_processed_data) + logger.info("procesed_data") + logger.info(df.iloc[0].to_dict()) + df["application_timestamp"] = df["application_timestamp"].astype(str) + # logger.info("prediction: %.8f", float(df['prediction'].iloc[0])) + result = post_processing(df) + # logger.info("Score: %.0f", float(result["hd_score_m1"])) + logger.info(result) + + return result + +# testing : +# __main__ diff --git a/category_orders_train.json b/category_orders_train.json new file mode 100644 index 0000000..61818df --- /dev/null +++ b/category_orders_train.json @@ -0,0 +1,88 @@ +{ +"employmentstatus": [ + "disability", + "fixed income", + "full time employed", + "other", + "part time employment", + "retired benefits", + "self employed", + "student", + "unemployed", + "welfare" + ], + "TrueIpGeo": [ + "other", + "us" + ], + "digital_id_trust_score_rating": [ + "high", + "low", + "neutral", + "very_high", + "very_low" + ], + "educationlevel": [ + "associate's degree", + "bachelor's degree", + "doctorate", + "high school", + "master's degree", + "other" + ], + "os_version": [ + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "8", + "9", + "unknown" + ], + "ip_net_speed_cell": [ + "broadband", + "cable", + "dialup", + "dsl", + "fixed wireless", + "mobile", + "mobile wireless", + "ocx", + "satellite", + "t1", + "tx", + "wireless", + "xdsl" + ], + "day_night": [ + "Day", + "Night" + ], + "digital_id_confidence_rating": [ + "high", + "medium", + "very_high", + "very_low" + ], + "RiskRating": [ + "high", + "low", + "medium", + "neutral", + "trusted" + ], + "payfrequency": [ + "biweekly", + "semimonthly" + ], + "ownhome": [ + "false", + "true" + ] + +} \ No newline at end of file diff --git a/post_processing.py b/post_processing.py new file mode 100644 index 0000000..ca0bd93 --- /dev/null +++ b/post_processing.py @@ -0,0 +1,25 @@ +import logging +import numpy as np + +# Configure logging +logging.basicConfig( + level=logging.INFO, + format="%(asctime)s [%(levelname)s] %(name)s - %(message)s", +) +logger = logging.getLogger(__name__) + + +def post_processing(df): + + try: + df['hd_score_m1'] = np.round( + np.minimum(df['prediction'] * 100 + 0.00001, 1) * 85 + + np.maximum(np.log2(df['prediction'] * 100 + 0.000001) * 185, 0), + 0 + ) + logging.info(f"hd_score_m1 calculated: {df['hd_score_m1'].iloc[0]}") + except Exception as e: + logging.error(f"Error processing hd_score_m1 calculations: {e}") + + + return df[['application_key', 'application_timestamp', 'deviceid', 'fuzzydeviceid', 'application_email_address', 'hd_score_m1']].iloc[0].to_dict() diff --git a/pre_processing.py b/pre_processing.py new file mode 100644 index 0000000..29712b6 --- /dev/null +++ b/pre_processing.py @@ -0,0 +1,254 @@ +import pandas as pd +import numpy as np +import logging + +# Configure logging +logging.basicConfig( + level=logging.INFO, + format="%(asctime)s [%(levelname)s] %(name)s - %(message)s", +) +logger = logging.getLogger(__name__) + + +def pre_processing(data_df): + + # combined_df = pd.DataFrame([input_data]) + # data = pd.DataFrame(data) + combined_df = data_df + combined_df["applicant_age"] = combined_df.apply(lambda row: pd.to_datetime(row["application_timestamp"]).year - pd.to_datetime(row["application_date_of_birth"]).year if pd.notnull(row["application_timestamp"]) and pd.notnull(row["application_date_of_birth"]) else None,axis=1 + ) + + # Extracting Temporal features + combined_df['application_timestamp'] = pd.to_datetime(combined_df["application_timestamp"]) + combined_df.loc[:, 'application_time'] = pd.to_datetime(combined_df['application_timestamp']).dt.time + + combined_df['day'] = combined_df['application_timestamp'].dt.day + combined_df['day_of_week'] = combined_df['application_timestamp'].dt.weekday # 0=Monday, 6=Sunday + + combined_df['day_sin'] = np.sin(2 * np.pi * combined_df['day'] / 31) + combined_df['day_cos'] = np.cos(2 * np.pi * combined_df['day'] / 31) + combined_df['day_of_week_sin'] = np.sin(2 * np.pi * combined_df['day_of_week'] / 7) + combined_df['day_of_week_cos'] = np.cos(2 * np.pi * combined_df['day_of_week'] / 7) + + # combined_df['is_weekend'] = combined_df['day_of_week'].apply(lambda x: 1 if x >= 5 else 0) + + # Create a day/night variable + def classify_day_night(hour): + if 6 <= hour < 18: + return 'Day' + else: + return 'Night' + + # Extract hour from application_time + combined_df['hour'] = combined_df['application_time'].apply(lambda x: x.hour if pd.notnull(x) else np.nan) + combined_df['day_night'] = combined_df['hour'].apply(lambda hour: classify_day_night(hour) if pd.notnull(hour) else 'Unknown') + + # combined_df['os_version'] = combined_df['os_version'].str.replace(r'[^a-zA-Z0-9]', '_', regex=True) + combined_df['os_version'] = combined_df['os_version'].apply(lambda x: x.split('.')[0] if isinstance(x, str) and '.' in x + else x.split('_')[0] if isinstance(x, str) and '_' in x + else x) + + + # Datatype conversions + # combined_df['Level_1_Link_Accept'] = combined_df['tmxsummaryreasoncode'].astype(str).str.contains('Level_1_Link_Accept', na=False, regex=True).astype(int) + combined_df['Identity_Negative_History'] = combined_df['tmxsummaryreasoncode'].astype(str).str.contains('Identity_Negative_History', na=False, regex=True).astype(int) + combined_df['Device_Negative_History'] = combined_df['tmxsummaryreasoncode'].astype(str).str.contains('Device_Negative_History', na=False, regex=True).astype(int) + combined_df['Level_1_Link_Reject'] = combined_df['tmxsummaryreasoncode'].astype(str).str.contains('Level_1_Link_Reject', na=False, regex=True).astype(int) + combined_df['IP_Negative_History'] = combined_df['tmxsummaryreasoncode'].astype(str).str.contains('IP_Negative_History', na=False, regex=True).astype(int) + combined_df['Identity_Spoofing'] = combined_df['tmxsummaryreasoncode'].astype(str).str.contains('Identity_Spoofing', na=False, regex=True).astype(int) + # combined_df['Bot'] = combined_df['tmxsummaryreasoncode'].astype(str).str.contains('Bot', na=False, regex=True).astype(int) + + combined_df['digitalidconfidence'] = pd.to_numeric(combined_df['digitalidconfidence'], errors='coerce').astype('Int64') + + # Rename Columns if Required + combined_df.rename(columns={ + 'DigitalIdConfidence': 'digitalidconfidence', + # 'inputipaddress_consistency': 'inputip_consistency', + # 'requestid_consistency': 'request_consistency', + # Add others as required if present in your DataFrame and needing renaming. + }, inplace=True) + + # #Testing : remove below + # combined_df.to_csv('op-pre-processing_intermediate.csv', index=False) + + dtype_dict = { + "applicant_age" : int, + "digitalidconfidence" : float, + "first_seen_days" : float, + "employmentstatus" : str, + "ea_score" : float, + "trueipgeo" : str, + "hour" : int, + "email_creation_days" : float, + "lengthatjob" : float, + "day_cos" : float, + "summary_risk_score" : float, + "digital_id_trust_score_rating" : str, + "day" : 'int32', + "lengthatbank" : float, + "day_of_week_cos" : float, + "Level_1_Link_Reject" : int, + "Identity_Negative_History" : int, + "educationlevel" : str, + "os_version" : str, + "account_email_worst_score" : float, + "true_ip_score" : float, + "ip_net_speed_cell" : str, + "account_email_score" : float, + "day_of_week" : 'int32', + "true_ip_worst_score" : float, + "proxy_ip_worst_score" : float, + "day_night" : str, + "proxy_ip_score" : float, + "monthsatresidence" : float, + "Device_Negative_History" : int, + "fuzzy_device_score" : float, + "day_sin" : float, + "ip_region_confidence" : float, + "true_ip_state_confidence" : float, + "IP_Negative_History" : int, + "fuzzy_device_worst_score" : float, + "digital_id_confidence_rating" : str, + "day_of_week_sin" : float, + "riskrating" : str, + "payfrequency" : str, + "ownhome" : str, + "Identity_Spoofing" : int + } + + next_block_cols = ['application_key', 'application_timestamp', 'deviceid', 'fuzzydeviceid', 'application_email_address'] + cols_to_keep = [col for col in dtype_dict.keys() if col in combined_df.columns] + + final_cols = list(set(next_block_cols).union(set(cols_to_keep))) + # Type casting + for col, dtype in dtype_dict.items(): + if col in combined_df.columns: + if dtype == int: + combined_df[col] = pd.to_numeric(combined_df[col], errors='coerce', downcast='integer') + elif dtype == float: + combined_df[col] = pd.to_numeric(combined_df[col], errors='coerce', downcast='float') + elif dtype == str: + combined_df[col] = combined_df[col].astype(str) + # cross check data type + capping_dict = { + "applicant_age": (18, 93), + "digitalidconfidence": (0, 9017), + "first_seen_days": (0, 10486), + "ea_score": (1, 930), + "hour": (0, 23), + "email_creation_days": (2438, 9661), + "lengthatjob": (1, 24), + "day_cos": (-0.9948693234, 1), + "summary_risk_score": (-100, 30), + "day": (1, 31), + "lengthatbank": (0, 25), + "day_of_week_cos": (-0.9009688679, 1), + "Level_1_Link_Reject": (0, 1), + "Identity_Negative_History": (0, 1), + "account_email_worst_score": (-52, 0), + "true_ip_score": (-38, 49), + "account_email_score": (-18, 9), + "day_of_week": (0, 6), + "true_ip_worst_score": (-100, 0), + "proxy_ip_worst_score": (-100, 0), + "proxy_ip_score": (-29, 60), + "monthsatresidence": (0, 25), + "Device_Negative_History": (0, 1), + "fuzzy_device_score": (-29, 14), + "day_sin": (-0.9987165072, 0.9987165072), + "ip_region_confidence": (75, 99), + # "true_ip_state_confidence": (5, 98), + "IP_Negative_History": (0, 1), + "fuzzy_device_worst_score": (-100, 0), + "day_of_week_sin": (-0.9749279122, 0.9749279122), + "Identity_Spoofing": (0, 1), + } + + + + # Apply capping + for column, (cap_min, cap_max) in capping_dict.items(): + if column in combined_df.columns: + combined_df[column] = combined_df[column].clip(lower=cap_min, upper=cap_max) + + + def handle_unknowns(X, column, known_values, default_treatment=None): + if column not in X.columns: + return X # Return X to avoid NoneType error + known_values = {str(val).lower() for val in known_values} + invalid_values = {None, "none", "nan", pd.NA} + X[column] = X[column].apply( + lambda x: str(x).lower() if pd.notna(x) and str(x).lower() in known_values + else (default_treatment if pd.notna(x) and str(x).lower() not in invalid_values else np.nan) + ) + return X # Always return the DataFrame + + + + + unknown_treatments = { + "employmentstatus": { + "valid_values": [ + "disability", "fixed income", "full time employed", "part time employment", + "retired benefits", "self employed", "student", "unemployed", "welfare" + ], + "default_treatment": "other" + }, + "trueipgeo": { + "valid_values": ["US"], + "default_treatment": "other" + }, + "digital_id_trust_score_rating": { + "valid_values": ["very_high", "high", "neutral", "low"], + "default_treatment": "very_low" + }, + "educationlevel": { + "valid_values": ["associate's degree", "bachelor's degree", "doctorate", "high school", "master's degree"], + "default_treatment": "other" + }, + "os_version": { + "valid_values": [ + '18', '17', '16', '15', '14', '13', '12', '11', '10', '9', '8' + ], + "default_treatment": 'unknown' + }, + "ip_net_speed_cell": { + "valid_values": [ + "broadband", "cable", "dialup", "dsl", "fixed wireless", "mobile", "mobile wireless", "ocx", "satellite", + "t1", "tx", "wireless", "xdsl" + ], + "default_treatment": "mobile" + }, + "digital_id_confidence_rating": { + "valid_values": ["high", "medium", "very_high"], + "default_treatment": "very_low" + }, + "riskrating": { + "valid_values": ["low", "medium", "neutral", "trusted"], + "default_treatment": "high" + }, + "ownhome": { + "valid_values": ["true", "false"], + "default_treatment": np.nan + }, + } + + for column, treatment in unknown_treatments.items(): + combined_df = handle_unknowns(combined_df, column, treatment["valid_values"], treatment["default_treatment"]) + + payfrequency_map = { + "biweekly": ["biweekly", "bi-weekly", "bi weekly", "bw"], + "semimonthly": ["semi-monthly", "semimonthly"] + } + + combined_df['payfrequency'] = combined_df['payfrequency'].apply( + lambda x: next((key for key, values in payfrequency_map.items() if str(x).lower() in values), np.nan) + ) + + return combined_df[final_cols] + + + + + + diff --git a/processing.py b/processing.py new file mode 100644 index 0000000..45b23c1 --- /dev/null +++ b/processing.py @@ -0,0 +1,46 @@ +import pandas as pd +import numpy as np +import xgboost as xgb +import joblib +import json + + +def processing(input_data): + df = pd.DataFrame(input_data) + + # Load Model + model_path = "./xgboost_model.joblib" + # model_path = "C:/Users/abinisha/habemco_flowx/m1_v1/xgboost_model.joblib" + model = joblib.load(model_path) + df.rename(columns={'riskrating': 'RiskRating', 'trueipgeo': 'TrueIpGeo'}, inplace=True) + + # Load Category Orders + category_orders_path ="./category_orders_train.json" + # category_orders_path = "C:/Users/abinisha/habemco_flowx/m1_v1/category_orders_train.json" + with open(category_orders_path, 'r') as f: + category_orders = json.load(f) + + if df.empty: + raise ValueError("Input DataFrame is empty.") + + + # Ensure all expected features exist + expected_features = model.feature_names + + + for col, categories in category_orders.items(): + df[col].replace([None, "", "null", np.nan, "nan", " "], np.nan, inplace=True) + df[col] = pd.Categorical(df[col], categories=categories, ordered=True) + + # missing_features = [feature for feature in expected_features if feature not in df.columns] + # for feature in missing_features: + # df[feature] = np.nan # Use NaN to avoid dtype issues + + # Create XGBoost DMatrix + dmatrix = xgb.DMatrix(df[expected_features], enable_categorical=True, missing=np.nan) + + # Make predictions + predictions = model.predict(dmatrix) + df['prediction'] = predictions + + return df diff --git a/request_schema.json b/request_schema.json index 0967ef4..73d1e51 100644 --- a/request_schema.json +++ b/request_schema.json @@ -1 +1,95 @@ -{} +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "application_key": { + "type": ["string", "null"], + "description": "Unique identifier for the application." + }, + "application_timestamp": { + "type": ["string", "null"], + "description": "Timestamp when the application was submitted in UTC." + }, + "application_ssn": { + "type": ["string", "null"], + "description": "Social Security Number of the applicant." + }, + "application_email_address": { + "type": ["string", "null"], + "description": "Email address of the applicant." + }, + "application_bank_account_number": { + "type": ["string", "null"], + "description": "Bank account number of the applicant." + }, + "application_is_rejected": { + "type": ["boolean", "null"], + "description": "Indicates whether the application was rejected." + }, + "application_date_of_birth": { + "type": ["string", "null"], + "description": "Date of birth of the applicant." + }, + "EventType": { + "type": ["string", "null"], + "description": "Type of event associated with the application." + }, + "RiskRating": { + "type": ["string", "null"], + "description": "Risk rating assigned to the application." + }, + "TmxSummaryReasonCode": { + "type": ["string", "null"], + "description": "Reason code summary from third-party risk assessment." + }, + "DigitalIdConfidence": { + "type": ["string", "null"], + "description": "Confidence score for the digital identity of the applicant." + }, + "TrueIpGeo": { + "type": ["string", "null"], + "description": "Geolocation information of the true IP address used in the application." + }, + "Blob": { + "type": ["string", "null"], + "description": "Raw data blob containing additional information related to the application." + }, + "DeviceId": { + "type": ["string", "null"], + "description": "Unique identifier for the device used to submit the application." + }, + "FuzzyDeviceId": { + "type": ["string", "null"], + "description": "Hashed or partially anonymized identifier for the device." + }, + "ownhome": { + "type": ["boolean", "null"], + "description": "Indicates whether the applicant owns a home." + }, + "employmentstatus": { + "type": ["string", "null"], + "description": "Employment status of the applicant." + }, + "lengthatjob": { + "type": ["number", "null"], + "description": "Length of time (in months) the applicant has been at their current job." + }, + "payfrequency": { + "type": ["string", "null"], + "description": "Frequency of pay for the applicant (e.g., weekly, biweekly, monthly)." + }, + "lengthatbank": { + "type": ["string", "null"], + "description": "Length of time the applicant has been with their bank." + }, + "educationlevel": { + "type": ["string", "null"], + "description": "Highest level of education attained by the applicant." + }, + "monthsatresidence": { + "type": ["number", "null"], + "description": "Number of months the applicant has lived at their current residence." + } + }, + "required": [] +} diff --git a/requirements.txt b/requirements.txt index 0967ef4..049e4db 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,6 @@ -{} +pandas == 2.2.3 +numpy == 2.2.3 +xgboost == 2.1.4 +joblib == 1.4.2 +jmespath == 1.0.1 +regex == 2023.12.25 diff --git a/response_schema.json b/response_schema.json index 0967ef4..e03dd58 100644 --- a/response_schema.json +++ b/response_schema.json @@ -1 +1,34 @@ -{} +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "application_key": { + "type": ["string", "null"], + "description": "Application Key" + }, + "application_timestamp": { + "type": ["string", "null"], + "description": "Application Timestamp" + }, + "deviceid": { + "type": ["string", "null"], + "description": "Deviceid" + }, + "fuzzydeviceid": { + "type": ["string", "null"], + "description": "Fuzzy Deviceid" + }, + "application_email_address": { + "type": ["string", "null"], + "description": "Application Email Address" + }, + "hd_score_m1": { + "type": ["number", "null"], + "description": "HD Fraud Score M1" + }, + "action": { + "type": ["string", "null"], + "description": "Recommended Action." + } + } +} diff --git a/test_block.py b/test_block.py new file mode 100644 index 0000000..44a968a --- /dev/null +++ b/test_block.py @@ -0,0 +1,45 @@ +# Working test_block.py +import unittest +import pandas as pd +from block import __main__ + + +input_json = { + "application_key": "7DE3C940-7747-4EA8-B25F-3276BA05BA71", + "application_timestamp": "2024-12-25 15:20:45", + "application_ssn": "274728658", + "application_email_address": "kralldad40@gmail.com", + "application_bank_account_number": "7926569125.0", + "application_is_rejected": 'true', + "application_date_of_birth": "1976-08-19 00:00:00", + "EventType": "account_creation", + "RiskRating": "neutral", + "TmxSummaryReasonCode": "Level_1_Link_Accept", + "DigitalIdConfidence": "7554.0", + "TrueIpGeo": "US", + "Blob": """{\"account_address_city\":\"hamilton\",\"account_address_state\":\"oh\",\"account_address_street1\":\"100 horizon driv\",\"account_address_zip\":\"45013\",\"account_date_of_birth\":\"19760819\",\"account_email\":\"kralldad40@gmail.com\",\"account_email_activities\":[\"_TRUSTED_PROB\"],\"account_email_attributes\":[\"CONSUMER\",\"_TRUSTED_PROB\"],\"account_email_domain\":\"gmail.com\",\"account_email_first_seen\":\"2021-12-13\",\"account_email_last_event\":\"2024-12-25\",\"account_email_last_update\":\"2024-12-25\",\"account_email_result\":\"success\",\"account_email_score\":\"0\",\"account_email_worst_score\":\"0\",\"account_first_name\":\"ryan\",\"account_last_name\":\"krall\",\"account_login\":\"kralldad40@gmail.com\",\"account_login_activities\":[\"_TRUSTED_PROB\"],\"account_login_attributes\":[\"_TRUSTED_PROB\"],\"account_login_first_seen\":\"2021-12-13\",\"account_login_last_event\":\"2024-12-25\",\"account_login_last_update\":\"2024-12-25\",\"account_login_result\":\"success\",\"account_login_score\":\"0\",\"account_login_worst_score\":\"0\",\"account_name\":\"ryan_krall\",\"account_name_activities\":[\"_TRUSTED_PROB\"],\"account_name_attributes\":[\"_TRUSTED_PROB\"],\"account_name_first_seen\":\"2020-09-07\",\"account_name_last_event\":\"2024-12-25\",\"account_name_last_update\":\"2024-12-25\",\"account_name_result\":\"success\",\"account_name_score\":\"0\",\"account_name_worst_score\":\"0\",\"account_telephone\":\"5132132068\",\"account_telephone_activities\":[\"_TRUSTED_PROB\"],\"account_telephone_attributes\":[\"_TRUSTED_PROB\"],\"account_telephone_country_code\":\"1\",\"account_telephone_first_seen\":\"2021-12-22\",\"account_telephone_geo\":\"US\",\"account_telephone_is_possible\":\"yes\",\"account_telephone_is_valid\":\"yes\",\"account_telephone_last_event\":\"2024-12-25\",\"account_telephone_last_update\":\"2024-12-25\",\"account_telephone_result\":\"success\",\"account_telephone_score\":\"0\",\"account_telephone_type\":\"FIXED_LINE_OR_MOBILE\",\"account_telephone_worst_score\":\"0\",\"agent_model\":\"SM-A037U\",\"agent_publickey_hash\":\"24d6490c138b415a857c724ddbbd9f06c51a6c44\",\"agent_publickey_hash_result\":\"not found\",\"agent_publickey_hash_type\":\"web:ecdsa\",\"agent_type\":\"browser_mobile\",\"api_call_datetime\":\"2024-12-25 21:20:45.573\",\"api_caller_ip\":\"52.89.158.201\",\"api_caller_ip_geo\":\"US\",\"api_type\":\"session-query\",\"api_version\":\"15.5.2\",\"audio_context\":\"d250471a0c0de7f0578c965047b8a94f9f10804194ac35744729bb365910d8d4\",\"battery_status\":\"{\\\"level\\\":0.96,\\\"status\\\":\\\"unplugged\\\"}\",\"bb_assessment\":\"523.41\",\"bb_assessment_rating\":\"neutral\",\"bb_bot_rating\":\"low\",\"bb_bot_score\":\"500.00\",\"bb_fraud_rating\":\"neutral\",\"bb_fraud_score\":\"500.00\",\"behaviosec.confidence\":\"0.0000\",\"behaviosec.event_weight\":\"0.00\",\"behaviosec.pointing_device\":[\"touchscreen\"],\"behaviosec.population_profile.raw_features\":{\"accRes\":0,\"keyRes\":0,\"tAction\":6581,\"actRes\":975.17,\"mouseRes\":340.25,\"winFoc\":1,\"targets\":{\"checkbox#tribalOrdinance\":{\"foc2b\":1029},\"IFRAME#a-mbyvg7s3tdgr\":{\"foc2b\":64},\"checkbox#termsAgree\":{\"foc2b\":820}},\"tActive\":8539},\"behaviosec.recognition_ratio\":\"0.0000\",\"behaviosec.score\":\"500.0000\",\"behaviosec.userid\":\"kralldad40@gmail.com\",\"browser\":\"Chrome\",\"browser_language\":\"en-US,en;q=0.9\",\"browser_string\":\"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36\",\"browser_string_hash\":\"7e91326b17b5455769214abbd4472bb7\",\"browser_version\":\"131\",\"canvas_hash\":\"4ba987ec9909dc9f6f1aea8ce0057ba83dca6741\",\"challenger_policy\":\"FraudScoreCardModel\",\"challenger_policy_score\":\"-65\",\"challenger_reason_code\":[\"HabemcoFraudScore_65\",\"HabemcoFraudScore_64\",\"HabemcoFraudScore_63\",\"HabemcoFraudScore_62\",\"HabemcoFraudScore_61\",\"HabemcoFraudScore_60\",\"HabemcoFraudScore_59\",\"HabemcoFraudScore_58\",\"HabemcoFraudScore_57\",\"HabemcoFraudScore_56\",\"HabemcoFraudScore_55\",\"HabemcoFraudScore_54\",\"HabemcoFraudScore_53\",\"HabemcoFraudScore_52\",\"HabemcoFraudScore_51\",\"HabemcoFraudScore_50\",\"HabemcoFraudScore_45\",\"HabemcoFraudScore_40\",\"HabemcoFraudScore_35\",\"HabemcoFraudScore_30\",\"HabemcoFraudScore_25\",\"HabemcoFraudScore_20\",\"HabemcoFraudScore_15\",\"HabemcoFraudScore_10\",\"HabemcoFraudScore_05\"],\"challenger_request_duration\":\"0\",\"challenger_review_status\":\"pass\",\"challenger_risk_rating\":\"neutral\",\"champion_request_duration\":\"9\",\"cpu_clock\":\"10000\",\"cpu_cores\":\"8\",\"css_image_loaded\":\"yes\",\"device_activities\":[\"_TRUSTED_PROB\"],\"device_attributes\":[\"_TRUSTED_PROB\"],\"device_first_seen\":\"2022-11-28\",\"device_id\":\"1ee122774f644efe8200db8bd181dd5e\",\"device_id_confidence\":\"100\",\"device_last_event\":\"2024-12-25\",\"device_last_update\":\"2024-12-25\",\"device_match_result\":\"success\",\"device_memory\":\"2\",\"device_result\":\"success\",\"device_score\":\"0\",\"device_worst_score\":\"0\",\"digital_id\":\"1bfb398ba6f945539d01c5b05c86e26f\",\"digital_id_activities\":[\"_TRUSTED_PROB\"],\"digital_id_attributes\":[\"_TRUSTED_PROB\"],\"digital_id_confidence\":\"7554\",\"digital_id_confidence_rating\":\"high\",\"digital_id_first_seen\":\"2021-12-13\",\"digital_id_last_event\":\"2024-12-25\",\"digital_id_last_update\":\"2024-12-25\",\"digital_id_result\":\"success\",\"digital_id_trust_score\":\"93.42\",\"digital_id_trust_score_rating\":\"very_high\",\"digital_id_trust_score_reason_code\":[\"_ts_neutral_conf_score\",\"_ts_high_entity_age_score\",\"_ts_very_high_did_age_score\",\"_ts_neutral_did_distance\",\"_ts_neutral_graph_complex\",\"_ts_did_link_new_inputip\",\"_ts_did_2_or_more_phone\",\"_ts_did_3_or_more_trueip\",\"_ts_did_2_or_more_inputip\",\"_ts_did_edge_detect_inputip\",\"_ts_logodds_sum_lua\"],\"digital_id_trust_score_summary_reason_code\":[\"_ts_did_link_new_entity\",\"_ts_did_edge_detect_entity\"],\"dns_ip\":\"65.24.5.242\",\"dns_ip_assert_history\":[\"NEGATIVE_HISTORY\"],\"dns_ip_attributes\":[\"_CHALLENGED\",\"_CHALLENGE_FAILED\",\"_CHALLENGE_PASSED\",\"_TRUSTED_PROB\"],\"dns_ip_city\":\"lexington-fayette urban county\",\"dns_ip_connection_type\":\"tx\",\"dns_ip_geo\":\"US\",\"dns_ip_home\":\"no\",\"dns_ip_isp\":\"charter communications inc\",\"dns_ip_latitude\":\"38.01602\",\"dns_ip_line_speed\":\"high\",\"dns_ip_longitude\":\"-84.48788\",\"dns_ip_organization\":\"charter communications inc\",\"dns_ip_postal_code\":\"40502\",\"dns_ip_region\":\"kentucky\",\"dns_ip_region_iso_code\":\"ky\",\"dns_ip_routing_type\":\"fixed\",\"enabled_ck\":\"yes\",\"enabled_fl\":\"no\",\"enabled_im\":\"yes\",\"enabled_js\":\"yes\",\"enabled_services\":[\"TMX100\",\"TMX300\"],\"enhanced_headers_name_value_hash\":\"85362c512608d485f5045bc52aba8261\",\"etag_guid\":\"98e12c4683fd450da99410d2a82db17b\",\"event_datetime\":\"2024-12-25 21:20:45.573\",\"event_type\":\"account_creation\",\"fuzzy_device_activities\":[\"_TRUSTED_PROB\"],\"fuzzy_device_attributes\":[\"_TRUSTED_PROB\"],\"fuzzy_device_first_seen\":\"2022-11-28\",\"fuzzy_device_id\":\"1ee122774f644efe8200db8bd181dd5e\",\"fuzzy_device_id_confidence\":\"100.00\",\"fuzzy_device_last_event\":\"2024-12-25\",\"fuzzy_device_last_update\":\"2024-12-25\",\"fuzzy_device_match_result\":\"success\",\"fuzzy_device_result\":\"success\",\"fuzzy_device_score\":\"0\",\"fuzzy_device_worst_score\":\"0\",\"global_third_party_cookie\":\"762bea34074d470a934082326c6b93be\",\"gpu_name\":\"PowerVR Rogue GE8320\",\"gpu_vendor\":\"Imagination Technologies\",\"headers_name_value_hash\":\"578a3d46f2e84d7b8ab960b68dbb1304\",\"headers_order_string_hash\":\"244ef9b7ac608f00c8c1f6e495bb2eab\",\"honeypot_fingerprint\":\"54930c2d59e3e56e715547df911c540222045fc8\",\"honeypot_fingerprint_check\":\"true\",\"honeypot_fingerprint_match\":\"match_exact\",\"http_connection_type\":\"Ethernet or modem\",\"http_os_sig_adv_mss\":\"1448\",\"http_os_sig_rcv_mss\":\"1448\",\"http_os_sig_snd_mss\":\"1448\",\"http_os_signature\":\"Linux 2.2.x-3.x\",\"http_referer\":\"j0oGon0BJEkDaA!2389nhcbACHIbnLM7\",\"http_referer_domain\":\"www.uprova.com\",\"http_referer_url\":\"https://www.uprova.com/portal/Apply/Account\",\"image_loaded\":\"yes\",\"input_ip_address\":\"2603:6013:ba00:6599:edf0:3466:9597:1e08\",\"input_ip_city\":\"lexington-fayette urban county\",\"input_ip_connection_type\":\"cable\",\"input_ip_geo\":\"US\",\"input_ip_home\":\"no\",\"input_ip_isp\":\"charter communications inc\",\"input_ip_latitude\":\"38.01602\",\"input_ip_longitude\":\"-84.48788\",\"input_ip_organization\":\"charter communications inc\",\"input_ip_postal_code\":\"40502\",\"input_ip_region\":\"kentucky\",\"input_ip_result\":\"not found\",\"js_browser\":\"Chrome 131\",\"js_browser_string\":\"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36\",\"js_browser_string_hash\":\"7e91326b17b5455769214abbd4472bb7\",\"js_fonts_hash\":\"464002236081462cad6d225433d38dec\",\"js_fonts_number\":\"13\",\"js_os\":\"Android 13\",\"math_routine\":\"4003d1c2bec02e6cc560082ad155401fd4588141d6eaa24dc94afbd72313196a\",\"national_id_activities\":[\"_TRUSTED_PROB\"],\"national_id_attributes\":[\"_TRUSTED_PROB\"],\"national_id_first_seen\":\"2023-10-20\",\"national_id_last_event\":\"2024-12-25\",\"national_id_last_update\":\"2024-12-25\",\"national_id_number\":\"d32956b2948d8198b821be47b79565582788f3545712e30acc4db7c7dae0bf9f\",\"national_id_result\":\"success\",\"national_id_score\":\"0\",\"national_id_type\":\"us_ssn_hash\",\"national_id_worst_score\":\"0\",\"nonce\":\"115485b78a134867\",\"org_id\":\"2lrwrk15\",\"os\":\"Android\",\"os_version\":\"13.0.0\",\"page_elements\":{\"ver\":3,\"redirectUrl\":[false,\"hidden\",4],\"IdNumber\":[false,\"hidden\",4],\"BackValue\":[false,\"hidden\",4],\"tribalOrdinance\":[true,\"checkbox\",4],\"termsAgree\":[true,\"checkbox\",4],\"shareAppInfo\":[true,\"checkbox\",2],\"TenantId\":[false,\"hidden\",4],\"IsExistingCustomer\":[false,\"hidden\",4],\"IsBack\":[false,\"hidden\",4],\"MaxPageReached\":[false,\"hidden\",4],\"ValidPassword\":[false,\"hidden\",4],\"UpdateMaxPageReached\":[false,\"hidden\",4],\"gclid\":[false,\"hidden\",4],\"UTMCampaign\":[false,\"hidden\",4],\"UTMMedium\":[false,\"hidden\",4],\"UTMSource\":[false,\"hidden\",4],\"UTMTerm\":[false,\"hidden\",4],\"irclickid\":[false,\"hidden\",4],\"TMetrixSessionID\":[false,\"hidden\",4],\"TMetrixPageID\":[false,\"hidden\",4],\"__RequestVerificationToken\":[false,\"hidden\",4],\"g-recaptcha-response\":[false,\"textarea\",4]},\"page_time_on\":\"8554\",\"policy\":\"account_registration\",\"policy_details_api\":{\"policy_detail_api\":[{\"customer\":{\"pvid\":\"1967294\",\"review_status\":\"pass\",\"risk_rating\":\"neutral\",\"score\":\"0\"},\"id\":\"0\",\"type\":\"champion\"},{\"customer\":{\"pvid\":\"1973063\",\"review_status\":\"pass\",\"risk_rating\":\"neutral\",\"rules\":[{\"reason_code\":\"HabemcoFraudScore_65\",\"rid\":\"470321470\",\"score\":\"-1\"},{\"reason_code\":\"HabemcoFraudScore_64\",\"rid\":\"470321471\",\"score\":\"-1\"},{\"reason_code\":\"HabemcoFraudScore_63\",\"rid\":\"470321472\",\"score\":\"-1\"},{\"reason_code\":\"HabemcoFraudScore_62\",\"rid\":\"470321473\",\"score\":\"-1\"},{\"reason_code\":\"HabemcoFraudScore_61\",\"rid\":\"470321474\",\"score\":\"-1\"},{\"reason_code\":\"HabemcoFraudScore_60\",\"rid\":\"470321475\",\"score\":\"-1\"},{\"reason_code\":\"HabemcoFraudScore_59\",\"rid\":\"470321476\",\"score\":\"-1\"},{\"reason_code\":\"HabemcoFraudScore_58\",\"rid\":\"470321477\",\"score\":\"-1\"},{\"reason_code\":\"HabemcoFraudScore_57\",\"rid\":\"470321478\",\"score\":\"-1\"},{\"reason_code\":\"HabemcoFraudScore_56\",\"rid\":\"470321479\",\"score\":\"-1\"},{\"reason_code\":\"HabemcoFraudScore_55\",\"rid\":\"470321480\",\"score\":\"-1\"},{\"reason_code\":\"HabemcoFraudScore_54\",\"rid\":\"470321481\",\"score\":\"-1\"},{\"reason_code\":\"HabemcoFraudScore_53\",\"rid\":\"470321482\",\"score\":\"-1\"},{\"reason_code\":\"HabemcoFraudScore_52\",\"rid\":\"470321483\",\"score\":\"-1\"},{\"reason_code\":\"HabemcoFraudScore_51\",\"rid\":\"470321484\",\"score\":\"-1\"},{\"reason_code\":\"HabemcoFraudScore_50\",\"rid\":\"470321485\",\"score\":\"-5\"},{\"reason_code\":\"HabemcoFraudScore_45\",\"rid\":\"470321486\",\"score\":\"-5\"},{\"reason_code\":\"HabemcoFraudScore_40\",\"rid\":\"470321487\",\"score\":\"-5\"},{\"reason_code\":\"HabemcoFraudScore_35\",\"rid\":\"470321488\",\"score\":\"-5\"},{\"reason_code\":\"HabemcoFraudScore_30\",\"rid\":\"470321489\",\"score\":\"-5\"},{\"reason_code\":\"HabemcoFraudScore_25\",\"rid\":\"470321490\",\"score\":\"-5\"},{\"reason_code\":\"HabemcoFraudScore_20\",\"rid\":\"470321491\",\"score\":\"-5\"},{\"reason_code\":\"HabemcoFraudScore_15\",\"rid\":\"470321492\",\"score\":\"-5\"},{\"reason_code\":\"HabemcoFraudScore_10\",\"rid\":\"470321493\",\"score\":\"-5\"},{\"reason_code\":\"HabemcoFraudScore_05\",\"rid\":\"470321494\",\"score\":\"-5\"}],\"score\":\"-65\",\"vars\":[{\"rid\":\"470321418\",\"value\":\"1595841\",\"variable\":\"mins_since_digital_id_first_seen\"},{\"rid\":\"470321429\",\"value\":\"1\",\"variable\":\"smart_id_velocity_local\"}]},\"id\":\"1\",\"type\":\"challenger\"}]},\"policy_engine_version\":\"15.5.2\",\"policy_score\":\"0\",\"primary_industry\":\"banking\",\"private_browsing\":\"no\",\"profile_api_timedelta\":\"13215\",\"profile_connection_type\":\"TLS1.3\",\"profiled_domain\":\"www.uprova.com\",\"profiled_url\":\"https://www.uprova.com/portal/Apply/PromoCode\",\"profiling_datetime\":\"1735161632\",\"profiling_delta\":\"6368\",\"proxy_reason\":\"ML model result\",\"proxy_score\":\"1.64\",\"request_duration\":\"36\",\"request_id\":\"9c592c63-c904-45a2-bc66-2ca6f9a20b0a\",\"request_result\":\"success\",\"review_status\":\"pass\",\"risk_rating\":\"neutral\",\"screen_color_depth\":\"24\",\"screen_res\":\"1600x720\",\"secondary_industry\":\"credit_union\",\"service_type\":\"all\",\"session_id\":\"lnx-43782bfc-3efa-46b1-9e76-e4541ee688b6\",\"session_id_query_count\":\"1\",\"ssl_fp_signature\":\"368244b01a18432c655ebd3657e65480\",\"ssn_hash\":\"d32956b2948d8198b821be47b79565582788f3545712e30acc4db7c7dae0bf9f\",\"ssn_hash_activities\":[\"_TRUSTED_PROB\"],\"ssn_hash_attributes\":[\"_TRUSTED_PROB\"],\"ssn_hash_first_seen\":\"2023-09-01\",\"ssn_hash_last_event\":\"2024-12-25\",\"ssn_hash_last_update\":\"2024-12-25\",\"ssn_hash_result\":\"success\",\"ssn_hash_score\":\"0\",\"ssn_hash_worst_score\":\"0\",\"summary_risk_score\":\"0\",\"system_state\":\"1731248449\",\"third_party_cookie\":\"b39b121f74ec5cc196aa071dfc8c0a83\",\"time_zone\":\"-300\",\"time_zone_dst_offset\":\"60\",\"timezone_name\":\"America/New_York\",\"tmx_reason_code\":[\"_Threat_Intelligence_Real_Location_Detected\",\"_IP_GBL_VEL_1_2_13_96\",\"_IP_GBL_AGE_GT_3MTHS\",\"_IP_GBL_VEL_120_120_120_120\",\"_IP_GBL_AGE_GT_3MTHS\",\"_IP_GBL_AGE_LT_HR\",\"_EXACT_ID_GBL_VEL_1_2_30_120\",\"_EXACT_ID_GBL_AGE_GT_3MTHS\",\"_SMART_ID_GBL_VEL_1_2_30_120\",\"_SMART_ID_GBL_AGE_GT_3MTHS\",\"_ACC_EMAIL_GBL_AGE_GT_3MTHS\",\"_ACC_LOGIN_GBL_AGE_GT_3MTHS\",\"_ACC_TEL_GBL_AGE_GT_3MTHS\",\"_ACC_NAME_GBL_VEL_1_1_1_6\",\"_ACC_NAME_GBL_AGE_GT_3MTHS\",\"_SSN_GBL_AGE_GT_3MTHS\",\"_AGENT_PUBLICKEY_HASH_GBL_AGE_LT_HR\",\"_DIG_ID_GBL_AGE_GT_3MTHS\",\"_national_id_GBL_AGE_GT_3MTHS\",\"_IP_LCL_AGE_GT_3MTHS\",\"_IP_LCL_VEL_1_2_9_44\",\"_IP_LCL_AGE_GT_3MTHS\",\"_IP_LCL_AGE_LT_HR\",\"_EXACT_ID_LCL_AGE_GT_3MTHS\",\"_SMART_ID_LCL_AGE_GT_3MTHS\",\"_ACC_EMAIL_LCL_AGE_GT_3MTHS\",\"_ACC_LOGIN_LCL_AGE_GT_3MTHS\",\"_ACC_TEL_LCL_AGE_GT_3MTHS\",\"_ACC_NAME_LCL_AGE_GT_3MTHS\",\"_SSN_LCL_AGE_GT_3MTHS\",\"_AGENT_PUBLICKEY_HASH_LCL_AGE_LT_HR\",\"_DIG_ID_LCL_AGE_GT_3MTHS\",\"_national_id_LCL_AGE_GT_3MTHS\",\"_ACC_EMAIL_EXACT_ID_GBL_PAIR_AGE_GT_3MTHS\",\"_ACC_EMAIL_SMART_ID_GBL_PAIR_AGE_GT_3MTHS\",\"_ACC_LOGIN_EXACT_ID_GBL_PAIR_AGE_GT_3MTHS\",\"_ACC_LOGIN_SMART_ID_GBL_PAIR_AGE_GT_3MTHS\",\"_ACC_NAME_EXACT_ID_GBL_PAIR_AGE_GT_3MTHS\",\"_ACC_NAME_SMART_ID_GBL_PAIR_AGE_GT_3MTHS\",\"_ACC_EMAIL_EXACT_ID_LCL_PAIR_AGE_GT_3MTHS\",\"_ACC_EMAIL_SMART_ID_LCL_PAIR_AGE_GT_3MTHS\",\"_ACC_LOGIN_EXACT_ID_LCL_PAIR_AGE_GT_3MTHS\",\"_ACC_LOGIN_SMART_ID_LCL_PAIR_AGE_GT_3MTHS\",\"_ACC_NAME_EXACT_ID_LCL_PAIR_AGE_GT_3MTHS\",\"_ACC_NAME_SMART_ID_LCL_PAIR_AGE_GT_3MTHS\",\"_EXPRESSION_ERROR\",\"PID_LCL_AGE_ACC_EMAIL_GT_3MONTHS\",\"_TrueIP_Org_Global_Whitelist\",\"_TrueIP_ISP_Global_Whitelist\",\"_InputIP_Org_Global_Whitelist\",\"_InputIP_ISP_Global_Whitelist\",\"_Email_FRS_accept_global_1_3\",\"_Phone_FRS_accept_global_1_3\",\"_DID_FRS_accept_global_1_3\",\"_Email_FRS_accept_local_1_3\",\"_SmartID_FRS_accept_local_1_3\",\"_Phone_FRS_accept_local_1_3\",\"_DID_FRS_accept_local_1_3\",\"_ExactID_FRS_accept_local_1_3\",\"_TMX_GBL_TT_LIMIT_REACHED_DNS_IP\"],\"tmx_risk_rating\":\"neutral\",\"tmx_summary_reason_code\":[\"Level_1_Link_Accept\"],\"tmx_variables\":{\"_accemail_gbl_velocity_hour\":\"0\",\"_accemail_local_velocity_hour\":\"0\",\"_acclogin_local_velocity_hour\":\"0\",\"_accphone_gbl_velocity_hour\":\"0\",\"_acctemails_per_exactid_hour\":\"0\",\"_acnt_login_per_exactid_hour\":\"0\",\"_acnt_login_per_smartid_hour\":\"0\",\"_acntemails_per_exactid_gbl_hour\":\"0\",\"_acntemails_per_smartid_hour\":\"0\",\"_cc_per_exactid_hour\":\"0\",\"_cc_per_smartid_gbl_hour\":\"0\",\"_cc_per_smartid_hour\":\"0\",\"_exactid_gbl_velocity_hour\":\"0\",\"_exactid_local_velocity_hour\":\"0\",\"_exactid_per_email_gbl_hour\":\"0\",\"_smartid_gbl_velocity_hour\":\"0\",\"_smartid_local_velocity_hour\":\"0\"},\"true_ip\":\"74.132.41.252\",\"true_ip_attributes\":[\"_TRUSTED_CONF\"],\"true_ip_city\":\"hamilton\",\"true_ip_city_confidence\":\"95\",\"true_ip_connection_type\":\"cable\",\"true_ip_country_confidence\":\"99\",\"true_ip_first_seen\":\"2024-04-24\",\"true_ip_geo\":\"US\",\"true_ip_home\":\"no\",\"true_ip_isp\":\"charter communications inc\",\"true_ip_last_event\":\"2024-12-25\",\"true_ip_last_update\":\"2024-12-25\",\"true_ip_latitude\":\"39.39959\",\"true_ip_line_speed\":\"medium\",\"true_ip_longitude\":\"-84.56115\",\"true_ip_organization\":\"charter communications inc\",\"true_ip_organization_type\":\"Internet Service Provider\",\"true_ip_postal_code\":\"45015\",\"true_ip_region\":\"ohio\",\"true_ip_region_iso_code\":\"oh\",\"true_ip_result\":\"success\",\"true_ip_routing_type\":\"fixed\",\"true_ip_score\":\"0\",\"true_ip_source_port\":\"38281\",\"true_ip_state_confidence\":\"97\",\"true_ip_worst_score\":\"0\",\"true_ipv6\":\"2603:6013:ba00:6599:edf0:3466:9597:1e08\",\"true_ipv6_source_port\":\"55716\",\"turn_os_sig_raw\":\"74.132.41.252~4:53:0:1460:65535,10:mss,sok,ts,nop,ws:df,id+:0|4:53:0:0:64,0:nop,nop,ts:df,id+,ts2+:0\",\"turn_os_sig_ttl\":\"53\",\"turn_os_signature\":\"Linux 2.2.x-3.x\",\"ua_browser\":\"chrome 131.0\",\"ua_browser_alt\":\"Chrome Mobile\",\"ua_browser_version_alt\":\"131.0.0.0\",\"ua_mobile\":\"yes\",\"ua_os\":\"android\",\"ua_os_alt\":\"Android\",\"ua_os_version_alt\":\"10\",\"ua_platform\":\"chrome 131.0 for android\",\"vm_index\":\"300\",\"vm_rating\":\"neutral\",\"vm_reason\":\"device_memory\",\"webgl_hash\":\"6b7640628817f65f677a7706b5bc7c077038a3d4\",\"webrtc_external_ip\":\"74.132.41.252\",\"webrtc_internal_ip\":\"192.168.1.9\",\"webrtc_ipv6\":\"2603:6013:ba00:6599:dc66:ccff:fe48:5cf7\",\"webrtc_media\":\"(1,1,1,e12ead95566221e7c4e320e56363dcb477a3c93a4a8510beb25f01bca07d4e8d)\",\"webrtc_media_mini\":\"111e12ead9556622\"}""", + "DeviceId": "1ee122774f644efe8200db8bd181dd5e", + "FuzzyDeviceId": "1ee122774f644efe8200db8bd181dd5e", + "ownhome": None, + "employmentstatus": None, + "lengthatjob": None, + "payfrequency": None, + "lengthatbank": None, + "educationlevel": None, + "monthsatresidence": None + } + + +class TestBlock(unittest.TestCase): + def test_main_success(self): + blockResult = __main__(**input_json) + # breakpoint() + self.assertIsInstance(blockResult, dict, "Result should be a dictionary.") + self.assertIn("hd_score_m1", blockResult, "Result dictionary should contain 'hd_score_m1' if success.") + + + +if __name__ == "__main__": + unittest.main() + + diff --git a/xgboost_model.joblib b/xgboost_model.joblib new file mode 100644 index 0000000000000000000000000000000000000000..3e9f35effc2ab1cc79d0271325cd7b47600aca82 GIT binary patch literal 452922 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