from datetime import date vendor_ids = [int(i) for i in open('data/vendorids.txt').readlines()] start_year = 2006 end_year = 2020 start_dates = [date(year, 1, 1) for year in range(start_year, end_year)] end_dates = [date(year, 12, 31) for year in range(start_year, end_year)] class Contract: __slots__ = ('contract_start', 'contract_end', 'payee', 'clauses') def __init__(self, contract_start, contract_end, payee, clauses): self.contract_start = contract_start self.contract_end = contract_end self.payee = payee self.clauses = clauses def matches(self, transaction): date_column = 1 transaction_date = transaction[date_column] return self.contract_start <= transaction_date <= self.contract_end def find_matching_clause(self, transaction): try: return next(clause for clause in self.clauses if clause.matches(transaction)) except StopIteration: return Clause(0.5, []) class Clause: __slots__ = ('split', 'criteria') def __init__(self, split, criteria): self.split = split self.criteria = criteria def matches(self, transaction): return all(transaction[criterion[0]] == criterion[1] for criterion in self.criteria) def mock_clauses(): store_id = 2 country_id = 3 transaction_type_id = 4 return [ Clause(0.25, [(store_id, 286), (country_id, 1)]), Clause(0.3, [(store_id, 286)]), Clause(0.4, [(store_id, 1), (transaction_type_id, 10)]), Clause(0.43, [(store_id, 1)]) ] def mock_contracts_for(vendor_id): return [Contract(contract_start=start_dates[i], contract_end=end_dates[i], payee=str(vendor_id) + payee, clauses=mock_clauses()) for i in range(len(start_dates)) for payee in ('Payee 1', 'Payee 2')] contracts = {vendor_id: mock_contracts_for(vendor_id) for vendor_id in vendor_ids}