├── .DS_Store ├── Examples.ipynb ├── LICENSE.txt ├── MANIFEST ├── README.md ├── Tree_interpreter_Example.ipynb ├── dist └── waterfallcharts-3.8.tar.gz ├── images ├── RF1.png ├── RF2.png ├── image1.png └── image2.png ├── setup.cfg ├── setup.py ├── waterfall_chart.py └── waterfallcharts.egg-info ├── PKG-INFO ├── SOURCES.txt ├── dependency_links.txt └── top_level.txt /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chrispaulca/waterfall/76aca3543b39a79a82bd82137928d2b023078701/.DS_Store -------------------------------------------------------------------------------- /Examples.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "%matplotlib inline" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 2, 17 | "metadata": { 18 | "collapsed": true 19 | }, 20 | "outputs": [], 21 | "source": [ 22 | "import waterfall_chart" 23 | ] 24 | }, 25 | { 26 | "cell_type": "code", 27 | "execution_count": 3, 28 | "metadata": { 29 | "collapsed": true 30 | }, 31 | "outputs": [], 32 | "source": [ 33 | "a = ['sales','returns','credit fees','rebates','late charges','shipping']\n", 34 | "b = [10,-30,-7.5,-25,95,-7]" 35 | ] 36 | }, 37 | { 38 | "cell_type": "code", 39 | "execution_count": 4, 40 | "metadata": {}, 41 | "outputs": [ 42 | { 43 | "data": { 44 | "image/png": "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\ne+/Z2W8k9t6VQdt3knvvzw7a+tcwsxnunrOl9VTFJyIiqaQEJSIiqaQEJSIiqVQtOklUtbr0dbn9\ny/w1i6vm1JGJvbeIVC8qQYmISCopQYmISCopQYmISCopQYmISCopQYmISCopQYmISCopQYmISCop\nQYmISCopQYmISCopQYmISCopQYmISCopQYmISCopQYmISCopQYmISCqVaYIys6PN7BMzm2Nmg4tY\nbmZ2V1z+gZkdUJbvLyIiVUeZJSgzywJGAD2A9sBpZta+wGo9gLbxMQC4r6zeX0REqpayLEEdDMxx\n97nuvhZ4AuhdYJ3ewKMevAk0NrPmZRiDiIhUEWV5R90WwFcZ0/OBDsVYpwWwMHMlMxtAKGGRnZ3N\ngAED2GuvvcjNzeX+++9n22235YorruCPf/wjAMOHD2fIkCGsXbuWSy+9lOeee47PP/+ck08+mYUL\nF9Jp6j4ceuihtGrVirFjx7LLLrtwyimnMGzYMLKyshg+fDi/+93vALj++uu58847WbZsGeeffz5v\nvfUWH3zwAT169ABgwoQJ7LvvvnTo0IEHH3yQpk2bcskll3DdddcBcMcdd3D55Zezfv16rrjiCm78\n6418+eWXnHbaaXzxxRdMnz6d3NxcmjdvzlNPPUWbNm3o06cPt99+O7Vr12bo0KFcfvnlANx4440M\nGzaMlStXcsEFFzB16lRmzZrFMUu/ZI2v5+XlC9i/wXbsv812jPr6U7Jr1eU3zdtx45fvAXDnrodw\nyX/CHX2v3HlfxnzzHxas+R99t9+Nz1Z9y9vffUPnbZuzXa06PLtkHrvVa8TRTXbmnv/Ool6NmlzX\n6pcM/vwdAG5qncPQr97nhwEDGDhwIJMmTeLjjz+mT58+fPfdd0yaNImcnBz22msvRo8ezY477kj/\n/v256aabALj77ru56KKLALj66qsZOXIkixYt4uyzz2bWrFnk5eXRtWtXGjZsyHPPPceee+5J165d\nGTFiBA0aNODqq69myJAhANx6661cd911rFq1iosvvpjx48czZ84cfv3rX7N06VImT55Mhw4daNu2\nLY8//jgtWrTgzDPP5JZbbikUy7XXXst9993H4sWLOffcc3nvvfd477336N69O3Xq1OH555/fqu/e\n1KlTE/vuPfnkk1v13fv6+i/Y8N16Gp+9A6ve/JY1n6yiQfcm+NoN/G/ySuruXZ+6+2zDirGLydqu\nJk367cCS4QsA2OHm1nx91TwAtrtoJ1Y+vYR1i9ay7YnNWDt3Nave/Z76hzYiq0lNvntxGbVb12Wb\nXzVm+UOLsLo1WHHrCq688koAhg4dyk033cT333+v71787h2R4HdvwICt/+4Vl7l7sVf+2RcyOxE4\n2t3Pi9NnAh3cfVDGOi8At7j763F6EvAHd8/b3Ovm5OR4Xt5mF1dLuuW7VIT2iw9J7L1nZ7+R2HtL\n+TOzGe6es6X1yrKKbwGwc8Z0yzivpOuIiIiUaYJ6B2hrZm3MrDZwKjCuwDrjgLNib76OwEp3X1jw\nhURERMqsDcrd15nZIGAikAU87O6zzOyCuPx+YDxwDDAH+AE4p6zeX0REqpay7CSBu48nJKHMefdn\nPHdgYFm+p4iIVE0aSUJERFJJCUpERFJJCUpERFJJCUpERFJJCUpERFJJCUpERFJJCUpERFJJCUpE\nRFJJCUpERFJJCUpERFJJCUpERFJJCUpERFJJCUpERFJJCUpERFJJCUpERFJJCUpERFJJCUpERFJJ\nCUpERFJJCUpERFJJCUpERFJJCUpERFJJCUpERFJJCUpERFJJCUpERFJJCUpERFJJCUpERFJJCUpE\nRFKpRAnKzPqa2Qdm9qGZTTez/TKWHW1mn5jZHDMbvJntzczuiut8YGYHbO0OiIhI1VTSEtTnQGd3\n3we4AXgAwMyygBFAD6A9cJqZtS9i+x5A2/gYANxXyrhFRKSKK1GCcvfp7r48Tr4JtIzPDwbmuPtc\nd18LPAH0LuIlegOPevAm0NjMmpcydhERqcJqbsW2/YEJ8XkL4KuMZfOBDkVsU9R6LYCFmSuZ2QBC\nCYtddtllK0KsmmpOHZl0CGVmXW7/xN67Kv0fRaqiUnWSMLMjCAnqD2UbTuDuD7h7jrvnZGdnl8db\niIhIym0xQZnZQDObGR87mdm+wENAb3dfGldbAOycsVnLOK+g4q4nIiLV3BYTlLuPcPf93X1/QpXg\ns8CZ7v5pxmrvAG3NrI2Z1QZOBcYV8XLjgLNib76OwEp3X1jEelJaZ54JXbpATg7cfvvG+aNGwaGH\nwmGHwbvvFt5u9Wro2xdyc8Pf1asrKmIRkSKVtIrvWmA74N5YosoDcPd1wCBgIvAR8JS7zwIwswvM\n7IK4/XhgLjAHeBC4cOt3QTYxciRMngxvvgn33gvffQfLl8Ndd4X5jz8OF19ceLtRo2DPPWHqVNhj\n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\nrkJggg==\n", 45 | "text/plain": [ 46 | "" 47 | ] 48 | }, 49 | "metadata": {}, 50 | "output_type": "display_data" 51 | } 52 | ], 53 | "source": [ 54 | "my_plot = waterfall_chart.plot(a, b)" 55 | ] 56 | }, 57 | { 58 | "cell_type": "code", 59 | "execution_count": 5, 60 | "metadata": {}, 61 | "outputs": [ 62 | { 63 | "data": { 64 | "image/png": "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\nTlBmZpZL/x8R4AMbAPtIpwAAAABJRU5ErkJggg==\n", 65 | "text/plain": [ 66 | "" 67 | ] 68 | }, 69 | "metadata": {}, 70 | "output_type": "display_data" 71 | } 72 | ], 73 | "source": [ 74 | "my_plot = waterfall_chart.plot(a, b, rotation_value=90, sorted_value=True, threshold=0.2, \n", 75 | " formatting = \"$ {:,.1f}\", net_label=\"End Result\", other_label=\"misc\",\n", 76 | " Title=\"Chart\", x_lab = \"X axis\", y_lab = \"Money\", blue_color = \"blue\",\n", 77 | " green_color = \"#95FF24\", red_color = 'r')" 78 | ] 79 | }, 80 | { 81 | "cell_type": "code", 82 | "execution_count": null, 83 | "metadata": { 84 | "collapsed": true 85 | }, 86 | "outputs": [], 87 | "source": [] 88 | } 89 | ], 90 | "metadata": { 91 | "kernelspec": { 92 | "display_name": "Python 2", 93 | "language": "python", 94 | "name": "python2" 95 | }, 96 | "language_info": { 97 | "codemirror_mode": { 98 | "name": "ipython", 99 | "version": 2 100 | }, 101 | "file_extension": ".py", 102 | "mimetype": "text/x-python", 103 | "name": "python", 104 | "nbconvert_exporter": "python", 105 | "pygments_lexer": "ipython2", 106 | "version": "2.7.13" 107 | } 108 | }, 109 | "nbformat": 4, 110 | "nbformat_minor": 2 111 | } 112 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright 2017 Christopher Paul Csiszar 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /MANIFEST: -------------------------------------------------------------------------------- 1 | # file GENERATED by distutils, do NOT edit 2 | README.txt 3 | setup.cfg 4 | setup.py 5 | waterfallcharts/__init__.py 6 | waterfallcharts/quick_charts.py 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # waterfallcharts 2 | 3 | ## Description 4 | 5 | [Waterfall charts](https://en.wikipedia.org/wiki/Waterfall_chart) are great at visualizing marginal value contributions to some system or starting value (bias). This package is a hassle free way to generate them in Python! 6 | 7 | The idea was first brought to my attention by [Jeremy Howard](https://twitter.com/jeremyphoward), who remarked that no such package existed. The underlying method borrows from Chris Moffitt's [stacked bar charts approach](http://pbpython.com/waterfall-chart.html), 8 | and improves upon data range reliability, appearance, and chart options. 9 | 10 | The application use of waterfall charts is up to the user's creativity! These charts are great at visualizing revenue and expenses, but are universally applicable to showing any kind of marginal contributions to a system. 11 | 12 | Thank you to [Jade Yun](https://github.com/yuyun2) for the random forest decision tree interpreter example, and for the sorted_values and thresholding features. 13 | 14 | 15 | ## Usage 16 | 17 | As detailed in the [example](https://github.com/chrispaulca/hosted_waterfall/blob/master/Examples.ipynb) and source code, the function assumes two list inputs, one of the contribution names and the other of the contribution amounts. Please note that the net sum of all contributions is not an input to the function, and is calculated for you. 18 | 19 | ```python 20 | import waterfall_chart 21 | 22 | a = ['sales','returns','credit fees','rebates','late charges','shipping'] 23 | b = [10,-30,-7.5,-25,95,-7] 24 | 25 | my_plot = waterfall_chart.plot(a, b) 26 | ``` 27 | 28 | ## Functionality 29 | 30 | There is currently one function: 31 | * `plot()`: Given two sequences ordered appropriately, of contribution amounts and labels, generate a standard waterfall chart 32 | 33 |
34 | 35 | There are three features: 36 | 37 | * sorted_value: Sorts contributions by absolute value in the chart 38 | 39 | * threshold: Groups all contributions under a certain threshold value into an 'other' group 40 | 41 | * formatting: Formats Y axis labels and bar chart labels to the specified input 42 | 43 | Additionally, there are several arguments that control for chart title, axis names, bar colors, custom bar labels for 44 | 'other' and 'net', and x label rotation angles 45 | 46 |
47 | 48 | 49 | Check out these [examples](https://github.com/chrispaulca/hosted_waterfall/blob/master/Examples.ipynb) for simple charts. 50 | 51 | 52 | ## Random forest interpretation 53 | 54 | Additionally, the output metrics of a [decision tree interpreter](https://github.com/andosa/treeinterpreter) can be provided to a waterfall chart. This allows for a visualization of incremental contributions of the tree's nodes to the final prediction - a nice way to see what your random forest is doing. 55 | For example, after constructing a random forest on sklearn's breast cancer dataset, we obtain the breakdown of feature contributions to the final prediction for one row of the data. We can use a waterfall chart to intuitively relay this information to an audience. For example, the patient's diagnosis of whether they have breast cancer or not can be visually represented as: 56 | 57 |
58 | 59 | 60 | Check out this [example](https://github.com/chrispaulca/waterfall/blob/master/Tree_interpreter_Example.ipynb) for the entire random forest code, built with the [fastai](https://github.com/fastai/fastai) library. 61 | 62 | ## Installation 63 | 64 | Simply install the Python `waterfallcharts` package: 65 | 66 | ```bash 67 | $ pip install waterfallcharts 68 | ``` 69 | 70 | or upgrade to the latest version: 71 | 72 | ```bash 73 | $ pip install -U waterfallcharts 74 | ``` 75 | 76 | ## Implementation notes 77 | 78 | ### Deploy 79 | 80 | ```bash 81 | $ python setup.py sdist upload 82 | ``` 83 | 84 | 85 | 86 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /Tree_interpreter_Example.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "%load_ext autoreload\n", 12 | "%autoreload 2\n", 13 | "\n", 14 | "%matplotlib inline" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 2, 20 | "metadata": { 21 | "collapsed": true 22 | }, 23 | "outputs": [], 24 | "source": [ 25 | "from fastai.imports import *\n", 26 | "from fastai.structured import *\n", 27 | "from pandas_summary import DataFrameSummary\n", 28 | "import pandas as pd\n", 29 | "import numpy as np \n", 30 | "from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier\n", 31 | "from IPython.display import display\n", 32 | "\n", 33 | "from sklearn import metrics\n", 34 | "from sklearn.datasets import load_breast_cancer\n", 35 | "from sklearn.metrics import roc_curve, roc_auc_score\n", 36 | "from matplotlib.ticker import FuncFormatter\n", 37 | "import matplotlib.pyplot as plt\n", 38 | "import matplotlib.lines as lines\n", 39 | "import waterfall_chart " 40 | ] 41 | }, 42 | { 43 | "cell_type": "markdown", 44 | "metadata": {}, 45 | "source": [ 46 | "# Data Processing" 47 | ] 48 | }, 49 | { 50 | "cell_type": "code", 51 | "execution_count": 3, 52 | "metadata": { 53 | "collapsed": true 54 | }, 55 | "outputs": [], 56 | "source": [ 57 | "#load data\n", 58 | "cancer = load_breast_cancer()" 59 | ] 60 | }, 61 | { 62 | "cell_type": "code", 63 | "execution_count": 4, 64 | "metadata": {}, 65 | "outputs": [ 66 | { 67 | "data": { 68 | "text/plain": [ 69 | "array(['malignant', 'benign'],\n", 70 | " dtype='\n", 104 | "\n", 117 | "\n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 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 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | " \n", 430 | " \n", 431 | " \n", 432 | " \n", 433 | " \n", 434 | " \n", 435 | " \n", 436 | " \n", 437 | " \n", 438 | " \n", 439 | " \n", 440 | " \n", 441 | " \n", 442 | " \n", 443 | " \n", 444 | " \n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | " \n", 503 | " \n", 504 | " \n", 505 | " \n", 506 | " \n", 507 | " \n", 508 | " \n", 509 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " \n", 594 | " \n", 595 | " \n", 596 | " \n", 597 | " \n", 598 | " \n", 599 | " \n", 600 | " \n", 601 | " \n", 602 | " \n", 603 | " \n", 604 | " \n", 605 | " \n", 606 | " \n", 607 | " \n", 608 | " \n", 609 | " \n", 610 | " \n", 611 | " \n", 612 | " \n", 613 | " \n", 614 | " \n", 615 | " \n", 616 | " \n", 617 | " \n", 618 | " \n", 619 | " \n", 620 | " \n", 621 | " \n", 622 | " \n", 623 | " \n", 624 | " \n", 625 | " \n", 626 | " \n", 627 | " \n", 628 | " \n", 629 | " \n", 630 | " \n", 631 | " \n", 632 | " \n", 633 | " \n", 634 | " \n", 635 | " \n", 636 | " \n", 637 | " \n", 638 | " \n", 639 | " \n", 640 | " \n", 641 | " \n", 642 | " \n", 643 | " \n", 644 | " \n", 645 | " \n", 646 | " \n", 647 | " \n", 648 | " \n", 649 | " \n", 650 | " \n", 651 | " \n", 652 | " \n", 653 | " \n", 654 | " \n", 655 | " \n", 656 | " \n", 657 | " \n", 658 | " \n", 659 | " \n", 660 | " \n", 661 | " \n", 662 | " \n", 663 | " \n", 664 | " \n", 665 | " \n", 666 | " \n", 667 | " \n", 668 | " \n", 669 | " \n", 670 | " \n", 671 | " \n", 672 | " \n", 673 | " \n", 674 | " \n", 675 | " \n", 676 | " \n", 677 | " \n", 678 | " \n", 679 | " \n", 680 | " \n", 681 | " \n", 682 | " \n", 683 | " \n", 684 | " \n", 685 | " \n", 686 | " \n", 687 | " \n", 688 | " \n", 689 | " \n", 690 | " \n", 691 | " \n", 692 | " \n", 693 | " \n", 694 | " \n", 695 | " \n", 696 | " \n", 697 | " \n", 698 | " \n", 699 | " \n", 700 | " \n", 701 | " \n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | " \n", 711 | " \n", 712 | " \n", 713 | " \n", 714 | " \n", 715 | " \n", 716 | " \n", 717 | " \n", 718 | " \n", 719 | " \n", 720 | " \n", 721 | " \n", 722 | " \n", 723 | " \n", 724 | " \n", 725 | " \n", 726 | " \n", 727 | " \n", 728 | " \n", 729 | " \n", 730 | " \n", 731 | " \n", 732 | " \n", 733 | " \n", 734 | " \n", 735 | " \n", 736 | " \n", 737 | " \n", 738 | " \n", 739 | " \n", 740 | " \n", 741 | " \n", 742 | " \n", 743 | " \n", 744 | " \n", 745 | " \n", 746 | " \n", 747 | " \n", 748 | " \n", 749 | " \n", 750 | " \n", 751 | " \n", 752 | " \n", 753 | " \n", 754 | " \n", 755 | " \n", 756 | " \n", 757 | " \n", 758 | " \n", 759 | " \n", 760 | " \n", 761 | " \n", 762 | " \n", 763 | " \n", 764 | " \n", 765 | " \n", 766 | " \n", 767 | " \n", 768 | " \n", 769 | " \n", 770 | " \n", 771 | " \n", 772 | " \n", 773 | " \n", 774 | " \n", 775 | " \n", 776 | " \n", 777 | " \n", 778 | " \n", 779 | " \n", 780 | " \n", 781 | " \n", 782 | " \n", 783 | " \n", 784 | " \n", 785 | " \n", 786 | " \n", 787 | " \n", 788 | " \n", 789 | " \n", 790 | " \n", 791 | " \n", 792 | " \n", 793 | " \n", 794 | " \n", 795 | " \n", 796 | " \n", 797 | " \n", 798 | " \n", 799 | " \n", 800 | " \n", 801 | " \n", 802 | " \n", 803 | " \n", 804 | " \n", 805 | " \n", 806 | " \n", 807 | " \n", 808 | " \n", 809 | " \n", 810 | " \n", 811 | " \n", 812 | " \n", 813 | " \n", 814 | " \n", 815 | " \n", 816 | " \n", 817 | " \n", 818 | " \n", 819 | " \n", 820 | " \n", 821 | " \n", 822 | " \n", 823 | " \n", 824 | " \n", 825 | " \n", 826 | " \n", 827 | " \n", 828 | " \n", 829 | " \n", 830 | " \n", 831 | " \n", 832 | " \n", 833 | " \n", 834 | " \n", 835 | " \n", 836 | " \n", 837 | " \n", 838 | " \n", 839 | " \n", 840 | " \n", 841 | " \n", 842 | " \n", 843 | " \n", 844 | " \n", 845 | " \n", 846 | " \n", 847 | " \n", 848 | " \n", 849 | " \n", 850 | " \n", 851 | " \n", 852 | " \n", 853 | " \n", 854 | " \n", 855 | " \n", 856 | " \n", 857 | " \n", 858 | " \n", 859 | " \n", 860 | " \n", 861 | " \n", 862 | " \n", 863 | " \n", 864 | " \n", 865 | " \n", 866 | " \n", 867 | " \n", 868 | " \n", 869 | " \n", 870 | " \n", 871 | " \n", 872 | " \n", 873 | " \n", 874 | " \n", 875 | " \n", 876 | " \n", 877 | " \n", 878 | " \n", 879 | " \n", 880 | " \n", 881 | " \n", 882 | " \n", 883 | " \n", 884 | " \n", 885 | " \n", 886 | " \n", 887 | " \n", 888 | " \n", 889 | " \n", 890 | "
0123456789...559560561562563564565566567568
mean radius17.99000020.57000019.69000011.42000020.29000012.45000018.25000013.71000013.00000012.460000...11.51000014.05000011.20000015.22000020.92000021.56000020.13000016.60000020.6000007.760000
mean texture10.38000017.77000021.25000020.38000014.34000015.70000019.98000020.83000021.82000024.040000...23.93000027.15000029.37000030.62000025.09000022.39000028.25000028.08000029.33000024.540000
mean perimeter122.800000132.900000130.00000077.580000135.10000082.570000119.60000090.20000087.50000083.970000...74.52000091.38000070.670000103.400000143.000000142.000000131.200000108.300000140.10000047.920000
mean area1001.0000001326.0000001203.000000386.1000001297.000000477.1000001040.000000577.900000519.800000475.900000...403.500000600.400000386.000000716.9000001347.0000001479.0000001261.000000858.1000001265.000000181.000000
mean smoothness0.1184000.0847400.1096000.1425000.1003000.1278000.0946300.1189000.1273000.118600...0.0926100.0992900.0744900.1048000.1099000.1110000.0978000.0845500.1178000.052630
mean compactness0.2776000.0786400.1599000.2839000.1328000.1700000.1090000.1645000.1932000.239600...0.1021000.1126000.0355800.2087000.2236000.1159000.1034000.1023000.2770000.043620
mean concavity0.3001000.0869000.1974000.2414000.1980000.1578000.1127000.0936600.1859000.227300...0.1112000.0446200.0000000.2550000.3174000.2439000.1440000.0925100.3514000.000000
mean concave points0.1471000.0701700.1279000.1052000.1043000.0808900.0740000.0598500.0935300.085430...0.0410500.0430400.0000000.0942900.1474000.1389000.0979100.0530200.1520000.000000
mean symmetry0.2419000.1812000.2069000.2597000.1809000.2087000.1794000.2196000.2350000.203000...0.1388000.1537000.1060000.2128000.2149000.1726000.1752000.1590000.2397000.158700
mean fractal dimension0.0787100.0566700.0599900.0974400.0588300.0761300.0574200.0745100.0738900.082430...0.0657000.0617100.0550200.0715200.0687900.0562300.0553300.0564800.0701600.058840
radius error1.0950000.5435000.7456000.4956000.7572000.3345000.4467000.5835000.3063000.297600...0.2388000.3645000.3141000.2602000.9622001.1760000.7655000.4564000.7260000.385700
texture error0.9053000.7339000.7869001.1560000.7813000.8902000.7732001.3770001.0020001.599000...2.9040001.4920003.8960001.2050001.0260001.2560002.4630001.0750001.5950001.428000
perimeter error8.5890003.3980004.5850003.4450005.4380002.2170003.1800003.8560002.4060002.039000...1.9360002.8880002.0410002.3620008.7580007.6730005.2030003.4250005.7720002.548000
area error153.40000074.08000094.03000027.23000094.44000027.19000053.91000050.96000024.32000023.940000...16.97000029.84000022.81000022.650000118.800000158.70000099.04000048.55000086.22000019.150000
smoothness error0.0063990.0052250.0061500.0091100.0114900.0075100.0043140.0088050.0057310.007149...0.0082000.0072560.0075940.0046250.0063990.0103000.0057690.0059030.0065220.007189
compactness error0.0490400.0130800.0400600.0745800.0246100.0334500.0138200.0302900.0350200.072170...0.0298200.0267800.0088780.0484400.0431000.0289100.0242300.0373100.0615800.004660
concavity error0.0537300.0186000.0383200.0566100.0568800.0367200.0225400.0248800.0355300.077430...0.0573800.0207100.0000000.0735900.0784500.0519800.0395000.0473000.0711700.000000
concave points error0.0158700.0134000.0205800.0186700.0188500.0113700.0103900.0144800.0122600.014320...0.0126700.0162600.0000000.0160800.0262400.0245400.0167800.0155700.0166400.000000
symmetry error0.0300300.0138900.0225000.0596300.0175600.0216500.0136900.0148600.0214300.017890...0.0148800.0208000.0198900.0213700.0205700.0111400.0189800.0131800.0232400.026760
fractal dimension error0.0061930.0035320.0045710.0092080.0051150.0050820.0021790.0054120.0037490.010080...0.0047380.0053040.0017730.0061420.0062130.0042390.0024980.0038920.0061850.002783
worst radius25.38000024.99000023.57000014.91000022.54000015.47000022.88000017.06000015.49000015.090000...12.48000015.30000011.92000017.52000024.29000025.45000023.69000018.98000025.7400009.456000
worst texture17.33000023.41000025.53000026.50000016.67000023.75000027.66000028.14000030.73000040.680000...37.16000033.17000038.30000042.79000029.41000026.40000038.25000034.12000039.42000030.370000
worst perimeter184.600000158.800000152.50000098.870000152.200000103.400000153.200000110.600000106.20000097.650000...82.280000100.20000075.190000128.700000179.100000166.100000155.000000126.700000184.60000059.160000
worst area2019.0000001956.0000001709.000000567.7000001575.000000741.6000001606.000000897.000000739.300000711.400000...474.200000706.700000439.600000915.0000001819.0000002027.0000001731.0000001124.0000001821.000000268.600000
worst smoothness0.1622000.1238000.1444000.2098000.1374000.1791000.1442000.1654000.1703000.185300...0.1298000.1241000.0926700.1417000.1407000.1410000.1166000.1139000.1650000.089960
worst compactness0.6656000.1866000.4245000.8663000.2050000.5249000.2576000.3682000.5401001.058000...0.2517000.2264000.0549400.7917000.4186000.2113000.1922000.3094000.8681000.064440
worst concavity0.7119000.2416000.4504000.6869000.4000000.5355000.3784000.2678000.5390001.105000...0.3630000.1326000.0000001.1700000.6599000.4107000.3215000.3403000.9387000.000000
worst concave points0.2654000.1860000.2430000.2575000.1625000.1741000.1932000.1556000.2060000.221000...0.0965300.1048000.0000000.2356000.2542000.2216000.1628000.1418000.2650000.000000
worst symmetry0.4601000.2750000.3613000.6638000.2364000.3985000.3063000.3196000.4378000.436600...0.2112000.2250000.1566000.4089000.2929000.2060000.2572000.2218000.4087000.287100
worst fractal dimension0.1189000.0890200.0875800.1730000.0767800.1244000.0836800.1151000.1072000.207500...0.0873200.0832100.0590500.1409000.0987300.0711500.0663700.0782000.1240000.070390
target0.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.000000...1.0000001.0000001.0000000.0000000.0000000.0000000.0000000.0000000.0000001.000000
\n", 891 | "

31 rows × 569 columns

\n", 892 | "" 893 | ], 894 | "text/plain": [ 895 | " 0 1 2 3 \\\n", 896 | "mean radius 17.990000 20.570000 19.690000 11.420000 \n", 897 | "mean texture 10.380000 17.770000 21.250000 20.380000 \n", 898 | "mean perimeter 122.800000 132.900000 130.000000 77.580000 \n", 899 | "mean area 1001.000000 1326.000000 1203.000000 386.100000 \n", 900 | "mean smoothness 0.118400 0.084740 0.109600 0.142500 \n", 901 | "mean compactness 0.277600 0.078640 0.159900 0.283900 \n", 902 | "mean concavity 0.300100 0.086900 0.197400 0.241400 \n", 903 | "mean concave points 0.147100 0.070170 0.127900 0.105200 \n", 904 | "mean symmetry 0.241900 0.181200 0.206900 0.259700 \n", 905 | "mean fractal dimension 0.078710 0.056670 0.059990 0.097440 \n", 906 | "radius error 1.095000 0.543500 0.745600 0.495600 \n", 907 | "texture error 0.905300 0.733900 0.786900 1.156000 \n", 908 | "perimeter error 8.589000 3.398000 4.585000 3.445000 \n", 909 | "area error 153.400000 74.080000 94.030000 27.230000 \n", 910 | "smoothness error 0.006399 0.005225 0.006150 0.009110 \n", 911 | "compactness error 0.049040 0.013080 0.040060 0.074580 \n", 912 | "concavity error 0.053730 0.018600 0.038320 0.056610 \n", 913 | "concave points error 0.015870 0.013400 0.020580 0.018670 \n", 914 | "symmetry error 0.030030 0.013890 0.022500 0.059630 \n", 915 | "fractal dimension error 0.006193 0.003532 0.004571 0.009208 \n", 916 | "worst radius 25.380000 24.990000 23.570000 14.910000 \n", 917 | "worst texture 17.330000 23.410000 25.530000 26.500000 \n", 918 | "worst perimeter 184.600000 158.800000 152.500000 98.870000 \n", 919 | "worst area 2019.000000 1956.000000 1709.000000 567.700000 \n", 920 | "worst smoothness 0.162200 0.123800 0.144400 0.209800 \n", 921 | "worst compactness 0.665600 0.186600 0.424500 0.866300 \n", 922 | "worst concavity 0.711900 0.241600 0.450400 0.686900 \n", 923 | "worst concave points 0.265400 0.186000 0.243000 0.257500 \n", 924 | "worst symmetry 0.460100 0.275000 0.361300 0.663800 \n", 925 | "worst fractal dimension 0.118900 0.089020 0.087580 0.173000 \n", 926 | "target 0.000000 0.000000 0.000000 0.000000 \n", 927 | "\n", 928 | " 4 5 6 7 \\\n", 929 | "mean radius 20.290000 12.450000 18.250000 13.710000 \n", 930 | "mean texture 14.340000 15.700000 19.980000 20.830000 \n", 931 | "mean perimeter 135.100000 82.570000 119.600000 90.200000 \n", 932 | "mean area 1297.000000 477.100000 1040.000000 577.900000 \n", 933 | "mean smoothness 0.100300 0.127800 0.094630 0.118900 \n", 934 | "mean compactness 0.132800 0.170000 0.109000 0.164500 \n", 935 | "mean concavity 0.198000 0.157800 0.112700 0.093660 \n", 936 | "mean concave points 0.104300 0.080890 0.074000 0.059850 \n", 937 | "mean symmetry 0.180900 0.208700 0.179400 0.219600 \n", 938 | "mean fractal dimension 0.058830 0.076130 0.057420 0.074510 \n", 939 | "radius error 0.757200 0.334500 0.446700 0.583500 \n", 940 | "texture error 0.781300 0.890200 0.773200 1.377000 \n", 941 | "perimeter error 5.438000 2.217000 3.180000 3.856000 \n", 942 | "area error 94.440000 27.190000 53.910000 50.960000 \n", 943 | "smoothness error 0.011490 0.007510 0.004314 0.008805 \n", 944 | "compactness error 0.024610 0.033450 0.013820 0.030290 \n", 945 | "concavity error 0.056880 0.036720 0.022540 0.024880 \n", 946 | "concave points error 0.018850 0.011370 0.010390 0.014480 \n", 947 | "symmetry error 0.017560 0.021650 0.013690 0.014860 \n", 948 | "fractal dimension error 0.005115 0.005082 0.002179 0.005412 \n", 949 | "worst radius 22.540000 15.470000 22.880000 17.060000 \n", 950 | "worst texture 16.670000 23.750000 27.660000 28.140000 \n", 951 | "worst perimeter 152.200000 103.400000 153.200000 110.600000 \n", 952 | "worst area 1575.000000 741.600000 1606.000000 897.000000 \n", 953 | "worst smoothness 0.137400 0.179100 0.144200 0.165400 \n", 954 | "worst compactness 0.205000 0.524900 0.257600 0.368200 \n", 955 | "worst concavity 0.400000 0.535500 0.378400 0.267800 \n", 956 | "worst concave points 0.162500 0.174100 0.193200 0.155600 \n", 957 | "worst symmetry 0.236400 0.398500 0.306300 0.319600 \n", 958 | "worst fractal dimension 0.076780 0.124400 0.083680 0.115100 \n", 959 | "target 0.000000 0.000000 0.000000 0.000000 \n", 960 | "\n", 961 | " 8 9 ... 559 \\\n", 962 | "mean radius 13.000000 12.460000 ... 11.510000 \n", 963 | "mean texture 21.820000 24.040000 ... 23.930000 \n", 964 | "mean perimeter 87.500000 83.970000 ... 74.520000 \n", 965 | "mean area 519.800000 475.900000 ... 403.500000 \n", 966 | "mean smoothness 0.127300 0.118600 ... 0.092610 \n", 967 | "mean compactness 0.193200 0.239600 ... 0.102100 \n", 968 | "mean concavity 0.185900 0.227300 ... 0.111200 \n", 969 | "mean concave points 0.093530 0.085430 ... 0.041050 \n", 970 | "mean symmetry 0.235000 0.203000 ... 0.138800 \n", 971 | "mean fractal dimension 0.073890 0.082430 ... 0.065700 \n", 972 | "radius error 0.306300 0.297600 ... 0.238800 \n", 973 | "texture error 1.002000 1.599000 ... 2.904000 \n", 974 | "perimeter error 2.406000 2.039000 ... 1.936000 \n", 975 | "area error 24.320000 23.940000 ... 16.970000 \n", 976 | "smoothness error 0.005731 0.007149 ... 0.008200 \n", 977 | "compactness error 0.035020 0.072170 ... 0.029820 \n", 978 | "concavity error 0.035530 0.077430 ... 0.057380 \n", 979 | "concave points error 0.012260 0.014320 ... 0.012670 \n", 980 | "symmetry error 0.021430 0.017890 ... 0.014880 \n", 981 | "fractal dimension error 0.003749 0.010080 ... 0.004738 \n", 982 | "worst radius 15.490000 15.090000 ... 12.480000 \n", 983 | "worst texture 30.730000 40.680000 ... 37.160000 \n", 984 | "worst perimeter 106.200000 97.650000 ... 82.280000 \n", 985 | "worst area 739.300000 711.400000 ... 474.200000 \n", 986 | "worst smoothness 0.170300 0.185300 ... 0.129800 \n", 987 | "worst compactness 0.540100 1.058000 ... 0.251700 \n", 988 | "worst concavity 0.539000 1.105000 ... 0.363000 \n", 989 | "worst concave points 0.206000 0.221000 ... 0.096530 \n", 990 | "worst symmetry 0.437800 0.436600 ... 0.211200 \n", 991 | "worst fractal dimension 0.107200 0.207500 ... 0.087320 \n", 992 | "target 0.000000 0.000000 ... 1.000000 \n", 993 | "\n", 994 | " 560 561 562 563 \\\n", 995 | "mean radius 14.050000 11.200000 15.220000 20.920000 \n", 996 | "mean texture 27.150000 29.370000 30.620000 25.090000 \n", 997 | "mean perimeter 91.380000 70.670000 103.400000 143.000000 \n", 998 | "mean area 600.400000 386.000000 716.900000 1347.000000 \n", 999 | "mean smoothness 0.099290 0.074490 0.104800 0.109900 \n", 1000 | "mean compactness 0.112600 0.035580 0.208700 0.223600 \n", 1001 | "mean concavity 0.044620 0.000000 0.255000 0.317400 \n", 1002 | "mean concave points 0.043040 0.000000 0.094290 0.147400 \n", 1003 | "mean symmetry 0.153700 0.106000 0.212800 0.214900 \n", 1004 | "mean fractal dimension 0.061710 0.055020 0.071520 0.068790 \n", 1005 | "radius error 0.364500 0.314100 0.260200 0.962200 \n", 1006 | "texture error 1.492000 3.896000 1.205000 1.026000 \n", 1007 | "perimeter error 2.888000 2.041000 2.362000 8.758000 \n", 1008 | "area error 29.840000 22.810000 22.650000 118.800000 \n", 1009 | "smoothness error 0.007256 0.007594 0.004625 0.006399 \n", 1010 | "compactness error 0.026780 0.008878 0.048440 0.043100 \n", 1011 | "concavity error 0.020710 0.000000 0.073590 0.078450 \n", 1012 | "concave points error 0.016260 0.000000 0.016080 0.026240 \n", 1013 | "symmetry error 0.020800 0.019890 0.021370 0.020570 \n", 1014 | "fractal dimension error 0.005304 0.001773 0.006142 0.006213 \n", 1015 | "worst radius 15.300000 11.920000 17.520000 24.290000 \n", 1016 | "worst texture 33.170000 38.300000 42.790000 29.410000 \n", 1017 | "worst perimeter 100.200000 75.190000 128.700000 179.100000 \n", 1018 | "worst area 706.700000 439.600000 915.000000 1819.000000 \n", 1019 | "worst smoothness 0.124100 0.092670 0.141700 0.140700 \n", 1020 | "worst compactness 0.226400 0.054940 0.791700 0.418600 \n", 1021 | "worst concavity 0.132600 0.000000 1.170000 0.659900 \n", 1022 | "worst concave points 0.104800 0.000000 0.235600 0.254200 \n", 1023 | "worst symmetry 0.225000 0.156600 0.408900 0.292900 \n", 1024 | "worst fractal dimension 0.083210 0.059050 0.140900 0.098730 \n", 1025 | "target 1.000000 1.000000 0.000000 0.000000 \n", 1026 | "\n", 1027 | " 564 565 566 567 \\\n", 1028 | "mean radius 21.560000 20.130000 16.600000 20.600000 \n", 1029 | "mean texture 22.390000 28.250000 28.080000 29.330000 \n", 1030 | "mean perimeter 142.000000 131.200000 108.300000 140.100000 \n", 1031 | "mean area 1479.000000 1261.000000 858.100000 1265.000000 \n", 1032 | "mean smoothness 0.111000 0.097800 0.084550 0.117800 \n", 1033 | "mean compactness 0.115900 0.103400 0.102300 0.277000 \n", 1034 | "mean concavity 0.243900 0.144000 0.092510 0.351400 \n", 1035 | "mean concave points 0.138900 0.097910 0.053020 0.152000 \n", 1036 | "mean symmetry 0.172600 0.175200 0.159000 0.239700 \n", 1037 | "mean fractal dimension 0.056230 0.055330 0.056480 0.070160 \n", 1038 | "radius error 1.176000 0.765500 0.456400 0.726000 \n", 1039 | "texture error 1.256000 2.463000 1.075000 1.595000 \n", 1040 | "perimeter error 7.673000 5.203000 3.425000 5.772000 \n", 1041 | "area error 158.700000 99.040000 48.550000 86.220000 \n", 1042 | "smoothness error 0.010300 0.005769 0.005903 0.006522 \n", 1043 | "compactness error 0.028910 0.024230 0.037310 0.061580 \n", 1044 | "concavity error 0.051980 0.039500 0.047300 0.071170 \n", 1045 | "concave points error 0.024540 0.016780 0.015570 0.016640 \n", 1046 | "symmetry error 0.011140 0.018980 0.013180 0.023240 \n", 1047 | "fractal dimension error 0.004239 0.002498 0.003892 0.006185 \n", 1048 | "worst radius 25.450000 23.690000 18.980000 25.740000 \n", 1049 | "worst texture 26.400000 38.250000 34.120000 39.420000 \n", 1050 | "worst perimeter 166.100000 155.000000 126.700000 184.600000 \n", 1051 | "worst area 2027.000000 1731.000000 1124.000000 1821.000000 \n", 1052 | "worst smoothness 0.141000 0.116600 0.113900 0.165000 \n", 1053 | "worst compactness 0.211300 0.192200 0.309400 0.868100 \n", 1054 | "worst concavity 0.410700 0.321500 0.340300 0.938700 \n", 1055 | "worst concave points 0.221600 0.162800 0.141800 0.265000 \n", 1056 | "worst symmetry 0.206000 0.257200 0.221800 0.408700 \n", 1057 | "worst fractal dimension 0.071150 0.066370 0.078200 0.124000 \n", 1058 | "target 0.000000 0.000000 0.000000 0.000000 \n", 1059 | "\n", 1060 | " 568 \n", 1061 | "mean radius 7.760000 \n", 1062 | "mean texture 24.540000 \n", 1063 | "mean perimeter 47.920000 \n", 1064 | "mean area 181.000000 \n", 1065 | "mean smoothness 0.052630 \n", 1066 | "mean compactness 0.043620 \n", 1067 | "mean concavity 0.000000 \n", 1068 | "mean concave points 0.000000 \n", 1069 | "mean symmetry 0.158700 \n", 1070 | "mean fractal dimension 0.058840 \n", 1071 | "radius error 0.385700 \n", 1072 | "texture error 1.428000 \n", 1073 | "perimeter error 2.548000 \n", 1074 | "area error 19.150000 \n", 1075 | "smoothness error 0.007189 \n", 1076 | "compactness error 0.004660 \n", 1077 | "concavity error 0.000000 \n", 1078 | "concave points error 0.000000 \n", 1079 | "symmetry error 0.026760 \n", 1080 | "fractal dimension error 0.002783 \n", 1081 | "worst radius 9.456000 \n", 1082 | "worst texture 30.370000 \n", 1083 | "worst perimeter 59.160000 \n", 1084 | "worst area 268.600000 \n", 1085 | "worst smoothness 0.089960 \n", 1086 | "worst compactness 0.064440 \n", 1087 | "worst concavity 0.000000 \n", 1088 | "worst concave points 0.000000 \n", 1089 | "worst symmetry 0.287100 \n", 1090 | "worst fractal dimension 0.070390 \n", 1091 | "target 1.000000 \n", 1092 | "\n", 1093 | "[31 rows x 569 columns]" 1094 | ] 1095 | }, 1096 | "execution_count": 6, 1097 | "metadata": {}, 1098 | "output_type": "execute_result" 1099 | } 1100 | ], 1101 | "source": [ 1102 | "cancer_df.transpose()" 1103 | ] 1104 | }, 1105 | { 1106 | "cell_type": "code", 1107 | "execution_count": 7, 1108 | "metadata": {}, 1109 | "outputs": [ 1110 | { 1111 | "data": { 1112 | "text/plain": [ 1113 | "(569, 31)" 1114 | ] 1115 | }, 1116 | "execution_count": 7, 1117 | "metadata": {}, 1118 | "output_type": "execute_result" 1119 | } 1120 | ], 1121 | "source": [ 1122 | "cancer_df.shape" 1123 | ] 1124 | }, 1125 | { 1126 | "cell_type": "markdown", 1127 | "metadata": {}, 1128 | "source": [ 1129 | "There are 569 rows and 31 columns. " 1130 | ] 1131 | }, 1132 | { 1133 | "cell_type": "markdown", 1134 | "metadata": {}, 1135 | "source": [ 1136 | "#### Check for null" 1137 | ] 1138 | }, 1139 | { 1140 | "cell_type": "code", 1141 | "execution_count": 8, 1142 | "metadata": {}, 1143 | "outputs": [ 1144 | { 1145 | "data": { 1146 | "text/plain": [ 1147 | "Index([], dtype='object')" 1148 | ] 1149 | }, 1150 | "execution_count": 8, 1151 | "metadata": {}, 1152 | "output_type": "execute_result" 1153 | } 1154 | ], 1155 | "source": [ 1156 | "# check for missing values\n", 1157 | "cancer_df.columns[cancer_df.isnull().any()]" 1158 | ] 1159 | }, 1160 | { 1161 | "cell_type": "markdown", 1162 | "metadata": {}, 1163 | "source": [ 1164 | "No missing values" 1165 | ] 1166 | }, 1167 | { 1168 | "cell_type": "markdown", 1169 | "metadata": {}, 1170 | "source": [ 1171 | "# Random forest first try" 1172 | ] 1173 | }, 1174 | { 1175 | "cell_type": "markdown", 1176 | "metadata": {}, 1177 | "source": [ 1178 | "#### Train-Test Split" 1179 | ] 1180 | }, 1181 | { 1182 | "cell_type": "code", 1183 | "execution_count": 9, 1184 | "metadata": { 1185 | "collapsed": true 1186 | }, 1187 | "outputs": [], 1188 | "source": [ 1189 | "#split data into train and test set\n", 1190 | "from sklearn.model_selection import train_test_split\n", 1191 | "x_train, x_test,y_train, y_test = train_test_split(cancer_df.iloc[:,cancer_df.columns != 'target'],\n", 1192 | " cancer_df['target'],\n", 1193 | " test_size=0.25, \n", 1194 | " random_state=100)" 1195 | ] 1196 | }, 1197 | { 1198 | "cell_type": "code", 1199 | "execution_count": 10, 1200 | "metadata": {}, 1201 | "outputs": [ 1202 | { 1203 | "data": { 1204 | "text/plain": [ 1205 | "((426, 30), (426,))" 1206 | ] 1207 | }, 1208 | "execution_count": 10, 1209 | "metadata": {}, 1210 | "output_type": "execute_result" 1211 | } 1212 | ], 1213 | "source": [ 1214 | "x_train.shape, y_train.shape" 1215 | ] 1216 | }, 1217 | { 1218 | "cell_type": "code", 1219 | "execution_count": 11, 1220 | "metadata": {}, 1221 | "outputs": [ 1222 | { 1223 | "data": { 1224 | "text/plain": [ 1225 | "((143, 30), (143,))" 1226 | ] 1227 | }, 1228 | "execution_count": 11, 1229 | "metadata": {}, 1230 | "output_type": "execute_result" 1231 | } 1232 | ], 1233 | "source": [ 1234 | "x_test.shape, y_test.shape" 1235 | ] 1236 | }, 1237 | { 1238 | "cell_type": "markdown", 1239 | "metadata": {}, 1240 | "source": [ 1241 | "Find optimal parameters " 1242 | ] 1243 | }, 1244 | { 1245 | "cell_type": "code", 1246 | "execution_count": 12, 1247 | "metadata": { 1248 | "collapsed": true 1249 | }, 1250 | "outputs": [], 1251 | "source": [ 1252 | "baseRF = RandomForestClassifier(n_estimators = 200, \n", 1253 | " random_state = 0,\n", 1254 | " n_jobs = -1,\n", 1255 | " oob_score = True)" 1256 | ] 1257 | }, 1258 | { 1259 | "cell_type": "code", 1260 | "execution_count": 13, 1261 | "metadata": { 1262 | "collapsed": true 1263 | }, 1264 | "outputs": [], 1265 | "source": [ 1266 | "param_grid = {\n", 1267 | " 'min_samples_leaf' :[1,3,5], \n", 1268 | " 'max_features' : ['auto',10,15,20,25,30],\n", 1269 | " 'criterion' : ['gini','entropy']\n", 1270 | "}" 1271 | ] 1272 | }, 1273 | { 1274 | "cell_type": "code", 1275 | "execution_count": 14, 1276 | "metadata": {}, 1277 | "outputs": [ 1278 | { 1279 | "data": { 1280 | "text/plain": [ 1281 | "GridSearchCV(cv=3, error_score='raise',\n", 1282 | " estimator=RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',\n", 1283 | " max_depth=None, max_features='auto', max_leaf_nodes=None,\n", 1284 | " min_impurity_decrease=0.0, min_impurity_split=None,\n", 1285 | " min_samples_leaf=1, min_samples_split=2,\n", 1286 | " min_weight_fraction_leaf=0.0, n_estimators=200, n_jobs=-1,\n", 1287 | " oob_score=True, random_state=0, verbose=0, warm_start=False),\n", 1288 | " fit_params=None, iid=True, n_jobs=1,\n", 1289 | " param_grid={'min_samples_leaf': [1, 3, 5], 'max_features': ['auto', 10, 15, 20, 25, 30], 'criterion': ['gini', 'entropy']},\n", 1290 | " pre_dispatch='2*n_jobs', refit=True, return_train_score=True,\n", 1291 | " scoring='roc_auc', verbose=0)" 1292 | ] 1293 | }, 1294 | "execution_count": 14, 1295 | "metadata": {}, 1296 | "output_type": "execute_result" 1297 | } 1298 | ], 1299 | "source": [ 1300 | "from sklearn.model_selection import GridSearchCV\n", 1301 | "cvRF = GridSearchCV(estimator=baseRF, param_grid=param_grid, cv=3, scoring='roc_auc')\n", 1302 | "cvRF.fit(x_train,y_train)" 1303 | ] 1304 | }, 1305 | { 1306 | "cell_type": "code", 1307 | "execution_count": 15, 1308 | "metadata": {}, 1309 | "outputs": [ 1310 | { 1311 | "data": { 1312 | "text/plain": [ 1313 | "{'criterion': 'entropy', 'max_features': 'auto', 'min_samples_leaf': 5}" 1314 | ] 1315 | }, 1316 | "execution_count": 15, 1317 | "metadata": {}, 1318 | "output_type": "execute_result" 1319 | } 1320 | ], 1321 | "source": [ 1322 | "cvRF.best_params_" 1323 | ] 1324 | }, 1325 | { 1326 | "cell_type": "code", 1327 | "execution_count": 16, 1328 | "metadata": {}, 1329 | "outputs": [ 1330 | { 1331 | "data": { 1332 | "text/plain": [ 1333 | "0.99145299145299159" 1334 | ] 1335 | }, 1336 | "execution_count": 16, 1337 | "metadata": {}, 1338 | "output_type": "execute_result" 1339 | } 1340 | ], 1341 | "source": [ 1342 | "cvRF.best_score_" 1343 | ] 1344 | }, 1345 | { 1346 | "cell_type": "markdown", 1347 | "metadata": {}, 1348 | "source": [ 1349 | "Our best parameters are {'criterion': 'entropy', 'max_features': 'auto', 'min_samples_leaf': 5}.\n", 1350 | "Our avgerage roc score of all folds is 0.99. " 1351 | ] 1352 | }, 1353 | { 1354 | "cell_type": "markdown", 1355 | "metadata": {}, 1356 | "source": [ 1357 | "#### Train the model with the best parameters " 1358 | ] 1359 | }, 1360 | { 1361 | "cell_type": "code", 1362 | "execution_count": 17, 1363 | "metadata": {}, 1364 | "outputs": [ 1365 | { 1366 | "data": { 1367 | "text/plain": [ 1368 | "RandomForestClassifier(bootstrap=True, class_weight=None, criterion='entropy',\n", 1369 | " max_depth=None, max_features='auto', max_leaf_nodes=None,\n", 1370 | " min_impurity_decrease=0.0, min_impurity_split=None,\n", 1371 | " min_samples_leaf=5, min_samples_split=2,\n", 1372 | " min_weight_fraction_leaf=0.0, n_estimators=200, n_jobs=-1,\n", 1373 | " oob_score=True, random_state=0, verbose=0, warm_start=False)" 1374 | ] 1375 | }, 1376 | "execution_count": 17, 1377 | "metadata": {}, 1378 | "output_type": "execute_result" 1379 | } 1380 | ], 1381 | "source": [ 1382 | "model = RandomForestClassifier(n_estimators = 200, \n", 1383 | " random_state = 0,\n", 1384 | " n_jobs = -1,\n", 1385 | " oob_score = True,\n", 1386 | " criterion = 'entropy',\n", 1387 | " min_samples_leaf = 5)\n", 1388 | "model.fit(x_train,y_train)" 1389 | ] 1390 | }, 1391 | { 1392 | "cell_type": "code", 1393 | "execution_count": 18, 1394 | "metadata": {}, 1395 | "outputs": [ 1396 | { 1397 | "data": { 1398 | "text/plain": [ 1399 | "0.95539906103286387" 1400 | ] 1401 | }, 1402 | "execution_count": 18, 1403 | "metadata": {}, 1404 | "output_type": "execute_result" 1405 | } 1406 | ], 1407 | "source": [ 1408 | "model.oob_score_" 1409 | ] 1410 | }, 1411 | { 1412 | "cell_type": "code", 1413 | "execution_count": 19, 1414 | "metadata": { 1415 | "collapsed": true 1416 | }, 1417 | "outputs": [], 1418 | "source": [ 1419 | "pred_prob = model.predict_proba(x_test)\n", 1420 | "prob_lupus = [p[1] for p in pred_prob]\n", 1421 | "auc = roc_auc_score(y_test, prob_lupus)" 1422 | ] 1423 | }, 1424 | { 1425 | "cell_type": "code", 1426 | "execution_count": 20, 1427 | "metadata": {}, 1428 | "outputs": [ 1429 | { 1430 | "name": "stdout", 1431 | "output_type": "stream", 1432 | "text": [ 1433 | "0.993637110016\n" 1434 | ] 1435 | } 1436 | ], 1437 | "source": [ 1438 | "print(auc)" 1439 | ] 1440 | }, 1441 | { 1442 | "cell_type": "markdown", 1443 | "metadata": {}, 1444 | "source": [ 1445 | "Our auc score is very good for this model." 1446 | ] 1447 | }, 1448 | { 1449 | "cell_type": "markdown", 1450 | "metadata": {}, 1451 | "source": [ 1452 | "#### Tree interpreter" 1453 | ] 1454 | }, 1455 | { 1456 | "cell_type": "code", 1457 | "execution_count": 21, 1458 | "metadata": { 1459 | "collapsed": true 1460 | }, 1461 | "outputs": [], 1462 | "source": [ 1463 | "from treeinterpreter import treeinterpreter as ti" 1464 | ] 1465 | }, 1466 | { 1467 | "cell_type": "code", 1468 | "execution_count": 22, 1469 | "metadata": {}, 1470 | "outputs": [ 1471 | { 1472 | "data": { 1473 | "text/plain": [ 1474 | "array([[ 14.34 , 13.47 , 92.51 , 641.2 , 0.09906, 0.07624, 0.05724, 0.04603,\n", 1475 | " 0.2075 , 0.05448, 0.522 , 0.8121 , 3.763 , 48.29 , 0.00709, 0.01428,\n", 1476 | " 0.0236 , 0.01286, 0.02266, 0.00146, 16.77 , 16.9 , 110.4 , 873.2 ,\n", 1477 | " 0.1297 , 0.1525 , 0.1632 , 0.1087 , 0.3062 , 0.06072]])" 1478 | ] 1479 | }, 1480 | "execution_count": 22, 1481 | "metadata": {}, 1482 | "output_type": "execute_result" 1483 | } 1484 | ], 1485 | "source": [ 1486 | "row = x_test.values[None,1]; row" 1487 | ] 1488 | }, 1489 | { 1490 | "cell_type": "code", 1491 | "execution_count": 23, 1492 | "metadata": { 1493 | "collapsed": true 1494 | }, 1495 | "outputs": [], 1496 | "source": [ 1497 | "prediction, bias, contributions = ti.predict(model, row)" 1498 | ] 1499 | }, 1500 | { 1501 | "cell_type": "code", 1502 | "execution_count": 24, 1503 | "metadata": {}, 1504 | "outputs": [ 1505 | { 1506 | "data": { 1507 | "text/plain": [ 1508 | "(array([ 0.31123, 0.68877]), array([ 0.36863, 0.63137]))" 1509 | ] 1510 | }, 1511 | "execution_count": 24, 1512 | "metadata": {}, 1513 | "output_type": "execute_result" 1514 | } 1515 | ], 1516 | "source": [ 1517 | "prediction[0], bias[0]" 1518 | ] 1519 | }, 1520 | { 1521 | "cell_type": "code", 1522 | "execution_count": 25, 1523 | "metadata": { 1524 | "collapsed": true 1525 | }, 1526 | "outputs": [], 1527 | "source": [ 1528 | "contributions = [contributions[0][i][0] for i in range(len(contributions[0]))]" 1529 | ] 1530 | }, 1531 | { 1532 | "cell_type": "code", 1533 | "execution_count": 26, 1534 | "metadata": { 1535 | "collapsed": true 1536 | }, 1537 | "outputs": [], 1538 | "source": [ 1539 | "colnames = cancer_df.columns[0:-1].values" 1540 | ] 1541 | }, 1542 | { 1543 | "cell_type": "code", 1544 | "execution_count": 27, 1545 | "metadata": {}, 1546 | "outputs": [ 1547 | { 1548 | "data": { 1549 | "image/png": "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\nH0cT1Db8J0wAAAAASUVORK5CYII=\n", 1550 | "text/plain": [ 1551 | "" 1552 | ] 1553 | }, 1554 | "metadata": {}, 1555 | "output_type": "display_data" 1556 | } 1557 | ], 1558 | "source": [ 1559 | "my_plot=waterfall_chart.plot(colnames,contributions, rotation_value=90, threshold=0.3,formatting='{:,.3f}')" 1560 | ] 1561 | }, 1562 | { 1563 | "cell_type": "code", 1564 | "execution_count": null, 1565 | "metadata": { 1566 | "collapsed": true 1567 | }, 1568 | "outputs": [], 1569 | "source": [] 1570 | } 1571 | ], 1572 | "metadata": { 1573 | "kernelspec": { 1574 | "display_name": "Python 3", 1575 | "language": "python", 1576 | "name": "python3" 1577 | }, 1578 | "language_info": { 1579 | "codemirror_mode": { 1580 | "name": "ipython", 1581 | "version": 3 1582 | }, 1583 | "file_extension": ".py", 1584 | "mimetype": "text/x-python", 1585 | "name": "python", 1586 | "nbconvert_exporter": "python", 1587 | "pygments_lexer": "ipython3", 1588 | "version": "3.6.2" 1589 | } 1590 | }, 1591 | "nbformat": 4, 1592 | "nbformat_minor": 2 1593 | } 1594 | -------------------------------------------------------------------------------- /dist/waterfallcharts-3.8.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chrispaulca/waterfall/76aca3543b39a79a82bd82137928d2b023078701/dist/waterfallcharts-3.8.tar.gz -------------------------------------------------------------------------------- /images/RF1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chrispaulca/waterfall/76aca3543b39a79a82bd82137928d2b023078701/images/RF1.png -------------------------------------------------------------------------------- /images/RF2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chrispaulca/waterfall/76aca3543b39a79a82bd82137928d2b023078701/images/RF2.png -------------------------------------------------------------------------------- /images/image1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chrispaulca/waterfall/76aca3543b39a79a82bd82137928d2b023078701/images/image1.png -------------------------------------------------------------------------------- /images/image2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chrispaulca/waterfall/76aca3543b39a79a82bd82137928d2b023078701/images/image2.png -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [metadata] 2 | description-file = README.md 3 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup 2 | 3 | setup( 4 | name = 'waterfallcharts', 5 | py_modules=['waterfall_chart'], 6 | version = '3.8', 7 | description = 'Quickly generates standard waterfall charts, takes two ordered lists as inputs.', 8 | author = 'Christopher Paul Csiszar', 9 | author_email = 'christopher.csiszar@gmail.com', 10 | url = 'https://github.com/chrispaulca/waterfall', 11 | download_url = 'https://github.com/chrispaulca/waterfall/archive/v3.8.tar.gz', 12 | keywords = ['waterfall', 'chart', 'charts', 'accounting', 'automate', 'random forest', 'decision tree'], 13 | classifiers = [], 14 | ) 15 | -------------------------------------------------------------------------------- /waterfall_chart.py: -------------------------------------------------------------------------------- 1 | ''' 2 | A function that attempts to generate a standard waterfall chart in generic Python. Requires two sequences, 3 | one of labels and one of values, ordered accordingly. 4 | ''' 5 | 6 | 7 | from matplotlib.ticker import FuncFormatter 8 | import numpy as np 9 | import pandas as pd 10 | import matplotlib.pyplot as plt 11 | import matplotlib.lines as lines 12 | 13 | #------------------------------------------ 14 | 15 | def plot(index, data, Title="", x_lab="", y_lab="", 16 | formatting = "{:,.1f}", green_color='#29EA38', red_color='#FB3C62', blue_color='#24CAFF', 17 | sorted_value = False, threshold=None, other_label='other', net_label='net', 18 | rotation_value = 30, blank_color=(0,0,0,0), figsize = (10,10)): 19 | ''' 20 | Given two sequences ordered appropriately, generate a standard waterfall chart. 21 | Optionally modify the title, axis labels, number formatting, bar colors, 22 | increment sorting, and thresholding. Thresholding groups lower magnitude changes 23 | into a combined group to display as a single entity on the chart. 24 | ''' 25 | 26 | #convert data and index to np.array 27 | index=np.array(index) 28 | data=np.array(data) 29 | 30 | # wip 31 | #sorted by absolute value 32 | if sorted_value: 33 | abs_data = abs(data) 34 | data_order = np.argsort(abs_data)[::-1] 35 | data = data[data_order] 36 | index = index[data_order] 37 | 38 | #group contributors less than the threshold into 'other' 39 | if threshold: 40 | 41 | abs_data = abs(data) 42 | threshold_v = abs_data.max()*threshold 43 | 44 | if threshold_v > abs_data.min(): 45 | index = np.append(index[abs_data>=threshold_v],other_label) 46 | data = np.append(data[abs_data>=threshold_v],sum(data[abs_data 0 64 | 65 | #Get the net total number for the final element in the waterfall 66 | total = trans.sum().amount 67 | trans.loc[net_label]= total 68 | blank.loc[net_label] = total 69 | 70 | #The steps graphically show the levels as well as used for label placement 71 | step = blank.reset_index(drop=True).repeat(3).shift(-1) 72 | step[1::3] = np.nan 73 | 74 | #When plotting the last element, we want to show the full bar, 75 | #Set the blank to 0 76 | blank.loc[net_label] = 0 77 | 78 | #define bar colors for net bar 79 | trans.loc[trans['positive'] > 1, 'positive'] = 99 80 | trans.loc[trans['positive'] < 0, 'positive'] = 99 81 | trans.loc[(trans['positive'] > 0) & (trans['positive'] < 1), 'positive'] = 99 82 | 83 | trans['color'] = trans['positive'] 84 | 85 | trans.loc[trans['positive'] == 1, 'color'] = green_color 86 | trans.loc[trans['positive'] == 0, 'color'] = red_color 87 | trans.loc[trans['positive'] == 99, 'color'] = blue_color 88 | 89 | my_colors = list(trans.color) 90 | 91 | #Plot and label 92 | my_plot = plt.bar(range(0,len(trans.index)), blank, width=0.5, color=blank_color) 93 | plt.bar(range(0,len(trans.index)), trans.amount, width=0.6, 94 | bottom=blank, color=my_colors) 95 | 96 | 97 | # connecting lines - figure out later 98 | #my_plot = lines.Line2D(step.index, step.values, color = "gray") 99 | #my_plot = lines.Line2D((3,3), (4,4)) 100 | 101 | #axis labels 102 | plt.xlabel("\n" + x_lab) 103 | plt.ylabel(y_lab + "\n") 104 | 105 | #Get the y-axis position for the labels 106 | y_height = trans.amount.cumsum().shift(1).fillna(0) 107 | 108 | temp = list(trans.amount) 109 | 110 | # create dynamic chart range 111 | for i in range(len(temp)): 112 | if (i > 0) & (i < (len(temp) - 1)): 113 | temp[i] = temp[i] + temp[i-1] 114 | 115 | trans['temp'] = temp 116 | 117 | plot_max = trans['temp'].max() 118 | plot_min = trans['temp'].min() 119 | 120 | #Make sure the plot doesn't accidentally focus only on the changes in the data 121 | if all(i >= 0 for i in temp): 122 | plot_min = 0 123 | if all(i < 0 for i in temp): 124 | plot_max = 0 125 | 126 | if abs(plot_max) >= abs(plot_min): 127 | maxmax = abs(plot_max) 128 | else: 129 | maxmax = abs(plot_min) 130 | 131 | pos_offset = maxmax / 40 132 | 133 | plot_offset = maxmax / 15 ## needs to me cumulative sum dynamic 134 | 135 | #Start label loop 136 | loop = 0 137 | for index, row in trans.iterrows(): 138 | # For the last item in the list, we don't want to double count 139 | if row['amount'] == total: 140 | y = y_height[loop] 141 | else: 142 | y = y_height[loop] + row['amount'] 143 | # Determine if we want a neg or pos offset 144 | if row['amount'] > 0: 145 | y += (pos_offset*2) 146 | plt.annotate(formatting.format(row['amount']),(loop,y),ha="center", color = 'g', fontsize=9) 147 | else: 148 | y -= (pos_offset*4) 149 | plt.annotate(formatting.format(row['amount']),(loop,y),ha="center", color = 'r', fontsize=9) 150 | loop+=1 151 | 152 | #Scale up the y axis so there is room for the labels 153 | plt.ylim(plot_min-round(3.6*plot_offset, 7),plot_max+round(3.6*plot_offset, 7)) 154 | 155 | #Rotate the labels 156 | plt.xticks(range(0,len(trans)), trans.index, rotation=rotation_value) 157 | 158 | #add zero line and title 159 | plt.axhline(0, color='black', linewidth = 0.6, linestyle="dashed") 160 | plt.title(Title) 161 | plt.tight_layout() 162 | 163 | return fig, ax 164 | -------------------------------------------------------------------------------- /waterfallcharts.egg-info/PKG-INFO: -------------------------------------------------------------------------------- 1 | Metadata-Version: 1.1 2 | Name: waterfallcharts 3 | Version: 3.8 4 | Summary: Quickly generates standard waterfall charts, takes two ordered lists as inputs. 5 | Home-page: https://github.com/chrispaulca/waterfall 6 | Author: Christopher Paul Csiszar 7 | Author-email: christopher.csiszar@gmail.com 8 | License: UNKNOWN 9 | Download-URL: https://github.com/chrispaulca/waterfall/archive/v3.8.tar.gz 10 | Description-Content-Type: UNKNOWN 11 | Description: UNKNOWN 12 | Keywords: waterfall,chart,charts,accounting,automate,random forest,decision tree 13 | Platform: UNKNOWN 14 | -------------------------------------------------------------------------------- /waterfallcharts.egg-info/SOURCES.txt: -------------------------------------------------------------------------------- 1 | README.md 2 | setup.cfg 3 | setup.py 4 | waterfall_chart.py 5 | waterfallcharts.egg-info/PKG-INFO 6 | waterfallcharts.egg-info/SOURCES.txt 7 | waterfallcharts.egg-info/dependency_links.txt 8 | waterfallcharts.egg-info/top_level.txt -------------------------------------------------------------------------------- /waterfallcharts.egg-info/dependency_links.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /waterfallcharts.egg-info/top_level.txt: -------------------------------------------------------------------------------- 1 | waterfall_chart 2 | --------------------------------------------------------------------------------