├── .gitignore ├── Innovation.ipynb ├── README.md ├── apt.txt ├── hiring.ipynb ├── project-throughput.ipynb ├── reliability.ipynb └── requirements.txt /.gitignore: -------------------------------------------------------------------------------- 1 | env/ 2 | .ipynb_checkpoints/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # systems-explorations 2 | 3 | This is a collection of system models developed 4 | using the [systems](https://github.com/lethain/systems) library, 5 | and explorable via [Binder](https://mybinder.org/) or locally runnable. 6 | 7 | [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/lethain/systems-explorations/master) 8 | 9 | ## Explorations 10 | 11 | The current explorations are: 12 | 13 | * **Hiring** ([github](./hiring.ipynb)) - model of a hiring funnel 14 | * **Reliability** ([github](./reliability.ipynb)) - model of reliability 15 | 16 | ## Installation 17 | 18 | Installation instructions are: 19 | 20 | git clone https://github.com/lethain/systems-explorations.git 21 | cd systems-explorations 22 | python3 -m venv ./env 23 | source ./env/bin/activate 24 | pip install -r requirements.txt 25 | 26 | Using the graphviz extensions will require also install `dot` for your 27 | operating system. 28 | 29 | Then you run Jupyter via: 30 | 31 | jupyter notebook 32 | 33 | Then click into the notebooks and get started. -------------------------------------------------------------------------------- /apt.txt: -------------------------------------------------------------------------------- 1 | graphviz 2 | -------------------------------------------------------------------------------- /hiring.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 8, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "from systems.parse import parse\n", 10 | "from systems.viz import as_dot\n", 11 | "from IPython.core.display import HTML\n", 12 | "import pandas as pd\n", 13 | "import matplotlib.pyplot as plt" 14 | ] 15 | }, 16 | { 17 | "cell_type": "code", 18 | "execution_count": 9, 19 | "metadata": {}, 20 | "outputs": [], 21 | "source": [ 22 | "spec = \"\"\"\n", 23 | "\n", 24 | "[Candidate] > Recruiters(3, 7) @ 1\n", 25 | "\n", 26 | "[Candidate] > Prospect @ Recruiters * 3\n", 27 | "Prospect > Screen @ 0.5\n", 28 | "Screen > Onsite @ 0.5\n", 29 | "Onsite > Offer @ 0.25\n", 30 | "Offer > Accept @ 0.5\n", 31 | "Accept > Hired @ 1.0\n", 32 | "\n", 33 | "\"\"\"\n", 34 | "model = parse(spec)" 35 | ] 36 | }, 37 | { 38 | "cell_type": "code", 39 | "execution_count": 10, 40 | "metadata": {}, 41 | "outputs": [ 42 | { 43 | "data": { 44 | "image/svg+xml": [ 45 | "\n", 46 | "\n", 48 | "\n", 50 | "\n", 51 | "\n", 53 | "\n", 54 | "%3\n", 55 | "\n", 56 | "\n", 57 | "\n", 58 | "2\n", 59 | "\n", 60 | "Candidate\n", 61 | "\n", 62 | "\n", 63 | "\n", 64 | "1\n", 65 | "\n", 66 | "Recruiters\n", 67 | "\n", 68 | "\n", 69 | "\n", 70 | "2->1\n", 71 | "\n", 72 | "\n", 73 | "\n", 74 | "\n", 75 | "\n", 76 | "3\n", 77 | "\n", 78 | "Prospect\n", 79 | "\n", 80 | "\n", 81 | "\n", 82 | "2->3\n", 83 | "\n", 84 | "\n", 85 | "\n", 86 | "\n", 87 | "\n", 88 | "4\n", 89 | "\n", 90 | "Screen\n", 91 | "\n", 92 | "\n", 93 | "\n", 94 | "3->4\n", 95 | "\n", 96 | "\n", 97 | "\n", 98 | "\n", 99 | "\n", 100 | "5\n", 101 | "\n", 102 | "Onsite\n", 103 | "\n", 104 | "\n", 105 | "\n", 106 | "4->5\n", 107 | "\n", 108 | "\n", 109 | "\n", 110 | "\n", 111 | "\n", 112 | "6\n", 113 | "\n", 114 | "Offer\n", 115 | "\n", 116 | "\n", 117 | "\n", 118 | "5->6\n", 119 | "\n", 120 | "\n", 121 | "\n", 122 | "\n", 123 | "\n", 124 | "7\n", 125 | "\n", 126 | "Accept\n", 127 | "\n", 128 | "\n", 129 | "\n", 130 | "6->7\n", 131 | "\n", 132 | "\n", 133 | "\n", 134 | "\n", 135 | "\n", 136 | "8\n", 137 | "\n", 138 | "Hired\n", 139 | "\n", 140 | "\n", 141 | "\n", 142 | "7->8\n", 143 | "\n", 144 | "\n", 145 | "\n", 146 | "\n", 147 | "\n" 148 | ], 149 | "text/plain": [ 150 | "" 151 | ] 152 | }, 153 | "execution_count": 10, 154 | "metadata": {}, 155 | "output_type": "execute_result" 156 | } 157 | ], 158 | "source": [ 159 | "# this will fail on e.g. Binder or if you don't have graphiz installed\n", 160 | "as_dot(model)" 161 | ] 162 | }, 163 | { 164 | "cell_type": "code", 165 | "execution_count": 11, 166 | "metadata": {}, 167 | "outputs": [ 168 | { 169 | "data": { 170 | "text/html": [ 171 | "\n", 172 | "\n", 173 | "\n", 174 | "\n", 175 | "\n", 176 | "\n", 177 | "\n", 178 | "\n", 179 | "\n", 180 | "\n", 181 | "\n", 182 | "\n", 183 | "\n", 184 | "\n", 185 | "\n", 186 | "\n", 187 | "\n", 188 | "\n", 189 | "\n", 190 | "\n", 191 | "\n", 192 | "\n", 193 | "\n", 194 | "\n", 195 | "\n", 196 | "\n", 197 | "
RoundRecruitersProspectScreenOnsiteOfferAcceptHired
03000000
14900000
251240000
361562000
471875000
572193100
6721107100
7721105200
8721105110
9721105201
10721105111
" 198 | ], 199 | "text/plain": [ 200 | "" 201 | ] 202 | }, 203 | "execution_count": 11, 204 | "metadata": {}, 205 | "output_type": "execute_result" 206 | } 207 | ], 208 | "source": [ 209 | "results = model.run(rounds=10)\n", 210 | "rendered = model.render_html(results)\n", 211 | "HTML(rendered)" 212 | ] 213 | }, 214 | { 215 | "cell_type": "code", 216 | "execution_count": 14, 217 | "metadata": {}, 218 | "outputs": [ 219 | { 220 | "data": { 221 | "text/plain": [ 222 | "
" 223 | ] 224 | }, 225 | "metadata": {}, 226 | "output_type": "display_data" 227 | }, 228 | { 229 | "data": { 230 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsYAAAD8CAYAAAB0FmJXAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3Xl4lNXd//H3yb4HQkIIZGNT9kXCEtxQFFxQarUiLli1xaVabfVXrdVa69qnm63aqn3qU4KoWFxr3RFXIkvYZFFBzGSFJEDIvszM+f0xARIIe5J7knxe15WLmTv3PfOdYWA+c+bc52ustYiIiIiIdHcBThcgIiIiIuIPFIxFRERERFAwFhEREREBFIxFRERERAAFYxERERERQMFYRERERARQMBYRERERARSMRUREREQABWMREREREQCCOvLO4uPjbXp6ekfepYiIiIh0Qzk5OWXW2oSjOaZDg3F6ejorV67syLsUERERkW7IGOM62mM0lUJEREREBAVjERERERFAwVhEREREBOjgOcataWxspKCggLq6OqdL6VTCwsJITk4mODjY6VJEREREugTHg3FBQQHR0dGkp6djjHG6nE7BWsuOHTsoKCigf//+TpcjIiIi0iU4PpWirq6OXr16KRQfBWMMvXr10ii7iIiISBtyPBgDCsXHQM+ZiIiISNtyfCqFiIi0bkdVPW+sLWJXdYPTpYiIdAsKxkBgYCAjR47E7XYzdOhQ5s2bR0REhNNlAfDYY48xd+5cv6lHRNrfuoJy5i118Z91RTS4vegLIhGRjqFgDISHh7NmzRoArrjiCp566il+/vOf7/29tRZrLQEBHT/z5LHHHuPKK69UMBbp4urdHt76sph5S12syS8nIiSQWRkpzMlMY3BitNPliYh0OubRoz9GwXg/p556KuvWrSM3N5fp06czceJEcnJyeOutt1i6dCkPP/ww1lrOP/98fve73+HxeLjuuutYuXIlxhiuvfZafvaznzFlyhRGjx7Nxx9/jNvt5tlnn2XChAlUV1dzyy23sH79ehobG/nNb37DzJkz8Xg83HnnnbzzzjsEBATw4x//GGstRUVFnHHGGcTHx7NkyRKnnx4RaWNF5bUsWObixeX57KhuYEB8JL+5YBjfH5dMTJiWYxQR6Uh+FYzv/88GNhZVtOltDusb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8p04yhgTBbwM3GatrXC6HnGWMWYGUGKtzXG6FvErQcBJwN+ttWOBao7wa1HpuprmjM7E98GpLxBpjLnS2arEH1nfEmxHtAxbRwTjQiCl2fXkpm3SzRljgvGF4gXW2lecrkf8wsnAhcaYXHzTrs40xjznbEniBwqAAmvtnm+VFuELytK9nQV8Z60ttdY2Aq8Akx2uSfzHdmNMEkDTnyVHclBHBOMVwGBjTH9jTAi+ifFvdMD9ih8zxhh88wU3WWv/5HQ94h+stb+01iZba9Px/V/xobVWI0DdnLV2G5BvjDmxadNUYKODJYl/yAMmGWMimt5TpqKTMmWfN4Crmy5fDbx+JAcFtVs5Tay1bmPMzcC7+M4YfdZau6G971f83snAVcCXxpg1Tdvutta+5WBNIuK/bgEWNA2wbAWucbgecZi1dpkxZhGwCt9KR6tRB7xuyRjzAjAFiDfGFAD3AY8CLxljrgNcwKVHdFvqfCciIiIiopPvREREREQABWMREREREUDBWEREREQEUDAWEREREQEUjEVEREREAAVjERERERFAwVhEREREBFAwFhEREREB4P8DvaT8a3YFEkIAAAAASUVORK5CYII=\n", 231 | "text/plain": [ 232 | "
" 233 | ] 234 | }, 235 | "metadata": { 236 | "needs_background": "light" 237 | }, 238 | "output_type": "display_data" 239 | } 240 | ], 241 | "source": [ 242 | "plt.close('all')\n", 243 | "df = pd.DataFrame.from_records(results, columns=['Prospect', 'Screen', 'Offer', 'Hired'])\n", 244 | "df.cumsum()\n", 245 | "plt.figure();\n", 246 | "df.plot(figsize=(12, 4));" 247 | ] 248 | }, 249 | { 250 | "cell_type": "code", 251 | "execution_count": null, 252 | "metadata": {}, 253 | "outputs": [], 254 | "source": [] 255 | } 256 | ], 257 | "metadata": { 258 | "kernelspec": { 259 | "display_name": "Python 3", 260 | "language": "python", 261 | "name": "python3" 262 | }, 263 | "language_info": { 264 | "codemirror_mode": { 265 | "name": "ipython", 266 | "version": 3 267 | }, 268 | "file_extension": ".py", 269 | "mimetype": "text/x-python", 270 | "name": "python", 271 | "nbconvert_exporter": "python", 272 | "pygments_lexer": "ipython3", 273 | "version": "3.6.3" 274 | } 275 | }, 276 | "nbformat": 4, 277 | "nbformat_minor": 2 278 | } 279 | -------------------------------------------------------------------------------- /reliability.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "from systems.parse import parse\n", 10 | "from systems.viz import as_dot\n", 11 | "from IPython.core.display import HTML\n", 12 | "import pandas as pd\n", 13 | "import matplotlib.pyplot as plt" 14 | ] 15 | }, 16 | { 17 | "cell_type": "code", 18 | "execution_count": 6, 19 | "metadata": {}, 20 | "outputs": [], 21 | "source": [ 22 | "spec = \"\"\"\n", 23 | "[Hires] > Developers @ 5\n", 24 | "[Hires] > SREs @ 1\n", 25 | "[Plans] > Changes @ (Developers-Incidents) * 2\n", 26 | "Changes > Incidents @ Conversion(1 / (1 + Remediated))\n", 27 | "Incidents > Mitigated @ SREs * 2\n", 28 | "Mitigated > Remediated @ 1\n", 29 | "\"\"\"\n", 30 | "model = parse(spec)" 31 | ] 32 | }, 33 | { 34 | "cell_type": "code", 35 | "execution_count": 7, 36 | "metadata": {}, 37 | "outputs": [ 38 | { 39 | "data": { 40 | "image/svg+xml": [ 41 | "\n", 42 | "\n", 44 | "\n", 46 | "\n", 47 | "\n", 49 | "\n", 50 | "%3\n", 51 | "\n", 52 | "\n", 53 | "\n", 54 | "2\n", 55 | "\n", 56 | "Hires\n", 57 | "\n", 58 | "\n", 59 | "\n", 60 | "1\n", 61 | "\n", 62 | "Developers\n", 63 | "\n", 64 | "\n", 65 | "\n", 66 | "2->1\n", 67 | "\n", 68 | "\n", 69 | "\n", 70 | "\n", 71 | "\n", 72 | "3\n", 73 | "\n", 74 | "SREs\n", 75 | "\n", 76 | "\n", 77 | "\n", 78 | "2->3\n", 79 | "\n", 80 | "\n", 81 | "\n", 82 | "\n", 83 | "\n", 84 | "4\n", 85 | "\n", 86 | "Plans\n", 87 | "\n", 88 | "\n", 89 | "\n", 90 | "5\n", 91 | "\n", 92 | "Changes\n", 93 | "\n", 94 | "\n", 95 | "\n", 96 | "4->5\n", 97 | "\n", 98 | "\n", 99 | "\n", 100 | "\n", 101 | "\n", 102 | "6\n", 103 | "\n", 104 | "Incidents\n", 105 | "\n", 106 | "\n", 107 | "\n", 108 | "5->6\n", 109 | "\n", 110 | "\n", 111 | "\n", 112 | "\n", 113 | "\n", 114 | "7\n", 115 | "\n", 116 | "Mitigated\n", 117 | "\n", 118 | "\n", 119 | "\n", 120 | "6->7\n", 121 | "\n", 122 | "\n", 123 | "\n", 124 | "\n", 125 | "\n", 126 | "8\n", 127 | "\n", 128 | "Remediated\n", 129 | "\n", 130 | "\n", 131 | "\n", 132 | "7->8\n", 133 | "\n", 134 | "\n", 135 | "\n", 136 | "\n", 137 | "\n" 138 | ], 139 | "text/plain": [ 140 | "" 141 | ] 142 | }, 143 | "execution_count": 7, 144 | "metadata": {}, 145 | "output_type": "execute_result" 146 | } 147 | ], 148 | "source": [ 149 | "# this will fail on e.g. Binder or if you don't have graphiz installed\n", 150 | "as_dot(model)" 151 | ] 152 | }, 153 | { 154 | "cell_type": "code", 155 | "execution_count": 8, 156 | "metadata": {}, 157 | "outputs": [ 158 | { 159 | "data": { 160 | "text/html": [ 161 | "\n", 162 | "\n", 163 | "\n", 164 | "\n", 165 | "\n", 166 | "\n", 167 | "\n", 168 | "\n", 169 | "\n", 170 | "\n", 171 | "\n", 172 | "\n", 173 | "\n", 174 | "\n", 175 | "\n", 176 | "\n", 177 | "\n", 178 | "\n", 179 | "\n", 180 | "\n", 181 | "\n", 182 | "\n", 183 | "\n", 184 | "\n", 185 | "\n", 186 | "
RoundDevelopersSREsChangesIncidentsMitigatedRemediated
0000000
1510000
210210000
3153201000
4204222460
5255838131
6306032222
73572020333
84085811464
94595822455
1050108213626
" 187 | ], 188 | "text/plain": [ 189 | "" 190 | ] 191 | }, 192 | "execution_count": 8, 193 | "metadata": {}, 194 | "output_type": "execute_result" 195 | } 196 | ], 197 | "source": [ 198 | "results = model.run(rounds=10)\n", 199 | "rendered = model.render_html(results)\n", 200 | "HTML(rendered)\n", 201 | "#rendered.replace('\\n','').replace(\"\", \"
\")" 202 | ] 203 | }, 204 | { 205 | "cell_type": "code", 206 | "execution_count": 10, 207 | "metadata": {}, 208 | "outputs": [ 209 | { 210 | "data": { 211 | "text/plain": [ 212 | "
" 213 | ] 214 | }, 215 | "metadata": {}, 216 | "output_type": "display_data" 217 | }, 218 | { 219 | "data": { 220 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAskAAAD8CAYAAACFHTnaAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3Xt809X9x/HXadIm9ALlVkSgcoeC3ATxgiIX7yL6m0xFnf7QTbe5i3Nz013cdLrp5s9t6qbD6dRt4v2Ct23eEO8IyB2UO7RcCoWWpm3SJvn+/jgptKWlaZs2Sft+Ph48mn6bJqclTd4538/5HOM4DiIiIiIickhKvAcgIiIiIpJoFJJFREREROpQSBYRERERqUMhWURERESkDoVkEREREZE6FJJFREREROpQSBYRERERqUMhWURERESkDoVkEREREZE63PEeAECPHj2c/v37x3sYIiIiItLOLVmyZK/jOD0bu15ChOT+/fuzePHieA9DRERERNo5Y8zWaK6ncgsRERERkToUkkVERERE6lBIFhERERGpIyFqkutTVVVFfn4+fr8/3kNJal6vl759+5KamhrvoYiIiIgkjYQNyfn5+WRlZdG/f3+MMfEeTlJyHIeioiLy8/MZMGBAvIcjIiIikjQSttzC7/fTvXt3BeQWMMbQvXt3zcaLiIiINFHChmRAATkG9DsUERERabqELbcQERERiaWNe3y8vmIn6R43mR4XmZ5UMjwuMj1uMr1u+9HjJsPjJtWV0POI0gYUko/AGMPll1/OP//5TwCCwSC9e/fmhBNO4NVXX2X+/PmsWbOGm2++mZdeeomhQ4cyYsQIAG699VYmT57M6aef3uT7XbZsGTt27ODcc89t0vdNmTKFe+65hwkTJjT5PkVERNq7hxZs5Nkl+VFd1+NOIct7KDTXDNB1A3VW5FjN62V63WSmucnwuHArcCclheQjyMjIYNWqVVRUVNCpUyfefPNN+vTpc/DrM2fOZObMmQC89NJLzJgx42BIvv3225t9v8uWLWPx4sVNDskiIiLSsPz9FYztl83jcybiqwzi8wfxBSL//EHKAoc+LwsEKY18rL7ergP+g9cp9QcJBMNR3a83NYVMT6qdvfa6yUhzk1UzVEcCdXXQzmogjGd63LhSVEbZVhSSG3Huuefy2muvMWvWLObNm8fs2bN5//33AXjsscdYvHgxl112GfPnz+e9997jjjvu4Pnnn+fXv/41M2bMYNasWbz++uvceOONZGRkMGnSJDZt2sSrr77KokWL+P73v4/f76dTp078/e9/Z8CAAdx6661UVFTwwQcfcMsttzBjxgy++93vsmrVKqqqqvjVr37FBRdcQEVFBXPmzGH58uUMHz6cioqKOP+2REREEteOkgpG982mS3oqXdJb3hq1KhQ+PFj7g5QFQvgCVQcvl1VWHz8UyHcU+2uF8cooA3enVFet8HxwNtvrjpSORMK4p04Ir3E5w2ODugL3kSVFSL7tldWs2XEgprc54ujO/PL8kY1e79JLL+X2229nxowZrFixgquvvvpgSK528sknM3PmzIOhuCa/3891113HwoULGTBgALNnzz74teHDh/P+++/jdrt56623+OlPf8rzzz/P7bffzuLFi3nggQcA+OlPf8q0adN49NFHKS4uZuLEiZx++un89a9/JT09nbVr17JixQqOO+64GPxmRERE2p9w2GFnsZ+zj/XG7DZTXSlkp6eRnZ7W4tuqDB4K3GWRWe66M9nVQbtm6C4LhCgorsAXqLLh3B+kMhRd4M5Ic9Wasc5Iq6eUpE7JyaEZ8EM13RlpblLaYeBOipAcT6NHj2bLli3MmzevWeUP69atY+DAgQf7FM+ePZu5c+cCUFJSwlVXXcX69esxxlBVVVXvbfz3v/9l/vz53HPPPYAN3tu2bWPhwoV873vfOzjO0aNHN+dHFBERaff2+gJUhsL0ze4U76HUK82dQpo7ja4ZLQ/cgWDIzmBHgnX1jHXdGe+6x33+INv3lde6XlXIieo+M9JctcpFqstK6gvdDR73uElPdSVM4E6KkBzNjG9rmjlzJj/60Y9YsGABRUVFMbvdX/ziF0ydOpUXX3yRLVu2MGXKlHqv5zgOzz//PMOGDYvZfYuIiHQk+cW2JPHoBA3JseRxu/C4XXSLUeD2RcpGSqtnqwNV+AKhg3XcpfXUdPsCQYp85XbGOzIzHgw3HriNIbLgsW6Ntqt2XXfN2u0Gyko6pbpa1Ao3KUJyvF199dVkZ2czatQoFixYUO91srKyKC0tPez4sGHD2LRpE1u2bKF///48/fTTB79WUlJycCHgY4891uBtnXXWWdx///3cf//9GGP4/PPPGTduHJMnT+bJJ59k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\n", 221 | "text/plain": [ 222 | "
" 223 | ] 224 | }, 225 | "metadata": { 226 | "needs_background": "light" 227 | }, 228 | "output_type": "display_data" 229 | } 230 | ], 231 | "source": [ 232 | "plt.close('all')\n", 233 | "results = model.run(rounds=100)\n", 234 | "df = pd.DataFrame.from_records(results[1:], columns=['Mitigated', 'Incidents'])\n", 235 | "df.cumsum()\n", 236 | "plt.figure();\n", 237 | "df.plot(figsize=(12, 4));" 238 | ] 239 | }, 240 | { 241 | "cell_type": "code", 242 | "execution_count": null, 243 | "metadata": {}, 244 | "outputs": [], 245 | "source": [] 246 | } 247 | ], 248 | "metadata": { 249 | "kernelspec": { 250 | "display_name": "Python 3", 251 | "language": "python", 252 | "name": "python3" 253 | }, 254 | "language_info": { 255 | "codemirror_mode": { 256 | "name": "ipython", 257 | "version": 3 258 | }, 259 | "file_extension": ".py", 260 | "mimetype": "text/x-python", 261 | "name": "python", 262 | "nbconvert_exporter": "python", 263 | "pygments_lexer": "ipython3", 264 | "version": "3.6.3" 265 | } 266 | }, 267 | "nbformat": 4, 268 | "nbformat_minor": 2 269 | } 270 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | graphviz==0.9 2 | jupyter==1.0.0 3 | jupyter-client==5.2.4 4 | jupyter-console==6.0.0 5 | jupyter-core==4.4.0 6 | matplotlib==3.0.2 7 | notebook==5.7.4 8 | pandas==0.24.1 9 | PyYAML>=4.2b1 10 | requests>=2.20.0 11 | systems>=0.1.0 12 | --------------------------------------------------------------------------------