From ea156c210ed8d2b53640425c82225e1d5dcd8797 Mon Sep 17 00:00:00 2001 From: chenzheng06 Date: Mon, 1 May 2017 11:34:25 -0400 Subject: [PATCH 01/10] create monthly_saving calculation function --- bpfin/financials/monthly_saving.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 bpfin/financials/monthly_saving.py diff --git a/bpfin/financials/monthly_saving.py b/bpfin/financials/monthly_saving.py new file mode 100644 index 0000000..20a43ba --- /dev/null +++ b/bpfin/financials/monthly_saving.py @@ -0,0 +1,25 @@ +import datetime +from bpfin.utilbills.bill_lib import cal_last_day + + +def monthly_saving(commissioning_date, proforma_date, prior_list, post_list): + """ + Calculate monthly saving on usage, or on charge, considering the commissioning date. + Args: + commissioning_date (date): the date that construction work finished, saving starts at NEXT month + proforma_date (list): list of dates, months of pro-forma time period + prior_list (list): list of float, usage or charge without (prior to) savings + post_list (list): list of float, usage or charge with (post to) savings + """ + saving_start_date = datetime.date( + commissioning_date.year, + commissioning_date.month, + cal_last_day(commissioning_date.year, commissioning_date.month)) + saving_dict = {} + for date, prior, post in zip(proforma_date, prior_list, post_list): + if date > saving_start_date: + saving_dict[date] = prior_list - post_list + else: + saving_dict[date] = prior_list + return saving_dict + -- GitLab From afb14f648c6f77e167354c658c6c59edca7aab2e Mon Sep 17 00:00:00 2001 From: chenzheng06 Date: Mon, 1 May 2017 12:09:26 -0400 Subject: [PATCH 02/10] Create test file for monthly_saving calculation. Add exe sample comments for saving calculation in data_generation. --- bpfin/financials/monthly_saving.py | 12 +++---- .../test_financials/test_monthly_saving.py | 25 +++++++++++++++ bpfin/utilbills/data_generation.py | 31 ++++++++++++++++--- 3 files changed, 58 insertions(+), 10 deletions(-) create mode 100644 bpfin/tests/test_financials/test_monthly_saving.py diff --git a/bpfin/financials/monthly_saving.py b/bpfin/financials/monthly_saving.py index 20a43ba..1f17500 100644 --- a/bpfin/financials/monthly_saving.py +++ b/bpfin/financials/monthly_saving.py @@ -10,16 +10,16 @@ def monthly_saving(commissioning_date, proforma_date, prior_list, post_list): proforma_date (list): list of dates, months of pro-forma time period prior_list (list): list of float, usage or charge without (prior to) savings post_list (list): list of float, usage or charge with (post to) savings + Return: + list: list of float, monthly saving values on usage or charge """ saving_start_date = datetime.date( - commissioning_date.year, - commissioning_date.month, + commissioning_date.year, commissioning_date.month, cal_last_day(commissioning_date.year, commissioning_date.month)) saving_dict = {} for date, prior, post in zip(proforma_date, prior_list, post_list): if date > saving_start_date: - saving_dict[date] = prior_list - post_list + saving_dict[date] = prior - post else: - saving_dict[date] = prior_list - return saving_dict - + saving_dict[date] = 0 + return list(saving_dict.values()) diff --git a/bpfin/tests/test_financials/test_monthly_saving.py b/bpfin/tests/test_financials/test_monthly_saving.py new file mode 100644 index 0000000..c9ad367 --- /dev/null +++ b/bpfin/tests/test_financials/test_monthly_saving.py @@ -0,0 +1,25 @@ +import datetime +from bpfin.financials.monthly_saving import monthly_saving + + +def test_monthly_saving(): + input_proforma_date = [ + datetime.date(2017, 1, 31), + datetime.date(2017, 2, 28), + datetime.date(2017, 3, 31), + datetime.date(2017, 4, 30), + datetime.date(2017, 5, 31), + datetime.date(2017, 6, 30), + datetime.date(2017, 7, 31), + datetime.date(2017, 8, 31), + datetime.date(2017, 9, 30), + datetime.date(2017, 10, 31), + datetime.date(2017, 11, 30), + datetime.date(2017, 12, 31), ] + input_commissioning_date = datetime.date(2017, 3, 14) + input_prior_list = [100] * 12 + post_post_list = [100, 90, 80, 70, 60, 50, 40, 30, 40, 50, 60, 70] + + out_put_list = [0, 0, 0, 30, 40, 50, 60, 70, 60, 50, 40, 30] + result_list = monthly_saving(input_commissioning_date, input_proforma_date, input_prior_list, post_post_list) + assert out_put_list == result_list diff --git a/bpfin/utilbills/data_generation.py b/bpfin/utilbills/data_generation.py index d7219d8..8f859fe 100644 --- a/bpfin/utilbills/data_generation.py +++ b/bpfin/utilbills/data_generation.py @@ -1,7 +1,12 @@ -# from bpfin.utilbills.bill_month_normalize_rough import bill_month_normalize_rough -# from bpfin.utilbills.bill_prior_proj_rough import bill_prior_proj_rough -# from bpfin.utilbills import bill_lib as bl -# from bpfin.tests.testdata import sample_data as db +import copy +from bpfin.utilbills.bill_month_normalize_rough import bill_month_normalize_rough +from bpfin.utilbills.bill_prior_proj_rough import bill_prior_proj_rough +from bpfin.lib import other as lib +from bpfin.utilbills import bill_lib as bl +from bpfin.financials import financial_lib as fl +from bpfin.tests.testdata import sample_data as db + + # raw_bill = db.raw_bill @@ -11,3 +16,21 @@ # print(annual_bill_electricity) + +# prior_energy_bill = db.bill_overview_organized +# raw_income_input = db.raw_income_input + +# IS_prior = fl.Income_Statement_Table(raw_income_input, prior_energy_bill) +# IS_prior.project(-2.0, db.analysis_date, prior_energy_bill) + +# post_energy_bill = copy.deepcopy(db.bill_overview_organized) +# post_energy_bill['electricity'] = bl.annualizing_projection( +# db.post_bill_rough['date_to'], db.post_proj_rough_charge) + +# IS_post = fl.Income_Statement_Table(raw_income_input, post_energy_bill) +# IS_post.project(-2.0, db.analysis_date, post_energy_bill) + +# prior_noi = (IS_prior.get_noi_dict().values()) +# post_noi = (IS_post.get_noi_dict().values()) + +# print(lib.sublist(prior_noi, post_noi)) -- GitLab From 64cd327d304934eeb13d09c0004a159e53d51acb Mon Sep 17 00:00:00 2001 From: chenzheng06 Date: Mon, 1 May 2017 12:10:50 -0400 Subject: [PATCH 03/10] Comments in data_generation --- bpfin/utilbills/data_generation.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/bpfin/utilbills/data_generation.py b/bpfin/utilbills/data_generation.py index 8f859fe..10ae15d 100644 --- a/bpfin/utilbills/data_generation.py +++ b/bpfin/utilbills/data_generation.py @@ -1,10 +1,10 @@ -import copy -from bpfin.utilbills.bill_month_normalize_rough import bill_month_normalize_rough -from bpfin.utilbills.bill_prior_proj_rough import bill_prior_proj_rough -from bpfin.lib import other as lib -from bpfin.utilbills import bill_lib as bl -from bpfin.financials import financial_lib as fl -from bpfin.tests.testdata import sample_data as db +# import copy +# from bpfin.utilbills.bill_month_normalize_rough import bill_month_normalize_rough +# from bpfin.utilbills.bill_prior_proj_rough import bill_prior_proj_rough +# from bpfin.lib import other as lib +# from bpfin.utilbills import bill_lib as bl +# from bpfin.financials import financial_lib as fl +# from bpfin.tests.testdata import sample_data as db -- GitLab From e2f115db8a8e3239a8c7e6748572fc50286f5dea Mon Sep 17 00:00:00 2001 From: chenzheng06 Date: Mon, 1 May 2017 16:13:09 -0400 Subject: [PATCH 04/10] Modify monthly_saving function formatting and variable names --- bpfin/financials/monthly_saving.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/bpfin/financials/monthly_saving.py b/bpfin/financials/monthly_saving.py index 1f17500..0f2ee41 100644 --- a/bpfin/financials/monthly_saving.py +++ b/bpfin/financials/monthly_saving.py @@ -2,22 +2,23 @@ import datetime from bpfin.utilbills.bill_lib import cal_last_day -def monthly_saving(commissioning_date, proforma_date, prior_list, post_list): +def monthly_saving(commissioning_date, proforma_date, prior_saving_list, post_saving_list): """ Calculate monthly saving on usage, or on charge, considering the commissioning date. Args: commissioning_date (date): the date that construction work finished, saving starts at NEXT month proforma_date (list): list of dates, months of pro-forma time period - prior_list (list): list of float, usage or charge without (prior to) savings - post_list (list): list of float, usage or charge with (post to) savings + prior_saving_list (list): list of float, usage or charge without (prior to) savings + post_saving_list (list): list of float, usage or charge with (post to) savings Return: list: list of float, monthly saving values on usage or charge """ saving_start_date = datetime.date( - commissioning_date.year, commissioning_date.month, + commissioning_date.year, + commissioning_date.month, cal_last_day(commissioning_date.year, commissioning_date.month)) saving_dict = {} - for date, prior, post in zip(proforma_date, prior_list, post_list): + for date, prior, post in zip(proforma_date, prior_saving_list, post_saving_list): if date > saving_start_date: saving_dict[date] = prior - post else: -- GitLab From 2559b2b20e06c3c2215e5a2f157e827963a43e5b Mon Sep 17 00:00:00 2001 From: chenzheng06 Date: Mon, 1 May 2017 17:48:28 -0400 Subject: [PATCH 05/10] Update saving calculation exe sample in data_generation --- bpfin/utilbills/data_generation.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/bpfin/utilbills/data_generation.py b/bpfin/utilbills/data_generation.py index 10ae15d..3f8da74 100644 --- a/bpfin/utilbills/data_generation.py +++ b/bpfin/utilbills/data_generation.py @@ -1,6 +1,8 @@ +# import datetime # import copy # from bpfin.utilbills.bill_month_normalize_rough import bill_month_normalize_rough # from bpfin.utilbills.bill_prior_proj_rough import bill_prior_proj_rough +# from bpfin.financials.monthly_saving import monthly_saving # from bpfin.lib import other as lib # from bpfin.utilbills import bill_lib as bl # from bpfin.financials import financial_lib as fl @@ -24,8 +26,16 @@ # IS_prior.project(-2.0, db.analysis_date, prior_energy_bill) # post_energy_bill = copy.deepcopy(db.bill_overview_organized) +# saving_list = monthly_saving(datetime.date(2018, 1, 1), db.proforma_date_to, db.prior_proj_rough_charge, db.post_proj_rough_charge) +# # print(saving_list) +# post_saving_e_bill = lib.sublist( +# db.prior_proj_rough_charge, +# saving_list +# ) +# # print(post_saving_e_bill) + # post_energy_bill['electricity'] = bl.annualizing_projection( -# db.post_bill_rough['date_to'], db.post_proj_rough_charge) +# db.post_bill_rough['date_to'], post_saving_e_bill) # IS_post = fl.Income_Statement_Table(raw_income_input, post_energy_bill) # IS_post.project(-2.0, db.analysis_date, post_energy_bill) @@ -33,4 +43,4 @@ # prior_noi = (IS_prior.get_noi_dict().values()) # post_noi = (IS_post.get_noi_dict().values()) -# print(lib.sublist(prior_noi, post_noi)) +# print(lib.sublist(post_noi, prior_noi)) -- GitLab From 8ee4c1808381a4794192ee998483bb5d0d05f59f Mon Sep 17 00:00:00 2001 From: chenzheng06 Date: Mon, 1 May 2017 19:01:51 -0400 Subject: [PATCH 06/10] Create Saving class in monthly_saving to calculate and store saving related variables. Delete previous functions --- bpfin/financials/monthly_saving.py | 68 +++++++++++++------ .../test_financials/test_monthly_saving.py | 16 +++-- bpfin/utilbills/data_generation.py | 53 +++++++-------- 3 files changed, 83 insertions(+), 54 deletions(-) diff --git a/bpfin/financials/monthly_saving.py b/bpfin/financials/monthly_saving.py index 0f2ee41..b55e26c 100644 --- a/bpfin/financials/monthly_saving.py +++ b/bpfin/financials/monthly_saving.py @@ -2,25 +2,53 @@ import datetime from bpfin.utilbills.bill_lib import cal_last_day -def monthly_saving(commissioning_date, proforma_date, prior_saving_list, post_saving_list): +class Saving(): """ - Calculate monthly saving on usage, or on charge, considering the commissioning date. - Args: - commissioning_date (date): the date that construction work finished, saving starts at NEXT month - proforma_date (list): list of dates, months of pro-forma time period - prior_saving_list (list): list of float, usage or charge without (prior to) savings - post_saving_list (list): list of float, usage or charge with (post to) savings - Return: - list: list of float, monthly saving values on usage or charge + Calculate savings and project bills with commissioning date considered. + Attributes: + commissioning_date (date): the date that construction work finished, saving starts at NEXT month + proforma_date (list): list of dates, months of pro-forma time period + prior_saving_list (list): list of float, usage or charge without (prior to) savings + post_saving_list (list): list of float, usage or charge with (post to) savings + proforma_bill (list): monthly usage or charge, for pro-forma period + Data before commissioning date == historical + Data after commissioning date == post saving data + proforma_saving (list): monthly savings on usage or charge, for pro-forma period + Data before commissioning date == historical + Data after commissioning date == post saving data + first_year_saving (float): first year saving, usage or charge """ - saving_start_date = datetime.date( - commissioning_date.year, - commissioning_date.month, - cal_last_day(commissioning_date.year, commissioning_date.month)) - saving_dict = {} - for date, prior, post in zip(proforma_date, prior_saving_list, post_saving_list): - if date > saving_start_date: - saving_dict[date] = prior - post - else: - saving_dict[date] = 0 - return list(saving_dict.values()) + def __init__(self, commissioning_date, proforma_date, prior_saving_list, post_saving_list): + self.commissioning_date = commissioning_date + self.proforma_date = proforma_date + self.prior_saving_list = prior_saving_list + self.post_saving_list = post_saving_list + self.proforma_bill = [] + self.proforma_saving = [] + self.first_year_saving = None + + saving_start_date = datetime.date( + self.commissioning_date.year, + self.commissioning_date.month, + cal_last_day(self.commissioning_date.year, self.commissioning_date.month)) + saving_dict = {} + bill_dict = {} + for date, prior, post in zip(proforma_date, prior_saving_list, post_saving_list): + if date > saving_start_date: + saving_dict[date] = prior - post + bill_dict[date] = post + else: + saving_dict[date] = 0 + bill_dict[date] = prior + self.proforma_saving = list(saving_dict.values()) + self.proforma_bill = list(bill_dict.values()) + + def get_proforma_bill(self): + return self.proforma_bill + + def get_proforma_saving(self): + return self.proforma_saving + + def get_first_year_saving(self): + # need calculation + return self.first_year_saving diff --git a/bpfin/tests/test_financials/test_monthly_saving.py b/bpfin/tests/test_financials/test_monthly_saving.py index c9ad367..257a279 100644 --- a/bpfin/tests/test_financials/test_monthly_saving.py +++ b/bpfin/tests/test_financials/test_monthly_saving.py @@ -1,8 +1,8 @@ import datetime -from bpfin.financials.monthly_saving import monthly_saving +from bpfin.financials.monthly_saving import Saving -def test_monthly_saving(): +def test_Saving(): input_proforma_date = [ datetime.date(2017, 1, 31), datetime.date(2017, 2, 28), @@ -18,8 +18,12 @@ def test_monthly_saving(): datetime.date(2017, 12, 31), ] input_commissioning_date = datetime.date(2017, 3, 14) input_prior_list = [100] * 12 - post_post_list = [100, 90, 80, 70, 60, 50, 40, 30, 40, 50, 60, 70] + input_post_list = [100, 90, 80, 70, 60, 50, 40, 30, 40, 50, 60, 70] - out_put_list = [0, 0, 0, 30, 40, 50, 60, 70, 60, 50, 40, 30] - result_list = monthly_saving(input_commissioning_date, input_proforma_date, input_prior_list, post_post_list) - assert out_put_list == result_list + output_saving = [0, 0, 0, 30, 40, 50, 60, 70, 60, 50, 40, 30] + output_bill = [100, 100, 100, 70, 60, 50, 40, 30, 40, 50, 60, 70] + elec_saving = Saving(input_commissioning_date, input_proforma_date, input_prior_list, input_post_list) + result_saving = elec_saving.get_proforma_saving() + result_bill = elec_saving.get_proforma_bill() + assert output_saving == result_saving + assert output_bill == result_bill diff --git a/bpfin/utilbills/data_generation.py b/bpfin/utilbills/data_generation.py index 3f8da74..8a3918e 100644 --- a/bpfin/utilbills/data_generation.py +++ b/bpfin/utilbills/data_generation.py @@ -1,12 +1,12 @@ -# import datetime -# import copy -# from bpfin.utilbills.bill_month_normalize_rough import bill_month_normalize_rough -# from bpfin.utilbills.bill_prior_proj_rough import bill_prior_proj_rough -# from bpfin.financials.monthly_saving import monthly_saving -# from bpfin.lib import other as lib -# from bpfin.utilbills import bill_lib as bl -# from bpfin.financials import financial_lib as fl -# from bpfin.tests.testdata import sample_data as db +import datetime +import copy +from bpfin.utilbills.bill_month_normalize_rough import bill_month_normalize_rough +from bpfin.utilbills.bill_prior_proj_rough import bill_prior_proj_rough +from bpfin.financials.monthly_saving import Saving +from bpfin.lib import other as lib +from bpfin.utilbills import bill_lib as bl +from bpfin.financials import financial_lib as fl +from bpfin.tests.testdata import sample_data as db @@ -19,28 +19,25 @@ # print(annual_bill_electricity) -# prior_energy_bill = db.bill_overview_organized -# raw_income_input = db.raw_income_input +prior_energy_bill = db.bill_overview_organized +raw_income_input = db.raw_income_input -# IS_prior = fl.Income_Statement_Table(raw_income_input, prior_energy_bill) -# IS_prior.project(-2.0, db.analysis_date, prior_energy_bill) +IS_prior = fl.Income_Statement_Table(raw_income_input, prior_energy_bill) +IS_prior.project(-2.0, db.analysis_date, prior_energy_bill) -# post_energy_bill = copy.deepcopy(db.bill_overview_organized) -# saving_list = monthly_saving(datetime.date(2018, 1, 1), db.proforma_date_to, db.prior_proj_rough_charge, db.post_proj_rough_charge) -# # print(saving_list) -# post_saving_e_bill = lib.sublist( -# db.prior_proj_rough_charge, -# saving_list -# ) -# # print(post_saving_e_bill) +post_energy_bill = copy.deepcopy(db.bill_overview_organized) +saving = Saving(datetime.date(2018, 1, 1), db.proforma_date_to, db.prior_proj_rough_charge, db.post_proj_rough_charge) +# print(saving_list) +post_saving_e_bill = saving.get_proforma_bill() +# print(post_saving_e_bill) -# post_energy_bill['electricity'] = bl.annualizing_projection( -# db.post_bill_rough['date_to'], post_saving_e_bill) +post_energy_bill['electricity'] = bl.annualizing_projection( + db.post_bill_rough['date_to'], post_saving_e_bill) -# IS_post = fl.Income_Statement_Table(raw_income_input, post_energy_bill) -# IS_post.project(-2.0, db.analysis_date, post_energy_bill) +IS_post = fl.Income_Statement_Table(raw_income_input, post_energy_bill) +IS_post.project(-2.0, db.analysis_date, post_energy_bill) -# prior_noi = (IS_prior.get_noi_dict().values()) -# post_noi = (IS_post.get_noi_dict().values()) +prior_noi = (IS_prior.get_noi_dict().values()) +post_noi = (IS_post.get_noi_dict().values()) -# print(lib.sublist(post_noi, prior_noi)) +print(lib.sublist(post_noi, prior_noi)) -- GitLab From 28c9f5c2a063cdc2f9af143a3274acb5affb7675 Mon Sep 17 00:00:00 2001 From: chenzheng06 Date: Mon, 1 May 2017 19:02:24 -0400 Subject: [PATCH 07/10] Comments for exe sample in data_generation --- bpfin/utilbills/data_generation.py | 52 ++++++++++++++---------------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/bpfin/utilbills/data_generation.py b/bpfin/utilbills/data_generation.py index 8a3918e..b1d4352 100644 --- a/bpfin/utilbills/data_generation.py +++ b/bpfin/utilbills/data_generation.py @@ -1,14 +1,12 @@ -import datetime -import copy -from bpfin.utilbills.bill_month_normalize_rough import bill_month_normalize_rough -from bpfin.utilbills.bill_prior_proj_rough import bill_prior_proj_rough -from bpfin.financials.monthly_saving import Saving -from bpfin.lib import other as lib -from bpfin.utilbills import bill_lib as bl -from bpfin.financials import financial_lib as fl -from bpfin.tests.testdata import sample_data as db - - +# import datetime +# import copy +# from bpfin.utilbills.bill_month_normalize_rough import bill_month_normalize_rough +# from bpfin.utilbills.bill_prior_proj_rough import bill_prior_proj_rough +# from bpfin.financials.monthly_saving import Saving +# from bpfin.lib import other as lib +# from bpfin.utilbills import bill_lib as bl +# from bpfin.financials import financial_lib as fl +# from bpfin.tests.testdata import sample_data as db # raw_bill = db.raw_bill @@ -19,25 +17,25 @@ from bpfin.tests.testdata import sample_data as db # print(annual_bill_electricity) -prior_energy_bill = db.bill_overview_organized -raw_income_input = db.raw_income_input +# prior_energy_bill = db.bill_overview_organized +# raw_income_input = db.raw_income_input -IS_prior = fl.Income_Statement_Table(raw_income_input, prior_energy_bill) -IS_prior.project(-2.0, db.analysis_date, prior_energy_bill) +# IS_prior = fl.Income_Statement_Table(raw_income_input, prior_energy_bill) +# IS_prior.project(-2.0, db.analysis_date, prior_energy_bill) -post_energy_bill = copy.deepcopy(db.bill_overview_organized) -saving = Saving(datetime.date(2018, 1, 1), db.proforma_date_to, db.prior_proj_rough_charge, db.post_proj_rough_charge) -# print(saving_list) -post_saving_e_bill = saving.get_proforma_bill() -# print(post_saving_e_bill) +# post_energy_bill = copy.deepcopy(db.bill_overview_organized) +# saving = Saving(datetime.date(2018, 1, 1), db.proforma_date_to, db.prior_proj_rough_charge, db.post_proj_rough_charge) +# # print(saving_list) +# post_saving_e_bill = saving.get_proforma_bill() +# # print(post_saving_e_bill) -post_energy_bill['electricity'] = bl.annualizing_projection( - db.post_bill_rough['date_to'], post_saving_e_bill) +# post_energy_bill['electricity'] = bl.annualizing_projection( +# db.post_bill_rough['date_to'], post_saving_e_bill) -IS_post = fl.Income_Statement_Table(raw_income_input, post_energy_bill) -IS_post.project(-2.0, db.analysis_date, post_energy_bill) +# IS_post = fl.Income_Statement_Table(raw_income_input, post_energy_bill) +# IS_post.project(-2.0, db.analysis_date, post_energy_bill) -prior_noi = (IS_prior.get_noi_dict().values()) -post_noi = (IS_post.get_noi_dict().values()) +# prior_noi = (IS_prior.get_noi_dict().values()) +# post_noi = (IS_post.get_noi_dict().values()) -print(lib.sublist(post_noi, prior_noi)) +# print(lib.sublist(post_noi, prior_noi)) -- GitLab From 00836ed3362009d817d641fdd0208031fe85fd2d Mon Sep 17 00:00:00 2001 From: chenzheng06 Date: Mon, 1 May 2017 19:04:58 -0400 Subject: [PATCH 08/10] Add placeholder for get_annual_proforma_bill --- bpfin/financials/monthly_saving.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/bpfin/financials/monthly_saving.py b/bpfin/financials/monthly_saving.py index b55e26c..1bdd440 100644 --- a/bpfin/financials/monthly_saving.py +++ b/bpfin/financials/monthly_saving.py @@ -52,3 +52,8 @@ class Saving(): def get_first_year_saving(self): # need calculation return self.first_year_saving + + def get_annual_bill(self): + # need calculation + # need change file name + return annual_proforma_bill -- GitLab From be9f53acb05c428ea08c5a1de91c3888e1433661 Mon Sep 17 00:00:00 2001 From: chenzheng06 Date: Mon, 1 May 2017 23:02:37 -0400 Subject: [PATCH 09/10] Finish functions in Saving class, add comments and test file. Improve exe sample for saving and IS projection in data_generation. --- .../{monthly_saving.py => saving.py} | 31 +++++++++++++++++-- ...{test_monthly_saving.py => test_saving.py} | 6 +++- bpfin/utilbills/data_generation.py | 10 +++--- 3 files changed, 37 insertions(+), 10 deletions(-) rename bpfin/financials/{monthly_saving.py => saving.py} (72%) rename bpfin/tests/test_financials/{test_monthly_saving.py => test_saving.py} (79%) diff --git a/bpfin/financials/monthly_saving.py b/bpfin/financials/saving.py similarity index 72% rename from bpfin/financials/monthly_saving.py rename to bpfin/financials/saving.py index 1bdd440..1154d88 100644 --- a/bpfin/financials/monthly_saving.py +++ b/bpfin/financials/saving.py @@ -1,5 +1,6 @@ import datetime from bpfin.utilbills.bill_lib import cal_last_day +from bpfin.utilbills.bill_lib import annualizing_projection class Saving(): @@ -33,27 +34,51 @@ class Saving(): cal_last_day(self.commissioning_date.year, self.commissioning_date.month)) saving_dict = {} bill_dict = {} + first_year_saving = 0 + first_yr_count = 0 for date, prior, post in zip(proforma_date, prior_saving_list, post_saving_list): if date > saving_start_date: saving_dict[date] = prior - post bill_dict[date] = post + if first_yr_count <= 12: + first_year_saving += prior - post + first_yr_count += 1 else: saving_dict[date] = 0 bill_dict[date] = prior self.proforma_saving = list(saving_dict.values()) self.proforma_bill = list(bill_dict.values()) + self.first_year_saving = first_year_saving def get_proforma_bill(self): + """ + Get proforma_bill + Return: + list: proforma_bill + """ return self.proforma_bill def get_proforma_saving(self): + """ + Get proforma_saving + Return: + list: proforma_saving + """ return self.proforma_saving def get_first_year_saving(self): - # need calculation + """ + Get first year saving + Return: + float: sum of first 12 months of savings + """ return self.first_year_saving def get_annual_bill(self): - # need calculation - # need change file name + """ + Calculate and return annual pro-forma usage or charge + Return: + dictionary: dict of annual item, {year: annual usage or charge} + """ + annual_proforma_bill = annualizing_projection (self.proforma_date, self.proforma_bill) return annual_proforma_bill diff --git a/bpfin/tests/test_financials/test_monthly_saving.py b/bpfin/tests/test_financials/test_saving.py similarity index 79% rename from bpfin/tests/test_financials/test_monthly_saving.py rename to bpfin/tests/test_financials/test_saving.py index 257a279..cf6be7b 100644 --- a/bpfin/tests/test_financials/test_monthly_saving.py +++ b/bpfin/tests/test_financials/test_saving.py @@ -1,5 +1,5 @@ import datetime -from bpfin.financials.monthly_saving import Saving +from bpfin.financials.saving import Saving def test_Saving(): @@ -27,3 +27,7 @@ def test_Saving(): result_bill = elec_saving.get_proforma_bill() assert output_saving == result_saving assert output_bill == result_bill + assert elec_saving.get_first_year_saving() == 430 + assert elec_saving.get_annual_bill() == {2017: 770} + # print('1st yr saving =', elec_saving.get_first_year_saving()) + # print('annual_bill =', elec_saving.get_annual_bill()) diff --git a/bpfin/utilbills/data_generation.py b/bpfin/utilbills/data_generation.py index b1d4352..d4552bb 100644 --- a/bpfin/utilbills/data_generation.py +++ b/bpfin/utilbills/data_generation.py @@ -2,7 +2,7 @@ # import copy # from bpfin.utilbills.bill_month_normalize_rough import bill_month_normalize_rough # from bpfin.utilbills.bill_prior_proj_rough import bill_prior_proj_rough -# from bpfin.financials.monthly_saving import Saving +# from bpfin.financials.saving import Saving # from bpfin.lib import other as lib # from bpfin.utilbills import bill_lib as bl # from bpfin.financials import financial_lib as fl @@ -24,13 +24,10 @@ # IS_prior.project(-2.0, db.analysis_date, prior_energy_bill) # post_energy_bill = copy.deepcopy(db.bill_overview_organized) -# saving = Saving(datetime.date(2018, 1, 1), db.proforma_date_to, db.prior_proj_rough_charge, db.post_proj_rough_charge) +# saving = Saving(datetime.date(2017, 11, 1), db.proforma_date_to, db.prior_proj_rough_charge, db.post_proj_rough_charge) # # print(saving_list) -# post_saving_e_bill = saving.get_proforma_bill() -# # print(post_saving_e_bill) -# post_energy_bill['electricity'] = bl.annualizing_projection( -# db.post_bill_rough['date_to'], post_saving_e_bill) +# post_energy_bill['electricity'] = saving.get_annual_bill() # IS_post = fl.Income_Statement_Table(raw_income_input, post_energy_bill) # IS_post.project(-2.0, db.analysis_date, post_energy_bill) @@ -39,3 +36,4 @@ # post_noi = (IS_post.get_noi_dict().values()) # print(lib.sublist(post_noi, prior_noi)) +# # print(bl.annualizing_projection(saving.proforma_date, saving.get_proforma_saving())) -- GitLab From 79d30054195525732ed4fccb575709da6d7966b9 Mon Sep 17 00:00:00 2001 From: chenzheng06 Date: Tue, 2 May 2017 10:09:08 -0400 Subject: [PATCH 10/10] Fix formatting --- bpfin/financials/saving.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bpfin/financials/saving.py b/bpfin/financials/saving.py index 1154d88..2c8a5df 100644 --- a/bpfin/financials/saving.py +++ b/bpfin/financials/saving.py @@ -80,5 +80,5 @@ class Saving(): Return: dictionary: dict of annual item, {year: annual usage or charge} """ - annual_proforma_bill = annualizing_projection (self.proforma_date, self.proforma_bill) + annual_proforma_bill = annualizing_projection(self.proforma_date, self.proforma_bill) return annual_proforma_bill -- GitLab