From 245ad6d96fa3a813827ecb69655ab4bb0ab9d412 Mon Sep 17 00:00:00 2001 From: user_client2024 Date: Fri, 28 Nov 2025 07:30:55 +0000 Subject: [PATCH] Initial commit --- .ipynb_checkpoints/main-checkpoint.ipynb | 230 +++++++++++++++++++++++ main.ipynb | 230 +++++++++++++++++++++++ main.py | 187 ++++++++++++++++++ 3 files changed, 647 insertions(+) create mode 100644 .ipynb_checkpoints/main-checkpoint.ipynb create mode 100644 main.ipynb create mode 100644 main.py diff --git a/.ipynb_checkpoints/main-checkpoint.ipynb b/.ipynb_checkpoints/main-checkpoint.ipynb new file mode 100644 index 0000000..90f3c1f --- /dev/null +++ b/.ipynb_checkpoints/main-checkpoint.ipynb @@ -0,0 +1,230 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "id": "e706cfb0-2234-4c4c-95d8-d1968f656aa0", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "query = \"\"\"\n", + " select final.CUSTOMER_NUMBER_main as Focal_id,\n", + " CAST(final.Cash_deposit_total AS DECIMAL(18, 2)) AS Cash_deposit_total,\n", + " final.Cash_deposit_count,\n", + " final.SEGMENT,\n", + " final.RISK,\n", + " final.SAR_FLAG\n", + "from \n", + "(\n", + " (\n", + " select subquery.CUSTOMER_NUMBER_1 as CUSTOMER_NUMBER_main,\n", + " subquery.Cash_deposit_total,\n", + " subquery.Cash_deposit_count\n", + " from \n", + " (\n", + " select customer_number as CUSTOMER_NUMBER_1, \n", + " sum(transaction_amount) as Cash_deposit_total, \n", + " count(*) as Cash_deposit_count\n", + " from \n", + " (\n", + " select * \n", + " from {trans_data} trans_table \n", + " left join {acc_data} acc_table\n", + " on trans_table.benef_account_number = acc_table.account_number\n", + " ) trans\n", + " where account_number not in ('None')\n", + " and transaction_desc = 'CASH RELATED TRANSACTION'\n", + " group by customer_number\n", + " ) subquery\n", + " ) main \n", + " left join \n", + " (\n", + " select cd.CUSTOMER_NUMBER_3 as CUSTOMER_NUMBER_cust,\n", + " cd.SEGMENT,\n", + " cd.RISK,\n", + " case\n", + " when ad.SAR_FLAG is NULL then 'N'\n", + " else ad.SAR_FLAG\n", + " end as SAR_FLAG \n", + " from\n", + " (\n", + " select customer_number as CUSTOMER_NUMBER_3, \n", + " business_segment as SEGMENT,\n", + " case\n", + " when RISK_CLASSIFICATION = 1 then 'Low Risk'\n", + " when RISK_CLASSIFICATION = 2 then 'Medium Risk'\n", + " when RISK_CLASSIFICATION = 3 then 'High Risk'\n", + " else 'Unknown Risk'\n", + " end AS RISK\n", + " from {cust_data}\n", + " ) cd \n", + " left join\n", + " (\n", + " select customer_number as CUSTOMER_NUMBER_4, \n", + " sar_flag as SAR_FLAG\n", + " from {alert_data}\n", + " ) ad \n", + " on cd.CUSTOMER_NUMBER_3 = ad.CUSTOMER_NUMBER_4\n", + " ) as cust_alert\n", + " on cust_alert.CUSTOMER_NUMBER_cust = main.CUSTOMER_NUMBER_main\n", + ") as final\n", + "\"\"\"\n", + "\n", + "from tms_data_interface import SQLQueryInterface\n", + "\n", + "class Scenario:\n", + " seq = SQLQueryInterface(schema=\"transactionschema\")\n", + "\n", + " def logic(self, **kwargs):\n", + " row_list = self.seq.execute_raw(query.format(trans_data=\"transaction10m\",\n", + " cust_data=\"customer_data_v1\",\n", + " acc_data=\"account_data_v1\",\n", + " alert_data=\"alert_data_v1\")\n", + " )\n", + " cols = [\"Focal_id\", \"Cash_deposit_total\", \"Cash_deposit_count\",\n", + " \"Segment\", \"Risk\", \"SAR_FLAG\"]\n", + " df = pd.DataFrame(row_list, columns = cols)\n", + " df[\"Cash_deposit_total\"] = df[\"Cash_deposit_total\"].astype(float)\n", + " return df" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "b6c85de2-6a47-4109-8885-c138c289ec25", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import pandas as pd\n", + "\n", + "# query = \"\"\"\n", + "# SELECT \n", + "# t.transaction_id,\n", + "# t.transaction_date,\n", + "# t.transaction_amount,\n", + "# t.transaction_desc,\n", + "# t.benef_account_number,\n", + "\n", + "# -- Account data\n", + "# a.account_number,\n", + "# a.customer_number AS acc_customer_number,\n", + "# a.account_type,\n", + "# a.branch_code,\n", + "\n", + "# -- Party data\n", + "# p.customer_number AS party_customer_number,\n", + "# p.customer_name,\n", + "# p.date_of_birth,\n", + "# p.nationality,\n", + "# p.business_segment,\n", + "# CASE\n", + "# WHEN p.risk_classification = 1 THEN 'Low Risk'\n", + "# WHEN p.risk_classification = 2 THEN 'Medium Risk'\n", + "# WHEN p.risk_classification = 3 THEN 'High Risk'\n", + "# ELSE 'Unknown Risk'\n", + "# END AS risk_level,\n", + "\n", + "# -- Alert data\n", + "# COALESCE(al.sar_flag, 'N') AS sar_flag\n", + "\n", + "# FROM {trans_data} t\n", + "\n", + "# -- Join with account data on beneficiary account\n", + "# LEFT JOIN {acc_data} a\n", + "# ON t.benef_account_number = a.account_number\n", + "\n", + "# -- Join with party/customer data using account's customer number\n", + "# LEFT JOIN {cust_data} p\n", + "# ON a.customer_number = p.customer_number\n", + "\n", + "# -- Join with alert data using party's customer number\n", + "# LEFT JOIN {alert_data} al\n", + "# ON p.customer_number = al.customer_number\n", + "\n", + "# WHERE a.account_number IS NOT NULL\n", + "# limit 100\n", + "# \"\"\"\n", + "\n", + "# from tms_data_interface import SQLQueryInterface\n", + "\n", + "# class Scenario:\n", + "# seq = SQLQueryInterface(schema=\"transactionschema\")\n", + "\n", + "# def logic(self, **kwargs):\n", + "# row_list = self.seq.execute_raw(query.format(trans_data=\"transaction10m\",\n", + "# cust_data=\"customer_data_v1\",\n", + "# acc_data=\"account_data_v1\",\n", + "# alert_data=\"alert_data_v1\")\n", + "# )\n", + "# cols = [\n", + "# \"transaction_id\",\n", + "# \"transaction_date\",\n", + "# \"transaction_amount\",\n", + "# \"transaction_desc\",\n", + "# \"benef_account_number\",\n", + "# \"account_number\",\n", + "# \"acc_customer_number\",\n", + "# \"account_type\",\n", + "# \"branch_code\",\n", + "# \"party_customer_number\",\n", + "# \"customer_name\",\n", + "# \"date_of_birth\",\n", + "# \"nationality\",\n", + "# \"business_segment\",\n", + "# \"risk_level\",\n", + "# \"sar_flag\"\n", + "# ]\n", + "# df = pd.DataFrame(row_list, columns = cols)\n", + "# return df" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "1f20337b-8116-47e5-8743-1ba41e2df819", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# sen = Scenario()\n", + "# sen.logic()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6de62b37-00d1-4c88-b27b-9a70e05add91", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/main.ipynb b/main.ipynb new file mode 100644 index 0000000..90f3c1f --- /dev/null +++ b/main.ipynb @@ -0,0 +1,230 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "id": "e706cfb0-2234-4c4c-95d8-d1968f656aa0", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "query = \"\"\"\n", + " select final.CUSTOMER_NUMBER_main as Focal_id,\n", + " CAST(final.Cash_deposit_total AS DECIMAL(18, 2)) AS Cash_deposit_total,\n", + " final.Cash_deposit_count,\n", + " final.SEGMENT,\n", + " final.RISK,\n", + " final.SAR_FLAG\n", + "from \n", + "(\n", + " (\n", + " select subquery.CUSTOMER_NUMBER_1 as CUSTOMER_NUMBER_main,\n", + " subquery.Cash_deposit_total,\n", + " subquery.Cash_deposit_count\n", + " from \n", + " (\n", + " select customer_number as CUSTOMER_NUMBER_1, \n", + " sum(transaction_amount) as Cash_deposit_total, \n", + " count(*) as Cash_deposit_count\n", + " from \n", + " (\n", + " select * \n", + " from {trans_data} trans_table \n", + " left join {acc_data} acc_table\n", + " on trans_table.benef_account_number = acc_table.account_number\n", + " ) trans\n", + " where account_number not in ('None')\n", + " and transaction_desc = 'CASH RELATED TRANSACTION'\n", + " group by customer_number\n", + " ) subquery\n", + " ) main \n", + " left join \n", + " (\n", + " select cd.CUSTOMER_NUMBER_3 as CUSTOMER_NUMBER_cust,\n", + " cd.SEGMENT,\n", + " cd.RISK,\n", + " case\n", + " when ad.SAR_FLAG is NULL then 'N'\n", + " else ad.SAR_FLAG\n", + " end as SAR_FLAG \n", + " from\n", + " (\n", + " select customer_number as CUSTOMER_NUMBER_3, \n", + " business_segment as SEGMENT,\n", + " case\n", + " when RISK_CLASSIFICATION = 1 then 'Low Risk'\n", + " when RISK_CLASSIFICATION = 2 then 'Medium Risk'\n", + " when RISK_CLASSIFICATION = 3 then 'High Risk'\n", + " else 'Unknown Risk'\n", + " end AS RISK\n", + " from {cust_data}\n", + " ) cd \n", + " left join\n", + " (\n", + " select customer_number as CUSTOMER_NUMBER_4, \n", + " sar_flag as SAR_FLAG\n", + " from {alert_data}\n", + " ) ad \n", + " on cd.CUSTOMER_NUMBER_3 = ad.CUSTOMER_NUMBER_4\n", + " ) as cust_alert\n", + " on cust_alert.CUSTOMER_NUMBER_cust = main.CUSTOMER_NUMBER_main\n", + ") as final\n", + "\"\"\"\n", + "\n", + "from tms_data_interface import SQLQueryInterface\n", + "\n", + "class Scenario:\n", + " seq = SQLQueryInterface(schema=\"transactionschema\")\n", + "\n", + " def logic(self, **kwargs):\n", + " row_list = self.seq.execute_raw(query.format(trans_data=\"transaction10m\",\n", + " cust_data=\"customer_data_v1\",\n", + " acc_data=\"account_data_v1\",\n", + " alert_data=\"alert_data_v1\")\n", + " )\n", + " cols = [\"Focal_id\", \"Cash_deposit_total\", \"Cash_deposit_count\",\n", + " \"Segment\", \"Risk\", \"SAR_FLAG\"]\n", + " df = pd.DataFrame(row_list, columns = cols)\n", + " df[\"Cash_deposit_total\"] = df[\"Cash_deposit_total\"].astype(float)\n", + " return df" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "b6c85de2-6a47-4109-8885-c138c289ec25", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import pandas as pd\n", + "\n", + "# query = \"\"\"\n", + "# SELECT \n", + "# t.transaction_id,\n", + "# t.transaction_date,\n", + "# t.transaction_amount,\n", + "# t.transaction_desc,\n", + "# t.benef_account_number,\n", + "\n", + "# -- Account data\n", + "# a.account_number,\n", + "# a.customer_number AS acc_customer_number,\n", + "# a.account_type,\n", + "# a.branch_code,\n", + "\n", + "# -- Party data\n", + "# p.customer_number AS party_customer_number,\n", + "# p.customer_name,\n", + "# p.date_of_birth,\n", + "# p.nationality,\n", + "# p.business_segment,\n", + "# CASE\n", + "# WHEN p.risk_classification = 1 THEN 'Low Risk'\n", + "# WHEN p.risk_classification = 2 THEN 'Medium Risk'\n", + "# WHEN p.risk_classification = 3 THEN 'High Risk'\n", + "# ELSE 'Unknown Risk'\n", + "# END AS risk_level,\n", + "\n", + "# -- Alert data\n", + "# COALESCE(al.sar_flag, 'N') AS sar_flag\n", + "\n", + "# FROM {trans_data} t\n", + "\n", + "# -- Join with account data on beneficiary account\n", + "# LEFT JOIN {acc_data} a\n", + "# ON t.benef_account_number = a.account_number\n", + "\n", + "# -- Join with party/customer data using account's customer number\n", + "# LEFT JOIN {cust_data} p\n", + "# ON a.customer_number = p.customer_number\n", + "\n", + "# -- Join with alert data using party's customer number\n", + "# LEFT JOIN {alert_data} al\n", + "# ON p.customer_number = al.customer_number\n", + "\n", + "# WHERE a.account_number IS NOT NULL\n", + "# limit 100\n", + "# \"\"\"\n", + "\n", + "# from tms_data_interface import SQLQueryInterface\n", + "\n", + "# class Scenario:\n", + "# seq = SQLQueryInterface(schema=\"transactionschema\")\n", + "\n", + "# def logic(self, **kwargs):\n", + "# row_list = self.seq.execute_raw(query.format(trans_data=\"transaction10m\",\n", + "# cust_data=\"customer_data_v1\",\n", + "# acc_data=\"account_data_v1\",\n", + "# alert_data=\"alert_data_v1\")\n", + "# )\n", + "# cols = [\n", + "# \"transaction_id\",\n", + "# \"transaction_date\",\n", + "# \"transaction_amount\",\n", + "# \"transaction_desc\",\n", + "# \"benef_account_number\",\n", + "# \"account_number\",\n", + "# \"acc_customer_number\",\n", + "# \"account_type\",\n", + "# \"branch_code\",\n", + "# \"party_customer_number\",\n", + "# \"customer_name\",\n", + "# \"date_of_birth\",\n", + "# \"nationality\",\n", + "# \"business_segment\",\n", + "# \"risk_level\",\n", + "# \"sar_flag\"\n", + "# ]\n", + "# df = pd.DataFrame(row_list, columns = cols)\n", + "# return df" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "1f20337b-8116-47e5-8743-1ba41e2df819", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# sen = Scenario()\n", + "# sen.logic()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6de62b37-00d1-4c88-b27b-9a70e05add91", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/main.py b/main.py new file mode 100644 index 0000000..7d20451 --- /dev/null +++ b/main.py @@ -0,0 +1,187 @@ +#!/usr/bin/env python +# coding: utf-8 + +# In[3]: + + +import pandas as pd + +query = """ + select final.CUSTOMER_NUMBER_main as Focal_id, + CAST(final.Cash_deposit_total AS DECIMAL(18, 2)) AS Cash_deposit_total, + final.Cash_deposit_count, + final.SEGMENT, + final.RISK, + final.SAR_FLAG +from +( + ( + select subquery.CUSTOMER_NUMBER_1 as CUSTOMER_NUMBER_main, + subquery.Cash_deposit_total, + subquery.Cash_deposit_count + from + ( + select customer_number as CUSTOMER_NUMBER_1, + sum(transaction_amount) as Cash_deposit_total, + count(*) as Cash_deposit_count + from + ( + select * + from {trans_data} trans_table + left join {acc_data} acc_table + on trans_table.benef_account_number = acc_table.account_number + ) trans + where account_number not in ('None') + and transaction_desc = 'CASH RELATED TRANSACTION' + group by customer_number + ) subquery + ) main + left join + ( + select cd.CUSTOMER_NUMBER_3 as CUSTOMER_NUMBER_cust, + cd.SEGMENT, + cd.RISK, + case + when ad.SAR_FLAG is NULL then 'N' + else ad.SAR_FLAG + end as SAR_FLAG + from + ( + select customer_number as CUSTOMER_NUMBER_3, + business_segment as SEGMENT, + case + when RISK_CLASSIFICATION = 1 then 'Low Risk' + when RISK_CLASSIFICATION = 2 then 'Medium Risk' + when RISK_CLASSIFICATION = 3 then 'High Risk' + else 'Unknown Risk' + end AS RISK + from {cust_data} + ) cd + left join + ( + select customer_number as CUSTOMER_NUMBER_4, + sar_flag as SAR_FLAG + from {alert_data} + ) ad + on cd.CUSTOMER_NUMBER_3 = ad.CUSTOMER_NUMBER_4 + ) as cust_alert + on cust_alert.CUSTOMER_NUMBER_cust = main.CUSTOMER_NUMBER_main +) as final +""" + +from tms_data_interface import SQLQueryInterface + +class Scenario: + seq = SQLQueryInterface(schema="transactionschema") + + def logic(self, **kwargs): + row_list = self.seq.execute_raw(query.format(trans_data="transaction10m", + cust_data="customer_data_v1", + acc_data="account_data_v1", + alert_data="alert_data_v1") + ) + cols = ["Focal_id", "Cash_deposit_total", "Cash_deposit_count", + "Segment", "Risk", "SAR_FLAG"] + df = pd.DataFrame(row_list, columns = cols) + df["Cash_deposit_total"] = df["Cash_deposit_total"].astype(float) + return df + + +# In[6]: + + +# import pandas as pd + +# query = """ +# SELECT +# t.transaction_id, +# t.transaction_date, +# t.transaction_amount, +# t.transaction_desc, +# t.benef_account_number, + +# -- Account data +# a.account_number, +# a.customer_number AS acc_customer_number, +# a.account_type, +# a.branch_code, + +# -- Party data +# p.customer_number AS party_customer_number, +# p.customer_name, +# p.date_of_birth, +# p.nationality, +# p.business_segment, +# CASE +# WHEN p.risk_classification = 1 THEN 'Low Risk' +# WHEN p.risk_classification = 2 THEN 'Medium Risk' +# WHEN p.risk_classification = 3 THEN 'High Risk' +# ELSE 'Unknown Risk' +# END AS risk_level, + +# -- Alert data +# COALESCE(al.sar_flag, 'N') AS sar_flag + +# FROM {trans_data} t + +# -- Join with account data on beneficiary account +# LEFT JOIN {acc_data} a +# ON t.benef_account_number = a.account_number + +# -- Join with party/customer data using account's customer number +# LEFT JOIN {cust_data} p +# ON a.customer_number = p.customer_number + +# -- Join with alert data using party's customer number +# LEFT JOIN {alert_data} al +# ON p.customer_number = al.customer_number + +# WHERE a.account_number IS NOT NULL +# limit 100 +# """ + +# from tms_data_interface import SQLQueryInterface + +# class Scenario: +# seq = SQLQueryInterface(schema="transactionschema") + +# def logic(self, **kwargs): +# row_list = self.seq.execute_raw(query.format(trans_data="transaction10m", +# cust_data="customer_data_v1", +# acc_data="account_data_v1", +# alert_data="alert_data_v1") +# ) +# cols = [ +# "transaction_id", +# "transaction_date", +# "transaction_amount", +# "transaction_desc", +# "benef_account_number", +# "account_number", +# "acc_customer_number", +# "account_type", +# "branch_code", +# "party_customer_number", +# "customer_name", +# "date_of_birth", +# "nationality", +# "business_segment", +# "risk_level", +# "sar_flag" +# ] +# df = pd.DataFrame(row_list, columns = cols) +# return df + + +# In[5]: + + +# sen = Scenario() +# sen.logic() + + +# In[ ]: + + + +