def handler()

in src/lambda.d/inference/func/inferenceApi.py [0:0]


def handler(event, context):
    
    logger.info('Endpoint name: {}'.format(ENDPOINT_NAME))
    
    logger.info(f'Receive event: {event}')

    G_s_t = dt.now()

    trans_dict, identity_dict, target_id, transaction_value_cols, union_li_cols = load_data_from_event(event, transactions_id_cols, transactions_cat_cols, dummied_col)
    
    G_e_t = dt.now()
    logger.info(f'load_data_from_event used {(G_e_t - G_s_t).total_seconds()} seconds. ')
    G_new_s_t = G_e_t
    
    graph_input = GraphModelClient(endpoints)
    graph_input.insert_new_transaction_vertex_and_edge(trans_dict, identity_dict , target_id, vertex_type = 'Transaction')
    
    G_e_t = dt.now()
    logger.info(f'insert_new_transaction_vertex_and_edge used {(G_e_t - G_new_s_t).total_seconds()} seconds. Total test cost {(G_e_t - G_s_t).total_seconds()} seconds.')
    G_new_s_t = G_e_t
    
    subgraph_dict, transaction_embed_value_dict = graph_input.query_target_subgraph(target_id, trans_dict, transaction_value_cols, union_li_cols, dummied_col)
    
    G_e_t = dt.now()
    logger.info(f'query_target_subgraph used {(G_e_t - G_new_s_t).total_seconds()} seconds. Total test cost {(G_e_t - G_s_t).total_seconds()} seconds.')
    G_new_s_t = G_e_t

    transaction_id = int(target_id[(target_id.find('-')+1):])
    
    pred_prob = invoke_endpoint_with_idx(endpointname = ENDPOINT_NAME, target_id = transaction_id, subgraph_dict = subgraph_dict, n_feats = transaction_embed_value_dict)
    
    e_t = dt.now()
    logger.info(f'invoke_endpoint_with_idx used {(G_e_t - G_new_s_t).total_seconds()} seconds. Total test cost {(G_e_t - G_s_t).total_seconds()} seconds.')
    G_new_s_t = G_e_t

    data_output = {
                    'timestamp': int(time.time()),
                    'isFraud': pred_prob > MODEL_BTW,
                    'id': transaction_id, #event['transaction_data'][0]['TransactionID'],
                    'amount': event['transaction_data'][0]['TransactionAmt'],
                    'productCD': event['transaction_data'][0]['ProductCD'],
                    'card1': event['transaction_data'][0]['card1'],
                    'card2': event['transaction_data'][0]['card2'],
                    'card3': event['transaction_data'][0]['card3'],
                    'card4': event['transaction_data'][0]['card4'],
                    'card5': event['transaction_data'][0]['card5'],
                    'card6': event['transaction_data'][0]['card6'],
                    'addr1': event['transaction_data'][0]['addr1'],
                    'addr2': event['transaction_data'][0]['addr2'],
                    'dist1': event['transaction_data'][0]['dist1'],
                    'dist2': event['transaction_data'][0]['dist2'],
                    'pEmaildomain': event['transaction_data'][0]['P_emaildomain'],
                    'rEmaildomain': event['transaction_data'][0]['R_emaildomain'],
                }

    logger.debug(f'Send transaction {data_output} to queue.')
    response = sqs.send_message(
        QueueUrl=QUEUE_URL,
        DelaySeconds=0,
        MessageBody=json.dumps(data_output),
        MessageGroupId=context.aws_request_id,
    )
    
    function_res = {
                    'id': event['transaction_data'][0]['TransactionID'],
                    'flag': pred_prob > MODEL_BTW,
                    'pred_prob': pred_prob,
                    'time': (G_e_t - G_s_t).total_seconds()
                    }
    
    logger.info(f'Return function_res {function_res}.')
    
    return function_res