Skip to content

Instantly share code, notes, and snippets.

@Tooluloope
Created July 3, 2019 08:16
Show Gist options
  • Save Tooluloope/45669f476ce496259bfeb0411a9b0347 to your computer and use it in GitHub Desktop.
Save Tooluloope/45669f476ce496259bfeb0411a9b0347 to your computer and use it in GitHub Desktop.
Ad Hoc Home work
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