Popular recipes by Alia Khouri http://code.activestate.com/recipes/users/4169084/2013-09-06T23:04:55-07:00ActiveState Code RecipesNPV / IRR / Payback Analysis (Python)
2013-09-06T23:04:55-07:00Alia Khourihttp://code.activestate.com/recipes/users/4169084/http://code.activestate.com/recipes/576686-npv-irr-payback-analysis/
<p style="color: grey">
Python
recipe 576686
by <a href="/recipes/users/4169084/">Alia Khouri</a>
(<a href="/recipes/tags/finance/">finance</a>).
Revision 18.
</p>
<p>A few financial functions for quick analysis of an investment opportunity and a series of associated cashflows.</p>
<p>As a module, it currently provides straightforward and easy to understand implementations of the Net Present Value (NPV), Internal Rate of Return (IRR), and Payback Period functions.</p>
<p>As a script, it provides a simple command line interface which integrates the above functions into a concise analysis of the investment opportunity.</p>
<pre class="prettyprint"><code> usage: invest discount_rate [cashflow0, cashflow1, ..., cashflowN]
where
discount_rate is the rate used to discount future cashflows
to their present values
cashflow0 is the investment (always a negative value)
cashflow1 .. cashflowN values can be positive (net inflows)
or
negative (net outflows)
</code></pre>
<p>Here is an example of actual usage and output:</p>
<pre class="prettyprint"><code>$ ./invest 0.05 -10000 6000 6000 6000
----------------------------------------------------------------------
year 0 1 2 3
cashflow -10,000 6,000 6,000 6,000
Discount Rate: 5.0%
Payback: 1.67 years
IRR: 36.31%
NPV: 6339.49
==> Approve Investment of 10,000
----------------------------------------------------------------------
</code></pre>
<p><em>Note</em>: A check of the output of the Microsoft Excel NPV function against that of the function implemented here reveals a curious discrepancy/bug in the way Excel calculates its NPV. For further details see: <a href="http://www.tvmcalcs.com/blog/comments/the_npv_function_doesnt_calculate_net_present_value/" rel="nofollow">http://www.tvmcalcs.com/blog/comments/the_npv_function_doesnt_calculate_net_present_value/</a></p>
<p>Furthermore, the method used to calculate the IRR is rough to say the least and fails at fewer than 3 entries. Please use the secant method along the lines of the following haskell code from (<a href="http://www.haskell.org/haskellwiki/Haskell_Quiz/Internal_Rate_of_Return/Solution_Dolio" rel="nofollow">http://www.haskell.org/haskellwiki/Haskell_Quiz/Internal_Rate_of_Return/Solution_Dolio</a>) for greater accuracy.</p>
<pre class="prettyprint"><code>secant :: (Double -> Double) -> Double -> Double
secant f delta = fst $ until err update (0,1)
where
update (x,y) = (x - (x - y) * f x / (f x - f y), x)
err (x,y) = abs (x - y) < delta
npv :: Double -> [Double] -> Double
npv i = sum . zipWith (\t c -> c / (1 + i)**t) [0..]
irr :: [Double] -> Double
irr cashflows = secant (`npv` cashflows) (0.1**4)
</code></pre>
Update Source Directories (Python)
2009-07-21T23:40:53-07:00Alia Khourihttp://code.activestate.com/recipes/users/4169084/http://code.activestate.com/recipes/576853-update-source-directories/
<p style="color: grey">
Python
recipe 576853
by <a href="/recipes/users/4169084/">Alia Khouri</a>
(<a href="/recipes/tags/bzr/">bzr</a>, <a href="/recipes/tags/git/">git</a>, <a href="/recipes/tags/hg/">hg</a>, <a href="/recipes/tags/svn/">svn</a>, <a href="/recipes/tags/vcs/">vcs</a>).
</p>
<p>A convenience script to update a pre-specified folder containing
subversion, mercurial, bazaar, and/or git source folders</p>
<p>To use it: </p>
<ul>
<li><p>change the 'src' variable below to point to your source folder</p></li>
<li><p>name this script to something appropriate (I call it 'update')</p></li>
<li><p>put it into a directory on your PATH</p></li>
</ul>
Recursive file/folder cleaner (Python)
2011-02-12T20:30:59-08:00Alia Khourihttp://code.activestate.com/recipes/users/4169084/http://code.activestate.com/recipes/576643-recursive-filefolder-cleaner/
<p style="color: grey">
Python
recipe 576643
by <a href="/recipes/users/4169084/">Alia Khouri</a>
(<a href="/recipes/tags/cleaner/">cleaner</a>, <a href="/recipes/tags/cleaning/">cleaning</a>, <a href="/recipes/tags/files/">files</a>, <a href="/recipes/tags/folder/">folder</a>, <a href="/recipes/tags/pyc/">pyc</a>, <a href="/recipes/tags/recursion/">recursion</a>, <a href="/recipes/tags/svn/">svn</a>).
Revision 24.
</p>
<p>This script recursively scans a given path and applies a cleaning 'action'
to matching files and folders. By default files and folders matching the
specified (.endswith) patterns are deleted. Alternatively, _quoted_ glob
patterns can used with the '-g' or '--glob' option.</p>
<p>By design, the script lists targets and asks permission before applying
cleaning actions. It should be easy to extend this script with further
actions and also more intelligent pattern matching functions.</p>
<p>The getch (single key confirmation) functionality comes courtesy of
<a href="http://code.activestate.com/recipes/134892/" rel="nofollow">http://code.activestate.com/recipes/134892/</a></p>
<p>To use it, place the script in your path and call it something like 'clean':</p>
<pre class="prettyprint"><code>Usage: clean [options] patterns
deletes files/folder patterns:
clean .svn .pyc
clean -p /tmp/folder .svn .csv .bzr .pyc
clean -g "*.pyc"
clean -ng "*.py"
converts line endings from windows to unix:
clean -e .py
clean -e -p /tmp/folder .py
Options:
-h, --help show this help message and exit
-p PATH, --path=PATH set path
-n, --negated clean everything except specified patterns
-e, --endings clean line endings
-g, --glob clean with glob patterns
-v, --verbose
</code></pre>