{ "cells": [ { "cell_type": "markdown", "id": "abb4c7a2", "metadata": {}, "source": [ "## Receivable/Invoice" ] }, { "cell_type": "code", "execution_count": 1, "id": "1ad15c93", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Connecting engine server -> https://absbox.org/api/dev\n",
       "
\n" ], "text/plain": [ "\u001b[1;35mConnecting engine server -> \u001b[0m\u001b[1;4;35mhttps://absbox.org/api/dev\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Connected, local lib:0.26.6, server:0.26.5\n",
       "
\n" ], "text/plain": [ "✅\u001b[1;32mConnected, local li\u001b[0m\u001b[1;32mb:0\u001b[0m\u001b[1;32m.\u001b[0m\u001b[1;32m26.6\u001b[0m\u001b[1;32m, server:\u001b[0m\u001b[1;32m0.26\u001b[0m\u001b[1;32m.\u001b[0m\u001b[1;32m5\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from absbox import API,EnginePath\n", "\n", "localAPI = API(EnginePath.DEV,lang='english',check=False)" ] }, { "cell_type": "code", "execution_count": 2, "id": "c6662ec7", "metadata": {}, "outputs": [], "source": [ "invoice = [\"Invoice\"\n", " ,{\"start\":\"2024-04-01\",\"originBalance\":2000\n", " ,\"originAdvance\":1500,\"dueDate\":\"2024-06-01\"}\n", " ,{\"status\":\"Current\"}]" ] }, { "cell_type": "code", "execution_count": 4, "id": "68454234", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[('2024-04-01', 2000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),\n", " ('2024-06-01', 0, 0, 2000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r = localAPI.runAsset(\"2024-01-02\"\n", " ,[invoice]\n", " ,poolAssump=(\"Pool\"\n", " ,(\"Receivable\", None, None, None)\n", " ,None\n", " ,None)\n", " ,read=True)\n", "\n", "r[0].head()" ] }, { "cell_type": "markdown", "id": "2e299990", "metadata": {}, "source": [ "### Default" ] }, { "cell_type": "code", "execution_count": 4, "id": "93e822ae", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[('2024-04-01', 2000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),\n", " ('2024-06-01', 0, 0, 0, 0, 2000, 0, 2000, 0, 0, 0, 2000, 0, 2000)]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r = localAPI.runAsset(\"2024-01-02\"\n", " ,[invoice]\n", " ,poolAssump=(\"Pool\",(\"Receivable\"\n", " ,\"DefaultAtEnd\"\n", " ,None\n", " ,None)\n", " ,None\n", " ,None)\n", " ,read=True)\n", "\n", "r[0].head()" ] }, { "cell_type": "code", "execution_count": 5, "id": "c4f4f000", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[('2024-04-01', 2000, 0, 0., 0, 0., 0, 0., 0, 0, 0, 0., 0, 0.),\n", " ('2024-06-01', 0, 0, 1996.65, 0, 3.35, 0, 3.35, 0, 0, 0, 3.35, 0, 3.35)]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r = localAPI.runAsset(\"2024-01-02\"\n", " ,[invoice]\n", " ,poolAssump=(\"Pool\",(\"Receivable\"\n", " ,{'CDR':0.01}\n", " ,None\n", " ,None)\n", " ,None\n", " ,None)\n", " ,read=True)\n", "\n", "\n", "r[0].head()" ] }, { "cell_type": "markdown", "id": "2ac558eb", "metadata": {}, "source": [ "### Recovery" ] }, { "cell_type": "code", "execution_count": 6, "id": "d0ea6a35", "metadata": {}, "outputs": [ { "ename": "RuntimeError", "evalue": "failed to match {'Rate': 0.5, 'ByDays': [(10, 0.5), (20, 0.5)]}", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mRuntimeError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[6], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m r \u001b[38;5;241m=\u001b[39m \u001b[43mlocalAPI\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrunAsset\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m2024-01-02\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\n\u001b[1;32m 2\u001b[0m \u001b[43m \u001b[49m\u001b[43m,\u001b[49m\u001b[43m[\u001b[49m\u001b[43minvoice\u001b[49m\u001b[43m]\u001b[49m\n\u001b[1;32m 3\u001b[0m \u001b[43m \u001b[49m\u001b[43m,\u001b[49m\u001b[43mpoolAssump\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mPool\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mReceivable\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\n\u001b[1;32m 4\u001b[0m \u001b[43m \u001b[49m\u001b[43m,\u001b[49m\u001b[43m{\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mCDR\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[38;5;241;43m0.01\u001b[39;49m\u001b[43m}\u001b[49m\n\u001b[1;32m 5\u001b[0m \u001b[43m \u001b[49m\u001b[43m,\u001b[49m\u001b[43m{\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mRate\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[38;5;241;43m0.5\u001b[39;49m\u001b[43m,\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mByDays\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m[\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m10\u001b[39;49m\u001b[43m,\u001b[49m\u001b[38;5;241;43m0.5\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m20\u001b[39;49m\u001b[43m,\u001b[49m\u001b[38;5;241;43m0.5\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m]\u001b[49m\u001b[43m}\u001b[49m\n\u001b[1;32m 6\u001b[0m \u001b[43m \u001b[49m\u001b[43m,\u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 7\u001b[0m \u001b[43m \u001b[49m\u001b[43m,\u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\n\u001b[1;32m 8\u001b[0m \u001b[43m \u001b[49m\u001b[43m,\u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 9\u001b[0m \u001b[43m \u001b[49m\u001b[43m,\u001b[49m\u001b[43mread\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 12\u001b[0m \u001b[38;5;28mlist\u001b[39m(r[\u001b[38;5;241m0\u001b[39m]\u001b[38;5;241m.\u001b[39mto_records())\n", "File \u001b[0;32m/opt/homebrew/lib/python3.11/site-packages/absbox/client.py:376\u001b[0m, in \u001b[0;36mAPI.runAsset\u001b[0;34m(self, date, _assets, poolAssump, rateAssump, pricing, read)\u001b[0m\n\u001b[1;32m 373\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m (\u001b[38;5;28;01mNone\u001b[39;00m, \u001b[38;5;28;01mNone\u001b[39;00m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[1;32m 375\u001b[0m url \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39murl\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m/\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mEndpoints\u001b[38;5;241m.\u001b[39mRunAsset\u001b[38;5;241m.\u001b[39mvalue\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m--> 376\u001b[0m _assumptions \u001b[38;5;241m=\u001b[39m \u001b[43mmkAssumpType\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpoolAssump\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mif\u001b[39;00m poolAssump \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 377\u001b[0m _rate \u001b[38;5;241m=\u001b[39m lmap(mkRateAssumption, rateAssump) \u001b[38;5;28;01mif\u001b[39;00m rateAssump \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 378\u001b[0m _pricing \u001b[38;5;241m=\u001b[39m mkLiqMethod(pricing) \u001b[38;5;28;01mif\u001b[39;00m pricing \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n", "File \u001b[0;32m/opt/homebrew/lib/python3.11/site-packages/absbox/local/component.py:1477\u001b[0m, in \u001b[0;36mmkAssumpType\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 1475\u001b[0m \u001b[38;5;28;01mmatch\u001b[39;00m x:\n\u001b[1;32m 1476\u001b[0m \u001b[38;5;28;01mcase\u001b[39;00m (\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPool\u001b[39m\u001b[38;5;124m\"\u001b[39m, p, d, f):\n\u001b[0;32m-> 1477\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m mkTag((\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPoolLevel\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[43mmkPDF\u001b[49m\u001b[43m(\u001b[49m\u001b[43mp\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43md\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mf\u001b[49m\u001b[43m)\u001b[49m))\n\u001b[1;32m 1478\u001b[0m \u001b[38;5;28;01mcase\u001b[39;00m (\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mByIndex\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;241m*\u001b[39mps):\n\u001b[1;32m 1479\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m mkTag((\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mByIndex\u001b[39m\u001b[38;5;124m\"\u001b[39m,[ [idx, mkPDF(a,b,c)] \u001b[38;5;28;01mfor\u001b[39;00m (idx,(a,b,c)) \u001b[38;5;129;01min\u001b[39;00m ps ]))\n", "File \u001b[0;32m/opt/homebrew/lib/python3.11/site-packages/absbox/local/component.py:1468\u001b[0m, in \u001b[0;36mmkPDF\u001b[0;34m(a, b, c)\u001b[0m\n\u001b[1;32m 1466\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mmkPDF\u001b[39m(a, b, c):\n\u001b[1;32m 1467\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m''' make assumps asset with 3 status: performing/delinq/defaulted '''\u001b[39;00m\n\u001b[0;32m-> 1468\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m [\u001b[43mmkPerfAssumption\u001b[49m\u001b[43m(\u001b[49m\u001b[43ma\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1469\u001b[0m ,mkDelinqAssumption(b)\n\u001b[1;32m 1470\u001b[0m ,mkDefaultedAssumption(c)]\n", "File \u001b[0;32m/opt/homebrew/lib/python3.11/site-packages/absbox/local/component.py:1460\u001b[0m, in \u001b[0;36mmkPerfAssumption\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 1458\u001b[0m \u001b[38;5;28;01mcase\u001b[39;00m (\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mReceivable\u001b[39m\u001b[38;5;124m\"\u001b[39m, md, mr, mes):\n\u001b[1;32m 1459\u001b[0m d \u001b[38;5;241m=\u001b[39m earlyReturnNone(mkAssumpDefault,md)\n\u001b[0;32m-> 1460\u001b[0m r \u001b[38;5;241m=\u001b[39m \u001b[43mearlyReturnNone\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmkAssumpRecovery\u001b[49m\u001b[43m,\u001b[49m\u001b[43mmr\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1461\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m mkTag((\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mReceivableAssump\u001b[39m\u001b[38;5;124m\"\u001b[39m,[d, r, mkExtraStress(mes)]))\n\u001b[1;32m 1462\u001b[0m \u001b[38;5;28;01mcase\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01m_\u001b[39;00m:\n", "File \u001b[0;32m/opt/homebrew/lib/python3.11/site-packages/absbox/local/util.py:379\u001b[0m, in \u001b[0;36mearlyReturnNone\u001b[0;34m(fn, v)\u001b[0m\n\u001b[1;32m 377\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 378\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 379\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[43mv\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m/opt/homebrew/lib/python3.11/site-packages/absbox/local/component.py:1393\u001b[0m, in \u001b[0;36mmkAssumpRecovery\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 1391\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m mkTag((\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mRecoveryTiming\u001b[39m\u001b[38;5;124m\"\u001b[39m,[vNum(r),vList(ts, \u001b[38;5;28mfloat\u001b[39m)]))\n\u001b[1;32m 1392\u001b[0m \u001b[38;5;28;01mcase\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01m_\u001b[39;00m:\n\u001b[0;32m-> 1393\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfailed to match \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mx\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", "\u001b[0;31mRuntimeError\u001b[0m: failed to match {'Rate': 0.5, 'ByDays': [(10, 0.5), (20, 0.5)]}" ] } ], "source": [ "r = localAPI.runAsset(\"2024-01-02\"\n", " ,[invoice]\n", " ,poolAssump=(\"Pool\",(\"Receivable\"\n", " ,{'CDR':0.01}\n", " ,{\"Rate\":0.5,\"ByDays\":[(10,0.5),(20,0.5)]}\n", " ,None)\n", " ,None\n", " ,None)\n", " ,read=True)\n", "\n", "\n", "r[0].head()" ] }, { "cell_type": "code", "execution_count": 7, "id": "1f9ac4be", "metadata": {}, "outputs": [ { "ename": "RuntimeError", "evalue": "failed to match {'Rate': 0.5, 'ByDays': [(10, 0.5), (20, 0.5)]}", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mRuntimeError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[7], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m r \u001b[38;5;241m=\u001b[39m \u001b[43mlocalAPI\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrunAsset\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m2024-01-02\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\n\u001b[1;32m 2\u001b[0m \u001b[43m \u001b[49m\u001b[43m,\u001b[49m\u001b[43m[\u001b[49m\u001b[43minvoice\u001b[49m\u001b[43m]\u001b[49m\n\u001b[1;32m 3\u001b[0m \u001b[43m \u001b[49m\u001b[43m,\u001b[49m\u001b[43mpoolAssump\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mPool\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mReceivable\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\n\u001b[1;32m 4\u001b[0m \u001b[43m \u001b[49m\u001b[43m,\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mDefaultAtEnd\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\n\u001b[1;32m 5\u001b[0m \u001b[43m \u001b[49m\u001b[43m,\u001b[49m\u001b[43m{\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mRate\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[38;5;241;43m0.5\u001b[39;49m\u001b[43m,\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mByDays\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m[\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m10\u001b[39;49m\u001b[43m,\u001b[49m\u001b[38;5;241;43m0.5\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m20\u001b[39;49m\u001b[43m,\u001b[49m\u001b[38;5;241;43m0.5\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m]\u001b[49m\u001b[43m}\u001b[49m\n\u001b[1;32m 6\u001b[0m \u001b[43m \u001b[49m\u001b[43m,\u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 7\u001b[0m \u001b[43m \u001b[49m\u001b[43m,\u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\n\u001b[1;32m 8\u001b[0m \u001b[43m \u001b[49m\u001b[43m,\u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 9\u001b[0m \u001b[43m \u001b[49m\u001b[43m,\u001b[49m\u001b[43mread\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 10\u001b[0m \u001b[38;5;28mlist\u001b[39m(r[\u001b[38;5;241m0\u001b[39m]\u001b[38;5;241m.\u001b[39mto_records())\n", "File \u001b[0;32m/opt/homebrew/lib/python3.11/site-packages/absbox/client.py:376\u001b[0m, in \u001b[0;36mAPI.runAsset\u001b[0;34m(self, date, _assets, poolAssump, rateAssump, pricing, read)\u001b[0m\n\u001b[1;32m 373\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m (\u001b[38;5;28;01mNone\u001b[39;00m, \u001b[38;5;28;01mNone\u001b[39;00m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[1;32m 375\u001b[0m url \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39murl\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m/\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mEndpoints\u001b[38;5;241m.\u001b[39mRunAsset\u001b[38;5;241m.\u001b[39mvalue\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m--> 376\u001b[0m _assumptions \u001b[38;5;241m=\u001b[39m \u001b[43mmkAssumpType\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpoolAssump\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mif\u001b[39;00m poolAssump \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 377\u001b[0m _rate \u001b[38;5;241m=\u001b[39m lmap(mkRateAssumption, rateAssump) \u001b[38;5;28;01mif\u001b[39;00m rateAssump \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 378\u001b[0m _pricing \u001b[38;5;241m=\u001b[39m mkLiqMethod(pricing) \u001b[38;5;28;01mif\u001b[39;00m pricing \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n", "File \u001b[0;32m/opt/homebrew/lib/python3.11/site-packages/absbox/local/component.py:1477\u001b[0m, in \u001b[0;36mmkAssumpType\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 1475\u001b[0m \u001b[38;5;28;01mmatch\u001b[39;00m x:\n\u001b[1;32m 1476\u001b[0m \u001b[38;5;28;01mcase\u001b[39;00m (\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPool\u001b[39m\u001b[38;5;124m\"\u001b[39m, p, d, f):\n\u001b[0;32m-> 1477\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m mkTag((\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPoolLevel\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[43mmkPDF\u001b[49m\u001b[43m(\u001b[49m\u001b[43mp\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43md\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mf\u001b[49m\u001b[43m)\u001b[49m))\n\u001b[1;32m 1478\u001b[0m \u001b[38;5;28;01mcase\u001b[39;00m (\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mByIndex\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;241m*\u001b[39mps):\n\u001b[1;32m 1479\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m mkTag((\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mByIndex\u001b[39m\u001b[38;5;124m\"\u001b[39m,[ [idx, mkPDF(a,b,c)] \u001b[38;5;28;01mfor\u001b[39;00m (idx,(a,b,c)) \u001b[38;5;129;01min\u001b[39;00m ps ]))\n", "File \u001b[0;32m/opt/homebrew/lib/python3.11/site-packages/absbox/local/component.py:1468\u001b[0m, in \u001b[0;36mmkPDF\u001b[0;34m(a, b, c)\u001b[0m\n\u001b[1;32m 1466\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mmkPDF\u001b[39m(a, b, c):\n\u001b[1;32m 1467\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m''' make assumps asset with 3 status: performing/delinq/defaulted '''\u001b[39;00m\n\u001b[0;32m-> 1468\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m [\u001b[43mmkPerfAssumption\u001b[49m\u001b[43m(\u001b[49m\u001b[43ma\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1469\u001b[0m ,mkDelinqAssumption(b)\n\u001b[1;32m 1470\u001b[0m ,mkDefaultedAssumption(c)]\n", "File \u001b[0;32m/opt/homebrew/lib/python3.11/site-packages/absbox/local/component.py:1460\u001b[0m, in \u001b[0;36mmkPerfAssumption\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 1458\u001b[0m \u001b[38;5;28;01mcase\u001b[39;00m (\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mReceivable\u001b[39m\u001b[38;5;124m\"\u001b[39m, md, mr, mes):\n\u001b[1;32m 1459\u001b[0m d \u001b[38;5;241m=\u001b[39m earlyReturnNone(mkAssumpDefault,md)\n\u001b[0;32m-> 1460\u001b[0m r \u001b[38;5;241m=\u001b[39m \u001b[43mearlyReturnNone\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmkAssumpRecovery\u001b[49m\u001b[43m,\u001b[49m\u001b[43mmr\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1461\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m mkTag((\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mReceivableAssump\u001b[39m\u001b[38;5;124m\"\u001b[39m,[d, r, mkExtraStress(mes)]))\n\u001b[1;32m 1462\u001b[0m \u001b[38;5;28;01mcase\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01m_\u001b[39;00m:\n", "File \u001b[0;32m/opt/homebrew/lib/python3.11/site-packages/absbox/local/util.py:379\u001b[0m, in \u001b[0;36mearlyReturnNone\u001b[0;34m(fn, v)\u001b[0m\n\u001b[1;32m 377\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 378\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 379\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[43mv\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m/opt/homebrew/lib/python3.11/site-packages/absbox/local/component.py:1393\u001b[0m, in \u001b[0;36mmkAssumpRecovery\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 1391\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m mkTag((\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mRecoveryTiming\u001b[39m\u001b[38;5;124m\"\u001b[39m,[vNum(r),vList(ts, \u001b[38;5;28mfloat\u001b[39m)]))\n\u001b[1;32m 1392\u001b[0m \u001b[38;5;28;01mcase\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01m_\u001b[39;00m:\n\u001b[0;32m-> 1393\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfailed to match \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mx\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", "\u001b[0;31mRuntimeError\u001b[0m: failed to match {'Rate': 0.5, 'ByDays': [(10, 0.5), (20, 0.5)]}" ] } ], "source": [ "r = localAPI.runAsset(\"2024-01-02\"\n", " ,[invoice]\n", " ,poolAssump=(\"Pool\",(\"Receivable\"\n", " ,\"DefaultAtEnd\"\n", " ,{\"Rate\":0.5,\"ByDays\":[(10,0.5),(20,0.5)]}\n", " ,None)\n", " ,None\n", " ,None)\n", " ,read=True)\n", "r[0].head()" ] }, { "cell_type": "markdown", "id": "3e27147e", "metadata": {}, "source": [ "### Fee" ] }, { "cell_type": "code", "execution_count": 8, "id": "4d828226", "metadata": {}, "outputs": [], "source": [ "invoice0 = [\"Invoice\"\n", " ,{\"start\":\"2024-04-01\",\"originBalance\":2000\n", " ,\"originAdvance\":1500,\"dueDate\":\"2024-06-01\"\n", " ,\"feeType\":(\"Fixed\",150)}\n", " ,{\"status\":\"Current\"}]" ] }, { "cell_type": "code", "execution_count": 9, "id": "36f5b389", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[('2024-04-01', 2000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),\n", " ('2024-06-01', 0, 0, 1850, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0)]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r = localAPI.runAsset(\"2024-01-02\"\n", " ,[invoice0]\n", " ,poolAssump=None\n", " ,read=True)\n", "\n", "r[0].head()" ] }, { "cell_type": "code", "execution_count": 10, "id": "d71e2e1f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[('2024-04-01', 2000, 0, 0., 0., 0., 0., 0., 0, 0, 0, 0., 0., 0.),\n", " ('2024-06-01', 0, 0, 1846.91, 149.74, 3.35, 0., 0., 0, 0, 0, 3.35, 0., 0.),\n", " ('2024-06-11', 0, 0, 0., 0., 0., 0.83, 0., 0, 0, 0, 3.35, 0.83, 0.),\n", " ('2024-06-21', 0, 0, 0., 0., 0., 0.83, 1.68, 0, 0, 0, 3.35, 1.66, 1.68)]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r = localAPI.runAsset(\"2024-01-02\"\n", " ,[invoice0]\n", " ,poolAssump=(\"Pool\",(\"Receivable\"\n", " ,{'CDR':0.01}\n", " ,{\"Rate\":0.5,\"ByDays\":[(10,0.5),(20,0.5)]}\n", " ,None)\n", " ,None\n", " ,None)\n", " ,read=True)\n", "\n", "r[0].head()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.3" } }, "nbformat": 4, "nbformat_minor": 5 }