Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from utils import readcsv, writecsv
- from collections import defaultdict, deque
- PRIORITY = ['credit_card', 'bank_account', 'device']
- pre = '.'
- class Klass:
- def __init__(self, name, val):
- self.name = name
- self.val = val
- @property
- def priority(self):
- return PRIORITY.index(self.name)
- def __repr__(self):
- return f'{self.name}:{self.val}'
- def bfs(graph, start, end):
- q = deque()
- q.append((start, [], 0))
- vis = set()
- vis.add(start)
- ans = []
- min_dis = float('inf')
- while q:
- cur, path, dis = q.popleft()
- if dis > min_dis:
- continue
- if cur == end:
- min_dis = min(min_dis, dis)
- ans.append(path)
- for node, val in graph[cur]:
- if node not in vis:
- q.append((node, path + [(val.priority, val.val, val, node)], dis + 1))
- vis.add(node)
- if ans:
- ans.sort()
- ans = ans[0]
- return '-'.join([f'"{val}"->{node}' for _, _, val, node in ans])
- def make_graph(graph, f, name):
- data = readcsv(f)
- maps = defaultdict(list)
- for id, val in data:
- maps[val].append(id)
- for id, val in data:
- neighbors = maps[val]
- for neighbor in neighbors:
- if neighbor != id:
- graph[id].append((neighbor, Klass(name, val)))
- graph = defaultdict(list)
- make_graph(graph, f'data/{pre}/bank_accounts.csv', 'bank_account')
- make_graph(graph, f'data/{pre}/credit_cards.csv', 'credit_card')
- make_graph(graph, f'data/{pre}/devices.csv', 'device')
- orders = readcsv(f'data/{pre}/orders.csv')
- ans = [['orderid', 'is_fraud']]
- for oid, bid, sid in orders:
- path = bfs(graph, bid, sid)
- if path:
- ans.append([oid, f'{bid}-{path}'])
- else:
- ans.append([oid, 'not fraud'])
- writecsv('ans.csv', ans)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement