File size: 3,915 Bytes
2795186 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
"""
Count the number of transactions for each originator and beneficiary bank pair
"""
import os
import sys
import csv
import json
from collections import Counter
if __name__ == "__main__":
argv = sys.argv
if len(argv) < 2:
print("Usage: python3 %s [ConfJSON]" % argv[0])
exit(1)
conf_json = argv[1]
with open(conf_json, "r") as rf:
conf_data = json.load(rf)
sim_name = argv[2] if len(argv) >= 3 else conf_data["general"]["simulation_name"]
output_dir = os.path.join(conf_data["output"]["directory"], sim_name)
acct_csv = conf_data["output"]["accounts"]
tx_csv = conf_data["output"]["transactions"]
acct_path = os.path.join(output_dir, acct_csv)
tx_path = os.path.join(output_dir, tx_csv)
schema_json = os.path.join(conf_data["input"]["directory"], conf_data["input"]["schema"])
with open(schema_json, "r") as rf:
schema_data = json.load(rf)
acct_idx = None
bank_idx = None
orig_idx = None
bene_idx = None
sar_idx = None
for i, col in enumerate(schema_data["account"]):
data_type = col.get("dataType")
if data_type == "account_id":
acct_idx = i
elif data_type == "bank_id":
bank_idx = i
for i, col in enumerate(schema_data["transaction"]):
data_type = col.get("dataType")
if data_type == "orig_id":
orig_idx = i
elif data_type == "dest_id":
bene_idx = i
elif data_type == "sar_flag":
sar_idx = i
all_bank_set = set()
acct_bank = dict()
bank2bank_all = Counter()
bank2bank_sar = Counter()
with open(acct_path, "r") as rf:
print("Loading account list with bank ID")
reader = csv.reader(rf)
next(reader)
for row in reader:
acct = row[acct_idx]
bank = row[bank_idx]
acct_bank[acct] = bank
all_bank_set.add(bank)
with open(tx_path, "r") as rf:
print("Loading transaction list")
reader = csv.reader(rf)
next(reader)
for row in reader:
orig = row[orig_idx]
bene = row[bene_idx]
is_sar = row[sar_idx].lower() == "true"
orig_bank = acct_bank[orig]
bene_bank = acct_bank[bene]
bank_pair = (orig_bank, bene_bank)
bank2bank_all[bank_pair] += 1
if is_sar:
bank2bank_sar[bank_pair] += 1
total_num = sum(bank2bank_all.values())
internal_total_num = sum([num for pair, num in bank2bank_all.items() if pair[0] == pair[1]])
external_total_num = total_num - internal_total_num
internal_total_ratio = internal_total_num / total_num * 100
external_total_ratio = external_total_num / total_num * 100
internal_sar_num = sum([num for pair, num in bank2bank_sar.items() if pair[0] == pair[1]])
external_sar_num = sum([num for pair, num in bank2bank_sar.items() if pair[0] != pair[1]])
print("Internal bank transactions\tTotal: %d (%.2f%%), SAR: %d"
% (internal_total_num, internal_total_ratio, internal_sar_num))
print("External bank transactions\tTotal: %d (%.2f%%), SAR: %d"
% (external_total_num, external_total_ratio, external_sar_num))
bank_list = sorted(all_bank_set)
print("Number of total bank-to-bank transactions")
print("To:\t\t" + "\t".join(bank_list))
for orig_bank in bank_list:
bene_bank_count = [bank2bank_all[(orig_bank, bene_bank)] for bene_bank in bank_list]
print("From %s:\t" % orig_bank + "\t".join([str(n) for n in bene_bank_count]))
print("Number of SAR bank-to-bank transactions")
print("To:\t\t" + "\t".join(bank_list))
for orig_bank in bank_list:
bene_bank_count = [bank2bank_sar[(orig_bank, bene_bank)] for bene_bank in bank_list]
print("From %s:\t" % orig_bank + "\t".join([str(n) for n in bene_bank_count]))
|