From 3218ecffd2e596bf984c13f5a4bfbac62b285176 Mon Sep 17 00:00:00 2001 From: Adarsh Murthy Date: Mon, 24 Apr 2017 12:11:06 -0400 Subject: [PATCH 1/5] Update energy bills overview table to. Pass bills information to bpfin functions to obtain bill projection values from the pro forma start year till the pro forma duration. Show projection values on frontend. If utility bill not available, allow user to input the data and store all inputs and calculated values in the database. --- .../financialInputs/inflation_coefficient.py | 1088 +++++++++++++++++ .../static/financialInputs/scripts/app.js | 148 ++- blocnote/apps/financialInputs/views.py | 326 +++-- requirements-dev.txt | 1 + requirements.txt | 1 + 5 files changed, 1411 insertions(+), 153 deletions(-) create mode 100644 blocnote/apps/financialInputs/inflation_coefficient.py diff --git a/blocnote/apps/financialInputs/inflation_coefficient.py b/blocnote/apps/financialInputs/inflation_coefficient.py new file mode 100644 index 0000000..8019406 --- /dev/null +++ b/blocnote/apps/financialInputs/inflation_coefficient.py @@ -0,0 +1,1088 @@ +import datetime +"""Inflation coefficient dictionary. + +This file contains the inflation coefficients for a set of years. This will be used as an argument for projecting the +bills in energy overview table. +""" + +inflation_coeff_dict = { + datetime.date(1981, 1, 31): 0.3381208260704529, + datetime.date(1981, 2, 28): 0.3410451203881943, + datetime.date(1981, 3, 31): 0.34399470595272497, + datetime.date(1981, 4, 30): 0.3469698014996081, + datetime.date(1981, 5, 31): 0.3499706276561777, + datetime.date(1981, 6, 30): 0.3529974069579001, + datetime.date(1981, 7, 31): 0.3560503638648767, + datetime.date(1981, 8, 31): 0.3591297247784895, + datetime.date(1981, 9, 30): 0.36223571805819044, + datetime.date(1981, 10, 31): 0.36536857403843637, + datetime.date(1981, 11, 30): 0.3685285250457702, + datetime.date(1981, 12, 31): 0.3717158054160494, + datetime.date(1982, 1, 31): 0.3736234509294446, + datetime.date(1982, 2, 28): 0.3755408864796145, + datetime.date(1982, 3, 31): 0.3774681623090278, + datetime.date(1982, 4, 30): 0.3794053289179977, + datetime.date(1982, 5, 31): 0.3813524370660048, + datetime.date(1982, 6, 30): 0.38330953777302756, + datetime.date(1982, 7, 31): 0.3852766823208787, + datetime.date(1982, 8, 31): 0.38725392225454935, + datetime.date(1982, 9, 30): 0.38924130938355966, + datetime.date(1982, 10, 31): 0.39123889578331605, + datetime.date(1982, 11, 30): 0.393246733796476, + datetime.date(1982, 12, 31): 0.3952648760343195, + datetime.date(1983, 1, 31): 0.39630557551417817, + datetime.date(1983, 2, 28): 0.3973490150690424, + datetime.date(1983, 3, 31): 0.3983952019133013, + datetime.date(1983, 4, 30): 0.39944414328033895, + datetime.date(1983, 5, 31): 0.4004958464225842, + datetime.date(1983, 6, 30): 0.401550318611561, + datetime.date(1983, 7, 31): 0.4026075671379387, + datetime.date(1983, 8, 31): 0.4036675993115824, + datetime.date(1983, 9, 30): 0.40473042246160323, + datetime.date(1983, 10, 31): 0.4057960439364095, + datetime.date(1983, 11, 30): 0.4068644711037571, + datetime.date(1983, 12, 31): 0.4079357113508007, + datetime.date(1984, 1, 31): 0.40942066532940286, + datetime.date(1984, 2, 29): 0.41091102478797936, + datetime.date(1984, 3, 31): 0.41240680940337837, + datetime.date(1984, 4, 30): 0.41390803892407485, + datetime.date(1984, 5, 31): 0.41541473317043154, + datetime.date(1984, 6, 30): 0.41692691203496074, + datetime.date(1984, 7, 31): 0.41844459548258667, + datetime.date(1984, 8, 31): 0.4199678035509092, + datetime.date(1984, 9, 30): 0.4214965563504684, + datetime.date(1984, 10, 31): 0.4230308740650101, + datetime.date(1984, 11, 30): 0.4245707769517523, + datetime.date(1984, 12, 31): 0.4261162853416528, + datetime.date(1985, 1, 31): 0.4273691382399381, + datetime.date(1985, 2, 28): 0.4286256747345532, + datetime.date(1985, 3, 31): 0.4298859056558852, + datetime.date(1985, 4, 30): 0.4311498418661644, + datetime.date(1985, 5, 31): 0.4324174942595579, + datetime.date(1985, 6, 30): 0.43368887376226334, + datetime.date(1985, 7, 31): 0.4349639913326034, + datetime.date(1985, 8, 31): 0.4362428579611198, + datetime.date(1985, 9, 30): 0.4375254846706685, + datetime.date(1985, 10, 31): 0.4388118825165143, + datetime.date(1985, 11, 30): 0.44010206258642665, + datetime.date(1985, 12, 31): 0.4413960360007745, + datetime.date(1986, 1, 31): 0.4421111711451018, + datetime.date(1986, 2, 28): 0.44282746492755204, + datetime.date(1986, 3, 31): 0.4435449192253122, + datetime.date(1986, 4, 30): 0.44426353591861034, + datetime.date(1986, 5, 31): 0.4449833168907211, + datetime.date(1986, 6, 30): 0.4457042640279702, + datetime.date(1986, 7, 31): 0.44642637921973954, + datetime.date(1986, 8, 31): 0.44714966435847203, + datetime.date(1986, 9, 30): 0.44787412133967686, + datetime.date(1986, 10, 31): 0.448599752061934, + datetime.date(1986, 11, 30): 0.44932655842689967, + datetime.date(1986, 12, 31): 0.4500545423393109, + datetime.date(1987, 1, 31): 0.45139652997547636, + datetime.date(1987, 2, 28): 0.4527425191951082, + datetime.date(1987, 3, 31): 0.45409252193026156, + datetime.date(1987, 4, 30): 0.4554465501485706, + datetime.date(1987, 5, 31): 0.45680461585335536, + datetime.date(1987, 6, 30): 0.4581667310837274, + datetime.date(1987, 7, 31): 0.4595329079146972, + datetime.date(1987, 8, 31): 0.46090315845728086, + datetime.date(1987, 9, 30): 0.4622774948586074, + datetime.date(1987, 10, 31): 0.46365592930202665, + datetime.date(1987, 11, 30): 0.4650384740072171, + datetime.date(1987, 12, 31): 0.46642514123029427, + datetime.date(1988, 1, 31): 0.4680186438565458, + datetime.date(1988, 2, 29): 0.469617590551728, + datetime.date(1988, 3, 31): 0.47122199991504876, + datetime.date(1988, 4, 30): 0.4728318906092585, + datetime.date(1988, 5, 31): 0.47444728136086745, + datetime.date(1988, 6, 30): 0.47606819096036335, + datetime.date(1988, 7, 31): 0.4776946382624302, + datetime.date(1988, 8, 31): 0.47932664218616716, + datetime.date(1988, 9, 30): 0.4809642217153094, + datetime.date(1988, 10, 31): 0.48260739589844787, + datetime.date(1988, 11, 30): 0.4842561838492519, + datetime.date(1988, 12, 31): 0.48591060474669084, + datetime.date(1989, 1, 31): 0.48785076480634354, + datetime.date(1989, 2, 28): 0.48979867160175444, + datetime.date(1989, 3, 31): 0.49175435606434825, + datetime.date(1989, 4, 30): 0.49371784924905376, + datetime.date(1989, 5, 31): 0.495689182334797, + datetime.date(1989, 6, 30): 0.497668386624996, + datetime.date(1989, 7, 31): 0.49965549354805844, + datetime.date(1989, 8, 31): 0.5016505346578802, + datetime.date(1989, 9, 30): 0.5036535416343466, + datetime.date(1989, 10, 31): 0.5056645462838355, + datetime.date(1989, 11, 30): 0.5076835805397224, + datetime.date(1989, 12, 31): 0.5097106764628874, + datetime.date(1990, 1, 31): 0.5120123174983452, + datetime.date(1990, 2, 28): 0.5143243517857021, + datetime.date(1990, 3, 31): 0.516646826256553, + datetime.date(1990, 4, 30): 0.5189797880544167, + datetime.date(1990, 5, 31): 0.521323284535692, + datetime.date(1990, 6, 30): 0.52367736327062, + datetime.date(1990, 7, 31): 0.5260420720442486, + datetime.date(1990, 8, 31): 0.5284174588574037, + datetime.date(1990, 9, 30): 0.5308035719276625, + datetime.date(1990, 10, 31): 0.5332004596903328, + datetime.date(1990, 11, 30): 0.535608170799436, + datetime.date(1990, 12, 31): 0.538026754128695, + datetime.date(1991, 1, 31): 0.539917200800452, + datetime.date(1991, 2, 28): 0.5418142898716645, + datetime.date(1991, 3, 31): 0.5437180446815102, + datetime.date(1991, 4, 30): 0.5456284886511727, + datetime.date(1991, 5, 31): 0.5475456452841301, + datetime.date(1991, 6, 30): 0.5494695381664434, + datetime.date(1991, 7, 31): 0.5514001909670476, + datetime.date(1991, 8, 31): 0.553337627438042, + datetime.date(1991, 9, 30): 0.5552818714149835, + datetime.date(1991, 10, 31): 0.5572329468171786, + datetime.date(1991, 11, 30): 0.5591908776479786, + datetime.date(1991, 12, 31): 0.5611556879950743, + datetime.date(1992, 1, 31): 0.5625777967973759, + datetime.date(1992, 2, 29): 0.5640035095789097, + datetime.date(1992, 3, 31): 0.56543283547306, + datetime.date(1992, 4, 30): 0.5668657836363576, + datetime.date(1992, 5, 31): 0.5683023632485381, + datetime.date(1992, 6, 30): 0.5697425835126008, + datetime.date(1992, 7, 31): 0.5711864536548676, + datetime.date(1992, 8, 31): 0.5726339829250425, + datetime.date(1992, 9, 30): 0.5740851805962703, + datetime.date(1992, 10, 31): 0.5755400559651965, + datetime.date(1992, 11, 30): 0.5769986183520263, + datetime.date(1992, 12, 31): 0.5784608771005849, + datetime.date(1993, 1, 31): 0.5798925195663358, + datetime.date(1993, 2, 28): 0.5813277052278858, + datetime.date(1993, 3, 31): 0.5827664428543494, + datetime.date(1993, 4, 30): 0.5842087412365436, + datetime.date(1993, 5, 31): 0.5856546091870424, + datetime.date(1993, 6, 30): 0.5871040555402295, + datetime.date(1993, 7, 31): 0.5885570891523536, + datetime.date(1993, 8, 31): 0.5900137189015816, + datetime.date(1993, 9, 30): 0.5914739536880531, + datetime.date(1993, 10, 31): 0.5929378024339349, + datetime.date(1993, 11, 30): 0.5944052740834753, + datetime.date(1993, 12, 31): 0.5958763776030591, + datetime.date(1994, 1, 31): 0.5971652582078144, + datetime.date(1994, 2, 28): 0.5984569266613179, + datetime.date(1994, 3, 31): 0.5997513889936863, + datetime.date(1994, 4, 30): 0.6010486512480796, + datetime.date(1994, 5, 31): 0.6023487194807291, + datetime.date(1994, 6, 30): 0.6036515997609659, + datetime.date(1994, 7, 31): 0.6049572981712489, + datetime.date(1994, 8, 31): 0.6062658208071933, + datetime.date(1994, 9, 30): 0.6075771737775991, + datetime.date(1994, 10, 31): 0.60889136320448, + datetime.date(1994, 11, 30): 0.6102083952230912, + datetime.date(1994, 12, 31): 0.6115282759819588, + datetime.date(1995, 1, 31): 0.6129578252484459, + datetime.date(1995, 2, 28): 0.6143907163246016, + datetime.date(1995, 3, 31): 0.615826957022463, + datetime.date(1995, 4, 30): 0.6172665551723291, + datetime.date(1995, 5, 31): 0.6187095186228035, + datetime.date(1995, 6, 30): 0.6201558552408374, + datetime.date(1995, 7, 31): 0.621605572911772, + datetime.date(1995, 8, 31): 0.6230586795393821, + datetime.date(1995, 9, 30): 0.6245151830459186, + datetime.date(1995, 10, 31): 0.6259750913721521, + datetime.date(1995, 11, 30): 0.6274384124774164, + datetime.date(1995, 12, 31): 0.628905154339651, + datetime.date(1996, 1, 31): 0.6304442424786086, + datetime.date(1996, 2, 29): 0.6319870971510144, + datetime.date(1996, 3, 31): 0.6335337275745171, + datetime.date(1996, 4, 30): 0.6350841429893238, + datetime.date(1996, 5, 31): 0.6366383526582543, + datetime.date(1996, 6, 30): 0.6381963658667972, + datetime.date(1996, 7, 31): 0.6397581919231646, + datetime.date(1996, 8, 31): 0.6413238401583485, + datetime.date(1996, 9, 30): 0.6428933199261759, + datetime.date(1996, 10, 31): 0.6444666406033652, + datetime.date(1996, 11, 30): 0.6460438115895818, + datetime.date(1996, 12, 31): 0.6476248423074943, + datetime.date(1997, 1, 31): 0.6488865234377831, + datetime.date(1997, 2, 28): 0.6501506625331938, + datetime.date(1997, 3, 31): 0.6514172643822522, + datetime.date(1997, 4, 30): 0.652686333782813, + datetime.date(1997, 5, 31): 0.6539578755420776, + datetime.date(1997, 6, 30): 0.6552318944766129, + datetime.date(1997, 7, 31): 0.6565083954123692, + datetime.date(1997, 8, 31): 0.6577873831846984, + datetime.date(1997, 9, 30): 0.6590688626383728, + datetime.date(1997, 10, 31): 0.6603528386276029, + datetime.date(1997, 11, 30): 0.6616393160160559, + datetime.date(1997, 12, 31): 0.6629282996768745, + datetime.date(1998, 1, 31): 0.6637828142551581, + datetime.date(1998, 2, 28): 0.6646384303027331, + datetime.date(1998, 3, 31): 0.6654951492393933, + datetime.date(1998, 4, 30): 0.666352972486763, + datetime.date(1998, 5, 31): 0.6672119014682985, + datetime.date(1998, 6, 30): 0.6680719376092912, + datetime.date(1998, 7, 31): 0.6689330823368695, + datetime.date(1998, 8, 31): 0.6697953370800018, + datetime.date(1998, 9, 30): 0.6706587032694981, + datetime.date(1998, 10, 31): 0.6715231823380126, + datetime.date(1998, 11, 30): 0.6723887757200463, + datetime.date(1998, 12, 31): 0.6732554848519495, + datetime.date(1999, 1, 31): 0.6744859153551402, + datetime.date(1999, 2, 28): 0.6757185945726114, + datetime.date(1999, 3, 31): 0.6769535266140758, + datetime.date(1999, 4, 30): 0.678190715596757, + datetime.date(1999, 5, 31): 0.679430165645403, + datetime.date(1999, 6, 30): 0.6806718808923006, + datetime.date(1999, 7, 31): 0.6819158654772881, + datetime.date(1999, 8, 31): 0.6831621235477702, + datetime.date(1999, 9, 30): 0.6844106592587308, + datetime.date(1999, 10, 31): 0.6856614767727477, + datetime.date(1999, 11, 30): 0.6869145802600064, + datetime.date(1999, 12, 31): 0.6881699738983132, + datetime.date(2000, 1, 31): 0.6901009214975742, + datetime.date(2000, 2, 29): 0.6920372871748862, + datetime.date(2000, 3, 31): 0.693979086132925, + datetime.date(2000, 4, 30): 0.6959263336170236, + datetime.date(2000, 5, 31): 0.6978790449152918, + datetime.date(2000, 6, 30): 0.6998372353587372, + datetime.date(2000, 7, 31): 0.7018009203213842, + datetime.date(2000, 8, 31): 0.703770115220396, + datetime.date(2000, 9, 30): 0.7057448355161948, + datetime.date(2000, 10, 31): 0.7077250967125838, + datetime.date(2000, 11, 30): 0.709710914356868, + datetime.date(2000, 12, 31): 0.7117023040399773, + datetime.date(2001, 1, 31): 0.7133727879646097, + datetime.date(2001, 2, 28): 0.7150471927934272, + datetime.date(2001, 3, 31): 0.7167255277294455, + datetime.date(2001, 4, 30): 0.718407801997281, + datetime.date(2001, 5, 31): 0.7200940248432023, + datetime.date(2001, 6, 30): 0.72178420553518, + datetime.date(2001, 7, 31): 0.7234783533629385, + datetime.date(2001, 8, 31): 0.7251764776380069, + datetime.date(2001, 9, 30): 0.7268785876937695, + datetime.date(2001, 10, 31): 0.728584692885518, + datetime.date(2001, 11, 30): 0.7302948025905023, + datetime.date(2001, 12, 31): 0.7320089262079826, + datetime.date(2002, 1, 31): 0.7329823150776077, + datetime.date(2002, 2, 28): 0.7339569983110821, + datetime.date(2002, 3, 31): 0.7349329776295863, + datetime.date(2002, 4, 30): 0.7359102547565893, + datetime.date(2002, 5, 31): 0.736888831417852, + datetime.date(2002, 6, 30): 0.7378687093414299, + datetime.date(2002, 7, 31): 0.7388498902576767, + datetime.date(2002, 8, 31): 0.7398323758992469, + datetime.date(2002, 9, 30): 0.740816168001099, + datetime.date(2002, 10, 31): 0.7418012683004983, + datetime.date(2002, 11, 30): 0.7427876785370209, + datetime.date(2002, 12, 31): 0.7437754004525554, + datetime.date(2003, 1, 31): 0.7451996063818555, + datetime.date(2003, 2, 28): 0.7466265394281423, + datetime.date(2003, 3, 31): 0.7480562048133906, + datetime.date(2003, 4, 30): 0.7494886077695742, + datetime.date(2003, 5, 31): 0.7509237535386851, + datetime.date(2003, 6, 30): 0.7523616473727528, + datetime.date(2003, 7, 31): 0.7538022945338638, + datetime.date(2003, 8, 31): 0.7552457002941805, + datetime.date(2003, 9, 30): 0.7566918699359605, + datetime.date(2003, 10, 31): 0.7581408087515762, + datetime.date(2003, 11, 30): 0.759592522043534, + datetime.date(2003, 12, 31): 0.7610470151244938, + datetime.date(2004, 1, 31): 0.7627386957979464, + datetime.date(2004, 2, 29): 0.7644341367955894, + datetime.date(2004, 3, 31): 0.7661333464759965, + datetime.date(2004, 4, 30): 0.7678363332163217, + datetime.date(2004, 5, 31): 0.7695431054123394, + datetime.date(2004, 6, 30): 0.7712536714784868, + datetime.date(2004, 7, 31): 0.7729680398479051, + datetime.date(2004, 8, 31): 0.7746862189724804, + datetime.date(2004, 9, 30): 0.7764082173228865, + datetime.date(2004, 10, 31): 0.7781340433886258, + datetime.date(2004, 11, 30): 0.7798637056780716, + datetime.date(2004, 12, 31): 0.7815972127185097, + datetime.date(2005, 1, 31): 0.7837897231663872, + datetime.date(2005, 2, 28): 0.7859883839714893, + datetime.date(2005, 3, 31): 0.7881932123865933, + datetime.date(2005, 4, 30): 0.7904042257128732, + datetime.date(2005, 5, 31): 0.7926214413000353, + datetime.date(2005, 6, 30): 0.7948448765464555, + datetime.date(2005, 7, 31): 0.7970745488993143, + datetime.date(2005, 8, 31): 0.799310475854735, + datetime.date(2005, 9, 30): 0.8015526749579203, + datetime.date(2005, 10, 31): 0.8038011638032896, + datetime.date(2005, 11, 30): 0.8060559600346184, + datetime.date(2005, 12, 31): 0.8083170813451755, + datetime.date(2006, 1, 31): 0.8104872106293172, + datetime.date(2006, 2, 28): 0.8126631661680542, + datetime.date(2006, 3, 31): 0.814844963603424, + datetime.date(2006, 4, 30): 0.8170326186194583, + datetime.date(2006, 5, 31): 0.8192261469422968, + datetime.date(2006, 6, 30): 0.8214255643403001, + datetime.date(2006, 7, 31): 0.8236308866241628, + datetime.date(2006, 8, 31): 0.8258421296470271, + datetime.date(2006, 9, 30): 0.8280593093045969, + datetime.date(2006, 10, 31): 0.8302824415352524, + datetime.date(2006, 11, 30): 0.8325115423201642, + datetime.date(2006, 12, 31): 0.8347466276834082, + datetime.date(2007, 1, 31): 0.8367434807412649, + datetime.date(2007, 2, 28): 0.8387451106044448, + datetime.date(2007, 3, 31): 0.8407515286998624, + datetime.date(2007, 4, 30): 0.8427627464817672, + datetime.date(2007, 5, 31): 0.8447787754318093, + datetime.date(2007, 6, 30): 0.8467996270591048, + datetime.date(2007, 7, 31): 0.8488253129003013, + datetime.date(2007, 8, 31): 0.8508558445196442, + datetime.date(2007, 9, 30): 0.8528912335090427, + datetime.date(2007, 10, 31): 0.8549314914881352, + datetime.date(2007, 11, 30): 0.8569766301043567, + datetime.date(2007, 12, 31): 0.8590266610330046, + datetime.date(2008, 1, 31): 0.8617575783739837, + datetime.date(2008, 2, 29): 0.8644971775287661, + datetime.date(2008, 3, 31): 0.8672454860975616, + datetime.date(2008, 4, 30): 0.870002531768323, + datetime.date(2008, 5, 31): 0.8727683423170256, + datetime.date(2008, 6, 30): 0.8755429456079467, + datetime.date(2008, 7, 31): 0.8783263695939465, + datetime.date(2008, 8, 31): 0.8811186423167497, + datetime.date(2008, 9, 30): 0.8839197919072282, + datetime.date(2008, 10, 31): 0.886729846585684, + datetime.date(2008, 11, 30): 0.8895488346621339, + datetime.date(2008, 12, 31): 0.8923767845365945, + datetime.date(2009, 1, 31): 0.8921387430293194, + datetime.date(2009, 2, 28): 0.8919007650196163, + datetime.date(2009, 3, 31): 0.8916628504905473, + datetime.date(2009, 4, 30): 0.8914249994251789, + datetime.date(2009, 5, 31): 0.8911872118065823, + datetime.date(2009, 6, 30): 0.8909494876178329, + datetime.date(2009, 7, 31): 0.8907118268420108, + datetime.date(2009, 8, 31): 0.8904742294622007, + datetime.date(2009, 9, 30): 0.8902366954614916, + datetime.date(2009, 10, 31): 0.8899992248229773, + datetime.date(2009, 11, 30): 0.8897618175297558, + datetime.date(2009, 12, 31): 0.8895244735649297, + datetime.date(2010, 1, 31): 0.890737414311675, + datetime.date(2010, 2, 28): 0.8919520090042069, + datetime.date(2010, 3, 31): 0.8931682598978183, + datetime.date(2010, 4, 30): 0.8943861692508774, + datetime.date(2010, 5, 31): 0.8956057393248318, + datetime.date(2010, 6, 30): 0.8968269723842128, + datetime.date(2010, 7, 31): 0.8980498706966398, + datetime.date(2010, 8, 31): 0.8992744365328239, + datetime.date(2010, 9, 30): 0.9005006721665729, + datetime.date(2010, 10, 31): 0.9017285798747947, + datetime.date(2010, 11, 30): 0.9029581619375023, + datetime.date(2010, 12, 31): 0.9041894206378177, + datetime.date(2011, 1, 31): 0.9065575680795865, + datetime.date(2011, 2, 28): 0.9089319178968509, + datetime.date(2011, 3, 31): 0.9113124863341492, + datetime.date(2011, 4, 30): 0.9136992896785655, + datetime.date(2011, 5, 31): 0.9160923442598411, + datetime.date(2011, 6, 30): 0.9184916664504862, + datetime.date(2011, 7, 31): 0.9208972726658923, + datetime.date(2011, 8, 31): 0.9233091793644436, + datetime.date(2011, 9, 30): 0.9257274030476306, + datetime.date(2011, 10, 31): 0.9281519602601626, + datetime.date(2011, 11, 30): 0.9305828675900806, + datetime.date(2011, 12, 31): 0.9330201416688713, + datetime.date(2012, 1, 31): 0.9346344220173154, + datetime.date(2012, 2, 29): 0.9362514953398091, + datetime.date(2012, 3, 31): 0.9378713664686629, + datetime.date(2012, 4, 30): 0.939494040244548, + datetime.date(2012, 5, 31): 0.9411195215165111, + datetime.date(2012, 6, 30): 0.9427478151419884, + datetime.date(2012, 7, 31): 0.9443789259868198, + datetime.date(2012, 8, 31): 0.9460128589252648, + datetime.date(2012, 9, 30): 0.9476496188400153, + datetime.date(2012, 10, 31): 0.9492892106222117, + datetime.date(2012, 11, 30): 0.9509316391714567, + datetime.date(2012, 12, 31): 0.9525769093958298, + datetime.date(2013, 1, 31): 0.9537392913695202, + datetime.date(2013, 2, 28): 0.9549030917398139, + datetime.date(2013, 3, 31): 0.9560683122375094, + datetime.date(2013, 4, 30): 0.9572349545955173, + datetime.date(2013, 5, 31): 0.9584030205488626, + datetime.date(2013, 6, 30): 0.9595725118346874, + datetime.date(2013, 7, 31): 0.9607434301922536, + datetime.date(2013, 8, 31): 0.9619157773629458, + datetime.date(2013, 9, 30): 0.9630895550902728, + datetime.date(2013, 10, 31): 0.9642647651198718, + datetime.date(2013, 11, 30): 0.9654414091995093, + datetime.date(2013, 12, 31): 0.9666194890790851, + datetime.date(2014, 1, 31): 0.9679161285720607, + datetime.date(2014, 2, 28): 0.9692145073988628, + datetime.date(2014, 3, 31): 0.9705146278926629, + datetime.date(2014, 4, 30): 0.971816492389762, + datetime.date(2014, 5, 31): 0.9731201032295953, + datetime.date(2014, 6, 30): 0.9744254627547358, + datetime.date(2014, 7, 31): 0.9757325733108996, + datetime.date(2014, 8, 31): 0.9770414372469484, + datetime.date(2014, 9, 30): 0.9783520569148956, + datetime.date(2014, 10, 31): 0.979664434669909, + datetime.date(2014, 11, 30): 0.9809785728703159, + datetime.date(2014, 12, 31): 0.982294473877607, + datetime.date(2015, 1, 31): 0.9823795242074701, + datetime.date(2015, 2, 28): 0.9824645819012744, + datetime.date(2015, 3, 31): 0.9825496469596572, + datetime.date(2015, 4, 30): 0.9826347193832563, + datetime.date(2015, 5, 31): 0.9827197991727095, + datetime.date(2015, 6, 30): 0.9828048863286544, + datetime.date(2015, 7, 31): 0.9828899808517289, + datetime.date(2015, 8, 31): 0.9829750827425707, + datetime.date(2015, 9, 30): 0.9830601920018182, + datetime.date(2015, 10, 31): 0.9831453086301088, + datetime.date(2015, 11, 30): 0.983230432628081, + datetime.date(2015, 12, 31): 0.9833155639963727, + datetime.date(2016, 1, 31): 0.9845331544934913, + datetime.date(2016, 2, 29): 0.985752252672043, + datetime.date(2016, 3, 31): 0.9869728603989143, + datetime.date(2016, 4, 30): 0.9881949795433034, + datetime.date(2016, 5, 31): 0.9894186119767231, + datetime.date(2016, 6, 30): 0.9906437595730033, + datetime.date(2016, 7, 31): 0.9918704242082947, + datetime.date(2016, 8, 31): 0.9930986077610708, + datetime.date(2016, 9, 30): 0.994328312112131, + datetime.date(2016, 10, 31): 0.9955595391446039, + datetime.date(2016, 11, 30): 0.9967922907439498, + datetime.date(2016, 12, 31): 0.9980265687979636, + datetime.date(2017, 1, 31): 1.0, + datetime.date(2017, 2, 28): 1.0019773333333333, + datetime.date(2017, 3, 31): 1.0039585765137777, + datetime.date(2017, 4, 30): 1.0059437372724043, + datetime.date(2017, 5, 31): 1.0079328233555709, + datetime.date(2017, 6, 30): 1.0099258425249524, + datetime.date(2017, 7, 31): 1.0119228025575717, + datetime.date(2017, 8, 31): 1.0139237112458288, + datetime.date(2017, 9, 30): 1.0159285763975323, + datetime.date(2017, 10, 31): 1.017937405835929, + datetime.date(2017, 11, 30): 1.0199502073997353, + datetime.date(2017, 12, 31): 1.0219669889431668, + datetime.date(2018, 1, 31): 1.0241308337144226, + datetime.date(2018, 2, 28): 1.0262992600663405, + datetime.date(2018, 3, 31): 1.0284722776996542, + datetime.date(2018, 4, 30): 1.030649896335637, + datetime.date(2018, 5, 31): 1.032832125716145, + datetime.date(2018, 6, 30): 1.0350189756036612, + datetime.date(2018, 7, 31): 1.0372104557813393, + datetime.date(2018, 8, 31): 1.039406576053047, + datetime.date(2018, 9, 30): 1.0416073462434101, + datetime.date(2018, 10, 31): 1.043812776197856, + datetime.date(2018, 11, 30): 1.046022875782659, + datetime.date(2018, 12, 31): 1.0482376548849828, + datetime.date(2019, 1, 31): 1.0502734197639072, + datetime.date(2019, 2, 28): 1.0523131382678736, + datetime.date(2019, 3, 31): 1.0543568180751512, + datetime.date(2019, 4, 30): 1.0564044668789212, + datetime.date(2019, 5, 31): 1.0584560923873054, + datetime.date(2019, 6, 30): 1.0605117023233959, + datetime.date(2019, 7, 31): 1.0625713044252831, + datetime.date(2019, 8, 31): 1.0646349064460856, + datetime.date(2019, 9, 30): 1.0667025161539792, + datetime.date(2019, 10, 31): 1.0687741413322265, + datetime.date(2019, 11, 30): 1.0708497897792053, + datetime.date(2019, 12, 31): 1.072929469308439, + datetime.date(2020, 1, 31): 1.0749909244621372, + datetime.date(2020, 2, 29): 1.077056340358337, + datetime.date(2020, 3, 31): 1.0791257246069457, + datetime.date(2020, 4, 30): 1.0811990848324906, + datetime.date(2020, 5, 31): 1.083276428674149, + datetime.date(2020, 6, 30): 1.085357763785775, + datetime.date(2020, 7, 31): 1.0874430978359289, + datetime.date(2020, 8, 31): 1.0895324385079046, + datetime.date(2020, 9, 30): 1.091625793499758, + datetime.date(2020, 10, 31): 1.0937231705243355, + datetime.date(2020, 11, 30): 1.0958245773093032, + datetime.date(2020, 12, 31): 1.0979300215971735, + datetime.date(2021, 1, 31): 1.0997079911753143, + datetime.date(2021, 2, 28): 1.101488839967757, + datetime.date(2021, 3, 31): 1.1032725726370534, + datetime.date(2021, 4, 30): 1.1050591938533056, + datetime.date(2021, 5, 31): 1.1068487082941783, + datetime.date(2021, 6, 30): 1.1086411206449114, + datetime.date(2021, 7, 31): 1.1104364355983318, + datetime.date(2021, 8, 31): 1.1122346578548659, + datetime.date(2021, 9, 30): 1.1140357921225517, + datetime.date(2021, 10, 31): 1.1158398431170518, + datetime.date(2021, 11, 30): 1.1176468155616648, + datetime.date(2021, 12, 31): 1.1194567141873384, + datetime.date(2022, 1, 31): 1.1211576316449643, + datetime.date(2022, 2, 28): 1.122861133499254, + datetime.date(2022, 3, 31): 1.1245672236769746, + datetime.date(2022, 4, 30): 1.1262759061108591, + datetime.date(2022, 5, 31): 1.1279871847396161, + datetime.date(2022, 6, 30): 1.1297010635079388, + datetime.date(2022, 7, 31): 1.1314175463665137, + datetime.date(2022, 8, 31): 1.1331366372720302, + datetime.date(2022, 9, 30): 1.13485834018719, + datetime.date(2022, 10, 31): 1.1365826590807149, + datetime.date(2022, 11, 30): 1.1383095979273576, + datetime.date(2022, 12, 31): 1.14003916070791, + datetime.date(2023, 1, 31): 1.1417473247038867, + datetime.date(2023, 2, 28): 1.1434580481068888, + datetime.date(2023, 3, 31): 1.1451713347517734, + datetime.date(2023, 4, 30): 1.1468871884791425, + datetime.date(2023, 5, 31): 1.148605613135354, + datetime.date(2023, 6, 30): 1.1503266125725278, + datetime.date(2023, 7, 31): 1.1520501906485565, + datetime.date(2023, 8, 31): 1.1537763512271126, + datetime.date(2023, 9, 30): 1.1555050981776576, + datetime.date(2023, 10, 31): 1.157236435375451, + datetime.date(2023, 11, 30): 1.1589703667015585, + datetime.date(2023, 12, 31): 1.1607068960428615, + datetime.date(2024, 1, 31): 1.1624783051579952, + datetime.date(2024, 2, 29): 1.1642524177034816, + datetime.date(2024, 3, 31): 1.1660292378051522, + datetime.date(2024, 4, 30): 1.1678087695951351, + datetime.date(2024, 5, 31): 1.1695910172118646, + datetime.date(2024, 6, 30): 1.1713759848000913, + datetime.date(2024, 7, 31): 1.173163676510891, + datetime.date(2024, 8, 31): 1.1749540965016745, + datetime.date(2024, 9, 30): 1.1767472489361974, + datetime.date(2024, 10, 31): 1.1785431379845703, + datetime.date(2024, 11, 30): 1.1803417678232675, + datetime.date(2024, 12, 31): 1.1821431426351374, + datetime.date(2025, 1, 31): 1.1839691043554477, + datetime.date(2025, 2, 28): 1.1857978864924097, + datetime.date(2025, 3, 31): 1.1876294934024947, + datetime.date(2025, 4, 30): 1.1894639294489031, + datetime.date(2025, 5, 31): 1.1913011990015752, + datetime.date(2025, 6, 30): 1.1931413064372007, + datetime.date(2025, 7, 31): 1.19498425613923, + datetime.date(2025, 8, 31): 1.196830052497884, + datetime.date(2025, 9, 30): 1.198678699910165, + datetime.date(2025, 10, 31): 1.2005302027798668, + datetime.date(2025, 11, 30): 1.2023845655175858, + datetime.date(2025, 12, 31): 1.2042417925407303, + datetime.date(2026, 1, 31): 1.206277471119959, + datetime.date(2026, 2, 28): 1.2083165908580182, + datetime.date(2026, 3, 31): 1.2103591575719228, + datetime.date(2026, 4, 30): 1.212405177088522, + datetime.date(2026, 5, 31): 1.2144546552445143, + datetime.date(2026, 6, 30): 1.2165075978864652, + datetime.date(2026, 7, 31): 1.2185640108708227, + datetime.date(2026, 8, 31): 1.2206239000639352, + datetime.date(2026, 9, 30): 1.2226872713420676, + datetime.date(2026, 10, 31): 1.2247541305914178, + datetime.date(2026, 11, 30): 1.2268244837081344, + datetime.date(2026, 12, 31): 1.2288983365983328, + datetime.date(2027, 1, 31): 1.2310312626995608, + datetime.date(2027, 2, 28): 1.2331678907943693, + datetime.date(2027, 3, 31): 1.2353082273080898, + datetime.date(2027, 4, 30): 1.237452278677205, + datetime.date(2027, 5, 31): 1.2396000513493697, + datetime.date(2027, 6, 30): 1.2417515517834297, + datetime.date(2027, 7, 31): 1.24390678644944, + datetime.date(2027, 8, 31): 1.2460657618286863, + datetime.date(2027, 9, 30): 1.2482284844137033, + datetime.date(2027, 10, 31): 1.250394960708294, + datetime.date(2027, 11, 30): 1.25256519722755, + datetime.date(2027, 12, 31): 1.2547392004978706, + datetime.date(2028, 1, 31): 1.2568866509483156, + datetime.date(2028, 2, 29): 1.259037776699122, + datetime.date(2028, 3, 31): 1.261192584040462, + datetime.date(2028, 4, 30): 1.263351079273273, + datetime.date(2028, 5, 31): 1.2655132687092763, + datetime.date(2028, 6, 30): 1.2676791586709955, + datetime.date(2028, 7, 31): 1.2698487554917752, + datetime.date(2028, 8, 31): 1.2720220655157992, + datetime.date(2028, 9, 30): 1.2741990950981095, + datetime.date(2028, 10, 31): 1.2763798506046236, + datetime.date(2028, 11, 30): 1.2785643384121554, + datetime.date(2028, 12, 31): 1.280752564908432, + datetime.date(2029, 1, 31): 1.2828925556407371, + datetime.date(2029, 2, 28): 1.2850361220522637, + datetime.date(2029, 3, 31): 1.2871832701175623, + datetime.date(2029, 4, 30): 1.2893340058211653, + datetime.date(2029, 5, 31): 1.2914883351576054, + datetime.date(2029, 6, 30): 1.293646264131431, + datetime.date(2029, 7, 31): 1.2958077987572236, + datetime.date(2029, 8, 31): 1.2979729450596147, + datetime.date(2029, 9, 30): 1.3001417090733012, + datetime.date(2029, 10, 31): 1.3023140968430647, + datetime.date(2029, 11, 30): 1.3044901144237857, + datetime.date(2029, 12, 31): 1.3066697678804629, + datetime.date(2030, 1, 31): 1.3088176266711669, + datetime.date(2030, 2, 28): 1.3109690160382248, + datetime.date(2030, 3, 31): 1.3131239417850764, + datetime.date(2030, 4, 30): 1.3152824097247013, + datetime.date(2030, 5, 31): 1.3174444256796338, + datetime.date(2030, 6, 30): 1.3196099954819795, + datetime.date(2030, 7, 31): 1.3217791249734305, + datetime.date(2030, 8, 31): 1.323951820005281, + datetime.date(2030, 9, 30): 1.3261280864384442, + datetime.date(2030, 10, 31): 1.3283079301434657, + datetime.date(2030, 11, 30): 1.3304913570005426, + datetime.date(2030, 12, 31): 1.3326783728995366, + datetime.date(2031, 1, 31): 1.3348319928859904, + datetime.date(2031, 2, 28): 1.3369890931413078, + datetime.date(2031, 3, 31): 1.3391496792896336, + datetime.date(2031, 4, 30): 1.3413137569642015, + datetime.date(2031, 5, 31): 1.3434813318073493, + datetime.date(2031, 6, 30): 1.3456524094705313, + datetime.date(2031, 7, 31): 1.3478269956143363, + datetime.date(2031, 8, 31): 1.3500050959084995, + datetime.date(2031, 9, 30): 1.3521867160319188, + datetime.date(2031, 10, 31): 1.3543718616726692, + datetime.date(2031, 11, 30): 1.356560538528018, + datetime.date(2031, 12, 31): 1.3587527523044391, + datetime.date(2032, 1, 31): 1.3609480502028264, + datetime.date(2032, 2, 29): 1.3631468949811405, + datetime.date(2032, 3, 31): 1.3653492923699735, + datetime.date(2032, 4, 30): 1.367555248109177, + datetime.date(2032, 5, 31): 1.3697647679478755, + datetime.date(2032, 6, 30): 1.371977857644482, + datetime.date(2032, 7, 31): 1.3741945229667143, + datetime.date(2032, 8, 31): 1.3764147696916078, + datetime.date(2032, 9, 30): 1.3786386036055325, + datetime.date(2032, 10, 31): 1.380866030504207, + datetime.date(2032, 11, 30): 1.3830970561927136, + datetime.date(2032, 12, 31): 1.385331686485514, + datetime.date(2033, 1, 31): 1.3875832621350055, + datetime.date(2033, 2, 28): 1.3898384972639959, + datetime.date(2033, 3, 31): 1.3920973978202262, + datetime.date(2033, 4, 30): 1.394359969761105, + datetime.date(2033, 5, 31): 1.3966262190537237, + datetime.date(2033, 6, 30): 1.3988961516748712, + datetime.date(2033, 7, 31): 1.4011697736110513, + datetime.date(2033, 8, 31): 1.403447090858497, + datetime.date(2033, 9, 30): 1.4057281094231873, + datetime.date(2033, 10, 31): 1.4080128353208623, + datetime.date(2033, 11, 30): 1.41030127457704, + datetime.date(2033, 12, 31): 1.4125934332270311, + datetime.date(2034, 1, 31): 1.4149072514828935, + datetime.date(2034, 2, 28): 1.4172248597570265, + datetime.date(2034, 3, 31): 1.4195462642574541, + datetime.date(2034, 4, 30): 1.4218714712023686, + datetime.date(2034, 5, 31): 1.4242004868201474, + datetime.date(2034, 6, 30): 1.4265333173493708, + datetime.date(2034, 7, 31): 1.428869969038837, + datetime.date(2034, 8, 31): 1.43121044814758, + datetime.date(2034, 9, 30): 1.4335547609448862, + datetime.date(2034, 10, 31): 1.4359029137103108, + datetime.date(2034, 11, 30): 1.4382549127336948, + datetime.date(2034, 12, 31): 1.4406107643151824, + datetime.date(2035, 1, 31): 1.4429865874594414, + datetime.date(2035, 2, 28): 1.445366328758245, + datetime.date(2035, 3, 31): 1.4477499946733259, + datetime.date(2035, 4, 30): 1.4501375916770738, + datetime.date(2035, 5, 31): 1.4525291262525526, + datetime.date(2035, 6, 30): 1.4549246048935176, + datetime.date(2035, 7, 31): 1.457324034104434, + datetime.date(2035, 8, 31): 1.4597274204004933, + datetime.date(2035, 9, 30): 1.462134770307632, + datetime.date(2035, 10, 31): 1.4645460903625491, + datetime.date(2035, 11, 30): 1.4669613871127245, + datetime.date(2035, 12, 31): 1.4693806671164344, + datetime.date(2036, 1, 31): 1.4718193004762303, + datetime.date(2036, 2, 29): 1.4742619810736115, + datetime.date(2036, 3, 31): 1.4767087156255096, + datetime.date(2036, 4, 30): 1.479159510860003, + datetime.date(2036, 5, 31): 1.4816143735163363, + datetime.date(2036, 6, 30): 1.4840733103449395, + datetime.date(2036, 7, 31): 1.4865363281074446, + datetime.date(2036, 8, 31): 1.4890034335767068, + datetime.date(2036, 9, 30): 1.4914746335368212, + datetime.date(2036, 10, 31): 1.4939499347831413, + datetime.date(2036, 11, 30): 1.4964293441222993, + datetime.date(2036, 12, 31): 1.4989128683722237, + datetime.date(2037, 1, 31): 1.5013958992132328, + datetime.date(2037, 2, 28): 1.503883043330128, + datetime.date(2037, 3, 31): 1.5063743075367757, + datetime.date(2037, 4, 30): 1.5088696986583285, + datetime.date(2037, 5, 31): 1.5113692235312461, + datetime.date(2037, 6, 30): 1.5138728890033128, + datetime.date(2037, 7, 31): 1.5163807019336568, + datetime.date(2037, 8, 31): 1.5188926691927684, + datetime.date(2037, 9, 30): 1.52140879766252, + datetime.date(2037, 10, 31): 1.5239290942361834, + datetime.date(2037, 11, 30): 1.52645356581845, + datetime.date(2037, 12, 31): 1.528982219325449, + datetime.date(2038, 1, 31): 1.531502969527323, + datetime.date(2038, 2, 28): 1.534027875553575, + datetime.date(2038, 3, 31): 1.5365569442556875, + datetime.date(2038, 4, 30): 1.5390901824964387, + datetime.date(2038, 5, 31): 1.5416275971499214, + datetime.date(2038, 6, 30): 1.5441691951015606, + datetime.date(2038, 7, 31): 1.546714983248134, + datetime.date(2038, 8, 31): 1.549264968497789, + datetime.date(2038, 9, 30): 1.5518191577700624, + datetime.date(2038, 10, 31): 1.5543775579958983, + datetime.date(2038, 11, 30): 1.5569401761176678, + datetime.date(2038, 12, 31): 1.559507019089188, + datetime.date(2039, 1, 31): 1.5620682961641141, + datetime.date(2039, 2, 28): 1.5646337797864776, + datetime.date(2039, 3, 31): 1.5672034768649572, + datetime.date(2039, 4, 30): 1.5697773943195792, + datetime.date(2039, 5, 31): 1.5723555390817336, + datetime.date(2039, 6, 30): 1.5749379180941956, + datetime.date(2039, 7, 31): 1.5775245383111425, + datetime.date(2039, 8, 31): 1.5801154066981726, + datetime.date(2039, 9, 30): 1.5827105302323248, + datetime.date(2039, 10, 31): 1.5853099159020962, + datetime.date(2039, 11, 30): 1.5879135707074619, + datetime.date(2039, 12, 31): 1.5905215016598937, + datetime.date(2040, 1, 31): 1.5931291792827287, + datetime.date(2040, 2, 29): 1.595741132221916, + datetime.date(2040, 3, 31): 1.5983573674868838, + datetime.date(2040, 4, 30): 1.6009778920985531, + datetime.date(2040, 5, 31): 1.6036027130893553, + datetime.date(2040, 6, 30): 1.6062318375032512, + datetime.date(2040, 7, 31): 1.608865272395751, + datetime.date(2040, 8, 31): 1.611503024833932, + datetime.date(2040, 9, 30): 1.6141451018964579, + datetime.date(2040, 10, 31): 1.6167915106735988, + datetime.date(2040, 11, 30): 1.6194422582672487, + datetime.date(2040, 12, 31): 1.622097351790945, + datetime.date(2041, 1, 31): 1.6247561082481263, + datetime.date(2041, 2, 28): 1.627419222634806, + datetime.date(2041, 3, 31): 1.6300867020940037, + datetime.date(2041, 4, 30): 1.6327585537804472, + datetime.date(2041, 5, 31): 1.635434784860591, + datetime.date(2041, 6, 30): 1.6381154025126365, + datetime.date(2041, 7, 31): 1.6408004139265508, + datetime.date(2041, 8, 31): 1.6434898263040858, + datetime.date(2041, 9, 30): 1.6461836468587976, + datetime.date(2041, 10, 31): 1.6488818828160658, + datetime.date(2041, 11, 30): 1.6515845414131136, + datetime.date(2041, 12, 31): 1.6542916298990267, + datetime.date(2042, 1, 31): 1.65700697311415, + datetime.date(2042, 2, 28): 1.6597267732754626, + datetime.date(2042, 3, 31): 1.6624510376985664, + datetime.date(2042, 4, 30): 1.6651797737110705, + datetime.date(2042, 5, 31): 1.6679129886526118, + datetime.date(2042, 6, 30): 1.670650689874875, + datetime.date(2042, 7, 31): 1.6733928847416106, + datetime.date(2042, 8, 31): 1.676139580628657, + datetime.date(2042, 9, 30): 1.6788907849239585, + datetime.date(2042, 10, 31): 1.6816465050275864, + datetime.date(2042, 11, 30): 1.6844067483517586, + datetime.date(2042, 12, 31): 1.6871715223208588, + datetime.date(2043, 1, 31): 1.6899451741068114, + datetime.date(2043, 2, 28): 1.6927233856806267, + datetime.date(2043, 3, 31): 1.6955061645384386, + datetime.date(2043, 4, 30): 1.6982935181887044, + datetime.date(2043, 5, 31): 1.7010854541522251, + datetime.date(2043, 6, 30): 1.703881979962166, + datetime.date(2043, 7, 31): 1.706683103164076, + datetime.date(2043, 8, 31): 1.7094888313159085, + datetime.date(2043, 9, 30): 1.712299171988043, + datetime.date(2043, 10, 31): 1.7151141327633035, + datetime.date(2043, 11, 30): 1.71793372123698, + datetime.date(2043, 12, 31): 1.7207579450168495, + datetime.date(2044, 1, 31): 1.7235900240944928, + datetime.date(2044, 2, 29): 1.7264267642994757, + datetime.date(2044, 3, 31): 1.7292681733032322, + datetime.date(2044, 4, 30): 1.732114258789822, + datetime.date(2044, 5, 31): 1.734965028455952, + datetime.date(2044, 6, 30): 1.7378204900109966, + datetime.date(2044, 7, 31): 1.7406806511770179, + datetime.date(2044, 8, 31): 1.743545519688788, + datetime.date(2044, 9, 30): 1.7464151032938084, + datetime.date(2044, 10, 31): 1.7492894097523326, + datetime.date(2044, 11, 30): 1.7521684468373855, + datetime.date(2044, 12, 31): 1.7550522223347849, + datetime.date(2045, 1, 31): 1.7579421198760468, + datetime.date(2045, 2, 28): 1.7608367759696144, + datetime.date(2045, 3, 31): 1.7637361984509972, + datetime.date(2045, 4, 30): 1.7666403951686067, + datetime.date(2045, 5, 31): 1.7695493739837784, + datetime.date(2045, 6, 30): 1.7724631427707918, + datetime.date(2045, 7, 31): 1.775381709416892, + datetime.date(2045, 8, 31): 1.7783050818223123, + datetime.date(2045, 9, 30): 1.7812332679002942, + datetime.date(2045, 10, 31): 1.7841662755771088, + datetime.date(2045, 11, 30): 1.7871041127920801, + datetime.date(2045, 12, 31): 1.7900467874976032, + datetime.date(2046, 1, 31): 1.7929938491512625, + datetime.date(2046, 2, 28): 1.7959457627297155, + datetime.date(2046, 3, 31): 1.798902536220978, + datetime.date(2046, 4, 30): 1.8018641776262165, + datetime.date(2046, 5, 31): 1.8048306949597708, + datetime.date(2046, 6, 30): 1.8078020962491743, + datetime.date(2046, 7, 31): 1.8107783895351774, + datetime.date(2046, 8, 31): 1.8137595828717683, + datetime.date(2046, 9, 30): 1.8167456843261949, + datetime.date(2046, 10, 31): 1.8197367019789865, + datetime.date(2046, 11, 30): 1.8227326439239762, + datetime.date(2046, 12, 31): 1.8257335182683228, + datetime.date(2047, 1, 31): 1.8287369097704886, + datetime.date(2047, 2, 28): 1.8317452419501548, + datetime.date(2047, 3, 31): 1.834758522934898, + datetime.date(2047, 4, 30): 1.8377767608656645, + datetime.date(2047, 5, 31): 1.8407999638967933, + datetime.date(2047, 6, 30): 1.843828140196037, + datetime.date(2047, 7, 31): 1.8468612979445849, + datetime.date(2047, 8, 31): 1.8498994453370843, + datetime.date(2047, 9, 30): 1.8529425905816634, + datetime.date(2047, 10, 31): 1.8559907418999526, + datetime.date(2047, 11, 30): 1.8590439075271072, + datetime.date(2047, 12, 31): 1.86210209571183, + datetime.date(2048, 1, 31): 1.8651631692582504, + datetime.date(2048, 2, 29): 1.8682292748441485, + datetime.date(2048, 3, 31): 1.871300420741596, + datetime.date(2048, 4, 30): 1.8743766152362635, + datetime.date(2048, 5, 31): 1.8774578666274424, + datetime.date(2048, 6, 30): 1.8805441832280665, + datetime.date(2048, 7, 31): 1.8836355733647354, + datetime.date(2048, 8, 31): 1.8867320453777372, + datetime.date(2048, 9, 30): 1.8898336076210693, + datetime.date(2048, 10, 31): 1.8929402684624632, + datetime.date(2048, 11, 30): 1.8960520362834052, + datetime.date(2048, 12, 31): 1.8991689194791601, + datetime.date(2049, 1, 31): 1.902290021459603, + datetime.date(2049, 2, 28): 1.905416252671823, + datetime.date(2049, 3, 31): 1.908547621545221, + datetime.date(2049, 4, 30): 1.9116841365230504, + datetime.date(2049, 5, 31): 1.9148258060624401, + datetime.date(2049, 6, 30): 1.9179726386344174, + datetime.date(2049, 7, 31): 1.9211246427239317, + datetime.date(2049, 8, 31): 1.924281826829876, + datetime.date(2049, 9, 30): 1.9274441994651104, + datetime.date(2049, 10, 31): 1.9306117691564852, + datetime.date(2049, 11, 30): 1.933784544444864, + datetime.date(2049, 12, 31): 1.936962533885146, + datetime.date(2050, 1, 31): 1.9401459476468907, + datetime.date(2050, 2, 28): 1.9433345933751818, + datetime.date(2050, 3, 31): 1.9465284796687987, + datetime.date(2050, 4, 30): 1.9497276151406535, + datetime.date(2050, 5, 31): 1.9529320084178137, + datetime.date(2050, 6, 30): 1.9561416681415251, + datetime.date(2050, 7, 31): 1.9593566029672358, + datetime.date(2050, 8, 31): 1.962576821564619, + datetime.date(2050, 9, 30): 1.9658023326175968, + datetime.date(2050, 10, 31): 1.969033144824363, + datetime.date(2050, 11, 30): 1.9722692668974073, + datetime.date(2050, 12, 31): 1.9755107075635383, + datetime.date(2051, 1, 31): 1.978758265194836, + datetime.date(2051, 2, 28): 1.9820111615117346, + datetime.date(2051, 3, 31): 1.9852694052905413, + datetime.date(2051, 4, 30): 1.9885330053219907, + datetime.date(2051, 5, 31): 1.991801970411269, + datetime.date(2051, 6, 30): 1.9950763093780373, + datetime.date(2051, 7, 31): 1.9983560310564548, + datetime.date(2051, 8, 31): 2.0016411442952036, + datetime.date(2051, 9, 30): 2.0049316579575125, + datetime.date(2051, 10, 31): 2.0082275809211803, + datetime.date(2051, 11, 30): 2.0115289220786003, + datetime.date(2051, 12, 31): 2.014835690336784, + datetime.date(2052, 1, 31): 2.018148866223083, + datetime.date(2052, 2, 29): 2.021467490263049, + datetime.date(2052, 3, 31): 2.0247915714155713, + datetime.date(2052, 4, 30): 2.0281211186542722, + datetime.date(2052, 5, 31): 2.031456140967529, + datetime.date(2052, 6, 30): 2.034796647358501, + datetime.date(2052, 7, 31): 2.038142646845151, + datetime.date(2052, 8, 31): 2.0414941484602713, + datetime.date(2052, 9, 30): 2.0448511612515077, + datetime.date(2052, 10, 31): 2.0482136942813836, + datetime.date(2052, 11, 30): 2.0515817566273244, + datetime.date(2052, 12, 31): 2.0549553573816834, + datetime.date(2053, 1, 31): 2.058335121481051, + datetime.date(2053, 2, 28): 2.061720444243932, + datetime.date(2053, 3, 31): 2.0651113348126042, + datetime.date(2053, 4, 30): 2.06850780234438, + datetime.date(2053, 5, 31): 2.0719098560116347, + datetime.date(2053, 6, 30): 2.075317505001828, + datetime.date(2053, 7, 31): 2.0787307585175303, + datetime.date(2053, 8, 31): 2.082149625776447, + datetime.date(2053, 9, 30): 2.085574116011445, + datetime.date(2053, 10, 31): 2.089004238470576, + datetime.date(2053, 11, 30): 2.0924400024171, + datetime.date(2053, 12, 31): 2.0958814171295153, + datetime.date(2054, 1, 31): 2.0993286437032728, + datetime.date(2054, 2, 28): 2.102781540145065, + datetime.date(2054, 3, 31): 2.106240115780476, + datetime.date(2054, 4, 30): 2.1097043799504296, + datetime.date(2054, 5, 31): 2.113174342011212, + datetime.date(2054, 6, 30): 2.1166500113344986, + datetime.date(2054, 7, 31): 2.1201313973073797, + datetime.date(2054, 8, 31): 2.1236185093323843, + datetime.date(2054, 9, 30): 2.127111356827507, + datetime.date(2054, 10, 31): 2.1306099492262316, + datetime.date(2054, 11, 30): 2.1341142959775588, + datetime.date(2054, 12, 31): 2.137624406546031, + datetime.date(2055, 1, 31): 2.1411400616601206, + datetime.date(2055, 2, 28): 2.1446614988147052, + datetime.date(2055, 3, 31): 2.1481887275192477, + datetime.date(2055, 4, 30): 2.1517217572988505, + datetime.date(2055, 5, 31): 2.1552605976942827, + datetime.date(2055, 6, 30): 2.158805258262003, + datetime.date(2055, 7, 31): 2.162355748574188, + datetime.date(2055, 8, 31): 2.1659120782187586, + datetime.date(2055, 9, 30): 2.169474256799402, + datetime.date(2055, 10, 31): 2.1730422939356013, + datetime.date(2055, 11, 30): 2.176616199262661, + datetime.date(2055, 12, 31): 2.1801959824317323, + datetime.date(2056, 1, 31): 2.1837812255603417, + datetime.date(2056, 2, 29): 2.1873723644746486, + datetime.date(2056, 3, 31): 2.190969408870031, + datetime.date(2056, 4, 30): 2.1945723684578127, + datetime.date(2056, 5, 31): 2.1981812529652838, + datetime.date(2056, 6, 30): 2.2017960721357333, + datetime.date(2056, 7, 31): 2.2054168357284714, + datetime.date(2056, 8, 31): 2.209043553518858, + datetime.date(2056, 9, 30): 2.2126762352983276, + datetime.date(2056, 10, 31): 2.2163148908744152, + datetime.date(2056, 11, 30): 2.2199595300707866, + datetime.date(2056, 12, 31): 2.2236101627272595, + datetime.date(2057, 1, 31): 2.227266375986442, + datetime.date(2057, 2, 28): 2.2309286010437446, + datetime.date(2057, 3, 31): 2.234596847784181, + datetime.date(2057, 4, 30): 2.2382711261090176, + datetime.date(2057, 5, 31): 2.241951445935802, + datetime.date(2057, 6, 30): 2.2456378171983884, + datetime.date(2057, 7, 31): 2.249330249846966, + datetime.date(2057, 8, 31): 2.253028753848082, + datetime.date(2057, 9, 30): 2.256733339184675, + datetime.date(2057, 10, 31): 2.2604440158560957, + datetime.date(2057, 11, 30): 2.264160793878137, + datetime.date(2057, 12, 31): 2.2678836832830607, + datetime.date(2058, 1, 31): 2.2716125209011375, + datetime.date(2058, 2, 28): 2.2753474894465127, + datetime.date(2058, 3, 31): 2.2790885989996106, + datetime.date(2058, 4, 30): 2.282835859657431, + datetime.date(2058, 5, 31): 2.2865892815335758, + datetime.date(2058, 6, 30): 2.2903488747582736, + datetime.date(2058, 7, 31): 2.294114649478411, + datetime.date(2058, 8, 31): 2.2978866158575566, + datetime.date(2058, 9, 30): 2.301664784075991, + datetime.date(2058, 10, 31): 2.305449164330732, + datetime.date(2058, 11, 30): 2.309239766835564, + datetime.date(2058, 12, 31): 2.313036601821065, + datetime.date(2059, 1, 31): 2.316839751701828, + datetime.date(2059, 2, 28): 2.3206491548122226, + datetime.date(2059, 3, 31): 2.3244648214339563, + datetime.date(2059, 4, 30): 2.3282867618656446, + datetime.date(2059, 5, 31): 2.332114986422835, + datetime.date(2059, 6, 30): 2.335949505438037, + datetime.date(2059, 7, 31): 2.339790329260748, + datetime.date(2059, 8, 31): 2.343637468257482, + datetime.date(2059, 9, 30): 2.347490932811799, + datetime.date(2059, 10, 31): 2.3513507333243315, + datetime.date(2059, 11, 30): 2.3552168802128133, + datetime.date(2059, 12, 31): 2.359089383912107, + datetime.date(2060, 1, 31): 2.3629684482549114, + datetime.date(2060, 2, 29): 2.366853890965691, + datetime.date(2060, 3, 31): 2.3707457225324324, + datetime.date(2060, 4, 30): 2.3746439534603687, + datetime.date(2060, 5, 31): 2.3785485942720066, + datetime.date(2060, 6, 30): 2.382459655507155, + datetime.date(2060, 7, 31): 2.386377147722954, + datetime.date(2060, 8, 31): 2.390301081493901, + datetime.date(2060, 9, 30): 2.394231467411884, + datetime.date(2060, 10, 31): 2.3981683160862044, + datetime.date(2060, 11, 30): 2.402111638143611, + datetime.date(2060, 12, 31): 2.4060614442283246, + datetime.date(2061, 1, 31): 2.4100179369138024, + datetime.date(2061, 2, 28): 2.4139809355987034, + datetime.date(2061, 3, 31): 2.4179504509814, + datetime.date(2061, 4, 30): 2.4219264937778564, + datetime.date(2061, 5, 31): 2.4259090747216563, + datetime.date(2061, 6, 30): 2.4298982045640356, + datetime.date(2061, 7, 31): 2.433893894073908, + datetime.date(2061, 8, 31): 2.437896154037897, + datetime.date(2061, 9, 30): 2.441904995260361, + datetime.date(2061, 10, 31): 2.445920428563427, + datetime.date(2061, 11, 30): 2.4499424647870174, + datetime.date(2061, 12, 31): 2.4539711147888794, + datetime.date(2062, 1, 31): 2.458006506663394, + datetime.date(2062, 2, 28): 2.4620485344707776, + datetime.date(2062, 3, 31): 2.46609720912338, + datetime.date(2062, 4, 30): 2.470152541551494, + datetime.date(2062, 5, 31): 2.4742145427033884, + datetime.date(2062, 6, 30): 2.4782832235453345, + datetime.date(2062, 7, 31): 2.4823585950616374, + datetime.date(2062, 8, 31): 2.4864406682546645, + datetime.date(2062, 9, 30): 2.4905294541448764, + datetime.date(2062, 10, 31): 2.494624963770857, + datetime.date(2062, 11, 30): 2.49872720818934, + datetime.date(2062, 12, 31): 2.5028361984752436, + datetime.date(2063, 1, 31): 2.506951956536693, + datetime.date(2063, 2, 28): 2.511074482705632, + datetime.date(2063, 3, 31): 2.515203788111792, + datetime.date(2063, 4, 30): 2.5193398839032044, + datetime.date(2063, 5, 31): 2.5234827812462357, + datetime.date(2063, 6, 30): 2.527632491325613, + datetime.date(2063, 7, 31): 2.531789025344456, + datetime.date(2063, 8, 31): 2.5359523945243083, + datetime.date(2063, 9, 30): 2.5401226101051657, + datetime.date(2063, 10, 31): 2.544299683345508, + datetime.date(2063, 11, 30): 2.5484836255223278, + datetime.date(2063, 12, 31): 2.552674447931164, + datetime.date(2064, 1, 31): 2.5568720975209347, + datetime.date(2064, 2, 29): 2.5610766497778648, + datetime.date(2064, 3, 31): 2.565288116052785, + datetime.date(2064, 4, 30): 2.569506507715193, + datetime.date(2064, 5, 31): 2.5737318361532813, + datetime.date(2064, 6, 30): 2.5779641127739708, + datetime.date(2064, 7, 31): 2.582203349002939, + datetime.date(2064, 8, 31): 2.5864495562846517, + datetime.date(2064, 9, 30): 2.5907027460823957, + datetime.date(2064, 10, 31): 2.594962929878306, + datetime.date(2064, 11, 30): 2.5992301191734017, + datetime.date(2064, 12, 31): 2.6035043254876116, + datetime.date(2065, 1, 31): 2.6077854692914553, + datetime.date(2065, 2, 28): 2.61207365291163, + datetime.date(2065, 3, 31): 2.6163688879242515, + datetime.date(2065, 4, 30): 2.6206711859244707, + datetime.date(2065, 5, 31): 2.624980558526504, + datetime.date(2065, 6, 30): 2.629297017363668, + datetime.date(2065, 7, 31): 2.633620574088408, + datetime.date(2065, 8, 31): 2.6379512403723298, + datetime.date(2065, 9, 30): 2.6422890279062323, + datetime.date(2065, 10, 31): 2.646633948400139, + datetime.date(2065, 11, 30): 2.6509860135833274, + datetime.date(2065, 12, 31): 2.6553452352043645, + datetime.date(2066, 1, 31): 2.6597115512766614, + datetime.date(2066, 2, 28): 2.6640850470993684, + datetime.date(2066, 3, 31): 2.6684657344785068, + datetime.date(2066, 4, 30): 2.67285362523951, + datetime.date(2066, 5, 31): 2.6772487312272557, + datetime.date(2066, 6, 30): 2.681651064306101, + datetime.date(2066, 7, 31): 2.6860606363599095, + datetime.date(2066, 8, 31): 2.690477459292088, + datetime.date(2066, 9, 30): 2.694901545025616, + datetime.date(2066, 10, 31): 2.6993329055030784, + datetime.date(2066, 11, 30): 2.7037715526866983, + datetime.date(2066, 12, 31): 2.708217498558368, + datetime.date(2067, 1, 31): 2.712670725484101, + datetime.date(2067, 2, 28): 2.717131275023347, + datetime.date(2067, 3, 31): 2.7215991592169635, + datetime.date(2067, 4, 30): 2.7260743901256066, + datetime.date(2067, 5, 31): 2.7305569798297644, + datetime.date(2067, 6, 30): 2.7350469404297892, + datetime.date(2067, 7, 31): 2.739544284045931, + datetime.date(2067, 8, 31): 2.744049022818369, + datetime.date(2067, 9, 30): 2.748561168907245, + datetime.date(2067, 10, 31): 2.753080734492696, + datetime.date(2067, 11, 30): 2.7576077317748884, + datetime.date(2067, 12, 31): 2.762142172974048, + datetime.date(2068, 1, 31): 2.766684089591215, + datetime.date(2068, 2, 29): 2.771233474689461, + datetime.date(2068, 3, 31): 2.7757903405495514, + datetime.date(2068, 4, 30): 2.7803546994724444, + datetime.date(2068, 5, 31): 2.784926563779326, + datetime.date(2068, 6, 30): 2.7895059458116416, + datetime.date(2068, 7, 31): 2.794092857931131, + datetime.date(2068, 8, 31): 2.798687312519861, + datetime.date(2068, 9, 30): 2.803289321980258, + datetime.date(2068, 10, 31): 2.8078988987351434, + datetime.date(2068, 11, 30): 2.8125160552277646, + datetime.date(2068, 12, 31): 2.8171408039218306, + datetime.date(2069, 1, 31): 2.8217732004272142, + datetime.date(2069, 2, 28): 2.826413214264807, + datetime.date(2069, 3, 31): 2.8310608579602525, + datetime.date(2069, 4, 30): 2.835716144059792, + datetime.date(2069, 5, 31): 2.840379085130297, + datetime.date(2069, 6, 30): 2.845049693759303, + datetime.date(2069, 7, 31): 2.8497279825550446, + datetime.date(2069, 8, 31): 2.8544139641464876, + datetime.date(2069, 9, 30): 2.8591076511833657, + datetime.date(2069, 10, 31): 2.863809056336214, + datetime.date(2069, 11, 30): 2.868518192296401, + datetime.date(2069, 12, 31): 2.8732350717761643, + datetime.date(2070, 1, 31): 2.8779597469269094, + datetime.date(2070, 2, 28): 2.8826921912140895, + datetime.date(2070, 3, 31): 2.887432417413075, + datetime.date(2070, 4, 30): 2.8921804383202456, + datetime.date(2070, 5, 31): 2.8969362667530225, + datetime.date(2070, 6, 30): 2.9016999155499033, + datetime.date(2070, 7, 31): 2.9064713975704968, + datetime.date(2070, 8, 31): 2.911250725695559, + datetime.date(2070, 9, 30): 2.9160379128270253, + datetime.date(2070, 10, 31): 2.920832971888047, + datetime.date(2070, 11, 30): 2.9256359158230265, + datetime.date(2070, 12, 31): 2.9304467575976516} diff --git a/blocnote/apps/financialInputs/static/financialInputs/scripts/app.js b/blocnote/apps/financialInputs/static/financialInputs/scripts/app.js index cfc0187..9f57f91 100644 --- a/blocnote/apps/financialInputs/static/financialInputs/scripts/app.js +++ b/blocnote/apps/financialInputs/static/financialInputs/scripts/app.js @@ -31,8 +31,6 @@ function billProjectionDatesForm(form) { 'Content-Type': 'application/json', 'X-CSRFToken': Cookies.get('csrftoken') }) - }).then(res => { - loadBillsOverview(); }); } return false; @@ -95,12 +93,17 @@ function updateTable(utility, text) { /** Generate html text for a given utility and bills data from backend. */ function getText(result, utility) { + units = {}; + units['electricity'] = `kWh`; + units['gas'] = `mmBTU`; + units['oil'] = `mmBTU`; + units['water'] = `Gallons`; var text = ` - + @@ -148,36 +151,43 @@ function sendFile(id, content) { }).then(res => { var text = getText(res.payload.result, id); updateTable(id, text); - loadBillsOverview(); }); } /** Create form tag Energy Bills Overview */ function startOverviewForm() { - var text = ``; + var text = ``; return text; } /** Create dropdown box to select estimation algorithm */ function estimationDropDownBox() { - var text = ` - `; + + `; return text; } + /** Create table and column headings */ -function createOverviewColumnHeaders(year) { - var text = `
Date From Date ToUsage Usage (${units[utility]}) Bill Charge ($)
- - - - - - - `; +function createOverviewColumnHeaders(dict) { + var text = ` +
User InputUtility/Year${year}
+ + + + `; + for(var year in dict) { + text += ``; + } + text += ` + `; return text; } + /** Display if user input is needed or not */ function createFlag(state) { if(state) { @@ -194,43 +204,69 @@ function createFlag(state) { * database. If value is not from database, make it a user input. Name * the input along with utility type to uniquely identify it. */ -function createInput(id, state, value) { +function createInput(id, state, value, year) { var text = ``; var is_readonly = ``; if (!state) { is_readonly = `readonly`; } - text = ``; + text = ``; return text; } /** - * Add rows to the energy bills table. Currently adds only one entry in - * each column. Will be modified to display entries for 20 years. + * Create rows for each utility from Pro Forma start year for the Pro Forma duration. Show flag if bill present or + * absent. If bill is present, make input a readonly tag else, allow it to take inputs. */ function createOverviewRows(data) { - var user_input = ''; var text = ``; for (var utility in utilities) { - user_input = utilities[utility] + '_is_user_input'; + user_input = utilities[utility] + '_user'; text += ` - - - `; + + `; + for(var year in data[utilities[utility]]) { + text += ``; + } + text += ``; } - text += ` -
User InputUtility/Year${year}
+ ${createFlag(data[user_input])} - - ${utilities[utility]} - ${createInput(utilities[utility], data[user_input], data[utilities[utility]])} -
${utilities[utility]} + ($)${createInput(utilities[utility], data[user_input], data[utilities[utility]][year], year)} +
- - `; + text += ` + + Total Annual Charge`; + for(var charge in data['total_annual_charge']) { + text += `$${data['total_annual_charge'][charge]}` + } + text += ` + + `; return text; } +/**Create the calculate button to project bill with given data. */ +function createCalculateButton() { + text = `
+ +
+ + `; + return text; +} + +/**Create button to submit the projected and input data. */ +function createSubmitButton() { + text = `
+ +
+ + `; + return text; +} + /** * Make HTTP GET request to get the bills overview information. Call all * the relevant functions to create the energy overview table. @@ -245,22 +281,26 @@ function loadBillsOverview() { }).then(res => { if(!res.err) { const table = document.querySelector('#Energy-Bills-Overview'); - var text = ""; + var text = ``; text += startOverviewForm(); text += estimationDropDownBox(); - text += createOverviewColumnHeaders(res.payload.instance.year); - text += createOverviewRows(res.payload.instance); + text += createCalculateButton(); + if(res.payload.instance.present) { + text += createOverviewColumnHeaders(res.payload.instance.electricity); + text += createOverviewRows(res.payload.instance); + text += createSubmitButton(); + } table.innerHTML = text; } }) } /** - * Handle Submition of energy bills overview form. Get form data and create + * Handle Submission of energy bills overview form. Get form data and create * a dictionary result with the formdata. Send result to backend. This will * be modified to receive all projected rows for ~20 years. */ -function billsOverviewFormSubmit(data) { +function billsOverviewFormCalculate(data) { const formData = new FormData(data); const result = {}; for (const [key, value] of formData.entries()) { @@ -274,6 +314,38 @@ function billsOverviewFormSubmit(data) { 'Content-Type': 'application/json', 'X-CSRFToken': Cookies.get('csrftoken') }) + }).then(res => { + if(res.payload.instance['err']) { + alert(res.payload.instance['msg']); + return false; + } + table = document.querySelector('#Energy-Bills-Overview') + var text = ``; + text += startOverviewForm(); + text += estimationDropDownBox(); + text += createCalculateButton(); + text += createOverviewColumnHeaders(res.payload.instance.electricity); + text += createOverviewRows(res.payload.instance); + text += createSubmitButton(); + table.innerHTML = text; + }); + return false; +} + +function billsOverviewFormSubmit(form) { + const formData = new FormData(form); + const result = {}; + for (const [key, value] of formData.entries()) { + result[key] = value; + } + request(`bills-overview/`, { + method: 'POST', + credentials: 'same-origin', + body: JSON.stringify(result), + headers: new Headers({ + 'Content-Type': 'application/json', + 'X-CSRFToken': Cookies.get('csrftoken') + }) }); return false; } diff --git a/blocnote/apps/financialInputs/views.py b/blocnote/apps/financialInputs/views.py index 37ca0fd..dacf138 100644 --- a/blocnote/apps/financialInputs/views.py +++ b/blocnote/apps/financialInputs/views.py @@ -4,6 +4,11 @@ from django.http import JsonResponse from django.db import connections from django.views import View +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.bill_lib import annualizing_projection +from .inflation_coefficient import inflation_coeff_dict + from .models import FinancingOverview, Bills, BillsOverview, CustomerPreference from .forms import BlocNoteHeaderForm @@ -289,41 +294,134 @@ class BillsTable(View): return JsonResponse({'result': result, 'present': present}) -def get_total_charge(obj): - """Get total utility charge. +def get_total_charge(utility_type, analysis_date, building_id): + """Get annual total utility charge. + + Obtain annual charge for a utility for every year from the Pro Forma start year till end year. Make calls to bpfin + to perform the tasks. + + Args: + utility_type: Which utility type. + analysis_date: Dictionary containing the Pro Forma start date and duration. + building_id: id of the building. + + Returns: + annual_bill: Dictionary with year as keys and the annual charge for that year as value. + """ + bills_object = Bills.objects.filter( + building_id=building_id, + utility_type=utility_type + ) + + if bills_object: + raw_bill = {} + raw_bill['utility_type'] = utility_type + raw_bill['date_from'] = [] + raw_bill['date_to'] = [] + raw_bill['charge'] = [] + raw_bill['usage'] = [] + + for bill in bills_object: + raw_bill['date_from'].append(bill.date_from) + raw_bill['date_to'].append(bill.date_to) + raw_bill['usage'].append(float(bill.usage)) + raw_bill['charge'].append(float(bill.charge)) + + norm_bill = bill_month_normalize_rough(raw_bill) + prior_bill = bill_prior_proj_rough(norm_bill, raw_bill, analysis_date, inflation_coeff_dict) + annual_bill = annualizing_projection(prior_bill['date_to'], prior_bill['charge']) + else: + annual_bill = {} + objs = BillsOverview.objects.filter( + building_id=building_id + ) + if objs: + for obj in objs: + store_year = str(obj.year) + if utility_type == 'electricity': + annual_bill[store_year] = obj.electricity + elif utility_type == 'gas': + annual_bill[store_year] = obj.gas + elif utility_type == 'oil': + annual_bill[store_year] = obj.oil + elif utility_type == 'water': + annual_bill[store_year] = obj.water + else: + for i in range(analysis_date['proforma_duration']): + store_year = str(analysis_date['proforma_start'].year + i) + annual_bill[store_year] = 0 + for year in annual_bill: + annual_bill[year] = float("{0:.2f}".format(annual_bill[year])) + annual_bill = {str(key): value for key, value in annual_bill.items()} + return annual_bill + + +def get_if_user_input(building_id): + """Check if utility charge input was user or from bills. - Obtain the total charge for a utility. This function will be replaced by - finance team logic. + Check if the utility charge obtained from bills stored or by user input. Query bills database to check if an + entry has been made for this building. Args: - object: Model object which contains the charge value. + building_id: id of the building. Returns: - total: The sum of all charges for the utility. + e_user, g_user, o_user, w_user: Boolean for each utility. """ - total = 0 - for row in obj: - total += row.charge - return total + e_obj = Bills.objects.filter( + building_id=building_id, + utility_type='electricity' + ) + g_obj = Bills.objects.filter( + building_id=building_id, + utility_type='gas' + ) + o_obj = Bills.objects.filter( + building_id=building_id, + utility_type='oil' + ) + w_obj = Bills.objects.filter( + building_id=building_id, + utility_type='water' + ) + if e_obj: + e_user = False + else: + e_user = True + if g_obj: + g_user = False + else: + g_user = True + if o_obj: + o_user = False + else: + o_user = True + if w_obj: + w_user = False + else: + w_user = True + return e_user, g_user, o_user, w_user class BillsOverviewView(View): """Generate Energy Bills Overview table. - Generate energy bills overview table from the energy bills data. If bill not - available, take user input for calculation purposes. + Generate energy bills overview table from the energy bills data. If bill + not available, take user input for calculation purposes. """ model_bills_overview = BillsOverview model_bills = Bills utility = ['electricity', 'gas', 'oil', 'water'] + estimation_algorithm = {} def get(self, request, building_id): """Handle HTTP GET request. - Generate energy bills overview table with bills present in the - database. If a certain utility bill is absent, allow user to input - data. + Generate energy bills overview table with bills present in the database. If a certain utility bill is absent, + allow user to input value manually. Call bpfin functions to project bill charges from the Pro Forma start date + for the Pro Forma period. Store projected values as well as manually inputs. On page load, must fetch actual + and projected values. Args: request: HTTP GET request. @@ -333,76 +431,41 @@ class BillsOverviewView(View): JsonResponse: Returns instance, which is a dictionary containing all the data to be filled in the table. """ - instance = self.get_instance(building_id) - return JsonResponse({'instance': instance}) - - def get_instance(self, building_id): - """Create dictionary instance. - - This dictionary is an instance of the data present in the database. It - contains the annual utility charge(for now, this will be replaced by - value obtained from finance logic), Pro Forma start year and flags - indicating if a utility is present in the database. This is to tell the - frontend if an input has to be taken or not. - - Args: - building_id: id of the building. - - Returns: - instance: A dictionary containing the annual utility charge and a - flag indicating if utility bill present or not. - """ - instance = {} - - try: - obj = FinancingOverview.objects.get(building_id=building_id) - date = obj.pro_forma_start_date - year = date.year - except: - year = 'TBD' - - utility_objects = {} - for util in self.utility: - utility_objects[util] = self.model_bills.objects.filter( - building_id=building_id, - utility_type=util - ) - - for util in self.utility: - instance[util] = 0 - instance[util+'_is_user_input'] = True - - for util in self.utility: - if utility_objects[util]: - instance[util] = get_total_charge( - utility_objects[util] - ) - instance[util+'_is_user_input'] = False - else: - try: - bills_overview_obj = self.model_bills_overview.objects.get( - building_id=building_id - ) - if util == 'electricity': - instance[util] = bills_overview_obj.electricity - elif util == 'gas': - instance[util] = bills_overview_obj.gas - elif util == 'oil': - instance[util] = bills_overview_obj.oil - elif util == 'water': - instance[util] = bills_overview_obj.water - except: - instance[util] = 0 - instance['year'] = year - - return instance + objs = self.model_bills_overview.objects.filter(building_id=building_id) + result = {} + total_annual_charge = [] + if objs: + result['present'] = True + else: + result['present'] = False + result['electricity'] = {} + result['gas'] = {} + result['oil'] = {} + result['water'] = {} + result['electricity_user'] = True + result['gas_user'] = True + result['oil_user'] = True + result['water_user'] = True + for obj in objs: + store_year = str(obj.year) + result['electricity'][store_year] = float("{0:.2f}".format(obj.electricity)) + result['gas'][store_year] = float("{0:.2f}".format(obj.gas)) + result['oil'][store_year] = float("{0:.2f}".format(obj.oil)) + result['water'][store_year] = float("{0:.2f}".format(obj.water)) + result['electricity_user'] = obj.electricity_is_user_input + result['gas_user'] = obj.gas_is_user_input + result['oil_user'] = obj.oil_is_user_input + result['water_user'] = obj.water_is_user_input + total_annual_charge.append(obj.electricity + obj.gas + obj.oil + obj.water) + result['total_annual_charge'] = total_annual_charge + + return JsonResponse({'instance': result}) def put(self, request, building_id): """Handle HTTP PUT request. - Take annual utility charge and projection option from frontend and - store in the database. This will be modified to call the finance - projection fuction. + Take annual utility charge and projection option from frontend and project bills for given Pro Forma start + date and duration. Pass this value as a dictionary to the frontend. Args: request: HTTP PUT request. @@ -412,45 +475,78 @@ class BillsOverviewView(View): JsonResponse: Returns new instance with the updated values. """ put = json.loads(request.body.decode()) + self.estimation_algorithm[building_id] = put['Estimation Model'] + analysis_date = {} + pro_forma_object = get_model_object(FinancingOverview, building_id) + analysis_date['proforma_start'] = pro_forma_object.pro_forma_start_date + analysis_date['proforma_duration'] = int(pro_forma_object.pro_forma_duration) + projected_bills = {} + if put['Estimation Model'] == 'Rough Estimation': + if not pro_forma_object: + projected_bills['err'] = True + projected_bills['msg'] = 'Please fill in bill projection date, period and funds form' + return JsonResponse({'instance': projected_bills}) + projected_bills['err'] = False + for util in self.utility: + projected_bills[util] = get_total_charge(util, analysis_date, building_id) + e_user, g_user, o_user, w_user = get_if_user_input(building_id) + projected_bills['electricity_user'] = e_user + projected_bills['gas_user'] = g_user + projected_bills['oil_user'] = o_user + projected_bills['water_user'] = w_user + total_annual_charge = [] + for i in range(analysis_date['proforma_duration']): + total = 0 + store_year = str(analysis_date['proforma_start'].year + i) + total += float("{0:.2f}".format(projected_bills['electricity'][store_year])) + total += float("{0:.2f}".format(projected_bills['gas'][store_year])) + total += float("{0:.2f}".format(projected_bills['oil'][store_year])) + total += float("{0:.2f}".format(projected_bills['water'][store_year])) + total_annual_charge.append(total) + projected_bills['total_annual_charge'] = total_annual_charge + return JsonResponse({'instance': projected_bills}) + + def post(self, request, building_id): + """Handle HTTP POST request. + + Get annual utility charge for the Pro Forma duration from Pro Forma start date and store in the database. + If data for this building is already present, they are deleted before storing new data. - entry = self.model_bills_overview.objects.filter( - building_id=building_id - ) - - instance = self.get_instance(building_id) + Args: + request: HTTP POST request. + building_id: id of the building. - if entry: - entry.update( - building_id=building_id, - year=instance['year'], - electricity=put['electricity-value'], - electricity_is_user_input=instance['electricity_is_user_input'], - gas=put['gas-value'], - gas_is_user_input=instance['gas_is_user_input'], - oil=put['oil-value'], - oil_is_user_input=instance['oil_is_user_input'], - water=put['water-value'], - water_is_user_input=instance['water_is_user_input'], - estimation_algorithm=put['Estimation Model'] - ) - else: - entry = self.model_bills_overview.objects.create( + Returns: + JsonResponse: A dictionary with status OK. + """ + post = json.loads(request.body.decode()) + self.model_bills_overview.objects.filter(building_id=building_id).delete() + analysis_date = {} + e_user, g_user, o_user, w_user = get_if_user_input(building_id) + financing_overview_obj = FinancingOverview.objects.get(building_id=building_id) + analysis_date['proforma_start'] = financing_overview_obj.pro_forma_start_date + analysis_date['proforma_duration'] = int(financing_overview_obj.pro_forma_duration) + for i in range(analysis_date['proforma_duration']): + store_year = str(analysis_date['proforma_start'].year + i) + e_search = 'electricity-value-' + store_year + g_search = 'gas-value-' + store_year + o_search = 'oil-value-' + store_year + w_search = 'water-value-' + store_year + self.model_bills_overview.objects.create( building_id=building_id, - year=instance['year'], - electricity=put['electricity-value'], - electricity_is_user_input=instance['electricity_is_user_input'], - gas=put['gas-value'], - gas_is_user_input=instance['gas_is_user_input'], - oil=put['oil-value'], - oil_is_user_input=instance['oil_is_user_input'], - water=put['water-value'], - water_is_user_input=instance['water_is_user_input'], - estimation_algorithm=put['Estimation Model'] + year=int(store_year), + estimation_algorithm=self.estimation_algorithm[building_id], + electricity=post[e_search], + gas=post[g_search], + oil=post[o_search], + water=post[w_search], + electricity_is_user_input=e_user, + gas_is_user_input=g_user, + oil_is_user_input=o_user, + water_is_user_input=w_user ) - new_instance = self.get_instance(building_id) - - return JsonResponse({'status': new_instance}) + return JsonResponse({'status': 'OK'}) class CustomerPreferenceView(View): diff --git a/requirements-dev.txt b/requirements-dev.txt index 8d2fff9..e7ea11c 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -5,3 +5,4 @@ pycodestyle==2.0.0 pydocstyle==1.0.0 pylint>=1.5.6 pylint-django>=0.7.2 +matplotlib diff --git a/requirements.txt b/requirements.txt index a1b2581..4b681fa 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ Django==1.10.6 psycopg2==2.7 python-decouple==3.0 +matplotlib -- GitLab From ec4badf6a5e205b7e113025b9f2ee69f879d62c9 Mon Sep 17 00:00:00 2001 From: Adarsh Murthy Date: Mon, 24 Apr 2017 18:10:24 -0400 Subject: [PATCH 2/5] Fix javascript functions to have functions that close all tags they open. Fix formatting on frontend. Make estimation algorithm model for a building and not to a bills overview row. --- .../migrations/0013_auto_20170424_2158.py | 27 +++ blocnote/apps/financialInputs/models.py | 8 +- .../static/financialInputs/scripts/app.js | 173 +++++++++++------- blocnote/apps/financialInputs/views.py | 85 ++++----- requirements-dev.txt | 1 - requirements.txt | 1 - 6 files changed, 176 insertions(+), 119 deletions(-) create mode 100644 blocnote/apps/financialInputs/migrations/0013_auto_20170424_2158.py diff --git a/blocnote/apps/financialInputs/migrations/0013_auto_20170424_2158.py b/blocnote/apps/financialInputs/migrations/0013_auto_20170424_2158.py new file mode 100644 index 0000000..781d346 --- /dev/null +++ b/blocnote/apps/financialInputs/migrations/0013_auto_20170424_2158.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.6 on 2017-04-24 21:58 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('financialInputs', '0012_customerpreference'), + ] + + operations = [ + migrations.CreateModel( + name='EstimationAlgorithm', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('building_id', models.IntegerField()), + ('algorithm', models.CharField(max_length=100)), + ], + ), + migrations.RemoveField( + model_name='billsoverview', + name='estimation_algorithm', + ), + ] diff --git a/blocnote/apps/financialInputs/models.py b/blocnote/apps/financialInputs/models.py index 139bfb3..58f6589 100644 --- a/blocnote/apps/financialInputs/models.py +++ b/blocnote/apps/financialInputs/models.py @@ -42,12 +42,18 @@ class Bills(models.Model): charge = models.DecimalField(max_digits=10, decimal_places=2) +class EstimationAlgorithm(models.Model): + """Estimation algorithm used to project bills for pro forma duration.""" + + building_id = models.IntegerField() + algorithm = models.CharField(max_length=100) + + class BillsOverview(models.Model): """Store annual charge of each utility used for bill projection.""" building_id = models.IntegerField() year = models.DecimalField(max_digits=4, decimal_places=0) - estimation_algorithm = models.CharField(max_length=100) electricity = models.DecimalField(max_digits=10, decimal_places=2) electricity_is_user_input = models.BooleanField(default=False) water = models.DecimalField(max_digits=10, decimal_places=2) diff --git a/blocnote/apps/financialInputs/static/financialInputs/scripts/app.js b/blocnote/apps/financialInputs/static/financialInputs/scripts/app.js index 9f57f91..954786b 100644 --- a/blocnote/apps/financialInputs/static/financialInputs/scripts/app.js +++ b/blocnote/apps/financialInputs/static/financialInputs/scripts/app.js @@ -108,9 +108,9 @@ function getText(result, utility) { `; - for(var i =0; i`; - for(var j=0; j` + result[i][j] + ``; } text += ``; @@ -154,38 +154,67 @@ function sendFile(id, content) { }); } +function createEstimateModelForm() { + var estimateModelForm = ``; + estimateModelForm += ` +
+
`; + estimateModelForm += estimationDropDownBox(); + estimateModelForm += createCalculateButton(); + estimateModelForm += ` +
+
`; + return estimateModelForm; +} + /** Create form tag Energy Bills Overview */ -function startOverviewForm() { - var text = `
`; +function startBillsOverviewForm() { + var text = ``; return text; } /** Create dropdown box to select estimation algorithm */ function estimationDropDownBox() { - var text = `
-
- -
`; + var text = ` +
+ +
+ `; return text; } /** Create table and column headings */ -function createOverviewColumnHeaders(dict) { - var text = ` - - - - - `; - for(var year in dict) { - text += ``; +function createBillsOverviewTable(responseDictionary) { + var tableHTML = ``; + tableHTML = ` + +
User InputUtility/Year${year}
+ + + + + `; + for (var year in responseDictionary['electricity']) { + tableHTML += ` + + `; } - text += ` - `; - return text; + tableHTML += ` + + + `; + tableHTML += createBillsOverviewRows(responseDictionary); + tableHTML += ` +
User InputUtility/Year${year}
+ `; + tableHTML += createSubmitButton(); + tableHTML += ` + + `; + return tableHTML; } /** Display if user input is needed or not */ @@ -204,7 +233,7 @@ function createFlag(state) { * database. If value is not from database, make it a user input. Name * the input along with utility type to uniquely identify it. */ -function createInput(id, state, value, year) { +function createBillsOverviewTableCellInput(id, state, value, year) { var text = ``; var is_readonly = ``; if (!state) { @@ -218,53 +247,69 @@ function createInput(id, state, value, year) { * Create rows for each utility from Pro Forma start year for the Pro Forma duration. Show flag if bill present or * absent. If bill is present, make input a readonly tag else, allow it to take inputs. */ -function createOverviewRows(data) { +function createBillsOverviewRows(data) { var user_input = ''; - var text = ``; - for (var utility in utilities) { - user_input = utilities[utility] + '_user'; - text += ` - + var text = ` + + `; + for (var key in utilities) { + utility = utilities[key]; + user_input = utility + '_user'; + text += ` + + ${createFlag(data[user_input])} - - ${utilities[utility]}`; - for(var year in data[utilities[utility]]) { - text += ` - ($)${createInput(utilities[utility], data[user_input], data[utilities[utility]][year], year)} - `; + + + ${utility} + + `; + for (var year in data[utility]) { + text += ` + + ($)${createBillsOverviewTableCellInput(utility, data[user_input], data[utility][year], year)} + + `; } - text += ``; + text += ` + + `; } - text += ` - - Total Annual Charge`; - for(var charge in data['total_annual_charge']) { - text += `$${data['total_annual_charge'][charge]}` + text += ` + + + Total Annual Charge + `; + for (var charge in data['total_annual_charge']) { + text += ` + $${data['total_annual_charge'][charge]} + `; } - text += ` - - `; + text += ` + + + `; return text; } /**Create the calculate button to project bill with given data. */ function createCalculateButton() { - text = `
+ text = ` +
-
-
- `; - return text; +
+ `; + return text; } /**Create button to submit the projected and input data. */ function createSubmitButton() { - text = `
+ text = ` +
-
-
- `; - return text; + + `; + return text; } /** @@ -282,13 +327,9 @@ function loadBillsOverview() { if(!res.err) { const table = document.querySelector('#Energy-Bills-Overview'); var text = ``; - text += startOverviewForm(); - text += estimationDropDownBox(); - text += createCalculateButton(); + text += createEstimateModelForm(); if(res.payload.instance.present) { - text += createOverviewColumnHeaders(res.payload.instance.electricity); - text += createOverviewRows(res.payload.instance); - text += createSubmitButton(); + text += createBillsOverviewTable(res.payload.instance); } table.innerHTML = text; } @@ -321,12 +362,8 @@ function billsOverviewFormCalculate(data) { } table = document.querySelector('#Energy-Bills-Overview') var text = ``; - text += startOverviewForm(); - text += estimationDropDownBox(); - text += createCalculateButton(); - text += createOverviewColumnHeaders(res.payload.instance.electricity); - text += createOverviewRows(res.payload.instance); - text += createSubmitButton(); + text += createEstimateModelForm(); + text += createBillsOverviewTable(res.payload.instance) table.innerHTML = text; }); return false; @@ -386,7 +423,7 @@ function createCustomerPreferenceTable(instance) { var expectedPayback = instance['expected_payback']; var expectedNetNOIDSCR = instance['expected_net_noi_dscr'] } - var text = ` + var text = `
diff --git a/blocnote/apps/financialInputs/views.py b/blocnote/apps/financialInputs/views.py index dacf138..f99a8b5 100644 --- a/blocnote/apps/financialInputs/views.py +++ b/blocnote/apps/financialInputs/views.py @@ -4,12 +4,9 @@ from django.http import JsonResponse from django.db import connections from django.views import View -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.bill_lib import annualizing_projection -from .inflation_coefficient import inflation_coeff_dict +from bpfin.utilbills.bill_backend_call import bill_prior_proj_rough_annual -from .models import FinancingOverview, Bills, BillsOverview, CustomerPreference +from .models import FinancingOverview, Bills, BillsOverview, CustomerPreference, EstimationAlgorithm from .forms import BlocNoteHeaderForm @@ -310,7 +307,7 @@ def get_total_charge(utility_type, analysis_date, building_id): """ bills_object = Bills.objects.filter( building_id=building_id, - utility_type=utility_type + utility_type=utility_type, ) if bills_object: @@ -326,14 +323,11 @@ def get_total_charge(utility_type, analysis_date, building_id): raw_bill['date_to'].append(bill.date_to) raw_bill['usage'].append(float(bill.usage)) raw_bill['charge'].append(float(bill.charge)) - - norm_bill = bill_month_normalize_rough(raw_bill) - prior_bill = bill_prior_proj_rough(norm_bill, raw_bill, analysis_date, inflation_coeff_dict) - annual_bill = annualizing_projection(prior_bill['date_to'], prior_bill['charge']) + annual_bill = bill_prior_proj_rough_annual(raw_bill, analysis_date) else: annual_bill = {} objs = BillsOverview.objects.filter( - building_id=building_id + building_id=building_id, ) if objs: for obj in objs: @@ -347,8 +341,8 @@ def get_total_charge(utility_type, analysis_date, building_id): elif utility_type == 'water': annual_bill[store_year] = obj.water else: - for i in range(analysis_date['proforma_duration']): - store_year = str(analysis_date['proforma_start'].year + i) + for year in range(analysis_date['proforma_duration']): + store_year = str(analysis_date['proforma_start'].year + year) annual_bill[store_year] = 0 for year in annual_bill: annual_bill[year] = float("{0:.2f}".format(annual_bill[year])) @@ -368,39 +362,23 @@ def get_if_user_input(building_id): Returns: e_user, g_user, o_user, w_user: Boolean for each utility. """ - e_obj = Bills.objects.filter( + electricity_obj = Bills.objects.filter( building_id=building_id, - utility_type='electricity' + utility_type='electricity', ) - g_obj = Bills.objects.filter( + gas_obj = Bills.objects.filter( building_id=building_id, - utility_type='gas' + utility_type='gas', ) - o_obj = Bills.objects.filter( + oil_obj = Bills.objects.filter( building_id=building_id, - utility_type='oil' + utility_type='oil', ) - w_obj = Bills.objects.filter( + water_obj = Bills.objects.filter( building_id=building_id, - utility_type='water' + utility_type='water', ) - if e_obj: - e_user = False - else: - e_user = True - if g_obj: - g_user = False - else: - g_user = True - if o_obj: - o_user = False - else: - o_user = True - if w_obj: - w_user = False - else: - w_user = True - return e_user, g_user, o_user, w_user + return not electricity_obj, not gas_obj, not oil_obj, not water_obj class BillsOverviewView(View): @@ -413,7 +391,6 @@ class BillsOverviewView(View): model_bills_overview = BillsOverview model_bills = Bills utility = ['electricity', 'gas', 'oil', 'water'] - estimation_algorithm = {} def get(self, request, building_id): """Handle HTTP GET request. @@ -475,17 +452,27 @@ class BillsOverviewView(View): JsonResponse: Returns new instance with the updated values. """ put = json.loads(request.body.decode()) - self.estimation_algorithm[building_id] = put['Estimation Model'] + estimation_algorithm_obj = EstimationAlgorithm.objects.filter(building_id=building_id) + if estimation_algorithm_obj: + estimation_algorithm_obj.update( + building_id=building_id, + algorithm=put['Estimation Model'], + ) + else: + EstimationAlgorithm.objects.create( + building_id=building_id, + algorithm=put['Estimation Model'], + ) + projected_bills = {} analysis_date = {} pro_forma_object = get_model_object(FinancingOverview, building_id) + if not pro_forma_object: + projected_bills['err'] = True + projected_bills['msg'] = 'Please fill in bill projection date, period and funds form' + return JsonResponse({'instance': projected_bills}) analysis_date['proforma_start'] = pro_forma_object.pro_forma_start_date analysis_date['proforma_duration'] = int(pro_forma_object.pro_forma_duration) - projected_bills = {} if put['Estimation Model'] == 'Rough Estimation': - if not pro_forma_object: - projected_bills['err'] = True - projected_bills['msg'] = 'Please fill in bill projection date, period and funds form' - return JsonResponse({'instance': projected_bills}) projected_bills['err'] = False for util in self.utility: projected_bills[util] = get_total_charge(util, analysis_date, building_id) @@ -495,15 +482,18 @@ class BillsOverviewView(View): projected_bills['oil_user'] = o_user projected_bills['water_user'] = w_user total_annual_charge = [] - for i in range(analysis_date['proforma_duration']): + for year in range(analysis_date['proforma_duration']): total = 0 - store_year = str(analysis_date['proforma_start'].year + i) + store_year = str(analysis_date['proforma_start'].year + year) total += float("{0:.2f}".format(projected_bills['electricity'][store_year])) total += float("{0:.2f}".format(projected_bills['gas'][store_year])) total += float("{0:.2f}".format(projected_bills['oil'][store_year])) total += float("{0:.2f}".format(projected_bills['water'][store_year])) total_annual_charge.append(total) projected_bills['total_annual_charge'] = total_annual_charge + else: + projected_bills['err'] = True + projected_bills['msg'] = 'Only Rough Estimation available at this point' return JsonResponse({'instance': projected_bills}) def post(self, request, building_id): @@ -535,7 +525,6 @@ class BillsOverviewView(View): self.model_bills_overview.objects.create( building_id=building_id, year=int(store_year), - estimation_algorithm=self.estimation_algorithm[building_id], electricity=post[e_search], gas=post[g_search], oil=post[o_search], diff --git a/requirements-dev.txt b/requirements-dev.txt index e7ea11c..8d2fff9 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -5,4 +5,3 @@ pycodestyle==2.0.0 pydocstyle==1.0.0 pylint>=1.5.6 pylint-django>=0.7.2 -matplotlib diff --git a/requirements.txt b/requirements.txt index 4b681fa..a1b2581 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,3 @@ Django==1.10.6 psycopg2==2.7 python-decouple==3.0 -matplotlib -- GitLab From 763076e041f60d7632d36dde107861d2f6155fd0 Mon Sep 17 00:00:00 2001 From: Adarsh Murthy Date: Mon, 24 Apr 2017 18:12:45 -0400 Subject: [PATCH 3/5] Remove inflation coefficient file. --- .../financialInputs/inflation_coefficient.py | 1088 ----------------- 1 file changed, 1088 deletions(-) delete mode 100644 blocnote/apps/financialInputs/inflation_coefficient.py diff --git a/blocnote/apps/financialInputs/inflation_coefficient.py b/blocnote/apps/financialInputs/inflation_coefficient.py deleted file mode 100644 index 8019406..0000000 --- a/blocnote/apps/financialInputs/inflation_coefficient.py +++ /dev/null @@ -1,1088 +0,0 @@ -import datetime -"""Inflation coefficient dictionary. - -This file contains the inflation coefficients for a set of years. This will be used as an argument for projecting the -bills in energy overview table. -""" - -inflation_coeff_dict = { - datetime.date(1981, 1, 31): 0.3381208260704529, - datetime.date(1981, 2, 28): 0.3410451203881943, - datetime.date(1981, 3, 31): 0.34399470595272497, - datetime.date(1981, 4, 30): 0.3469698014996081, - datetime.date(1981, 5, 31): 0.3499706276561777, - datetime.date(1981, 6, 30): 0.3529974069579001, - datetime.date(1981, 7, 31): 0.3560503638648767, - datetime.date(1981, 8, 31): 0.3591297247784895, - datetime.date(1981, 9, 30): 0.36223571805819044, - datetime.date(1981, 10, 31): 0.36536857403843637, - datetime.date(1981, 11, 30): 0.3685285250457702, - datetime.date(1981, 12, 31): 0.3717158054160494, - datetime.date(1982, 1, 31): 0.3736234509294446, - datetime.date(1982, 2, 28): 0.3755408864796145, - datetime.date(1982, 3, 31): 0.3774681623090278, - datetime.date(1982, 4, 30): 0.3794053289179977, - datetime.date(1982, 5, 31): 0.3813524370660048, - datetime.date(1982, 6, 30): 0.38330953777302756, - datetime.date(1982, 7, 31): 0.3852766823208787, - datetime.date(1982, 8, 31): 0.38725392225454935, - datetime.date(1982, 9, 30): 0.38924130938355966, - datetime.date(1982, 10, 31): 0.39123889578331605, - datetime.date(1982, 11, 30): 0.393246733796476, - datetime.date(1982, 12, 31): 0.3952648760343195, - datetime.date(1983, 1, 31): 0.39630557551417817, - datetime.date(1983, 2, 28): 0.3973490150690424, - datetime.date(1983, 3, 31): 0.3983952019133013, - datetime.date(1983, 4, 30): 0.39944414328033895, - datetime.date(1983, 5, 31): 0.4004958464225842, - datetime.date(1983, 6, 30): 0.401550318611561, - datetime.date(1983, 7, 31): 0.4026075671379387, - datetime.date(1983, 8, 31): 0.4036675993115824, - datetime.date(1983, 9, 30): 0.40473042246160323, - datetime.date(1983, 10, 31): 0.4057960439364095, - datetime.date(1983, 11, 30): 0.4068644711037571, - datetime.date(1983, 12, 31): 0.4079357113508007, - datetime.date(1984, 1, 31): 0.40942066532940286, - datetime.date(1984, 2, 29): 0.41091102478797936, - datetime.date(1984, 3, 31): 0.41240680940337837, - datetime.date(1984, 4, 30): 0.41390803892407485, - datetime.date(1984, 5, 31): 0.41541473317043154, - datetime.date(1984, 6, 30): 0.41692691203496074, - datetime.date(1984, 7, 31): 0.41844459548258667, - datetime.date(1984, 8, 31): 0.4199678035509092, - datetime.date(1984, 9, 30): 0.4214965563504684, - datetime.date(1984, 10, 31): 0.4230308740650101, - datetime.date(1984, 11, 30): 0.4245707769517523, - datetime.date(1984, 12, 31): 0.4261162853416528, - datetime.date(1985, 1, 31): 0.4273691382399381, - datetime.date(1985, 2, 28): 0.4286256747345532, - datetime.date(1985, 3, 31): 0.4298859056558852, - datetime.date(1985, 4, 30): 0.4311498418661644, - datetime.date(1985, 5, 31): 0.4324174942595579, - datetime.date(1985, 6, 30): 0.43368887376226334, - datetime.date(1985, 7, 31): 0.4349639913326034, - datetime.date(1985, 8, 31): 0.4362428579611198, - datetime.date(1985, 9, 30): 0.4375254846706685, - datetime.date(1985, 10, 31): 0.4388118825165143, - datetime.date(1985, 11, 30): 0.44010206258642665, - datetime.date(1985, 12, 31): 0.4413960360007745, - datetime.date(1986, 1, 31): 0.4421111711451018, - datetime.date(1986, 2, 28): 0.44282746492755204, - datetime.date(1986, 3, 31): 0.4435449192253122, - datetime.date(1986, 4, 30): 0.44426353591861034, - datetime.date(1986, 5, 31): 0.4449833168907211, - datetime.date(1986, 6, 30): 0.4457042640279702, - datetime.date(1986, 7, 31): 0.44642637921973954, - datetime.date(1986, 8, 31): 0.44714966435847203, - datetime.date(1986, 9, 30): 0.44787412133967686, - datetime.date(1986, 10, 31): 0.448599752061934, - datetime.date(1986, 11, 30): 0.44932655842689967, - datetime.date(1986, 12, 31): 0.4500545423393109, - datetime.date(1987, 1, 31): 0.45139652997547636, - datetime.date(1987, 2, 28): 0.4527425191951082, - datetime.date(1987, 3, 31): 0.45409252193026156, - datetime.date(1987, 4, 30): 0.4554465501485706, - datetime.date(1987, 5, 31): 0.45680461585335536, - datetime.date(1987, 6, 30): 0.4581667310837274, - datetime.date(1987, 7, 31): 0.4595329079146972, - datetime.date(1987, 8, 31): 0.46090315845728086, - datetime.date(1987, 9, 30): 0.4622774948586074, - datetime.date(1987, 10, 31): 0.46365592930202665, - datetime.date(1987, 11, 30): 0.4650384740072171, - datetime.date(1987, 12, 31): 0.46642514123029427, - datetime.date(1988, 1, 31): 0.4680186438565458, - datetime.date(1988, 2, 29): 0.469617590551728, - datetime.date(1988, 3, 31): 0.47122199991504876, - datetime.date(1988, 4, 30): 0.4728318906092585, - datetime.date(1988, 5, 31): 0.47444728136086745, - datetime.date(1988, 6, 30): 0.47606819096036335, - datetime.date(1988, 7, 31): 0.4776946382624302, - datetime.date(1988, 8, 31): 0.47932664218616716, - datetime.date(1988, 9, 30): 0.4809642217153094, - datetime.date(1988, 10, 31): 0.48260739589844787, - datetime.date(1988, 11, 30): 0.4842561838492519, - datetime.date(1988, 12, 31): 0.48591060474669084, - datetime.date(1989, 1, 31): 0.48785076480634354, - datetime.date(1989, 2, 28): 0.48979867160175444, - datetime.date(1989, 3, 31): 0.49175435606434825, - datetime.date(1989, 4, 30): 0.49371784924905376, - datetime.date(1989, 5, 31): 0.495689182334797, - datetime.date(1989, 6, 30): 0.497668386624996, - datetime.date(1989, 7, 31): 0.49965549354805844, - datetime.date(1989, 8, 31): 0.5016505346578802, - datetime.date(1989, 9, 30): 0.5036535416343466, - datetime.date(1989, 10, 31): 0.5056645462838355, - datetime.date(1989, 11, 30): 0.5076835805397224, - datetime.date(1989, 12, 31): 0.5097106764628874, - datetime.date(1990, 1, 31): 0.5120123174983452, - datetime.date(1990, 2, 28): 0.5143243517857021, - datetime.date(1990, 3, 31): 0.516646826256553, - datetime.date(1990, 4, 30): 0.5189797880544167, - datetime.date(1990, 5, 31): 0.521323284535692, - datetime.date(1990, 6, 30): 0.52367736327062, - datetime.date(1990, 7, 31): 0.5260420720442486, - datetime.date(1990, 8, 31): 0.5284174588574037, - datetime.date(1990, 9, 30): 0.5308035719276625, - datetime.date(1990, 10, 31): 0.5332004596903328, - datetime.date(1990, 11, 30): 0.535608170799436, - datetime.date(1990, 12, 31): 0.538026754128695, - datetime.date(1991, 1, 31): 0.539917200800452, - datetime.date(1991, 2, 28): 0.5418142898716645, - datetime.date(1991, 3, 31): 0.5437180446815102, - datetime.date(1991, 4, 30): 0.5456284886511727, - datetime.date(1991, 5, 31): 0.5475456452841301, - datetime.date(1991, 6, 30): 0.5494695381664434, - datetime.date(1991, 7, 31): 0.5514001909670476, - datetime.date(1991, 8, 31): 0.553337627438042, - datetime.date(1991, 9, 30): 0.5552818714149835, - datetime.date(1991, 10, 31): 0.5572329468171786, - datetime.date(1991, 11, 30): 0.5591908776479786, - datetime.date(1991, 12, 31): 0.5611556879950743, - datetime.date(1992, 1, 31): 0.5625777967973759, - datetime.date(1992, 2, 29): 0.5640035095789097, - datetime.date(1992, 3, 31): 0.56543283547306, - datetime.date(1992, 4, 30): 0.5668657836363576, - datetime.date(1992, 5, 31): 0.5683023632485381, - datetime.date(1992, 6, 30): 0.5697425835126008, - datetime.date(1992, 7, 31): 0.5711864536548676, - datetime.date(1992, 8, 31): 0.5726339829250425, - datetime.date(1992, 9, 30): 0.5740851805962703, - datetime.date(1992, 10, 31): 0.5755400559651965, - datetime.date(1992, 11, 30): 0.5769986183520263, - datetime.date(1992, 12, 31): 0.5784608771005849, - datetime.date(1993, 1, 31): 0.5798925195663358, - datetime.date(1993, 2, 28): 0.5813277052278858, - datetime.date(1993, 3, 31): 0.5827664428543494, - datetime.date(1993, 4, 30): 0.5842087412365436, - datetime.date(1993, 5, 31): 0.5856546091870424, - datetime.date(1993, 6, 30): 0.5871040555402295, - datetime.date(1993, 7, 31): 0.5885570891523536, - datetime.date(1993, 8, 31): 0.5900137189015816, - datetime.date(1993, 9, 30): 0.5914739536880531, - datetime.date(1993, 10, 31): 0.5929378024339349, - datetime.date(1993, 11, 30): 0.5944052740834753, - datetime.date(1993, 12, 31): 0.5958763776030591, - datetime.date(1994, 1, 31): 0.5971652582078144, - datetime.date(1994, 2, 28): 0.5984569266613179, - datetime.date(1994, 3, 31): 0.5997513889936863, - datetime.date(1994, 4, 30): 0.6010486512480796, - datetime.date(1994, 5, 31): 0.6023487194807291, - datetime.date(1994, 6, 30): 0.6036515997609659, - datetime.date(1994, 7, 31): 0.6049572981712489, - datetime.date(1994, 8, 31): 0.6062658208071933, - datetime.date(1994, 9, 30): 0.6075771737775991, - datetime.date(1994, 10, 31): 0.60889136320448, - datetime.date(1994, 11, 30): 0.6102083952230912, - datetime.date(1994, 12, 31): 0.6115282759819588, - datetime.date(1995, 1, 31): 0.6129578252484459, - datetime.date(1995, 2, 28): 0.6143907163246016, - datetime.date(1995, 3, 31): 0.615826957022463, - datetime.date(1995, 4, 30): 0.6172665551723291, - datetime.date(1995, 5, 31): 0.6187095186228035, - datetime.date(1995, 6, 30): 0.6201558552408374, - datetime.date(1995, 7, 31): 0.621605572911772, - datetime.date(1995, 8, 31): 0.6230586795393821, - datetime.date(1995, 9, 30): 0.6245151830459186, - datetime.date(1995, 10, 31): 0.6259750913721521, - datetime.date(1995, 11, 30): 0.6274384124774164, - datetime.date(1995, 12, 31): 0.628905154339651, - datetime.date(1996, 1, 31): 0.6304442424786086, - datetime.date(1996, 2, 29): 0.6319870971510144, - datetime.date(1996, 3, 31): 0.6335337275745171, - datetime.date(1996, 4, 30): 0.6350841429893238, - datetime.date(1996, 5, 31): 0.6366383526582543, - datetime.date(1996, 6, 30): 0.6381963658667972, - datetime.date(1996, 7, 31): 0.6397581919231646, - datetime.date(1996, 8, 31): 0.6413238401583485, - datetime.date(1996, 9, 30): 0.6428933199261759, - datetime.date(1996, 10, 31): 0.6444666406033652, - datetime.date(1996, 11, 30): 0.6460438115895818, - datetime.date(1996, 12, 31): 0.6476248423074943, - datetime.date(1997, 1, 31): 0.6488865234377831, - datetime.date(1997, 2, 28): 0.6501506625331938, - datetime.date(1997, 3, 31): 0.6514172643822522, - datetime.date(1997, 4, 30): 0.652686333782813, - datetime.date(1997, 5, 31): 0.6539578755420776, - datetime.date(1997, 6, 30): 0.6552318944766129, - datetime.date(1997, 7, 31): 0.6565083954123692, - datetime.date(1997, 8, 31): 0.6577873831846984, - datetime.date(1997, 9, 30): 0.6590688626383728, - datetime.date(1997, 10, 31): 0.6603528386276029, - datetime.date(1997, 11, 30): 0.6616393160160559, - datetime.date(1997, 12, 31): 0.6629282996768745, - datetime.date(1998, 1, 31): 0.6637828142551581, - datetime.date(1998, 2, 28): 0.6646384303027331, - datetime.date(1998, 3, 31): 0.6654951492393933, - datetime.date(1998, 4, 30): 0.666352972486763, - datetime.date(1998, 5, 31): 0.6672119014682985, - datetime.date(1998, 6, 30): 0.6680719376092912, - datetime.date(1998, 7, 31): 0.6689330823368695, - datetime.date(1998, 8, 31): 0.6697953370800018, - datetime.date(1998, 9, 30): 0.6706587032694981, - datetime.date(1998, 10, 31): 0.6715231823380126, - datetime.date(1998, 11, 30): 0.6723887757200463, - datetime.date(1998, 12, 31): 0.6732554848519495, - datetime.date(1999, 1, 31): 0.6744859153551402, - datetime.date(1999, 2, 28): 0.6757185945726114, - datetime.date(1999, 3, 31): 0.6769535266140758, - datetime.date(1999, 4, 30): 0.678190715596757, - datetime.date(1999, 5, 31): 0.679430165645403, - datetime.date(1999, 6, 30): 0.6806718808923006, - datetime.date(1999, 7, 31): 0.6819158654772881, - datetime.date(1999, 8, 31): 0.6831621235477702, - datetime.date(1999, 9, 30): 0.6844106592587308, - datetime.date(1999, 10, 31): 0.6856614767727477, - datetime.date(1999, 11, 30): 0.6869145802600064, - datetime.date(1999, 12, 31): 0.6881699738983132, - datetime.date(2000, 1, 31): 0.6901009214975742, - datetime.date(2000, 2, 29): 0.6920372871748862, - datetime.date(2000, 3, 31): 0.693979086132925, - datetime.date(2000, 4, 30): 0.6959263336170236, - datetime.date(2000, 5, 31): 0.6978790449152918, - datetime.date(2000, 6, 30): 0.6998372353587372, - datetime.date(2000, 7, 31): 0.7018009203213842, - datetime.date(2000, 8, 31): 0.703770115220396, - datetime.date(2000, 9, 30): 0.7057448355161948, - datetime.date(2000, 10, 31): 0.7077250967125838, - datetime.date(2000, 11, 30): 0.709710914356868, - datetime.date(2000, 12, 31): 0.7117023040399773, - datetime.date(2001, 1, 31): 0.7133727879646097, - datetime.date(2001, 2, 28): 0.7150471927934272, - datetime.date(2001, 3, 31): 0.7167255277294455, - datetime.date(2001, 4, 30): 0.718407801997281, - datetime.date(2001, 5, 31): 0.7200940248432023, - datetime.date(2001, 6, 30): 0.72178420553518, - datetime.date(2001, 7, 31): 0.7234783533629385, - datetime.date(2001, 8, 31): 0.7251764776380069, - datetime.date(2001, 9, 30): 0.7268785876937695, - datetime.date(2001, 10, 31): 0.728584692885518, - datetime.date(2001, 11, 30): 0.7302948025905023, - datetime.date(2001, 12, 31): 0.7320089262079826, - datetime.date(2002, 1, 31): 0.7329823150776077, - datetime.date(2002, 2, 28): 0.7339569983110821, - datetime.date(2002, 3, 31): 0.7349329776295863, - datetime.date(2002, 4, 30): 0.7359102547565893, - datetime.date(2002, 5, 31): 0.736888831417852, - datetime.date(2002, 6, 30): 0.7378687093414299, - datetime.date(2002, 7, 31): 0.7388498902576767, - datetime.date(2002, 8, 31): 0.7398323758992469, - datetime.date(2002, 9, 30): 0.740816168001099, - datetime.date(2002, 10, 31): 0.7418012683004983, - datetime.date(2002, 11, 30): 0.7427876785370209, - datetime.date(2002, 12, 31): 0.7437754004525554, - datetime.date(2003, 1, 31): 0.7451996063818555, - datetime.date(2003, 2, 28): 0.7466265394281423, - datetime.date(2003, 3, 31): 0.7480562048133906, - datetime.date(2003, 4, 30): 0.7494886077695742, - datetime.date(2003, 5, 31): 0.7509237535386851, - datetime.date(2003, 6, 30): 0.7523616473727528, - datetime.date(2003, 7, 31): 0.7538022945338638, - datetime.date(2003, 8, 31): 0.7552457002941805, - datetime.date(2003, 9, 30): 0.7566918699359605, - datetime.date(2003, 10, 31): 0.7581408087515762, - datetime.date(2003, 11, 30): 0.759592522043534, - datetime.date(2003, 12, 31): 0.7610470151244938, - datetime.date(2004, 1, 31): 0.7627386957979464, - datetime.date(2004, 2, 29): 0.7644341367955894, - datetime.date(2004, 3, 31): 0.7661333464759965, - datetime.date(2004, 4, 30): 0.7678363332163217, - datetime.date(2004, 5, 31): 0.7695431054123394, - datetime.date(2004, 6, 30): 0.7712536714784868, - datetime.date(2004, 7, 31): 0.7729680398479051, - datetime.date(2004, 8, 31): 0.7746862189724804, - datetime.date(2004, 9, 30): 0.7764082173228865, - datetime.date(2004, 10, 31): 0.7781340433886258, - datetime.date(2004, 11, 30): 0.7798637056780716, - datetime.date(2004, 12, 31): 0.7815972127185097, - datetime.date(2005, 1, 31): 0.7837897231663872, - datetime.date(2005, 2, 28): 0.7859883839714893, - datetime.date(2005, 3, 31): 0.7881932123865933, - datetime.date(2005, 4, 30): 0.7904042257128732, - datetime.date(2005, 5, 31): 0.7926214413000353, - datetime.date(2005, 6, 30): 0.7948448765464555, - datetime.date(2005, 7, 31): 0.7970745488993143, - datetime.date(2005, 8, 31): 0.799310475854735, - datetime.date(2005, 9, 30): 0.8015526749579203, - datetime.date(2005, 10, 31): 0.8038011638032896, - datetime.date(2005, 11, 30): 0.8060559600346184, - datetime.date(2005, 12, 31): 0.8083170813451755, - datetime.date(2006, 1, 31): 0.8104872106293172, - datetime.date(2006, 2, 28): 0.8126631661680542, - datetime.date(2006, 3, 31): 0.814844963603424, - datetime.date(2006, 4, 30): 0.8170326186194583, - datetime.date(2006, 5, 31): 0.8192261469422968, - datetime.date(2006, 6, 30): 0.8214255643403001, - datetime.date(2006, 7, 31): 0.8236308866241628, - datetime.date(2006, 8, 31): 0.8258421296470271, - datetime.date(2006, 9, 30): 0.8280593093045969, - datetime.date(2006, 10, 31): 0.8302824415352524, - datetime.date(2006, 11, 30): 0.8325115423201642, - datetime.date(2006, 12, 31): 0.8347466276834082, - datetime.date(2007, 1, 31): 0.8367434807412649, - datetime.date(2007, 2, 28): 0.8387451106044448, - datetime.date(2007, 3, 31): 0.8407515286998624, - datetime.date(2007, 4, 30): 0.8427627464817672, - datetime.date(2007, 5, 31): 0.8447787754318093, - datetime.date(2007, 6, 30): 0.8467996270591048, - datetime.date(2007, 7, 31): 0.8488253129003013, - datetime.date(2007, 8, 31): 0.8508558445196442, - datetime.date(2007, 9, 30): 0.8528912335090427, - datetime.date(2007, 10, 31): 0.8549314914881352, - datetime.date(2007, 11, 30): 0.8569766301043567, - datetime.date(2007, 12, 31): 0.8590266610330046, - datetime.date(2008, 1, 31): 0.8617575783739837, - datetime.date(2008, 2, 29): 0.8644971775287661, - datetime.date(2008, 3, 31): 0.8672454860975616, - datetime.date(2008, 4, 30): 0.870002531768323, - datetime.date(2008, 5, 31): 0.8727683423170256, - datetime.date(2008, 6, 30): 0.8755429456079467, - datetime.date(2008, 7, 31): 0.8783263695939465, - datetime.date(2008, 8, 31): 0.8811186423167497, - datetime.date(2008, 9, 30): 0.8839197919072282, - datetime.date(2008, 10, 31): 0.886729846585684, - datetime.date(2008, 11, 30): 0.8895488346621339, - datetime.date(2008, 12, 31): 0.8923767845365945, - datetime.date(2009, 1, 31): 0.8921387430293194, - datetime.date(2009, 2, 28): 0.8919007650196163, - datetime.date(2009, 3, 31): 0.8916628504905473, - datetime.date(2009, 4, 30): 0.8914249994251789, - datetime.date(2009, 5, 31): 0.8911872118065823, - datetime.date(2009, 6, 30): 0.8909494876178329, - datetime.date(2009, 7, 31): 0.8907118268420108, - datetime.date(2009, 8, 31): 0.8904742294622007, - datetime.date(2009, 9, 30): 0.8902366954614916, - datetime.date(2009, 10, 31): 0.8899992248229773, - datetime.date(2009, 11, 30): 0.8897618175297558, - datetime.date(2009, 12, 31): 0.8895244735649297, - datetime.date(2010, 1, 31): 0.890737414311675, - datetime.date(2010, 2, 28): 0.8919520090042069, - datetime.date(2010, 3, 31): 0.8931682598978183, - datetime.date(2010, 4, 30): 0.8943861692508774, - datetime.date(2010, 5, 31): 0.8956057393248318, - datetime.date(2010, 6, 30): 0.8968269723842128, - datetime.date(2010, 7, 31): 0.8980498706966398, - datetime.date(2010, 8, 31): 0.8992744365328239, - datetime.date(2010, 9, 30): 0.9005006721665729, - datetime.date(2010, 10, 31): 0.9017285798747947, - datetime.date(2010, 11, 30): 0.9029581619375023, - datetime.date(2010, 12, 31): 0.9041894206378177, - datetime.date(2011, 1, 31): 0.9065575680795865, - datetime.date(2011, 2, 28): 0.9089319178968509, - datetime.date(2011, 3, 31): 0.9113124863341492, - datetime.date(2011, 4, 30): 0.9136992896785655, - datetime.date(2011, 5, 31): 0.9160923442598411, - datetime.date(2011, 6, 30): 0.9184916664504862, - datetime.date(2011, 7, 31): 0.9208972726658923, - datetime.date(2011, 8, 31): 0.9233091793644436, - datetime.date(2011, 9, 30): 0.9257274030476306, - datetime.date(2011, 10, 31): 0.9281519602601626, - datetime.date(2011, 11, 30): 0.9305828675900806, - datetime.date(2011, 12, 31): 0.9330201416688713, - datetime.date(2012, 1, 31): 0.9346344220173154, - datetime.date(2012, 2, 29): 0.9362514953398091, - datetime.date(2012, 3, 31): 0.9378713664686629, - datetime.date(2012, 4, 30): 0.939494040244548, - datetime.date(2012, 5, 31): 0.9411195215165111, - datetime.date(2012, 6, 30): 0.9427478151419884, - datetime.date(2012, 7, 31): 0.9443789259868198, - datetime.date(2012, 8, 31): 0.9460128589252648, - datetime.date(2012, 9, 30): 0.9476496188400153, - datetime.date(2012, 10, 31): 0.9492892106222117, - datetime.date(2012, 11, 30): 0.9509316391714567, - datetime.date(2012, 12, 31): 0.9525769093958298, - datetime.date(2013, 1, 31): 0.9537392913695202, - datetime.date(2013, 2, 28): 0.9549030917398139, - datetime.date(2013, 3, 31): 0.9560683122375094, - datetime.date(2013, 4, 30): 0.9572349545955173, - datetime.date(2013, 5, 31): 0.9584030205488626, - datetime.date(2013, 6, 30): 0.9595725118346874, - datetime.date(2013, 7, 31): 0.9607434301922536, - datetime.date(2013, 8, 31): 0.9619157773629458, - datetime.date(2013, 9, 30): 0.9630895550902728, - datetime.date(2013, 10, 31): 0.9642647651198718, - datetime.date(2013, 11, 30): 0.9654414091995093, - datetime.date(2013, 12, 31): 0.9666194890790851, - datetime.date(2014, 1, 31): 0.9679161285720607, - datetime.date(2014, 2, 28): 0.9692145073988628, - datetime.date(2014, 3, 31): 0.9705146278926629, - datetime.date(2014, 4, 30): 0.971816492389762, - datetime.date(2014, 5, 31): 0.9731201032295953, - datetime.date(2014, 6, 30): 0.9744254627547358, - datetime.date(2014, 7, 31): 0.9757325733108996, - datetime.date(2014, 8, 31): 0.9770414372469484, - datetime.date(2014, 9, 30): 0.9783520569148956, - datetime.date(2014, 10, 31): 0.979664434669909, - datetime.date(2014, 11, 30): 0.9809785728703159, - datetime.date(2014, 12, 31): 0.982294473877607, - datetime.date(2015, 1, 31): 0.9823795242074701, - datetime.date(2015, 2, 28): 0.9824645819012744, - datetime.date(2015, 3, 31): 0.9825496469596572, - datetime.date(2015, 4, 30): 0.9826347193832563, - datetime.date(2015, 5, 31): 0.9827197991727095, - datetime.date(2015, 6, 30): 0.9828048863286544, - datetime.date(2015, 7, 31): 0.9828899808517289, - datetime.date(2015, 8, 31): 0.9829750827425707, - datetime.date(2015, 9, 30): 0.9830601920018182, - datetime.date(2015, 10, 31): 0.9831453086301088, - datetime.date(2015, 11, 30): 0.983230432628081, - datetime.date(2015, 12, 31): 0.9833155639963727, - datetime.date(2016, 1, 31): 0.9845331544934913, - datetime.date(2016, 2, 29): 0.985752252672043, - datetime.date(2016, 3, 31): 0.9869728603989143, - datetime.date(2016, 4, 30): 0.9881949795433034, - datetime.date(2016, 5, 31): 0.9894186119767231, - datetime.date(2016, 6, 30): 0.9906437595730033, - datetime.date(2016, 7, 31): 0.9918704242082947, - datetime.date(2016, 8, 31): 0.9930986077610708, - datetime.date(2016, 9, 30): 0.994328312112131, - datetime.date(2016, 10, 31): 0.9955595391446039, - datetime.date(2016, 11, 30): 0.9967922907439498, - datetime.date(2016, 12, 31): 0.9980265687979636, - datetime.date(2017, 1, 31): 1.0, - datetime.date(2017, 2, 28): 1.0019773333333333, - datetime.date(2017, 3, 31): 1.0039585765137777, - datetime.date(2017, 4, 30): 1.0059437372724043, - datetime.date(2017, 5, 31): 1.0079328233555709, - datetime.date(2017, 6, 30): 1.0099258425249524, - datetime.date(2017, 7, 31): 1.0119228025575717, - datetime.date(2017, 8, 31): 1.0139237112458288, - datetime.date(2017, 9, 30): 1.0159285763975323, - datetime.date(2017, 10, 31): 1.017937405835929, - datetime.date(2017, 11, 30): 1.0199502073997353, - datetime.date(2017, 12, 31): 1.0219669889431668, - datetime.date(2018, 1, 31): 1.0241308337144226, - datetime.date(2018, 2, 28): 1.0262992600663405, - datetime.date(2018, 3, 31): 1.0284722776996542, - datetime.date(2018, 4, 30): 1.030649896335637, - datetime.date(2018, 5, 31): 1.032832125716145, - datetime.date(2018, 6, 30): 1.0350189756036612, - datetime.date(2018, 7, 31): 1.0372104557813393, - datetime.date(2018, 8, 31): 1.039406576053047, - datetime.date(2018, 9, 30): 1.0416073462434101, - datetime.date(2018, 10, 31): 1.043812776197856, - datetime.date(2018, 11, 30): 1.046022875782659, - datetime.date(2018, 12, 31): 1.0482376548849828, - datetime.date(2019, 1, 31): 1.0502734197639072, - datetime.date(2019, 2, 28): 1.0523131382678736, - datetime.date(2019, 3, 31): 1.0543568180751512, - datetime.date(2019, 4, 30): 1.0564044668789212, - datetime.date(2019, 5, 31): 1.0584560923873054, - datetime.date(2019, 6, 30): 1.0605117023233959, - datetime.date(2019, 7, 31): 1.0625713044252831, - datetime.date(2019, 8, 31): 1.0646349064460856, - datetime.date(2019, 9, 30): 1.0667025161539792, - datetime.date(2019, 10, 31): 1.0687741413322265, - datetime.date(2019, 11, 30): 1.0708497897792053, - datetime.date(2019, 12, 31): 1.072929469308439, - datetime.date(2020, 1, 31): 1.0749909244621372, - datetime.date(2020, 2, 29): 1.077056340358337, - datetime.date(2020, 3, 31): 1.0791257246069457, - datetime.date(2020, 4, 30): 1.0811990848324906, - datetime.date(2020, 5, 31): 1.083276428674149, - datetime.date(2020, 6, 30): 1.085357763785775, - datetime.date(2020, 7, 31): 1.0874430978359289, - datetime.date(2020, 8, 31): 1.0895324385079046, - datetime.date(2020, 9, 30): 1.091625793499758, - datetime.date(2020, 10, 31): 1.0937231705243355, - datetime.date(2020, 11, 30): 1.0958245773093032, - datetime.date(2020, 12, 31): 1.0979300215971735, - datetime.date(2021, 1, 31): 1.0997079911753143, - datetime.date(2021, 2, 28): 1.101488839967757, - datetime.date(2021, 3, 31): 1.1032725726370534, - datetime.date(2021, 4, 30): 1.1050591938533056, - datetime.date(2021, 5, 31): 1.1068487082941783, - datetime.date(2021, 6, 30): 1.1086411206449114, - datetime.date(2021, 7, 31): 1.1104364355983318, - datetime.date(2021, 8, 31): 1.1122346578548659, - datetime.date(2021, 9, 30): 1.1140357921225517, - datetime.date(2021, 10, 31): 1.1158398431170518, - datetime.date(2021, 11, 30): 1.1176468155616648, - datetime.date(2021, 12, 31): 1.1194567141873384, - datetime.date(2022, 1, 31): 1.1211576316449643, - datetime.date(2022, 2, 28): 1.122861133499254, - datetime.date(2022, 3, 31): 1.1245672236769746, - datetime.date(2022, 4, 30): 1.1262759061108591, - datetime.date(2022, 5, 31): 1.1279871847396161, - datetime.date(2022, 6, 30): 1.1297010635079388, - datetime.date(2022, 7, 31): 1.1314175463665137, - datetime.date(2022, 8, 31): 1.1331366372720302, - datetime.date(2022, 9, 30): 1.13485834018719, - datetime.date(2022, 10, 31): 1.1365826590807149, - datetime.date(2022, 11, 30): 1.1383095979273576, - datetime.date(2022, 12, 31): 1.14003916070791, - datetime.date(2023, 1, 31): 1.1417473247038867, - datetime.date(2023, 2, 28): 1.1434580481068888, - datetime.date(2023, 3, 31): 1.1451713347517734, - datetime.date(2023, 4, 30): 1.1468871884791425, - datetime.date(2023, 5, 31): 1.148605613135354, - datetime.date(2023, 6, 30): 1.1503266125725278, - datetime.date(2023, 7, 31): 1.1520501906485565, - datetime.date(2023, 8, 31): 1.1537763512271126, - datetime.date(2023, 9, 30): 1.1555050981776576, - datetime.date(2023, 10, 31): 1.157236435375451, - datetime.date(2023, 11, 30): 1.1589703667015585, - datetime.date(2023, 12, 31): 1.1607068960428615, - datetime.date(2024, 1, 31): 1.1624783051579952, - datetime.date(2024, 2, 29): 1.1642524177034816, - datetime.date(2024, 3, 31): 1.1660292378051522, - datetime.date(2024, 4, 30): 1.1678087695951351, - datetime.date(2024, 5, 31): 1.1695910172118646, - datetime.date(2024, 6, 30): 1.1713759848000913, - datetime.date(2024, 7, 31): 1.173163676510891, - datetime.date(2024, 8, 31): 1.1749540965016745, - datetime.date(2024, 9, 30): 1.1767472489361974, - datetime.date(2024, 10, 31): 1.1785431379845703, - datetime.date(2024, 11, 30): 1.1803417678232675, - datetime.date(2024, 12, 31): 1.1821431426351374, - datetime.date(2025, 1, 31): 1.1839691043554477, - datetime.date(2025, 2, 28): 1.1857978864924097, - datetime.date(2025, 3, 31): 1.1876294934024947, - datetime.date(2025, 4, 30): 1.1894639294489031, - datetime.date(2025, 5, 31): 1.1913011990015752, - datetime.date(2025, 6, 30): 1.1931413064372007, - datetime.date(2025, 7, 31): 1.19498425613923, - datetime.date(2025, 8, 31): 1.196830052497884, - datetime.date(2025, 9, 30): 1.198678699910165, - datetime.date(2025, 10, 31): 1.2005302027798668, - datetime.date(2025, 11, 30): 1.2023845655175858, - datetime.date(2025, 12, 31): 1.2042417925407303, - datetime.date(2026, 1, 31): 1.206277471119959, - datetime.date(2026, 2, 28): 1.2083165908580182, - datetime.date(2026, 3, 31): 1.2103591575719228, - datetime.date(2026, 4, 30): 1.212405177088522, - datetime.date(2026, 5, 31): 1.2144546552445143, - datetime.date(2026, 6, 30): 1.2165075978864652, - datetime.date(2026, 7, 31): 1.2185640108708227, - datetime.date(2026, 8, 31): 1.2206239000639352, - datetime.date(2026, 9, 30): 1.2226872713420676, - datetime.date(2026, 10, 31): 1.2247541305914178, - datetime.date(2026, 11, 30): 1.2268244837081344, - datetime.date(2026, 12, 31): 1.2288983365983328, - datetime.date(2027, 1, 31): 1.2310312626995608, - datetime.date(2027, 2, 28): 1.2331678907943693, - datetime.date(2027, 3, 31): 1.2353082273080898, - datetime.date(2027, 4, 30): 1.237452278677205, - datetime.date(2027, 5, 31): 1.2396000513493697, - datetime.date(2027, 6, 30): 1.2417515517834297, - datetime.date(2027, 7, 31): 1.24390678644944, - datetime.date(2027, 8, 31): 1.2460657618286863, - datetime.date(2027, 9, 30): 1.2482284844137033, - datetime.date(2027, 10, 31): 1.250394960708294, - datetime.date(2027, 11, 30): 1.25256519722755, - datetime.date(2027, 12, 31): 1.2547392004978706, - datetime.date(2028, 1, 31): 1.2568866509483156, - datetime.date(2028, 2, 29): 1.259037776699122, - datetime.date(2028, 3, 31): 1.261192584040462, - datetime.date(2028, 4, 30): 1.263351079273273, - datetime.date(2028, 5, 31): 1.2655132687092763, - datetime.date(2028, 6, 30): 1.2676791586709955, - datetime.date(2028, 7, 31): 1.2698487554917752, - datetime.date(2028, 8, 31): 1.2720220655157992, - datetime.date(2028, 9, 30): 1.2741990950981095, - datetime.date(2028, 10, 31): 1.2763798506046236, - datetime.date(2028, 11, 30): 1.2785643384121554, - datetime.date(2028, 12, 31): 1.280752564908432, - datetime.date(2029, 1, 31): 1.2828925556407371, - datetime.date(2029, 2, 28): 1.2850361220522637, - datetime.date(2029, 3, 31): 1.2871832701175623, - datetime.date(2029, 4, 30): 1.2893340058211653, - datetime.date(2029, 5, 31): 1.2914883351576054, - datetime.date(2029, 6, 30): 1.293646264131431, - datetime.date(2029, 7, 31): 1.2958077987572236, - datetime.date(2029, 8, 31): 1.2979729450596147, - datetime.date(2029, 9, 30): 1.3001417090733012, - datetime.date(2029, 10, 31): 1.3023140968430647, - datetime.date(2029, 11, 30): 1.3044901144237857, - datetime.date(2029, 12, 31): 1.3066697678804629, - datetime.date(2030, 1, 31): 1.3088176266711669, - datetime.date(2030, 2, 28): 1.3109690160382248, - datetime.date(2030, 3, 31): 1.3131239417850764, - datetime.date(2030, 4, 30): 1.3152824097247013, - datetime.date(2030, 5, 31): 1.3174444256796338, - datetime.date(2030, 6, 30): 1.3196099954819795, - datetime.date(2030, 7, 31): 1.3217791249734305, - datetime.date(2030, 8, 31): 1.323951820005281, - datetime.date(2030, 9, 30): 1.3261280864384442, - datetime.date(2030, 10, 31): 1.3283079301434657, - datetime.date(2030, 11, 30): 1.3304913570005426, - datetime.date(2030, 12, 31): 1.3326783728995366, - datetime.date(2031, 1, 31): 1.3348319928859904, - datetime.date(2031, 2, 28): 1.3369890931413078, - datetime.date(2031, 3, 31): 1.3391496792896336, - datetime.date(2031, 4, 30): 1.3413137569642015, - datetime.date(2031, 5, 31): 1.3434813318073493, - datetime.date(2031, 6, 30): 1.3456524094705313, - datetime.date(2031, 7, 31): 1.3478269956143363, - datetime.date(2031, 8, 31): 1.3500050959084995, - datetime.date(2031, 9, 30): 1.3521867160319188, - datetime.date(2031, 10, 31): 1.3543718616726692, - datetime.date(2031, 11, 30): 1.356560538528018, - datetime.date(2031, 12, 31): 1.3587527523044391, - datetime.date(2032, 1, 31): 1.3609480502028264, - datetime.date(2032, 2, 29): 1.3631468949811405, - datetime.date(2032, 3, 31): 1.3653492923699735, - datetime.date(2032, 4, 30): 1.367555248109177, - datetime.date(2032, 5, 31): 1.3697647679478755, - datetime.date(2032, 6, 30): 1.371977857644482, - datetime.date(2032, 7, 31): 1.3741945229667143, - datetime.date(2032, 8, 31): 1.3764147696916078, - datetime.date(2032, 9, 30): 1.3786386036055325, - datetime.date(2032, 10, 31): 1.380866030504207, - datetime.date(2032, 11, 30): 1.3830970561927136, - datetime.date(2032, 12, 31): 1.385331686485514, - datetime.date(2033, 1, 31): 1.3875832621350055, - datetime.date(2033, 2, 28): 1.3898384972639959, - datetime.date(2033, 3, 31): 1.3920973978202262, - datetime.date(2033, 4, 30): 1.394359969761105, - datetime.date(2033, 5, 31): 1.3966262190537237, - datetime.date(2033, 6, 30): 1.3988961516748712, - datetime.date(2033, 7, 31): 1.4011697736110513, - datetime.date(2033, 8, 31): 1.403447090858497, - datetime.date(2033, 9, 30): 1.4057281094231873, - datetime.date(2033, 10, 31): 1.4080128353208623, - datetime.date(2033, 11, 30): 1.41030127457704, - datetime.date(2033, 12, 31): 1.4125934332270311, - datetime.date(2034, 1, 31): 1.4149072514828935, - datetime.date(2034, 2, 28): 1.4172248597570265, - datetime.date(2034, 3, 31): 1.4195462642574541, - datetime.date(2034, 4, 30): 1.4218714712023686, - datetime.date(2034, 5, 31): 1.4242004868201474, - datetime.date(2034, 6, 30): 1.4265333173493708, - datetime.date(2034, 7, 31): 1.428869969038837, - datetime.date(2034, 8, 31): 1.43121044814758, - datetime.date(2034, 9, 30): 1.4335547609448862, - datetime.date(2034, 10, 31): 1.4359029137103108, - datetime.date(2034, 11, 30): 1.4382549127336948, - datetime.date(2034, 12, 31): 1.4406107643151824, - datetime.date(2035, 1, 31): 1.4429865874594414, - datetime.date(2035, 2, 28): 1.445366328758245, - datetime.date(2035, 3, 31): 1.4477499946733259, - datetime.date(2035, 4, 30): 1.4501375916770738, - datetime.date(2035, 5, 31): 1.4525291262525526, - datetime.date(2035, 6, 30): 1.4549246048935176, - datetime.date(2035, 7, 31): 1.457324034104434, - datetime.date(2035, 8, 31): 1.4597274204004933, - datetime.date(2035, 9, 30): 1.462134770307632, - datetime.date(2035, 10, 31): 1.4645460903625491, - datetime.date(2035, 11, 30): 1.4669613871127245, - datetime.date(2035, 12, 31): 1.4693806671164344, - datetime.date(2036, 1, 31): 1.4718193004762303, - datetime.date(2036, 2, 29): 1.4742619810736115, - datetime.date(2036, 3, 31): 1.4767087156255096, - datetime.date(2036, 4, 30): 1.479159510860003, - datetime.date(2036, 5, 31): 1.4816143735163363, - datetime.date(2036, 6, 30): 1.4840733103449395, - datetime.date(2036, 7, 31): 1.4865363281074446, - datetime.date(2036, 8, 31): 1.4890034335767068, - datetime.date(2036, 9, 30): 1.4914746335368212, - datetime.date(2036, 10, 31): 1.4939499347831413, - datetime.date(2036, 11, 30): 1.4964293441222993, - datetime.date(2036, 12, 31): 1.4989128683722237, - datetime.date(2037, 1, 31): 1.5013958992132328, - datetime.date(2037, 2, 28): 1.503883043330128, - datetime.date(2037, 3, 31): 1.5063743075367757, - datetime.date(2037, 4, 30): 1.5088696986583285, - datetime.date(2037, 5, 31): 1.5113692235312461, - datetime.date(2037, 6, 30): 1.5138728890033128, - datetime.date(2037, 7, 31): 1.5163807019336568, - datetime.date(2037, 8, 31): 1.5188926691927684, - datetime.date(2037, 9, 30): 1.52140879766252, - datetime.date(2037, 10, 31): 1.5239290942361834, - datetime.date(2037, 11, 30): 1.52645356581845, - datetime.date(2037, 12, 31): 1.528982219325449, - datetime.date(2038, 1, 31): 1.531502969527323, - datetime.date(2038, 2, 28): 1.534027875553575, - datetime.date(2038, 3, 31): 1.5365569442556875, - datetime.date(2038, 4, 30): 1.5390901824964387, - datetime.date(2038, 5, 31): 1.5416275971499214, - datetime.date(2038, 6, 30): 1.5441691951015606, - datetime.date(2038, 7, 31): 1.546714983248134, - datetime.date(2038, 8, 31): 1.549264968497789, - datetime.date(2038, 9, 30): 1.5518191577700624, - datetime.date(2038, 10, 31): 1.5543775579958983, - datetime.date(2038, 11, 30): 1.5569401761176678, - datetime.date(2038, 12, 31): 1.559507019089188, - datetime.date(2039, 1, 31): 1.5620682961641141, - datetime.date(2039, 2, 28): 1.5646337797864776, - datetime.date(2039, 3, 31): 1.5672034768649572, - datetime.date(2039, 4, 30): 1.5697773943195792, - datetime.date(2039, 5, 31): 1.5723555390817336, - datetime.date(2039, 6, 30): 1.5749379180941956, - datetime.date(2039, 7, 31): 1.5775245383111425, - datetime.date(2039, 8, 31): 1.5801154066981726, - datetime.date(2039, 9, 30): 1.5827105302323248, - datetime.date(2039, 10, 31): 1.5853099159020962, - datetime.date(2039, 11, 30): 1.5879135707074619, - datetime.date(2039, 12, 31): 1.5905215016598937, - datetime.date(2040, 1, 31): 1.5931291792827287, - datetime.date(2040, 2, 29): 1.595741132221916, - datetime.date(2040, 3, 31): 1.5983573674868838, - datetime.date(2040, 4, 30): 1.6009778920985531, - datetime.date(2040, 5, 31): 1.6036027130893553, - datetime.date(2040, 6, 30): 1.6062318375032512, - datetime.date(2040, 7, 31): 1.608865272395751, - datetime.date(2040, 8, 31): 1.611503024833932, - datetime.date(2040, 9, 30): 1.6141451018964579, - datetime.date(2040, 10, 31): 1.6167915106735988, - datetime.date(2040, 11, 30): 1.6194422582672487, - datetime.date(2040, 12, 31): 1.622097351790945, - datetime.date(2041, 1, 31): 1.6247561082481263, - datetime.date(2041, 2, 28): 1.627419222634806, - datetime.date(2041, 3, 31): 1.6300867020940037, - datetime.date(2041, 4, 30): 1.6327585537804472, - datetime.date(2041, 5, 31): 1.635434784860591, - datetime.date(2041, 6, 30): 1.6381154025126365, - datetime.date(2041, 7, 31): 1.6408004139265508, - datetime.date(2041, 8, 31): 1.6434898263040858, - datetime.date(2041, 9, 30): 1.6461836468587976, - datetime.date(2041, 10, 31): 1.6488818828160658, - datetime.date(2041, 11, 30): 1.6515845414131136, - datetime.date(2041, 12, 31): 1.6542916298990267, - datetime.date(2042, 1, 31): 1.65700697311415, - datetime.date(2042, 2, 28): 1.6597267732754626, - datetime.date(2042, 3, 31): 1.6624510376985664, - datetime.date(2042, 4, 30): 1.6651797737110705, - datetime.date(2042, 5, 31): 1.6679129886526118, - datetime.date(2042, 6, 30): 1.670650689874875, - datetime.date(2042, 7, 31): 1.6733928847416106, - datetime.date(2042, 8, 31): 1.676139580628657, - datetime.date(2042, 9, 30): 1.6788907849239585, - datetime.date(2042, 10, 31): 1.6816465050275864, - datetime.date(2042, 11, 30): 1.6844067483517586, - datetime.date(2042, 12, 31): 1.6871715223208588, - datetime.date(2043, 1, 31): 1.6899451741068114, - datetime.date(2043, 2, 28): 1.6927233856806267, - datetime.date(2043, 3, 31): 1.6955061645384386, - datetime.date(2043, 4, 30): 1.6982935181887044, - datetime.date(2043, 5, 31): 1.7010854541522251, - datetime.date(2043, 6, 30): 1.703881979962166, - datetime.date(2043, 7, 31): 1.706683103164076, - datetime.date(2043, 8, 31): 1.7094888313159085, - datetime.date(2043, 9, 30): 1.712299171988043, - datetime.date(2043, 10, 31): 1.7151141327633035, - datetime.date(2043, 11, 30): 1.71793372123698, - datetime.date(2043, 12, 31): 1.7207579450168495, - datetime.date(2044, 1, 31): 1.7235900240944928, - datetime.date(2044, 2, 29): 1.7264267642994757, - datetime.date(2044, 3, 31): 1.7292681733032322, - datetime.date(2044, 4, 30): 1.732114258789822, - datetime.date(2044, 5, 31): 1.734965028455952, - datetime.date(2044, 6, 30): 1.7378204900109966, - datetime.date(2044, 7, 31): 1.7406806511770179, - datetime.date(2044, 8, 31): 1.743545519688788, - datetime.date(2044, 9, 30): 1.7464151032938084, - datetime.date(2044, 10, 31): 1.7492894097523326, - datetime.date(2044, 11, 30): 1.7521684468373855, - datetime.date(2044, 12, 31): 1.7550522223347849, - datetime.date(2045, 1, 31): 1.7579421198760468, - datetime.date(2045, 2, 28): 1.7608367759696144, - datetime.date(2045, 3, 31): 1.7637361984509972, - datetime.date(2045, 4, 30): 1.7666403951686067, - datetime.date(2045, 5, 31): 1.7695493739837784, - datetime.date(2045, 6, 30): 1.7724631427707918, - datetime.date(2045, 7, 31): 1.775381709416892, - datetime.date(2045, 8, 31): 1.7783050818223123, - datetime.date(2045, 9, 30): 1.7812332679002942, - datetime.date(2045, 10, 31): 1.7841662755771088, - datetime.date(2045, 11, 30): 1.7871041127920801, - datetime.date(2045, 12, 31): 1.7900467874976032, - datetime.date(2046, 1, 31): 1.7929938491512625, - datetime.date(2046, 2, 28): 1.7959457627297155, - datetime.date(2046, 3, 31): 1.798902536220978, - datetime.date(2046, 4, 30): 1.8018641776262165, - datetime.date(2046, 5, 31): 1.8048306949597708, - datetime.date(2046, 6, 30): 1.8078020962491743, - datetime.date(2046, 7, 31): 1.8107783895351774, - datetime.date(2046, 8, 31): 1.8137595828717683, - datetime.date(2046, 9, 30): 1.8167456843261949, - datetime.date(2046, 10, 31): 1.8197367019789865, - datetime.date(2046, 11, 30): 1.8227326439239762, - datetime.date(2046, 12, 31): 1.8257335182683228, - datetime.date(2047, 1, 31): 1.8287369097704886, - datetime.date(2047, 2, 28): 1.8317452419501548, - datetime.date(2047, 3, 31): 1.834758522934898, - datetime.date(2047, 4, 30): 1.8377767608656645, - datetime.date(2047, 5, 31): 1.8407999638967933, - datetime.date(2047, 6, 30): 1.843828140196037, - datetime.date(2047, 7, 31): 1.8468612979445849, - datetime.date(2047, 8, 31): 1.8498994453370843, - datetime.date(2047, 9, 30): 1.8529425905816634, - datetime.date(2047, 10, 31): 1.8559907418999526, - datetime.date(2047, 11, 30): 1.8590439075271072, - datetime.date(2047, 12, 31): 1.86210209571183, - datetime.date(2048, 1, 31): 1.8651631692582504, - datetime.date(2048, 2, 29): 1.8682292748441485, - datetime.date(2048, 3, 31): 1.871300420741596, - datetime.date(2048, 4, 30): 1.8743766152362635, - datetime.date(2048, 5, 31): 1.8774578666274424, - datetime.date(2048, 6, 30): 1.8805441832280665, - datetime.date(2048, 7, 31): 1.8836355733647354, - datetime.date(2048, 8, 31): 1.8867320453777372, - datetime.date(2048, 9, 30): 1.8898336076210693, - datetime.date(2048, 10, 31): 1.8929402684624632, - datetime.date(2048, 11, 30): 1.8960520362834052, - datetime.date(2048, 12, 31): 1.8991689194791601, - datetime.date(2049, 1, 31): 1.902290021459603, - datetime.date(2049, 2, 28): 1.905416252671823, - datetime.date(2049, 3, 31): 1.908547621545221, - datetime.date(2049, 4, 30): 1.9116841365230504, - datetime.date(2049, 5, 31): 1.9148258060624401, - datetime.date(2049, 6, 30): 1.9179726386344174, - datetime.date(2049, 7, 31): 1.9211246427239317, - datetime.date(2049, 8, 31): 1.924281826829876, - datetime.date(2049, 9, 30): 1.9274441994651104, - datetime.date(2049, 10, 31): 1.9306117691564852, - datetime.date(2049, 11, 30): 1.933784544444864, - datetime.date(2049, 12, 31): 1.936962533885146, - datetime.date(2050, 1, 31): 1.9401459476468907, - datetime.date(2050, 2, 28): 1.9433345933751818, - datetime.date(2050, 3, 31): 1.9465284796687987, - datetime.date(2050, 4, 30): 1.9497276151406535, - datetime.date(2050, 5, 31): 1.9529320084178137, - datetime.date(2050, 6, 30): 1.9561416681415251, - datetime.date(2050, 7, 31): 1.9593566029672358, - datetime.date(2050, 8, 31): 1.962576821564619, - datetime.date(2050, 9, 30): 1.9658023326175968, - datetime.date(2050, 10, 31): 1.969033144824363, - datetime.date(2050, 11, 30): 1.9722692668974073, - datetime.date(2050, 12, 31): 1.9755107075635383, - datetime.date(2051, 1, 31): 1.978758265194836, - datetime.date(2051, 2, 28): 1.9820111615117346, - datetime.date(2051, 3, 31): 1.9852694052905413, - datetime.date(2051, 4, 30): 1.9885330053219907, - datetime.date(2051, 5, 31): 1.991801970411269, - datetime.date(2051, 6, 30): 1.9950763093780373, - datetime.date(2051, 7, 31): 1.9983560310564548, - datetime.date(2051, 8, 31): 2.0016411442952036, - datetime.date(2051, 9, 30): 2.0049316579575125, - datetime.date(2051, 10, 31): 2.0082275809211803, - datetime.date(2051, 11, 30): 2.0115289220786003, - datetime.date(2051, 12, 31): 2.014835690336784, - datetime.date(2052, 1, 31): 2.018148866223083, - datetime.date(2052, 2, 29): 2.021467490263049, - datetime.date(2052, 3, 31): 2.0247915714155713, - datetime.date(2052, 4, 30): 2.0281211186542722, - datetime.date(2052, 5, 31): 2.031456140967529, - datetime.date(2052, 6, 30): 2.034796647358501, - datetime.date(2052, 7, 31): 2.038142646845151, - datetime.date(2052, 8, 31): 2.0414941484602713, - datetime.date(2052, 9, 30): 2.0448511612515077, - datetime.date(2052, 10, 31): 2.0482136942813836, - datetime.date(2052, 11, 30): 2.0515817566273244, - datetime.date(2052, 12, 31): 2.0549553573816834, - datetime.date(2053, 1, 31): 2.058335121481051, - datetime.date(2053, 2, 28): 2.061720444243932, - datetime.date(2053, 3, 31): 2.0651113348126042, - datetime.date(2053, 4, 30): 2.06850780234438, - datetime.date(2053, 5, 31): 2.0719098560116347, - datetime.date(2053, 6, 30): 2.075317505001828, - datetime.date(2053, 7, 31): 2.0787307585175303, - datetime.date(2053, 8, 31): 2.082149625776447, - datetime.date(2053, 9, 30): 2.085574116011445, - datetime.date(2053, 10, 31): 2.089004238470576, - datetime.date(2053, 11, 30): 2.0924400024171, - datetime.date(2053, 12, 31): 2.0958814171295153, - datetime.date(2054, 1, 31): 2.0993286437032728, - datetime.date(2054, 2, 28): 2.102781540145065, - datetime.date(2054, 3, 31): 2.106240115780476, - datetime.date(2054, 4, 30): 2.1097043799504296, - datetime.date(2054, 5, 31): 2.113174342011212, - datetime.date(2054, 6, 30): 2.1166500113344986, - datetime.date(2054, 7, 31): 2.1201313973073797, - datetime.date(2054, 8, 31): 2.1236185093323843, - datetime.date(2054, 9, 30): 2.127111356827507, - datetime.date(2054, 10, 31): 2.1306099492262316, - datetime.date(2054, 11, 30): 2.1341142959775588, - datetime.date(2054, 12, 31): 2.137624406546031, - datetime.date(2055, 1, 31): 2.1411400616601206, - datetime.date(2055, 2, 28): 2.1446614988147052, - datetime.date(2055, 3, 31): 2.1481887275192477, - datetime.date(2055, 4, 30): 2.1517217572988505, - datetime.date(2055, 5, 31): 2.1552605976942827, - datetime.date(2055, 6, 30): 2.158805258262003, - datetime.date(2055, 7, 31): 2.162355748574188, - datetime.date(2055, 8, 31): 2.1659120782187586, - datetime.date(2055, 9, 30): 2.169474256799402, - datetime.date(2055, 10, 31): 2.1730422939356013, - datetime.date(2055, 11, 30): 2.176616199262661, - datetime.date(2055, 12, 31): 2.1801959824317323, - datetime.date(2056, 1, 31): 2.1837812255603417, - datetime.date(2056, 2, 29): 2.1873723644746486, - datetime.date(2056, 3, 31): 2.190969408870031, - datetime.date(2056, 4, 30): 2.1945723684578127, - datetime.date(2056, 5, 31): 2.1981812529652838, - datetime.date(2056, 6, 30): 2.2017960721357333, - datetime.date(2056, 7, 31): 2.2054168357284714, - datetime.date(2056, 8, 31): 2.209043553518858, - datetime.date(2056, 9, 30): 2.2126762352983276, - datetime.date(2056, 10, 31): 2.2163148908744152, - datetime.date(2056, 11, 30): 2.2199595300707866, - datetime.date(2056, 12, 31): 2.2236101627272595, - datetime.date(2057, 1, 31): 2.227266375986442, - datetime.date(2057, 2, 28): 2.2309286010437446, - datetime.date(2057, 3, 31): 2.234596847784181, - datetime.date(2057, 4, 30): 2.2382711261090176, - datetime.date(2057, 5, 31): 2.241951445935802, - datetime.date(2057, 6, 30): 2.2456378171983884, - datetime.date(2057, 7, 31): 2.249330249846966, - datetime.date(2057, 8, 31): 2.253028753848082, - datetime.date(2057, 9, 30): 2.256733339184675, - datetime.date(2057, 10, 31): 2.2604440158560957, - datetime.date(2057, 11, 30): 2.264160793878137, - datetime.date(2057, 12, 31): 2.2678836832830607, - datetime.date(2058, 1, 31): 2.2716125209011375, - datetime.date(2058, 2, 28): 2.2753474894465127, - datetime.date(2058, 3, 31): 2.2790885989996106, - datetime.date(2058, 4, 30): 2.282835859657431, - datetime.date(2058, 5, 31): 2.2865892815335758, - datetime.date(2058, 6, 30): 2.2903488747582736, - datetime.date(2058, 7, 31): 2.294114649478411, - datetime.date(2058, 8, 31): 2.2978866158575566, - datetime.date(2058, 9, 30): 2.301664784075991, - datetime.date(2058, 10, 31): 2.305449164330732, - datetime.date(2058, 11, 30): 2.309239766835564, - datetime.date(2058, 12, 31): 2.313036601821065, - datetime.date(2059, 1, 31): 2.316839751701828, - datetime.date(2059, 2, 28): 2.3206491548122226, - datetime.date(2059, 3, 31): 2.3244648214339563, - datetime.date(2059, 4, 30): 2.3282867618656446, - datetime.date(2059, 5, 31): 2.332114986422835, - datetime.date(2059, 6, 30): 2.335949505438037, - datetime.date(2059, 7, 31): 2.339790329260748, - datetime.date(2059, 8, 31): 2.343637468257482, - datetime.date(2059, 9, 30): 2.347490932811799, - datetime.date(2059, 10, 31): 2.3513507333243315, - datetime.date(2059, 11, 30): 2.3552168802128133, - datetime.date(2059, 12, 31): 2.359089383912107, - datetime.date(2060, 1, 31): 2.3629684482549114, - datetime.date(2060, 2, 29): 2.366853890965691, - datetime.date(2060, 3, 31): 2.3707457225324324, - datetime.date(2060, 4, 30): 2.3746439534603687, - datetime.date(2060, 5, 31): 2.3785485942720066, - datetime.date(2060, 6, 30): 2.382459655507155, - datetime.date(2060, 7, 31): 2.386377147722954, - datetime.date(2060, 8, 31): 2.390301081493901, - datetime.date(2060, 9, 30): 2.394231467411884, - datetime.date(2060, 10, 31): 2.3981683160862044, - datetime.date(2060, 11, 30): 2.402111638143611, - datetime.date(2060, 12, 31): 2.4060614442283246, - datetime.date(2061, 1, 31): 2.4100179369138024, - datetime.date(2061, 2, 28): 2.4139809355987034, - datetime.date(2061, 3, 31): 2.4179504509814, - datetime.date(2061, 4, 30): 2.4219264937778564, - datetime.date(2061, 5, 31): 2.4259090747216563, - datetime.date(2061, 6, 30): 2.4298982045640356, - datetime.date(2061, 7, 31): 2.433893894073908, - datetime.date(2061, 8, 31): 2.437896154037897, - datetime.date(2061, 9, 30): 2.441904995260361, - datetime.date(2061, 10, 31): 2.445920428563427, - datetime.date(2061, 11, 30): 2.4499424647870174, - datetime.date(2061, 12, 31): 2.4539711147888794, - datetime.date(2062, 1, 31): 2.458006506663394, - datetime.date(2062, 2, 28): 2.4620485344707776, - datetime.date(2062, 3, 31): 2.46609720912338, - datetime.date(2062, 4, 30): 2.470152541551494, - datetime.date(2062, 5, 31): 2.4742145427033884, - datetime.date(2062, 6, 30): 2.4782832235453345, - datetime.date(2062, 7, 31): 2.4823585950616374, - datetime.date(2062, 8, 31): 2.4864406682546645, - datetime.date(2062, 9, 30): 2.4905294541448764, - datetime.date(2062, 10, 31): 2.494624963770857, - datetime.date(2062, 11, 30): 2.49872720818934, - datetime.date(2062, 12, 31): 2.5028361984752436, - datetime.date(2063, 1, 31): 2.506951956536693, - datetime.date(2063, 2, 28): 2.511074482705632, - datetime.date(2063, 3, 31): 2.515203788111792, - datetime.date(2063, 4, 30): 2.5193398839032044, - datetime.date(2063, 5, 31): 2.5234827812462357, - datetime.date(2063, 6, 30): 2.527632491325613, - datetime.date(2063, 7, 31): 2.531789025344456, - datetime.date(2063, 8, 31): 2.5359523945243083, - datetime.date(2063, 9, 30): 2.5401226101051657, - datetime.date(2063, 10, 31): 2.544299683345508, - datetime.date(2063, 11, 30): 2.5484836255223278, - datetime.date(2063, 12, 31): 2.552674447931164, - datetime.date(2064, 1, 31): 2.5568720975209347, - datetime.date(2064, 2, 29): 2.5610766497778648, - datetime.date(2064, 3, 31): 2.565288116052785, - datetime.date(2064, 4, 30): 2.569506507715193, - datetime.date(2064, 5, 31): 2.5737318361532813, - datetime.date(2064, 6, 30): 2.5779641127739708, - datetime.date(2064, 7, 31): 2.582203349002939, - datetime.date(2064, 8, 31): 2.5864495562846517, - datetime.date(2064, 9, 30): 2.5907027460823957, - datetime.date(2064, 10, 31): 2.594962929878306, - datetime.date(2064, 11, 30): 2.5992301191734017, - datetime.date(2064, 12, 31): 2.6035043254876116, - datetime.date(2065, 1, 31): 2.6077854692914553, - datetime.date(2065, 2, 28): 2.61207365291163, - datetime.date(2065, 3, 31): 2.6163688879242515, - datetime.date(2065, 4, 30): 2.6206711859244707, - datetime.date(2065, 5, 31): 2.624980558526504, - datetime.date(2065, 6, 30): 2.629297017363668, - datetime.date(2065, 7, 31): 2.633620574088408, - datetime.date(2065, 8, 31): 2.6379512403723298, - datetime.date(2065, 9, 30): 2.6422890279062323, - datetime.date(2065, 10, 31): 2.646633948400139, - datetime.date(2065, 11, 30): 2.6509860135833274, - datetime.date(2065, 12, 31): 2.6553452352043645, - datetime.date(2066, 1, 31): 2.6597115512766614, - datetime.date(2066, 2, 28): 2.6640850470993684, - datetime.date(2066, 3, 31): 2.6684657344785068, - datetime.date(2066, 4, 30): 2.67285362523951, - datetime.date(2066, 5, 31): 2.6772487312272557, - datetime.date(2066, 6, 30): 2.681651064306101, - datetime.date(2066, 7, 31): 2.6860606363599095, - datetime.date(2066, 8, 31): 2.690477459292088, - datetime.date(2066, 9, 30): 2.694901545025616, - datetime.date(2066, 10, 31): 2.6993329055030784, - datetime.date(2066, 11, 30): 2.7037715526866983, - datetime.date(2066, 12, 31): 2.708217498558368, - datetime.date(2067, 1, 31): 2.712670725484101, - datetime.date(2067, 2, 28): 2.717131275023347, - datetime.date(2067, 3, 31): 2.7215991592169635, - datetime.date(2067, 4, 30): 2.7260743901256066, - datetime.date(2067, 5, 31): 2.7305569798297644, - datetime.date(2067, 6, 30): 2.7350469404297892, - datetime.date(2067, 7, 31): 2.739544284045931, - datetime.date(2067, 8, 31): 2.744049022818369, - datetime.date(2067, 9, 30): 2.748561168907245, - datetime.date(2067, 10, 31): 2.753080734492696, - datetime.date(2067, 11, 30): 2.7576077317748884, - datetime.date(2067, 12, 31): 2.762142172974048, - datetime.date(2068, 1, 31): 2.766684089591215, - datetime.date(2068, 2, 29): 2.771233474689461, - datetime.date(2068, 3, 31): 2.7757903405495514, - datetime.date(2068, 4, 30): 2.7803546994724444, - datetime.date(2068, 5, 31): 2.784926563779326, - datetime.date(2068, 6, 30): 2.7895059458116416, - datetime.date(2068, 7, 31): 2.794092857931131, - datetime.date(2068, 8, 31): 2.798687312519861, - datetime.date(2068, 9, 30): 2.803289321980258, - datetime.date(2068, 10, 31): 2.8078988987351434, - datetime.date(2068, 11, 30): 2.8125160552277646, - datetime.date(2068, 12, 31): 2.8171408039218306, - datetime.date(2069, 1, 31): 2.8217732004272142, - datetime.date(2069, 2, 28): 2.826413214264807, - datetime.date(2069, 3, 31): 2.8310608579602525, - datetime.date(2069, 4, 30): 2.835716144059792, - datetime.date(2069, 5, 31): 2.840379085130297, - datetime.date(2069, 6, 30): 2.845049693759303, - datetime.date(2069, 7, 31): 2.8497279825550446, - datetime.date(2069, 8, 31): 2.8544139641464876, - datetime.date(2069, 9, 30): 2.8591076511833657, - datetime.date(2069, 10, 31): 2.863809056336214, - datetime.date(2069, 11, 30): 2.868518192296401, - datetime.date(2069, 12, 31): 2.8732350717761643, - datetime.date(2070, 1, 31): 2.8779597469269094, - datetime.date(2070, 2, 28): 2.8826921912140895, - datetime.date(2070, 3, 31): 2.887432417413075, - datetime.date(2070, 4, 30): 2.8921804383202456, - datetime.date(2070, 5, 31): 2.8969362667530225, - datetime.date(2070, 6, 30): 2.9016999155499033, - datetime.date(2070, 7, 31): 2.9064713975704968, - datetime.date(2070, 8, 31): 2.911250725695559, - datetime.date(2070, 9, 30): 2.9160379128270253, - datetime.date(2070, 10, 31): 2.920832971888047, - datetime.date(2070, 11, 30): 2.9256359158230265, - datetime.date(2070, 12, 31): 2.9304467575976516} -- GitLab From 3abdd7de914b58165a2075794facea19df62bde6 Mon Sep 17 00:00:00 2001 From: Adarsh Murthy Date: Mon, 24 Apr 2017 18:15:22 -0400 Subject: [PATCH 4/5] Fix style in javascript. --- .../apps/financialInputs/static/financialInputs/scripts/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blocnote/apps/financialInputs/static/financialInputs/scripts/app.js b/blocnote/apps/financialInputs/static/financialInputs/scripts/app.js index 954786b..4f042d4 100644 --- a/blocnote/apps/financialInputs/static/financialInputs/scripts/app.js +++ b/blocnote/apps/financialInputs/static/financialInputs/scripts/app.js @@ -219,7 +219,7 @@ function createBillsOverviewTable(responseDictionary) { /** Display if user input is needed or not */ function createFlag(state) { - if(state) { + if (state) { text = `Need User Input`; } else { -- GitLab From 2fa69a6f200cc33166c5df15debcb5106f566d3d Mon Sep 17 00:00:00 2001 From: Adarsh Murthy Date: Mon, 24 Apr 2017 18:53:54 -0400 Subject: [PATCH 5/5] Alter max length of estimation model. --- .../migrations/0015_auto_20170424_2250.py | 20 +++++++++++++++++++ blocnote/apps/financialInputs/models.py | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 blocnote/apps/financialInputs/migrations/0015_auto_20170424_2250.py diff --git a/blocnote/apps/financialInputs/migrations/0015_auto_20170424_2250.py b/blocnote/apps/financialInputs/migrations/0015_auto_20170424_2250.py new file mode 100644 index 0000000..e350b03 --- /dev/null +++ b/blocnote/apps/financialInputs/migrations/0015_auto_20170424_2250.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.6 on 2017-04-24 22:50 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('financialInputs', '0013_auto_20170424_2158'), + ] + + operations = [ + migrations.AlterField( + model_name='estimationalgorithm', + name='algorithm', + field=models.CharField(max_length=16), + ), + ] diff --git a/blocnote/apps/financialInputs/models.py b/blocnote/apps/financialInputs/models.py index 58f6589..14e6398 100644 --- a/blocnote/apps/financialInputs/models.py +++ b/blocnote/apps/financialInputs/models.py @@ -45,8 +45,8 @@ class Bills(models.Model): class EstimationAlgorithm(models.Model): """Estimation algorithm used to project bills for pro forma duration.""" + algorithm = models.CharField(max_length=16) building_id = models.IntegerField() - algorithm = models.CharField(max_length=100) class BillsOverview(models.Model): -- GitLab
Preference