owlplanner 2025.5.5__tar.gz → 2025.5.12__tar.gz

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.
Files changed (111) hide show
  1. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/.devcontainer/devcontainer.json +1 -1
  2. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/PKG-INFO +8 -5
  3. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/README.md +6 -4
  4. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/notebooks/john+sally.ipynb +13 -0
  5. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/notebooks/kim+sam.ipynb +17 -5
  6. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/notebooks/template.ipynb +956 -944
  7. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/notebooks/tutorial_1.ipynb +15 -2
  8. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/notebooks/tutorial_2.ipynb +389 -377
  9. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/notebooks/tutorial_3.ipynb +422 -410
  10. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/owlplanner.cmd +1 -0
  11. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/owlplanner.sh +1 -0
  12. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/pyproject.toml +4 -3
  13. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/requirements.txt +1 -0
  14. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/src/owlplanner/__init__.py +3 -1
  15. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/src/owlplanner/config.py +2 -2
  16. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/src/owlplanner/plan.py +139 -274
  17. owlplanner-2025.5.12/src/owlplanner/plotting/__init__.py +7 -0
  18. owlplanner-2025.5.12/src/owlplanner/plotting/base.py +76 -0
  19. owlplanner-2025.5.12/src/owlplanner/plotting/factory.py +32 -0
  20. owlplanner-2025.5.12/src/owlplanner/plotting/matplotlib_backend.py +432 -0
  21. owlplanner-2025.5.12/src/owlplanner/plotting/plotly_backend.py +980 -0
  22. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/src/owlplanner/rates.py +3 -14
  23. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/src/owlplanner/timelists.py +2 -7
  24. owlplanner-2025.5.12/src/owlplanner/version.py +1 -0
  25. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/tests/test_logger.py +3 -3
  26. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/ui/About_Owl.py +2 -1
  27. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/ui/Create_Case.py +3 -2
  28. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/ui/Current_Assets.py +4 -3
  29. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/ui/Documentation.py +31 -19
  30. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/ui/Graphs.py +5 -3
  31. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/ui/Historical_Range.py +3 -3
  32. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/ui/Monte_Carlo.py +3 -3
  33. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/ui/Optimization_Parameters.py +11 -11
  34. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/ui/Output_Files.py +2 -2
  35. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/ui/Quick_Start.py +1 -1
  36. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/ui/Rates_Selection.py +27 -29
  37. owlplanner-2025.5.12/ui/Settings.py +29 -0
  38. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/ui/Wages_And_Contributions.py +2 -2
  39. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/ui/main.py +3 -4
  40. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/ui/owlbridge.py +91 -32
  41. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/ui/requirements.txt +1 -1
  42. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/ui/sskeys.py +12 -4
  43. owlplanner-2025.5.5/src/owlplanner/plots.py +0 -296
  44. owlplanner-2025.5.5/src/owlplanner/version.py +0 -1
  45. owlplanner-2025.5.5/ui/Settings.py +0 -33
  46. owlplanner-2025.5.5/ui/plots.py +0 -20
  47. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/.flake8 +0 -0
  48. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/.gitattributes +0 -0
  49. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/.github/workflows/github-actions-runtests.yml +0 -0
  50. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/.gitignore +0 -0
  51. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/INSTALL.md +0 -0
  52. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/LICENSE +0 -0
  53. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/USER_GUIDE.md +0 -0
  54. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/docker/Dockerfile +0 -0
  55. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/docker/README.md +0 -0
  56. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/docker/docker-compose.yml +0 -0
  57. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/docker/fastentrypoint.sh +0 -0
  58. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/docs/images/AD-taxDef.png +0 -0
  59. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/docs/images/AD-taxFree.png +0 -0
  60. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/docs/images/AD-taxable.png +0 -0
  61. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/docs/images/Hist_Bequest.png +0 -0
  62. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/docs/images/Hist_Spending.png +0 -0
  63. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/docs/images/MC-tutorial2a.png +0 -0
  64. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/docs/images/MC-tutorial2b.png +0 -0
  65. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/docs/images/OwlUI.png +0 -0
  66. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/docs/images/allocations.png +0 -0
  67. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/docs/images/owl.png +0 -0
  68. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/docs/images/profile.png +0 -0
  69. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/docs/images/ratesCorrelations.png +0 -0
  70. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/docs/images/ratesPlot.png +0 -0
  71. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/docs/images/savingsPlot.png +0 -0
  72. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/docs/images/sourcesPlot.png +0 -0
  73. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/docs/images/spendingPlot.png +0 -0
  74. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/docs/images/taxIncomePlot.png +0 -0
  75. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/docs/images/taxesPlot.png +0 -0
  76. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/docs/owl.pdf +0 -0
  77. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/docs/owl.tex +0 -0
  78. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/examples/case_jack+jill.toml +0 -0
  79. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/examples/case_joe.toml +0 -0
  80. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/examples/case_john+sally.toml +0 -0
  81. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/examples/case_jon+jane.toml +0 -0
  82. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/examples/case_kim+sam-bequest.toml +0 -0
  83. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/examples/case_kim+sam-spending.toml +0 -0
  84. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/examples/jack+jill.xlsx +0 -0
  85. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/examples/joe.xlsx +0 -0
  86. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/examples/john+sally.xlsx +0 -0
  87. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/examples/jon+jane.xlsx +0 -0
  88. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/examples/template.xlsx +0 -0
  89. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/pytest.ini +0 -0
  90. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/src/owlplanner/abcapi.py +0 -0
  91. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/src/owlplanner/data/__init__.py +0 -0
  92. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/src/owlplanner/data/rates.csv +0 -0
  93. /owlplanner-2025.5.5/src/owlplanner/logging.py → /owlplanner-2025.5.12/src/owlplanner/mylogging.py +0 -0
  94. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/src/owlplanner/progress.py +0 -0
  95. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/src/owlplanner/tax2025.py +0 -0
  96. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/src/owlplanner/utils.py +0 -0
  97. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/tests/test_regressions.py +0 -0
  98. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/tests/test_repro.py +0 -0
  99. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/tests/test_toml_cases.py +0 -0
  100. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/tests/test_ui_asset_allocation.py +0 -0
  101. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/tests/test_ui_compare_summaries.py +0 -0
  102. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/tests/test_ui_sskeys.py +0 -0
  103. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/tests/test_units.py +0 -0
  104. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/ui/Asset_Allocation.py +0 -0
  105. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/ui/Fixed_Income.py +0 -0
  106. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/ui/Logs.py +0 -0
  107. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/ui/README.md +0 -0
  108. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/ui/Worksheets.py +0 -0
  109. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/ui/__init__.py +0 -0
  110. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/ui/progress.py +0 -0
  111. {owlplanner-2025.5.5 → owlplanner-2025.5.12}/ui/tomlexamples.py +0 -0
@@ -30,4 +30,4 @@
30
30
  "forwardPorts": [
31
31
  8501
32
32
  ]
33
- }
33
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: owlplanner
3
- Version: 2025.5.5
3
+ Version: 2025.5.12
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
@@ -695,6 +695,7 @@ Requires-Dist: matplotlib
695
695
  Requires-Dist: numpy
696
696
  Requires-Dist: openpyxl
697
697
  Requires-Dist: pandas
698
+ Requires-Dist: plotly
698
699
  Requires-Dist: scipy
699
700
  Requires-Dist: seaborn
700
701
  Requires-Dist: streamlit
@@ -711,15 +712,17 @@ Description-Content-Type: text/markdown
711
712
  -------------------------------------------------------------------------------------
712
713
 
713
714
  ### TL;DR
714
- Owl is a retirement planning tool that uses a linear programming optimization algorithm
715
- to provide guidance on retirement decisions, including Roth conversions.
715
+ Owl is a financial retirement planning tool that uses a linear programming
716
+ optimization algorithm to provide guidance on retirement decisions
717
+ such as contributions, withdrawals, Roth conversions, and more.
716
718
  Users can select varying return rates to perform historical back testing,
717
719
  stochastic rates for performing Monte Carlo analyses,
718
720
  or fixed rates either derived from historical averages, or set by the user.
719
721
 
720
722
  There are a few ways to run Owl:
721
723
 
722
- - Run Owl directly on the Streamlit Community Server at [owlplanner.streamlit.app](https://owlplanner.streamlit.app).
724
+ - Run Owl directly on the Streamlit Community Server at
725
+ [owlplanner.streamlit.app](https://owlplanner.streamlit.app).
723
726
 
724
727
  - Run locally on your computer using a Docker image.
725
728
  Follow these [instructions](docker/README.md) for this option.
@@ -729,7 +732,7 @@ Follow these [instructions](INSTALL.md) to install Owl from the source code and
729
732
 
730
733
  -------------------------------------------------------------------------------------
731
734
  ## Overview
732
- This package is a retirement modeling framework for exploring the sensitivity of retirement financial decisions.
735
+ This package is a modeling framework for exploring the sensitivity of retirement financial decisions.
733
736
  Strictly speaking, it is not a planning tool, but more an environment for exploring *what if* scenarios.
734
737
  It provides different realizations of a financial strategy through the rigorous
735
738
  mathematical optimization of relevant decision variables. Two major objective goals can be set: either
@@ -8,15 +8,17 @@
8
8
  -------------------------------------------------------------------------------------
9
9
 
10
10
  ### TL;DR
11
- Owl is a retirement planning tool that uses a linear programming optimization algorithm
12
- to provide guidance on retirement decisions, including Roth conversions.
11
+ Owl is a financial retirement planning tool that uses a linear programming
12
+ optimization algorithm to provide guidance on retirement decisions
13
+ such as contributions, withdrawals, Roth conversions, and more.
13
14
  Users can select varying return rates to perform historical back testing,
14
15
  stochastic rates for performing Monte Carlo analyses,
15
16
  or fixed rates either derived from historical averages, or set by the user.
16
17
 
17
18
  There are a few ways to run Owl:
18
19
 
19
- - Run Owl directly on the Streamlit Community Server at [owlplanner.streamlit.app](https://owlplanner.streamlit.app).
20
+ - Run Owl directly on the Streamlit Community Server at
21
+ [owlplanner.streamlit.app](https://owlplanner.streamlit.app).
20
22
 
21
23
  - Run locally on your computer using a Docker image.
22
24
  Follow these [instructions](docker/README.md) for this option.
@@ -26,7 +28,7 @@ Follow these [instructions](INSTALL.md) to install Owl from the source code and
26
28
 
27
29
  -------------------------------------------------------------------------------------
28
30
  ## Overview
29
- This package is a retirement modeling framework for exploring the sensitivity of retirement financial decisions.
31
+ This package is a modeling framework for exploring the sensitivity of retirement financial decisions.
30
32
  Strictly speaking, it is not a planning tool, but more an environment for exploring *what if* scenarios.
31
33
  It provides different realizations of a financial strategy through the rigorous
32
34
  mathematical optimization of relevant decision variables. Two major objective goals can be set: either
@@ -14,6 +14,17 @@
14
14
  "## John and Sally (a case from Eric Sajdak)"
15
15
  ]
16
16
  },
17
+ {
18
+ "cell_type": "code",
19
+ "execution_count": null,
20
+ "id": "5cb2c2a1-6f77-41bf-a22d-42863c756eeb",
21
+ "metadata": {},
22
+ "outputs": [],
23
+ "source": [
24
+ "import sys\n",
25
+ "sys.path.insert(0, \"../src\")"
26
+ ]
27
+ },
17
28
  {
18
29
  "cell_type": "code",
19
30
  "execution_count": null,
@@ -29,7 +40,9 @@
29
40
  "source": [
30
41
  "%%time\n",
31
42
  "import owlplanner as owl\n",
43
+ "\n",
32
44
  "plan = owl.Plan(['John', 'Sally'], [1962, 1962], [92, 92], 'john+sally')\n",
45
+ "# plan.setPlotBackend(\"plotly\")\n",
33
46
  "plan.setAccountBalances(taxable=[200, 200], taxDeferred=[750, 750], taxFree=[50, 50])\n",
34
47
  "# Unrealistic empty contributions and wages\n",
35
48
  "plan.readContributions('../examples/john+sally.xlsx')\n",
@@ -15,7 +15,8 @@
15
15
  "metadata": {},
16
16
  "outputs": [],
17
17
  "source": [
18
- "import owlplanner as owl"
18
+ "import sys\n",
19
+ "sys.path.insert(0, \"../src\")"
19
20
  ]
20
21
  },
21
22
  {
@@ -25,7 +26,9 @@
25
26
  "metadata": {},
26
27
  "outputs": [],
27
28
  "source": [
28
- "p = owl.Plan(['Kim', 'Sam'], [1966, 1967], [86, 89], 'kim+sam-spending', verbose=True)"
29
+ "import owlplanner as owl\n",
30
+ "p = owl.Plan(['Kim', 'Sam'], [1966, 1967], [86, 89], 'kim+sam-spending', verbose=True)\n",
31
+ "# p.setPlotBackend(\"plotly\")"
29
32
  ]
30
33
  },
31
34
  {
@@ -81,7 +84,7 @@
81
84
  "metadata": {},
82
85
  "outputs": [],
83
86
  "source": [
84
- "p.readContributions('../examples/template.xlsx')"
87
+ "p.readContributions('../examples/template.xlsx');"
85
88
  ]
86
89
  },
87
90
  {
@@ -126,12 +129,21 @@
126
129
  {
127
130
  "cell_type": "code",
128
131
  "execution_count": null,
129
- "id": "525f22e2-d241-4fa8-bc95-82d758238326",
132
+ "id": "f2542fd7-f087-4597-b9c4-1c3b8fa2e452",
130
133
  "metadata": {},
131
134
  "outputs": [],
132
135
  "source": [
133
136
  "p.setDefaultPlots('today')\n",
134
- "p.showNetSpending()\n",
137
+ "p.showNetSpending()"
138
+ ]
139
+ },
140
+ {
141
+ "cell_type": "code",
142
+ "execution_count": null,
143
+ "id": "525f22e2-d241-4fa8-bc95-82d758238326",
144
+ "metadata": {},
145
+ "outputs": [],
146
+ "source": [
135
147
  "p.showGrossIncome()\n",
136
148
  "p.showTaxes()\n",
137
149
  "p.showSources()\n",