FDIC Data

Overview

Zip File Download

Full Script

from pathlib import Path import zipfile ''' to use the call_reports.py utility, download the call report zip files from https://cdr.ffiec.gov/public/PWS/DownloadBulkData.aspx and place in "./data/call-reports/" in the current working directory ''' def table(text): lines = text.split('\n') columns = [x for x in lines[0].split('\t') if x.strip()!= ''] data = lines[1:] results = [] for line in [x for x in data if x.strip() != '']: values = line.split('\t') item = {} results.append(item) for index, column in enumerate(columns): item[column] = values[index] pass return results def details(file): if file == 'Readme.txt': pass if file.lower() == 'readme.txt': return {"name":file,"date":None, "qualifier":None} split1 = file.split('.') temp1 = split1[0] start_index = temp1.find('(') qual = None if start_index != -1: # Slice from that index to the very end qual = temp1[start_index:] temp2 = temp1.split('(', 1)[0] split2 = temp2.split(' ') date = split2.pop() year = date[-4:] day = date[2:4] month= date[0:2] name = split2.pop() result = {"name":name, "date":year+'-'+month+'-'+day, "qualifier":qual, "file":file} return result def query(process,filter=lambda x:True, read=True): target_dir = Path("./data/call-reports") # Check if the directory exists and list files if target_dir.exists() and target_dir.is_dir(): files = [f.name for f in target_dir.iterdir() if f.is_file()] for file in files: with zipfile.ZipFile('./data/call-reports/'+file, 'r') as zf: file_list = [x for x in zf.namelist() if filter(x)] for file in file_list: if file.lower() != 'readme.txt': file_content = None if read==True: # Get all contents as a bytes string file_bytes = zf.read(file) # Convert bytes to string file_content = file_bytes.decode('utf-8') process(file_content, file) pass pass pass pass pass pass map = None def id_map(): global map if map != None: return map map = {} def filter(file): name = details(file)['name'] if name == 'POR': return True return False def process1(text, file): tab = table(text) for item in tab: map[item['"IDRSSD"']] = item pass pass query(process1, filter) return map def files(): results = set() target_dir = Path("./data/call-reports") # Check if the directory exists and list files if target_dir.exists() and target_dir.is_dir(): files = [f.name for f in target_dir.iterdir() if f.is_file()] for file in files: with zipfile.ZipFile('./data/call-reports/'+file, 'r') as zf: file_list = [details(x)['name'] for x in zf.namelist()] for fl in [x for x in file_list if x.lower()!='readme.txt']: results.add(fl) pass pass return list(results) def fields(file): results = set() def process(text, file): nonlocal results lines = text.split('\n') line = lines[0] split = line.split('\t') for item in split: results.add(item) pass def filter(file1): dets = details(file1) if dets['name'] == file: return True return False query(process, filter) return list(results) def banks(): map = id_map() results = [] for key in map: results.append(map[key]) return results def get(id, fields): if not isinstance(fields, list): fields = [fields] map = {} splits = [field.split('.') for field in fields] files = [split[0] for split in splits] def process(text, file): date = details(file)['date'] tab = table(text) for item in tab: if item['"IDRSSD"'] == id: record = {"date":date, "id":id} for split in splits: if split[0] == details(file)['name']: field = split[1] record[field] = item[split[1]] pass pass map[date] = record pass pass def filter(file): nonlocal files return details(file)['name'] in files query(process, filter) results = [] for date in map: results.append(map[date]) return results if __name__ == '__main__': fls = files() test_fields = fields('RCM') def test(text, file): det =details(file) tab = table(text) pass bks = banks() print(bks) test2 = get('1351','RCM.RCONN523') pass