owlplanner 2025.2.24__py3-none-any.whl → 2025.2.27__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
owlplanner/plan.py CHANGED
@@ -34,6 +34,10 @@ from owlplanner import logging
34
34
  from owlplanner import progress
35
35
 
36
36
 
37
+ # This makes all graphs appear have the same height.
38
+ plt.rcParams.update({'figure.autolayout': True})
39
+
40
+
37
41
  def _genGamma_n(tau):
38
42
  """
39
43
  Utility function to generate a cumulative inflation multiplier
@@ -2058,6 +2062,12 @@ class Plan(object):
2058
2062
 
2059
2063
  return mylist
2060
2064
 
2065
+ def summaryDf(self):
2066
+ """
2067
+ Return summary as a dataframe.
2068
+ """
2069
+ return pd.DataFrame(self.summaryDic(), index=[self._name])
2070
+
2061
2071
  def summaryString(self):
2062
2072
  """
2063
2073
  Return summary as a string.
@@ -2077,29 +2087,34 @@ class Plan(object):
2077
2087
  dic = {}
2078
2088
  # Results
2079
2089
  dic["Plan name"] = self._name
2080
- dic[f"Net yearly spending basis in {now}$"] = u.d(self.g_n[0] / self.xi_n[0])
2081
- dic[f"Net yearly spending for year {now}"] = u.d(self.g_n[0] / self.yearFracLeft)
2090
+ dic["Net yearly spending basis"] = u.d(self.g_n[0] / self.xi_n[0])
2091
+ dic[f"Net spending for year {now}"] = u.d(self.g_n[0] / self.yearFracLeft)
2082
2092
  dic[f"Net spending remaining in year {now}"] = u.d(self.g_n[0])
2083
2093
 
2084
2094
  totIncome = np.sum(self.g_n, axis=0)
2085
2095
  totIncomeNow = np.sum(self.g_n / self.gamma_n[:-1], axis=0)
2086
- dic[f"Total net spending in {now}$"] = f"{u.d(totIncomeNow)} ({u.d(totIncome)} nominal)"
2096
+ dic["Total net spending"] = f"{u.d(totIncomeNow)}"
2097
+ dic["- Total net spending (nominal)"] = f"{u.d(totIncome)}"
2087
2098
 
2088
2099
  totRoth = np.sum(self.x_in, axis=(0, 1))
2089
2100
  totRothNow = np.sum(np.sum(self.x_in, axis=0) / self.gamma_n[:-1], axis=0)
2090
- dic[f"Total Roth conversions in {now}$"] = f"{u.d(totRothNow)} ({u.d(totRoth)} nominal)"
2101
+ dic["Total Roth conversions"] = f"{u.d(totRothNow)}"
2102
+ dic["- Total Roth conversions (nominal)"] = f"{u.d(totRoth)}"
2091
2103
 
2092
2104
  taxPaid = np.sum(self.T_n, axis=0)
2093
2105
  taxPaidNow = np.sum(self.T_n / self.gamma_n[:-1], axis=0)
2094
- dic[f"Total income tax paid on ordinary income in {now}$"] = f"{u.d(taxPaidNow)} ({u.d(taxPaid)} nominal)"
2106
+ dic["Total income tax paid on ordinary income"] = f"{u.d(taxPaidNow)}"
2107
+ dic["- Total income tax paid on ordinary income (nominal)"] = f"{u.d(taxPaid)}"
2095
2108
 
2096
2109
  taxPaid = np.sum(self.U_n, axis=0)
2097
2110
  taxPaidNow = np.sum(self.U_n / self.gamma_n[:-1], axis=0)
2098
- dic[f"Total tax paid on gains and dividends in {now}$"] = f"{u.d(taxPaidNow)} ({u.d(taxPaid)} nominal)"
2111
+ dic["Total tax paid on gains and dividends"] = f"{u.d(taxPaidNow)}"
2112
+ dic["- Total tax paid on gains and dividends (nominal)"] = f"{u.d(taxPaid)}"
2099
2113
 
2100
2114
  taxPaid = np.sum(self.M_n, axis=0)
2101
2115
  taxPaidNow = np.sum(self.M_n / self.gamma_n[:-1], axis=0)
2102
- dic[f"Total Medicare premiums paid in {now}$"] = f"{u.d(taxPaidNow)} ({u.d(taxPaid)} nominal)"
2116
+ dic["Total Medicare premiums paid"] = f"{u.d(taxPaidNow)}"
2117
+ dic["- Total Medicare premiums paid (nominal)"] = f"{u.d(taxPaid)}"
2103
2118
 
2104
2119
  if self.N_i == 2 and self.n_d < self.N_n:
2105
2120
  p_j = self.partialEstate_j * (1 - self.phi_j)
@@ -2113,30 +2128,35 @@ class Plan(object):
2113
2128
  totSpousalNow = totSpousal / self.gamma_n[nx + 1]
2114
2129
  iname_s = self.inames[self.i_s]
2115
2130
  iname_d = self.inames[self.i_d]
2116
- dic[f"Spousal wealth transfer from {iname_d} to {iname_s} in year {ynx} (nominal)"] = (
2117
- f"taxable: {u.d(q_j[0])} tax-def: {u.d(q_j[1])} tax-free: {u.d(q_j[2])}")
2118
-
2119
- dic[f"Sum of spousal bequests to {iname_s} in year {ynx} in {now}$"] = (
2120
- f"{u.d(totSpousalNow)} ({u.d(totSpousal)} nominal)")
2121
- dic[
2122
- f"Post-tax non-spousal bequests from {iname_d} in year {ynx} (nominal)"] = (
2123
- f"taxable: {u.d(p_j[0])} tax-def: {u.d(p_j[1])} tax-free: {u.d(p_j[2])}")
2124
- dic[
2125
- f"Sum of post-tax non-spousal bequests from {iname_d} in year {ynx} in {now}$"] = (
2126
- f"{u.d(totOthersNow)} ({u.d(totOthers)} nominal)")
2131
+ dic[f"Sum of spousal transfer to {iname_s} in year {ynx}"] = (f"{u.d(totSpousalNow)}")
2132
+ dic[f"- Sum of spousal transfer to {iname_s} in year {ynx} (nominal)"] = (f"{u.d(totSpousal)}")
2133
+ dic[f"-- Spousal transfer to {iname_s} in year {ynx} - taxable (nominal)"] = (f"{u.d(q_j[0])}")
2134
+ dic[f"-- Spousal transfer to {iname_s} in year {ynx} - tax-def (nominal)"] = (f"{u.d(q_j[1])}")
2135
+ dic[f"-- Spousal transfer to {iname_s} in year {ynx} - tax-free (nominal)"] = (f"{u.d(q_j[2])}")
2136
+
2137
+ dic[f"Sum of post-tax non-spousal bequests from {iname_d} in year {ynx}"] = (f"{u.d(totOthersNow)}")
2138
+ dic[f"- Sum of post-tax non-spousal bequests from {iname_d} in year {ynx} (nominal)"] = (
2139
+ f"{u.d(totOthers)}")
2140
+ dic[f"-- Post-tax non-spousal bequests from {iname_d} in year {ynx} - taxable (nominal)"] = (
2141
+ f"{u.d(p_j[0])}")
2142
+ dic[f"-- Post-tax non-spousal bequests from {iname_d} in year {ynx} - tax-def (nominal)"] = (
2143
+ f"{u.d(p_j[1])}")
2144
+ dic[f"-- Post-tax non-spousal bequests from {iname_d} in year {ynx} - tax-free (nominal)"] = (
2145
+ f"{u.d(p_j[2])}")
2127
2146
 
2128
2147
  estate = np.sum(self.b_ijn[:, :, self.N_n], axis=0)
2129
2148
  estate[1] *= 1 - self.nu
2130
2149
  lastyear = self.year_n[-1]
2131
- dic[f"Post-tax account values at the end of final plan year {lastyear} (nominal)"] = (
2132
- f"taxable: {u.d(estate[0])} tax-def: {u.d(estate[1])} tax-free: {u.d(estate[2])}")
2133
-
2134
2150
  totEstate = np.sum(estate)
2135
2151
  totEstateNow = totEstate / self.gamma_n[-1]
2136
- dic[f"Total estate value at the end of final plan year {lastyear} in {now}$"] = (
2137
- f"{u.d(totEstateNow)} ({u.d(totEstate)} nominal)")
2152
+ dic[f"Total estate value at the end of {lastyear}"] = (f"{u.d(totEstateNow)}")
2153
+ dic[f"- Total estate value at the end of {lastyear} (nominal)"] = (f"{u.d(totEstate)}")
2154
+ dic[f"-- Post-tax account value at the end of {lastyear} - taxable (nominal)"] = (f"{u.d(estate[0])}")
2155
+ dic[f"-- Post-tax account value at the end of {lastyear} - tax-def (nominal)"] = (f"{u.d(estate[1])}")
2156
+ dic[f"-- Post-tax account value at the end of {lastyear} - tax-free (nominal)"] = (f"{u.d(estate[2])}")
2157
+
2138
2158
  dic["Plan starting date"] = str(self.startDate)
2139
- dic["Cumulative inflation factor from start date to end of plan"] = f"{self.gamma_n[-1]:.2f}"
2159
+ dic[f"Cumulative inflation factor from start date to end of {lastyear}"] = f"{self.gamma_n[-1]:.2f}"
2140
2160
  for i in range(self.N_i):
2141
2161
  dic[f"{self.inames[i]:>12}'s {self.horizons[i]:02}-year life horizon"] = (
2142
2162
  f"{now} -> {now + self.horizons[i] - 1}")
owlplanner/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "2025.02.23"
1
+ __version__ = "2025.02.27"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: owlplanner
3
- Version: 2025.2.24
3
+ Version: 2025.2.27
4
4
  Summary: Owl: Retirement planner with great wisdom
5
5
  Project-URL: HomePage, https://github.com/mdlacasse/owl
6
6
  Project-URL: Repository, https://github.com/mdlacasse/owl
@@ -2,16 +2,16 @@ owlplanner/__init__.py,sha256=QqrdT0Qks20osBTg7h0vJHAxpP9lL7DA99xb0nYbtw4,254
2
2
  owlplanner/abcapi.py,sha256=LbzW_KcNy0IeHp42MUHwGu_H67B2h_e1_vu-c2ACTkQ,6646
3
3
  owlplanner/config.py,sha256=bvqoOWrdPrWYQF9-PS_n00MoyZkAsmMOSczhTUFRGVU,12257
4
4
  owlplanner/logging.py,sha256=tYMw04O-XYSzjTj36fmKJGLcE1VkK6k6oJNeqtKXzuc,2530
5
- owlplanner/plan.py,sha256=Nv7gcfmc5jCtifeLoGL_gXWLGIxUSjJqp-T3R_3M26E,113806
5
+ owlplanner/plan.py,sha256=Wadr5IlsXJbOvnw7dDIb4nVD7PuUCiUI_HXCvyF4sF0,114925
6
6
  owlplanner/progress.py,sha256=8jlCvvtgDI89zXVNMBg1-lnEyhpPvKQS2X5oAIpoOVQ,384
7
7
  owlplanner/rates.py,sha256=TN407qU4n-bac1oymkQ_n2QKEPwFQxy6JZVGwgIkLQU,15585
8
8
  owlplanner/tax2025.py,sha256=B-A5eU3wxdcAaxRCbT3qI-JEKoD_ZeNbg_86XhNdQEI,7745
9
9
  owlplanner/timelists.py,sha256=tYieZU67FT6TCcQQis36JaXGI7dT6NqD7RvdEjgJL4M,4026
10
10
  owlplanner/utils.py,sha256=HM70W60qB41zfnbl2LltNwAuLYHyy5XYbwnbNcaa6FE,2351
11
- owlplanner/version.py,sha256=85qxkfG2OiCeMaWpV6ROXWN2-KYejMXo-QU_lI_mUOM,28
11
+ owlplanner/version.py,sha256=2dWgos-zzkuXchJJ940RNcgSbRClj6bmX8bVv2KOl-A,28
12
12
  owlplanner/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  owlplanner/data/rates.csv,sha256=6fxg56BVVORrj9wJlUGFdGXKvOX5r7CSca8uhUbbuIU,3734
14
- owlplanner-2025.2.24.dist-info/METADATA,sha256=SPZG_GmQNM5GBp6b129k6FN9niwL7Ja-Pn58w_ELXkg,53506
15
- owlplanner-2025.2.24.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
16
- owlplanner-2025.2.24.dist-info/licenses/LICENSE,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
17
- owlplanner-2025.2.24.dist-info/RECORD,,
14
+ owlplanner-2025.2.27.dist-info/METADATA,sha256=WT4eGtSQ125dYyOb8PgZ175f_WHrKvGssaEJQ5qd5P0,53506
15
+ owlplanner-2025.2.27.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
16
+ owlplanner-2025.2.27.dist-info/licenses/LICENSE,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
17
+ owlplanner-2025.2.27.dist-info/RECORD,,