Created
July 3, 2019 08:16
-
-
Save Tooluloope/45669f476ce496259bfeb0411a9b0347 to your computer and use it in GitHub Desktop.
Ad Hoc Home work
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import csv | |
ZIP_CODE_FILE_NAME = 'zips.csv' | |
COVERAGE_PLAN_FILE_NAME = 'plans.csv' | |
SLCSP_FILE_NAME = 'slcsp.csv' | |
SLCSP_OUTPUT_FILE_NAME = 'slcsp_answer.csv' | |
PLAN_TYPE = 'Silver' | |
def generate_slcsp_output(): | |
zipcodes = ZipCodes(ZIP_CODE_FILE_NAME).load() | |
coverage_plans = CoveragePlans(COVERAGE_PLAN_FILE_NAME).load() | |
slc_silver_plan = Slcsp(SLCSP_FILE_NAME, zipcodes, | |
coverage_plans).load() | |
slc_silver_plan.calculate_slcsp() | |
slc_silver_plan.write_slcsp(SLCSP_OUTPUT_FILE_NAME) | |
class Slcsp(): | |
def __init__(self, slcsp_file_name, zipcodes, coverage_plans): | |
self.slcsp_file_name = slcsp_file_name | |
self.zipcodes = zipcodes | |
self.coverage_plans = coverage_plans | |
self.slcsp_rows = None | |
def load(self, slcsp_file_name=None): | |
if slcsp_file_name is not None: | |
self.slcsp_file_name = slcsp_file_name | |
with open(self.slcsp_file_name) as slcsp_file: | |
csv_reader = csv.DictReader(slcsp_file) | |
self.slcsp_rows = [] | |
for row in csv_reader: | |
self.slcsp_rows.append(row) | |
return self | |
def calculate_slcsp(self): | |
for slcsp_row in self.slcsp_rows: | |
zip_code_rows = self.zipcodes.get_by_zipcode(slcsp_row['zipcode']) | |
silver_rates = [] | |
initial_rate_area = None | |
for zip_code_row in zip_code_rows: | |
if not initial_rate_area: | |
initial_rate_area = zip_code_row['rate_area'] | |
elif initial_rate_area != zip_code_row['rate_area']: | |
silver_rates = [] | |
break | |
coverage_plan_rows = self.coverage_plans.get_by_state_rate_area( | |
zip_code_row['state'], zip_code_row['rate_area']) | |
for coverage_plan_row in coverage_plan_rows: | |
if coverage_plan_row['metal_level'] == PLAN_TYPE: | |
silver_rates.append(float(coverage_plan_row['rate'])) | |
if len(silver_rates): | |
silver_rates = sorted(set(silver_rates)) | |
if len(silver_rates) == 1: | |
slcsp_row['rate'] = silver_rates[0] | |
else: | |
slcsp_row['rate'] = silver_rates[1] | |
def write_slcsp(self, slcsp_output_file_name): | |
with open(slcsp_output_file_name, 'w') as slcsp_output_file: | |
field_names = ['zipcode', 'rate'] | |
csv_writer = csv.DictWriter( | |
slcsp_output_file, fieldnames=field_names) | |
csv_writer.writeheader() | |
for slcsp_row in self.slcsp_rows: | |
csv_writer.writerow(slcsp_row) | |
class ZipCodes(): | |
def __init__(self, zip_code_file_name): | |
self.zip_code_file_name = zip_code_file_name | |
self.zip_code_mapping = None | |
def load(self, zip_code_file_name=None): | |
if zip_code_file_name is not None: | |
self.zip_code_file_name = zip_code_file_name | |
with open(self.zip_code_file_name) as zip_code_file: | |
csv_reader = csv.DictReader(zip_code_file) | |
self.zip_code_mapping = {} | |
for row in csv_reader: | |
if not row['zipcode'] in self.zip_code_mapping: | |
self.zip_code_mapping[row['zipcode']] = [] | |
self.zip_code_mapping[row['zipcode']].append(row) | |
return self | |
def get_by_zipcode(self, zipcode): | |
if zipcode not in self.zip_code_mapping: | |
return [] | |
return self.zip_code_mapping[zipcode] | |
class CoveragePlans(): | |
def __init__(self, coverage_plan_file_name): | |
self.coverage_plan_file_name = coverage_plan_file_name | |
self.coverage_plan_mapping = None | |
def load(self, coverage_plan_file_name=None): | |
if coverage_plan_file_name is not None: | |
self.coverage_plan_file_name = coverage_plan_file_name | |
with open(self.coverage_plan_file_name) as coverage_plan_file: | |
csv_reader = csv.DictReader(coverage_plan_file) | |
self.coverage_plan_mapping = {} | |
for row in csv_reader: | |
rate_area_tuple = row['state'] + ' ' + row['rate_area'] | |
if rate_area_tuple not in self.coverage_plan_mapping: | |
self.coverage_plan_mapping[rate_area_tuple] = [] | |
self.coverage_plan_mapping[rate_area_tuple].append(row) | |
return self | |
def get_by_state_rate_area(self, state, rate_area): | |
rate_area_tuple = state + ' ' + rate_area | |
if rate_area_tuple not in self.coverage_plan_mapping: | |
return [] | |
return self.coverage_plan_mapping[rate_area_tuple] | |
generate_slcsp_output() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment