class CodeTracker: def __init__(self, name): self.name = name self.table = SQLTable( "%s.%s" % (config.WIOD_SCHEMA, name), ["code", "description"], ["varchar(15)", "varchar(255)"]) self.code_dict = None def setup(self): self.table.create() self.get_codes() # get existing codes from db def get_codes(self): if self.code_dict is None: self.code_dict = {} for (code, desc) in self.table.getall(): self.code_dict[code] = desc def get_desc_for_code(self, code): if code in self.code_dict: return self.code_dict[code] return None # returns the code used if it was recognized, false otherwise def set_code(self, code, desc): if type(code) is str: code = code.strip() elif type(code) is float: code = str(int(code)) if type(desc) is str: desc = desc.strip() if code is None or not len(code): if desc is None or not len(desc): # ignore empty args return False elif desc in config.fd_sectors: # choose manual codes code = config.fd_sectors[desc] elif desc in config.va_sectors: # choose manual codes code = config.va_sectors[desc] else: return False elif code in config.code_blacklist: # ignore invalid values for codes return False if code in self.code_dict and self.code_dict[code] != desc: print(self.code_dict[code], desc) self.code_dict[code] = desc return code def update_codes(self): self.table.truncate() for code in sorted(self.code_dict.keys()): desc = self.code_dict[code] self.table.insert([code, desc])
def __init__(self): self.gdp_deflators = {} self.pce_deflators = {} table = SQLTable(TABLE_NAME, ["year", "gdp", "pce"], ["int", "float", "float"]) result = table.getall() for row in result: year = row[0] self.gdp_deflators[year] = row[1] self.pce_deflators[year] = row[2]
class SectorCodes: def __init__(self, codetablename, mode="r"): self.mode = mode self.codetable = SQLTable(codetablename, ["code", "description"], ["varchar(15)", "varchar(255)"]) self.code_dict = {} self.reverse_code_dict = {} self.setup() def setup(self): if self.mode == "w": # invalid codes or codes that we don't want to record self.code_blacklist = [] # if we want to override the code provided with something # we make up (or from another set) based on the description self.manual_codes = {} self.codetable.create() # get existing codes from db for (code, desc) in self.codetable.getall(): self.code_dict[code] = desc self.reverse_code_dict[desc] = code return self # for write mode def blacklist_code(self, code): self.code_blacklist.append(code) if code in self.code_dict: del self.code_dict[code] def set_blacklist(self, code_blacklist): self.code_blacklist = [] for code in code_blacklist: self.blacklist_code(code) def curate_code_from_desc(self, desc, code): self.manual_codes[desc] = code self.code_dict[code] = desc self.reverse_code_dict[desc] = code def add_curated_codes(self, curated_codes): for (desc, code) in curated_codes.items(): self.curate_code_from_desc(desc, code) # returns the code used if it was recognized, false otherwise def set_code(self, code, desc): if type(code) is str: code = code.strip() elif type(code) is float: code = str(int(code)) if type(desc) is str: desc = desc.strip() if desc in self.manual_codes: code = self.manual_codes[desc] if code is None or not len(code): if desc is None or not len(desc): # ignore empty args return False else: return False elif code in self.code_blacklist: return False if code in self.code_dict and self.code_dict[code] != desc: # this is to check for blatant differences print(self.code_dict[code], "=>", desc) self.code_dict[code] = desc # there may be more than one description for the same code self.reverse_code_dict[desc] = code return code def has_code(self, code): return code in self.code_dict def get_code_for_title(self, desc): if desc in self.reverse_code_dict: return self.reverse_code_dict[desc] def get_title_for_code(self, code): if self.has_code(code): return self.code_dict[code] return False def update_codes(self): if self.mode != "w": raise Exception("SectorCodes created in read-only mode") self.codetable.truncate() for code in sorted(self.code_dict.keys()): desc = self.code_dict[code] self.codetable.insert([code, desc])
class SectorCodes: def __init__(self, codetablename, mode="r"): self.mode = mode self.codetable = SQLTable( codetablename, ["code", "description"], ["varchar(15)", "varchar(255)"]) self.code_dict = {} self.reverse_code_dict = {} self.setup() def setup(self): if self.mode == "w": # invalid codes or codes that we don't want to record self.code_blacklist = [] # if we want to override the code provided with something # we make up (or from another set) based on the description self.manual_codes = {} self.codetable.create() # get existing codes from db for (code, desc) in self.codetable.getall(): self.code_dict[code] = desc self.reverse_code_dict[desc] = code return self # for write mode def blacklist_code(self, code): self.code_blacklist.append(code) if code in self.code_dict: del self.code_dict[code] def set_blacklist(self, code_blacklist): self.code_blacklist = [] for code in code_blacklist: self.blacklist_code(code) def curate_code_from_desc(self, desc, code): self.manual_codes[desc] = code self.code_dict[code] = desc self.reverse_code_dict[desc] = code def add_curated_codes(self, curated_codes): for (desc, code) in curated_codes.items(): self.curate_code_from_desc(desc, code) # returns the code used if it was recognized, false otherwise def set_code(self, code, desc): if type(code) is str: code = code.strip() elif type(code) is float: code = str(int(code)) if type(desc) is str: desc = desc.strip() if desc in self.manual_codes: code = self.manual_codes[desc] if code is None or not len(code): if desc is None or not len(desc): # ignore empty args return False else: return False elif code in self.code_blacklist: return False if code in self.code_dict and self.code_dict[code] != desc: # this is to check for blatant differences print(self.code_dict[code], "=>", desc) self.code_dict[code] = desc # there may be more than one description for the same code self.reverse_code_dict[desc] = code return code def has_code(self, code): return code in self.code_dict def get_code_for_title(self, desc): if desc in self.reverse_code_dict: return self.reverse_code_dict[desc] def get_title_for_code(self, code): if self.has_code(code): return self.code_dict[code] return False def update_codes(self): if self.mode != "w": raise Exception("SectorCodes created in read-only mode") self.codetable.truncate() for code in sorted(self.code_dict.keys()): desc = self.code_dict[code] self.codetable.insert([code, desc])