├── ipywidget-fv.gif ├── ipywidget-fv.mov ├── NOAA_TAVG.csv ├── README.md ├── ARIMA └── Time_Series.Rmd ├── PV_Liabilities.ipynb ├── Financial_Concepts-I.ipynb ├── cc_approvals.data ├── Credit-Card-Approvals.ipynb ├── bank_teller_Cris.ipynb └── ipywidgets-fv.ipynb /ipywidget-fv.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ssilvacris/Finance-Projects/HEAD/ipywidget-fv.gif -------------------------------------------------------------------------------- /ipywidget-fv.mov: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ssilvacris/Finance-Projects/HEAD/ipywidget-fv.mov -------------------------------------------------------------------------------- /NOAA_TAVG.csv: -------------------------------------------------------------------------------- 1 | DATE,TAVG 2 | 1870,53.8 3 | 1871,51.3 4 | 1872,51.3 5 | 1873,50.9 6 | 1874,51.3 7 | 1875,49.4 8 | 1876,51.9 9 | 1877,52.8 10 | 1878,53.6 11 | 1879,52.1 12 | 1880,52.9 13 | 1881,52.2 14 | 1882,51.7 15 | 1883,50.2 16 | 1884,52.2 17 | 1885,50.6 18 | 1886,51.3 19 | 1887,50.9 20 | 1888,49.4 21 | 1889,52.8 22 | 1890,53 23 | 1891,54.1 24 | 1892,52.2 25 | 1893,50.7 26 | 1894,52.9 27 | 1895,53 28 | 1896,53.6 29 | 1897,53.6 30 | 1898,55.1 31 | 1899,53.9 32 | 1900,54.2 33 | 1901,52.4 34 | 1902,53 35 | 1903,53 36 | 1904,50.9 37 | 1905,53.4 38 | 1906,55 39 | 1907,52.9 40 | 1908,55 41 | 1909,53.7 42 | 1910,53.5 43 | 1911,53.4 44 | 1912,52.7 45 | 1913,54.9 46 | 1914,51.9 47 | 1915,53.4 48 | 1916,52.2 49 | 1917,50.7 50 | 1918,53.1 51 | 1919,53.8 52 | 1920,52.2 53 | 1921,54.8 54 | 1922,53.5 55 | 1923,52.8 56 | 1924,51.9 57 | 1925,53.4 58 | 1926,51.2 59 | 1927,53.4 60 | 1928,53.5 61 | 1929,54.1 62 | 1930,54.5 63 | 1931,55.8 64 | 1932,55.1 65 | 1933,54.2 66 | 1934,52.9 67 | 1935,53 68 | 1936,53.4 69 | 1937,54.4 70 | 1938,55.2 71 | 1939,54.6 72 | 1940,51.9 73 | 1941,54.9 74 | 1942,54 75 | 1943,53.7 76 | 1944,54.6 77 | 1945,54.1 78 | 1946,55.3 79 | 1947,53.7 80 | 1948,54 81 | 1949,56.9 82 | 1950,53.6 83 | 1951,54.9 84 | 1952,55.8 85 | 1953,57 86 | 1954,54.9 87 | 1955,54.6 88 | 1956,53.5 89 | 1957,55.4 90 | 1958,52.5 91 | 1959,55.4 92 | 1960,54 93 | 1961,55 94 | 1962,53.4 95 | 1963,53.5 96 | 1964,54.5 97 | 1965,54.2 98 | 1966,55 99 | 1967,52.9 100 | 1968,54 101 | 1969,54.8 102 | 1970,54.2 103 | 1971,55.2 104 | 1972,53.8 105 | 1973,56 106 | 1974,54.7 107 | 1975,54.9 108 | 1976,53.3 109 | 1977,54.3 110 | 1978,52.9 111 | 1979,55.7 112 | 1980,54.9 113 | 1981,55.2 114 | 1982,54.8 115 | 1983,56 116 | 1984,55.4 117 | 1985,55.5 118 | 1986,55.2 119 | 1987,55.1 120 | 1988,54.8 121 | 1989,53.9 122 | 1990,57.2 123 | 1991,57.2 124 | 1992,53.9 125 | 1993,55.5 126 | 1994,55.2 127 | 1995,55.3 128 | 1996,53.7 129 | 1997,54.3 130 | 1998,57.1 131 | 1999,56.5 132 | 2000,53.8 133 | 2001,56.2 134 | 2002,56.4 135 | 2003,53.4 136 | 2004,54.5 137 | 2005,55.7 138 | 2006,56.8 139 | 2007,55 140 | 2008,55.3 141 | 2009,54 142 | 2010,56.7 143 | 2011,56.4 144 | 2012,57.3 145 | 2013,55.3 146 | 2014,54.4 147 | 2015,56.7 148 | 2016,57.2 149 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Finance Projects 2 | This repository contains projects in Python and R, mainly in the area of finance, financial modeling and statistics. 3 | 4 | 5 | ## [Python and Ipywidgets to visualize future value with different tax rate](ipywidget-fv.gif) 6 | 7 | Programming I create to show how to use Ipywidgets to visualize future value with different tax rates. You can see my article [here](https://bit.ly/352l9mc). 8 | ![Future Value](ipywidget-fv.mov) 9 | 10 | ## [Time Series - ARIMA](https://github.com/ssilvacris/Finance-Projects/tree/master/ARIMA) 11 | you can see the project [here](https://nbviewer.jupyter.org/github/ssilvacris/Finance-Projects/blob/master/ARIMA/Time_Series.nb.html) 12 | 13 | The project shows important statiscal characteristics of a financial time series and how to forecast stock price movements. 14 | 15 | 16 | ## [Visualizing Tech Stocks](https://github.com/ssilvacris/Finance-Projects/blob/master/visualizing_tech_stocks_1.ipynb) 17 | 18 | The Visualizing Tech Stocks is a project from Codecademy site. In this project the top 5 highest valued technology stocks were analyzed and visualized , as of the end of the first half of 2019: Microsoft (NASDAQ:MSFT), Amazon (NASDAQ:AMZN), Apple (NASDAQ:AAPL), Alphabet (NASDAQ:GOOG), and Facebook (NASDAQ:FB). 19 | 20 | ## [Credit Card Approval](https://github.com/ssilvacris/Finance-Projects/blob/master/Credit-Card-Approvals.ipynb) 21 | 22 | A project about automatic credit card approval predictor using machine learning techniques. I did this project on DataCamp platform. 23 | 24 | ## [Finance- bank teller](https://github.com/ssilvacris/Finance-Projects/blob/master/bank_teller_Cris.ipynb) 25 | 26 | A system that emulates the transactions that are carried out by either a bank teller or an ATM machine. 27 | I did this project on codecademy site. It was implemented the following five features: 28 | 29 | Return the balance that the customer has in the bank 30 | Allow the customer to make a deposit to their bank account 31 | Allow the customer to make a withdrawal to their bank account 32 | Allow the customer to decide whether to make the transaction with checking or savings account 33 | Allow the customer to make a transfer between savings and checking account 34 | 35 | 36 | ## [Statistical Thinking in Python](https://github.com/ssilvacris/Finance-Projects/blob/master/Statistical_Python.ipynb) 37 | 38 | This project came from DataCamp course plataform. 39 | 40 | ## [Financial Concepts](https://github.com/ssilvacris/Finance-Projects/blob/master/Financial_Concepts-I.ipynb) 41 | 42 | Some codes about basic principles of finance essential for making important financial decisions. 43 | The examples are from DataCamp course. 44 | 45 | 46 | ## [Present Value of Liabilities and Funding Ratio](https://github.com/ssilvacris/Finance-Projects/blob/master/PV_Liabilities.ipynb) 47 | 48 | Programming from Coursera course that presents how to discount future liabilities to compute the present value of future liabilities, and measure the funding ratio. 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /ARIMA/Time_Series.Rmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Time Series - AR, MA, ARMA & ARIMA" 3 | output: html_notebook 4 | --- 5 | ```{r} 6 | install.packages("devtools") 7 | ``` 8 | ```{r} 9 | install.packages("forecast") 10 | ``` 11 | 12 | 13 | ```{r} 14 | #load packages 15 | library(IRdisplay) 16 | library(magrittr) 17 | library(tidyverse) 18 | library(scales) 19 | library(gridExtra) 20 | library(forecast) 21 | library(tseries) 22 | library(ggthemes) 23 | ``` 24 | 25 | Load the file 26 | 27 | ```{r} 28 | nflx <- read_csv("NFLX.csv") 29 | head(nflx) 30 | ``` 31 | 32 | 33 | ```{r} 34 | #check class 35 | 36 | class(nflx$Date) 37 | ``` 38 | ```{r} 39 | summary(nflx$Adj_Close) 40 | ``` 41 | 42 | 43 | ## Check for Stationary 44 | ```{r} 45 | #check time series plot 46 | ggplot(nflx, aes(Date, Adj_Close)) + geom_line(colour='blue') + ggtitle("Netflix Closing Stock Prices")+ geom_smooth(method = "lm", formula = y ~ x, colour='black', linetype = "dashed") 47 | 48 | ``` 49 | 50 | 51 | 52 | ```{r} 53 | # check ACF plot 54 | ggAcf(nflx$Adj_Close, type='correlation') 55 | ``` 56 | 57 | 58 | 59 | ```{r} 60 | #run ADF test 61 | adf.test(nflx$Adj_Close) 62 | ``` 63 | 64 | 65 | ## Transforming for Stationary and Identifying Model Parameters 66 | ```{r} 67 | #fit AR model 68 | ar.model <- auto.arima(nflx$Adj_Close, max.d = 0, max.q = 0, allowdrift = T) 69 | ar.model 70 | ``` 71 | 72 | 73 | ```{r} 74 | # fit MA model 75 | ma.model <- auto.arima(nflx$Adj_Close, max.d = 0, max.p = 0, allowdrift = T) 76 | ma.model 77 | ``` 78 | 79 | 80 | ```{r} 81 | #fit ARMA model 82 | arma.model2 <- auto.arima(nflx$Adj_Close, max.d = 0, allowdrift = T) 83 | arma.model2 84 | ``` 85 | 86 | 87 | ```{r} 88 | #fit ARMA model 89 | arma.model <- auto.arima(nflx$Adj_Close, max.d = 0, allowdrift = T) 90 | arma.model 91 | ``` 92 | 93 | 94 | ```{r} 95 | # fit ARIMA model 96 | arima.model <- auto.arima(nflx$Adj_Close, allowdrift = T) 97 | arima.model 98 | ``` 99 | 100 | ## Checking the Residuals of the Model Fit 101 | 102 | ```{r} 103 | # calculate residuals of each model 104 | ar.residual <- resid(ar.model) 105 | ma.residual <- resid(ma.model) 106 | arma.residual <- resid(arma.model) 107 | arima.residual <- resid(arima.model) 108 | ``` 109 | 110 | 111 | ```{r} 112 | # plot PACF of each models residuals 113 | ggAcf(ar.residual, type = 'partial') 114 | ggAcf(ma.residual, type = 'partial') 115 | ggAcf(arma.residual, type = 'partial') 116 | ggAcf(arima.residual, type = 'partial') 117 | ``` 118 | 119 | 120 | ```{r} 121 | #run the Ljung Box test on the residuals 122 | Box.test(ar.residual, type='Ljung-Box', lag=1) 123 | Box.test(ma.residual, type='Ljung-Box', lag=1) 124 | Box.test(arma.residual, type='Ljung-Box', lag=1) 125 | Box.test(arima.residual, type='Ljung-Box', lag=1) 126 | ``` 127 | 128 | ## Making a Forecast of each Model 129 | 130 | ```{r} 131 | # make forecast for each model 132 | ar.forecast <- forecast(ar.model, h=60, level= 90) 133 | ma.forecast <- forecast(ma.model, h=60, level= 90) 134 | arma.forecast <- forecast(arma.model, h=60, level= 90) 135 | arima.forecast <- forecast(arima.model, h=60, level= c(80, 95)) 136 | ``` 137 | 138 | ```{r} 139 | # plot forecast for each model 140 | g1 <- autoplot(ar.forecast) 141 | g2 <- autoplot(ma.forecast) 142 | g3 <- autoplot(arma.forecast) 143 | g4 <- autoplot(arima.forecast) 144 | grid.arrange(g1, g2, g3, g4, nrow=2, ncol=2) 145 | ``` 146 | ```{r} 147 | g5 <- autoplot(arima.forecast) 148 | g5 149 | ``` 150 | 151 | ## Fitting Seasonal Trend Loess (STL) Decomposition Models 152 | ```{r} 153 | # transform to time series object; need to specify frequency 154 | prices.ts <- ts(nflx$Adj_Close, frequency = 12) 155 | ``` 156 | 157 | ```{r} 158 | # fit stl model 159 | stl.model <- stl(prices.ts, s.window = 'periodic') 160 | ``` 161 | 162 | 163 | ```{r} 164 | # plot model fit 165 | autoplot(stl.model) 166 | ``` 167 | 168 | 169 | ```{r} 170 | # make forecast 171 | stl.forecast <- forecast(stl.model, h=60, level=90) 172 | autoplot(stl.forecast) 173 | ``` 174 | 175 | Add a new chunk by clicking the *Insert Chunk* button on the toolbar or by pressing *Cmd+Option+I*. 176 | 177 | When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the *Preview* button or press *Cmd+Shift+K* to preview the HTML file). 178 | 179 | The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike *Knit*, *Preview* does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed. 180 | -------------------------------------------------------------------------------- /PV_Liabilities.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Present Value of Liabilities and Funding Ratio\n", 8 | "\n", 9 | "In this lab session, we'll examine how to discount future liabilities to compute the present value of future liabilities, and measure the funding ratio.\n", 10 | "\n", 11 | "The funding ratio is the ratio of the current value of assets to the present value of the liabilities.\n", 12 | "\n", 13 | "In order to compute the present value, we need to discount the amount of the liability based on the relevant interest rate derived from the yield curve.\n", 14 | "\n", 15 | "For simplicity, we'll assume that the yield curve is flat, and so the interest rate is the same for all horizons.\n", 16 | "\n", 17 | "The present value of a set of liabilities $L$ where each liability $L_i$ is due at time $t_i$ is give by:\n", 18 | "\n", 19 | "$$ PV(L) = \\sum_{i=1}^{k} B(t_i) L_i$$\n", 20 | "\n", 21 | "where $B(t_i)$ is the price of a pure discount bond that pays 1 dollar at time $t_i$\n", 22 | "\n", 23 | "If we assume the yield curve is flat and the annual rate of interest is $r$ then $B(t)$ is given by\n", 24 | "\n", 25 | "$$B(t) = \\frac{1}{(1+r)^t}$$\n", 26 | "\n" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": 1, 32 | "metadata": {}, 33 | "outputs": [], 34 | "source": [ 35 | "import numpy as np\n", 36 | "import pandas as pd\n", 37 | "import edhec_risk_kit_124 as erk\n", 38 | "\n", 39 | "%load_ext autoreload\n", 40 | "%autoreload 2" 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": 2, 46 | "metadata": {}, 47 | "outputs": [], 48 | "source": [ 49 | "def discount(t, r):\n", 50 | " \"\"\"\n", 51 | " Compute the price of a pure discount bond that pays $1 at time t where t is in years and r is the annual interest rate\n", 52 | " \"\"\"\n", 53 | " return (1+r)**(-t)\n" 54 | ] 55 | }, 56 | { 57 | "cell_type": "code", 58 | "execution_count": 3, 59 | "metadata": {}, 60 | "outputs": [ 61 | { 62 | "data": { 63 | "text/plain": [ 64 | "0.7440939148967249" 65 | ] 66 | }, 67 | "execution_count": 3, 68 | "metadata": {}, 69 | "output_type": "execute_result" 70 | } 71 | ], 72 | "source": [ 73 | "b = discount(10, .03)\n", 74 | "b" 75 | ] 76 | }, 77 | { 78 | "cell_type": "markdown", 79 | "metadata": {}, 80 | "source": [ 81 | "You can verify that if you buy that bond today, and hold it for 10 years at an interest rate of 3 percent per year, we will get paid \\$1" 82 | ] 83 | }, 84 | { 85 | "cell_type": "code", 86 | "execution_count": 4, 87 | "metadata": {}, 88 | "outputs": [ 89 | { 90 | "data": { 91 | "text/plain": [ 92 | "1.0" 93 | ] 94 | }, 95 | "execution_count": 4, 96 | "metadata": {}, 97 | "output_type": "execute_result" 98 | } 99 | ], 100 | "source": [ 101 | "b*(1.03**10)" 102 | ] 103 | }, 104 | { 105 | "cell_type": "code", 106 | "execution_count": 5, 107 | "metadata": {}, 108 | "outputs": [], 109 | "source": [ 110 | "def pv(l, r):\n", 111 | " \"\"\"\n", 112 | " Compute the present value of a list of liabilities given by the time (as an index) and amounts\n", 113 | " \"\"\"\n", 114 | " dates = l.index\n", 115 | " discounts = discount(dates, r)\n", 116 | " return (discounts*l).sum()" 117 | ] 118 | }, 119 | { 120 | "cell_type": "markdown", 121 | "metadata": {}, 122 | "source": [ 123 | "Assume that you have 4 liabilities, of 1, 1.5, 2, and 2.5M dollars. Assume the first of these are 3 years away and the subsequent ones are spaced out 6 months apart, i.e. at time 3, 3.5, 4 and 4.5 years from now. Let's compute the present value of the liabilities based on an interest rate of 3% per year.\n", 124 | "\n", 125 | "In an individual investment context, you can think oif liabilities as Goals, such as saving for Life Events such as a down payment for a house, college expenses for your children, or retirement income. In each of these cases, we have a requirement of a cash flow at some point in the future ... anytime you have a future cash requirement, you can think of it as a liability." 126 | ] 127 | }, 128 | { 129 | "cell_type": "code", 130 | "execution_count": 6, 131 | "metadata": {}, 132 | "outputs": [], 133 | "source": [ 134 | "liabilities = pd.Series(data=[1, 1.5, 2, 2.5], index=[3, 3.5, 4, 4.5])" 135 | ] 136 | }, 137 | { 138 | "cell_type": "code", 139 | "execution_count": 7, 140 | "metadata": {}, 141 | "outputs": [ 142 | { 143 | "data": { 144 | "text/plain": [ 145 | "6.233320315080045" 146 | ] 147 | }, 148 | "execution_count": 7, 149 | "metadata": {}, 150 | "output_type": "execute_result" 151 | } 152 | ], 153 | "source": [ 154 | "pv(liabilities, 0.03)" 155 | ] 156 | }, 157 | { 158 | "cell_type": "markdown", 159 | "metadata": {}, 160 | "source": [ 161 | "We can now compute the funding ratio, based on current asset values:" 162 | ] 163 | }, 164 | { 165 | "cell_type": "code", 166 | "execution_count": 8, 167 | "metadata": {}, 168 | "outputs": [], 169 | "source": [ 170 | "def funding_ratio(assets, liabilities, r):\n", 171 | " \"\"\"\n", 172 | " Computes the funding ratio of a series of liabilities, based on an interest rate and current value of assets\n", 173 | " \"\"\"\n", 174 | " return assets/pv(liabilities, r)\n" 175 | ] 176 | }, 177 | { 178 | "cell_type": "code", 179 | "execution_count": 9, 180 | "metadata": {}, 181 | "outputs": [ 182 | { 183 | "data": { 184 | "text/plain": [ 185 | "0.8021407126958777" 186 | ] 187 | }, 188 | "execution_count": 9, 189 | "metadata": {}, 190 | "output_type": "execute_result" 191 | } 192 | ], 193 | "source": [ 194 | "funding_ratio(5, liabilities, 0.03)" 195 | ] 196 | }, 197 | { 198 | "cell_type": "markdown", 199 | "metadata": {}, 200 | "source": [ 201 | "Now assume interest rates go down to 2% ... let's recompute the funding ratio:" 202 | ] 203 | }, 204 | { 205 | "cell_type": "code", 206 | "execution_count": 10, 207 | "metadata": {}, 208 | "outputs": [ 209 | { 210 | "data": { 211 | "text/plain": [ 212 | "0.7720304366941648" 213 | ] 214 | }, 215 | "execution_count": 10, 216 | "metadata": {}, 217 | "output_type": "execute_result" 218 | } 219 | ], 220 | "source": [ 221 | "funding_ratio(5, liabilities, 0.02)" 222 | ] 223 | }, 224 | { 225 | "cell_type": "markdown", 226 | "metadata": {}, 227 | "source": [ 228 | "We can examine the effect of interest rates on funding ratio:\n", 229 | "\n", 230 | "Recall that our liabilities are:" 231 | ] 232 | }, 233 | { 234 | "cell_type": "code", 235 | "execution_count": 11, 236 | "metadata": {}, 237 | "outputs": [ 238 | { 239 | "data": { 240 | "text/plain": [ 241 | "3.0 1.0\n", 242 | "3.5 1.5\n", 243 | "4.0 2.0\n", 244 | "4.5 2.5\n", 245 | "dtype: float64" 246 | ] 247 | }, 248 | "execution_count": 11, 249 | "metadata": {}, 250 | "output_type": "execute_result" 251 | } 252 | ], 253 | "source": [ 254 | "liabilities" 255 | ] 256 | }, 257 | { 258 | "cell_type": "code", 259 | "execution_count": 12, 260 | "metadata": {}, 261 | "outputs": [ 262 | { 263 | "data": { 264 | "application/vnd.jupyter.widget-view+json": { 265 | "model_id": "f49162e0a7674d9ba396f5b070a2588a", 266 | "version_major": 2, 267 | "version_minor": 0 268 | }, 269 | "text/plain": [ 270 | "interactive(children=(IntSlider(value=5, description='assets', max=10, min=1), FloatSlider(value=0.1, descript…" 271 | ] 272 | }, 273 | "metadata": {}, 274 | "output_type": "display_data" 275 | } 276 | ], 277 | "source": [ 278 | "import ipywidgets as widgets\n", 279 | "from IPython.display import display\n", 280 | "%matplotlib inline\n", 281 | "\n", 282 | "def show_funding_ratio(assets, r):\n", 283 | " fr = funding_ratio(assets, liabilities, r)\n", 284 | " print(f'{fr*100:.2f}%')\n", 285 | " \n", 286 | "controls = widgets.interactive(show_funding_ratio,\n", 287 | " assets=widgets.IntSlider(min=1, max=10, step=1, value=5),\n", 288 | " r=(0, .20, .01)\n", 289 | ")\n", 290 | "display(controls)" 291 | ] 292 | }, 293 | { 294 | "cell_type": "markdown", 295 | "metadata": {}, 296 | "source": [ 297 | "As the illustration above shows, even if your assets do not go down in value, cash can be a risky asset if you think about the funding ratio rather than the asset value. Even though cash is a \"safe asset\" in the sense that the asset value does not go down, cash can be a very risky asset because the value of the liabilities goes up when interest rates go down. Therefore, if you think about your savings in terms of funding ratio (i.e. how much money do you have compared to what you need) then cash is a risky asset and can result in a decline in your funding ratio.\n", 298 | "\n", 299 | "We'll investigate this and solutions to this in the next session, but for now, add the `discount`, `pv`, and `funding_ratio` functions to the `edhec_risk_kit.py` file.\n", 300 | "\n", 301 | "```python\n", 302 | "def discount(t, r):\n", 303 | " \"\"\"\n", 304 | " Compute the price of a pure discount bond that pays a dollar at time t where t is in years and r is the annual interest rate\n", 305 | " \"\"\"\n", 306 | " return (1+r)**(-t)\n", 307 | "\n", 308 | "def pv(l, r):\n", 309 | " \"\"\"\n", 310 | " Compute the present value of a list of liabilities given by the time (as an index) and amounts\n", 311 | " \"\"\"\n", 312 | " dates = l.index\n", 313 | " discounts = discount(dates, r)\n", 314 | " return (discounts*l).sum()\n", 315 | "\n", 316 | "def funding_ratio(assets, liabilities, r):\n", 317 | " \"\"\"\n", 318 | " Computes the funding ratio of a series of liabilities, based on an interest rate and current value of assets\n", 319 | " \"\"\"\n", 320 | " return assets/pv(liabilities, r)\n", 321 | "```\n" 322 | ] 323 | }, 324 | { 325 | "cell_type": "code", 326 | "execution_count": null, 327 | "metadata": {}, 328 | "outputs": [], 329 | "source": [] 330 | } 331 | ], 332 | "metadata": { 333 | "kernelspec": { 334 | "display_name": "Python 3", 335 | "language": "python", 336 | "name": "python3" 337 | }, 338 | "language_info": { 339 | "codemirror_mode": { 340 | "name": "ipython", 341 | "version": 3 342 | }, 343 | "file_extension": ".py", 344 | "mimetype": "text/x-python", 345 | "name": "python", 346 | "nbconvert_exporter": "python", 347 | "pygments_lexer": "ipython3", 348 | "version": "3.7.4" 349 | } 350 | }, 351 | "nbformat": 4, 352 | "nbformat_minor": 4 353 | } 354 | -------------------------------------------------------------------------------- /Financial_Concepts-I.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## Introduction to Financial Concepts in Python" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "### Growth and Rate of Return\n", 15 | "\n", 16 | "Growth and Rate of Return are two concepts that are ubiquitous throughout the financial world. Recall that the cumulative returns from investing $100 in an asset that grows at 5% per year, over a 2 year period can be calculated as:\n", 17 | "\n", 18 | "100∗(1+0.05)**2\n", 19 | "\n", 20 | "1. Calculate the future value (cumulative return) of a $100 investment which grows at a rate of 6% per year for 30 years in a row and assign it to future_value." 21 | ] 22 | }, 23 | { 24 | "cell_type": "code", 25 | "execution_count": 1, 26 | "metadata": {}, 27 | "outputs": [ 28 | { 29 | "name": "stdout", 30 | "output_type": "stream", 31 | "text": [ 32 | "Future Value of Investment: 574.35\n" 33 | ] 34 | } 35 | ], 36 | "source": [ 37 | "# Calculate the future value of the investment and print it out\n", 38 | "future_value = 100* (1+0.06)**30\n", 39 | "print(\"Future Value of Investment: \" + str(round(future_value, 2)))" 40 | ] 41 | }, 42 | { 43 | "cell_type": "markdown", 44 | "metadata": {}, 45 | "source": [ 46 | "### Compound Interest\n", 47 | "\n", 48 | "As you saw in the previous exercise, both time and the rate of return are very important variables when forecasting the future value of an investment.\n", 49 | "\n", 50 | "Another important variable is the number of compounding periods, which can greatly affect compounded returns over time.\n" 51 | ] 52 | }, 53 | { 54 | "cell_type": "code", 55 | "execution_count": 2, 56 | "metadata": {}, 57 | "outputs": [ 58 | { 59 | "name": "stdout", 60 | "output_type": "stream", 61 | "text": [ 62 | "Investment 1: 574.35\n" 63 | ] 64 | } 65 | ], 66 | "source": [ 67 | "# Predefined variables\n", 68 | "initial_investment = 100\n", 69 | "growth_periods = 30\n", 70 | "growth_rate = 0.06\n", 71 | "\n", 72 | "# Calculate the value for the investment compounded once per year\n", 73 | "compound_periods_1 = 1\n", 74 | "investment_1 = initial_investment*(1 + growth_rate / compound_periods_1)**(compound_periods_1*growth_periods)\n", 75 | "print(\"Investment 1: \" + str(round(investment_1, 2)))" 76 | ] 77 | }, 78 | { 79 | "cell_type": "code", 80 | "execution_count": 24, 81 | "metadata": {}, 82 | "outputs": [ 83 | { 84 | "name": "stdout", 85 | "output_type": "stream", 86 | "text": [ 87 | "Investment 1: 574.35\n", 88 | "Investment 1: 574.35\n", 89 | "Investment 2: 596.93\n" 90 | ] 91 | } 92 | ], 93 | "source": [ 94 | "# Predefined variables\n", 95 | "initial_investment = 100\n", 96 | "growth_periods = 30\n", 97 | "growth_rate = 0.06\n", 98 | "\n", 99 | "# Calculate the value for the investment compounded once per year\n", 100 | "compound_periods_1 = 1\n", 101 | "investment_1 = initial_investment*(1 + growth_rate / compound_periods_1)**(compound_periods_1*growth_periods)\n", 102 | "print(\"Investment 1: \" + str(round(investment_1, 2)))\n", 103 | "\n", 104 | "# Calculate the value for the investment compounded quarterly\n", 105 | "compound_periods_2 = 4\n", 106 | "investment_2 = initial_investment*(1 + growth_rate / compound_periods_2)**(compound_periods_2*growth_periods)\n", 107 | "print(\"Investment 1: \" + str(round(investment_1, 2)))\n", 108 | "print(\"Investment 2: \" + str(round(investment_2, 2)))\n", 109 | "\n" 110 | ] 111 | }, 112 | { 113 | "cell_type": "markdown", 114 | "metadata": {}, 115 | "source": [ 116 | "###" 117 | ] 118 | }, 119 | { 120 | "cell_type": "code", 121 | "execution_count": 4, 122 | "metadata": {}, 123 | "outputs": [ 124 | { 125 | "name": "stdout", 126 | "output_type": "stream", 127 | "text": [ 128 | "Future value: 59.87\n", 129 | "Discount factor: 1.67\n", 130 | "Initial value: 100.0\n" 131 | ] 132 | } 133 | ], 134 | "source": [ 135 | "# Calculate the future value\n", 136 | "initial_investment = 100\n", 137 | "growth_rate = -0.05\n", 138 | "growth_periods = 10\n", 139 | "future_value = initial_investment*(1+growth_rate)**growth_periods\n", 140 | "print(\"Future value: \" + str(round(future_value, 2)))\n", 141 | "\n", 142 | "# Calculate the discount factor\n", 143 | "discount_factor = 1/((1 + growth_rate)**(growth_periods))\n", 144 | "print(\"Discount factor: \" + str(round(discount_factor, 2)))\n", 145 | "\n", 146 | "# Derive the initial value of the investment\n", 147 | "initial_investment_again = future_value*discount_factor\n", 148 | "print(\"Initial value: \" + str(round(initial_investment_again, 2)))" 149 | ] 150 | }, 151 | { 152 | "cell_type": "markdown", 153 | "metadata": {}, 154 | "source": [ 155 | "### Present Value\n", 156 | "\n", 157 | "Luckily for you, there is a module called numpy which contains many functions which will make your life much easier when working with financial values.\n", 158 | "\n", 159 | "The .pv(rate, nper, pmt, fv) function, for example, allows you to calculate the present value of an investment as before with a few simple parameters:\n", 160 | "\n", 161 | "rate: The rate of return of the investment\n", 162 | "nper: The lifespan of the investment\n", 163 | "pmt: The (fixed) payment at the beginning or end of each period (which is 0 in our example)\n", 164 | "fv: The future value of the investment\n", 165 | "You can use this formula in many ways. For example, you can calculate the present value of future investments in today's dollars.\n", 166 | "\n", 167 | "- Instructions:\n", 168 | "1. Import numpy as np.\n", 169 | "\n", 170 | "2. Using Numpy's .pv() function, compute the present value of an investment which will yield $10,000 15 years from now at an inflation rate of 3% per year and assign it to investment_1.\n", 171 | "\n", 172 | "3. Compute the present value of the same investment, but with a time horizon of only 10 years and an inflation rate of 5%, assigning it to investment_2.\n" 173 | ] 174 | }, 175 | { 176 | "cell_type": "code", 177 | "execution_count": 25, 178 | "metadata": {}, 179 | "outputs": [ 180 | { 181 | "name": "stdout", 182 | "output_type": "stream", 183 | "text": [ 184 | "Investment 1 is worth 6418.62 in today's dollars\n", 185 | "Investment 2 is worth 6139.13 in today's dollars\n" 186 | ] 187 | } 188 | ], 189 | "source": [ 190 | "# Calculating the exercise with Numpy Financial\n", 191 | "import numpy as np\n", 192 | "import numpy_financial as npf\n", 193 | "# Calculate investment_1\n", 194 | "investment_1 = npf.pv(rate=.03, nper=15, pmt=0, fv=10000)\n", 195 | "\n", 196 | "# Note that the present value returned is negative, so we multiply the result by -1\n", 197 | "print(\"Investment 1 is worth \" + str(round(-investment_1, 2)) + \" in today's dollars\")\n", 198 | "\n", 199 | "# Calculate investment_2\n", 200 | "investment_2 = npf.pv(rate=.05, nper=10, pmt=0, fv=10000)\n", 201 | "print(\"Investment 2 is worth \" + str(round(-investment_2, 2)) + \" in today's dollars\")\n" 202 | ] 203 | }, 204 | { 205 | "cell_type": "markdown", 206 | "metadata": {}, 207 | "source": [ 208 | "### Future Value\n", 209 | "\n", 210 | "The numpy module also contains a similar function, .fv(rate, nper, pmt, pv), which allows you to calculate the future value of an investment as before with a few simple parameters:\n", 211 | "\n", 212 | "rate: The rate of return of the investment\n", 213 | "nper: The lifespan of the investment\n", 214 | "pmt: The (fixed) payment at the beginning or end of each period (which is 0 in our example)\n", 215 | "pv: The present value of the investment\n", 216 | "It is important to note that in this function call, you must pass a negative value into the pv parameter if it represents a negative cash flow (cash going out). In other words, if you were to compute the future value of an investment, requiring an up-front cash payment, you would need to pass a negative value to the pv parameter in the .fv() function." 217 | ] 218 | }, 219 | { 220 | "cell_type": "markdown", 221 | "metadata": {}, 222 | "source": [ 223 | "- Instructions :\n", 224 | "\n", 225 | "1. Using Numpy's .fv() function, calculate the future value of a $10,000 investment returning 5% per year for 15 years and assign it to investment_1.\n", 226 | "\n", 227 | "2. Calculate the future value of a $10,000 investment returning 8% per year for 15 years and assign it to investment_2." 228 | ] 229 | }, 230 | { 231 | "cell_type": "code", 232 | "execution_count": 9, 233 | "metadata": {}, 234 | "outputs": [ 235 | { 236 | "name": "stdout", 237 | "output_type": "stream", 238 | "text": [ 239 | "Investment 1 will yield a total of $20789.28 in 15 years\n", 240 | "Investment 2 will yield a total of $31721.69 in 15 years\n" 241 | ] 242 | } 243 | ], 244 | "source": [ 245 | "# Calculate investment_1\n", 246 | "investment_1 = npf.fv(rate=.05, nper=15, pmt=0, pv=-10000)\n", 247 | "print(\"Investment 1 will yield a total of $\" + str(round(investment_1, 2)) + \" in 15 years\")\n", 248 | "\n", 249 | "# Calculate investment_2\n", 250 | "investment_2 = npf.fv(rate=.08, nper=15, pmt=0, pv=-10000)\n", 251 | "print(\"Investment 2 will yield a total of $\" + str(round(investment_2, 2)) + \" in 15 years\")" 252 | ] 253 | }, 254 | { 255 | "cell_type": "markdown", 256 | "metadata": {}, 257 | "source": [ 258 | "### Adjusting Future Values for Inflation\n", 259 | "\n", 260 | "You can now put together what you learned in the previous exercises by following a simple methodology:\n", 261 | "\n", 262 | "First, forecast the future value of an investment given a rate of return\n", 263 | "Second, discount the future value of the investment by a projected inflation rate\n", 264 | "The methodology above will use both the .fv() and .pv() functions to arrive at the projected value of a given investment in today's dollars, adjusted for inflation.\n", 265 | "\n", 266 | "- Instructions:\n", 267 | "\n", 268 | "1. Calculate the future value of a $10,000 investment returning 8% per year for 10 years using .fv() and assign it to investment_1.\n", 269 | "\n", 270 | "2. Calculate the inflation-adjusted present value of investment_1, using an inflation rate of 3% per year and assign it to investment_1_discounted." 271 | ] 272 | }, 273 | { 274 | "cell_type": "code", 275 | "execution_count": 11, 276 | "metadata": {}, 277 | "outputs": [ 278 | { 279 | "name": "stdout", 280 | "output_type": "stream", 281 | "text": [ 282 | "Investment 1 will yield a total of $21589.25 in 10 years\n", 283 | "After adjusting for inflation, investment 1 is worth $16064.43 in today's dollars\n" 284 | ] 285 | } 286 | ], 287 | "source": [ 288 | "# Calculate investment_1\n", 289 | "investment_1 = npf.fv(rate=0.08, nper=10, pmt=0, pv=-10000)\n", 290 | "print(\"Investment 1 will yield a total of $\" + str(round(investment_1, 2)) + \" in 10 years\")\n", 291 | "\n", 292 | "# Calculate investment_2\n", 293 | "investment_1_discounted = npf.pv(rate=0.03, nper=10, pmt=0, fv=investment_1)\n", 294 | "print(\"After adjusting for inflation, investment 1 is worth $\" + str(round(-investment_1_discounted, 2)) + \" in today's dollars\")" 295 | ] 296 | }, 297 | { 298 | "cell_type": "markdown", 299 | "metadata": {}, 300 | "source": [ 301 | "### Discounting Cash Flows\n", 302 | "\n", 303 | "You can use numpy's net present value function numpy.npv(rate, values) to calculate the net present value of a series of cash flows. You can create these cash flows by using a numpy.array([...]) of values.\n", 304 | "\n" 305 | ] 306 | }, 307 | { 308 | "cell_type": "code", 309 | "execution_count": 26, 310 | "metadata": {}, 311 | "outputs": [ 312 | { 313 | "name": "stdout", 314 | "output_type": "stream", 315 | "text": [ 316 | "Investment 1's net present value is $471.71 in today's dollars\n", 317 | "Investment 2's net present value is $454.6 in today's dollars\n" 318 | ] 319 | } 320 | ], 321 | "source": [ 322 | "\n", 323 | "# Predefined array of cash flows\n", 324 | "cash_flows = np.array([100, 100, 100, 100, 100])\n", 325 | "\n", 326 | "# Calculate investment_1\n", 327 | "investment_1 = npf.npv(rate=.03, values=cash_flows)\n", 328 | "print(\"Investment 1's net present value is $\" + str(round(investment_1, 2)) + \" in today's dollars\")\n", 329 | "\n", 330 | "# Calculate investment_2\n", 331 | "investment_2 = npf.npv(rate=.05, values=cash_flows)\n", 332 | "print(\"Investment 2's net present value is $\" + str(round(investment_2, 2)) + \" in today's dollars\")\n" 333 | ] 334 | }, 335 | { 336 | "cell_type": "markdown", 337 | "metadata": {}, 338 | "source": [ 339 | "### Initial Project Costs\n", 340 | "\n", 341 | "The numpy.npv(rate, values) function is very powerful because it allows you to pass in both positive and negative values.\n", 342 | "\n", 343 | "- Instructions:\n", 344 | "1. Create a numpy array of the cash flow values for project 1, assigning it to cash_flows_1, and then do the same for project 2, assigning the values to cash_flows_2.\n", 345 | "\n", 346 | "2. Calculate the net present value of both projects 1 and 2 assuming a 3% inflation rate.\n" 347 | ] 348 | }, 349 | { 350 | "cell_type": "code", 351 | "execution_count": 20, 352 | "metadata": {}, 353 | "outputs": [ 354 | { 355 | "name": "stdout", 356 | "output_type": "stream", 357 | "text": [ 358 | "The net present value of Investment 1 is worth $665.54 in today's dollars\n", 359 | "The net present value of Investment 2 is worth $346.7 in today's dollars\n" 360 | ] 361 | } 362 | ], 363 | "source": [ 364 | "# Create an array of cash flows for project 1\n", 365 | "cash_flows_1 = np.array([-250, 100, 200, 300, 400])\n", 366 | "\n", 367 | "# Create an array of cash flows for project 2\n", 368 | "cash_flows_2 = np.array([-250, 300, -250, 300, 300])\n", 369 | "\n", 370 | "\n", 371 | "# Calculate the net present value of project 1\n", 372 | "investment_1 = npf.npv(rate=0.03, values=cash_flows_1)\n", 373 | "\n", 374 | "print(\"The net present value of Investment 1 is worth $\" + str(round(investment_1, 2)) + \" in today's dollars\")\n", 375 | "\n", 376 | "# Calculate the net present value of project 2\n", 377 | "investment_2 = npf.npv(rate=0.03, values=cash_flows_2)\n", 378 | "print(\"The net present value of Investment 2 is worth $\" + str(round(investment_2, 2)) + \" in today's dollars\")" 379 | ] 380 | }, 381 | { 382 | "cell_type": "markdown", 383 | "metadata": {}, 384 | "source": [ 385 | "### Diminishing Cash Flows\n", 386 | "\n", 387 | "Remember how compounded returns grow rapidly over time? Well, it works in the reverse, too. Compounded discount factors over time will quickly shrink a number towards zero.\n" 388 | ] 389 | }, 390 | { 391 | "cell_type": "code", 392 | "execution_count": 27, 393 | "metadata": {}, 394 | "outputs": [ 395 | { 396 | "name": "stdout", 397 | "output_type": "stream", 398 | "text": [ 399 | "Investment 1 is worth $41.2 in today's dollars\n", 400 | "Investment 2 is worth $22.81 in today's dollars\n" 401 | ] 402 | } 403 | ], 404 | "source": [ 405 | "# Calculate investment_1\n", 406 | "investment_1 = npf.pv(rate=.03, nper=30, pmt=0, fv=100)\n", 407 | "print(\"Investment 1 is worth $\" + str(round(-investment_1, 2)) + \" in today's dollars\")\n", 408 | "\n", 409 | "# Calculate investment_2\n", 410 | "investment_2 = npf.pv(rate=.03, nper=50, pmt=0, fv=100)\n", 411 | "print(\"Investment 2 is worth $\" + str(round(-investment_2, 2)) + \" in today's dollars\")\n" 412 | ] 413 | }, 414 | { 415 | "cell_type": "code", 416 | "execution_count": null, 417 | "metadata": {}, 418 | "outputs": [], 419 | "source": [] 420 | } 421 | ], 422 | "metadata": { 423 | "kernelspec": { 424 | "display_name": "Python 3", 425 | "language": "python", 426 | "name": "python3" 427 | }, 428 | "language_info": { 429 | "codemirror_mode": { 430 | "name": "ipython", 431 | "version": 3 432 | }, 433 | "file_extension": ".py", 434 | "mimetype": "text/x-python", 435 | "name": "python", 436 | "nbconvert_exporter": "python", 437 | "pygments_lexer": "ipython3", 438 | "version": "3.7.4" 439 | } 440 | }, 441 | "nbformat": 4, 442 | "nbformat_minor": 4 443 | } 444 | -------------------------------------------------------------------------------- /cc_approvals.data: -------------------------------------------------------------------------------- 1 | b,30.83,0,u,g,w,v,1.25,t,t,01,f,g,00202,0,+ 2 | a,58.67,4.46,u,g,q,h,3.04,t,t,06,f,g,00043,560,+ 3 | a,24.50,0.5,u,g,q,h,1.5,t,f,0,f,g,00280,824,+ 4 | b,27.83,1.54,u,g,w,v,3.75,t,t,05,t,g,00100,3,+ 5 | b,20.17,5.625,u,g,w,v,1.71,t,f,0,f,s,00120,0,+ 6 | b,32.08,4,u,g,m,v,2.5,t,f,0,t,g,00360,0,+ 7 | b,33.17,1.04,u,g,r,h,6.5,t,f,0,t,g,00164,31285,+ 8 | a,22.92,11.585,u,g,cc,v,0.04,t,f,0,f,g,00080,1349,+ 9 | b,54.42,0.5,y,p,k,h,3.96,t,f,0,f,g,00180,314,+ 10 | b,42.50,4.915,y,p,w,v,3.165,t,f,0,t,g,00052,1442,+ 11 | b,22.08,0.83,u,g,c,h,2.165,f,f,0,t,g,00128,0,+ 12 | b,29.92,1.835,u,g,c,h,4.335,t,f,0,f,g,00260,200,+ 13 | a,38.25,6,u,g,k,v,1,t,f,0,t,g,00000,0,+ 14 | b,48.08,6.04,u,g,k,v,0.04,f,f,0,f,g,00000,2690,+ 15 | a,45.83,10.5,u,g,q,v,5,t,t,07,t,g,00000,0,+ 16 | b,36.67,4.415,y,p,k,v,0.25,t,t,10,t,g,00320,0,+ 17 | b,28.25,0.875,u,g,m,v,0.96,t,t,03,t,g,00396,0,+ 18 | a,23.25,5.875,u,g,q,v,3.17,t,t,10,f,g,00120,245,+ 19 | b,21.83,0.25,u,g,d,h,0.665,t,f,0,t,g,00000,0,+ 20 | a,19.17,8.585,u,g,cc,h,0.75,t,t,07,f,g,00096,0,+ 21 | b,25.00,11.25,u,g,c,v,2.5,t,t,17,f,g,00200,1208,+ 22 | b,23.25,1,u,g,c,v,0.835,t,f,0,f,s,00300,0,+ 23 | a,47.75,8,u,g,c,v,7.875,t,t,06,t,g,00000,1260,+ 24 | a,27.42,14.5,u,g,x,h,3.085,t,t,01,f,g,00120,11,+ 25 | a,41.17,6.5,u,g,q,v,0.5,t,t,03,t,g,00145,0,+ 26 | a,15.83,0.585,u,g,c,h,1.5,t,t,02,f,g,00100,0,+ 27 | a,47.00,13,u,g,i,bb,5.165,t,t,09,t,g,00000,0,+ 28 | b,56.58,18.5,u,g,d,bb,15,t,t,17,t,g,00000,0,+ 29 | b,57.42,8.5,u,g,e,h,7,t,t,03,f,g,00000,0,+ 30 | b,42.08,1.04,u,g,w,v,5,t,t,06,t,g,00500,10000,+ 31 | b,29.25,14.79,u,g,aa,v,5.04,t,t,05,t,g,00168,0,+ 32 | b,42.00,9.79,u,g,x,h,7.96,t,t,08,f,g,00000,0,+ 33 | b,49.50,7.585,u,g,i,bb,7.585,t,t,15,t,g,00000,5000,+ 34 | a,36.75,5.125,u,g,e,v,5,t,f,0,t,g,00000,4000,+ 35 | a,22.58,10.75,u,g,q,v,0.415,t,t,05,t,g,00000,560,+ 36 | b,27.83,1.5,u,g,w,v,2,t,t,11,t,g,00434,35,+ 37 | b,27.25,1.585,u,g,cc,h,1.835,t,t,12,t,g,00583,713,+ 38 | a,23.00,11.75,u,g,x,h,0.5,t,t,02,t,g,00300,551,+ 39 | b,27.75,0.585,y,p,cc,v,0.25,t,t,02,f,g,00260,500,+ 40 | b,54.58,9.415,u,g,ff,ff,14.415,t,t,11,t,g,00030,300,+ 41 | b,34.17,9.17,u,g,c,v,4.5,t,t,12,t,g,00000,221,+ 42 | b,28.92,15,u,g,c,h,5.335,t,t,11,f,g,00000,2283,+ 43 | b,29.67,1.415,u,g,w,h,0.75,t,t,01,f,g,00240,100,+ 44 | b,39.58,13.915,u,g,w,v,8.625,t,t,06,t,g,00070,0,+ 45 | b,56.42,28,y,p,c,v,28.5,t,t,40,f,g,00000,15,+ 46 | b,54.33,6.75,u,g,c,h,2.625,t,t,11,t,g,00000,284,+ 47 | a,41.00,2.04,y,p,q,h,0.125,t,t,23,t,g,00455,1236,+ 48 | b,31.92,4.46,u,g,cc,h,6.04,t,t,03,f,g,00311,300,+ 49 | b,41.50,1.54,u,g,i,bb,3.5,f,f,0,f,g,00216,0,+ 50 | b,23.92,0.665,u,g,c,v,0.165,f,f,0,f,g,00100,0,+ 51 | a,25.75,0.5,u,g,c,h,0.875,t,f,0,t,g,00491,0,+ 52 | b,26.00,1,u,g,q,v,1.75,t,f,0,t,g,00280,0,+ 53 | b,37.42,2.04,u,g,w,v,0.04,t,f,0,t,g,00400,5800,+ 54 | b,34.92,2.5,u,g,w,v,0,t,f,0,t,g,00239,200,+ 55 | b,34.25,3,u,g,cc,h,7.415,t,f,0,t,g,00000,0,+ 56 | b,23.33,11.625,y,p,w,v,0.835,t,f,0,t,g,00160,300,+ 57 | b,23.17,0,u,g,cc,v,0.085,t,f,0,f,g,00000,0,+ 58 | b,44.33,0.5,u,g,i,h,5,t,f,0,t,g,00320,0,+ 59 | b,35.17,4.5,u,g,x,h,5.75,f,f,0,t,s,00711,0,+ 60 | b,43.25,3,u,g,q,h,6,t,t,11,f,g,00080,0,+ 61 | b,56.75,12.25,u,g,m,v,1.25,t,t,04,t,g,00200,0,+ 62 | b,31.67,16.165,u,g,d,v,3,t,t,09,f,g,00250,730,+ 63 | a,23.42,0.79,y,p,q,v,1.5,t,t,02,t,g,00080,400,+ 64 | a,20.42,0.835,u,g,q,v,1.585,t,t,01,f,g,00000,0,+ 65 | b,26.67,4.25,u,g,cc,v,4.29,t,t,01,t,g,00120,0,+ 66 | b,34.17,1.54,u,g,cc,v,1.54,t,t,01,t,g,00520,50000,+ 67 | a,36.00,1,u,g,c,v,2,t,t,11,f,g,00000,456,+ 68 | b,25.50,0.375,u,g,m,v,0.25,t,t,03,f,g,00260,15108,+ 69 | b,19.42,6.5,u,g,w,h,1.46,t,t,07,f,g,00080,2954,+ 70 | b,35.17,25.125,u,g,x,h,1.625,t,t,01,t,g,00515,500,+ 71 | b,32.33,7.5,u,g,e,bb,1.585,t,f,0,t,s,00420,0,- 72 | b,34.83,4,u,g,d,bb,12.5,t,f,0,t,g,?,0,- 73 | a,38.58,5,u,g,cc,v,13.5,t,f,0,t,g,00980,0,- 74 | b,44.25,0.5,u,g,m,v,10.75,t,f,0,f,s,00400,0,- 75 | b,44.83,7,y,p,c,v,1.625,f,f,0,f,g,00160,2,- 76 | b,20.67,5.29,u,g,q,v,0.375,t,t,01,f,g,00160,0,- 77 | b,34.08,6.5,u,g,aa,v,0.125,t,f,0,t,g,00443,0,- 78 | a,19.17,0.585,y,p,aa,v,0.585,t,f,0,t,g,00160,0,- 79 | b,21.67,1.165,y,p,k,v,2.5,t,t,01,f,g,00180,20,- 80 | b,21.50,9.75,u,g,c,v,0.25,t,f,0,f,g,00140,0,- 81 | b,49.58,19,u,g,ff,ff,0,t,t,01,f,g,00094,0,- 82 | a,27.67,1.5,u,g,m,v,2,t,f,0,f,s,00368,0,- 83 | b,39.83,0.5,u,g,m,v,0.25,t,f,0,f,s,00288,0,- 84 | a,?,3.5,u,g,d,v,3,t,f,0,t,g,00300,0,- 85 | b,27.25,0.625,u,g,aa,v,0.455,t,f,0,t,g,00200,0,- 86 | b,37.17,4,u,g,c,bb,5,t,f,0,t,s,00280,0,- 87 | b,?,0.375,u,g,d,v,0.875,t,f,0,t,s,00928,0,- 88 | b,25.67,2.21,y,p,aa,v,4,t,f,0,f,g,00188,0,- 89 | b,34.00,4.5,u,g,aa,v,1,t,f,0,t,g,00240,0,- 90 | a,49.00,1.5,u,g,j,j,0,t,f,0,t,g,00100,27,- 91 | b,62.50,12.75,y,p,c,h,5,t,f,0,f,g,00112,0,- 92 | b,31.42,15.5,u,g,c,v,0.5,t,f,0,f,g,00120,0,- 93 | b,?,5,y,p,aa,v,8.5,t,f,0,f,g,00000,0,- 94 | b,52.33,1.375,y,p,c,h,9.46,t,f,0,t,g,00200,100,- 95 | b,28.75,1.5,y,p,c,v,1.5,t,f,0,t,g,00000,225,- 96 | a,28.58,3.54,u,g,i,bb,0.5,t,f,0,t,g,00171,0,- 97 | b,23.00,0.625,y,p,aa,v,0.125,t,f,0,f,g,00180,1,- 98 | b,?,0.5,u,g,c,bb,0.835,t,f,0,t,s,00320,0,- 99 | a,22.50,11,y,p,q,v,3,t,f,0,t,g,00268,0,- 100 | a,28.50,1,u,g,q,v,1,t,t,02,t,g,00167,500,- 101 | b,37.50,1.75,y,p,c,bb,0.25,t,f,0,t,g,00164,400,- 102 | b,35.25,16.5,y,p,c,v,4,t,f,0,f,g,00080,0,- 103 | b,18.67,5,u,g,q,v,0.375,t,t,02,f,g,00000,38,- 104 | b,25.00,12,u,g,k,v,2.25,t,t,02,t,g,00120,5,- 105 | b,27.83,4,y,p,i,h,5.75,t,t,02,t,g,00075,0,- 106 | b,54.83,15.5,u,g,e,z,0,t,t,20,f,g,00152,130,- 107 | b,28.75,1.165,u,g,k,v,0.5,t,f,0,f,s,00280,0,- 108 | a,25.00,11,y,p,aa,v,4.5,t,f,0,f,g,00120,0,- 109 | b,40.92,2.25,y,p,x,h,10,t,f,0,t,g,00176,0,- 110 | a,19.75,0.75,u,g,c,v,0.795,t,t,05,t,g,00140,5,- 111 | b,29.17,3.5,u,g,w,v,3.5,t,t,03,t,g,00329,0,- 112 | a,24.50,1.04,y,p,ff,ff,0.5,t,t,03,f,g,00180,147,- 113 | b,24.58,12.5,u,g,w,v,0.875,t,f,0,t,g,00260,0,- 114 | a,33.75,0.75,u,g,k,bb,1,t,t,03,t,g,00212,0,- 115 | b,20.67,1.25,y,p,c,h,1.375,t,t,03,t,g,00140,210,- 116 | a,25.42,1.125,u,g,q,v,1.29,t,t,02,f,g,00200,0,- 117 | b,37.75,7,u,g,q,h,11.5,t,t,07,t,g,00300,5,- 118 | b,52.50,6.5,u,g,k,v,6.29,t,t,15,f,g,00000,11202,+ 119 | b,57.83,7.04,u,g,m,v,14,t,t,06,t,g,00360,1332,+ 120 | a,20.75,10.335,u,g,cc,h,0.335,t,t,01,t,g,00080,50,+ 121 | b,39.92,6.21,u,g,q,v,0.04,t,t,01,f,g,00200,300,+ 122 | b,25.67,12.5,u,g,cc,v,1.21,t,t,67,t,g,00140,258,+ 123 | a,24.75,12.5,u,g,aa,v,1.5,t,t,12,t,g,00120,567,+ 124 | a,44.17,6.665,u,g,q,v,7.375,t,t,03,t,g,00000,0,+ 125 | a,23.50,9,u,g,q,v,8.5,t,t,05,t,g,00120,0,+ 126 | b,34.92,5,u,g,x,h,7.5,t,t,06,t,g,00000,1000,+ 127 | b,47.67,2.5,u,g,m,bb,2.5,t,t,12,t,g,00410,2510,+ 128 | b,22.75,11,u,g,q,v,2.5,t,t,07,t,g,00100,809,+ 129 | b,34.42,4.25,u,g,i,bb,3.25,t,t,02,f,g,00274,610,+ 130 | a,28.42,3.5,u,g,w,v,0.835,t,f,0,f,s,00280,0,+ 131 | b,67.75,5.5,u,g,e,z,13,t,t,01,t,g,00000,0,+ 132 | b,20.42,1.835,u,g,c,v,2.25,t,t,01,f,g,00100,150,+ 133 | a,47.42,8,u,g,e,bb,6.5,t,t,06,f,g,00375,51100,+ 134 | b,36.25,5,u,g,c,bb,2.5,t,t,06,f,g,00000,367,+ 135 | b,32.67,5.5,u,g,q,h,5.5,t,t,12,t,g,00408,1000,+ 136 | b,48.58,6.5,u,g,q,h,6,t,f,0,t,g,00350,0,+ 137 | b,39.92,0.54,y,p,aa,v,0.5,t,t,03,f,g,00200,1000,+ 138 | b,33.58,2.75,u,g,m,v,4.25,t,t,06,f,g,00204,0,+ 139 | a,18.83,9.5,u,g,w,v,1.625,t,t,06,t,g,00040,600,+ 140 | a,26.92,13.5,u,g,q,h,5,t,t,02,f,g,00000,5000,+ 141 | a,31.25,3.75,u,g,cc,h,0.625,t,t,09,t,g,00181,0,+ 142 | a,56.50,16,u,g,j,ff,0,t,t,15,f,g,00000,247,+ 143 | b,43.00,0.29,y,p,cc,h,1.75,t,t,08,f,g,00100,375,+ 144 | b,22.33,11,u,g,w,v,2,t,t,01,f,g,00080,278,+ 145 | b,27.25,1.665,u,g,cc,h,5.085,t,t,09,f,g,00399,827,+ 146 | b,32.83,2.5,u,g,cc,h,2.75,t,t,06,f,g,00160,2072,+ 147 | b,23.25,1.5,u,g,q,v,2.375,t,t,03,t,g,00000,582,+ 148 | a,40.33,7.54,y,p,q,h,8,t,t,14,f,g,00000,2300,+ 149 | a,30.50,6.5,u,g,c,bb,4,t,t,07,t,g,00000,3065,+ 150 | a,52.83,15,u,g,c,v,5.5,t,t,14,f,g,00000,2200,+ 151 | a,46.67,0.46,u,g,cc,h,0.415,t,t,11,t,g,00440,6,+ 152 | a,58.33,10,u,g,q,v,4,t,t,14,f,g,00000,1602,+ 153 | b,37.33,6.5,u,g,m,h,4.25,t,t,12,t,g,00093,0,+ 154 | b,23.08,2.5,u,g,c,v,1.085,t,t,11,t,g,00060,2184,+ 155 | b,32.75,1.5,u,g,cc,h,5.5,t,t,03,t,g,00000,0,+ 156 | a,21.67,11.5,y,p,j,j,0,t,t,11,t,g,00000,0,+ 157 | a,28.50,3.04,y,p,x,h,2.54,t,t,01,f,g,00070,0,+ 158 | a,68.67,15,u,g,e,z,0,t,t,14,f,g,00000,3376,+ 159 | b,28.00,2,u,g,k,h,4.165,t,t,02,t,g,00181,0,+ 160 | b,34.08,0.08,y,p,m,bb,0.04,t,t,01,t,g,00280,2000,+ 161 | b,27.67,2,u,g,x,h,1,t,t,04,f,g,00140,7544,+ 162 | b,44.00,2,u,g,m,v,1.75,t,t,02,t,g,00000,15,+ 163 | b,25.08,1.71,u,g,x,v,1.665,t,t,01,t,g,00395,20,+ 164 | b,32.00,1.75,y,p,e,h,0.04,t,f,0,t,g,00393,0,+ 165 | a,60.58,16.5,u,g,q,v,11,t,f,0,t,g,00021,10561,+ 166 | a,40.83,10,u,g,q,h,1.75,t,f,0,f,g,00029,837,+ 167 | b,19.33,9.5,u,g,q,v,1,t,f,0,t,g,00060,400,+ 168 | a,32.33,0.54,u,g,cc,v,0.04,t,f,0,f,g,00440,11177,+ 169 | b,36.67,3.25,u,g,q,h,9,t,f,0,t,g,00102,639,+ 170 | b,37.50,1.125,y,p,d,v,1.5,f,f,0,t,g,00431,0,+ 171 | a,25.08,2.54,y,p,aa,v,0.25,t,f,0,t,g,00370,0,+ 172 | b,41.33,0,u,g,c,bb,15,t,f,0,f,g,00000,0,+ 173 | b,56.00,12.5,u,g,k,h,8,t,f,0,t,g,00024,2028,+ 174 | a,49.83,13.585,u,g,k,h,8.5,t,f,0,t,g,00000,0,+ 175 | b,22.67,10.5,u,g,q,h,1.335,t,f,0,f,g,00100,0,+ 176 | b,27.00,1.5,y,p,w,v,0.375,t,f,0,t,g,00260,1065,+ 177 | b,25.00,12.5,u,g,aa,v,3,t,f,0,t,s,00020,0,+ 178 | a,26.08,8.665,u,g,aa,v,1.415,t,f,0,f,g,00160,150,+ 179 | a,18.42,9.25,u,g,q,v,1.21,t,t,04,f,g,00060,540,+ 180 | b,20.17,8.17,u,g,aa,v,1.96,t,t,14,f,g,00060,158,+ 181 | b,47.67,0.29,u,g,c,bb,15,t,t,20,f,g,00000,15000,+ 182 | a,21.25,2.335,u,g,i,bb,0.5,t,t,04,f,s,00080,0,+ 183 | a,20.67,3,u,g,q,v,0.165,t,t,03,f,g,00100,6,+ 184 | a,57.08,19.5,u,g,c,v,5.5,t,t,07,f,g,00000,3000,+ 185 | a,22.42,5.665,u,g,q,v,2.585,t,t,07,f,g,00129,3257,+ 186 | b,48.75,8.5,u,g,c,h,12.5,t,t,09,f,g,00181,1655,+ 187 | b,40.00,6.5,u,g,aa,bb,3.5,t,t,01,f,g,00000,500,+ 188 | b,40.58,5,u,g,c,v,5,t,t,07,f,g,00000,3065,+ 189 | a,28.67,1.04,u,g,c,v,2.5,t,t,05,t,g,00300,1430,+ 190 | a,33.08,4.625,u,g,q,h,1.625,t,t,02,f,g,00000,0,+ 191 | b,21.33,10.5,u,g,c,v,3,t,f,0,t,g,00000,0,+ 192 | b,42.00,0.205,u,g,i,h,5.125,t,f,0,f,g,00400,0,+ 193 | b,41.75,0.96,u,g,x,v,2.5,t,f,0,f,g,00510,600,+ 194 | b,22.67,1.585,y,p,w,v,3.085,t,t,06,f,g,00080,0,+ 195 | b,34.50,4.04,y,p,i,bb,8.5,t,t,07,t,g,00195,0,+ 196 | b,28.25,5.04,y,p,c,bb,1.5,t,t,08,t,g,00144,7,+ 197 | b,33.17,3.165,y,p,x,v,3.165,t,t,03,t,g,00380,0,+ 198 | b,48.17,7.625,u,g,w,h,15.5,t,t,12,f,g,00000,790,+ 199 | b,27.58,2.04,y,p,aa,v,2,t,t,03,t,g,00370,560,+ 200 | b,22.58,10.04,u,g,x,v,0.04,t,t,09,f,g,00060,396,+ 201 | a,24.08,0.5,u,g,q,h,1.25,t,t,01,f,g,00000,678,+ 202 | a,41.33,1,u,g,i,bb,2.25,t,f,0,t,g,00000,300,+ 203 | b,24.83,2.75,u,g,c,v,2.25,t,t,06,f,g,?,600,+ 204 | a,20.75,10.25,u,g,q,v,0.71,t,t,02,t,g,00049,0,+ 205 | b,36.33,2.125,y,p,w,v,0.085,t,t,01,f,g,00050,1187,+ 206 | a,35.42,12,u,g,q,h,14,t,t,08,f,g,00000,6590,+ 207 | a,71.58,0,?,?,?,?,0,f,f,0,f,p,?,0,+ 208 | b,28.67,9.335,u,g,q,h,5.665,t,t,06,f,g,00381,168,+ 209 | b,35.17,2.5,u,g,k,v,4.5,t,t,07,f,g,00150,1270,+ 210 | b,39.50,4.25,u,g,c,bb,6.5,t,t,16,f,g,00117,1210,+ 211 | b,39.33,5.875,u,g,cc,h,10,t,t,14,t,g,00399,0,+ 212 | b,24.33,6.625,y,p,d,v,5.5,t,f,0,t,s,00100,0,+ 213 | b,60.08,14.5,u,g,ff,ff,18,t,t,15,t,g,00000,1000,+ 214 | b,23.08,11.5,u,g,i,v,3.5,t,t,09,f,g,00056,742,+ 215 | b,26.67,2.71,y,p,cc,v,5.25,t,t,01,f,g,00211,0,+ 216 | b,48.17,3.5,u,g,aa,v,3.5,t,f,0,f,s,00230,0,+ 217 | b,41.17,4.04,u,g,cc,h,7,t,t,08,f,g,00320,0,+ 218 | b,55.92,11.5,u,g,ff,ff,5,t,t,05,f,g,00000,8851,+ 219 | b,53.92,9.625,u,g,e,v,8.665,t,t,05,f,g,00000,0,+ 220 | a,18.92,9.25,y,p,c,v,1,t,t,04,t,g,00080,500,+ 221 | a,50.08,12.54,u,g,aa,v,2.29,t,t,03,t,g,00156,0,+ 222 | b,65.42,11,u,g,e,z,20,t,t,07,t,g,00022,0,+ 223 | a,17.58,9,u,g,aa,v,1.375,t,f,0,t,g,00000,0,+ 224 | a,18.83,9.54,u,g,aa,v,0.085,t,f,0,f,g,00100,0,+ 225 | a,37.75,5.5,u,g,q,v,0.125,t,f,0,t,g,00228,0,+ 226 | b,23.25,4,u,g,c,bb,0.25,t,f,0,t,g,00160,0,+ 227 | b,18.08,5.5,u,g,k,v,0.5,t,f,0,f,g,00080,0,+ 228 | a,22.50,8.46,y,p,x,v,2.46,f,f,0,f,g,00164,0,+ 229 | b,19.67,0.375,u,g,q,v,2,t,t,02,t,g,00080,0,+ 230 | b,22.08,11,u,g,cc,v,0.665,t,f,0,f,g,00100,0,+ 231 | b,25.17,3.5,u,g,cc,v,0.625,t,t,07,f,g,00000,7059,+ 232 | a,47.42,3,u,g,x,v,13.875,t,t,02,t,g,00519,1704,+ 233 | b,33.50,1.75,u,g,x,h,4.5,t,t,04,t,g,00253,857,+ 234 | b,27.67,13.75,u,g,w,v,5.75,t,f,0,t,g,00487,500,+ 235 | a,58.42,21,u,g,i,bb,10,t,t,13,f,g,00000,6700,+ 236 | a,20.67,1.835,u,g,q,v,2.085,t,t,05,f,g,00220,2503,+ 237 | b,26.17,0.25,u,g,i,bb,0,t,f,0,t,g,00000,0,+ 238 | b,21.33,7.5,u,g,aa,v,1.415,t,t,01,f,g,00080,9800,+ 239 | b,42.83,4.625,u,g,q,v,4.58,t,f,0,f,s,00000,0,+ 240 | b,38.17,10.125,u,g,x,v,2.5,t,t,06,f,g,00520,196,+ 241 | b,20.50,10,y,p,c,v,2.5,t,f,0,f,s,00040,0,+ 242 | b,48.25,25.085,u,g,w,v,1.75,t,t,03,f,g,00120,14,+ 243 | b,28.33,5,u,g,w,v,11,t,f,0,t,g,00070,0,+ 244 | a,18.75,7.5,u,g,q,v,2.71,t,t,05,f,g,?,26726,+ 245 | b,18.50,2,u,g,i,v,1.5,t,t,02,f,g,00120,300,+ 246 | b,33.17,3.04,y,p,c,h,2.04,t,t,01,t,g,00180,18027,+ 247 | b,45.00,8.5,u,g,cc,h,14,t,t,01,t,g,00088,2000,+ 248 | a,19.67,0.21,u,g,q,h,0.29,t,t,11,f,g,00080,99,+ 249 | ?,24.50,12.75,u,g,c,bb,4.75,t,t,02,f,g,00073,444,+ 250 | b,21.83,11,u,g,x,v,0.29,t,t,06,f,g,00121,0,+ 251 | b,40.25,21.5,u,g,e,z,20,t,t,11,f,g,00000,1200,+ 252 | b,41.42,5,u,g,q,h,5,t,t,06,t,g,00470,0,+ 253 | a,17.83,11,u,g,x,h,1,t,t,11,f,g,00000,3000,+ 254 | b,23.17,11.125,u,g,x,h,0.46,t,t,01,f,g,00100,0,+ 255 | b,?,0.625,u,g,k,v,0.25,f,f,0,f,g,00380,2010,- 256 | b,18.17,10.25,u,g,c,h,1.085,f,f,0,f,g,00320,13,- 257 | b,20.00,11.045,u,g,c,v,2,f,f,0,t,g,00136,0,- 258 | b,20.00,0,u,g,d,v,0.5,f,f,0,f,g,00144,0,- 259 | a,20.75,9.54,u,g,i,v,0.04,f,f,0,f,g,00200,1000,- 260 | a,24.50,1.75,y,p,c,v,0.165,f,f,0,f,g,00132,0,- 261 | b,32.75,2.335,u,g,d,h,5.75,f,f,0,t,g,00292,0,- 262 | a,52.17,0,y,p,ff,ff,0,f,f,0,f,g,00000,0,- 263 | a,48.17,1.335,u,g,i,o,0.335,f,f,0,f,g,00000,120,- 264 | a,20.42,10.5,y,p,x,h,0,f,f,0,t,g,00154,32,- 265 | b,50.75,0.585,u,g,ff,ff,0,f,f,0,f,g,00145,0,- 266 | b,17.08,0.085,y,p,c,v,0.04,f,f,0,f,g,00140,722,- 267 | b,18.33,1.21,y,p,e,dd,0,f,f,0,f,g,00100,0,- 268 | a,32.00,6,u,g,d,v,1.25,f,f,0,f,g,00272,0,- 269 | b,59.67,1.54,u,g,q,v,0.125,t,f,0,t,g,00260,0,+ 270 | b,18.00,0.165,u,g,q,n,0.21,f,f,0,f,g,00200,40,+ 271 | b,37.58,0,?,?,?,?,0,f,f,0,f,p,?,0,+ 272 | b,32.33,2.5,u,g,c,v,1.25,f,f,0,t,g,00280,0,- 273 | b,18.08,6.75,y,p,m,v,0.04,f,f,0,f,g,00140,0,- 274 | b,38.25,10.125,y,p,k,v,0.125,f,f,0,f,g,00160,0,- 275 | b,30.67,2.5,u,g,cc,h,2.25,f,f,0,t,s,00340,0,- 276 | b,18.58,5.71,u,g,d,v,0.54,f,f,0,f,g,00120,0,- 277 | a,19.17,5.415,u,g,i,h,0.29,f,f,0,f,g,00080,484,- 278 | a,18.17,10,y,p,q,h,0.165,f,f,0,f,g,00340,0,- 279 | b,24.58,13.5,y,p,ff,ff,0,f,f,0,f,g,?,0,- 280 | b,16.25,0.835,u,g,m,v,0.085,t,f,0,f,s,00200,0,- 281 | b,21.17,0.875,y,p,c,h,0.25,f,f,0,f,g,00280,204,- 282 | b,23.92,0.585,y,p,cc,h,0.125,f,f,0,f,g,00240,1,- 283 | b,17.67,4.46,u,g,c,v,0.25,f,f,0,f,s,00080,0,- 284 | a,16.50,1.25,u,g,q,v,0.25,f,t,01,f,g,00108,98,- 285 | b,23.25,12.625,u,g,c,v,0.125,f,t,02,f,g,00000,5552,- 286 | b,17.58,10,u,g,w,h,0.165,f,t,01,f,g,00120,1,- 287 | a,?,1.5,u,g,ff,ff,0,f,t,02,t,g,00200,105,- 288 | b,29.50,0.58,u,g,w,v,0.29,f,t,01,f,g,00340,2803,- 289 | b,18.83,0.415,y,p,c,v,0.165,f,t,01,f,g,00200,1,- 290 | a,21.75,1.75,y,p,j,j,0,f,f,0,f,g,00160,0,- 291 | b,23.00,0.75,u,g,m,v,0.5,f,f,0,t,s,00320,0,- 292 | a,18.25,10,u,g,w,v,1,f,t,01,f,g,00120,1,- 293 | b,25.42,0.54,u,g,w,v,0.165,f,t,01,f,g,00272,444,- 294 | b,35.75,2.415,u,g,w,v,0.125,f,t,02,f,g,00220,1,- 295 | a,16.08,0.335,u,g,ff,ff,0,f,t,01,f,g,00160,126,- 296 | a,31.92,3.125,u,g,ff,ff,3.04,f,t,02,t,g,00200,4,- 297 | b,69.17,9,u,g,ff,ff,4,f,t,01,f,g,00070,6,- 298 | b,32.92,2.5,u,g,aa,v,1.75,f,t,02,t,g,00720,0,- 299 | b,16.33,2.75,u,g,aa,v,0.665,f,t,01,f,g,00080,21,- 300 | b,22.17,12.125,u,g,c,v,3.335,f,t,02,t,g,00180,173,- 301 | a,57.58,2,u,g,ff,ff,6.5,f,t,01,f,g,00000,10,- 302 | b,18.25,0.165,u,g,d,v,0.25,f,f,0,t,s,00280,0,- 303 | b,23.42,1,u,g,c,v,0.5,f,f,0,t,s,00280,0,- 304 | a,15.92,2.875,u,g,q,v,0.085,f,f,0,f,g,00120,0,- 305 | a,24.75,13.665,u,g,q,h,1.5,f,f,0,f,g,00280,1,- 306 | b,48.75,26.335,y,p,ff,ff,0,t,f,0,t,g,00000,0,- 307 | b,23.50,2.75,u,g,ff,ff,4.5,f,f,0,f,g,00160,25,- 308 | b,18.58,10.29,u,g,ff,ff,0.415,f,f,0,f,g,00080,0,- 309 | b,27.75,1.29,u,g,k,h,0.25,f,f,0,t,s,00140,0,- 310 | a,31.75,3,y,p,j,j,0,f,f,0,f,g,00160,20,- 311 | a,24.83,4.5,u,g,w,v,1,f,f,0,t,g,00360,6,- 312 | b,19.00,1.75,y,p,c,v,2.335,f,f,0,t,g,00112,6,- 313 | a,16.33,0.21,u,g,aa,v,0.125,f,f,0,f,g,00200,1,- 314 | a,18.58,10,u,g,d,v,0.415,f,f,0,f,g,00080,42,- 315 | b,16.25,0,y,p,aa,v,0.25,f,f,0,f,g,00060,0,- 316 | b,23.00,0.75,u,g,m,v,0.5,t,f,0,t,s,00320,0,- 317 | b,21.17,0.25,y,p,c,h,0.25,f,f,0,f,g,00280,204,- 318 | b,17.50,22,l,gg,ff,o,0,f,f,0,t,p,00450,100000,+ 319 | b,19.17,0,y,p,m,bb,0,f,f,0,t,s,00500,1,+ 320 | b,36.75,0.125,y,p,c,v,1.5,f,f,0,t,g,00232,113,+ 321 | b,21.25,1.5,u,g,w,v,1.5,f,f,0,f,g,00150,8,+ 322 | a,18.08,0.375,l,gg,cc,ff,10,f,f,0,t,s,00300,0,+ 323 | a,33.67,0.375,u,g,cc,v,0.375,f,f,0,f,g,00300,44,+ 324 | b,48.58,0.205,y,p,k,v,0.25,t,t,11,f,g,00380,2732,+ 325 | b,33.67,1.25,u,g,w,v,1.165,f,f,0,f,g,00120,0,- 326 | a,29.50,1.085,y,p,x,v,1,f,f,0,f,g,00280,13,- 327 | b,30.17,1.085,y,p,c,v,0.04,f,f,0,f,g,00170,179,- 328 | ?,40.83,3.5,u,g,i,bb,0.5,f,f,0,f,s,01160,0,- 329 | b,34.83,2.5,y,p,w,v,3,f,f,0,f,s,00200,0,- 330 | b,?,4,y,p,i,v,0.085,f,f,0,t,g,00411,0,- 331 | b,20.42,0,?,?,?,?,0,f,f,0,f,p,?,0,- 332 | a,33.25,2.5,y,p,c,v,2.5,f,f,0,t,g,00000,2,- 333 | b,34.08,2.5,u,g,c,v,1,f,f,0,f,g,00460,16,- 334 | a,25.25,12.5,u,g,d,v,1,f,f,0,t,g,00180,1062,- 335 | b,34.75,2.5,u,g,cc,bb,0.5,f,f,0,f,g,00348,0,- 336 | b,27.67,0.75,u,g,q,h,0.165,f,f,0,t,g,00220,251,- 337 | b,47.33,6.5,u,g,c,v,1,f,f,0,t,g,00000,228,- 338 | a,34.83,1.25,y,p,i,h,0.5,f,f,0,t,g,00160,0,- 339 | a,33.25,3,y,p,aa,v,2,f,f,0,f,g,00180,0,- 340 | b,28.00,3,u,g,w,v,0.75,f,f,0,t,g,00300,67,- 341 | a,39.08,4,u,g,c,v,3,f,f,0,f,g,00480,0,- 342 | b,42.75,4.085,u,g,aa,v,0.04,f,f,0,f,g,00108,100,- 343 | b,26.92,2.25,u,g,i,bb,0.5,f,f,0,t,g,00640,4000,- 344 | b,33.75,2.75,u,g,i,bb,0,f,f,0,f,g,00180,0,- 345 | b,38.92,1.75,u,g,k,v,0.5,f,f,0,t,g,00300,2,- 346 | b,62.75,7,u,g,e,z,0,f,f,0,f,g,00000,12,- 347 | ?,32.25,1.5,u,g,c,v,0.25,f,f,0,t,g,00372,122,- 348 | b,26.75,4.5,y,p,c,bb,2.5,f,f,0,f,g,00200,1210,- 349 | b,63.33,0.54,u,g,c,v,0.585,t,t,03,t,g,00180,0,- 350 | b,27.83,1.5,u,g,w,v,2.25,f,t,01,t,g,00100,3,- 351 | a,26.17,2,u,g,j,j,0,f,f,0,t,g,00276,1,- 352 | b,22.17,0.585,y,p,ff,ff,0,f,f,0,f,g,00100,0,- 353 | b,22.50,11.5,y,p,m,v,1.5,f,f,0,t,g,00000,4000,- 354 | b,30.75,1.585,u,g,d,v,0.585,f,f,0,t,s,00000,0,- 355 | b,36.67,2,u,g,i,v,0.25,f,f,0,t,g,00221,0,- 356 | a,16.00,0.165,u,g,aa,v,1,f,t,02,t,g,00320,1,- 357 | b,41.17,1.335,u,g,d,v,0.165,f,f,0,f,g,00168,0,- 358 | a,19.50,0.165,u,g,q,v,0.04,f,f,0,t,g,00380,0,- 359 | b,32.42,3,u,g,d,v,0.165,f,f,0,t,g,00120,0,- 360 | a,36.75,4.71,u,g,ff,ff,0,f,f,0,f,g,00160,0,- 361 | a,30.25,5.5,u,g,k,v,5.5,f,f,0,t,s,00100,0,- 362 | b,23.08,2.5,u,g,ff,ff,0.085,f,f,0,t,g,00100,4208,- 363 | b,26.83,0.54,u,g,k,ff,0,f,f,0,f,g,00100,0,- 364 | b,16.92,0.335,y,p,k,v,0.29,f,f,0,f,s,00200,0,- 365 | b,24.42,2,u,g,e,dd,0.165,f,t,02,f,g,00320,1300,- 366 | b,42.83,1.25,u,g,m,v,13.875,f,t,01,t,g,00352,112,- 367 | a,22.75,6.165,u,g,aa,v,0.165,f,f,0,f,g,00220,1000,- 368 | b,39.42,1.71,y,p,m,v,0.165,f,f,0,f,s,00400,0,- 369 | a,23.58,11.5,y,p,k,h,3,f,f,0,t,g,00020,16,- 370 | b,21.42,0.75,y,p,r,n,0.75,f,f,0,t,g,00132,2,- 371 | b,33.00,2.5,y,p,w,v,7,f,f,0,t,g,00280,0,- 372 | b,26.33,13,u,g,e,dd,0,f,f,0,t,g,00140,1110,- 373 | a,45.00,4.585,u,g,k,h,1,f,f,0,t,s,00240,0,- 374 | b,26.25,1.54,u,g,w,v,0.125,f,f,0,f,g,00100,0,- 375 | ?,28.17,0.585,u,g,aa,v,0.04,f,f,0,f,g,00260,1004,- 376 | a,20.83,0.5,y,p,e,dd,1,f,f,0,f,g,00260,0,- 377 | b,28.67,14.5,u,g,d,v,0.125,f,f,0,f,g,00000,286,- 378 | b,20.67,0.835,y,p,c,v,2,f,f,0,t,s,00240,0,- 379 | b,34.42,1.335,u,g,i,bb,0.125,f,f,0,t,g,00440,4500,- 380 | b,33.58,0.25,u,g,i,bb,4,f,f,0,t,s,00420,0,- 381 | b,43.17,5,u,g,i,bb,2.25,f,f,0,t,g,00141,0,- 382 | a,22.67,7,u,g,c,v,0.165,f,f,0,f,g,00160,0,- 383 | a,24.33,2.5,y,p,i,bb,4.5,f,f,0,f,g,00200,456,- 384 | a,56.83,4.25,y,p,ff,ff,5,f,f,0,t,g,00000,4,- 385 | b,22.08,11.46,u,g,k,v,1.585,f,f,0,t,g,00100,1212,- 386 | b,34.00,5.5,y,p,c,v,1.5,f,f,0,t,g,00060,0,- 387 | b,22.58,1.5,y,p,aa,v,0.54,f,f,0,t,g,00120,67,- 388 | b,21.17,0,u,g,c,v,0.5,f,f,0,t,s,00000,0,- 389 | b,26.67,14.585,u,g,i,bb,0,f,f,0,t,g,00178,0,- 390 | b,22.92,0.17,u,g,m,v,0.085,f,f,0,f,s,00000,0,- 391 | b,15.17,7,u,g,e,v,1,f,f,0,f,g,00600,0,- 392 | b,39.92,5,u,g,i,bb,0.21,f,f,0,f,g,00550,0,- 393 | b,27.42,12.5,u,g,aa,bb,0.25,f,f,0,t,g,00720,0,- 394 | b,24.75,0.54,u,g,m,v,1,f,f,0,t,g,00120,1,- 395 | b,41.17,1.25,y,p,w,v,0.25,f,f,0,f,g,00000,195,- 396 | a,33.08,1.625,u,g,d,v,0.54,f,f,0,t,g,00000,0,- 397 | b,29.83,2.04,y,p,x,h,0.04,f,f,0,f,g,00128,1,- 398 | a,23.58,0.585,y,p,ff,ff,0.125,f,f,0,f,g,00120,87,- 399 | b,26.17,12.5,y,p,k,h,1.25,f,f,0,t,g,00000,17,- 400 | b,31.00,2.085,u,g,c,v,0.085,f,f,0,f,g,00300,0,- 401 | b,20.75,5.085,y,p,j,v,0.29,f,f,0,f,g,00140,184,- 402 | b,28.92,0.375,u,g,c,v,0.29,f,f,0,f,g,00220,140,- 403 | a,51.92,6.5,u,g,i,bb,3.085,f,f,0,t,g,00073,0,- 404 | a,22.67,0.335,u,g,q,v,0.75,f,f,0,f,s,00160,0,- 405 | b,34.00,5.085,y,p,i,bb,1.085,f,f,0,t,g,00480,0,- 406 | a,69.50,6,u,g,ff,ff,0,f,f,0,f,s,00000,0,- 407 | a,40.33,8.125,y,p,k,v,0.165,f,t,02,f,g,?,18,- 408 | a,19.58,0.665,y,p,c,v,1,f,t,01,f,g,02000,2,- 409 | b,16.00,3.125,u,g,w,v,0.085,f,t,01,f,g,00000,6,- 410 | b,17.08,0.25,u,g,q,v,0.335,f,t,04,f,g,00160,8,- 411 | b,31.25,2.835,u,g,ff,ff,0,f,t,05,f,g,00176,146,- 412 | b,25.17,3,u,g,c,v,1.25,f,t,01,f,g,00000,22,- 413 | a,22.67,0.79,u,g,i,v,0.085,f,f,0,f,g,00144,0,- 414 | b,40.58,1.5,u,g,i,bb,0,f,f,0,f,s,00300,0,- 415 | b,22.25,0.46,u,g,k,v,0.125,f,f,0,t,g,00280,55,- 416 | a,22.25,1.25,y,p,ff,ff,3.25,f,f,0,f,g,00280,0,- 417 | b,22.50,0.125,y,p,k,v,0.125,f,f,0,f,g,00200,70,- 418 | b,23.58,1.79,u,g,c,v,0.54,f,f,0,t,g,00136,1,- 419 | b,38.42,0.705,u,g,c,v,0.375,f,t,02,f,g,00225,500,- 420 | a,26.58,2.54,y,p,ff,ff,0,f,f,0,t,g,00180,60,- 421 | b,35.00,2.5,u,g,i,v,1,f,f,0,t,g,00210,0,- 422 | b,20.42,1.085,u,g,q,v,1.5,f,f,0,f,g,00108,7,- 423 | b,29.42,1.25,u,g,w,v,1.75,f,f,0,f,g,00200,0,- 424 | b,26.17,0.835,u,g,cc,v,1.165,f,f,0,f,g,00100,0,- 425 | b,33.67,2.165,u,g,c,v,1.5,f,f,0,f,p,00120,0,- 426 | b,24.58,1.25,u,g,c,v,0.25,f,f,0,f,g,00110,0,- 427 | a,27.67,2.04,u,g,w,v,0.25,f,f,0,t,g,00180,50,- 428 | b,37.50,0.835,u,g,e,v,0.04,f,f,0,f,g,00120,5,- 429 | b,49.17,2.29,u,g,ff,ff,0.29,f,f,0,f,g,00200,3,- 430 | b,33.58,0.335,y,p,cc,v,0.085,f,f,0,f,g,00180,0,- 431 | b,51.83,3,y,p,ff,ff,1.5,f,f,0,f,g,00180,4,- 432 | b,22.92,3.165,y,p,c,v,0.165,f,f,0,f,g,00160,1058,- 433 | b,21.83,1.54,u,g,k,v,0.085,f,f,0,t,g,00356,0,- 434 | b,25.25,1,u,g,aa,v,0.5,f,f,0,f,g,00200,0,- 435 | b,58.58,2.71,u,g,c,v,2.415,f,f,0,t,g,00320,0,- 436 | b,19.00,0,y,p,ff,ff,0,f,t,04,f,g,00045,1,- 437 | b,19.58,0.585,u,g,ff,ff,0,f,t,03,f,g,00350,769,- 438 | a,53.33,0.165,u,g,ff,ff,0,f,f,0,t,s,00062,27,- 439 | a,27.17,1.25,u,g,ff,ff,0,f,t,01,f,g,00092,300,- 440 | b,25.92,0.875,u,g,k,v,0.375,f,t,02,t,g,00174,3,- 441 | b,23.08,0,u,g,k,v,1,f,t,11,f,s,00000,0,- 442 | b,39.58,5,u,g,ff,ff,0,f,t,02,f,g,00017,1,- 443 | b,30.58,2.71,y,p,m,v,0.125,f,f,0,t,s,00080,0,- 444 | b,17.25,3,u,g,k,v,0.04,f,f,0,t,g,00160,40,- 445 | a,17.67,0,y,p,j,ff,0,f,f,0,f,g,00086,0,- 446 | a,?,11.25,u,g,ff,ff,0,f,f,0,f,g,?,5200,- 447 | b,16.50,0.125,u,g,c,v,0.165,f,f,0,f,g,00132,0,- 448 | a,27.33,1.665,u,g,ff,ff,0,f,f,0,f,g,00340,1,- 449 | b,31.25,1.125,u,g,ff,ff,0,f,t,01,f,g,00096,19,- 450 | b,20.00,7,u,g,c,v,0.5,f,f,0,f,g,00000,0,- 451 | b,?,3,y,p,i,bb,7,f,f,0,f,g,00000,1,- 452 | b,39.50,1.625,u,g,c,v,1.5,f,f,0,f,g,00000,316,- 453 | b,36.50,4.25,u,g,q,v,3.5,f,f,0,f,g,00454,50,- 454 | ?,29.75,0.665,u,g,w,v,0.25,f,f,0,t,g,00300,0,- 455 | b,52.42,1.5,u,g,d,v,3.75,f,f,0,t,g,00000,350,- 456 | b,36.17,18.125,u,g,w,v,0.085,f,f,0,f,g,00320,3552,- 457 | b,34.58,0,?,?,?,?,0,f,f,0,f,p,?,0,- 458 | b,29.67,0.75,y,p,c,v,0.04,f,f,0,f,g,00240,0,- 459 | b,36.17,5.5,u,g,i,bb,5,f,f,0,f,g,00210,687,- 460 | b,25.67,0.29,y,p,c,v,1.5,f,f,0,t,g,00160,0,- 461 | a,24.50,2.415,y,p,c,v,0,f,f,0,f,g,00120,0,- 462 | b,24.08,0.875,u,g,m,v,0.085,f,t,04,f,g,00254,1950,- 463 | b,21.92,0.5,u,g,c,v,0.125,f,f,0,f,g,00360,0,- 464 | a,36.58,0.29,u,g,ff,ff,0,f,t,10,f,g,00200,18,- 465 | a,23.00,1.835,u,g,j,j,0,f,t,01,f,g,00200,53,- 466 | a,27.58,3,u,g,m,v,2.79,f,t,01,t,g,00280,10,- 467 | b,31.08,3.085,u,g,c,v,2.5,f,t,02,t,g,00160,41,- 468 | a,30.42,1.375,u,g,w,h,0.04,f,t,03,f,g,00000,33,- 469 | b,22.08,2.335,u,g,k,v,0.75,f,f,0,f,g,00180,0,- 470 | b,16.33,4.085,u,g,i,h,0.415,f,f,0,t,g,00120,0,- 471 | a,21.92,11.665,u,g,k,h,0.085,f,f,0,f,g,00320,5,- 472 | b,21.08,4.125,y,p,i,h,0.04,f,f,0,f,g,00140,100,- 473 | b,17.42,6.5,u,g,i,v,0.125,f,f,0,f,g,00060,100,- 474 | b,19.17,4,y,p,i,v,1,f,f,0,t,g,00360,1000,- 475 | b,20.67,0.415,u,g,c,v,0.125,f,f,0,f,g,00000,44,- 476 | b,26.75,2,u,g,d,v,0.75,f,f,0,t,g,00080,0,- 477 | b,23.58,0.835,u,g,i,h,0.085,f,f,0,t,g,00220,5,- 478 | b,39.17,2.5,y,p,i,h,10,f,f,0,t,s,00200,0,- 479 | b,22.75,11.5,u,g,i,v,0.415,f,f,0,f,g,00000,0,- 480 | ?,26.50,2.71,y,p,?,?,0.085,f,f,0,f,s,00080,0,- 481 | a,16.92,0.5,u,g,i,v,0.165,f,t,06,t,g,00240,35,- 482 | b,23.50,3.165,y,p,k,v,0.415,f,t,01,t,g,00280,80,- 483 | a,17.33,9.5,u,g,aa,v,1.75,f,t,10,t,g,00000,10,- 484 | b,23.75,0.415,y,p,c,v,0.04,f,t,02,f,g,00128,6,- 485 | b,34.67,1.08,u,g,m,v,1.165,f,f,0,f,s,00028,0,- 486 | b,74.83,19,y,p,ff,ff,0.04,f,t,02,f,g,00000,351,- 487 | b,28.17,0.125,y,p,k,v,0.085,f,f,0,f,g,00216,2100,- 488 | b,24.50,13.335,y,p,aa,v,0.04,f,f,0,t,g,00120,475,- 489 | b,18.83,3.54,y,p,ff,ff,0,f,f,0,t,g,00180,1,- 490 | ?,45.33,1,u,g,q,v,0.125,f,f,0,t,g,00263,0,- 491 | a,47.25,0.75,u,g,q,h,2.75,t,t,01,f,g,00333,892,+ 492 | b,24.17,0.875,u,g,q,v,4.625,t,t,02,t,g,00520,2000,+ 493 | b,39.25,9.5,u,g,m,v,6.5,t,t,14,f,g,00240,4607,+ 494 | a,20.50,11.835,u,g,c,h,6,t,f,0,f,g,00340,0,+ 495 | a,18.83,4.415,y,p,c,h,3,t,f,0,f,g,00240,0,+ 496 | b,19.17,9.5,u,g,w,v,1.5,t,f,0,f,g,00120,2206,+ 497 | a,25.00,0.875,u,g,x,h,1.04,t,f,0,t,g,00160,5860,+ 498 | b,20.17,9.25,u,g,c,v,1.665,t,t,03,t,g,00040,28,+ 499 | b,25.75,0.5,u,g,c,v,1.46,t,t,05,t,g,00312,0,+ 500 | b,20.42,7,u,g,c,v,1.625,t,t,03,f,g,00200,1391,+ 501 | b,?,4,u,g,x,v,5,t,t,03,t,g,00290,2279,+ 502 | b,39.00,5,u,g,cc,v,3.5,t,t,10,t,g,00000,0,+ 503 | a,64.08,0.165,u,g,ff,ff,0,t,t,01,f,g,00232,100,+ 504 | b,28.25,5.125,u,g,x,v,4.75,t,t,02,f,g,00420,7,+ 505 | a,28.75,3.75,u,g,c,v,1.085,t,t,01,t,g,00371,0,+ 506 | b,31.33,19.5,u,g,c,v,7,t,t,16,f,g,00000,5000,+ 507 | a,18.92,9,u,g,aa,v,0.75,t,t,02,f,g,00088,591,+ 508 | a,24.75,3,u,g,q,h,1.835,t,t,19,f,g,00000,500,+ 509 | a,30.67,12,u,g,c,v,2,t,t,01,f,g,00220,19,+ 510 | b,21.00,4.79,y,p,w,v,2.25,t,t,01,t,g,00080,300,+ 511 | b,13.75,4,y,p,w,v,1.75,t,t,02,t,g,00120,1000,+ 512 | a,46.00,4,u,g,j,j,0,t,f,0,f,g,00100,960,+ 513 | a,44.33,0,u,g,c,v,2.5,t,f,0,f,g,00000,0,+ 514 | b,20.25,9.96,u,g,e,dd,0,t,f,0,f,g,00000,0,+ 515 | b,22.67,2.54,y,p,c,h,2.585,t,f,0,f,g,00000,0,+ 516 | b,?,10.5,u,g,x,v,6.5,t,f,0,f,g,00000,0,+ 517 | a,60.92,5,u,g,aa,v,4,t,t,04,f,g,00000,99,+ 518 | b,16.08,0.75,u,g,c,v,1.75,t,t,05,t,g,00352,690,+ 519 | a,28.17,0.375,u,g,q,v,0.585,t,t,04,f,g,00080,0,+ 520 | b,39.17,1.71,u,g,x,v,0.125,t,t,05,t,g,00480,0,+ 521 | ?,20.42,7.5,u,g,k,v,1.5,t,t,01,f,g,00160,234,+ 522 | a,30.00,5.29,u,g,e,dd,2.25,t,t,05,t,g,00099,500,+ 523 | b,22.83,3,u,g,m,v,1.29,t,t,01,f,g,00260,800,+ 524 | a,22.50,8.5,u,g,q,v,1.75,t,t,10,f,g,00080,990,- 525 | a,28.58,1.665,u,g,q,v,2.415,t,f,0,t,g,00440,0,- 526 | b,45.17,1.5,u,g,c,v,2.5,t,f,0,t,g,00140,0,- 527 | b,41.58,1.75,u,g,k,v,0.21,t,f,0,f,g,00160,0,- 528 | a,57.08,0.335,u,g,i,bb,1,t,f,0,t,g,00252,2197,- 529 | a,55.75,7.08,u,g,k,h,6.75,t,t,03,t,g,00100,50,- 530 | b,43.25,25.21,u,g,q,h,0.21,t,t,01,f,g,00760,90,- 531 | a,25.33,2.085,u,g,c,h,2.75,t,f,0,t,g,00360,1,- 532 | a,24.58,0.67,u,g,aa,h,1.75,t,f,0,f,g,00400,0,- 533 | b,43.17,2.25,u,g,i,bb,0.75,t,f,0,f,g,00560,0,- 534 | b,40.92,0.835,u,g,ff,ff,0,t,f,0,f,g,00130,1,- 535 | b,31.83,2.5,u,g,aa,v,7.5,t,f,0,t,g,00523,0,- 536 | a,33.92,1.585,y,p,ff,ff,0,t,f,0,f,g,00320,0,- 537 | a,24.92,1.25,u,g,ff,ff,0,t,f,0,f,g,00080,0,- 538 | b,35.25,3.165,u,g,x,h,3.75,t,f,0,t,g,00680,0,- 539 | b,34.25,1.75,u,g,w,bb,0.25,t,f,0,t,g,00163,0,- 540 | b,80.25,5.5,u,g,?,?,0.54,t,f,0,f,g,00000,340,- 541 | b,19.42,1.5,y,p,cc,v,2,t,f,0,t,g,00100,20,- 542 | b,42.75,3,u,g,i,bb,1,t,f,0,f,g,00000,200,- 543 | b,19.67,10,y,p,k,h,0.835,t,f,0,t,g,00140,0,- 544 | b,36.33,3.79,u,g,w,v,1.165,t,f,0,t,g,00200,0,- 545 | b,30.08,1.04,y,p,i,bb,0.5,t,t,10,t,g,00132,28,- 546 | b,44.25,11,y,p,d,v,1.5,t,f,0,f,s,00000,0,- 547 | b,23.58,0.46,y,p,w,v,2.625,t,t,06,t,g,00208,347,- 548 | b,23.92,1.5,u,g,d,h,1.875,t,t,06,f,g,00200,327,+ 549 | b,33.17,1,u,g,x,v,0.75,t,t,07,t,g,00340,4071,+ 550 | b,48.33,12,u,g,m,v,16,t,f,0,f,s,00110,0,+ 551 | b,76.75,22.29,u,g,e,z,12.75,t,t,01,t,g,00000,109,+ 552 | b,51.33,10,u,g,i,bb,0,t,t,11,f,g,00000,1249,+ 553 | b,34.75,15,u,g,r,n,5.375,t,t,09,t,g,00000,134,+ 554 | b,38.58,3.335,u,g,w,v,4,t,t,14,f,g,00383,1344,+ 555 | a,22.42,11.25,y,p,x,h,0.75,t,t,04,f,g,00000,321,+ 556 | b,41.92,0.42,u,g,c,h,0.21,t,t,06,f,g,00220,948,+ 557 | b,29.58,4.5,u,g,w,v,7.5,t,t,02,t,g,00330,0,+ 558 | a,32.17,1.46,u,g,w,v,1.085,t,t,16,f,g,00120,2079,+ 559 | b,51.42,0.04,u,g,x,h,0.04,t,f,0,f,g,00000,3000,+ 560 | a,22.83,2.29,u,g,q,h,2.29,t,t,07,t,g,00140,2384,+ 561 | a,25.00,12.33,u,g,cc,h,3.5,t,t,06,f,g,00400,458,+ 562 | b,26.75,1.125,u,g,x,h,1.25,t,f,0,f,g,00000,5298,+ 563 | b,23.33,1.5,u,g,c,h,1.415,t,f,0,f,g,00422,200,+ 564 | b,24.42,12.335,u,g,q,h,1.585,t,f,0,t,g,00120,0,+ 565 | b,42.17,5.04,u,g,q,h,12.75,t,f,0,t,g,00092,0,+ 566 | a,20.83,3,u,g,aa,v,0.04,t,f,0,f,g,00100,0,+ 567 | b,23.08,11.5,u,g,w,h,2.125,t,t,11,t,g,00290,284,+ 568 | a,25.17,2.875,u,g,x,h,0.875,t,f,0,f,g,00360,0,+ 569 | b,43.08,0.375,y,p,c,v,0.375,t,t,08,t,g,00300,162,+ 570 | a,35.75,0.915,u,g,aa,v,0.75,t,t,04,f,g,00000,1583,+ 571 | b,59.50,2.75,u,g,w,v,1.75,t,t,05,t,g,00060,58,+ 572 | b,21.00,3,y,p,d,v,1.085,t,t,08,t,g,00160,1,+ 573 | b,21.92,0.54,y,p,x,v,0.04,t,t,01,t,g,00840,59,+ 574 | a,65.17,14,u,g,ff,ff,0,t,t,11,t,g,00000,1400,+ 575 | a,20.33,10,u,g,c,h,1,t,t,04,f,g,00050,1465,+ 576 | b,32.25,0.165,y,p,c,h,3.25,t,t,01,t,g,00432,8000,+ 577 | b,30.17,0.5,u,g,c,v,1.75,t,t,11,f,g,00032,540,+ 578 | b,25.17,6,u,g,c,v,1,t,t,03,f,g,00000,0,+ 579 | b,39.17,1.625,u,g,c,v,1.5,t,t,10,f,g,00186,4700,+ 580 | b,39.08,6,u,g,m,v,1.29,t,t,05,t,g,00108,1097,+ 581 | b,31.67,0.83,u,g,x,v,1.335,t,t,08,t,g,00303,3290,+ 582 | b,41.00,0.04,u,g,e,v,0.04,f,t,01,f,s,00560,0,+ 583 | b,48.50,4.25,u,g,m,v,0.125,t,f,0,t,g,00225,0,+ 584 | b,32.67,9,y,p,w,h,5.25,t,f,0,t,g,00154,0,+ 585 | a,28.08,15,y,p,e,z,0,t,f,0,f,g,00000,13212,+ 586 | b,73.42,17.75,u,g,ff,ff,0,t,f,0,t,g,00000,0,+ 587 | b,64.08,20,u,g,x,h,17.5,t,t,09,t,g,00000,1000,+ 588 | b,51.58,15,u,g,c,v,8.5,t,t,09,f,g,00000,0,+ 589 | b,26.67,1.75,y,p,c,v,1,t,t,05,t,g,00160,5777,+ 590 | b,25.33,0.58,u,g,c,v,0.29,t,t,07,t,g,00096,5124,+ 591 | b,30.17,6.5,u,g,cc,v,3.125,t,t,08,f,g,00330,1200,+ 592 | b,27.00,0.75,u,g,c,h,4.25,t,t,03,t,g,00312,150,+ 593 | b,23.17,0,?,?,?,?,0,f,f,0,f,p,?,0,+ 594 | b,34.17,5.25,u,g,w,v,0.085,f,f,0,t,g,00290,6,+ 595 | b,38.67,0.21,u,g,k,v,0.085,t,f,0,t,g,00280,0,+ 596 | b,25.75,0.75,u,g,c,bb,0.25,t,f,0,f,g,00349,23,+ 597 | a,46.08,3,u,g,c,v,2.375,t,t,08,t,g,00396,4159,+ 598 | a,21.50,6,u,g,aa,v,2.5,t,t,03,f,g,00080,918,+ 599 | ?,20.08,0.125,u,g,q,v,1,f,t,01,f,g,00240,768,+ 600 | b,20.50,2.415,u,g,c,v,2,t,t,11,t,g,00200,3000,+ 601 | a,29.50,0.46,u,g,k,v,0.54,t,t,04,f,g,00380,500,+ 602 | ?,42.25,1.75,y,p,?,?,0,f,f,0,t,g,00150,1,- 603 | b,29.83,1.25,y,p,k,v,0.25,f,f,0,f,g,00224,0,- 604 | b,20.08,0.25,u,g,q,v,0.125,f,f,0,f,g,00200,0,- 605 | b,23.42,0.585,u,g,c,h,0.085,t,f,0,f,g,00180,0,- 606 | a,29.58,1.75,y,p,k,v,1.25,f,f,0,t,g,00280,0,- 607 | b,16.17,0.04,u,g,c,v,0.04,f,f,0,f,g,00000,0,+ 608 | b,32.33,3.5,u,g,k,v,0.5,f,f,0,t,g,00232,0,- 609 | b,?,0.04,y,p,d,v,4.25,f,f,0,t,g,00460,0,- 610 | b,47.83,4.165,u,g,x,bb,0.085,f,f,0,t,g,00520,0,- 611 | b,20.00,1.25,y,p,k,v,0.125,f,f,0,f,g,00140,4,- 612 | b,27.58,3.25,y,p,q,h,5.085,f,t,02,t,g,00369,1,- 613 | b,22.00,0.79,u,g,w,v,0.29,f,t,01,f,g,00420,283,- 614 | b,19.33,10.915,u,g,c,bb,0.585,f,t,02,t,g,00200,7,- 615 | a,38.33,4.415,u,g,c,v,0.125,f,f,0,f,g,00160,0,- 616 | b,29.42,1.25,u,g,c,h,0.25,f,t,02,t,g,00400,108,- 617 | b,22.67,0.75,u,g,i,v,1.585,f,t,01,t,g,00400,9,- 618 | b,32.25,14,y,p,ff,ff,0,f,t,02,f,g,00160,1,- 619 | b,29.58,4.75,u,g,m,v,2,f,t,01,t,g,00460,68,- 620 | b,18.42,10.415,y,p,aa,v,0.125,t,f,0,f,g,00120,375,- 621 | b,22.17,2.25,u,g,i,v,0.125,f,f,0,f,g,00160,10,- 622 | b,22.67,0.165,u,g,c,j,2.25,f,f,0,t,s,00000,0,+ 623 | a,25.58,0,?,?,?,?,0,f,f,0,f,p,?,0,+ 624 | b,18.83,0,u,g,q,v,0.665,f,f,0,f,g,00160,1,- 625 | b,21.58,0.79,y,p,cc,v,0.665,f,f,0,f,g,00160,0,- 626 | b,23.75,12,u,g,c,v,2.085,f,f,0,f,s,00080,0,- 627 | b,22.00,7.835,y,p,i,bb,0.165,f,f,0,t,g,?,0,- 628 | b,36.08,2.54,u,g,ff,ff,0,f,f,0,f,g,00000,1000,- 629 | b,29.25,13,u,g,d,h,0.5,f,f,0,f,g,00228,0,- 630 | a,19.58,0.665,u,g,w,v,1.665,f,f,0,f,g,00220,5,- 631 | a,22.92,1.25,u,g,q,v,0.25,f,f,0,t,g,00120,809,- 632 | a,27.25,0.29,u,g,m,h,0.125,f,t,01,t,g,00272,108,- 633 | a,38.75,1.5,u,g,ff,ff,0,f,f,0,f,g,00076,0,- 634 | b,32.42,2.165,y,p,k,ff,0,f,f,0,f,g,00120,0,- 635 | a,23.75,0.71,u,g,w,v,0.25,f,t,01,t,g,00240,4,- 636 | b,18.17,2.46,u,g,c,n,0.96,f,t,02,t,g,00160,587,- 637 | b,40.92,0.5,y,p,m,v,0.5,f,f,0,t,g,00130,0,- 638 | b,19.50,9.585,u,g,aa,v,0.79,f,f,0,f,g,00080,350,- 639 | b,28.58,3.625,u,g,aa,v,0.25,f,f,0,t,g,00100,0,- 640 | b,35.58,0.75,u,g,k,v,1.5,f,f,0,t,g,00231,0,- 641 | b,34.17,2.75,u,g,i,bb,2.5,f,f,0,t,g,00232,200,- 642 | ?,33.17,2.25,y,p,cc,v,3.5,f,f,0,t,g,00200,141,- 643 | b,31.58,0.75,y,p,aa,v,3.5,f,f,0,t,g,00320,0,- 644 | a,52.50,7,u,g,aa,h,3,f,f,0,f,g,00000,0,- 645 | b,36.17,0.42,y,p,w,v,0.29,f,f,0,t,g,00309,2,- 646 | b,37.33,2.665,u,g,cc,v,0.165,f,f,0,t,g,00000,501,- 647 | a,20.83,8.5,u,g,c,v,0.165,f,f,0,f,g,00000,351,- 648 | b,24.08,9,u,g,aa,v,0.25,f,f,0,t,g,00000,0,- 649 | b,25.58,0.335,u,g,k,h,3.5,f,f,0,t,g,00340,0,- 650 | a,35.17,3.75,u,g,ff,ff,0,f,t,06,f,g,00000,200,- 651 | b,48.08,3.75,u,g,i,bb,1,f,f,0,f,g,00100,2,- 652 | a,15.83,7.625,u,g,q,v,0.125,f,t,01,t,g,00000,160,- 653 | a,22.50,0.415,u,g,i,v,0.335,f,f,0,t,s,00144,0,- 654 | b,21.50,11.5,u,g,i,v,0.5,t,f,0,t,g,00100,68,- 655 | a,23.58,0.83,u,g,q,v,0.415,f,t,01,t,g,00200,11,- 656 | a,21.08,5,y,p,ff,ff,0,f,f,0,f,g,00000,0,- 657 | b,25.67,3.25,u,g,c,h,2.29,f,t,01,t,g,00416,21,- 658 | a,38.92,1.665,u,g,aa,v,0.25,f,f,0,f,g,00000,390,- 659 | a,15.75,0.375,u,g,c,v,1,f,f,0,f,g,00120,18,- 660 | a,28.58,3.75,u,g,c,v,0.25,f,t,01,t,g,00040,154,- 661 | b,22.25,9,u,g,aa,v,0.085,f,f,0,f,g,00000,0,- 662 | b,29.83,3.5,u,g,c,v,0.165,f,f,0,f,g,00216,0,- 663 | a,23.50,1.5,u,g,w,v,0.875,f,f,0,t,g,00160,0,- 664 | b,32.08,4,y,p,cc,v,1.5,f,f,0,t,g,00120,0,- 665 | b,31.08,1.5,y,p,w,v,0.04,f,f,0,f,s,00160,0,- 666 | b,31.83,0.04,y,p,m,v,0.04,f,f,0,f,g,00000,0,- 667 | a,21.75,11.75,u,g,c,v,0.25,f,f,0,t,g,00180,0,- 668 | a,17.92,0.54,u,g,c,v,1.75,f,t,01,t,g,00080,5,- 669 | b,30.33,0.5,u,g,d,h,0.085,f,f,0,t,s,00252,0,- 670 | b,51.83,2.04,y,p,ff,ff,1.5,f,f,0,f,g,00120,1,- 671 | b,47.17,5.835,u,g,w,v,5.5,f,f,0,f,g,00465,150,- 672 | b,25.83,12.835,u,g,cc,v,0.5,f,f,0,f,g,00000,2,- 673 | a,50.25,0.835,u,g,aa,v,0.5,f,f,0,t,g,00240,117,- 674 | ?,29.50,2,y,p,e,h,2,f,f,0,f,g,00256,17,- 675 | a,37.33,2.5,u,g,i,h,0.21,f,f,0,f,g,00260,246,- 676 | a,41.58,1.04,u,g,aa,v,0.665,f,f,0,f,g,00240,237,- 677 | a,30.58,10.665,u,g,q,h,0.085,f,t,12,t,g,00129,3,- 678 | b,19.42,7.25,u,g,m,v,0.04,f,t,01,f,g,00100,1,- 679 | a,17.92,10.21,u,g,ff,ff,0,f,f,0,f,g,00000,50,- 680 | a,20.08,1.25,u,g,c,v,0,f,f,0,f,g,00000,0,- 681 | b,19.50,0.29,u,g,k,v,0.29,f,f,0,f,g,00280,364,- 682 | b,27.83,1,y,p,d,h,3,f,f,0,f,g,00176,537,- 683 | b,17.08,3.29,u,g,i,v,0.335,f,f,0,t,g,00140,2,- 684 | b,36.42,0.75,y,p,d,v,0.585,f,f,0,f,g,00240,3,- 685 | b,40.58,3.29,u,g,m,v,3.5,f,f,0,t,s,00400,0,- 686 | b,21.08,10.085,y,p,e,h,1.25,f,f,0,f,g,00260,0,- 687 | a,22.67,0.75,u,g,c,v,2,f,t,02,t,g,00200,394,- 688 | a,25.25,13.5,y,p,ff,ff,2,f,t,01,t,g,00200,1,- 689 | b,17.92,0.205,u,g,aa,v,0.04,f,f,0,f,g,00280,750,- 690 | b,35.00,3.375,u,g,c,h,8.29,f,f,0,t,g,00000,0,- 691 | -------------------------------------------------------------------------------- /Credit-Card-Approvals.ipynb: -------------------------------------------------------------------------------- 1 | {"cells":[{"source":"## 1. Credit card applications\n

Commercial banks receive a lot of applications for credit cards. Many of them get rejected for many reasons, like high loan balances, low income levels, or too many inquiries on an individual's credit report, for example. Manually analyzing these applications is mundane, error-prone, and time-consuming (and time is money!). Luckily, this task can be automated with the power of machine learning and pretty much every commercial bank does so nowadays. In this notebook, we will build an automatic credit card approval predictor using machine learning techniques, just like the real banks do.

\n

\"Credit

\n

We'll use the Credit Card Approval dataset from the UCI Machine Learning Repository. The structure of this notebook is as follows:

\n\n

First, loading and viewing the dataset. We find that since this data is confidential, the contributor of the dataset has anonymized the feature names.

","cell_type":"markdown","metadata":{"deletable":false,"run_control":{"frozen":true},"editable":false,"tags":["context"],"dc":{"key":"3"}}},{"source":"# Import pandas\nimport pandas as pd\n# Load dataset\ncc_apps = pd.read_csv('datasets/cc_approvals.data', header=None)\n\n# Inspect data\ncc_apps.head()\n","execution_count":160,"outputs":[{"execution_count":160,"data":{"text/html":"
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
0123456789101112131415
0b30.830.000ugwv1.25tt1fg002020+
1a58.674.460ugqh3.04tt6fg00043560+
2a24.500.500ugqh1.50tf0fg00280824+
3b27.831.540ugwv3.75tt5tg001003+
4b20.175.625ugwv1.71tf0fs001200+
\n
","text/plain":" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n0 b 30.83 0.000 u g w v 1.25 t t 1 f g 00202 0 +\n1 a 58.67 4.460 u g q h 3.04 t t 6 f g 00043 560 +\n2 a 24.50 0.500 u g q h 1.50 t f 0 f g 00280 824 +\n3 b 27.83 1.540 u g w v 3.75 t t 5 t g 00100 3 +\n4 b 20.17 5.625 u g w v 1.71 t f 0 f s 00120 0 +"},"output_type":"execute_result","metadata":{}}],"cell_type":"code","metadata":{"dc":{"key":"3"},"tags":["sample_code"],"trusted":true}},{"source":"## 2. Inspecting the applications\n

The output may appear a bit confusing at its first sight, but let's try to figure out the most important features of a credit card application. The features of this dataset have been anonymized to protect the privacy, but this blog gives us a pretty good overview of the probable features. The probable features in a typical credit card application are Gender, Age, Debt, Married, BankCustomer, EducationLevel, Ethnicity, YearsEmployed, PriorDefault, Employed, CreditScore, DriversLicense, Citizen, ZipCode, Income and finally the ApprovalStatus. This gives us a pretty good starting point, and we can map these features with respect to the columns in the output.

\n

As we can see from our first glance at the data, the dataset has a mixture of numerical and non-numerical features. This can be fixed with some preprocessing, but before we do that, let's learn about the dataset a bit more to see if there are other dataset issues that need to be fixed.

","cell_type":"markdown","metadata":{"deletable":false,"run_control":{"frozen":true},"editable":false,"tags":["context"],"dc":{"key":"10"}}},{"source":"# Print summary statistics\ncc_apps_description = cc_apps.describe()\nprint(cc_apps_description)\n\nprint(\"\\n\")\n\n# Print DataFrame information\ncc_apps_info = cc_apps.info()\nprint(cc_apps_info)\n\nprint(\"\\n\")\n\n# Inspect missing values in the dataset\ncc_apps.tail(17)","execution_count":162,"outputs":[{"text":" 2 7 10 14\ncount 690.000000 690.000000 690.00000 690.000000\nmean 4.758725 2.223406 2.40000 1017.385507\nstd 4.978163 3.346513 4.86294 5210.102598\nmin 0.000000 0.000000 0.00000 0.000000\n25% 1.000000 0.165000 0.00000 0.000000\n50% 2.750000 1.000000 0.00000 5.000000\n75% 7.207500 2.625000 3.00000 395.500000\nmax 28.000000 28.500000 67.00000 100000.000000\n\n\n\nRangeIndex: 690 entries, 0 to 689\nData columns (total 16 columns):\n0 690 non-null object\n1 690 non-null object\n2 690 non-null float64\n3 690 non-null object\n4 690 non-null object\n5 690 non-null object\n6 690 non-null object\n7 690 non-null float64\n8 690 non-null object\n9 690 non-null object\n10 690 non-null int64\n11 690 non-null object\n12 690 non-null object\n13 690 non-null object\n14 690 non-null int64\n15 690 non-null object\ndtypes: float64(2), int64(2), object(12)\nmemory usage: 86.3+ KB\nNone\n\n\n","name":"stdout","output_type":"stream"},{"execution_count":162,"data":{"text/html":"
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
0123456789101112131415
673?29.502.000ypeh2.000ff0fg0025617-
674a37.332.500ugih0.210ff0fg00260246-
675a41.581.040ugaav0.665ff0fg00240237-
676a30.5810.665ugqh0.085ft12tg001293-
677b19.427.250ugmv0.040ft1fg001001-
678a17.9210.210ugffff0.000ff0fg0000050-
679a20.081.250ugcv0.000ff0fg000000-
680b19.500.290ugkv0.290ff0fg00280364-
681b27.831.000ypdh3.000ff0fg00176537-
682b17.083.290ugiv0.335ff0tg001402-
683b36.420.750ypdv0.585ff0fg002403-
684b40.583.290ugmv3.500ff0ts004000-
685b21.0810.085ypeh1.250ff0fg002600-
686a22.670.750ugcv2.000ft2tg00200394-
687a25.2513.500ypffff2.000ft1tg002001-
688b17.920.205ugaav0.040ff0fg00280750-
689b35.003.375ugch8.290ff0tg000000-
\n
","text/plain":" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n673 ? 29.50 2.000 y p e h 2.000 f f 0 f g 00256 17 -\n674 a 37.33 2.500 u g i h 0.210 f f 0 f g 00260 246 -\n675 a 41.58 1.040 u g aa v 0.665 f f 0 f g 00240 237 -\n676 a 30.58 10.665 u g q h 0.085 f t 12 t g 00129 3 -\n677 b 19.42 7.250 u g m v 0.040 f t 1 f g 00100 1 -\n678 a 17.92 10.210 u g ff ff 0.000 f f 0 f g 00000 50 -\n679 a 20.08 1.250 u g c v 0.000 f f 0 f g 00000 0 -\n680 b 19.50 0.290 u g k v 0.290 f f 0 f g 00280 364 -\n681 b 27.83 1.000 y p d h 3.000 f f 0 f g 00176 537 -\n682 b 17.08 3.290 u g i v 0.335 f f 0 t g 00140 2 -\n683 b 36.42 0.750 y p d v 0.585 f f 0 f g 00240 3 -\n684 b 40.58 3.290 u g m v 3.500 f f 0 t s 00400 0 -\n685 b 21.08 10.085 y p e h 1.250 f f 0 f g 00260 0 -\n686 a 22.67 0.750 u g c v 2.000 f t 2 t g 00200 394 -\n687 a 25.25 13.500 y p ff ff 2.000 f t 1 t g 00200 1 -\n688 b 17.92 0.205 u g aa v 0.040 f f 0 f g 00280 750 -\n689 b 35.00 3.375 u g c h 8.290 f f 0 t g 00000 0 -"},"output_type":"execute_result","metadata":{}}],"cell_type":"code","metadata":{"dc":{"key":"10"},"tags":["sample_code"],"trusted":true}},{"source":"## 3. Handling the missing values (part i)\n

We've uncovered some issues that will affect the performance of our machine learning model(s) if they go unchanged:

\n\n

Now, let's temporarily replace these missing value question marks with NaN.

","cell_type":"markdown","metadata":{"deletable":false,"run_control":{"frozen":true},"editable":false,"tags":["context"],"dc":{"key":"17"}}},{"source":"# Import numpy\nimport numpy as np\n\n# Inspect missing values in the dataset\nprint(cc_apps.head(17))\n\n# Replace the '?'s with NaN\ncc_apps = cc_apps.replace('?', np.nan)\n\n# Inspect the missing values again\nprint(cc_apps.head(17))\n","execution_count":164,"outputs":[{"text":" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n0 b 30.83 0.000 u g w v 1.250 t t 1 f g 00202 0 +\n1 a 58.67 4.460 u g q h 3.040 t t 6 f g 00043 560 +\n2 a 24.50 0.500 u g q h 1.500 t f 0 f g 00280 824 +\n3 b 27.83 1.540 u g w v 3.750 t t 5 t g 00100 3 +\n4 b 20.17 5.625 u g w v 1.710 t f 0 f s 00120 0 +\n5 b 32.08 4.000 u g m v 2.500 t f 0 t g 00360 0 +\n6 b 33.17 1.040 u g r h 6.500 t f 0 t g 00164 31285 +\n7 a 22.92 11.585 u g cc v 0.040 t f 0 f g 00080 1349 +\n8 b 54.42 0.500 y p k h 3.960 t f 0 f g 00180 314 +\n9 b 42.50 4.915 y p w v 3.165 t f 0 t g 00052 1442 +\n10 b 22.08 0.830 u g c h 2.165 f f 0 t g 00128 0 +\n11 b 29.92 1.835 u g c h 4.335 t f 0 f g 00260 200 +\n12 a 38.25 6.000 u g k v 1.000 t f 0 t g 00000 0 +\n13 b 48.08 6.040 u g k v 0.040 f f 0 f g 00000 2690 +\n14 a 45.83 10.500 u g q v 5.000 t t 7 t g 00000 0 +\n15 b 36.67 4.415 y p k v 0.250 t t 10 t g 00320 0 +\n16 b 28.25 0.875 u g m v 0.960 t t 3 t g 00396 0 +\n 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n0 b 30.83 0.000 u g w v 1.250 t t 1 f g 00202 0 +\n1 a 58.67 4.460 u g q h 3.040 t t 6 f g 00043 560 +\n2 a 24.50 0.500 u g q h 1.500 t f 0 f g 00280 824 +\n3 b 27.83 1.540 u g w v 3.750 t t 5 t g 00100 3 +\n4 b 20.17 5.625 u g w v 1.710 t f 0 f s 00120 0 +\n5 b 32.08 4.000 u g m v 2.500 t f 0 t g 00360 0 +\n6 b 33.17 1.040 u g r h 6.500 t f 0 t g 00164 31285 +\n7 a 22.92 11.585 u g cc v 0.040 t f 0 f g 00080 1349 +\n8 b 54.42 0.500 y p k h 3.960 t f 0 f g 00180 314 +\n9 b 42.50 4.915 y p w v 3.165 t f 0 t g 00052 1442 +\n10 b 22.08 0.830 u g c h 2.165 f f 0 t g 00128 0 +\n11 b 29.92 1.835 u g c h 4.335 t f 0 f g 00260 200 +\n12 a 38.25 6.000 u g k v 1.000 t f 0 t g 00000 0 +\n13 b 48.08 6.040 u g k v 0.040 f f 0 f g 00000 2690 +\n14 a 45.83 10.500 u g q v 5.000 t t 7 t g 00000 0 +\n15 b 36.67 4.415 y p k v 0.250 t t 10 t g 00320 0 +\n16 b 28.25 0.875 u g m v 0.960 t t 3 t g 00396 0 +\n","name":"stdout","output_type":"stream"}],"cell_type":"code","metadata":{"dc":{"key":"17"},"tags":["sample_code"],"trusted":true}},{"source":"## 4. Handling the missing values (part ii)\n

We replaced all the question marks with NaNs. This is going to help us in the next missing value treatment that we are going to perform.

\n

An important question that gets raised here is why are we giving so much importance to missing values? Can't they be just ignored? Ignoring missing values can affect the performance of a machine learning model heavily. While ignoring the missing values our machine learning model may miss out on information about the dataset that may be useful for its training. Then, there are many models which cannot handle missing values implicitly such as LDA.

\n

So, to avoid this problem, we are going to impute the missing values with a strategy called mean imputation.

","cell_type":"markdown","metadata":{"deletable":false,"run_control":{"frozen":true},"editable":false,"tags":["context"],"dc":{"key":"24"}}},{"source":"# Impute the missing values with mean imputation\ncc_apps.fillna(cc_apps.mean(), inplace=True)\n\n# Count the number of NaNs in the dataset to verify\nprint(cc_apps.isnull().sum())","execution_count":166,"outputs":[{"text":"0 12\n1 12\n2 0\n3 6\n4 6\n5 9\n6 9\n7 0\n8 0\n9 0\n10 0\n11 0\n12 0\n13 13\n14 0\n15 0\ndtype: int64\n","name":"stdout","output_type":"stream"}],"cell_type":"code","metadata":{"dc":{"key":"24"},"tags":["sample_code"],"trusted":true}},{"source":"## 5. Handling the missing values (part iii)\n

We have successfully taken care of the missing values present in the numeric columns. There are still some missing values to be imputed for columns 0, 1, 3, 4, 5, 6 and 13. All of these columns contain non-numeric data and this why the mean imputation strategy would not work here. This needs a different treatment.

\n

We are going to impute these missing values with the most frequent values as present in the respective columns. This is good practice when it comes to imputing missing values for categorical data in general.

","cell_type":"markdown","metadata":{"deletable":false,"run_control":{"frozen":true},"editable":false,"tags":["context"],"dc":{"key":"31"}}},{"source":"# Iterate over each column of cc_apps\nfor col in cc_apps.columns:\n # Check if the column is of object type\n if cc_apps[col].dtypes == 'object':\n # Impute with the most frequent value\n cc_apps = cc_apps.fillna(cc_apps[col].value_counts().index[0])\n\n# Count the number of NaNs in the dataset and print the counts to verify\nprint(cc_apps.isnull().sum())","execution_count":168,"outputs":[{"text":"0 0\n1 0\n2 0\n3 0\n4 0\n5 0\n6 0\n7 0\n8 0\n9 0\n10 0\n11 0\n12 0\n13 0\n14 0\n15 0\ndtype: int64\n","name":"stdout","output_type":"stream"}],"cell_type":"code","metadata":{"dc":{"key":"31"},"tags":["sample_code"],"trusted":true}},{"source":"## 6. Preprocessing the data (part i)\n

The missing values are now successfully handled.

\n

There is still some minor but essential data preprocessing needed before we proceed towards building our machine learning model. We are going to divide these remaining preprocessing steps into three main tasks:

\n
    \n
  1. Convert the non-numeric data into numeric.
  2. \n
  3. Split the data into train and test sets.
  4. \n
  5. Scale the feature values to a uniform range.
  6. \n
\n

First, we will be converting all the non-numeric values into numeric ones. We do this because not only it results in a faster computation but also many machine learning models (like XGBoost) (and especially the ones developed using scikit-learn) require the data to be in a strictly numeric format. We will do this by using a technique called label encoding.

","cell_type":"markdown","metadata":{"deletable":false,"run_control":{"frozen":true},"editable":false,"tags":["context"],"dc":{"key":"38"}}},{"source":"# Import LabelEncoder\nfrom sklearn.preprocessing import LabelEncoder\n\n# Instantiate LabelEncoder\nle = LabelEncoder()\n\n# Iterate over all the values of each column and extract their dtypes\nfor col in cc_apps.columns.values:\n # Compare if the dtype is object\n if cc_apps[col].dtypes =='object':\n # Use LabelEncoder to do the numeric transformation\n cc_apps[col]=le.fit_transform(cc_apps[col])","execution_count":170,"outputs":[],"cell_type":"code","metadata":{"dc":{"key":"38"},"tags":["sample_code"],"trusted":true}},{"source":"## 7. Splitting the dataset into train and test sets\n

We have successfully converted all the non-numeric values to numeric ones.

\n

Now, we will split our data into train set and test set to prepare our data for two different phases of machine learning modeling: training and testing. Ideally, no information from the test data should be used to scale the training data or should be used to direct the training process of a machine learning model. Hence, we first split the data and then apply the scaling.

\n

Also, features like DriversLicense and ZipCode are not as important as the other features in the dataset for predicting credit card approvals. We should drop them to design our machine learning model with the best set of features. In Data Science literature, this is often referred to as feature selection.

","cell_type":"markdown","metadata":{"deletable":false,"run_control":{"frozen":true},"editable":false,"tags":["context"],"dc":{"key":"45"}}},{"source":"# Import train_test_split\nfrom sklearn.model_selection import train_test_split\n\n# Drop the features 11 and 13 and convert the DataFrame to a NumPy array\ncc_apps = cc_apps.drop([11, 13], axis=1)\ncc_apps = cc_apps.values\n\n# Segregate features and labels into separate variables\nX,y = cc_apps[:,0:13] , cc_apps[:,13]\n\n# Split into train and test sets\nX_train, X_test, y_train, y_test = train_test_split(X,\n y,\n test_size=0.33,\n random_state=42)","execution_count":172,"outputs":[],"cell_type":"code","metadata":{"dc":{"key":"45"},"tags":["sample_code"],"trusted":true}},{"source":"## 8. Preprocessing the data (part ii)\n

The data is now split into two separate sets - train and test sets respectively. We are only left with one final preprocessing step of scaling before we can fit a machine learning model to the data.

\n

Now, let's try to understand what these scaled values mean in the real world. Let's use CreditScore as an example. The credit score of a person is their creditworthiness based on their credit history. The higher this number, the more financially trustworthy a person is considered to be. So, a CreditScore of 1 is the highest since we're rescaling all the values to the range of 0-1.

","cell_type":"markdown","metadata":{"deletable":false,"run_control":{"frozen":true},"editable":false,"tags":["context"],"dc":{"key":"52"}}},{"source":"# Import MinMaxScaler\nfrom sklearn.preprocessing import MinMaxScaler\n\n# Instantiate MinMaxScaler and use it to rescale X_train and X_test\nscaler = MinMaxScaler(feature_range=(0, 1))\nrescaledX_train = scaler.fit_transform(X_train)\nrescaledX_test = scaler.fit_transform(X_test)","execution_count":174,"outputs":[],"cell_type":"code","metadata":{"dc":{"key":"52"},"tags":["sample_code"],"trusted":true}},{"source":"## 9. Fitting a logistic regression model to the train set\n

Essentially, predicting if a credit card application will be approved or not is a classification task. According to UCI, our dataset contains more instances that correspond to \"Denied\" status than instances corresponding to \"Approved\" status. Specifically, out of 690 instances, there are 383 (55.5%) applications that got denied and 307 (44.5%) applications that got approved.

\n

This gives us a benchmark. A good machine learning model should be able to accurately predict the status of the applications with respect to these statistics.

\n

Which model should we pick? A question to ask is: are the features that affect the credit card approval decision process correlated with each other? Although we can measure correlation, that is outside the scope of this notebook, so we'll rely on our intuition that they indeed are correlated for now. Because of this correlation, we'll take advantage of the fact that generalized linear models perform well in these cases. Let's start our machine learning modeling with a Logistic Regression model (a generalized linear model).

","cell_type":"markdown","metadata":{"deletable":false,"run_control":{"frozen":true},"editable":false,"tags":["context"],"dc":{"key":"59"}}},{"source":"# Import LogisticRegression\nfrom sklearn.linear_model import LogisticRegression\n\n# Instantiate a LogisticRegression classifier with default parameter values\nlogreg = LogisticRegression()\n\n# Fit logreg to the train set\nlogreg.fit(rescaledX_train, y_train)","execution_count":176,"outputs":[{"execution_count":176,"data":{"text/plain":"LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n verbose=0, warm_start=False)"},"output_type":"execute_result","metadata":{}}],"cell_type":"code","metadata":{"dc":{"key":"59"},"tags":["sample_code"],"trusted":true}},{"source":"## 10. Making predictions and evaluating performance\n

But how well does our model perform?

\n

We will now evaluate our model on the test set with respect to classification accuracy. But we will also take a look the model's confusion matrix. In the case of predicting credit card applications, it is equally important to see if our machine learning model is able to predict the approval status of the applications as denied that originally got denied. If our model is not performing well in this aspect, then it might end up approving the application that should have been approved. The confusion matrix helps us to view our model's performance from these aspects.

","cell_type":"markdown","metadata":{"deletable":false,"run_control":{"frozen":true},"editable":false,"tags":["context"],"dc":{"key":"66"}}},{"source":"# Import confusion_matrix\nfrom sklearn.metrics import confusion_matrix\n\n# Use logreg to predict instances from the test set and store it\ny_pred = logreg.predict(rescaledX_test)\n\n# Get the accuracy score of logreg model and print it\nprint(\"Accuracy of logistic regression classifier: \", logreg.score(rescaledX_test, y_test))\n\n# Print the confusion matrix of the logreg model\nconfusion_matrix(y_test, y_pred)","execution_count":178,"outputs":[{"text":"Accuracy of logistic regression classifier: 0.8377192982456141\n","name":"stdout","output_type":"stream"},{"execution_count":178,"data":{"text/plain":"array([[92, 11],\n [26, 99]])"},"output_type":"execute_result","metadata":{}}],"cell_type":"code","metadata":{"dc":{"key":"66"},"tags":["sample_code"],"trusted":true}},{"source":"## 11. Grid searching and making the model perform better\n

Our model was pretty good! It was able to yield an accuracy score of almost 84%.

\n

For the confusion matrix, the first element of the of the first row of the confusion matrix denotes the true negatives meaning the number of negative instances (denied applications) predicted by the model correctly. And the last element of the second row of the confusion matrix denotes the true positives meaning the number of positive instances (approved applications) predicted by the model correctly.

\n

Let's see if we can do better. We can perform a grid search of the model parameters to improve the model's ability to predict credit card approvals.

\n

scikit-learn's implementation of logistic regression consists of different hyperparameters but we will grid search over the following two:

\n","cell_type":"markdown","metadata":{"deletable":false,"run_control":{"frozen":true},"editable":false,"tags":["context"],"dc":{"key":"73"}}},{"source":"# Import GridSearchCV\nfrom sklearn.model_selection import GridSearchCV\n\n# Define the grid of values for tol and max_iter\ntol = [0.01, 0.001, 0.0001]\nmax_iter = [100, 150, 200]\n\n# Create a dictionary where tol and max_iter are keys and the lists of their values are corresponding values\nparam_grid = dict(tol=tol, max_iter= max_iter)","execution_count":180,"outputs":[],"cell_type":"code","metadata":{"dc":{"key":"73"},"tags":["sample_code"],"trusted":true}},{"source":"## 12. Finding the best performing model\n

We have defined the grid of hyperparameter values and converted them into a single dictionary format which GridSearchCV() expects as one of its parameters. Now, we will begin the grid search to see which values perform best.

\n

We will instantiate GridSearchCV() with our earlier logreg model with all the data we have. Instead of passing train and test sets separately, we will supply X (scaled version) and y. We will also instruct GridSearchCV() to perform a cross-validation of five folds.

\n

We'll end the notebook by storing the best-achieved score and the respective best parameters.

\n

While building this credit card predictor, we tackled some of the most widely-known preprocessing steps such as scaling, label encoding, and missing value imputation. We finished with some machine learning to predict if a person's application for a credit card would get approved or not given some information about that person.

","cell_type":"markdown","metadata":{"deletable":false,"run_control":{"frozen":true},"editable":false,"tags":["context"],"dc":{"key":"80"}}},{"source":"# Instantiate GridSearchCV with the required parameters\ngrid_model = GridSearchCV(estimator=logreg, param_grid=param_grid, cv=5)\n\n# Use scaler to rescale X and assign it to rescaledX\nrescaledX = scaler.fit_transform(X)\n\n# Fit data to grid_model\ngrid_model_result = grid_model.fit(rescaledX, y)\n\n# Summarize results\nbest_score, best_params = grid_model_result.best_score_, grid_model_result.best_params_\nprint(\"Best: %f using %s\" % (best_score, best_params))","execution_count":182,"outputs":[{"text":"Best: 0.853623 using {'tol': 0.01, 'max_iter': 100}\n","name":"stdout","output_type":"stream"}],"cell_type":"code","metadata":{"dc":{"key":"80"},"tags":["sample_code"],"trusted":true}}],"nbformat":4,"nbformat_minor":2,"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"name":"python","version":"3.5.2","pygments_lexer":"ipython3","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","nbconvert_exporter":"python"}}} -------------------------------------------------------------------------------- /bank_teller_Cris.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Bank Teller\n" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "In this project you will be implementing code that emulates transactions performed between a bank-teller and a customer. " 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "The prerequisites for this project are Python 3 syntax, functions and control flow. Let's jump right into it!" 22 | ] 23 | }, 24 | { 25 | "cell_type": "markdown", 26 | "metadata": {}, 27 | "source": [ 28 | "### 1. Initializing savings and checking account values. \n", 29 | "\n", 30 | "Creates two variables, one named `checking_balance` and the other `savings_balance`. Assign them both the value of zero. Use these as your starting bank balances." 31 | ] 32 | }, 33 | { 34 | "cell_type": "code", 35 | "execution_count": 1, 36 | "metadata": {}, 37 | "outputs": [], 38 | "source": [ 39 | "checking_balance = 0\n", 40 | "savings_balance = 0" 41 | ] 42 | }, 43 | { 44 | "cell_type": "markdown", 45 | "metadata": {}, 46 | "source": [ 47 | "### 2. Create a function to check the Balance\n", 48 | "\n", 49 | "##### step 1. Check account_type and return the respective balance\n", 50 | " \n", 51 | "Define a function named `check_balance()` that accepts three parameters `account_type`, `checking_balance` and `savings_balance`. `account_type` represents a string which can either be `\"savings\"` or `\"checking\"`. `checking_balance` and `savings_balance`represent the respective number balances.\n", 52 | " \n", 53 | "##### step 2. Check account_type and return the respective balance\n", 54 | " \n", 55 | "Within the function named `check_balance()`, create an if...elif...else statement. Within each if statement return the customers balance based on the type of `account_type` they requested.\n", 56 | " \n", 57 | "##### step 3. Assigning the savings_balance\n", 58 | " \n", 59 | "Within the first `if` statement use an equal operator to check whether `account_type` is the same as `\"savings\"`. If that is true, set the new variable `balance` to the value of `savings_balance`.\n", 60 | " \n", 61 | "##### step 4. Assigning the checking_balance\n", 62 | " \n", 63 | "Within the second `elif` statement use an equal operator to check whether `account_type` is the same as `\"checking\"`. If that is true, set the variable `balance` to the value of `checking_balance`.\n", 64 | " \n", 65 | "##### step 5. Return an error statement if there are no matching account_type\n", 66 | " \n", 67 | "Within the `else` statement, return an error statement given that there were no matches for the previous `if...elif` statements. Within the else statement, `return` `\"Unsuccessful, please enter \\\"checking\\\" or \\\"savings\\\"\"`\n", 68 | " \n", 69 | "##### step 6. Create a balance statement\n", 70 | " \n", 71 | "Under the `if` statements, create a new variable called `balance_statement` and assign it a value that consists of strings and variables. Concatenate the variables `account_type` and `balance` into the account statement. Remember to cast `balance` to a string using `str()` in the statement. The statement should be: \"Your `account_type` balance is `balance`\".\n", 72 | " \n", 73 | "##### step 7. Return balance statement\n", 74 | " \n", 75 | "Under the `balance_statement` assignment, close out the `check_balance()` function by adding a `return` statement that returns the `balance_statement` variable. " 76 | ] 77 | }, 78 | { 79 | "cell_type": "code", 80 | "execution_count": 2, 81 | "metadata": {}, 82 | "outputs": [], 83 | "source": [ 84 | "def check_balance ( account_type, checking_balance, savings_balance):\n", 85 | " \n", 86 | " if account_type == \"savings\":\n", 87 | "\n", 88 | " balance = savings_balance\n", 89 | " \n", 90 | " elif account_type == \"checking\":\n", 91 | " \n", 92 | " balance = checking_balance \n", 93 | " \n", 94 | " else:\n", 95 | " return acc_error\n", 96 | " \n", 97 | " balance_statement = \" Your \" + account_type + \" balance is \" + str(balance )\n", 98 | " return balance_statement\n", 99 | " \n", 100 | " " 101 | ] 102 | }, 103 | { 104 | "cell_type": "markdown", 105 | "metadata": {}, 106 | "source": [ 107 | "### 3. Calling and Printing the check_balance() function for Checking Account" 108 | ] 109 | }, 110 | { 111 | "cell_type": "markdown", 112 | "metadata": {}, 113 | "source": [ 114 | "Now that you have completed the `check_balance()` function, call it inside a `print()` function. Call the `check_balance()` function with these arguments; `\"checking\"`, `checking_balance` and `savings_balance`. The latter two were already initialized at the start of the project. Your checking balance should print." 115 | ] 116 | }, 117 | { 118 | "cell_type": "code", 119 | "execution_count": 3, 120 | "metadata": {}, 121 | "outputs": [ 122 | { 123 | "name": "stdout", 124 | "output_type": "stream", 125 | "text": [ 126 | " Your checking balance is 0\n" 127 | ] 128 | } 129 | ], 130 | "source": [ 131 | "print(check_balance(\"checking\", checking_balance, savings_balance))" 132 | ] 133 | }, 134 | { 135 | "cell_type": "markdown", 136 | "metadata": {}, 137 | "source": [ 138 | "### 4. Calling and Printing the check_balance() function for Savings Account" 139 | ] 140 | }, 141 | { 142 | "cell_type": "markdown", 143 | "metadata": {}, 144 | "source": [ 145 | "On the next line, inside a `print()` function call the `check_balance()` function with these arguments; `\"checking\"`, `checking_balance` and `savings_balance`. Your savings balance should print. " 146 | ] 147 | }, 148 | { 149 | "cell_type": "code", 150 | "execution_count": 4, 151 | "metadata": {}, 152 | "outputs": [ 153 | { 154 | "name": "stdout", 155 | "output_type": "stream", 156 | "text": [ 157 | " Your checking balance is 0\n" 158 | ] 159 | } 160 | ], 161 | "source": [ 162 | "print (check_balance(\"checking\", checking_balance, savings_balance))" 163 | ] 164 | }, 165 | { 166 | "cell_type": "code", 167 | "execution_count": 5, 168 | "metadata": {}, 169 | "outputs": [ 170 | { 171 | "ename": "SyntaxError", 172 | "evalue": "invalid syntax (, line 4)", 173 | "output_type": "error", 174 | "traceback": [ 175 | "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m4\u001b[0m\n\u001b[0;31m Define a function named `make_deposit()` that accepts four parameters `account_type`, `amount`, `checking_balance` and `savings_balance`. The `amount` represents the amount to be deposited.\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" 176 | ] 177 | } 178 | ], 179 | "source": [ 180 | "### 5. Create a function to make a deposit\n", 181 | "\n", 182 | "##### step 1. define function\n", 183 | "Define a function named `make_deposit()` that accepts four parameters `account_type`, `amount`, `checking_balance` and `savings_balance`. The `amount` represents the amount to be deposited. \n", 184 | " \n", 185 | "##### step 2. Initialize deposit_status variable\n", 186 | "Inside the deposit function, start by creating a variable named `deposit_status` and assign it to a an empty string\n", 187 | " \n", 188 | "##### step 3. Ensure deposit is greater than 0 \n", 189 | "Write an if statement that checks whether the passed in `amount` is greater than 0. Step 5 will continue putting code inside this `if` statement if `amount` is greater than 0.\n", 190 | "\n", 191 | "##### step 4. Error if amount is less than 0\n", 192 | "Write a corresponding `else` statement if the `if` statement fails. Within that `else`, assign the variable `deposit_status` to the string value `\"unsuccessful, please enter an amount greater than 0\"`\n", 193 | " \n", 194 | "##### step 5. Checking account_type\n", 195 | "Within the `if` statement that ensures that the amount is greater than 0, write inner `if...elif...else` statements. Within each if statement add the passed in `amount` to the customers balance based on the type of `account_type` they requested and also set `deposit_status` to `\"successful\"` or an error message. \n", 196 | " \n", 197 | "##### step 6. Deposit to Savings account\n", 198 | "Within the first nested `if` statement check whether `account_type` is equivalent to `\"savings\"`. Then within this `if` statement on the next line add `amount` to `savings_balance` using the `+=` assignment operator. On the next line assign the string value `\"successful\"` to the variable `deposit_status`.\n", 199 | " \n", 200 | "##### step 7. Deposit to Checking account\n", 201 | "Within the next nested `elif` statement check whether `account_type` is equivalent to `\"checking\"`. Then within this `elif` statement on the next line add `amount` to `checking_balance` using the `+=` assignment operator. On the next line assign the string value `\"successful\"` to the variable `deposit_status`.\n", 202 | " \n", 203 | "##### step 8. Assign an error statement if there are no matching account_type\n", 204 | "Within the next nested `else` statement, assign the string value `\"Unsuccessful, please enter \\\"checking\\\" or \\\"savings\\\"\"` to the variable `deposit_status`.\n", 205 | " \n", 206 | "##### step 9. Create a deposit statement\n", 207 | "Outside of all the `if` statements but still in the function, compose a statement composing of strings and variables used in this function. Then assign it to the new `deposit_statement` variable. The statement should be: \"Deposit of `amount` to your `account_type` account was `deposit_status`\". \n", 208 | "\n", 209 | "##### step 10. Print deposit statement\n", 210 | "On the next line, write a print statement with the `deposit_statement` as an argument. This will print the deposit statement anytime the deposit function is called. \n", 211 | "\n", 212 | "##### step 11. Return savings_balance and checking_balance\n", 213 | "On the next line return both the `savings_balance` and `checking_balance`. This will conclude the `make_deposit()` function." 214 | ] 215 | }, 216 | { 217 | "cell_type": "code", 218 | "execution_count": 5, 219 | "metadata": {}, 220 | "outputs": [], 221 | "source": [ 222 | " def make_deposit(account_type, amount, checking_balance, savings_balance):\n", 223 | " \n", 224 | " deposit_status = \"\"\n", 225 | " \n", 226 | " if amount > 0:\n", 227 | " \n", 228 | " if account_type == \"savings\" :\n", 229 | " savings_balance += amount\n", 230 | " deposit_status = \"successful\"\n", 231 | " \n", 232 | " elif account_type == \"checking\":\n", 233 | " checking_balance += amount\n", 234 | " deposit_status = \"successful\"\n", 235 | " \n", 236 | " else:\n", 237 | " deposit_status = acc_error\n", 238 | " \n", 239 | " else:\n", 240 | " deposit_status= \"unsuccessful, please enter an amount greater than 0\"\n", 241 | " \n", 242 | " deposit_statement = \"Deposit of \" +str(amount) + \" to your \" + account_type + \" account was \" + deposit_status + \".\"\n", 243 | " \n", 244 | " print (deposit_statement)\n", 245 | " \n", 246 | " return savings_balance, checking_balance\n", 247 | "\n", 248 | "\n", 249 | " \n", 250 | " " 251 | ] 252 | }, 253 | { 254 | "cell_type": "markdown", 255 | "metadata": {}, 256 | "source": [ 257 | "# 6. Call deposit function and make a savings deposit\n", 258 | "\n", 259 | "On the next line, call the `make_deposit()` function with these arguments; `\"savings\"`, `10`,`checking_balance` and `savings_balance`. Assign the function call to the matching `checking_balance` and `savings_balance` variables that are also being returned by the function. That is how the new balances are being updated. " 260 | ] 261 | }, 262 | { 263 | "cell_type": "code", 264 | "execution_count": 6, 265 | "metadata": {}, 266 | "outputs": [ 267 | { 268 | "name": "stdout", 269 | "output_type": "stream", 270 | "text": [ 271 | "Deposit of 10 to your savings account was successful.\n" 272 | ] 273 | } 274 | ], 275 | "source": [ 276 | "savings_balance, checking_balance = make_deposit(\"savings\", 10, checking_balance, savings_balance) \n", 277 | "\n" 278 | ] 279 | }, 280 | { 281 | "cell_type": "markdown", 282 | "metadata": {}, 283 | "source": [ 284 | "### 7. Print savings balance call after making a savings deposit\n", 285 | "\n", 286 | "Now that a deposit has been made to the savings account, print your savings balance. Call the `check_balance()` function with these arguments; `\"savings\"`, `checking_balance` and `savings_balance` within a print function. Your new savings balance should print." 287 | ] 288 | }, 289 | { 290 | "cell_type": "code", 291 | "execution_count": 7, 292 | "metadata": {}, 293 | "outputs": [ 294 | { 295 | "name": "stdout", 296 | "output_type": "stream", 297 | "text": [ 298 | " Your savings balance is 10\n" 299 | ] 300 | } 301 | ], 302 | "source": [ 303 | "print(check_balance(\"savings\", checking_balance, savings_balance))" 304 | ] 305 | }, 306 | { 307 | "cell_type": "markdown", 308 | "metadata": {}, 309 | "source": [ 310 | "### 8. Call deposit function and make a checking deposit\n", 311 | "\n", 312 | "On the next line, call the `make_deposit()` function with these arguments; `\"checking\"`, `200`,`checking_balance` and `savings_balance`. Assign the function call to the matching `checking_balance` and `savings_balance` variables that are also being returned by the function. " 313 | ] 314 | }, 315 | { 316 | "cell_type": "code", 317 | "execution_count": 8, 318 | "metadata": {}, 319 | "outputs": [ 320 | { 321 | "name": "stdout", 322 | "output_type": "stream", 323 | "text": [ 324 | "Deposit of 200 to your checking account was successful.\n" 325 | ] 326 | } 327 | ], 328 | "source": [ 329 | "savings_balance, checking_balance = make_deposit(\"checking\", 200, checking_balance, savings_balance )" 330 | ] 331 | }, 332 | { 333 | "cell_type": "markdown", 334 | "metadata": {}, 335 | "source": [ 336 | "### 9. Print checking balance call after making a checking deposit\n", 337 | "\n", 338 | "Now that a deposit has been made to the checking account, print our new checking balance. Call the `check_balance()` function with these arguments; `\"checking\"`, `checking_balance` and `savings_balance` within a print function. Your new checking balance should print." 339 | ] 340 | }, 341 | { 342 | "cell_type": "code", 343 | "execution_count": 9, 344 | "metadata": {}, 345 | "outputs": [ 346 | { 347 | "name": "stdout", 348 | "output_type": "stream", 349 | "text": [ 350 | " Your checking balance is 200\n" 351 | ] 352 | } 353 | ], 354 | "source": [ 355 | "print (check_balance(\"checking\", checking_balance, savings_balance))" 356 | ] 357 | }, 358 | { 359 | "cell_type": "markdown", 360 | "metadata": {}, 361 | "source": [ 362 | "# 10. Create a function to make a withdrawal\n", 363 | "\n", 364 | "##### step 1. define function\n", 365 | "Define a function named `make_withdrawal()` that accepts four parameters `account_type`, `amount`, `checking_balance` and `savings_balance`. The `amount` represents the withdrawal amount. \n", 366 | "\n", 367 | "##### step 2. Initialize withdrawal_status variable\n", 368 | "Inside the withdrawal function, start by creating a variable named `withdrawal_status` and assign it to an empty string. \n", 369 | "\n", 370 | "##### step 3. Initialize an error message\n", 371 | "On the next line create a variable named `fail` and assign it to the value `\"Unsuccessful, please enter amount less than balance\"` \n", 372 | "\n", 373 | "##### step 4. Checking account_type\n", 374 | "Write `if...elif...else` statements. Within each if statement check whether the `account_type` is equivalent to `savings_balance` or `checking_balance`. If neither, throw an error in the else statement.\n", 375 | "\n", 376 | "##### step 5. Withdrawal from savings account\n", 377 | "The first `if` statement should check whether `account_type` is equivalent to `\"savings\"`. \n", 378 | "\n", 379 | "##### step 6. Ensure withdrawal is less than savings account\n", 380 | "Then write an inner `if...else` that checks if the withdrawal amount is greater than the savings balance. If the amount is indeed greater, in the else statement, assign `withdrawal_status` to the variable `fail`.\n", 381 | "\n", 382 | "##### step 7. Subtract amount from savings account\n", 383 | "Within the inner `if` statement, subtract `amount` from the `savings_balance` using the `-=` assignment operator. On the next line assign the string value `\"successful\"` to the variable `withdrawal_status`. \n", 384 | "\n", 385 | "##### step 8. Withdrawal from checking account\n", 386 | "The next `elif` statement should check whether `account_type` is equivalent to `\"checking\"`. \n", 387 | "\n", 388 | "##### step 9. Ensure withdrawal is less than checking account\n", 389 | "Then write an inner `if...else` that checks if the withdrawal amount is greater than the checking balance. If the amount is indeed greater, in the else statement, assign `withdrawal_status` to the variable `fail`.\n", 390 | "\n", 391 | "##### step 10. Subtract amount from checking account\n", 392 | "Within the inner `if` statement, subtract `amount` from the `checking_balance` using the `-=` assignment operator. On the next line assign the string value `\"successful\"` to the variable `withdrawal_status`. \n", 393 | "\n", 394 | "##### step 11. Assign an error statement if there are no matching account_type\n", 395 | "Within the last `else` statement, assign the string value `\"unsuccessful, please enter \\\"checking\\\" or \\\"savings\\\"\"` to the variable `withdrawal_status`.\n", 396 | "\n", 397 | "##### step 12. Create a withdrawal statement\n", 398 | "Outside of all the `if` statements but still in the function, create a statement composing of strings and variables used in this function. Then assign it to the new `withdrawal_statement` variable. The withdrawal statement should be: \"Withdrawal of `amount` dollars from your `account_type` was `withdrawal_status`\". \n", 399 | "\n", 400 | "##### step 13. Print withdrawal statement\n", 401 | "On the next line, write a print statement with the `withdrawal_statement` as an argument. This will print the withdrawal statement anytime the deposit function is called. \n", 402 | "\n", 403 | "##### step 14. Return savings_balance and checking_balance\n", 404 | "On the next line return both the `savings_balance` and `checking_balance`. This will conclude the `make_withdrawal()` function." 405 | ] 406 | }, 407 | { 408 | "cell_type": "code", 409 | "execution_count": 11, 410 | "metadata": {}, 411 | "outputs": [], 412 | "source": [ 413 | "def make_withdrawal( account_type, amount, checking_balance, savings_balance):\n", 414 | " \n", 415 | " withdrawal_status = \"\"\n", 416 | " fail = \"Unsuccessful, please enter amount less than balance\"\n", 417 | " \n", 418 | " if account_type == \"savings\":\n", 419 | " if amount <= savings_balance:\n", 420 | " savings_balance -= amount\n", 421 | " withdrawal_status = \"successuful\"\n", 422 | " \n", 423 | " else:\n", 424 | " withdrawal_status = fail\n", 425 | " \n", 426 | " \n", 427 | " elif account_type == \"checking\":\n", 428 | " \n", 429 | " if amount <= checking_balance:\n", 430 | " checking_balance -= amount\n", 431 | " withdrawal_status = \"successuful\"\n", 432 | " \n", 433 | " else:\n", 434 | " withdrawal_status = fail\n", 435 | " \n", 436 | " \n", 437 | " else:\n", 438 | " withdrawal_status = \"unsuccessful, please enter \\\"checking\\\" or \\\"savings\\\"\"\n", 439 | " \n", 440 | " withdrawal_statement = \"Withdrawal of \" + str(amount) + \" dollars from your \" + account_type + \" was \" + withdrawal_status\n", 441 | " \n", 442 | " print(withdrawal_statement)\n", 443 | " \n", 444 | " return savings_balance, checking_balance" 445 | ] 446 | }, 447 | { 448 | "cell_type": "markdown", 449 | "metadata": {}, 450 | "source": [ 451 | "### 11. Call withdrawal function and make a savings withdrawal\n", 452 | "\n", 453 | "On the next line, call the `make_withdrawal()` function with these arguments: `\"savings\"`, `11`,`checking_balance` and `savings_balance`. Assign the function call to the matching `checking_balance` and `savings_balance` variables that are also being returned by the function. That is how the new balances are being updated. " 454 | ] 455 | }, 456 | { 457 | "cell_type": "code", 458 | "execution_count": 16, 459 | "metadata": {}, 460 | "outputs": [ 461 | { 462 | "name": "stdout", 463 | "output_type": "stream", 464 | "text": [ 465 | "Withdrawal of 11 dollars from your savings was successuful\n" 466 | ] 467 | } 468 | ], 469 | "source": [ 470 | "checking_balance,savings_balance = make_withdrawal(\"savings\", 11,checking_balance, savings_balance)" 471 | ] 472 | }, 473 | { 474 | "cell_type": "markdown", 475 | "metadata": {}, 476 | "source": [ 477 | "### 12. Print savings balance call, after making a savings withdrawal\n", 478 | "\n", 479 | "Now that a withdrawal has been made from the savings account, print our savings balance. Call the `check_balance()` function with these arguments; `\"savings\"`, `checking_balance` and `savings_balance` within a print function. Your new savings balance should print. " 480 | ] 481 | }, 482 | { 483 | "cell_type": "code", 484 | "execution_count": 17, 485 | "metadata": {}, 486 | "outputs": [ 487 | { 488 | "name": "stdout", 489 | "output_type": "stream", 490 | "text": [ 491 | " Your savings balance is 10\n" 492 | ] 493 | } 494 | ], 495 | "source": [ 496 | "print(check_balance(\"savings\",checking_balance,savings_balance ))" 497 | ] 498 | }, 499 | { 500 | "cell_type": "markdown", 501 | "metadata": {}, 502 | "source": [ 503 | "### 13. Call withdrawal function and make a checking withdrawal\n", 504 | "\n", 505 | "On the next line, call the `make_withdrawal()` function with these arguments; `\"checking\"`, `170`,`checking_balance` and `savings_balance`. Assign the function call to the matching `checking_balance` and `savings_balance` variables that are also being returned by the function. That is how the new balances are being updated. " 506 | ] 507 | }, 508 | { 509 | "cell_type": "code", 510 | "execution_count": 20, 511 | "metadata": {}, 512 | "outputs": [ 513 | { 514 | "name": "stdout", 515 | "output_type": "stream", 516 | "text": [ 517 | "Withdrawal of 170 dollars from your checking was Unsuccessful, please enter amount less than balance\n" 518 | ] 519 | } 520 | ], 521 | "source": [ 522 | "checking_balance, savings_balance = make_withdrawal( \"checking\", 170, checking_balance, savings_balance)" 523 | ] 524 | }, 525 | { 526 | "cell_type": "markdown", 527 | "metadata": {}, 528 | "source": [ 529 | "### 14. Print checking balance call, after making a checking withdrawal\n", 530 | "\n", 531 | "Now that a withdrawal has been made from the checking account, print our checking balance. Call the `check_balance()` function with these arguments; `\"savings\"`, `checking_balance` and `savings_balance` within a print function. Your new checking balance should print. " 532 | ] 533 | }, 534 | { 535 | "cell_type": "code", 536 | "execution_count": 21, 537 | "metadata": {}, 538 | "outputs": [ 539 | { 540 | "name": "stdout", 541 | "output_type": "stream", 542 | "text": [ 543 | " Your savings balance is 10\n" 544 | ] 545 | } 546 | ], 547 | "source": [ 548 | "print(check_balance(\"savings\", checking_balance, savings_balance))" 549 | ] 550 | }, 551 | { 552 | "cell_type": "markdown", 553 | "metadata": {}, 554 | "source": [ 555 | "### 15. Create a function to make a transfer between accounts\n", 556 | "\n", 557 | "##### step 1. define function\n", 558 | "Define a function named `acc_transfer()` that accepts five parameters `acc_from`, `acc_to`, `amount`, `checking_balance` and `savings_balance`.\n", 559 | "\n", 560 | "##### step 2. Initialize trans_status variable\n", 561 | "Inside the transfer function, start by creating a variable named `trans_status` and assign it to a an empty string. \n", 562 | "\n", 563 | "##### step 3. Initialize an error message\n", 564 | "On the next line create a variable named `trans_error` and assign it to the value `\"unsuccessful, please enter amount less than \"` \n", 565 | "\n", 566 | "##### step 4. Account Transfer\n", 567 | "Write `if...elif...else` statements. The `if` statement will check if the transfer is from savings to checking account. The `elif` statement will check if the transfer is from checking to savings account. If neither, throw an error in the else statement.\n", 568 | "\n", 569 | "##### step 5. Ensure transfer is less than savings account\n", 570 | "Within the first `if` statement, write an inner `if...else` that checks if the transfer amount is greater than the savings balance. If the amount is indeed greater, in the else statement, assign `trans_status` to the variable `trans_error` + `str(savings_balance)`.\n", 571 | "\n", 572 | "##### step 6. Transfer amount from savings to checking account\n", 573 | "Within the inner `if` statement, subtract `amount` from the `savings_balance` using the `-=` assignment operator. On the next line, add `amount` to the `checking_balance` using the `+=` assignment operator. Then on the next line assign the string value `\"successful\"` to the variable `withdrawal_status`. \n", 574 | "\n", 575 | "##### step 7. Ensure transfer is less than checking account\n", 576 | "Within the following `elif` statement, write an inner `if...else` that checks if the transfer amount is greater than the savings balance. If the amount is indeed greater, in the else statement, assign `trans_status` to the variable `trans_error` + `str(checking_balance)`.\n", 577 | "\n", 578 | "##### step 8. Transfer amount from checking to savings account\n", 579 | "Within the inner `if` statement, subtract `amount` from the `checking_balance` using the `-=` assignment operator. On the next line, add `amount` to the `savings_balance` using the `+=` assignment operator. Then on the next line assign the string value `\"successful\"` to the variable `withdrawal_status`. \n", 580 | "\n", 581 | "##### step 9. Assign an error statement if there are no matching account_type\n", 582 | "Within the last `else` statement, assign the string value `\"unsuccessful, please enter \\\"checking\\\" or \\\"savings\\\"\"` to the variable `trans_status`.\n", 583 | "\n", 584 | "##### step 10. Create a transfer statement\n", 585 | "Outside of all the `if` statements but still in the function, compose a statement composing of strings and variables used in this function. Then assign it to the new `trans_statement` variable. The transfer statement should be; \"transfer of `amount` from your `cc_from` to your `acc_to` account was `trans_status`\".\n", 586 | "\n", 587 | "##### step 11. Print transfer statement\n", 588 | "On the next line, write a print statement with the `trans_statement` as an argument. This will print the transfer statement anytime the transfer function is called. \n", 589 | "\n", 590 | "##### step 12. Return savings_balance and checking_balance\n", 591 | "On the next line return both the `savings_balance` and `checking_balance`. This will conclude the `acc_transfer()` function." 592 | ] 593 | }, 594 | { 595 | "cell_type": "code", 596 | "execution_count": 23, 597 | "metadata": {}, 598 | "outputs": [], 599 | "source": [ 600 | "def acc_transfer (acc_from, acc_to, amount, checking_balance, savings_balance):\n", 601 | " \n", 602 | " trans_status =\"\"\n", 603 | " \n", 604 | " trans_error = \"unsuccessuful, please enter amount less than\"\n", 605 | " \n", 606 | " if acc_from == \"savings\" and acc_to == \"checking\" :\n", 607 | " \n", 608 | " if amount <= savings_balance:\n", 609 | " savings_balance -= amount\n", 610 | " checking_balance += amount\n", 611 | " withdrawal_status = \"successuful\"\n", 612 | " \n", 613 | " else:\n", 614 | " trans_status = trans_error + str(savings_balance)\n", 615 | " \n", 616 | " \n", 617 | " elif acc_from ==\"checking\" and acc_to == \"savings\":\n", 618 | " \n", 619 | " if amount <= checking_balance:\n", 620 | " checking_balance -= amount\n", 621 | " savings_balance += amount\n", 622 | " withdrawal_status = \"successuful\"\n", 623 | " \n", 624 | " else:\n", 625 | " trans_status = trans_error + str(checking_balance)\n", 626 | " \n", 627 | " \n", 628 | " \n", 629 | " else:\n", 630 | " trans_status = \"unsuccessful, please enter \\\"checking\\\" or \\\"savings\\\"\"\n", 631 | " \n", 632 | " trans_statement = \"transfer of \" +str(amount) +\" from your \" + acc_from + \" to your \"+ acc_to + \" account was\" + trans_status\n", 633 | " \n", 634 | " print(trans_statement)\n", 635 | " \n", 636 | " return savings_balance, checking_balance\n", 637 | " " 638 | ] 639 | }, 640 | { 641 | "cell_type": "markdown", 642 | "metadata": {}, 643 | "source": [ 644 | "### 16. Call transfer function and make a checking to savings transfer\n", 645 | "\n", 646 | "On the next line, call the `acc_transfer()` function with these arguments; `\"checking\"`, `\"savings\"`, `40`,`checking_balance` and `savings_balance`. Assign the function call to the matching `checking_balance` and `savings_balance` variables that are also being returned by the function. " 647 | ] 648 | }, 649 | { 650 | "cell_type": "code", 651 | "execution_count": 24, 652 | "metadata": {}, 653 | "outputs": [ 654 | { 655 | "name": "stdout", 656 | "output_type": "stream", 657 | "text": [ 658 | "transfer of 40 from your checking to your savings account wasunsuccessuful, please enter amount less than19\n" 659 | ] 660 | } 661 | ], 662 | "source": [ 663 | "savings_balance, checking_balance = acc_transfer(\"checking\", \"savings\", 40, checking_balance, savings_balance)" 664 | ] 665 | }, 666 | { 667 | "cell_type": "markdown", 668 | "metadata": {}, 669 | "source": [ 670 | "### 17. Print checking balance after making a checking to savings transfer\n", 671 | "\n", 672 | "Now that a transfer has been made from the checking to savings account, print your checking balance. Call the `check_balance()` function with these arguments; `\"checking\"`, `checking_balance` and `savings_balance` within a print function. Your new checking balance should print. " 673 | ] 674 | }, 675 | { 676 | "cell_type": "code", 677 | "execution_count": 25, 678 | "metadata": {}, 679 | "outputs": [ 680 | { 681 | "name": "stdout", 682 | "output_type": "stream", 683 | "text": [ 684 | " Your checking balance is 19\n" 685 | ] 686 | } 687 | ], 688 | "source": [ 689 | "print(check_balance(\"checking\", checking_balance , savings_balance)) " 690 | ] 691 | }, 692 | { 693 | "cell_type": "markdown", 694 | "metadata": {}, 695 | "source": [ 696 | "### 18. Print savings balance after making a checking to savings transfer\n", 697 | "\n", 698 | "Now that a transfer has been made from the checking to savings account, print your savings balance. Call the `check_balance()` function with these arguments; `\"savings\"`, `checking_balance` and `savings_balance` within a print function. Your new savings balance should print. " 699 | ] 700 | }, 701 | { 702 | "cell_type": "code", 703 | "execution_count": 26, 704 | "metadata": {}, 705 | "outputs": [ 706 | { 707 | "name": "stdout", 708 | "output_type": "stream", 709 | "text": [ 710 | " Your savings balance is 10\n" 711 | ] 712 | } 713 | ], 714 | "source": [ 715 | "print(check_balance(\"savings\", checking_balance , savings_balance))" 716 | ] 717 | }, 718 | { 719 | "cell_type": "markdown", 720 | "metadata": {}, 721 | "source": [ 722 | "### 19. Call transfer function and make a savings to checking transfer\n", 723 | "\n", 724 | "On the next line, call the `acc_transfer()` function with these arguments; `\"savings\"`, `\"checking\"`, `5`,`checking_balance` and `savings_balance`. Assign the function call to the matching `checking_balance` and `savings_balance` variables that are also being returned by the function. That is how the new balances are being updated.\n" 725 | ] 726 | }, 727 | { 728 | "cell_type": "code", 729 | "execution_count": 27, 730 | "metadata": {}, 731 | "outputs": [ 732 | { 733 | "name": "stdout", 734 | "output_type": "stream", 735 | "text": [ 736 | "transfer of 5 from your savings to your checking account was\n" 737 | ] 738 | } 739 | ], 740 | "source": [ 741 | "checking_balance, savings_balance = acc_transfer(\"savings\", \"checking\", 5, checking_balance,savings_balance)" 742 | ] 743 | }, 744 | { 745 | "cell_type": "markdown", 746 | "metadata": {}, 747 | "source": [ 748 | "### 20. Print checking balance after making a savings to checking transfer\n", 749 | "\n", 750 | "Now that a transfer has been made from the savings to checking account, print your checking balance. Call the `check_balance()` function with these arguments; `\"checking\"`, `checking_balance` and `savings_balance` within a print function. Your new checking balance should print." 751 | ] 752 | }, 753 | { 754 | "cell_type": "code", 755 | "execution_count": 28, 756 | "metadata": {}, 757 | "outputs": [ 758 | { 759 | "name": "stdout", 760 | "output_type": "stream", 761 | "text": [ 762 | " Your checking balance is 5\n" 763 | ] 764 | } 765 | ], 766 | "source": [ 767 | "print(check_balance(\"checking\", checking_balance, savings_balance))" 768 | ] 769 | }, 770 | { 771 | "cell_type": "markdown", 772 | "metadata": {}, 773 | "source": [ 774 | "### 21. Print saving balance after making a savings to checking transfer\n", 775 | "\n", 776 | "Now that a transfer has been made from the savings to checking account, print your saving balance. Call the `check_balance()` function with these arguments; `\"savings\"`, `checking_balance` and `savings_balance` within a print function. Your new saving balance should print." 777 | ] 778 | }, 779 | { 780 | "cell_type": "code", 781 | "execution_count": 29, 782 | "metadata": {}, 783 | "outputs": [ 784 | { 785 | "name": "stdout", 786 | "output_type": "stream", 787 | "text": [ 788 | " Your savings balance is 24\n" 789 | ] 790 | } 791 | ], 792 | "source": [ 793 | "print(check_balance(\"savings\", checking_balance, savings_balance))" 794 | ] 795 | }, 796 | { 797 | "cell_type": "markdown", 798 | "metadata": {}, 799 | "source": [ 800 | "### 22. Conclusion\n", 801 | "\n", 802 | "Congrats on completing a simple Python for Finance off-platform project. Feel free to change the variables to test the different possible outcomes. " 803 | ] 804 | }, 805 | { 806 | "cell_type": "code", 807 | "execution_count": null, 808 | "metadata": {}, 809 | "outputs": [], 810 | "source": [] 811 | }, 812 | { 813 | "cell_type": "code", 814 | "execution_count": null, 815 | "metadata": {}, 816 | "outputs": [], 817 | "source": [] 818 | } 819 | ], 820 | "metadata": { 821 | "kernelspec": { 822 | "display_name": "Python 3", 823 | "language": "python", 824 | "name": "python3" 825 | }, 826 | "language_info": { 827 | "codemirror_mode": { 828 | "name": "ipython", 829 | "version": 3 830 | }, 831 | "file_extension": ".py", 832 | "mimetype": "text/x-python", 833 | "name": "python", 834 | "nbconvert_exporter": "python", 835 | "pygments_lexer": "ipython3", 836 | "version": "3.7.4" 837 | }, 838 | "latex_envs": { 839 | "LaTeX_envs_menu_present": true, 840 | "autoclose": false, 841 | "autocomplete": true, 842 | "bibliofile": "biblio.bib", 843 | "cite_by": "apalike", 844 | "current_citInitial": 1, 845 | "eqLabelWithNumbers": true, 846 | "eqNumInitial": 1, 847 | "hotkeys": { 848 | "equation": "Ctrl-E", 849 | "itemize": "Ctrl-I" 850 | }, 851 | "labels_anchors": false, 852 | "latex_user_defs": false, 853 | "report_style_numbering": false, 854 | "user_envs_cfg": false 855 | }, 856 | "widgets": { 857 | "application/vnd.jupyter.widget-state+json": { 858 | "state": {}, 859 | "version_major": 2, 860 | "version_minor": 0 861 | } 862 | } 863 | }, 864 | "nbformat": 4, 865 | "nbformat_minor": 2 866 | } 867 | -------------------------------------------------------------------------------- /ipywidgets-fv.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## MEDIUM 002 - Future Values and Ipywidgets" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "# Importing the libraries\n", 17 | "import numpy as np\n", 18 | "import numpy_financial as npf\n", 19 | "import matplotlib.pyplot as plt\n", 20 | "import ipywidgets as widgets\n", 21 | "from IPython.display import display\n", 22 | "from ipywidgets import HBox, VBox" 23 | ] 24 | }, 25 | { 26 | "cell_type": "code", 27 | "execution_count": 2, 28 | "metadata": {}, 29 | "outputs": [ 30 | { 31 | "name": "stdout", 32 | "output_type": "stream", 33 | "text": [ 34 | "Enabling notebook extension jupyter-js-widgets/extension...\r\n", 35 | " - Validating: \u001b[32mOK\u001b[0m\r\n" 36 | ] 37 | } 38 | ], 39 | "source": [ 40 | "\n", 41 | "!jupyter nbextension enable --py --sys-prefix widgetsnbextension" 42 | ] 43 | }, 44 | { 45 | "cell_type": "code", 46 | "execution_count": 3, 47 | "metadata": {}, 48 | "outputs": [], 49 | "source": [ 50 | "def fv_cum(value, r, t):\n", 51 | " future_value = value*(1+r)**t\n", 52 | " \n", 53 | " return round(future_value, 2)" 54 | ] 55 | }, 56 | { 57 | "cell_type": "code", 58 | "execution_count": 4, 59 | "metadata": {}, 60 | "outputs": [ 61 | { 62 | "data": { 63 | "text/plain": [ 64 | "574.35" 65 | ] 66 | }, 67 | "execution_count": 4, 68 | "metadata": {}, 69 | "output_type": "execute_result" 70 | } 71 | ], 72 | "source": [ 73 | "fv_cum(100, .06, 30)" 74 | ] 75 | }, 76 | { 77 | "cell_type": "markdown", 78 | "metadata": {}, 79 | "source": [ 80 | "### Future Value\n", 81 | "\n", 82 | "The numpy financial module contains a function future value, .fv(rate, nper, pmt, pv), which allows you to calculate the future value of an investment as before with a few simple parameters:\n", 83 | "\n", 84 | "* rate: The rate of return of the investment\n", 85 | "* nper: The lifespan of the investment\n", 86 | "* pmt: The (fixed) payment at the beginning or end of each period (which is 0 in our example)\n", 87 | "* pv: The present value of the investment\n", 88 | "\n", 89 | "It is important to note that in this function call, you must pass a negative value into the pv parameter if it represents a negative cash flow (cash going out). In other words, if you were to compute the future value of an investment, requiring an up-front cash payment, you would need to pass a negative value to the pv parameter in the .fv() function." 90 | ] 91 | }, 92 | { 93 | "cell_type": "markdown", 94 | "metadata": {}, 95 | "source": [ 96 | "- Instructions :\n", 97 | "\n", 98 | "1. Using Numpy's .fv() function, calculate the future value of a $100 investment returning 7% per year for 2 years \n" 99 | ] 100 | }, 101 | { 102 | "cell_type": "code", 103 | "execution_count": 5, 104 | "metadata": {}, 105 | "outputs": [ 106 | { 107 | "name": "stdout", 108 | "output_type": "stream", 109 | "text": [ 110 | "$110.25\n" 111 | ] 112 | } 113 | ], 114 | "source": [ 115 | "# Calculate investment\n", 116 | "investment = npf.fv(rate=.05, nper=2, pmt=0, pv=-100)\n", 117 | "print(\"$\" + str(round(investment, 2)))\n" 118 | ] 119 | }, 120 | { 121 | "cell_type": "markdown", 122 | "metadata": {}, 123 | "source": [ 124 | "### Different interest rates" 125 | ] 126 | }, 127 | { 128 | "cell_type": "code", 129 | "execution_count": 9, 130 | "metadata": {}, 131 | "outputs": [ 132 | { 133 | "data": { 134 | "text/plain": [ 135 | "Text(0.5, 0, 'years')" 136 | ] 137 | }, 138 | "execution_count": 9, 139 | "metadata": {}, 140 | "output_type": "execute_result" 141 | }, 142 | { 143 | "data": { 144 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmoAAAHgCAYAAAAVEUFcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAABr/klEQVR4nO3dd3hUVf7H8fdJ7z2QBqEJUqVEitjRxa67dn/2rqirrL2sCuvaXcuKDcGyKrquhVWxYVkLoICAFOkIIUBCSO/JnN8fM4QQEgiQyZ1MPq/nmWfunHvvzPc6JPl47r3nGGstIiIiIuJ7ApwuQERERESapqAmIiIi4qMU1ERERER8lIKaiIiIiI9SUBMRERHxUQpqIiIiIj4qyOkCvCUpKcl269bN6TJERERE9mjevHlbrbXJjdv9Nqh169aNuXPnOl2GiIiIyB4ZY35vql2nPkVERER8lIKaiIiIiI9SUBMRERHxUX57jVpTampqyM7OprKy0ulS2oWwsDAyMjIIDg52uhQREZEOqUMFtezsbKKjo+nWrRvGGKfL8WnWWvLz88nOzqZ79+5OlyMiItIhdahTn5WVlSQmJiqktYAxhsTERPU+ioiIOKhDBTVAIW0v6L+ViIiIszpcUPMnDz74IL169aJPnz589tlnAFRVVXHccccxYMAAJk2aVL/tlVdeyS+//OJUqSIiIrIPFNQcYq3F5XLt8/5Lly5l2rRpLFmyhE8//ZRrr72Wuro6PvvsM4YNG8aiRYt48cUXAVi4cCEul4shQ4a0VvkiIiLSBhTU2tC6devo27cv1157LUOHDmXDhg37/F4ffvgh55xzDqGhoXTv3p1evXrx008/ERwcTEVFBbW1tfXb3nPPPUyYMKE1DkFERETaUIe667Oh+/+7hKU5xa36nv3SYrj35P673Wb58uVMnTp1p9OS29100018/fXXu7Sfc8453H777Tu1bdy4kZEjR9a/zsjIYOPGjZx22mm8/vrrjBgxgltvvZXp06czbNgw0tLS9vGoRERExCkdNqg5JTMzc6eA1dA//vGPFr+PtXaXNmMMQUFBvPnmm4B73LixY8cyffp0xo8fz/r167nwwgs55ZRT9q14ERERaVMdNqjtqefLWyIjI5tdtzc9ahkZGTudOs3Ozt6l12zSpElcdNFFzJo1i5CQEN5++21GjRqloCYiItJOdNig5ov2pkftlFNO4bzzzmP8+PHk5OSwcuVKhg8fXr++oKCAjz76iM8//5zp06cTEBCAMUbjoomIiLQjCmrtVP/+/TnrrLPo168fQUFBPPvsswQGBtavnzBhAnfffTfGGMaOHcuzzz7LwIEDufrqqx2sWkRERPaGaepaJ3+QlZVl586du1PbsmXL6Nu3r0MVtU/6byYiIuJ9xph51tqsxu0ankNERESkCa7KSmpycx2tQUFNREREpAlFH3zA6jHHUL1unWM1KKiJiIiINGLr6sifMpXQvn0Jzsx0rA4FNREREZFGSr74gpr160m87DKMMY7VoaAmIiIi0oC1lvyXJhOSmUn0MWMcrUVBTURERKSB8jk/UblkCQmXXoppMPSVExTU2ql169YRHh7O4MGDGTx4cP34aFVVVRx33HEMGDBgp/lEr7zySn755RenyhUREWk38l9+mcDERGJPO9XpUrwX1IwxU4wxucaYxY3arzfGLDfGLDHGPNKg/Q5jzCrPurEN2ocZY371rHvaOHmiuBVZa3G5XPv1Hj179mTBggUsWLCA559/HoDPPvuMYcOGsWjRIl588UUAFi5ciMvlYsiQIftdt4iIiD+rXL6csu++I+GCCwgIDXW6HK/2qL0CHNewwRhzFHAqMMha2x94zNPeDzgH6O/ZZ5IxZntf43PAlcABnsdO79merFu3jr59+3LttdcydOjQnebqbC3BwcFUVFRQW1tb33bPPfcwYcKEVv8sERERf5M/+WVMRATx557jdCmAF6eQstb+zxjTrVHzNcBD1toqzzbbR5E7FZjmaV9rjFkFDDfGrANirLWzAIwxrwGnATP2u8AZt8PmX/f7bXaSMhCOf2i3myxfvpypU6fudFpyu72ZlB1g7dq1DBkyhJiYGP72t79x2GGHceyxx/L6668zYsQIbr31VqZPn86wYcN2mbBdREREdlazcSPFn3xCwvnnExgb63Q5QNvP9dkbOMwY8wBQCdxsrf0ZSAdmN9gu29NW41lu3N5uZWZmMnLkyCbX7c2k7Kmpqaxfv57ExETmzZvHaaedxpIlS4iJieHNN98EoKamhrFjxzJ9+nTGjx/P+vXrufDCCznllFNa5VhERET8Sf6rr4IxJFx8kdOl1GvroBYExAMjgYOBd4wxPYCmrjuzu2lvkjHmStynSenatevuK9lDz5e3REZGNrtub3rUQkNDCfWcOx82bBg9e/ZkxYoVZGXtmCZs0qRJXHTRRcyaNYuQkBDefvttRo0apaAmIiLSSG1BAYX/fpfYE08kODXV6XLqtXVQywbes+6Z4H8yxriAJE97lwbbZQA5nvaMJtqbZK19EXgR3JOyt27p3rc3PWp5eXkkJCQQGBjImjVrWLlyJT169KhfX1BQwEcffcTnn3/O9OnTCQgIwBhDZWWlN0oXERFp1wreegtbUUHCpZc6XcpO2np4jg+AowGMMb2BEGArMB04xxgTaozpjvumgZ+stZuAEmPMSM/dnhcCH7ZxzT7pf//7H4MGDeKggw7ijDPO4PnnnychIaF+/YQJE7j77rsxxjB27Fjmzp3LwIEDueKKKxysWkRExPe4KispeP1fRB5xOGF9ejtdzk681qNmjHkLOBJIMsZkA/cCU4ApniE7qoGLPL1rS4wx7wBLgVpgnLW2zvNW1+C+gzQc900E+38jgUO6devG4sWL97xhC5x++umcfvrpza5v2DsXFhbG559/3iqfKyIi4m+K3n+fuoICki6/3OlSduHNuz7PbWbV+c1s/wDwQBPtc4EBrViaiIiICLBj8vWwgwYR3uA6b1+hmQlERESkwyr54gtqNmxwfPL15iioiYiISIe00+TrY5ydfL05CmoiIiLSIZXPmeOefP0y5ydfb46CmoiIiHRI+ZNfJjApidhTnZ98vTkKaiIiItLhVP72G2Xff+8zk683R0GtncrPz+eoo44iKiqK6667bqd18+bNY+DAgfTq1YsbbrgB9wgo8MwzzzBgwABOOOEEqqurAfj+++8ZP358m9cvIiLipPyXpxAQEUH8OWc7XcpuKag5xFqLy+Xa5/3DwsKYOHEijz322C7rrrnmGl588UVWrlzJypUr+fTTTwGYPHkyixYtYsiQIXz22WdYa5k4cSL33HPPPtchIiLS3lRnuydfjzvrLJ+ZfL05CmptaN26dfTt25drr72WoUOHsmHDhn1+r8jISA499FDCwsJ2at+0aRPFxcWMGjUKYwwXXnghH3zwQf36mpoaysvLCQ4O5vXXX+eEE04gPj5+n+sQERFpb7b54OTrzWnruT59xsM/Pcxv235r1fc8MOFAbht+2263Wb58OVOnTmXSpEm7rNubSdmbs3HjRjIydkyPmpGRwcaNGwG4+eabGTlyJP3792f0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\n", 145 | "text/plain": [ 146 | "
" 147 | ] 148 | }, 149 | "metadata": { 150 | "needs_background": "light" 151 | }, 152 | "output_type": "display_data" 153 | } 154 | ], 155 | "source": [ 156 | "plt.figure(figsize=(10,8))\n", 157 | "\n", 158 | "y = [npf.fv(rate=np.linspace(0.0,0.15,num=4), nper=i, pmt=0.0, pv=-100) for i in range(21)]\n", 159 | "\n", 160 | "plt.plot(y)\n", 161 | "\n", 162 | "plt.legend([\"r = 0%\", \"r = 5%\",\"r = 10%\" , \"r = 15%\"])\n", 163 | "\n", 164 | "plt.ylabel('Future value of $100, dollars')\n", 165 | "plt.xlabel('years')" 166 | ] 167 | }, 168 | { 169 | "cell_type": "markdown", 170 | "metadata": {}, 171 | "source": [ 172 | "### Using Ipywidgets" 173 | ] 174 | }, 175 | { 176 | "cell_type": "code", 177 | "execution_count": 8, 178 | "metadata": {}, 179 | "outputs": [ 180 | { 181 | "data": { 182 | "application/vnd.jupyter.widget-view+json": { 183 | "model_id": "bd6d05eb63824b9587ce732aec477810", 184 | "version_major": 2, 185 | "version_minor": 0 186 | }, 187 | "text/plain": [ 188 | "interactive(children=(FloatSlider(value=0.1, description='rate', max=0.2, step=0.01), Output()), _dom_classes=…" 189 | ] 190 | }, 191 | "metadata": {}, 192 | "output_type": "display_data" 193 | } 194 | ], 195 | "source": [ 196 | "import ipywidgets as widgets\n", 197 | "from IPython.display import display\n", 198 | "\n", 199 | "%matplotlib inline\n", 200 | "\n", 201 | "\n", 202 | "def show_fv(rate):\n", 203 | " plt.figure(figsize=(10,8))\n", 204 | " y = [npf.fv(rate, nper=i, pmt=0, pv=-100) for i in range(21)]\n", 205 | "\n", 206 | " plt.plot(y)\n", 207 | "\n", 208 | " plt.ylabel('Future value of $100, dollars')\n", 209 | " plt.xlabel('years')\n", 210 | " \n", 211 | "controls = widgets.interactive(show_fv,rate=(0, .20, .01))\n", 212 | "\n", 213 | "display(controls)\n" 214 | ] 215 | }, 216 | { 217 | "cell_type": "markdown", 218 | "metadata": {}, 219 | "source": [ 220 | "### Adjusting Future Values for Inflation\n", 221 | "\n", 222 | "You can now put together what you learned in the previous exercises by following a simple methodology:\n", 223 | "\n", 224 | "First, forecast the future value of an investment given a rate of return\n", 225 | "Second, discount the future value of the investment by a projected inflation rate\n", 226 | "The methodology above will use both the .fv() and .pv() functions to arrive at the projected value of a given investment in today's dollars, adjusted for inflation.\n", 227 | "\n", 228 | "- Instructions:\n", 229 | "\n", 230 | "1. Calculate the future value of a $10,000 investment returning 8% per year for 10 years using .fv() and assign it to investment_1.\n", 231 | "\n", 232 | "2. Calculate the inflation-adjusted present value of investment_1, using an inflation rate of 3% per year and assign it to investment_1_discounted." 233 | ] 234 | }, 235 | { 236 | "cell_type": "code", 237 | "execution_count": null, 238 | "metadata": {}, 239 | "outputs": [], 240 | "source": [ 241 | "# Calculate investment_1\n", 242 | "investment_1 = npf.fv(rate=0.08, nper=10, pmt=0, pv=-10000)\n", 243 | "print(\"Investment 1 will yield a total of $\" + str(round(investment_1, 2)) + \" in 10 years\")\n", 244 | "\n", 245 | "# Calculate investment_2\n", 246 | "investment_1_discounted = npf.pv(rate=0.03, nper=10, pmt=0, fv=investment_1)\n", 247 | "print(\"After adjusting for inflation, investment 1 is worth $\" + str(round(-investment_1_discounted, 2)) + \" in today's dollars\")" 248 | ] 249 | }, 250 | { 251 | "cell_type": "markdown", 252 | "metadata": {}, 253 | "source": [ 254 | "### Discounting Cash Flows\n", 255 | "\n", 256 | "You can use numpy's net present value function numpy.npv(rate, values) to calculate the net present value of a series of cash flows. You can create these cash flows by using a numpy.array([...]) of values.\n", 257 | "\n" 258 | ] 259 | }, 260 | { 261 | "cell_type": "code", 262 | "execution_count": null, 263 | "metadata": {}, 264 | "outputs": [], 265 | "source": [ 266 | "\n", 267 | "# Predefined array of cash flows\n", 268 | "cash_flows = np.array([100, 100, 100, 100, 100])\n", 269 | "\n", 270 | "# Calculate investment_1\n", 271 | "investment_1 = npf.npv(rate=.03, values=cash_flows)\n", 272 | "print(\"Investment 1's net present value is $\" + str(round(investment_1, 2)) + \" in today's dollars\")\n", 273 | "\n", 274 | "# Calculate investment_2\n", 275 | "investment_2 = npf.npv(rate=.05, values=cash_flows)\n", 276 | "print(\"Investment 2's net present value is $\" + str(round(investment_2, 2)) + \" in today's dollars\")\n" 277 | ] 278 | }, 279 | { 280 | "cell_type": "markdown", 281 | "metadata": {}, 282 | "source": [ 283 | "### Initial Project Costs\n", 284 | "\n", 285 | "The numpy.npv(rate, values) function is very powerful because it allows you to pass in both positive and negative values.\n", 286 | "\n", 287 | "- Instructions:\n", 288 | "1. Create a numpy array of the cash flow values for project 1, assigning it to cash_flows_1, and then do the same for project 2, assigning the values to cash_flows_2.\n", 289 | "\n", 290 | "2. Calculate the net present value of both projects 1 and 2 assuming a 3% inflation rate.\n" 291 | ] 292 | }, 293 | { 294 | "cell_type": "code", 295 | "execution_count": null, 296 | "metadata": {}, 297 | "outputs": [], 298 | "source": [ 299 | "# Create an array of cash flows for project 1\n", 300 | "cash_flows_1 = np.array([-250, 100, 200, 300, 400])\n", 301 | "\n", 302 | "# Create an array of cash flows for project 2\n", 303 | "cash_flows_2 = np.array([-250, 300, -250, 300, 300])\n", 304 | "\n", 305 | "\n", 306 | "# Calculate the net present value of project 1\n", 307 | "investment_1 = npf.npv(rate=0.03, values=cash_flows_1)\n", 308 | "\n", 309 | "print(\"The net present value of Investment 1 is worth $\" + str(round(investment_1, 2)) + \" in today's dollars\")\n", 310 | "\n", 311 | "# Calculate the net present value of project 2\n", 312 | "investment_2 = npf.npv(rate=0.03, values=cash_flows_2)\n", 313 | "print(\"The net present value of Investment 2 is worth $\" + str(round(investment_2, 2)) + \" in today's dollars\")" 314 | ] 315 | }, 316 | { 317 | "cell_type": "markdown", 318 | "metadata": {}, 319 | "source": [ 320 | "### Diminishing Cash Flows\n", 321 | "\n", 322 | "Remember how compounded returns grow rapidly over time? Well, it works in the reverse, too. Compounded discount factors over time will quickly shrink a number towards zero.\n" 323 | ] 324 | }, 325 | { 326 | "cell_type": "code", 327 | "execution_count": null, 328 | "metadata": {}, 329 | "outputs": [], 330 | "source": [ 331 | "# Calculate investment_1\n", 332 | "investment_1 = npf.pv(rate=.03, nper=30, pmt=0, fv=100)\n", 333 | "print(\"Investment 1 is worth $\" + str(round(-investment_1, 2)) + \" in today's dollars\")\n", 334 | "\n", 335 | "# Calculate investment_2\n", 336 | "investment_2 = npf.pv(rate=.03, nper=50, pmt=0, fv=100)\n", 337 | "print(\"Investment 2 is worth $\" + str(round(-investment_2, 2)) + \" in today's dollars\")\n" 338 | ] 339 | }, 340 | { 341 | "cell_type": "code", 342 | "execution_count": null, 343 | "metadata": {}, 344 | "outputs": [], 345 | "source": [] 346 | }, 347 | { 348 | "cell_type": "code", 349 | "execution_count": null, 350 | "metadata": {}, 351 | "outputs": [], 352 | "source": [] 353 | }, 354 | { 355 | "cell_type": "code", 356 | "execution_count": null, 357 | "metadata": {}, 358 | "outputs": [], 359 | "source": [] 360 | } 361 | ], 362 | "metadata": { 363 | "kernelspec": { 364 | "display_name": "Python 3", 365 | "language": "python", 366 | "name": "python3" 367 | }, 368 | "language_info": { 369 | "codemirror_mode": { 370 | "name": "ipython", 371 | "version": 3 372 | }, 373 | "file_extension": ".py", 374 | "mimetype": "text/x-python", 375 | "name": "python", 376 | "nbconvert_exporter": "python", 377 | "pygments_lexer": "ipython3", 378 | "version": "3.8.5" 379 | }, 380 | "widgets": { 381 | "application/vnd.jupyter.widget-state+json": { 382 | "state": { 383 | "0101ebe1b4ca432780b03d1416cfe731": { 384 | "model_module": "@jupyter-widgets/base", 385 | "model_module_version": "1.2.0", 386 | "model_name": "LayoutModel", 387 | "state": {} 388 | }, 389 | "3beaa5b1b3e54f0a9891f5730c66bfd7": { 390 | "model_module": "@jupyter-widgets/base", 391 | "model_module_version": "1.2.0", 392 | "model_name": "LayoutModel", 393 | "state": {} 394 | }, 395 | "619130cbad9142a884a6921519930820": { 396 | "model_module": "@jupyter-widgets/controls", 397 | "model_module_version": "1.5.0", 398 | "model_name": "VBoxModel", 399 | "state": { 400 | "_dom_classes": [ 401 | "widget-interact" 402 | ], 403 | "children": [ 404 | "IPY_MODEL_79dd6acb6b6343ac96f13e988bb12a13", 405 | "IPY_MODEL_7ebf02243a3348f4b93cee372070487f" 406 | ], 407 | "layout": "IPY_MODEL_3beaa5b1b3e54f0a9891f5730c66bfd7" 408 | } 409 | }, 410 | "79dd6acb6b6343ac96f13e988bb12a13": { 411 | "model_module": "@jupyter-widgets/controls", 412 | "model_module_version": "1.5.0", 413 | "model_name": "FloatSliderModel", 414 | "state": { 415 | "description": "rate", 416 | "layout": "IPY_MODEL_0101ebe1b4ca432780b03d1416cfe731", 417 | "max": 0.2, 418 | "step": 0.01, 419 | "style": "IPY_MODEL_bf9653dfb22243f184496c09c0879a98", 420 | "value": 0.1 421 | } 422 | }, 423 | "7ebf02243a3348f4b93cee372070487f": { 424 | "model_module": "@jupyter-widgets/output", 425 | "model_module_version": "1.0.0", 426 | "model_name": "OutputModel", 427 | "state": { 428 | "layout": "IPY_MODEL_fc979331934542b5867945b8ceda1a8f", 429 | "outputs": [ 430 | { 431 | "data": { 432 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEKCAYAAAD9xUlFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3dd3xW9fn/8dcFYQuEsERImAHFwQpDHBVRq1bFUXHVVSxqnbVfW237rVbbX9XWWq39YqkLEAUHCLXO4l4IBGTI3mGFGUaAkOT6/XEOacSE3ISc+854Px+P+3Gf8zmfc99XTu7cV875jGPujoiICECtRAcgIiKVh5KCiIgUUVIQEZEiSgoiIlJESUFERIooKYiISJHIkoKZdTOzWcUe283sTjNLMbP3zGxx+NwsrG9m9oSZLTGz2WbWO6rYRESkZJElBXdf6O493b0n0AfIBSYC9wBT3D0dmBKuA5wDpIeP4cCIqGITEZGSxevy0WBgqbuvBIYAo8LyUcCF4fIQYLQHvgSSzaxNnOITEREgKU7vcznwUrjc2t3XAbj7OjNrFZa3BVYX2ycrLFtX2ou2aNHCO3ToUPHRiohUYzNmzNjk7i1L2hZ5UjCzusAFwL1lVS2h7DtzcJjZcILLS6SlpTF9+vTDjlFEpCYxs5WlbYvH5aNzgEx33xCub9h/WSh8zg7Ls4DUYvu1A9Ye+GLuPtLdM9w9o2XLEhOdiIiUUzySwhX899IRwGTg2nD5WmBSsfJrwl5IA4Cc/ZeZREQkPiK9fGRmDYEzgRuLFT8EvGxmw4BVwKVh+ZvAucASgp5K10cZm4iIfFekScHdc4HmB5RtJuiNdGBdB26JMh4RETk4jWgWEZEiSgoiIlJESUFERIooKYiIVCGFhc4f/v0NqzbnRvL6SgoiIlXIPz9Zxj8/Wc7nSzdF8vpKCiIiVcTsrG386Z2FnH3skVzWN7XsHcpBSUFEpArYtTefO8bNomXjejx0yfGYlTQz0OGL14R4IiJyGO6fPI8Vm3cx7icDSG5YN7L30ZmCiEgl96+v1/LKjCxuHdSF/p2al73DYVBSEBGpxFZvyeVXE+bQOy2ZOwanR/5+SgoiIpVUfkEhd46fBcDjl/ciqXb0X9lqUxARqaSeeH8JM1Zu5fHLe5Ka0jAu76kzBRGRSuir5Vt48v3FXNy7LUN6to3b+yopiIhUMjm5+7hz3EzSUhrywJDj4vreunwkIlKJuDv3TpxN9o69vHbzQI6oF9+vaZ0piIhUIi9PX82bc9bz87O60SM1Oe7vr6QgIlJJLMneyf2Tv2Fg5+bceGqnhMSgpCAiUgnszS/gjnEzqV+nFo9d1pNataKZxqIsalMQEakE/vT2Quat3c4/r8mgdZP6CYtDZwoiIgn20aKNPP3pcq4e0J4zu7dOaCxKCiIiCbRp515+/vLXdGvdmF//4JhEh6PLRyIiiVJY6PzPK1+zfc8+xt7Qn/p1aic6JJ0piIgkyvOfr+DDhRv5zQ+OoduRjRMdDqCkICKSEPPW5vDQWws445hWXD2gfaLDKaKkICISZ7vzCrj9pZkkN6zDIz/sEdld1MpDbQoiInHk7tw7YTbLNu3ihWH9SWkU3V3UyiPSMwUzSzazV81sgZnNN7MTzSzFzN4zs8Xhc7OwrpnZE2a2xMxmm1nvKGMTEUmE5z5bweuz1nLXGV05qUuLRIfzHVFfPnoceNvdjwZ6APOBe4Ap7p4OTAnXAc4B0sPHcGBExLGJiMTVl8s284c353Nm99bcMqhLosMpUWRJwcyaAKcCzwC4e567bwOGAKPCaqOAC8PlIcBoD3wJJJtZm6jiExGJp3U5u7n1xUzaN2/IX4b2SNg0FmWJ8kyhE7AReM7MZprZ02bWCGjt7usAwudWYf22wOpi+2eFZd9iZsPNbLqZTd+4cWOE4YuIVIy9+QXc9EImu/MKGHl1HxrXr5PokEoVZVJIAnoDI9y9F7CL/14qKklJadO/U+A+0t0z3D2jZcuWFROpiEiE7ps0j69Xb+PRoT3p0qpyjEcoTZRJIQvIcvep4fqrBEliw/7LQuFzdrH6qcX2bwesjTA+EZHIvTh1FeOmreaWQZ05+7gjEx1OmSJLCu6+HlhtZt3CosHAN8Bk4Nqw7FpgUrg8Gbgm7IU0AMjZf5lJRKQqyly1lfsmz+XUri2568xuZe9QCcQ0TsHMLiXoRbTDzH5D8B//7909s4xdbwPGmlldYBlwPUEietnMhgGrgEvDum8C5wJLgNywrohIlZS9Yw83vzCDNk0b8MTlPaldSRuWDxTr4LX/dfdXzOxk4PvAnwm6jPY/2E7uPgvIKGHT4BLqOnBLjPGIiFRa+woKuXXsTHJ272PCzf1Ibli5BqgdTKyXjwrC5x8QNBxPAqrOTykiEkd/+Pd8vlqxhYcvOYHuRzVJdDiHJNaksMbM/gEMBd40s3qHsK+ISI0xITOL5z9fwbCTOzKk53d61Vd6sX6xDwXeAc4OB6ClAHdHFpWISBU0d00O906Yw4BOKdx7ztGJDqdcymxTMLNawFfuftz+srBXkHoGiYiEtuzK48YxM0hpVJcnr+xNUu2qeTGlzKjdvRD42szS4hCPiEiVk19QyG0vZbJx516e+lEfWhxRL9EhlVusvY/aAPPM7CuCkckAuPsFkUQlIlKF/OmdhXy2ZDOPXHICPVKTEx3OYYk1Kfwu0ihERKqoN2av5R8fL+Oq/mkM7Zta9g6VXExJwd0/ijoQEZGqZuH6Hfzi1dn0TkvmvvOPTXQ4FSKmlhAzG2Bm08xsp5nlmVmBmW2POjgRkcoqZ/c+bhwznUb1khjxoz7UTaqaDcsHivWneBK4AlgMNABuCMtERGqcfQWF3PpiJllbdzPiqt60blI/0SFVmJjv0ezuS8ystrsXENwj4fMI4xIRqZTcnV9NmMMnizfxyA9PIKNDSqJDqlCxJoXccFK7WWb2CMEYhUbRhSUiUjn97f0lvDIji9sHpzM0o+o3LB8o1stHVwO1gVsJuqSmApdEFZSISGX02ows/vLeIi7u3ZafnZGe6HAiEWvvo5Xh4m7UPVVEaqDPl2zil6/NZmDn5jx08QmYVY2psA/VQZOCmc2hhFti7ufuJ1R4RCIilcyiDTu48YUZdGrZqFr1NCpJWWcK58UlChGRSmrD9j1c9+xXNKhTm+eu70fTBnUSHVKkDpoUil02EhGpcXbtzefHz09j2+59vHzjibRNbpDokCJX1uWjHXz78pGF60Zws7SqdfcIEZEY5YdjERas38HT12ZwXNumiQ4pLso6U2gcr0BERCoLd+d/J83jg4Ub+X8XHc+gbq0SHVLcxDx4zcx6AKeEqx+7++xoQhIRSawRHy3lpa9WcfNpnbmyf826a0Cscx/dAYwFWoWPsWZ2W5SBiYgkwqRZa3jk7YVc0OMo7j6rW6LDibtYzxSGAf3dfReAmT0MfAH8LarARETibeqyzdz9ymz6dUzhT5eeQK1a1XMswsHE2tnWgIJi6wVhmYhItbAkeyfDx8ygXUoDRl7dh3pJtRMdUkLEeqbwHDDVzCaG6xcCz0QTkohIfG3csZfrnvuKOrWNUdf3I7lh3USHlDCxTnPxFzP7EDiZ4AzhenefGWVgIiLxkJuXzw2jprF5Zx7jhg8gNaVhokNKqLLGKRSfE3ZF+Cja5u5byth/BbCD4HJTvrtnhK85HugQvt5Qd99qwUQijwPnArnAde6eeWg/johI7AoKndtfmsmcNTn84+qMKn9/5YpQVpvCDGB6+LwRWERwo52NYVksBrl7T3fPCNfvAaa4ezowJVwHOAdIDx/DgRGx/hAiIofK3blv8lz+Mz+b+y84ljO7t050SJXCQZOCu3d0907AO8D57t7C3ZsTzIk0oZzvOQQYFS6PImif2F8+2gNfAslm1qac7yEiUip356G3FvDCl6u48dROXHNih0SHVGnE2vuor7u/uX/F3d8CvhfDfg68a2YzzGx4WNba3deFr7OOYNwDQFtgdbF9s8IyEZEK9fiUxfzj42X8aEAa95xzdKLDqVRi7X20ycx+A7xA8EX/I2BzDPud5O5rzawV8J6ZLThI3ZK6uH5n2u4wuQwHSEurWSMNReTw/eOjpfz1P4v5YZ92PHDBcdX2vgjlFeuZwhVAS2Bi+GgZlh2Uu68Nn7PD/foBG/ZfFgqfs8PqWQR3dNuvHbC2hNcc6e4Z7p7RsmXLGMMXEYHRX6zgj28t4LwT2vDwJTVzcFpZYkoK7r7F3e9w917u3tvd74yh51EjM2u8fxk4C5gLTAauDatdC0wKlycD11hgAJCz/zKTiMjhennaan47aR5ndm/NY5f1pLYSQolinhCvHFoDE8NTsyTgRXd/28ymAS+b2TBgFXBpWP9Ngu6oSwi6pF4fYWwiUoNMmrWGX06YzSnpLXjyyl7UqV1975x2uCJLCu6+DOhRQvlmYHAJ5Q7cElU8IlIzvT13PXe9/DV9O6Qw8uqMGjt9RayULkWk2vpwYTa3vZTJ8W2b8ux1fWlQVwmhLOVKCmb2UzO7zMyivPwkIlJuXyzdzI1jZtC1dWNG/bgfR9TT11UsynumYATzIJV3AJuISGRmrNzKsFHTSEtpyJhh/WnaoE6iQ6oyypU63f3vFR2IiEhFmLsmh+ue/YpWjesx9ob+pDSquTOelkeZScHMvk8wFUVbgsFka4FJ7v52xLGJiByShet3cPUzU2nSoA5jfzKAVk3qJzqkKqesWVL/CnQFRhMMLoNgUNntZnaOu98RcXwiIjFZtnEnVz09lbpJtXjxJ/1pm9wg0SFVSWWdKZzr7l0PLDSz8QQzpiopiEjCrd6Sy1VPT8XdGXvDANo3b5TokKqsshqa95hZvxLK+wJ7IohHROSQrM/Zw5VPf0luXgFjhvWnS6vGiQ6pSivrTOE6YEQ4XcX+y0epwPZwm4hIwqzL2c1V/5zK1l37GHtDf7of1STRIVV5B00K4Z3P+pvZkQQNzQZkufv6eAQnIlKalZt3cdXTU9mWu4/nr++ru6ZVkFh6HzUluHdCUe8jM3vH3bdFHZyISEkWb9jBVU9PZV9BIS/+pD8ntFNCqCgHbVMws2uATOA0oCHQCBgEzAi3iYjE1dw1OQz9xxc4MP7GE5UQKlhZZwq/BvoceFZgZs2AqQRdVUVE4mL6ii1c/9y0YBzCDf3p0EK9jCpaWUnBKOHuZ0AhJd8pTUQkEp8s3sjw0TNo07Q+L9zQn6M0DiESZSWFPwCZZvYu/71/chpwJvBglIGJiOz3zrz13PbiTDq1bMSYYf1p2bheokOqtg7apuDuo4AM4CNgL5AHfAhkuPvzUQcnIvL6zDX8dGwm3Y9qwvjhJyohRKzM3kfuvhUYF4dYRES+ZezUlfzm9bkM6Nicf16boemv46DcN9kxszkVGYiISHEjP17KryfOZVC3Vjx3fV8lhDgpa0K8i0vbBBxZ8eGISE3n7jz23iKeeH8JPzihDY8N7UndJN0kMl7KSr3jgbGU3ANJc9KKSIVydx58Yz7PfracoRnt+OPFJ1C7ljo6xlNZSWE28Gd3n3vgBjM7I5qQRKQmKih0fj1xDuOmrea6gR347XndqaWEEHdlJYU7CSa/K8lFFRyLiNRQ+woKuevlr/nX12u57fQu3HVmV8yUEBKhrAnxPjnItukVH46I1DR79hVw64uZ/Gd+NvecczQ3fa9zokOq0WKZEK8VsMvdd5lZA+AuoDHwuLuvizpAEam+Nu7Yy09GT+frrG08OORYrj6xQ6JDqvFiadIfBzQPl38HdAG2Ai9GFZSIVH9Lsndw0f99xoL12xlxVR8lhEqirC6p1wKdgdMsuMB3GfAIsBNoH86UOsvdZ0ceqYhUG58v2cSNL8ygXlJtxg8/UfdCqETKOlP4ENgNzAfWABuAf4Xlm8PnlQd7ATOrbWYzzeyNcL2jmU01s8VmNt7M6obl9cL1JeH2DuX+qUSk0npl+mquefYrjmxSn4k/HaiEUMmUNffRSuBx4A3gZeABd19FMG5hk7uvcvecMt7jDoKkst/DwGPunk5wGWpYWD4M2OruXYDHwnoiUk24O4++u5C7X53NgE7NefXmgaSmNEx0WHKAMtsU3H0EwSWkdu7+Rli8GbiirH3NrB3wA+DpcN2A04FXwyqjgAvD5SHhOuH2waY+aSLVwt78Au4cP4u/vb+EoRnteO76vjRtUCfRYUkJYppMxN13HrC+K8bX/yvwC4LeShA0WG9z9/xwPYvgNp+Ez6vD1883s5yw/qbiL2hmw4HhAGlpaTGGISKJsmVXHjeOmc60FVu5+/vd+OlpnTUGoRKLbEIRMzsPyHb3GcWLS6jqMWz7b4H7SHfPcPeMli1bVkCkIhKV5Zt2cfH/fcbXWTn87Ype3DKoixJCJVdW76N67r63nK99EnCBmZ1LME9SE4Izh2QzSwrPFtoBa8P6WUAqkGVmSUBTYEs531tEEmzaii38ZPR0DHjxhv5kdEhJdEgSg7LOFL4AMLMxh/rC7n6vu7dz9w7A5cD77n4V8AHww7DatcCkcHlyuE64/X13L2kiPhGp5CbNWsNV/5xKSsO6TPzpSUoIVUhZbQp1w7EKA0uaRtvdJ5TjPX8JjDOz3wMzgWfC8meAMWa2hOAM4fJyvLaIJJC78+T7S3j0vUX065jCyKv7kNywbqLDkkNQVlK4CbgKSAbOP2CbAzElBXf/kGBMA+6+DOhXQp09wKWxvJ6IVD55+YX8auIcXp2RxUW92vLQJcdTL6l2osOSQ1TWhHifAp+a2XR3f+ZgdUWk5srJ3cfNY2fw+dLN3DE4nTvPSFeDchUV6/3txpjZ7cCp4fpHwFPuvi+asESkqpi3NoebX8hkXc5uHr20B5f0aZfokOQwxJoU/g+oEz4DXA2MAG6IIigRqRomZGZx74Q5JDesw7jhJ9KnfbNEhySHKdak0NfdexRbf9/Mvo4iIBGp/PLyC3nwjW8Y8+VK+ndM4ckre9Oycb1EhyUVINakUGBmnd19KYCZdQIKogtLRCqr9Tl7uHnsDGau2sZPTunIL88+mqTakY2DlTiLNSncDXxgZssIRh63B66PLCoRqZS+WLqZ217KJDevgL9f2ZsfnNAm0SFJBYt17qMpZpYOdCNICgsOY6SziFQx7s7TnyznobcX0L55Q176yQDSWzcue0epcmI9UyBMArqZjkgNs2tvPr94bTb/nr2Os489kj9degKN62uG0+oq5qQgIjXP0o07uXHMDJZt3Mk95xzNjad20viDak5JQURK9PbcdfzPK7Opm1SLF4b1Z2CXFokOSeIgpqQQ3uzmKqCTuz9gZmnAke7+VaTRiUjc5RcU8ud3F/HUR0vpkZrMiKt6c1Ryg0SHJXFyKIPXCgnumvYAsAN4DegbUVwikgCbd+7ltpdm8vnSzVzZP437zu+u+YtqmFiTQn93721mMwHcfauZaepDkWokc9VWbhmbyeZdeTzywxMYmpGa6JAkAWJNCvvMrDbhndDMrCXBmYOIVHEFhc7/fbCEv05ZTJum9Zlw80COa9s00WFJgsSaFJ4AJgKtzOwPBDfB+U1kUYlIXGRtzeVn42cxbcVWLuhxFA9eeBxNG6i7aU0W6+C1sWY2AxhMMHjtQnefH2lkIhKpSbPW8JuJc3Hgsct6cGHPtupuKjH3PkoDcoF/FS9z91VRBSYi0di+Zx/3TZrHxJlr6NO+GX+9rCepKQ0THZZUErFePvo3QXuCAfWBjsBC4NiI4hKRCExfsYU7x89i7bbd3HlGOrcO6qLJ7ORbYr18dHzxdTPrDdwYSUQiUuHyCwp54v0lPPn+Yto2a8ArN51In/YpiQ5LKqFyjWh290wz0xgFkSpg1eZc7hg/k5mrtnFx77b87oJjNXeRlCrWNoW7iq3WAnoDGyOJSEQqhLszIXMN902ehxk8cUUvLuhxVKLDkkou1jOF4nPk5hO0MbxW8eGISEXIyd3Hr1+fwxuz19GvQwp/uawH7ZqpMVnKFmubwu+iDkREKsbUZZv52fhZZO/Yy93f78ZN3+tM7VrqaiqxOWhSMLN/EY5iLom7X1DhEYlIuezZV8DjUxbz1EdLaZ/SkFdvHkjP1OREhyVVTFlnCn+OSxQiclimrdjCL1+bzbKNuxia0Y77zj+WRvU0M74cuoN+atz9o/K+sJnVBz4G6oXv86q732dmHYFxQAqQCVzt7nlmVg8YDfQBNgOXufuK8r6/SE2wc28+j7y9gNFfrKRtcgNG/7gfp3ZtmeiwpAqLtfdROvBHoDvB4DUA3L3TQXbbC5zu7jvNrA7wqZm9BdwFPObu48zsKWAYMCJ83uruXczscuBh4LLy/FAiNcEHC7P59YQ5rNu+h+sGduDu73fT2YEctliHMj5H8MWdDwwi+I9+zMF28MDOcLVO+HCCezK8GpaPAi4Ml4eE64TbB5smYhH5ji278vjZ+Flc/9w0GtZL4tWbBnL/BbpcJBUj1k9RA3efYmbm7iuB+83sE+C+g+0UTrc9A+gC/B1YCmxz9/ywShbQNlxuC6wGcPd8M8sBmgObDuUHEqmu3J03Zq/j/snzyNm9j9sHp3PLoM66CY5UqFiTwh4zqwUsNrNbgTVAq7J2cvcCoKeZJRNMvX1MSdXC55LOCr7T88nMhgPDAdLS0mKLXqSKW5ezm/99fS7/mZ9Nj3ZNeeGG/hzTpkmiw5JqKNakcCfQELgdeJDgEtK1sb6Ju28zsw+BAUCymSWFZwvtgLVhtSwgFcgysySgKbClhNcaCYwEyMjIKLW7rEh1UFjovDRtFQ+9uYB9hYX85gfHcP1JHTXuQCITa1LID9sHdgLXx7JDeHe2fWFCaACcQdB4/AHBTXrGESSWSeEuk8P1L8Lt77u7vvSlxlq+aRf3vDabqcu3MLBzc/548fG0b94o0WFJNRdrUviLmbUBXgHGufu8GPZpA4wK2xVqAS+7+xtm9g0wzsx+D8wEngnrPwOMMbMlBGcIlx/KDyJSXeQXFPL0p8t57L1F1E2qxcOXHM/QjFTdAEfiItZpLgaZ2ZHAUGCkmTUBxrv77w+yz2ygVwnly4B+JZTvAS6NNXCR6ihz1VZ+O2kuc9ds56zurXnwwuNo3aR+2TuKVJCY+7C5+3rgCTP7APgF8Fug1KQgIrHL3rGHh99ayGuZWbRuUo+/X9mbc48/UmcHEnexDl47hmAg2Q8JRhuPA34eYVwiNUJefiGjPl/B41MWsze/gJtP68ytg7pozIEkTKyfvOeAl4Cz3H1tWZVFpGwfL9rI7/41j6UbdzGoW0t+e/6xdGyhhmRJrFjbFAZEHYhITbF6Sy4PvvEN736zgQ7NG/LsdRmcfnTrRIclApTzdpwicuh25xUw4sMlPPXxMpJqGb84uxvDTu6oEclSqSgpiETM3Xlr7nr+8O/5rNm2mwt6HMW95x5Nm6YNEh2ayHccUlIws0buviuqYESqm0UbdnD/5Hl8vnQzx7RpwmOX9aRfx5REhyVSqlh7Hw0EngaOANLMrAdwo7v/NMrgRKqqnN37+Ot/FjH6i5UcUS+JB4ccyxX90kiqHevExCKJEeuZwmPA9wmmosDdvzazUyOLSqSKyssv5KWvVvHElMVsyc3jyn5p/M9Z3WjWqG6iQxOJyaEMXlt9wECagooPR6RqKix0/jV7LY++u4hVW3Lp3zGF/z2vO8e1bZro0EQOSaxJYXV4CcnNrC7BbKnzowtLpGpwdz5atJFH3l7IN+u2c0ybJjx3fV9O69pSo5GlSoo1KdwEPE5wI5ws4F3glqiCEqkKZq7aysNvL+DLZVtITWnA45f35PwTjqKWprWWKqzMpBDOcnq1u18Vh3hEKr0l2Tv50zsLeGfeBlocUZffXRA0ItdNUiOyVH1lJgV3LzCzIQSNzSI11rqc3fz1vcW8MmM1DerU5mdndGXYKR05QvMUSTUS66f5MzN7EhgPFI1TcPfMSKISqUS25eYx4sOlPP/5Ctzh2oEduHVQF5ofUS/RoYlUuFiTwsDw+YFiZQ6cXrHhiFQeu/MKeO7z5Tz14VJ27M3nol5t+dkZXUlNaZjo0EQiE/NNdqIORKSy2LOvgJenr+bvHyxhw/a9DD66FXef3Y2jj2yS6NBEIhfriObfllTu7g+UVC5SFeXm5TP2y1WM/GQZG3fspW+HZvztit6alkJqlFgvHxWf76g+cB4apyDVxI49+xj9xUqe+XQ5W3blMbBzc564vBcDOqVorIHUOLFePnq0+LqZ/ZlwyguRqmpbbh7PfraC5z9bzvY9+Qzq1pJbT+9Cn/Y6M5Caq7x96RoCnSoyEJF42bRzL09/spwxX6xgV14BZ3VvzW2np3N8O01JIRJrm8Icgt5GALWBlsCDUQUlEoX1OXsY+fEyXvxqJXvzCznvhKO4ZVBnNSCLFBPrmcJ5xZbzgQ3unh9BPCIVLmtrLk99tJSXp2VR4M6FPdvy00Gd6dzyiESHJlLpxJoUfu/uVxcvMLMxB5aJVCbLNu5kxIdLmThzDWbwwz6p3Py9zqQ11zgDkdLEmhSOLb5iZklAn4oPR+TwuDtfLN3MM58u5/2F2dStXYsfDWjP8FM7cVSybn8pUpaDJgUzuxf4FdDAzLYD+/vn5QEjI45NJGZ78wuYPGstz362gvnrtpPSqC63DerCj05sT6vG9RMdnkiVcdCk4O5/BP5oZn9093sP5YXNLBUYDRwJFAIj3f1xM0shmEOpA7ACGOruWy3oEP44cC6QC1ynuZWkLJt37mXs1FWM/mIlm3bupWvrI3jo4uO5sFdb6tepnejwRKqcWC8fvVXS7Tfd/eOD7JMP/NzdM82sMTDDzN4DrgOmuPtDZnYPcA/wS+AcID189AdGhM8i37Foww6e/XQ5E2euYW9+Id/r2pJhJ3fklPQWGnAmchhiTQp3F1uuD/QDZnCQCfHcfR2wLlzeYWbzCW7SMwQ4Law2CviQICkMAUa7uwNfmlmymbUJX0ek6C5nz3y6nE8Wb6JeUi0u7t2OH5/UgfTWjRMdnki1EOuI5vOLr4eXhh6J9U3MrAPQC5gKtN7/Re/u68ysVVitLbC62G5ZYdm3koKZDQeGA6SlpcUaglRhe/YVMHHmGuWPp9cAAA6bSURBVJ79dDmLs3fSsnE9fn5mV64a0J6URnUTHZ5ItVLeEc1ZwHGxVDSzI4DXgDvdfftBTu1L2uDfKXAfSdjInZGR8Z3tUn1kbc1l3FerefGrVWzZlUf3Nk149NIenNejDfWS1F4gEoVYRzT/jf9+QdcCegJfx7BfHYKEMNbdJ4TFG/ZfFjKzNkB2WJ4FpBbbvR2wNpb4pPrILyjk/QXZvPjVKj5atBGAwUe3ZtjJHTVBnUgcxHqmML3Ycj7wkrt/drAdwt5EzwDz3f0vxTZNBq4FHgqfJxUrv9XMxhE0MOeoPaHmWLttN+OmreblaatZv30PrRrX49ZBXbisbyrtmmmwmUi8lDVOIc3dV7n7qHK89knA1cAcM5sVlv2KIBm8bGbDgFXApeG2Nwm6oy4h6JJ6fTneU6qQgkLnw4XZvDh1FR8szMaBU9Nb8rshxzL46FYk1a6V6BBFapyyzhReB3oDmNlr7n5JrC/s7p9ScjsBwOAS6jtwS6yvL1XXupzdjJ+2mvHTVrMuZw8tG9fj5tM6c3nfNN3qUiTBykoKxb/UNVW2lFtBofPxoo2MnbqK9xdsoNDhlPQW/Pa87pzRvTV1dFYgUimUlRS8lGWRmGRtzWVC5hrGT1vNmm27aXFEXW78Xmeu6JumielEKqGykkKPYnMe7Z//iHDd3V0T0ct37Nizj7fmrOe1zCymLt8CwEldmvOrc4/hzO6tqZukswKRyqqsuY/UGVxikl9QyCdLNjEhcw3vzlvP3vxCOrZoxF1nduWiXm3VViBSRZR38JoI7s68tduZOHMNk2atZdPOvSQ3rMPQjFQu6t2WXqnJGlcgUsUoKcghW5+zh9dnrWFi5hoWbthBndrG6Ue34uLe7RjUrZUuD4lUYUoKEpNde/N5e+56Js5cw2dLN+EOvdOSefDC4zjv+DY00xxEItWCkoKUandeAR8uzObfc9bx/oJscvMKSE1pwG2np3NRr7Z0bNEo0SGKSAVTUpBv2Z1XwAdhIvggTAQpjeoypGdbLu7dloz2zdROIFKNKSkIuXn5fLBgI2+GZwS79xXQvFFdLuzVlh8c34b+HVM05YRIDaGkUEPl5uXz/oJs3pyzjg8WbGT3vgJaHFGXi3sHiaCfEoFIjaSkUIPs2lssESzMZs++QlocUY9L+rTl3OPb0L9jc2rX0qUhkZpMSaGay96xhw8WZPOf+dl8snhjUSK4tE8q54ZnBEoEIrKfkkI14+4sWL+DKfM38J/52cxavQ2Ao5rWZ2hGkAj6dlAiEJGSKSlUA3vzC5i6bEtRIlizbTcAPdo15edndmXwMa05pk1j9RoSkTIpKVRRW3bl8cGCbKYs2MDHizaxc28+9evU4uQuLbjt9C6cfnQrWjWpn+gwRaSKUVKoItydJdk7mbIgmynzNzBj5VYKHVo1rsf5PdpwxjGtGdi5BQ3qag5DESk/JYVKbMuuPD5bsomPF23kk8WbWL99DwDd2zTh1tPTOeOYVhx3VFNqqX1ARCqIkkIlkpdfSOaqrXyyOEgCc9bk4A5N6idxcnoLTklvyfe6tuSo5AaJDlVEqiklhQRyd5Zv2sUnizfxyeKNfLF0M7vyCqhdy+iVmszPzujKKektOKFdsnoLiUhcKCnEWU7uPj5fuomPFweXhfb3FEpLachFvdtySnpLTuzcnCb16yQ4UhGpiZQUIpaTu4+vVmzhy2Wbmbp8M/PWbscdjqiXxMDOzbnptM6cmt6C9s0146iIJJ6SQgUrngS+XLaZb9YFSaBuUi16pyVz++npnJzegp6pydTR3EIiUskoKRymnNx9TF2+mS+XbWHq8m8ngT5pzbhjcDoDOjWnZ2oy9euou6iIVG5KCodo8869TF+5lanLgrOB+eu/nQTuHNyVAZ1S6KEkICJVUGRJwcyeBc4Dst39uLAsBRgPdABWAEPdfasF8y88DpwL5ALXuXtmVLHFqrDQWZy9kxkrtzJj5VYyV21l+aZdANRLqkWf9koCIlK9RHmm8DzwJDC6WNk9wBR3f8jM7gnXfwmcA6SHj/7AiPA5rnbuzefr1duYsXIr01duZeaqrezYkw9A80Z16d2+GZf1TaV3WjN6pDalXpKSgIhUL5ElBXf/2Mw6HFA8BDgtXB4FfEiQFIYAo93dgS/NLNnM2rj7ugjjI2vr7qKzgBkrt7Jg/XYKHcygW+vGnN/jKPqkNaNP+2a0b95QE8qJSLUX7zaF1vu/6N19nZm1CsvbAquL1csKyyJJCuO+WsWj7y1i4469QNA9tFdaMrednk6f9s3omZascQIiUiNVlobmkv4F9xIrmg0HhgOkpaWV681aNanHyV1a0Lt9MzLaN6Nr68YaMSwiQvyTwob9l4XMrA2QHZZnAanF6rUD1pb0Au4+EhgJkJGRUWLiKMvpR7fm9KNbl2dXEZFqLd6jpyYD14bL1wKTipVfY4EBQE6U7QkiIlKyKLukvkTQqNzCzLKA+4CHgJfNbBiwCrg0rP4mQXfUJQRdUq+PKi4RESldlL2Prihl0+AS6jpwS1SxiIhIbDT5joiIFFFSEBGRIkoKIiJSRElBRESKKCmIiEgRCzr+VE1mthFYWc7dWwCbKjCciqK4Do3iOnSVNTbFdWgOJ6727t6ypA1VOikcDjOb7u4ZiY7jQIrr0CiuQ1dZY1NchyaquHT5SEREiigpiIhIkZqcFEYmOoBSKK5Do7gOXWWNTXEdmkjiqrFtCiIi8l01+UxBREQOUO2TgpmdbWYLzWxJeF/oA7fXM7Px4fapJdxCNIqYUs3sAzObb2bzzOyOEuqcZmY5ZjYrfPw26rjC911hZnPC95xewnYzsyfC4zXbzHrHIaZuxY7DLDPbbmZ3HlAnbsfLzJ41s2wzm1usLMXM3jOzxeFzs1L2vTass9jMri2pTgXG9CczWxD+niaaWXIp+x70dx5RbPeb2Zpiv69zS9n3oH+/EcQ1vlhMK8xsVin7RnLMSvtuiOvny92r7QOoDSwFOgF1ga+B7gfU+SnwVLh8OTA+DnG1AXqHy42BRSXEdRrwRgKO2QqgxUG2nwu8RXC3vAHA1AT8TtcT9LNOyPECTgV6A3OLlT0C3BMu3wM8XMJ+KcCy8LlZuNwswpjOApLC5YdLiimW33lEsd0P/E8Mv+uD/v1WdFwHbH8U+G08j1lp3w3x/HxV9zOFfsASd1/m7nnAOGDIAXWGAKPC5VeBwWYW6b053X2du2eGyzuA+QT3pK4KhgCjPfAlkBzeRS9eBgNL3b28gxYPm7t/DGw5oLj452gUcGEJu34feM/dt7j7VuA94OyoYnL3d909P1z9kuCOhnFXyvGKRSx/v5HEFX4HDAVeqqj3izGm0r4b4vb5qu5JoS2wuth6Ft/98i2qE/4B5QDN4xIdEF6u6gVMLWHziWb2tZm9ZWbHxikkB941sxkW3A/7QLEc0yhdTul/qIk4Xvu19vBugeFzqxLqJPLY/ZjgDK8kZf3Oo3JreGnr2VIuhyTyeJ0CbHD3xaVsj/yYHfDdELfPV3VPCiX9x39gd6tY6kTCzI4AXgPudPftB2zOJLhE0gP4G/B6PGICTnL33sA5wC1mduoB2xN5vOoCFwCvlLA5UcfrUCTk2JnZr4F8YGwpVcr6nUdhBNAZ6AmsI7hUc6CEfdaAKzj4WUKkx6yM74ZSdyuh7JCPV3VPCllAarH1dsDa0uqYWRLQlPKd6h4SM6tD8Esf6+4TDtzu7tvdfWe4/CZQx8xaRB2Xu68Nn7OBiQSn8MXFckyjcg6Q6e4bDtyQqONVzIb9l9HC5+wS6sT92IWNjecBV3l44flAMfzOK5y7b3D3AncvBP5Zynsm5LMWfg9cDIwvrU6Ux6yU74a4fb6qe1KYBqSbWcfwv8zLgckH1JkM7G+l/yHwfml/PBUlvF75DDDf3f9SSp0j97dtmFk/gt/V5ojjamRmjfcvEzRUzj2g2mTgGgsMAHL2n9bGQan/vSXieB2g+OfoWmBSCXXeAc4ys2bh5ZKzwrJImNnZwC+BC9w9t5Q6sfzOo4iteDvURaW8Zyx/v1E4A1jg7lklbYzymB3kuyF+n6+Kbj2vbA+C3jKLCHox/Dose4DgDwWgPsHliCXAV0CnOMR0MsFp3WxgVvg4F7gJuCmscyswj6DHxZfAwDjE1Sl8v6/D995/vIrHZcDfw+M5B8iI0++xIcGXfNNiZQk5XgSJaR2wj+C/s2EE7VBTgMXhc0pYNwN4uti+Pw4/a0uA6yOOaQnBNeb9n7H9veyOAt482O88DsdrTPj5mU3whdfmwNjC9e/8/UYZV1j+/P7PVbG6cTlmB/luiNvnSyOaRUSkSHW/fCQiIodASUFERIooKYiISBElBRERKaKkICIiRZQURESkiJKCSAKYWe1ExyBSEiUFkTKY2YNW7J4XZvYHM7vdzO42s2nhpG6/K7b99XCitHnFJ0szs51m9oCZTSWYvO8hM/sm3P/Pcf6xREqkwWsiZQhnq5zg7r3NrBbBqNJfEUzjfSPBKO/JwCPu/rGZpbj7FjNrQDBVw/fcfbOZOXCZu79sZinAF8DR7u5mluzu2xLw44l8S1KiAxCp7Nx9hZltNrNeQGtgJtCXYG6ZmWG1I4B04GPgdjO7KCxPDcs3AwUEE50BbAf2AE+b2b+BN+Lxs4iURUlBJDZPA9cBRwLPEpwl/NHd/1G8kpmdRjCh2onunmtmHxLMrwWwx90LILh3Rzhx32CCid5uBU6P/scQOTglBZHYTCSYSLEOcCXB/QkeNLOx7r7TzNoSTKzWFNgaJoSjCW5Z+h3hfPkN3f1NM/uSYAIzkYRTUhCJgbvnmdkHwLbwv/13zewY4Itwxu6dwI+At4GbzGw2sJBgxtaSNAYmmVl9gjaJn0X9M4jEQg3NIjEIG5gzgUu99Fs0ilR56pIqUgYz605weWeKEoJUdzpTEBGRIjpTEBGRIkoKIiJSRElBRESKKCmIiEgRJQURESmipCAiIkX+P0G6pc8IW6NuAAAAAElFTkSuQmCC\n", 433 | "text/plain": "
" 434 | }, 435 | "metadata": { 436 | "needs_background": "light" 437 | }, 438 | "output_type": "display_data" 439 | } 440 | ] 441 | } 442 | }, 443 | "bf9653dfb22243f184496c09c0879a98": { 444 | "model_module": "@jupyter-widgets/controls", 445 | "model_module_version": "1.5.0", 446 | "model_name": "SliderStyleModel", 447 | "state": { 448 | "description_width": "" 449 | } 450 | }, 451 | "fc979331934542b5867945b8ceda1a8f": { 452 | "model_module": "@jupyter-widgets/base", 453 | "model_module_version": "1.2.0", 454 | "model_name": "LayoutModel", 455 | "state": {} 456 | } 457 | }, 458 | "version_major": 2, 459 | "version_minor": 0 460 | } 461 | } 462 | }, 463 | "nbformat": 4, 464 | "nbformat_minor": 4 465 | } 466 | --------------------------------------------------------------------------------