owlplanner 2025.2__py3-none-any.whl → 2025.2.2__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 +31 -30
- owlplanner/timelists.py +8 -8
- owlplanner/version.py +1 -1
- {owlplanner-2025.2.dist-info → owlplanner-2025.2.2.dist-info}/METADATA +1 -1
- {owlplanner-2025.2.dist-info → owlplanner-2025.2.2.dist-info}/RECORD +7 -7
- {owlplanner-2025.2.dist-info → owlplanner-2025.2.2.dist-info}/WHEEL +0 -0
- {owlplanner-2025.2.dist-info → owlplanner-2025.2.2.dist-info}/licenses/LICENSE +0 -0
owlplanner/plan.py
CHANGED
|
@@ -859,12 +859,12 @@ class Plan(object):
|
|
|
859
859
|
|
|
860
860
|
'year',
|
|
861
861
|
'anticipated wages',
|
|
862
|
-
'ctrb
|
|
863
|
-
'ctrb
|
|
864
|
-
'
|
|
865
|
-
'ctrb
|
|
866
|
-
'
|
|
867
|
-
'Roth
|
|
862
|
+
'taxable ctrb',
|
|
863
|
+
'401k ctrb',
|
|
864
|
+
'Roth 401k ctrb',
|
|
865
|
+
'IRA ctrb',
|
|
866
|
+
'Roth IRA ctrb',
|
|
867
|
+
'Roth conv',
|
|
868
868
|
'big-ticket items'
|
|
869
869
|
|
|
870
870
|
in any order. A template is provided as an example.
|
|
@@ -890,12 +890,12 @@ class Plan(object):
|
|
|
890
890
|
for i, iname in enumerate(self.inames):
|
|
891
891
|
h = self.horizons[i]
|
|
892
892
|
self.omega_in[i, :h] = self.timeLists[iname]['anticipated wages'].iloc[:h]
|
|
893
|
-
self.kappa_ijn[i, 0, :h] = self.timeLists[iname]['ctrb
|
|
894
|
-
self.kappa_ijn[i, 1, :h] = self.timeLists[iname]['ctrb
|
|
895
|
-
self.kappa_ijn[i, 2, :h] = self.timeLists[iname]['
|
|
896
|
-
self.kappa_ijn[i, 1, :h] += self.timeLists[iname]['ctrb
|
|
897
|
-
self.kappa_ijn[i, 2, :h] += self.timeLists[iname]['
|
|
898
|
-
self.myRothX_in[i, :h] = self.timeLists[iname]['Roth
|
|
893
|
+
self.kappa_ijn[i, 0, :h] = self.timeLists[iname]['taxable ctrb'].iloc[:h]
|
|
894
|
+
self.kappa_ijn[i, 1, :h] = self.timeLists[iname]['401k ctrb'].iloc[:h]
|
|
895
|
+
self.kappa_ijn[i, 2, :h] = self.timeLists[iname]['Roth 401k ctrb'].iloc[:h]
|
|
896
|
+
self.kappa_ijn[i, 1, :h] += self.timeLists[iname]['IRA ctrb'].iloc[:h]
|
|
897
|
+
self.kappa_ijn[i, 2, :h] += self.timeLists[iname]['Roth IRA ctrb'].iloc[:h]
|
|
898
|
+
self.myRothX_in[i, :h] = self.timeLists[iname]['Roth conv'].iloc[:h]
|
|
899
899
|
self.Lambda_in[i, :h] = self.timeLists[iname]['big-ticket items'].iloc[:h]
|
|
900
900
|
|
|
901
901
|
# In 1st year, reduce wages and contribution depending on starting date.
|
|
@@ -947,8 +947,8 @@ class Plan(object):
|
|
|
947
947
|
self.myRothX_in[:, :] = 0.
|
|
948
948
|
self.kappa_ijn[:, :, :] = 0.
|
|
949
949
|
|
|
950
|
-
cols = ['year', 'anticipated wages', 'ctrb
|
|
951
|
-
'
|
|
950
|
+
cols = ['year', 'anticipated wages', 'taxable ctrb', '401k ctrb',
|
|
951
|
+
'Roth 401k ctrb', 'IRA ctrb', 'Roth IRA ctrb', 'Roth conv', 'big-ticket items']
|
|
952
952
|
for i, iname in enumerate(self.inames):
|
|
953
953
|
h = self.horizons[i]
|
|
954
954
|
df = pd.DataFrame(0, index=np.arange(h), columns=cols)
|
|
@@ -1993,8 +1993,8 @@ class Plan(object):
|
|
|
1993
1993
|
'wages',
|
|
1994
1994
|
'ssec',
|
|
1995
1995
|
'pension',
|
|
1996
|
-
'dist',
|
|
1997
|
-
'
|
|
1996
|
+
'+dist',
|
|
1997
|
+
'RMD',
|
|
1998
1998
|
'RothX',
|
|
1999
1999
|
'wdrwl taxable',
|
|
2000
2000
|
'wdrwl tax-free',
|
|
@@ -2004,12 +2004,12 @@ class Plan(object):
|
|
|
2004
2004
|
sources['wages'] = self.omega_in
|
|
2005
2005
|
sources['ssec'] = self.zetaBar_in
|
|
2006
2006
|
sources['pension'] = self.pi_in
|
|
2007
|
-
sources['wdrwl
|
|
2008
|
-
sources['
|
|
2009
|
-
sources['dist'] = self.dist_in
|
|
2007
|
+
sources['txbl acc wdrwl'] = self.w_ijn[:, 0, :]
|
|
2008
|
+
sources['RMD'] = self.rmd_in
|
|
2009
|
+
sources['+dist'] = self.dist_in
|
|
2010
2010
|
sources['RothX'] = self.x_in
|
|
2011
|
-
sources['
|
|
2012
|
-
sources['
|
|
2011
|
+
sources['tax-free wdrwl'] = self.w_ijn[:, 2, :]
|
|
2012
|
+
sources['BTI'] = self.Lambda_in
|
|
2013
2013
|
|
|
2014
2014
|
savings = {}
|
|
2015
2015
|
savings['taxable'] = self.b_ijn[:, 0, :]
|
|
@@ -2719,7 +2719,7 @@ class Plan(object):
|
|
|
2719
2719
|
'all wages': np.sum(self.omega_in, axis=0),
|
|
2720
2720
|
'all pensions': np.sum(self.pi_in, axis=0),
|
|
2721
2721
|
'all soc sec': np.sum(self.zetaBar_in, axis=0),
|
|
2722
|
-
"all
|
|
2722
|
+
"all BTI's": np.sum(self.Lambda_in, axis=0),
|
|
2723
2723
|
'all wdrwls': np.sum(self.w_ijn, axis=(0, 1)),
|
|
2724
2724
|
'all deposits': -np.sum(self.d_in, axis=0),
|
|
2725
2725
|
'ord taxes': -self.T_n,
|
|
@@ -2735,12 +2735,12 @@ class Plan(object):
|
|
|
2735
2735
|
'wages': self.sources_in['wages'],
|
|
2736
2736
|
'social sec': self.sources_in['ssec'],
|
|
2737
2737
|
'pension': self.sources_in['pension'],
|
|
2738
|
-
'txbl acc wdrwl': self.sources_in['wdrwl
|
|
2739
|
-
'RMDs': self.sources_in['
|
|
2740
|
-
'+distributions': self.sources_in['dist'],
|
|
2741
|
-
'Roth
|
|
2742
|
-
'tax-free wdrwl': self.sources_in['
|
|
2743
|
-
'big-ticket items': self.sources_in['
|
|
2738
|
+
'txbl acc wdrwl': self.sources_in['txbl acc wdrwl'],
|
|
2739
|
+
'RMDs': self.sources_in['RMD'],
|
|
2740
|
+
'+distributions': self.sources_in['+dist'],
|
|
2741
|
+
'Roth conv': self.sources_in['RothX'],
|
|
2742
|
+
'tax-free wdrwl': self.sources_in['tax-free wdrwl'],
|
|
2743
|
+
'big-ticket items': self.sources_in['BTI'],
|
|
2744
2744
|
}
|
|
2745
2745
|
|
|
2746
2746
|
for i in range(self.N_i):
|
|
@@ -2751,13 +2751,14 @@ class Plan(object):
|
|
|
2751
2751
|
# Account balances except final year.
|
|
2752
2752
|
accDic = {
|
|
2753
2753
|
'taxable bal': self.b_ijn[:, 0, :-1],
|
|
2754
|
+
'taxable ctrb': self.kappa_ijn[:, 0, :],
|
|
2754
2755
|
'taxable dep': self.d_in,
|
|
2755
2756
|
'taxable wdrwl': self.w_ijn[:, 0, :],
|
|
2756
2757
|
'tax-deferred bal': self.b_ijn[:, 1, :-1],
|
|
2757
2758
|
'tax-deferred ctrb': self.kappa_ijn[:, 1, :],
|
|
2758
2759
|
'tax-deferred wdrwl': self.w_ijn[:, 1, :],
|
|
2759
2760
|
'(included RMDs)': self.rmd_in[:, :],
|
|
2760
|
-
'Roth
|
|
2761
|
+
'Roth conv': self.x_in,
|
|
2761
2762
|
'tax-free bal': self.b_ijn[:, 2, :-1],
|
|
2762
2763
|
'tax-free ctrb': self.kappa_ijn[:, 2, :],
|
|
2763
2764
|
'tax-free wdrwl': self.w_ijn[:, 2, :],
|
|
@@ -2856,7 +2857,7 @@ class Plan(object):
|
|
|
2856
2857
|
planData[self.inames[i] + ' tx-def ctrb'] = self.kappa_ijn[i, 1, :]
|
|
2857
2858
|
planData[self.inames[i] + ' tx-def wdrl'] = self.w_ijn[i, 1, :]
|
|
2858
2859
|
planData[self.inames[i] + ' (RMD)'] = self.rmd_in[i, :]
|
|
2859
|
-
planData[self.inames[i] + ' Roth
|
|
2860
|
+
planData[self.inames[i] + ' Roth conv'] = self.x_in[i, :]
|
|
2860
2861
|
planData[self.inames[i] + ' tx-free bal'] = self.b_ijn[i, 2, :-1]
|
|
2861
2862
|
planData[self.inames[i] + ' tx-free ctrb'] = self.kappa_ijn[i, 2, :]
|
|
2862
2863
|
planData[self.inames[i] + ' tax-free wdrwl'] = self.w_ijn[i, 2, :]
|
owlplanner/timelists.py
CHANGED
|
@@ -23,12 +23,12 @@ import pandas as pd
|
|
|
23
23
|
timeHorizonItems = [
|
|
24
24
|
'year',
|
|
25
25
|
'anticipated wages',
|
|
26
|
-
'ctrb
|
|
27
|
-
'ctrb
|
|
28
|
-
'
|
|
29
|
-
'ctrb
|
|
30
|
-
'
|
|
31
|
-
'Roth
|
|
26
|
+
'taxable ctrb',
|
|
27
|
+
'401k ctrb',
|
|
28
|
+
'Roth 401k ctrb',
|
|
29
|
+
'IRA ctrb',
|
|
30
|
+
'Roth IRA ctrb',
|
|
31
|
+
'Roth conv',
|
|
32
32
|
'big-ticket items',
|
|
33
33
|
]
|
|
34
34
|
|
|
@@ -38,8 +38,8 @@ def read(finput, inames, horizons, mylog):
|
|
|
38
38
|
Read listed parameters from an excel spreadsheet or through
|
|
39
39
|
a dictionary of dataframes through Pandas.
|
|
40
40
|
Use one sheet for each individual with the following 9 columns:
|
|
41
|
-
year, anticipated wages,
|
|
42
|
-
|
|
41
|
+
year, anticipated wages, taxable ctrb, 401k ctrb, Roth 401k ctrb,
|
|
42
|
+
IRA ctrb, Roth IRA ctrb, Roth conv, and big-ticket items.
|
|
43
43
|
Supports xls, xlsx, xlsm, xlsb, odf, ods, and odt file extensions.
|
|
44
44
|
Returs a dictionary of dataframes by individual's names.
|
|
45
45
|
"""
|
owlplanner/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "2025.02"
|
|
1
|
+
__version__ = "2025.02.02"
|
|
@@ -2,16 +2,16 @@ owlplanner/__init__.py,sha256=QqrdT0Qks20osBTg7h0vJHAxpP9lL7DA99xb0nYbtw4,254
|
|
|
2
2
|
owlplanner/abcapi.py,sha256=eemIsdbtzdWCIj5VuuswgphxXMcxJ_GZfUlDi6lttFM,6658
|
|
3
3
|
owlplanner/config.py,sha256=ouADb6YES5Zgv0UwnEK9Axwvs8drp-ahboQjI4WTrr0,12069
|
|
4
4
|
owlplanner/logging.py,sha256=pXg_mMgBll-kklqaDRLDNVUFo-5DAa-yqTKtiVrhNWw,2530
|
|
5
|
-
owlplanner/plan.py,sha256=
|
|
5
|
+
owlplanner/plan.py,sha256=XynSo_7mZCpO8LX12Afpidy3_e-8DfTIukjx-zwrfqo,115627
|
|
6
6
|
owlplanner/progress.py,sha256=YZjL5_m4MMgKPlWlhhKacPLt54tVhVGF1eXxxZapMYs,386
|
|
7
7
|
owlplanner/rates.py,sha256=aKOmau8i3uqxZGi7HQJpzooT3X-yAZhga5MZJ56pBzk,15627
|
|
8
8
|
owlplanner/tax2025.py,sha256=b2RgM6TBQa8ggo6ODyh0p_J7j79UUm8z5NiENqa1l_k,7016
|
|
9
|
-
owlplanner/timelists.py,sha256=
|
|
9
|
+
owlplanner/timelists.py,sha256=WwymsYAGWcrEzMtc-wrLbn1EVA2fhqXGN4NHLJsH3Fs,4110
|
|
10
10
|
owlplanner/utils.py,sha256=adIwqGVQFfvekke0JCxYJD3PKHbptVCj3NrQT2TQIB4,2351
|
|
11
|
-
owlplanner/version.py,sha256=
|
|
11
|
+
owlplanner/version.py,sha256=TvJXfzfwD0xlk2iP0kgqI5r4imDq1PLIhXyrmhX_TPw,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.dist-info/METADATA,sha256=
|
|
15
|
-
owlplanner-2025.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
16
|
-
owlplanner-2025.2.dist-info/licenses/LICENSE,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
|
|
17
|
-
owlplanner-2025.2.dist-info/RECORD,,
|
|
14
|
+
owlplanner-2025.2.2.dist-info/METADATA,sha256=ww4vJFk2xddNd-2dYe5VSblOruOrOdxEToOEG1iaeWQ,64514
|
|
15
|
+
owlplanner-2025.2.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
16
|
+
owlplanner-2025.2.2.dist-info/licenses/LICENSE,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
|
|
17
|
+
owlplanner-2025.2.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|