From d8a3faba5cca1eca14787389d728e4055ca6397f Mon Sep 17 00:00:00 2001 From: Sarey Hamarneh Date: Mon, 12 Jun 2017 17:00:10 -0400 Subject: [PATCH 1/7] Create income statement get functions (prior and post retrofit) --- bpfin/back_end_call/back_end_prelim.py | 29 +++++++++++++---------- bpfin/financials/scenario.py | 32 +++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 13 deletions(-) diff --git a/bpfin/back_end_call/back_end_prelim.py b/bpfin/back_end_call/back_end_prelim.py index 22efd7a..c08daa1 100644 --- a/bpfin/back_end_call/back_end_prelim.py +++ b/bpfin/back_end_call/back_end_prelim.py @@ -4,26 +4,25 @@ from bpfin.financials.financial_income import Income_Statement_Table from bpfin.financials.financial_balance import Balance_Sheet_Table from bpfin.financials.scenario import Scenario from bpfin.back_end_call.back_end_inputs import monthly_bill, annual_bill + # delete following imports when online # from bpfin.tests.testdata import feature_data as db # import pprint -def prelim_scenario(raw_bill_table, raw_annual_bill_table, - raw_income_input, growth_rate_flag, - raw_liability_input, raw_cash_balance, - raw_loan_input_list, - analysis_date, commission_date, construction_cost, - percent_saving_dict, full_saving_dict, +def prelim_scenario(raw_bill_table, raw_annual_bill_table, raw_income_input, + growth_rate_flag, raw_liability_input, raw_cash_balance, + raw_loan_input_list, analysis_date, commission_date, + construction_cost, percent_saving_dict, full_saving_dict, req_dscr, customer_preference): """ To Do: write unit test file for this scenario and for prelim_scenario back_end_call """ prior_annual_bill_table, manual_input_dict = annual_bill( - raw_bill_table, raw_annual_bill_table, analysis_date - ) + raw_bill_table, raw_annual_bill_table, analysis_date) - prior_income_table = Income_Statement_Table(raw_income_input, prior_annual_bill_table, analysis_date) + prior_income_table = Income_Statement_Table( + raw_income_input, prior_annual_bill_table, analysis_date) cash_balance_dict = cash_balance(analysis_date, raw_cash_balance) liability_dict = final_liability_dict(analysis_date, raw_liability_input) @@ -36,9 +35,11 @@ def prelim_scenario(raw_bill_table, raw_annual_bill_table, prior_income_table.project(growth_rate_flag, prior_annual_bill_table) - prior_bs = Balance_Sheet_Table(cash_balance_dict, liability_dict, prior_income_table.get_noi_dict()) + prior_bs = Balance_Sheet_Table(cash_balance_dict, liability_dict, + prior_income_table.get_noi_dict()) - prior_bs.project_balance_sheet(analysis_date, liability_dict, prior_income_table.get_noi_dict()) + prior_bs.project_balance_sheet(analysis_date, liability_dict, + prior_income_table.get_noi_dict()) scenario_ob = Scenario( analysis_date=analysis_date, @@ -64,7 +65,11 @@ def prelim_scenario(raw_bill_table, raw_annual_bill_table, # Define raw_bill_table as a "get" of prior_bill # Delete prior_annual_bill_table - return scenario_ob.get_graph_dict(), scenario_ob.get_economics() + return scenario_ob.get_graph_dict(), scenario_ob.get_economics( + ), scenario_ob.get_prior_income_statement(), + scenario_ob.get_post_income_statement( + ), scenario_ob.get_prior_balance_sheet_statement( + ), scenario_ob.get_post_balance_sheet_statement # **** ugly test **** diff --git a/bpfin/financials/scenario.py b/bpfin/financials/scenario.py index 3e4405b..06ccf68 100644 --- a/bpfin/financials/scenario.py +++ b/bpfin/financials/scenario.py @@ -10,7 +10,7 @@ from bpfin.lib.other import UTILITY_TYPE_LIST # from bpfin.lib.back_end_call import monthly_bill # from bpfin.financials.liability import final_liability_dict # from bpfin.financials.balance_sheet_projection import balance_sheet_projection -# from bpfin.financials.financial_income import Income_Statement_Table +from bpfin.financials.financial_income import Income_Statement_Table # from bpfin.financials.financial_balance import Balance_Sheet_Table @@ -286,6 +286,36 @@ class Scenario(): economics_overview['min_cash_dscr'] = min_none_list(dscr_dict['cash_dscr'].values()) return economics_overview + def get_income_statement(self, full_income_statement): + """This will get the income statement in the required format.""" + result = {} + + for year, val in full_income_statement.enumerate(): + column_values = [] + for field in val: + if field != 'year': + row = [] + row = [field, val[field]] + column_values.append(row) + result[year] = column_values + return result + + def get_prior_income_statement(self): + """Fetch full income statement table prior to retrofit.""" + prior_full_income_statement = self.prior_income_statement_table.get_full_income_table() + return self.get_income_statement(prior_full_income_statement) + + def get_post_income_statement(self): + """Fetch full income statement table post to retrofit.""" + post_full_income_statement = self.post_income_statement_table.get_full_income_table() + return self.get_income_statement(post_full_income_statement) + + def get_prior_balance_sheet_statement(self): + pass + + def get_post_balance_sheet_statement(self): + pass + # # ***** ugly test that can be a guide for front end dev ***** # growth_toggle = 0.01 -- GitLab From 0e6c4b3d786662aa158a1b2fd42dc7b8bc82de66 Mon Sep 17 00:00:00 2001 From: Sarey Hamarneh Date: Mon, 12 Jun 2017 17:06:51 -0400 Subject: [PATCH 2/7] Create balance sheet calls --- bpfin/financials/scenario.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/bpfin/financials/scenario.py b/bpfin/financials/scenario.py index 06ccf68..5012f46 100644 --- a/bpfin/financials/scenario.py +++ b/bpfin/financials/scenario.py @@ -286,11 +286,11 @@ class Scenario(): economics_overview['min_cash_dscr'] = min_none_list(dscr_dict['cash_dscr'].values()) return economics_overview - def get_income_statement(self, full_income_statement): - """This will get the income statement in the required format.""" + def get_statement(self, full_statement): + """This will get the income OR balance sheet statement in the required format.""" result = {} - for year, val in full_income_statement.enumerate(): + for year, val in full_statement.enumerate(): column_values = [] for field in val: if field != 'year': @@ -303,18 +303,20 @@ class Scenario(): def get_prior_income_statement(self): """Fetch full income statement table prior to retrofit.""" prior_full_income_statement = self.prior_income_statement_table.get_full_income_table() - return self.get_income_statement(prior_full_income_statement) + return self.get_statement(prior_full_income_statement) def get_post_income_statement(self): """Fetch full income statement table post to retrofit.""" post_full_income_statement = self.post_income_statement_table.get_full_income_table() - return self.get_income_statement(post_full_income_statement) + return self.get_statement(post_full_income_statement) def get_prior_balance_sheet_statement(self): - pass + prior_full_balance_statement = self.prior_balance_sheet_table.get_cash_dict() + return self.get_statement(prior_full_balance_statement) def get_post_balance_sheet_statement(self): - pass + post_full_balance_statement = self.post_balance_sheet_table.get_cash_dict() + return self.get_statement(post_full_balance_statement) # # ***** ugly test that can be a guide for front end dev ***** -- GitLab From dd4a6d414a5a8f24a1925343746ebf8226048601 Mon Sep 17 00:00:00 2001 From: Sarey Hamarneh Date: Fri, 23 Jun 2017 14:06:53 -0400 Subject: [PATCH 3/7] Column row matrix switch --- bpfin/financials/scenario.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/bpfin/financials/scenario.py b/bpfin/financials/scenario.py index 5012f46..346be86 100644 --- a/bpfin/financials/scenario.py +++ b/bpfin/financials/scenario.py @@ -288,16 +288,22 @@ class Scenario(): def get_statement(self, full_statement): """This will get the income OR balance sheet statement in the required format.""" - result = {} - - for year, val in full_statement.enumerate(): - column_values = [] - for field in val: - if field != 'year': - row = [] - row = [field, val[field]] - column_values.append(row) - result[year] = column_values + result = [] + row = [] + row.append('Year') + for year in full_statement: + row.append(year) + result.append(row) + + analysis_year = result[0][1] + + for field in full_statement[analysis_year]: + if field != 'year': + row = [] + row.append(field) + for year in range(1, len(result[0])): + row.append(full_statement[year][field]) + result.append(row) return result def get_prior_income_statement(self): -- GitLab From 220004975d183c5d5d15b88344cf8afe8b5b64c5 Mon Sep 17 00:00:00 2001 From: Sarey Hamarneh Date: Fri, 7 Jul 2017 17:25:16 -0400 Subject: [PATCH 4/7] push correct test --- bpfin/financials/scenario.py | 7 +-- bpfin/tests/test_financials/test_scenario.py | 48 ++++++++++++++++++++ 2 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 bpfin/tests/test_financials/test_scenario.py diff --git a/bpfin/financials/scenario.py b/bpfin/financials/scenario.py index 07997c1..74e6509 100644 --- a/bpfin/financials/scenario.py +++ b/bpfin/financials/scenario.py @@ -308,11 +308,12 @@ class Scenario(): analysis_year = result[0][1] for field in full_statement[analysis_year]: - if field != 'year': + if field != 'Year': row = [] row.append(field) - for year in range(1, len(result[0])): - row.append(full_statement[year][field]) + for year in result[0]: + if year != 'Year': + row.append(full_statement[year][field]) result.append(row) return result diff --git a/bpfin/tests/test_financials/test_scenario.py b/bpfin/tests/test_financials/test_scenario.py new file mode 100644 index 0000000..a7c89ee --- /dev/null +++ b/bpfin/tests/test_financials/test_scenario.py @@ -0,0 +1,48 @@ +from bpfin.financials.scenario import Scenario +from bpfin.tests.testdata import feature_data as db +from bpfin.tests.testdata import sample_data as sd +# from bpfin.lib.back_end_call import monthly_bill +from bpfin.financials.liability import final_liability_dict +from bpfin.financials.balance_sheet_projection import balance_sheet_projection +from bpfin.financials.cash_balance import cash_balance +from bpfin.financials.financial_income import Income_Statement_Table +from bpfin.financials.financial_balance import Balance_Sheet_Table + +growth_toggle = -2.0 + +cash_balance_test = cash_balance(db.analysis_date, db.raw_cash_balance) +liability_test = final_liability_dict(db.analysis_date, db.raw_liability_input) + + +prior_IS_table = Income_Statement_Table( + db.raw_income_input, + db.prior_annual_bill, + db.analysis_date) +prior_IS_table.project(growth_toggle, db.prior_annual_bill) +prior_BS_table = Balance_Sheet_Table(cash_balance_test, liability_test, prior_IS_table.get_noi_dict()) +prior_BS_table.project_balance_sheet( + db.analysis_date, + db.liability_dictionary, + prior_IS_table.get_noi_dict()) + + +def test_scenario_object(): + + scenario_object_test = Scenario( + analysis_date=db.analysis_date, + commission_date=db.commission_date, + construction_cost=db.cost_estimation, + manual_input_dict=db.manual_input_dict, + prior_annual_bill_table=db.prior_annual_bill, + prior_income_statement_table=prior_IS_table, + other_debt_service=db.liability_dictionary, + growth_rate_flag=growth_toggle, + prior_balance_sheet_table=prior_BS_table, + loan_input_list=db.raw_loan_input_list) + + scenario_object_test.prelim_analysis(sd.prior_month_bill, db.percent_saving_dict, db.full_saving_dict, + db.req_dscr, db.customer_preference) + + print(scenario_object_test.get_post_income_statement()) + + assert 1 == 1 -- GitLab From d0b687d23b1e503a05fcd5b15ceea996cb0b4f5a Mon Sep 17 00:00:00 2001 From: Sarey Hamarneh Date: Wed, 12 Jul 2017 17:35:22 -0400 Subject: [PATCH 5/7] fix get_statement() to work for income statement --- bpfin/financials/scenario.py | 2 +- bpfin/tests/test_financials/test_scenario.py | 2 +- bpfin/tests/testdata/sample_data.py | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bpfin/financials/scenario.py b/bpfin/financials/scenario.py index 74e6509..63be373 100644 --- a/bpfin/financials/scenario.py +++ b/bpfin/financials/scenario.py @@ -308,7 +308,7 @@ class Scenario(): analysis_year = result[0][1] for field in full_statement[analysis_year]: - if field != 'Year': + if field.lower() != 'year': row = [] row.append(field) for year in result[0]: diff --git a/bpfin/tests/test_financials/test_scenario.py b/bpfin/tests/test_financials/test_scenario.py index a7c89ee..c00e6f3 100644 --- a/bpfin/tests/test_financials/test_scenario.py +++ b/bpfin/tests/test_financials/test_scenario.py @@ -43,6 +43,6 @@ def test_scenario_object(): scenario_object_test.prelim_analysis(sd.prior_month_bill, db.percent_saving_dict, db.full_saving_dict, db.req_dscr, db.customer_preference) - print(scenario_object_test.get_post_income_statement()) + print(scenario_object_test.get_prior_income_statement()) assert 1 == 1 diff --git a/bpfin/tests/testdata/sample_data.py b/bpfin/tests/testdata/sample_data.py index 8f15a0e..434f969 100644 --- a/bpfin/tests/testdata/sample_data.py +++ b/bpfin/tests/testdata/sample_data.py @@ -1800,9 +1800,9 @@ post_bill_rough = { prior_month_bill = { 'electricity': prior_bill_rough, - 'gas': None, - 'oil': None, - 'water': None, + 'gas': prior_bill_rough, + 'oil': prior_bill_rough, + 'water': prior_bill_rough, } percent_saving_dict = { -- GitLab From b024dd79a4f8d6d775866ffa5e077bfd1abbab8a Mon Sep 17 00:00:00 2001 From: Sarey Hamarneh Date: Wed, 12 Jul 2017 17:45:35 -0400 Subject: [PATCH 6/7] fix --- bpfin/financials/financial_balance.py | 17 +++++++++++++++ bpfin/financials/scenario.py | 2 +- bpfin/tests/test_financials/test_scenario.py | 23 ++++++++++---------- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/bpfin/financials/financial_balance.py b/bpfin/financials/financial_balance.py index ca3fad2..04c624c 100644 --- a/bpfin/financials/financial_balance.py +++ b/bpfin/financials/financial_balance.py @@ -183,6 +183,23 @@ class Balance_Sheet_Table(): dictionary: cash for each year in balance sheet table. Key is year """ cash_dict = {} + if self.bs_table: + for current_balance_sheet in self.bs_table: + cash_dict[current_balance_sheet.year] = { + 'Balance': current_balance_sheet.cash, + } + return cash_dict + else: + return {} + + def get_simple_cash_dict(self): + """ + HACK: Implemented two of these functions will combine into one once standard formatting is decided. + Get a dictionary of cash. + Return: + dictionary: cash for each year in balance sheet table. Key is year + """ + cash_dict = {} if self.bs_table: for current_balance_sheet in self.bs_table: cash_dict[current_balance_sheet.year] = current_balance_sheet.cash diff --git a/bpfin/financials/scenario.py b/bpfin/financials/scenario.py index 63be373..2a7c4a9 100644 --- a/bpfin/financials/scenario.py +++ b/bpfin/financials/scenario.py @@ -253,7 +253,7 @@ class Scenario(): noi_dscr = {2017: 1.17, 2018: 1.98, ...} """ noi_dict = copy.deepcopy(self.post_income_statement_table.get_noi_dict()) - cash_dict = copy.deepcopy(self.post_balance_sheet_table.get_cash_dict()) + cash_dict = copy.deepcopy(self.post_balance_sheet_table.get_simple_cash_dict()) debt_dict = set_dict_starting_year( copy.deepcopy(self.get_annual_debt_service()), self.commission_date.year + 1) diff --git a/bpfin/tests/test_financials/test_scenario.py b/bpfin/tests/test_financials/test_scenario.py index c00e6f3..e9cf330 100644 --- a/bpfin/tests/test_financials/test_scenario.py +++ b/bpfin/tests/test_financials/test_scenario.py @@ -13,20 +13,18 @@ growth_toggle = -2.0 cash_balance_test = cash_balance(db.analysis_date, db.raw_cash_balance) liability_test = final_liability_dict(db.analysis_date, db.raw_liability_input) - -prior_IS_table = Income_Statement_Table( - db.raw_income_input, - db.prior_annual_bill, - db.analysis_date) +prior_IS_table = Income_Statement_Table(db.raw_income_input, + db.prior_annual_bill, db.analysis_date) prior_IS_table.project(growth_toggle, db.prior_annual_bill) -prior_BS_table = Balance_Sheet_Table(cash_balance_test, liability_test, prior_IS_table.get_noi_dict()) -prior_BS_table.project_balance_sheet( - db.analysis_date, - db.liability_dictionary, - prior_IS_table.get_noi_dict()) +prior_BS_table = Balance_Sheet_Table(cash_balance_test, liability_test, + prior_IS_table.get_noi_dict()) +prior_BS_table.project_balance_sheet(db.analysis_date, db.liability_dictionary, + prior_IS_table.get_noi_dict()) def test_scenario_object(): + """TODO: Test must be implemented correctly. Test cases must be added later. + """ scenario_object_test = Scenario( analysis_date=db.analysis_date, @@ -40,9 +38,10 @@ def test_scenario_object(): prior_balance_sheet_table=prior_BS_table, loan_input_list=db.raw_loan_input_list) - scenario_object_test.prelim_analysis(sd.prior_month_bill, db.percent_saving_dict, db.full_saving_dict, + scenario_object_test.prelim_analysis( + sd.prior_month_bill, db.percent_saving_dict, db.full_saving_dict, db.req_dscr, db.customer_preference) - print(scenario_object_test.get_prior_income_statement()) + print(scenario_object_test.get_post_balance_sheet_statement()) assert 1 == 1 -- GitLab From 698561bae4a5792db73803e8f1ff044eeedbd833 Mon Sep 17 00:00:00 2001 From: chenzheng06 Date: Tue, 1 Aug 2017 10:23:20 -0400 Subject: [PATCH 7/7] Fix coding according to comments. Majorly formatting, but also removed unused imports. --- bpfin/back_end_call/back_end_prelim.py | 26 ++++++++++++++++++-------- bpfin/financials/financial_balance.py | 8 ++++---- bpfin/financials/scenario.py | 9 --------- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/bpfin/back_end_call/back_end_prelim.py b/bpfin/back_end_call/back_end_prelim.py index 19af69c..0d22179 100644 --- a/bpfin/back_end_call/back_end_prelim.py +++ b/bpfin/back_end_call/back_end_prelim.py @@ -112,10 +112,12 @@ def prelim_scenario(raw_bill_table, raw_annual_bill_table, raw_income_input, write unit test file for scenario class and for prelim_scenario back_end_call """ prior_annual_bill_table, manual_input_dict = annual_bill( - raw_bill_table, raw_annual_bill_table, analysis_date) + raw_bill_table, raw_annual_bill_table, analysis_date + ) prior_income_table = Income_Statement_Table( - raw_income_input, prior_annual_bill_table, analysis_date) + raw_income_input, prior_annual_bill_table, analysis_date + ) cash_balance_dict = cash_balance(analysis_date, raw_cash_balance) liability_dict = final_liability_dict(analysis_date, raw_liability_input) @@ -129,11 +131,17 @@ def prelim_scenario(raw_bill_table, raw_annual_bill_table, raw_income_input, prior_income_table.project(growth_rate_flag, prior_annual_bill_table) - prior_bs = Balance_Sheet_Table(cash_balance_dict, liability_dict, - prior_income_table.get_noi_dict()) + prior_bs = Balance_Sheet_Table( + cash_balance_dict, + liability_dict, + prior_income_table.get_noi_dict() + ) - prior_bs.project_balance_sheet(analysis_date, liability_dict, - prior_income_table.get_noi_dict()) + prior_bs.project_balance_sheet( + analysis_date, + liability_dict, + prior_income_table.get_noi_dict() + ) scenario_ob = Scenario( analysis_date=analysis_date, @@ -201,7 +209,8 @@ def prelim_scenario(raw_bill_table, raw_annual_bill_table, raw_income_input, # from bpfin.tests.testdata import feature_data as db # import pprint -# print(prelim_scenario( +# print( +# prelim_scenario( # raw_bill_table=db.raw_bill_table, # raw_annual_bill_table=db.raw_annual_bill_table, # raw_income_input=db.raw_income_input, @@ -216,7 +225,8 @@ def prelim_scenario(raw_bill_table, raw_annual_bill_table, raw_income_input, # full_saving_dict=db.full_saving_dict, # req_dscr=db.req_dscr, # customer_preference=db.customer_preference -# )) +# ) +# ) # pp = pprint.PrettyPrinter(width=120, indent=4, compact=True) # pp.pprint(prior_income_statement_result) diff --git a/bpfin/financials/financial_balance.py b/bpfin/financials/financial_balance.py index 04c624c..c7ab5e7 100644 --- a/bpfin/financials/financial_balance.py +++ b/bpfin/financials/financial_balance.py @@ -189,8 +189,8 @@ class Balance_Sheet_Table(): 'Balance': current_balance_sheet.cash, } return cash_dict - else: - return {} + # else: + # return {} def get_simple_cash_dict(self): """ @@ -204,5 +204,5 @@ class Balance_Sheet_Table(): for current_balance_sheet in self.bs_table: cash_dict[current_balance_sheet.year] = current_balance_sheet.cash return cash_dict - else: - return {} + # else: + # return {} diff --git a/bpfin/financials/scenario.py b/bpfin/financials/scenario.py index 2a7c4a9..ecc7f57 100644 --- a/bpfin/financials/scenario.py +++ b/bpfin/financials/scenario.py @@ -3,15 +3,6 @@ from bpfin.financials.financial_saving import Saving_Overview from bpfin.financials.loan import Loan_List from bpfin.lib.other import add_year_dictionary, divide_dscr_dict, min_none_list from bpfin.utilbills.bill_lib import form_bill_year, annualizing_projection -from bpfin.lib.other import UTILITY_TYPE_LIST -# may delete from here after sample built -# from bpfin.tests.testdata import feature_data as db -# from bpfin.tests.testdata import sample_data as sdb -# from bpfin.lib.back_end_call import monthly_bill -# from bpfin.financials.liability import final_liability_dict -# from bpfin.financials.balance_sheet_projection import balance_sheet_projection -from bpfin.financials.financial_income import Income_Statement_Table -# from bpfin.financials.financial_balance import Balance_Sheet_Table from bpfin.lib.other import UTILITY_TYPE_LIST, set_dict_starting_year -- GitLab