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