diff --git a/.ipynb_checkpoints/funding campaign demo-checkpoint.ipynb b/.ipynb_checkpoints/funding campaign demo-checkpoint.ipynb new file mode 100644 index 0000000..2fd6442 --- /dev/null +++ b/.ipynb_checkpoints/funding campaign demo-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/camp_logics.png b/camp_logics.png new file mode 100644 index 0000000..e546218 Binary files /dev/null and b/camp_logics.png differ diff --git a/funding campaign demo.ipynb b/funding campaign demo.ipynb new file mode 100644 index 0000000..48d916a --- /dev/null +++ b/funding campaign demo.ipynb @@ -0,0 +1,266 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "from datetime import datetime, timedelta\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "#campaigns\n", + "init_date = datetime.now()\n", + "\n", + "campaigns = {1:{'name': 'ABC field test', \n", + " 'min_raise': 984.0, \n", + " 'max_raise': 1500.0, \n", + " 'cutoff_date': init_date+timedelta(days=365*2/12.0),\n", + " 'expected_time': timedelta(days=365*8/12.0)},\n", + " 2:{'name': 'Giveth field test', \n", + " 'min_raise': 726.0, \n", + " 'max_raise': 1500.0, \n", + " 'cutoff_date': init_date+timedelta(days=365*4/12),\n", + " 'expected_time': timedelta(days=365*6/12.0)},\n", + " 3:{'name': 'CV field test', \n", + " 'min_raise': 1140.0, \n", + " 'max_raise': 2000.0, \n", + " 'cutoff_date': init_date+timedelta(days=365*6/12),\n", + " 'expected_time': timedelta(days=365*12/12)},\n", + " 4:{'name': 'Analytics', \n", + " 'min_raise': 780.0, \n", + " 'max_raise': 1500.0, \n", + " 'cutoff_date': init_date+timedelta(days=365*4/12.0),\n", + " 'expected_time': timedelta(days=365*16/12.0)},\n", + " 5:{'name': 'Mobile first', \n", + " 'min_raise': 1610.0, \n", + " 'max_raise': 2500.0, \n", + " 'cutoff_date': init_date+timedelta(days=365*8/12.0),\n", + " 'expected_time': timedelta(days=365*24/12.0)},\n", + " 6:{'name': 'Easy Deploy', \n", + " 'min_raise': 1500.0, \n", + " 'max_raise': 3000.0, \n", + " 'cutoff_date': init_date+timedelta(days=365*6/12.0),\n", + " 'expected_time': timedelta(days=365*30/12.0)},\n", + " \n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{1: {'cutoff_date': datetime.datetime(2019, 9, 21, 7, 16, 2, 960914),\n", + " 'expected_time': datetime.timedelta(243, 28800),\n", + " 'max_raise': 1500.0,\n", + " 'min_raise': 984.0,\n", + " 'name': 'ABC field test'},\n", + " 2: {'cutoff_date': datetime.datetime(2019, 11, 21, 3, 16, 2, 960914),\n", + " 'expected_time': datetime.timedelta(182, 43200),\n", + " 'max_raise': 1500.0,\n", + " 'min_raise': 726.0,\n", + " 'name': 'Giveth field test'},\n", + " 3: {'cutoff_date': datetime.datetime(2020, 1, 20, 23, 16, 2, 960914),\n", + " 'expected_time': datetime.timedelta(365),\n", + " 'max_raise': 2000.0,\n", + " 'min_raise': 1140.0,\n", + " 'name': 'CV field test'},\n", + " 4: {'cutoff_date': datetime.datetime(2019, 11, 21, 3, 16, 2, 960914),\n", + " 'expected_time': datetime.timedelta(486, 57600),\n", + " 'max_raise': 1500.0,\n", + " 'min_raise': 780.0,\n", + " 'name': 'Analytics'},\n", + " 5: {'cutoff_date': datetime.datetime(2020, 3, 21, 19, 16, 2, 960914),\n", + " 'expected_time': datetime.timedelta(730),\n", + " 'max_raise': 2500.0,\n", + " 'min_raise': 1610.0,\n", + " 'name': 'Mobile first'},\n", + " 6: {'cutoff_date': datetime.datetime(2020, 1, 20, 23, 16, 2, 960914),\n", + " 'expected_time': datetime.timedelta(912, 43200),\n", + " 'max_raise': 3000.0,\n", + " 'min_raise': 1500.0,\n", + " 'name': 'Easy Deploy'}}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "campaigns" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "tranches = { tr:{'raised':0, 'status':'not_started'} for tr in range(2,7)}\n", + "tranches[1] = {'raised':0, 'status':'active'}\n", + "state = {'new_raised':0,'total_raised': 0, 'active_tranche':1,'tranches': tranches}" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'active_tranche': 1,\n", + " 'new_raised': 0,\n", + " 'total_raised': 0,\n", + " 'tranches': {1: {'raised': 0, 'status': 'active'},\n", + " 2: {'raised': 0, 'status': 'not_started'},\n", + " 3: {'raised': 0, 'status': 'not_started'},\n", + " 4: {'raised': 0, 'status': 'not_started'},\n", + " 5: {'raised': 0, 'status': 'not_started'},\n", + " 6: {'raised': 0, 'status': 'not_started'}}}" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "state" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "T = 52*3\n", + "dt = timedelta(weeks =1)\n", + "\n", + "def gen_raise(thresh = .3, scale = 10):\n", + " rv = np.random.rand()\n", + " if rv < thresh:\n", + " return 0\n", + " else :\n", + " return rv*scale" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + " \n", + "def tranche_iter_logic(week, state):\n", + " \n", + " ct = state['active_tranche']\n", + " \n", + " ct_data = state['tranches'][ct]\n", + " \n", + " #is the deadline passed:\n", + " if ct_data['raised'] > ct_data['max_raise']:\n", + " \n", + " \n", + " elif week > campaigns[ct]['cutoff_date']:\n", + " \n", + " #is the cap reached\n", + " elif \n", + " \n", + " \n", + " \n", + " return " + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['active',\n", + " 'not_started',\n", + " 'not_started',\n", + " 'not_started',\n", + " 'not_started',\n", + " 'not_started']" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tranch_status" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "states = [state]\n", + "for t in range(T):\n", + " new_raise = gen_raise()\n", + " state['new_raised'] = new_raise\n", + " state['total_raised'] = state['total_raised'] + new_raise\n", + " \n", + " #\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}