Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- """
- To run:
- 1. If csv files are downloaded to 'slcsp' directory in the same hierarchy this file exists
- >>> python calculate_slcsp.py
- (OR)
- 2. To give custom paths to csv files
- >>> python calculate_slcsp.py <SLCSP_CSV_FILE_PATH> <ZIPS_CSV_FILE_PATH> <PLANS_CSV_FILE_PATH>
- """
- from collections import OrderedDict
- import csv
- import sys
- DEFAULT_SLCSP_CSV_FILEPATH = 'slcsp/slcsp.csv'
- DEFAULT_ZIPS_CSV_FILEPATH = 'slcsp/zips.csv'
- DEFAULT_PLANS_CSV_FILEPATH = 'slcsp/plans.csv'
- def calculate_slcsp(slcsp_csv, zips_csv, plans_csv):
- slcsp = read_csv(slcsp_csv)
- zips = read_csv(zips_csv)
- plans = read_csv(plans_csv)
- silver_plans = get_silver_plans(plans)
- zipcode_rate_dict = get_zipcode_rate_area(slcsp, zips)
- slcsp_plans = get_plans_for_zipcode(zipcode_rate_dict, silver_plans)
- write_csv(slcsp_plans)
- return
- def get_zipcode_rate_area(slcsp, zips):
- zipcode_rate_dict = OrderedDict()
- for slcsp_row in slcsp:
- slcsp_zipcode = slcsp_row['zipcode']
- for zip_row in zips:
- zipcode = zip_row['zipcode']
- rate_area = zip_row['rate_area']
- state = zip_row['state']
- if slcsp_zipcode != zipcode:
- continue
- if zipcode in zipcode_rate_dict:
- if zipcode_rate_dict[zipcode]['rate_area'] != rate_area:
- # Handling case when zipcode has different multiple rates
- zipcode_rate_dict[zipcode] = None
- break
- else:
- zipcode_rate_dict[zipcode] = {'rate_area': rate_area,
- 'state': state}
- if slcsp_zipcode not in zipcode_rate_dict:
- zipcode_rate_dict[slcsp_zipcode] = None
- return zipcode_rate_dict
- def get_plans_for_zipcode(zipcode_rate_dict, plans):
- slcsp_plans = OrderedDict()
- for zipcode in zipcode_rate_dict:
- if zipcode_rate_dict[zipcode]:
- rate_area = zipcode_rate_dict[zipcode]['rate_area']
- state = zipcode_rate_dict[zipcode]['state']
- for plan in plans:
- if rate_area == plan['rate_area'] and state == plan['state']:
- if zipcode not in slcsp_plans:
- slcsp_plans[zipcode] = []
- slcsp_plans[zipcode].append(plan['rate'])
- else:
- slcsp_plans[zipcode] = []
- if zipcode not in slcsp_plans:
- slcsp_plans[zipcode] = []
- return slcsp_plans
- def read_csv(file_name):
- content = []
- csv_dict_reader = csv.DictReader(open(file_name, 'r'))
- for row in csv_dict_reader:
- content.append(row)
- return content
- def write_csv(slcsp_plans):
- csv_rows = []
- csv_rows.append('zipcode,rate')
- for zipcode in slcsp_plans:
- rates = list(set(slcsp_plans[zipcode]))
- sorted_rates = sorted(rates)
- if len(sorted_rates) > 1:
- # Selecting 2nd lowest plan and rounding to two digits
- csv_rows.append('{},{}'.format(zipcode, round(float(sorted_rates[1]),2)))
- else:
- # Handling case when zipcode has only zero or one rate plans
- csv_rows.append('{},{}'.format(zipcode, ''))
- print('\n'.join(csv_rows))
- def get_silver_plans(plans):
- silver_plans = []
- for plan in plans:
- if plan['metal_level'] == 'Silver':
- silver_plans.append(plan)
- return silver_plans
- if __name__ == '__main__':
- if len(sys.argv) == 4:
- slcsp_csv = sys.argv[1]
- zips_csv = sys.argv[2]
- plans_csv = sys.argv[3]
- else:
- slcsp_csv = DEFAULT_SLCSP_CSV_FILEPATH
- zips_csv = DEFAULT_ZIPS_CSV_FILEPATH
- plans_csv = DEFAULT_PLANS_CSV_FILEPATH
- calculate_slcsp(slcsp_csv, zips_csv, plans_csv)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement