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 +44 -24
- owlplanner/version.py +1 -1
- {owlplanner-2025.2.24.dist-info → owlplanner-2025.2.27.dist-info}/METADATA +1 -1
- {owlplanner-2025.2.24.dist-info → owlplanner-2025.2.27.dist-info}/RECORD +6 -6
- {owlplanner-2025.2.24.dist-info → owlplanner-2025.2.27.dist-info}/WHEEL +0 -0
- {owlplanner-2025.2.24.dist-info → owlplanner-2025.2.27.dist-info}/licenses/LICENSE +0 -0
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[
|
|
2081
|
-
dic[f"Net
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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"
|
|
2117
|
-
|
|
2118
|
-
|
|
2119
|
-
dic[f"
|
|
2120
|
-
|
|
2121
|
-
|
|
2122
|
-
|
|
2123
|
-
|
|
2124
|
-
|
|
2125
|
-
|
|
2126
|
-
f"{u.d(
|
|
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
|
|
2137
|
-
|
|
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
|
|
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.
|
|
1
|
+
__version__ = "2025.02.27"
|
|
@@ -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=
|
|
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=
|
|
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.
|
|
15
|
-
owlplanner-2025.2.
|
|
16
|
-
owlplanner-2025.2.
|
|
17
|
-
owlplanner-2025.2.
|
|
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,,
|
|
File without changes
|
|
File without changes
|