""" 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]))