├── .ipynb_checkpoints ├── code-checkpoint.ipynb └── main-checkpoint.ipynb ├── README.md ├── code.ipynb ├── files ├── 1sherman_h_d_zhu_j_auth_service_productivity_management_impro.pdf ├── data-2018-09-24.csv ├── data-2018-09-24.reduced.csv ├── example.csv └── output.csv ├── index.html └── main.ipynb /.ipynb_checkpoints/code-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 34, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stdout", 10 | "output_type": "stream", 11 | "text": [ 12 | "code.ipynb\n", 13 | "index.html\n", 14 | "COMMIT_EDITMSG\n", 15 | "config\n", 16 | "description\n", 17 | "HEAD\n", 18 | "index\n", 19 | "applypatch-msg.sample\n", 20 | "commit-msg.sample\n", 21 | "fsmonitor-watchman.sample\n", 22 | "post-update.sample\n", 23 | "pre-applypatch.sample\n", 24 | "pre-commit.sample\n", 25 | "pre-push.sample\n", 26 | "pre-rebase.sample\n", 27 | "pre-receive.sample\n", 28 | "prepare-commit-msg.sample\n", 29 | "update.sample\n", 30 | "exclude\n", 31 | "HEAD\n", 32 | "master\n", 33 | "master\n", 34 | "5108efed29355b7dc8d328cde74b1e98755c9a\n", 35 | "d2e71734748a0730bb35c5b59771ef7f38937e\n", 36 | "f88d872b837c92b626f9cde570a42e7f36d38c\n", 37 | "4dfa6c0777414e1da32daa7a159c86cad1ca08\n", 38 | "f318ffa38cc91f1286a42fe06fb9d64706808d\n", 39 | "436dd894d232e6debd0b154dfd8648e3e224ea\n", 40 | "fe557a9d7fe3d267c5110019f3891a6fe652ab\n", 41 | "cda8e721177be429e875da5b6c54d1f634833e\n", 42 | "d97b9467177cdcac011907be76475a8c661163\n", 43 | "17a9483ed9b1f41d7ab90159100a3a713a6d2b\n", 44 | "8dc13db4f492af8daa95597fb199d2d6b411ec\n", 45 | "b6eac46829b50005531cd378f4916c23278fd6\n", 46 | "c1332e34dd9736a5f23a7cff7738cdeb81fb3f\n", 47 | "bf6b84f253938597b2c29d19213e0443f62403\n", 48 | "ecf7572746cbe4314b23d11bf3449fcc7d36f3\n", 49 | "ff1eb5bc7d3d8f398a986aa34a649fe9e15aee\n", 50 | "b752815fda2e17ae4d83f564cc5a035a60ab3b\n", 51 | "993c66eaf205a66c2ab69b5578ae669294c8b9\n", 52 | "9df40e4ae146d34b7773563240d9efdda9e13f\n", 53 | "fa95aa9f0d9fd6db0813e2e8d422f0356291e2\n", 54 | "cc70a1a5b034dad80cbb2e32c07d6f4dabdd5a\n", 55 | "f4c0b71722e5dedd6ee12b60848cb2876446d5\n", 56 | "61658c9707de1d7db437db7b96e7a9b54aa284\n", 57 | "6dd04e8f3b8fa25c0f9a1f4c51e73104c15fa2\n", 58 | "974439b2c59fa27d2a58d1878e765763c74692\n", 59 | "49ec1a8424948ef406e7106265d6691b2f8394\n", 60 | "95824add0b9d0289eec00502e3de6a3786ff93\n", 61 | "45ab90dfbba840067a3752ca0cfc0a64ad8cb7\n", 62 | "aa48a82028af149de515bd94a7e98a5156db9e\n", 63 | "5564097f981c38aa4cab02606443eca258c996\n", 64 | "56c58d2f9e12b0d2bbb4f4227b9f15eacadc63\n", 65 | "b57e79579d123b40a17a49db81bb3b1463510e\n", 66 | "dd83eb9e13b6290890f491d2c4ed8fd854f8ba\n", 67 | "ec4b755231d6c2887302a875e11b842afb92cf\n", 68 | "e31e385e5afde9144636e7036a114d8a039056\n", 69 | "f6d4df333be5fe507af8f097d40411ce41b2ac\n", 70 | "0801f82ccbd9ac8ec6f8b82b95b26ce7d3fde4\n", 71 | "c90d0db24ddab9cf6711fe3346ad23aaff6bfe\n", 72 | "e3cb375ce5a973f4929135aa68368302f9ff78\n", 73 | "e86a18f4311a0edcc5992c4412147f7c93d0fb\n", 74 | "1b85fd305d759c509914bbec165023b0f947b3\n", 75 | "6b2b5abae6b2048c725131cf3971e76bf1f2ba\n", 76 | "3adaf209492ddf30d07be793e9e9b3d06a9a50\n", 77 | "0f940e1dccba882446710ff1824cc253c6b93b\n", 78 | "e2765302456ffa3fef8453c7f57fe291a48030\n", 79 | "0a311989f100a4999b6699e41dd3c5cbfc505b\n", 80 | "2153bff2453cacbea6e3654728c1c90aa89cf6\n", 81 | "ff4eaf27c067b1d582e0e589440aa600bf2eaa\n", 82 | "d4fe3f1dd0cade3006d79acffd476b617288b9\n", 83 | "6bbfa454883ee8a17971d492ec95e1bfbb3cb5\n", 84 | "a139182aa638104db2a3820221bab4e788e259\n", 85 | "46415f2054c3c65a062e39554ee9bc6b9c56d1\n", 86 | "cbbd1fe778b3c87a40354789e5546f7a7a44a1\n", 87 | "8bac4719d3264677d064f508cdfe698efe848a\n", 88 | "98c9eff18cc7b6837c0d0850911b49355b6eef\n", 89 | "389c79af89edc25996ca90c87289466bf4657c\n", 90 | "3e5843b74b0f9ba4e23eb47aa141339e8819cf\n", 91 | "1df928f44307e2249538ad1d6cd4c413516ed4\n", 92 | "3ed08025a1fcdccb667ed864b6c6e6ac1352e4\n", 93 | "225d3d49dd14f6672a0b64e4fcae2b57114cb3\n", 94 | "31903048e7604b14b329991c2ebc71b754de1c\n", 95 | "7f967913c4f2a2014fd5679db49ab1cde7d2db\n", 96 | "52624e1779be00cd3ec756cef58513f9f95a60\n", 97 | "1277492b853ee61a892950732deab942f2f8a3\n", 98 | "a152f9d4235a6513f1ad3eab61edb27025f7a4\n", 99 | "f1a6e265cfb14bae540efc9beddc58031c8cc8\n", 100 | "42b740cb6751b816431d542cd2f306561d72dc\n", 101 | "bd21297cce1f0371e0dbd6e0f3220dbd3afb49\n", 102 | "08b8dfb84d0b2efa99d70bd4a0d498f9e087d6\n", 103 | "459f4828926fc4deb86ee067aabb3ccf8083ad\n", 104 | "0ce6b87132ebb05a1cc3b877ffbcaae774e8ce\n", 105 | "f5d0d04daade7eb79513d09d9e3659e5d2e636\n", 106 | "118417d6a1eb6e476c07edad22b7a714203e1d\n", 107 | "45a32f92de27db64f3c034bcb11d83235ebcd5\n", 108 | "e7cd6d4718403c5a6201391139f925e30fe7b2\n", 109 | "2a30d3c20f68c0078696e252103d0516a6ae9f\n", 110 | "826073cbb690876d4aed75403d186cd11f86ee\n", 111 | "391d105aca196e1bea494fb0655abeecccf5b1\n", 112 | "fd0f80a7ffb113e7a442cc13623010578c526b\n", 113 | "31b7f6a1871c35de16628c57186de1bb2d5fd0\n", 114 | "69f00578b08e8533347ba085fdce18e1d04d7c\n", 115 | "e240bd55641ffccbfdaf3fa14f82dd21a3bd98\n", 116 | "01acc35f660d4f65f1bef8cccdd8b6e3b67f25\n", 117 | "7dd3e960039c7bf2cc3408cf6ad31bb51dfac6\n", 118 | "c7dc1f57ab6a5182737cf1ea92f30e38ea0791\n", 119 | "ad70007360660d3efc58089f5359aca666d657\n", 120 | "c0ac53473cbd7905aa0d5afc946b672e9e5e60\n", 121 | "76c2ded903dc79bbc640e528c94a5dd7c481f7\n", 122 | "baa3a0b4aaa343280a2c01961190c170b779f7\n", 123 | "ef72b9d96c9eee2a20f85a78b269ed2ad8d171\n", 124 | "0ca1999638086a15b5a9dfaea780f048d20ad1\n", 125 | "78a778cacb3b1d1d9771bbc1b2a367625297e9\n", 126 | "8b3ad588e11c6b5063aba7d3e62f276db50f9e\n", 127 | "b80f0071ebc6a6eb0110ad7b1ed5e915569c40\n", 128 | "16d1edeb862236c0f20d30145984f876811803\n", 129 | "631584a2e315bc25b91caab96bac3eda61df76\n", 130 | "6ee278758c501c6dfa8c934f93d8bb316f13bf\n", 131 | "a2b0633fae29f68c433512758947f371afcf14\n", 132 | "adb97397a1046dfe219e4a0bba8ee40feac5d3\n", 133 | "d3aa278f8b5b3abd1a2f5e143782e62e104a4f\n", 134 | "215ec350c113f4e68faa123a03f46f590fb71f\n", 135 | "bf33f6b671625d44f87c95f8bca26535bfae3b\n", 136 | "f4918186963313b23f8fa9f5bbd1eb2a29e358\n", 137 | "8a41b6398bd51cab82f4feb87483702901cdec\n", 138 | "fb8e08468422d77a0bd2d1b0eecc4006dd2d17\n", 139 | "7d351583312c8c974f398ddd920347c7b0e0b1\n", 140 | "2da83ba5215532bdda75e463e982e9527c4533\n", 141 | "16cd2c1aec0cb62ca7a0159cc079352f64c99c\n", 142 | "776fab8dabc75db76af83e1103e0e08d0503bb\n", 143 | "7b5d4af04b009a840ecd16ff3ca78fdf137b24\n", 144 | "256aef8f49b33e2779cce514605fdc2876d0bd\n", 145 | "215267620a23e92f4c8a4bdaee708c08a4da56\n", 146 | "350698b1c2e7f4a223434b9f831530ef686623\n", 147 | "fb41b846baab5909c132bcf56c80f29a1b9275\n", 148 | "cc0fad42eb435792ed92bda49d10566a12e61f\n", 149 | "533dbdf37e79912da604882762acfd7e3f3b06\n", 150 | "7ec55aa0e1ea4d836f10b32b8709e34fe25953\n", 151 | "e75ab3d1c17a7223464357865b0a6d77c96aa9\n", 152 | "b739f20acfd870c3b5772250510c2fe5b9a2ce\n", 153 | "fa1344048a808a713226d0d16a8ec2e8f739c1\n", 154 | "906907af4dcce951306c4c9d3869a625645e96\n", 155 | "2a303f562bc5b6b8303f71bc617b3cb74379a7\n", 156 | "9d988be0f52a70841fc66f022ca98c3fe22ed5\n", 157 | "acb517e395b2c5cbfed48a29fcd6031d0f32b7\n", 158 | "91576e9f97b197f8935ae67c13e854875beb35\n", 159 | "64635398aec430c25920239ec6dd6557eff202\n", 160 | "ad6f86693b7066df3e3bc6cece85eb0f150213\n", 161 | "f27d76095e582e03330f403eabf04081d131e9\n", 162 | "498c952989e794dbba7ccec88d891208e7ce8b\n", 163 | "24bbff34fca7267ca1170b5521e68d33488214\n", 164 | "2b9c21ee9620f78e3ca5307ac8bb8a92456696\n", 165 | "6eec80e959b77b47dc98038fb4926ff76d56b2\n", 166 | "afdadbbb2cb94263efab62514826744a5cc809\n", 167 | "2e9ba71dff5aaeee0d8075bc9ab3b4b2dd629a\n", 168 | "55c9c636a1fa6beff97d46afdd2bfaf4b9f554\n", 169 | "3e3920e52311149e7cdfba4271be2c1c98a14d\n", 170 | "a75e75875cfc03fffe63129cb2710f696173a5\n", 171 | "2584557cf16e72ccd52fc174410e7bb6a06ea0\n", 172 | "3ad5f78fbde662c6bdbd5cf681d8e0cad32dc5\n", 173 | "51f4462cf1deb0f6a7eb7d98539d8ef68be5a7\n", 174 | "5c711695638c111465d42849808d2bc1a425da\n", 175 | "ac7ce433b26978079c2655ec15157542c19494\n", 176 | "40288205f74b655c829fc678b33b30959a326a\n", 177 | "a2582119cbc81247252e07cd7f904360c4772b\n", 178 | "f190376cfd6b0310ea7fc547abeb3f804ce1ea\n", 179 | "b55dd29ccf0ca873fc21f9e3617ec300e56cb5\n", 180 | "573270c75149539fcf04c9bcc413e58374a7a8\n", 181 | "d34ca5e45f3fc8bf19e8f2eae183093a61e8a2\n", 182 | "ef05199ea684c2fd98a7eb991f3fe482b54aa6\n", 183 | "d952c7f58decde8292f55f9ac811cb7b3e651e\n", 184 | "d873da07f944186d2697b30a63afa8622d6f2b\n", 185 | "6f364d3499cba7a58f168ff278ccd568a576c4\n", 186 | "2eb0b48154b27c68e427476cc7336e39710b92\n", 187 | "a23409bc932358b950308e991cb4db371f4351\n", 188 | "85501c06123c51221df3bc9cda3204c7bf33a7\n", 189 | "b21e89cb829783f9993dab2dbcc5cd560b3275\n", 190 | "02b5a224433fd30c85ab60079459b20aa9ed5d\n", 191 | "d385c5bb8672cfd868fb16ec71379cc04dbcd2\n", 192 | "36c73800d8d1ee67b2731e42a578e444bcba95\n", 193 | "6e2a75c7e6a509f4d228706c29cbb62edfcfdd\n", 194 | "c683e248c951811a59f539debc3a0c90a63580\n", 195 | "0d463eec5c32372101dc435e5d253bab903b23\n", 196 | "dcc681cc8d152d171e969d9d7d8e474424ff5d\n", 197 | "b2977e87dea6793957a3f0d0966ba73651f794\n", 198 | "36cd0448c045213c35f79be57a6dc5acc47deb\n", 199 | "800c2487a1c2d44e5252b77718cd4d87ad99a0\n", 200 | "d7303d15f0df0bd6a9d28e2039e7071ceb4a8b\n", 201 | "a6fa44366ec94abce55e460710e859d7df45e2\n", 202 | "cd12a7a3588627c434d683891ab8fcdaaa1f74\n", 203 | "d96abeba6d5e13c8374fe78607e06bc52f6afb\n", 204 | "966c952ea08cbb773865131f9f06a9b97a62ee\n", 205 | "ca30d1eaec6b80c5ee8d3df83b6fb00c81ab27\n", 206 | "31f0502924e1cfdc62159f43b725a613d4e27d\n", 207 | "597d24ca7dd5d46efcea359b178a4a97493f8f\n", 208 | "cc95e6fed3a563f6b12e2883760505d52cae8e\n", 209 | "1fccb903fb46e6e6855f22f90b31425f66f723\n", 210 | "5f052ee344ba3c1fb97655893efaae4dda4d0e\n", 211 | "2b486796dccc5ea2876068367a7c72011a61d0\n", 212 | "544e64b9fd3e9a025826d34b596264e58c1a78\n", 213 | "e4b1ab92c9f1026dd8ce53806d5c8e13ecf787\n", 214 | "8995527d7106738065c43853e7171001d9de97\n", 215 | "26dd87117e5c6c7979ab647f3e44a8d2ce585a\n", 216 | "a1641c1c47b5bb46d2f5a281e63dd2d5ee923f\n", 217 | "1a0d115b54b77637da6eac6342ce3fb5d5dbf0\n", 218 | "b218999a1d30670052633e242b3a445bc639ce\n", 219 | "85a2065895a2f7ab2768b64166239dd1f52c94\n", 220 | "e4398bc399b14110a7da9c97ef942f240eebe8\n", 221 | "ce5190b79c5c986380369c72dae66ad1770eb5\n", 222 | "4d4f444280d1fe8629648a1f0bc0a7f320e9fc\n", 223 | "master\n", 224 | "master\n", 225 | "code-checkpoint.ipynb\n", 226 | "1sherman_h_d_zhu_j_auth_service_productivity_management_impro.pdf\n", 227 | "data-2018-09-24.csv\n", 228 | "example.csv\n", 229 | "output.csv\n" 230 | ] 231 | } 232 | ], 233 | "source": [ 234 | "#Importing libraries\n", 235 | "import pandas as pd\n", 236 | "import numpy as np\n", 237 | "from scipy.optimize import fmin_slsqp\n", 238 | "import os\n", 239 | "import matplotlib.pyplot as plt\n", 240 | "#import seaborn as sns\n", 241 | "from pprint import pprint\n", 242 | "import random\n", 243 | "\n", 244 | "#Listing the existing files in the dir\n", 245 | "for root, dirs, files in os.walk(\".\"): \n", 246 | " for filename in files:\n", 247 | " print(filename)" 248 | ] 249 | }, 250 | { 251 | "cell_type": "code", 252 | "execution_count": 2, 253 | "metadata": {}, 254 | "outputs": [], 255 | "source": [ 256 | "#Loading df\n", 257 | "df = pd.read_csv('./files/data-2018-09-24.csv')\n", 258 | "df = df.drop(df.loc[:,['name', 'pft']].head(0).columns, axis=1)\n", 259 | "inpt_df = df.iloc[:, 1:6]\n", 260 | "inpt_arr = np.array(inpt_df)\n", 261 | "outpt_df = df.iloc[:, 6:]\n", 262 | "outpt_arr = np.array(outpt_df)\n", 263 | "comp = np.array(df.iloc[:, 0])" 264 | ] 265 | }, 266 | { 267 | "cell_type": "code", 268 | "execution_count": 7, 269 | "metadata": {}, 270 | "outputs": [ 271 | { 272 | "data": { 273 | "text/plain": [ 274 | "[]" 275 | ] 276 | }, 277 | "execution_count": 7, 278 | "metadata": {}, 279 | "output_type": "execute_result" 280 | }, 281 | { 282 | "data": { 283 | "image/png": "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\n", 284 | "text/plain": [ 285 | "
" 286 | ] 287 | }, 288 | "metadata": {}, 289 | "output_type": "display_data" 290 | } 291 | ], 292 | "source": [ 293 | "#For the article\n", 294 | "inputs = pd.DataFrame(inpt_df.iloc[:4,4])\n", 295 | "outputs = outpt_df.iloc[:4,0:2]\n", 296 | "l = []\n", 297 | "for col in inputs.columns:\n", 298 | " l.append(outputs.div(inputs[col], axis=0))\n", 299 | "complete = pd.concat(l, axis=1)\n", 300 | "complete.columns = ['y1', 'y2']\n", 301 | "completed = pd.DataFrame(df.iloc[:4, 0]).join(complete)\n", 302 | "\n", 303 | "#Plotting the graph\n", 304 | "p1 = sns.regplot(data = completed, x=\"y1\", y=\"y2\", fit_reg = False, marker=\"o\", color = 'black')\n", 305 | " \n", 306 | "# add annotations one by one with a loop\n", 307 | "for line in range(0,completed.shape[0]):\n", 308 | " p1.text(completed.y1[line]+0.2, completed.y2[line], completed.firm[line], horizontalalignment='left', size='medium', color='black', weight='semibold')\n", 309 | "\n", 310 | "p1.set_title('Efficient frontier')\n", 311 | "\n", 312 | "plt.plot([0, 4.938],[6.778,6.778], \"r--\")\n", 313 | "plt.plot([4.938, 6.058889],[6.778, 6.553333], \"r--\")\n", 314 | "plt.plot([6.058889, 6.058889],[6.553333, 0], \"r--\")\n", 315 | "plt.plot([0,5.8],[0,6.6] , \"b\")" 316 | ] 317 | }, 318 | { 319 | "cell_type": "code", 320 | "execution_count": 8, 321 | "metadata": {}, 322 | "outputs": [ 323 | { 324 | "ename": "NameError", 325 | "evalue": "name 'inpt_arr_2' is not defined", 326 | "output_type": "error", 327 | "traceback": [ 328 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", 329 | "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", 330 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0moutputss\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdf2\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0miloc\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[0mcomp_2\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdf2\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0miloc\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 5\u001b[1;33m \u001b[0ml\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minpt_arr_2\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 6\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mzeros\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minpt_arr_2\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfloat\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 331 | "\u001b[1;31mNameError\u001b[0m: name 'inpt_arr_2' is not defined" 332 | ] 333 | } 334 | ], 335 | "source": [ 336 | "df2 = pd.read_csv('./files/example.csv')\n", 337 | "inputss = pd.DataFrame(df2.iloc[:,1:3])\n", 338 | "outputss = pd.DataFrame(df2.iloc[:,3])\n", 339 | "comp_2 = np.array(df2.iloc[:, 0])\n", 340 | "l = range(inpt_arr_2.shape[1])\n", 341 | "np.zeros((inpt_arr_2.shape[1],1), dtype=np.float) " 342 | ] 343 | }, 344 | { 345 | "cell_type": "code", 346 | "execution_count": 43, 347 | "metadata": {}, 348 | "outputs": [ 349 | { 350 | "name": "stdout", 351 | "output_type": "stream", 352 | "text": [ 353 | "Optimization terminated successfully. (Exit mode 0)\n", 354 | " Current function value: 1.00000000438\n", 355 | " Iterations: 5\n", 356 | " Function evaluations: 40\n", 357 | " Gradient evaluations: 5\n", 358 | "Optimization terminated successfully. (Exit mode 0)\n", 359 | " Current function value: 0.444444444457\n", 360 | " Iterations: 9\n", 361 | " Function evaluations: 72\n", 362 | " Gradient evaluations: 9\n", 363 | "Optimization terminated successfully. (Exit mode 0)\n", 364 | " Current function value: 0.666666678013\n", 365 | " Iterations: 5\n", 366 | " Function evaluations: 40\n", 367 | " Gradient evaluations: 5\n", 368 | "---------------------------\n", 369 | "\n", 370 | "Efficient units:\n", 371 | "'A': 1.000000004375134\n", 372 | "\n", 373 | "\n", 374 | "Inefficient units:\n", 375 | "'C': 0.6666666780128222, 'B': 0.4444444444571152\n", 376 | "(array([0.34522801, 0.32736447]), array([0.2817355]))\n", 377 | "(array([0.34522801, 0.32736447]), array([0.2817355]))\n", 378 | "(array([0.34522801, 0.32736447]), array([0.2817355]))\n" 379 | ] 380 | } 381 | ], 382 | "source": [ 383 | "inpt_arr_2 = np.array(inputss)\n", 384 | "outpt_arr_2 = np.array(outputss)\n", 385 | "\n", 386 | "class DEA(object):\n", 387 | " random.seed(5)\n", 388 | " def __init__(self, inputs, outputs):\n", 389 | " \"\"\"\n", 390 | " Initialize the DEA object with input data\n", 391 | " n = number of entities (observations)\n", 392 | " m = number of inputs (variables, features)\n", 393 | " r = number of outputs\n", 394 | " :param inputs: inputs, n x m numpy array\n", 395 | " :param outputs: outputs, n x r numpy array\n", 396 | " :return: self\n", 397 | " \"\"\"\n", 398 | "\n", 399 | " # supplied data\n", 400 | " self.inputs = inputs\n", 401 | " self.outputs = outputs\n", 402 | "\n", 403 | " # parameters\n", 404 | " self.n = inputs.shape[0]\n", 405 | " self.m = inputs.shape[1]\n", 406 | " self.r = outputs.shape[1]\n", 407 | "\n", 408 | " # iterators\n", 409 | " self.unit_ = range(self.n)\n", 410 | " self.input_ = range(self.m)\n", 411 | " self.output_ = range(self.r)\n", 412 | "\n", 413 | " # result arrays\n", 414 | " self.output_w = np.zeros((self.r, 1), dtype=np.float) # output weights\n", 415 | " self.input_w = np.zeros((self.m, 1), dtype=np.float) # input weights\n", 416 | " self.lambdas = np.zeros((self.n, 1), dtype=np.float) # unit efficiencies\n", 417 | " self.efficiency = np.zeros_like(self.lambdas) # thetas\n", 418 | "\n", 419 | " # names\n", 420 | " self.names = []\n", 421 | "\n", 422 | " def __efficiency(self, unit):\n", 423 | " \"\"\"\n", 424 | " Efficiency function with already computed weights\n", 425 | " :param unit: which unit to compute for\n", 426 | " :return: efficiency\n", 427 | " \"\"\"\n", 428 | "\n", 429 | " # compute efficiency\n", 430 | " denominator = np.dot(self.inputs, self.input_w)\n", 431 | " numerator = np.dot(self.outputs, self.output_w)\n", 432 | "\n", 433 | " return (numerator/denominator)[unit]\n", 434 | "\n", 435 | " def __target(self, x, unit):\n", 436 | " \"\"\"\n", 437 | " Theta target function for one unit\n", 438 | " :param x: combined weights\n", 439 | " :param unit: which production unit to compute\n", 440 | " :return: theta\n", 441 | " \"\"\"\n", 442 | " in_w, out_w, lambdas = x[:self.m], x[self.m:(self.m+self.r)], x[(self.m+self.r):] # unroll the weights\n", 443 | " denominator = np.dot(self.inputs[unit], in_w)\n", 444 | " numerator = np.dot(self.outputs[unit], out_w)\n", 445 | "\n", 446 | " return numerator/denominator\n", 447 | "\n", 448 | " def __constraints(self, x, unit):\n", 449 | " \"\"\"\n", 450 | " Constraints for optimization for one unit\n", 451 | " :param x: combined weights\n", 452 | " :param unit: which production unit to compute\n", 453 | " :return: array of constraints\n", 454 | " \"\"\"\n", 455 | "\n", 456 | " in_w, out_w, lambdas = x[:self.m], x[self.m:(self.m+self.r)], x[(self.m+self.r):] # unroll the weights\n", 457 | " constr = [] # init the constraint array\n", 458 | "\n", 459 | " # for each input, lambdas with inputs\n", 460 | " for input in self.input_:\n", 461 | " t = self.__target(x, unit)\n", 462 | " lhs = np.dot(self.inputs[:, input], lambdas)\n", 463 | " cons = t*self.inputs[unit, input] - lhs\n", 464 | " constr.append(cons)\n", 465 | "\n", 466 | " # for each output, lambdas with outputs\n", 467 | " for output in self.output_:\n", 468 | " lhs = np.dot(self.outputs[:, output], lambdas)\n", 469 | " cons = lhs - self.outputs[unit, output]\n", 470 | " constr.append(cons)\n", 471 | "\n", 472 | " # for each unit\n", 473 | " for u in self.unit_:\n", 474 | " constr.append(lambdas[u])\n", 475 | "\n", 476 | " return np.array(constr)\n", 477 | "\n", 478 | " def __optimize(self):\n", 479 | " \"\"\"\n", 480 | " Optimization of the DEA model\n", 481 | " Use: http://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.optimize.linprog.html\n", 482 | " A = coefficients in the constraints\n", 483 | " b = rhs of constraints\n", 484 | " c = coefficients of the target function\n", 485 | " :return:\n", 486 | " \"\"\"\n", 487 | " d0 = self.m + self.r + self.n\n", 488 | " # iterate over units\n", 489 | " for unit in self.unit_:\n", 490 | " # weights\n", 491 | " x0 = np.random.rand(d0) - 0.5\n", 492 | " x0 = fmin_slsqp(self.__target, x0, f_ieqcons=self.__constraints, args=(unit,))\n", 493 | " # unroll weights\n", 494 | " self.input_w, self.output_w, self.lambdas = x0[:self.m], x0[self.m:(self.m+self.r)], x0[(self.m+self.r):]\n", 495 | " self.efficiency[unit] = self.__efficiency(unit)\n", 496 | "\n", 497 | " def name_units(self, names):\n", 498 | " \"\"\"\n", 499 | " Provide names for units for presentation purposes\n", 500 | " :param names: a list of names, equal in length to the number of units\n", 501 | " :return: nothing\n", 502 | " \"\"\"\n", 503 | "\n", 504 | " assert(self.n == len(names))\n", 505 | "\n", 506 | " self.names = names\n", 507 | "\n", 508 | " def fit(self):\n", 509 | " \"\"\"\n", 510 | " Optimize the dataset, generate basic table\n", 511 | " :return: table\n", 512 | " \"\"\"\n", 513 | "\n", 514 | " self.__optimize() # optimize\n", 515 | " print(\"---------------------------\\n\") \n", 516 | "\n", 517 | " m = {}\n", 518 | " l = {} \n", 519 | " for n, eff in enumerate(self.efficiency): \n", 520 | " if eff >= 1.:\n", 521 | " m.update({self.names[n]: eff[0]}) \n", 522 | " else:\n", 523 | " l.update({self.names[n]: eff[0]}) \n", 524 | " print(\"Efficient units:\") \n", 525 | " print(str(m).replace(\"{\",\"\").replace(\"}\", \"\")) \n", 526 | " print(\"\\n\") \n", 527 | " print(\"Inefficient units:\")\n", 528 | " print(str(l).replace(\"{\",\"\").replace(\"}\", \"\")) \n", 529 | " for n in enumerate(self.efficiency):\n", 530 | " print(self.input_w, self.output_w)\n", 531 | " \n", 532 | "\n", 533 | "\n", 534 | "dea = DEA(inpt_arr_2, outpt_arr_2)\n", 535 | "dea.name_units(comp_2)\n", 536 | "dea.fit()\n" 537 | ] 538 | }, 539 | { 540 | "cell_type": "code", 541 | "execution_count": 36, 542 | "metadata": {}, 543 | "outputs": [ 544 | { 545 | "name": "stdout", 546 | "output_type": "stream", 547 | "text": [ 548 | "Optimization terminated successfully. (Exit mode 0)\n", 549 | " Current function value: 1.00000003588\n", 550 | " Iterations: 18\n", 551 | " Function evaluations: 650\n", 552 | " Gradient evaluations: 18\n", 553 | "Optimization terminated successfully. (Exit mode 0)\n", 554 | " Current function value: 0.966316603098\n", 555 | " Iterations: 14\n", 556 | " Function evaluations: 504\n", 557 | " Gradient evaluations: 14\n", 558 | "Optimization terminated successfully. (Exit mode 0)\n", 559 | " Current function value: 0.99581214551\n", 560 | " Iterations: 20\n", 561 | " Function evaluations: 722\n", 562 | " Gradient evaluations: 20\n", 563 | "Optimization terminated successfully. (Exit mode 0)\n", 564 | " Current function value: 0.932140293891\n", 565 | " Iterations: 15\n", 566 | " Function evaluations: 540\n", 567 | " Gradient evaluations: 15\n", 568 | "Optimization terminated successfully. (Exit mode 0)\n", 569 | " Current function value: 1.00000000444\n", 570 | " Iterations: 8\n", 571 | " Function evaluations: 288\n", 572 | " Gradient evaluations: 8\n", 573 | "Optimization terminated successfully. (Exit mode 0)\n", 574 | " Current function value: 0.928787206476\n", 575 | " Iterations: 9\n", 576 | " Function evaluations: 324\n", 577 | " Gradient evaluations: 9\n", 578 | "Optimization terminated successfully. (Exit mode 0)\n", 579 | " Current function value: 0.922897920306\n", 580 | " Iterations: 12\n", 581 | " Function evaluations: 432\n", 582 | " Gradient evaluations: 12\n", 583 | "Optimization terminated successfully. (Exit mode 0)\n", 584 | " Current function value: 1.00000001492\n", 585 | " Iterations: 10\n", 586 | " Function evaluations: 360\n", 587 | " Gradient evaluations: 10\n", 588 | "Optimization terminated successfully. (Exit mode 0)\n", 589 | " Current function value: 0.871090264284\n", 590 | " Iterations: 18\n", 591 | " Function evaluations: 648\n", 592 | " Gradient evaluations: 18\n", 593 | "Optimization terminated successfully. (Exit mode 0)\n", 594 | " Current function value: 1.00000015567\n", 595 | " Iterations: 17\n", 596 | " Function evaluations: 612\n", 597 | " Gradient evaluations: 17\n", 598 | "Optimization terminated successfully. (Exit mode 0)\n", 599 | " Current function value: 1.0000000317\n", 600 | " Iterations: 14\n", 601 | " Function evaluations: 504\n", 602 | " Gradient evaluations: 14\n", 603 | "Optimization terminated successfully. (Exit mode 0)\n", 604 | " Current function value: 0.974436819017\n", 605 | " Iterations: 14\n", 606 | " Function evaluations: 504\n", 607 | " Gradient evaluations: 14\n", 608 | "Optimization terminated successfully. (Exit mode 0)\n", 609 | " Current function value: 0.873789625393\n", 610 | " Iterations: 14\n", 611 | " Function evaluations: 505\n", 612 | " Gradient evaluations: 14\n", 613 | "Optimization terminated successfully. (Exit mode 0)\n", 614 | " Current function value: 0.984484190762\n", 615 | " Iterations: 9\n", 616 | " Function evaluations: 324\n", 617 | " Gradient evaluations: 9\n", 618 | "Optimization terminated successfully. (Exit mode 0)\n", 619 | " Current function value: 0.999999999517\n", 620 | " Iterations: 6\n", 621 | " Function evaluations: 216\n", 622 | " Gradient evaluations: 6\n", 623 | "Optimization terminated successfully. (Exit mode 0)\n", 624 | " Current function value: 1.00000000023\n", 625 | " Iterations: 12\n", 626 | " Function evaluations: 432\n", 627 | " Gradient evaluations: 12\n", 628 | "Optimization terminated successfully. (Exit mode 0)\n", 629 | " Current function value: 1.00000000005\n", 630 | " Iterations: 6\n", 631 | " Function evaluations: 217\n", 632 | " Gradient evaluations: 6\n", 633 | "Optimization terminated successfully. (Exit mode 0)\n", 634 | " Current function value: 1.0\n", 635 | " Iterations: 9\n", 636 | " Function evaluations: 325\n", 637 | " Gradient evaluations: 9\n", 638 | "Optimization terminated successfully. (Exit mode 0)\n", 639 | " Current function value: 0.982341644768\n", 640 | " Iterations: 18\n", 641 | " Function evaluations: 648\n", 642 | " Gradient evaluations: 18\n", 643 | "Optimization terminated successfully. (Exit mode 0)\n", 644 | " Current function value: 1.00000000082\n", 645 | " Iterations: 7\n", 646 | " Function evaluations: 252\n", 647 | " Gradient evaluations: 7\n", 648 | "Optimization terminated successfully. (Exit mode 0)\n", 649 | " Current function value: 1.00000000023\n", 650 | " Iterations: 10\n", 651 | " Function evaluations: 360\n", 652 | " Gradient evaluations: 10\n", 653 | "Optimization terminated successfully. (Exit mode 0)\n", 654 | " Current function value: 1.00000042344\n", 655 | " Iterations: 7\n", 656 | " Function evaluations: 252\n", 657 | " Gradient evaluations: 7\n", 658 | "Optimization terminated successfully. (Exit mode 0)\n", 659 | " Current function value: 0.982558049119\n", 660 | " Iterations: 22\n", 661 | " Function evaluations: 793\n", 662 | " Gradient evaluations: 22\n", 663 | "Optimization terminated successfully. (Exit mode 0)\n", 664 | " Current function value: 0.999999999995\n", 665 | " Iterations: 6\n", 666 | " Function evaluations: 217\n", 667 | " Gradient evaluations: 6\n", 668 | "Optimization terminated successfully. (Exit mode 0)\n", 669 | " Current function value: 0.984999924808\n", 670 | " Iterations: 15\n", 671 | " Function evaluations: 540\n", 672 | " Gradient evaluations: 15\n", 673 | "Optimization terminated successfully. (Exit mode 0)\n", 674 | " Current function value: 0.956899154838\n", 675 | " Iterations: 18\n", 676 | " Function evaluations: 649\n", 677 | " Gradient evaluations: 18\n", 678 | "---------------------------\n", 679 | "\n", 680 | "Efficient units:\n", 681 | "'A': 1.0000000358829255, 'E': 1.0000000044424062, 'H': 1.0000000149214712, 'K': 1.0000000316962117, 'J': 1.0000001556692342, 'Q': 1.0000000000484728, 'P': 1.0000000002282767, 'R': 1.0000000000013682, 'U': 1.0000000002335174, 'T': 1.0000000008183176, 'V': 1.0000004234448105\n", 682 | "\n", 683 | "\n", 684 | "Inefficient units:\n", 685 | "'C': 0.9958121455099681, 'B': 0.9663166030979251, 'D': 0.9321402938915002, 'G': 0.9228979203055871, 'F': 0.9287872064756271, 'I': 0.8710902642835067, 'M': 0.8737896253930998, 'L': 0.9744368190168068, 'O': 0.9999999995173697, 'N': 0.9844841907617617, 'S': 0.9823416447678736, 'W': 0.9825580491186346, 'Y': 0.9849999248084184, 'X': 0.9999999999952303, 'Z': 0.9568991548383973\n" 686 | ] 687 | } 688 | ], 689 | "source": [ 690 | "#Calculating DEA\n", 691 | "class DEA(object):\n", 692 | "\n", 693 | " def __init__(self, inputs, outputs):\n", 694 | " \"\"\"\n", 695 | " Initialize the DEA object with input data\n", 696 | " n = number of entities (observations)\n", 697 | " m = number of inputs (variables, features)\n", 698 | " r = number of outputs\n", 699 | " :param inputs: inputs, n x m numpy array\n", 700 | " :param outputs: outputs, n x r numpy array\n", 701 | " :return: self\n", 702 | " \"\"\"\n", 703 | "\n", 704 | " # supplied data\n", 705 | " self.inputs = inputs\n", 706 | " self.outputs = outputs\n", 707 | "\n", 708 | " # parameters\n", 709 | " self.n = inputs.shape[0]\n", 710 | " self.m = inputs.shape[1]\n", 711 | " self.r = outputs.shape[1]\n", 712 | "\n", 713 | " # iterators\n", 714 | " self.unit_ = range(self.n)\n", 715 | " self.input_ = range(self.m)\n", 716 | " self.output_ = range(self.r)\n", 717 | "\n", 718 | " # result arrays\n", 719 | " self.output_w = np.zeros((self.r, 1), dtype=np.float) # output weights\n", 720 | " self.input_w = np.zeros((self.m, 1), dtype=np.float) # input weights\n", 721 | " self.lambdas = np.zeros((self.n, 1), dtype=np.float) # unit efficiencies\n", 722 | " self.efficiency = np.zeros_like(self.lambdas) # thetas\n", 723 | "\n", 724 | " # names\n", 725 | " self.names = []\n", 726 | "\n", 727 | " def __efficiency(self, unit):\n", 728 | " \"\"\"\n", 729 | " Efficiency function with already computed weights\n", 730 | " :param unit: which unit to compute for\n", 731 | " :return: efficiency\n", 732 | " \"\"\"\n", 733 | "\n", 734 | " # compute efficiency\n", 735 | " denominator = np.dot(self.inputs, self.input_w)\n", 736 | " numerator = np.dot(self.outputs, self.output_w)\n", 737 | "\n", 738 | " return (numerator/denominator)[unit]\n", 739 | "\n", 740 | " def __target(self, x, unit):\n", 741 | " \"\"\"\n", 742 | " Theta target function for one unit\n", 743 | " :param x: combined weights\n", 744 | " :param unit: which production unit to compute\n", 745 | " :return: theta\n", 746 | " \"\"\"\n", 747 | " in_w, out_w, lambdas = x[:self.m], x[self.m:(self.m+self.r)], x[(self.m+self.r):] # unroll the weights\n", 748 | " denominator = np.dot(self.inputs[unit], in_w)\n", 749 | " numerator = np.dot(self.outputs[unit], out_w)\n", 750 | "\n", 751 | " return numerator/denominator\n", 752 | "\n", 753 | " def __constraints(self, x, unit):\n", 754 | " \"\"\"\n", 755 | " Constraints for optimization for one unit\n", 756 | " :param x: combined weights\n", 757 | " :param unit: which production unit to compute\n", 758 | " :return: array of constraints\n", 759 | " \"\"\"\n", 760 | "\n", 761 | " in_w, out_w, lambdas = x[:self.m], x[self.m:(self.m+self.r)], x[(self.m+self.r):] # unroll the weights\n", 762 | " constr = [] # init the constraint array\n", 763 | "\n", 764 | " # for each input, lambdas with inputs\n", 765 | " for input in self.input_:\n", 766 | " t = self.__target(x, unit)\n", 767 | " lhs = np.dot(self.inputs[:, input], lambdas)\n", 768 | " cons = t*self.inputs[unit, input] - lhs\n", 769 | " constr.append(cons)\n", 770 | "\n", 771 | " # for each output, lambdas with outputs\n", 772 | " for output in self.output_:\n", 773 | " lhs = np.dot(self.outputs[:, output], lambdas)\n", 774 | " cons = lhs - self.outputs[unit, output]\n", 775 | " constr.append(cons)\n", 776 | "\n", 777 | " # for each unit\n", 778 | " for u in self.unit_:\n", 779 | " constr.append(lambdas[u])\n", 780 | "\n", 781 | " return np.array(constr)\n", 782 | "\n", 783 | " def __optimize(self):\n", 784 | " \"\"\"\n", 785 | " Optimization of the DEA model\n", 786 | " Use: http://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.optimize.linprog.html\n", 787 | " A = coefficients in the constraints\n", 788 | " b = rhs of constraints\n", 789 | " c = coefficients of the target function\n", 790 | " :return:\n", 791 | " \"\"\"\n", 792 | " d0 = self.m + self.r + self.n\n", 793 | " # iterate over units\n", 794 | " for unit in self.unit_:\n", 795 | " # weights\n", 796 | " x0 = np.random.rand(d0) - 0.5\n", 797 | " x0 = fmin_slsqp(self.__target, x0, f_ieqcons=self.__constraints, args=(unit,))\n", 798 | " # unroll weights\n", 799 | " self.input_w, self.output_w, self.lambdas = x0[:self.m], x0[self.m:(self.m+self.r)], x0[(self.m+self.r):]\n", 800 | " self.efficiency[unit] = self.__efficiency(unit)\n", 801 | "\n", 802 | " def name_units(self, names):\n", 803 | " \"\"\"\n", 804 | " Provide names for units for presentation purposes\n", 805 | " :param names: a list of names, equal in length to the number of units\n", 806 | " :return: nothing\n", 807 | " \"\"\"\n", 808 | "\n", 809 | " assert(self.n == len(names))\n", 810 | "\n", 811 | " self.names = names\n", 812 | "\n", 813 | " def fit(self):\n", 814 | " \"\"\"\n", 815 | " Optimize the dataset, generate basic table\n", 816 | " :return: table\n", 817 | " \"\"\"\n", 818 | "\n", 819 | " self.__optimize() # optimize\n", 820 | " print(\"---------------------------\\n\") \n", 821 | "\n", 822 | " m = {}\n", 823 | " l = {} \n", 824 | " for n, eff in enumerate(self.efficiency): \n", 825 | " if eff >= 1.:\n", 826 | " m.update({self.names[n]: eff[0]}) \n", 827 | " else:\n", 828 | " l.update({self.names[n]: eff[0]}) \n", 829 | " print(\"Efficient units:\") \n", 830 | " print(str(m).replace(\"{\",\"\").replace(\"}\", \"\")) \n", 831 | " print(\"\\n\") \n", 832 | " print(\"Inefficient units:\")\n", 833 | " print(str(l).replace(\"{\",\"\").replace(\"}\", \"\")) \n", 834 | " \n", 835 | "\n", 836 | "dea = DEA(inpt_arr,outpt_arr)\n", 837 | "dea.name_units(comp)\n", 838 | "dea.fit()" 839 | ] 840 | }, 841 | { 842 | "cell_type": "code", 843 | "execution_count": 22, 844 | "metadata": {}, 845 | "outputs": [], 846 | "source": [ 847 | "#Calculation efficiency by dividing output by input to be used for the graph\n", 848 | "frst = outpt_df.div(inpt_df.x1, axis = 0)\n", 849 | "frst.columns = ['y1-x1', 'y2-x1', 'y3-x1']\n", 850 | "sec = outpt_df.div(inpt_df.x2, axis = 0)\n", 851 | "sec.columns = ['y1-x2', 'y2-x2', 'y3-x2']\n", 852 | "th = outpt_df.div(inpt_df.x3, axis = 0)\n", 853 | "th.columns = ['y1-x3', 'y2-x3', 'y3-x3']\n", 854 | "fo = outpt_df.div(inpt_df.x4, axis = 0)\n", 855 | "fo.columns = ['y1-x4', 'y2-x4', 'y3-x4']\n", 856 | "fi = outpt_df.div(inpt_df.x5, axis = 0)\n", 857 | "fi.columns = ['y1-x5', 'y2-x5', 'y3-x5']\n", 858 | "complete = pd.DataFrame(df.iloc[:,0]).join(frst).join(sec).join(th).join(fo).join(fi)" 859 | ] 860 | }, 861 | { 862 | "cell_type": "code", 863 | "execution_count": null, 864 | "metadata": {}, 865 | "outputs": [], 866 | "source": [ 867 | "#Building a graph\n", 868 | "eff = ['y1-x1', 'y2-x1', 'y3-x1', 'y1-x2', 'y2-x2', 'y3-x2',\n", 869 | " 'y1-x3', 'y2-x3', 'y3-x3', 'y1-x4', 'y2-x4', 'y3-x4', 'y1-x5',\n", 870 | " 'y2-x5', 'y3-x5']\n", 871 | "x = [i for i, _ in enumerate(eff)]\n", 872 | "\n", 873 | "min_max_range = {}\n", 874 | "for e in eff:\n", 875 | " min_max_range[e] = [complete[e].min(), complete[e].max(), np.ptp(complete[e])]\n", 876 | " complete[e] = np.true_divide(complete[e] - complete[e].min(), np.ptp(complete[e]))\n", 877 | " \n", 878 | "fig, axes = plt.subplots(1, len(x)-1, sharey = False, figsize = (50,10), gridspec_kw = {'wspace':0, 'hspace':0}) \n", 879 | "\n", 880 | "# Plot each row\n", 881 | "for i, ax in enumerate(axes):\n", 882 | " for idx in complete.index:\n", 883 | " ax.plot(x, complete.loc[idx, eff], color='gray') \n", 884 | " ax.set_xlim([x[i], x[i+1]])\n", 885 | "\n", 886 | "plt.title(\"Efficiency by a firm\")\n", 887 | "plt.show()" 888 | ] 889 | }, 890 | { 891 | "cell_type": "code", 892 | "execution_count": 97, 893 | "metadata": {}, 894 | "outputs": [], 895 | "source": [ 896 | "firms = ['1', '2', '3']\n", 897 | "df = pd.DataFrame(firms)\n", 898 | "output = { 'firms': ['1', '2', '3'],\n", 899 | "'Sales': [150, 200, 50],\n", 900 | "'Profit':[200, 210, 90],\n", 901 | "'Sth':[1, 2, 3]}\n", 902 | "df1 = pd.DataFrame.from_dict(output)\n", 903 | "inputs = { 'firms': ['1', '2', '3'],\n", 904 | "'Salary': [10000, 20000, 500],\n", 905 | "'employees':[2, 4, 5]}\n", 906 | "df2 = pd.DataFrame.from_dict(inputs)" 907 | ] 908 | }, 909 | { 910 | "cell_type": "code", 911 | "execution_count": null, 912 | "metadata": {}, 913 | "outputs": [], 914 | "source": [ 915 | "complete.to_csv('./files/output.csv')" 916 | ] 917 | } 918 | ], 919 | "metadata": { 920 | "kernelspec": { 921 | "display_name": "Python 3", 922 | "language": "python", 923 | "name": "python3" 924 | }, 925 | "language_info": { 926 | "codemirror_mode": { 927 | "name": "ipython", 928 | "version": 3 929 | }, 930 | "file_extension": ".py", 931 | "mimetype": "text/x-python", 932 | "name": "python", 933 | "nbconvert_exporter": "python", 934 | "pygments_lexer": "ipython3", 935 | "version": "3.7.0" 936 | } 937 | }, 938 | "nbformat": 4, 939 | "nbformat_minor": 2 940 | } 941 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/main-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 21, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "#Importing libraries\n", 10 | "import pandas as pd\n", 11 | "import numpy as np\n", 12 | "from scipy.optimize import fmin_slsqp\n", 13 | "import matplotlib.pyplot as plt\n", 14 | "import os\n", 15 | "from pprint import pprint\n", 16 | "import random" 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": null, 22 | "metadata": {}, 23 | "outputs": [], 24 | "source": [ 25 | "#Listing the existing files in the dir\n", 26 | "for root, dirs, files in os.walk(\".\"): \n", 27 | " for filename in files:\n", 28 | " print(filename)" 29 | ] 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": 2, 34 | "metadata": {}, 35 | "outputs": [ 36 | { 37 | "data": { 38 | "text/html": [ 39 | "
\n", 40 | "\n", 53 | "\n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \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 | "
dmux1x2x3x4x5y1y2y3
0A86.1316.2448.2149.69954.5358.9838.16
1B29.2610.2441.9640.65524.6933.8926.02
2C43.1211.3138.1935.03936.4140.6228.51
3D24.966.1424.8125.15714.9417.5816.19
4E11.622.216.856.3747.816.945.37
\n", 131 | "
" 132 | ], 133 | "text/plain": [ 134 | " dmu x1 x2 x3 x4 x5 y1 y2 y3\n", 135 | "0 A 86.13 16.24 48.21 49.69 9 54.53 58.98 38.16\n", 136 | "1 B 29.26 10.24 41.96 40.65 5 24.69 33.89 26.02\n", 137 | "2 C 43.12 11.31 38.19 35.03 9 36.41 40.62 28.51\n", 138 | "3 D 24.96 6.14 24.81 25.15 7 14.94 17.58 16.19\n", 139 | "4 E 11.62 2.21 6.85 6.37 4 7.81 6.94 5.37" 140 | ] 141 | }, 142 | "execution_count": 2, 143 | "metadata": {}, 144 | "output_type": "execute_result" 145 | } 146 | ], 147 | "source": [ 148 | "#Loading df\n", 149 | "df = pd.read_csv('./files/data-2018-09-24.csv') #skiprows = 1)\n", 150 | "df = df.drop(df.loc[:,['name', 'pft']].head(0).columns, axis=1)\n", 151 | "df.head() #where xs are input vars and ys are output vars" 152 | ] 153 | }, 154 | { 155 | "cell_type": "code", 156 | "execution_count": 3, 157 | "metadata": {}, 158 | "outputs": [ 159 | { 160 | "name": "stdout", 161 | "output_type": "stream", 162 | "text": [ 163 | "[[86.13 16.24 48.21 49.69 9. ]\n", 164 | " [29.26 10.24 41.96 40.65 5. ]\n", 165 | " [43.12 11.31 38.19 35.03 9. ]\n", 166 | " [24.96 6.14 24.81 25.15 7. ]\n", 167 | " [11.62 2.21 6.85 6.37 4. ]\n", 168 | " [11.88 4.97 18.73 18.04 4. ]\n", 169 | " [32.64 6.88 28.1 25.45 7. ]\n", 170 | " [20.79 12.97 54.85 52.07 8. ]\n", 171 | " [34.4 11.04 38.16 42.4 8. ]\n", 172 | " [61.74 14.5 49.09 42.92 9. ]\n", 173 | " [52.92 11.67 39.48 39.64 5. ]\n", 174 | " [36. 10.15 37.8 39.52 5. ]\n", 175 | " [39.2 10.8 41.04 41.12 7. ]\n", 176 | " [14.6 2.88 9.64 11.14 3. ]\n", 177 | " [ 4.29 5.42 21.45 17.27 5. ]\n", 178 | " [27.25 14.17 56.46 55.26 9. ]\n", 179 | " [22.63 4.43 15.4 15. 2. ]\n", 180 | " [28. 7.61 28.73 27.04 9. ]\n", 181 | " [53.56 13.7 53.04 49.85 7. ]\n", 182 | " [25.42 9.05 29.69 31.74 4. ]\n", 183 | " [31.57 10.08 39.34 40.57 6. ]\n", 184 | " [16.34 5.84 20.89 22.1 4. ]\n", 185 | " [44.28 14.14 56.7 52.27 11. ]\n", 186 | " [19.74 6.43 24.2 25.66 3. ]\n", 187 | " [24.4 8.05 33.42 31.29 7. ]\n", 188 | " [41.4 11.7 44.01 46.35 7. ]] [[54.53 58.98 38.16]\n", 189 | " [24.69 33.89 26.02]\n", 190 | " [36.41 40.62 28.51]\n", 191 | " [14.94 17.58 16.19]\n", 192 | " [ 7.81 6.94 5.37]\n", 193 | " [12.59 16.85 12.84]\n", 194 | " [17.06 16.99 17.82]\n", 195 | " [20.29 30.64 33.16]\n", 196 | " [26.13 29.8 26.29]\n", 197 | " [46.42 51.59 35.2 ]\n", 198 | " [39.8 37.73 30.29]\n", 199 | " [37.84 47.85 25.35]\n", 200 | " [26.48 31.36 26.54]\n", 201 | " [10.31 10.86 7.47]\n", 202 | " [14.39 18.3 14.33]\n", 203 | " [32.94 36.03 38.19]\n", 204 | " [17.25 20.8 12.07]\n", 205 | " [27.55 38.19 20.44]\n", 206 | " [41.12 43.8 36.54]\n", 207 | " [29.43 42.63 23.34]\n", 208 | " [37.46 51.02 27.44]\n", 209 | " [19.4 25.18 16.52]\n", 210 | " [39.88 47.72 38.97]\n", 211 | " [25.72 30.81 16.54]\n", 212 | " [24.88 25.27 22.43]\n", 213 | " [31.62 40.78 31.16]] ['A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' 'N' 'O' 'P' 'Q' 'R'\n", 214 | " 'S' 'T' 'U' 'V' 'W' 'X' 'Y' 'Z']\n" 215 | ] 216 | } 217 | ], 218 | "source": [ 219 | "#Save input, output and unit as separate numpy arrays\n", 220 | "inpt_df = df.iloc[:, 1:6]\n", 221 | "inpt_arr = np.array(inpt_df)\n", 222 | "outpt_df = df.iloc[:, 6:]\n", 223 | "outpt_arr = np.array(outpt_df)\n", 224 | "comp = np.array(df.iloc[:, 0])\n", 225 | "print(inpt_arr, outpt_arr, comp)" 226 | ] 227 | }, 228 | { 229 | "cell_type": "code", 230 | "execution_count": 11, 231 | "metadata": {}, 232 | "outputs": [ 233 | { 234 | "name": "stdout", 235 | "output_type": "stream", 236 | "text": [ 237 | "Optimization terminated successfully. (Exit mode 0)\n", 238 | " Current function value: 1.0000000171370762\n", 239 | " Iterations: 14\n", 240 | " Function evaluations: 504\n", 241 | " Gradient evaluations: 14\n", 242 | "Optimization terminated successfully. (Exit mode 0)\n", 243 | " Current function value: 0.9663164619553417\n", 244 | " Iterations: 15\n", 245 | " Function evaluations: 541\n", 246 | " Gradient evaluations: 15\n", 247 | "Optimization terminated successfully. (Exit mode 0)\n", 248 | " Current function value: 0.9958121448686142\n", 249 | " Iterations: 15\n", 250 | " Function evaluations: 540\n", 251 | " Gradient evaluations: 15\n", 252 | "Optimization terminated successfully. (Exit mode 0)\n", 253 | " Current function value: 0.9321405795718042\n", 254 | " Iterations: 13\n", 255 | " Function evaluations: 469\n", 256 | " Gradient evaluations: 13\n", 257 | "Optimization terminated successfully. (Exit mode 0)\n", 258 | " Current function value: 1.0000000470033805\n", 259 | " Iterations: 8\n", 260 | " Function evaluations: 288\n", 261 | " Gradient evaluations: 8\n", 262 | "Optimization terminated successfully. (Exit mode 0)\n", 263 | " Current function value: 0.9287872073441278\n", 264 | " Iterations: 8\n", 265 | " Function evaluations: 288\n", 266 | " Gradient evaluations: 8\n", 267 | "Optimization terminated successfully. (Exit mode 0)\n", 268 | " Current function value: 0.92289779518485\n", 269 | " Iterations: 12\n", 270 | " Function evaluations: 432\n", 271 | " Gradient evaluations: 12\n", 272 | "Optimization terminated successfully. (Exit mode 0)\n", 273 | " Current function value: 1.0000000117566126\n", 274 | " Iterations: 10\n", 275 | " Function evaluations: 360\n", 276 | " Gradient evaluations: 10\n", 277 | "Optimization terminated successfully. (Exit mode 0)\n", 278 | " Current function value: 0.8710904562515944\n", 279 | " Iterations: 18\n", 280 | " Function evaluations: 648\n", 281 | " Gradient evaluations: 18\n", 282 | "Optimization terminated successfully. (Exit mode 0)\n", 283 | " Current function value: 1.0000000000375744\n", 284 | " Iterations: 19\n", 285 | " Function evaluations: 686\n", 286 | " Gradient evaluations: 19\n", 287 | "Optimization terminated successfully. (Exit mode 0)\n", 288 | " Current function value: 1.0000000049971765\n", 289 | " Iterations: 11\n", 290 | " Function evaluations: 396\n", 291 | " Gradient evaluations: 11\n", 292 | "Optimization terminated successfully. (Exit mode 0)\n", 293 | " Current function value: 0.9744366411566949\n", 294 | " Iterations: 15\n", 295 | " Function evaluations: 540\n", 296 | " Gradient evaluations: 15\n", 297 | "Optimization terminated successfully. (Exit mode 0)\n", 298 | " Current function value: 0.8737896253934904\n", 299 | " Iterations: 16\n", 300 | " Function evaluations: 577\n", 301 | " Gradient evaluations: 16\n", 302 | "Optimization terminated successfully. (Exit mode 0)\n", 303 | " Current function value: 0.9844841846940163\n", 304 | " Iterations: 11\n", 305 | " Function evaluations: 396\n", 306 | " Gradient evaluations: 11\n", 307 | "Optimization terminated successfully. (Exit mode 0)\n", 308 | " Current function value: 1.000000023566161\n", 309 | " Iterations: 6\n", 310 | " Function evaluations: 216\n", 311 | " Gradient evaluations: 6\n", 312 | "Optimization terminated successfully. (Exit mode 0)\n", 313 | " Current function value: 1.000000000161572\n", 314 | " Iterations: 11\n", 315 | " Function evaluations: 396\n", 316 | " Gradient evaluations: 11\n", 317 | "Optimization terminated successfully. (Exit mode 0)\n", 318 | " Current function value: 1.0000000683667205\n", 319 | " Iterations: 7\n", 320 | " Function evaluations: 252\n", 321 | " Gradient evaluations: 7\n", 322 | "Optimization terminated successfully. (Exit mode 0)\n", 323 | " Current function value: 1.0000000000211322\n", 324 | " Iterations: 9\n", 325 | " Function evaluations: 324\n", 326 | " Gradient evaluations: 9\n", 327 | "Optimization terminated successfully. (Exit mode 0)\n", 328 | " Current function value: 0.9823415586216158\n", 329 | " Iterations: 18\n", 330 | " Function evaluations: 648\n", 331 | " Gradient evaluations: 18\n", 332 | "Optimization terminated successfully. (Exit mode 0)\n", 333 | " Current function value: 1.0000000015285573\n", 334 | " Iterations: 7\n", 335 | " Function evaluations: 252\n", 336 | " Gradient evaluations: 7\n", 337 | "Optimization terminated successfully. (Exit mode 0)\n", 338 | " Current function value: 1.000000000294568\n", 339 | " Iterations: 12\n", 340 | " Function evaluations: 432\n", 341 | " Gradient evaluations: 12\n", 342 | "Optimization terminated successfully. (Exit mode 0)\n", 343 | " Current function value: 1.0000000463524783\n", 344 | " Iterations: 7\n", 345 | " Function evaluations: 252\n", 346 | " Gradient evaluations: 7\n", 347 | "Optimization terminated successfully. (Exit mode 0)\n", 348 | " Current function value: 0.9825580491212562\n", 349 | " Iterations: 22\n", 350 | " Function evaluations: 793\n", 351 | " Gradient evaluations: 22\n", 352 | "Optimization terminated successfully. (Exit mode 0)\n", 353 | " Current function value: 1.0000000000353004\n", 354 | " Iterations: 7\n", 355 | " Function evaluations: 252\n", 356 | " Gradient evaluations: 7\n", 357 | "Optimization terminated successfully. (Exit mode 0)\n", 358 | " Current function value: 0.9849999257640922\n", 359 | " Iterations: 15\n", 360 | " Function evaluations: 540\n", 361 | " Gradient evaluations: 15\n", 362 | "Optimization terminated successfully. (Exit mode 0)\n", 363 | " Current function value: 0.9568991664215988\n", 364 | " Iterations: 17\n", 365 | " Function evaluations: 612\n", 366 | " Gradient evaluations: 17\n", 367 | "---------------------------\n", 368 | "\n", 369 | "Efficient units:\n", 370 | "'A': 1.0000000171370762, 'E': 1.0000000470033805, 'H': 1.0000000117566126, 'J': 1.0000000000375744, 'K': 1.0000000049971765, 'O': 1.000000023566161, 'P': 1.000000000161572, 'Q': 1.0000000683667205, 'R': 1.0000000000211322, 'T': 1.0000000015285573, 'U': 1.000000000294568, 'V': 1.0000000463524783, 'X': 1.0000000000353004\n", 371 | "\n", 372 | "\n", 373 | "Inefficient units:\n", 374 | "'B': 0.9663164619553417, 'C': 0.9958121448686142, 'D': 0.9321405795718042, 'F': 0.9287872073441278, 'G': 0.92289779518485, 'I': 0.8710904562515944, 'L': 0.9744366411566949, 'M': 0.8737896253934904, 'N': 0.9844841846940163, 'S': 0.9823415586216158, 'W': 0.9825580491212562, 'Y': 0.9849999257640922, 'Z': 0.9568991664215988\n" 375 | ] 376 | } 377 | ], 378 | "source": [ 379 | "#Estimating efficient and non efficient units\n", 380 | "class DEA(object):\n", 381 | " random.seed(5)\n", 382 | " def __init__(self, inputs, outputs):\n", 383 | " \"\"\"\n", 384 | " Initialize the DEA object with input data\n", 385 | " n = number of entities (observations)\n", 386 | " m = number of inputs (variables, features)\n", 387 | " r = number of outputs\n", 388 | " :param inputs: inputs, n x m numpy array\n", 389 | " :param outputs: outputs, n x r numpy array\n", 390 | " :return: self\n", 391 | " \"\"\"\n", 392 | " # supplied data\n", 393 | " self.inputs = inputs\n", 394 | " self.outputs = outputs\n", 395 | " # parameters\n", 396 | " self.n = inputs.shape[0]\n", 397 | " self.m = inputs.shape[1]\n", 398 | " self.r = outputs.shape[1]\n", 399 | " # iterators\n", 400 | " self.unit_ = range(self.n)\n", 401 | " self.input_ = range(self.m)\n", 402 | " self.output_ = range(self.r)\n", 403 | " # result arrays\n", 404 | " self.output_w = np.zeros((self.r, 1), dtype=np.float) # output weights\n", 405 | " self.input_w = np.zeros((self.m, 1), dtype=np.float) # input weights\n", 406 | " self.lambdas = np.zeros((self.n, 1), dtype=np.float) # unit efficiencies\n", 407 | " self.efficiency = np.zeros_like(self.lambdas) # thetas\n", 408 | " # names\n", 409 | " self.names = []\n", 410 | "\n", 411 | " def __efficiency(self, unit):\n", 412 | " \"\"\"\n", 413 | " Efficiency function with already computed weights\n", 414 | " :param unit: which unit to compute for\n", 415 | " :return: efficiency\n", 416 | " \"\"\"\n", 417 | " # compute efficiency\n", 418 | " denominator = np.dot(self.inputs, self.input_w)\n", 419 | " numerator = np.dot(self.outputs, self.output_w)\n", 420 | " return (numerator/denominator)[unit]\n", 421 | "\n", 422 | " def __target(self, x, unit):\n", 423 | " \"\"\"\n", 424 | " Theta target function for one unit\n", 425 | " :param x: combined weights\n", 426 | " :param unit: which production unit to compute\n", 427 | " :return: theta\n", 428 | " \"\"\"\n", 429 | " in_w, out_w, lambdas = x[:self.m], x[self.m:(self.m+self.r)], x[(self.m+self.r):] # unroll the weights\n", 430 | " denominator = np.dot(self.inputs[unit], in_w)\n", 431 | " numerator = np.dot(self.outputs[unit], out_w)\n", 432 | " return numerator/denominator\n", 433 | "\n", 434 | " def __constraints(self, x, unit):\n", 435 | " \"\"\"\n", 436 | " Constraints for optimization for one unit\n", 437 | " :param x: combined weights\n", 438 | " :param unit: which production unit to compute\n", 439 | " :return: array of constraints\n", 440 | " \"\"\"\n", 441 | " in_w, out_w, lambdas = x[:self.m], x[self.m:(self.m+self.r)], x[(self.m+self.r):] # unroll the weights\n", 442 | " constr = [] # init the constraint array\n", 443 | " # for each input, lambdas with inputs\n", 444 | " for input in self.input_:\n", 445 | " t = self.__target(x, unit)\n", 446 | " lhs = np.dot(self.inputs[:, input], lambdas)\n", 447 | " cons = t*self.inputs[unit, input] - lhs\n", 448 | " constr.append(cons)\n", 449 | " # for each output, lambdas with outputs\n", 450 | " for output in self.output_:\n", 451 | " lhs = np.dot(self.outputs[:, output], lambdas)\n", 452 | " cons = lhs - self.outputs[unit, output]\n", 453 | " constr.append(cons)\n", 454 | " # for each unit\n", 455 | " for u in self.unit_:\n", 456 | " constr.append(lambdas[u])\n", 457 | " return np.array(constr)\n", 458 | "\n", 459 | " def __optimize(self):\n", 460 | " \"\"\"\n", 461 | " Optimization of the DEA model\n", 462 | " Use: http://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.optimize.linprog.html\n", 463 | " A = coefficients in the constraints\n", 464 | " b = rhs of constraints\n", 465 | " c = coefficients of the target function\n", 466 | " :return:\n", 467 | " \"\"\"\n", 468 | " d0 = self.m + self.r + self.n\n", 469 | " # iterate over units\n", 470 | " for unit in self.unit_:\n", 471 | " # weights\n", 472 | " x0 = np.random.rand(d0) - 0.5\n", 473 | " x0 = fmin_slsqp(self.__target, x0, f_ieqcons=self.__constraints, args=(unit,))\n", 474 | " # unroll weights\n", 475 | " self.input_w, self.output_w, self.lambdas = x0[:self.m], x0[self.m:(self.m+self.r)], x0[(self.m+self.r):]\n", 476 | " self.efficiency[unit] = self.__efficiency(unit)\n", 477 | "\n", 478 | " def name_units(self, names):\n", 479 | " \"\"\"\n", 480 | " Provide names for units for presentation purposes\n", 481 | " :param names: a list of names, equal in length to the number of units\n", 482 | " :return: nothing\n", 483 | " \"\"\"\n", 484 | " assert(self.n == len(names))\n", 485 | " self.names = names\n", 486 | "\n", 487 | " def fit(self):\n", 488 | " global not_efficient, alls\n", 489 | " \"\"\"\n", 490 | " Optimize the dataset, generate basic table\n", 491 | " :return: table\n", 492 | " \"\"\"\n", 493 | " self.__optimize() # optimize\n", 494 | " print(\"---------------------------\\n\") \n", 495 | "\n", 496 | " efficient = {}\n", 497 | " not_efficient = {} \n", 498 | " alls = {}\n", 499 | " for n, eff in enumerate(self.efficiency): \n", 500 | " if eff >= 1.:\n", 501 | " efficient.update({self.names[n]: eff[0]}) \n", 502 | " else:\n", 503 | " not_efficient.update({self.names[n]: eff[0]})\n", 504 | " for n, eff in enumerate(self.efficiency): \n", 505 | " alls.update({self.names[n]: eff[0]}) \n", 506 | " print(\"Efficient units:\") \n", 507 | " print(str(efficient).replace(\"{\",\"\").replace(\"}\", \"\")) \n", 508 | " print(\"\\n\") \n", 509 | " print(\"Inefficient units:\")\n", 510 | " print(str(not_efficient).replace(\"{\",\"\").replace(\"}\", \"\")) \n", 511 | "\n", 512 | "def save_results(dataframe): \n", 513 | " df_results = pd.DataFrame([]) \n", 514 | " df_results = df_results.append(not_efficient, ignore_index = True).T\n", 515 | " df_results = df_results.reset_index()\n", 516 | " df_results.columns = ['dmu', 'efficiency'] \n", 517 | " dataframe = dataframe.merge(df_results)\n", 518 | " return dataframe \n", 519 | "\n", 520 | "def save_results_complete(dataframe): \n", 521 | " df_results_complete = pd.DataFrame([]) \n", 522 | " df_results_complete = df_results_complete.append(alls, ignore_index = True).T\n", 523 | " df_results_complete = df_results_complete.reset_index()\n", 524 | " df_results_complete.columns = ['dmu', 'efficiency'] \n", 525 | " dataframe_complete = dataframe.merge(df_results_complete)\n", 526 | " return dataframe_complete \n", 527 | "\n", 528 | "dea = DEA(inpt_arr, outpt_arr)\n", 529 | "dea.name_units(comp)\n", 530 | "dea.fit()" 531 | ] 532 | }, 533 | { 534 | "cell_type": "code", 535 | "execution_count": 12, 536 | "metadata": {}, 537 | "outputs": [ 538 | { 539 | "data": { 540 | "text/html": [ 541 | "
\n", 542 | "\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 | "
dmux1x2x3x4x5y1y2y3efficiency
0A86.1316.2448.2149.69954.5358.9838.161.000000
1B29.2610.2441.9640.65524.6933.8926.020.966316
2C43.1211.3138.1935.03936.4140.6228.510.995812
3D24.966.1424.8125.15714.9417.5816.190.932141
4E11.622.216.856.3747.816.945.371.000000
\n", 639 | "
" 640 | ], 641 | "text/plain": [ 642 | " dmu x1 x2 x3 x4 x5 y1 y2 y3 efficiency\n", 643 | "0 A 86.13 16.24 48.21 49.69 9 54.53 58.98 38.16 1.000000\n", 644 | "1 B 29.26 10.24 41.96 40.65 5 24.69 33.89 26.02 0.966316\n", 645 | "2 C 43.12 11.31 38.19 35.03 9 36.41 40.62 28.51 0.995812\n", 646 | "3 D 24.96 6.14 24.81 25.15 7 14.94 17.58 16.19 0.932141\n", 647 | "4 E 11.62 2.21 6.85 6.37 4 7.81 6.94 5.37 1.000000" 648 | ] 649 | }, 650 | "execution_count": 12, 651 | "metadata": {}, 652 | "output_type": "execute_result" 653 | } 654 | ], 655 | "source": [ 656 | "df_ineff = save_results(df)\n", 657 | "df_complete = save_results_complete(df)\n", 658 | "df_complete.head()" 659 | ] 660 | }, 661 | { 662 | "cell_type": "code", 663 | "execution_count": 6, 664 | "metadata": {}, 665 | "outputs": [ 666 | { 667 | "data": { 668 | "text/html": [ 669 | "
\n", 670 | "\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 | "
x1x2x3x4x5dmu
01.00.31.41.40.2B
10.20.00.20.10.0C
21.70.41.71.70.5D
30.80.41.31.30.3F
42.50.52.22.00.5G
\n", 743 | "
" 744 | ], 745 | "text/plain": [ 746 | " x1 x2 x3 x4 x5 dmu\n", 747 | "0 1.0 0.3 1.4 1.4 0.2 B\n", 748 | "1 0.2 0.0 0.2 0.1 0.0 C\n", 749 | "2 1.7 0.4 1.7 1.7 0.5 D\n", 750 | "3 0.8 0.4 1.3 1.3 0.3 F\n", 751 | "4 2.5 0.5 2.2 2.0 0.5 G" 752 | ] 753 | }, 754 | "execution_count": 6, 755 | "metadata": {}, 756 | "output_type": "execute_result" 757 | } 758 | ], 759 | "source": [ 760 | "#Estimating the improvement options - input oriented\n", 761 | "heading = list(df_ineff.iloc[:, 1:6])\n", 762 | "\n", 763 | "inter = []\n", 764 | "for c in df_ineff.iloc[:, 1:6].columns:\n", 765 | " inter.append(df_ineff[c].multiply((1- df_ineff.iloc[:,-1])))\n", 766 | " df_improvement = round(pd.concat(inter, axis = 1),1)\n", 767 | " df_improvement = df_improvement.rename(columns = dict(zip(df_improvement.columns, heading)))\n", 768 | "df_improvement = pd.concat([df_improvement,df_ineff[['dmu']]], axis = 1)\n", 769 | "df_improvement.head()" 770 | ] 771 | }, 772 | { 773 | "cell_type": "code", 774 | "execution_count": 7, 775 | "metadata": {}, 776 | "outputs": [ 777 | { 778 | "data": { 779 | "text/html": [ 780 | "
\n", 781 | "\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 | "
y1y2y3dmu
01.41.51.0A
10.91.31.0B
21.31.41.0C
30.91.11.0D
41.51.31.0E
\n", 842 | "
" 843 | ], 844 | "text/plain": [ 845 | " y1 y2 y3 dmu\n", 846 | "0 1.4 1.5 1.0 A\n", 847 | "1 0.9 1.3 1.0 B\n", 848 | "2 1.3 1.4 1.0 C\n", 849 | "3 0.9 1.1 1.0 D\n", 850 | "4 1.5 1.3 1.0 E" 851 | ] 852 | }, 853 | "execution_count": 7, 854 | "metadata": {}, 855 | "output_type": "execute_result" 856 | } 857 | ], 858 | "source": [ 859 | "#Estimating the improvement options - output oriented\n", 860 | "heading_output = list(df.iloc[:, 6:9])\n", 861 | "\n", 862 | "inter_out = []\n", 863 | "for c in df.iloc[:, 6:9].columns:\n", 864 | " inter_out.append(df[c].multiply((1- df.iloc[:,-1])/df.iloc[:,-1]).add(df[c]))\n", 865 | " df_improvement_outpt = round(pd.concat(inter_out, axis = 1),1)\n", 866 | " df_improvement_outpt = df_improvement_outpt.rename(columns = dict(zip(df_improvement_outpt.columns, heading_output)))\n", 867 | "df_improvement_outpt = pd.concat([df_improvement_outpt,df[['dmu']]], axis = 1)\n", 868 | "df_improvement_outpt.head()" 869 | ] 870 | }, 871 | { 872 | "cell_type": "code", 873 | "execution_count": 43, 874 | "metadata": {}, 875 | "outputs": [ 876 | { 877 | "data": { 878 | "image/png": "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\n", 879 | "text/plain": [ 880 | "
" 881 | ] 882 | }, 883 | "metadata": { 884 | "needs_background": "light" 885 | }, 886 | "output_type": "display_data" 887 | } 888 | ], 889 | "source": [ 890 | "#Assigning lables depending on the efficiency score\n", 891 | "def classification(x):\n", 892 | " \"\"\"The function assings lables depending on the efficiency score a unit falls into\"\"\"\n", 893 | " for u in x:\n", 894 | " if u >= 1.0 : return '100'\n", 895 | " elif u >= 0.9: return '>=90'\n", 896 | " elif u >= 0.8: return '>=80'\n", 897 | " elif u >= 0.7: return '>=70'\n", 898 | " elif u >= 0.6: return '>=60'\n", 899 | " elif u >=0.5: return '>=50'\n", 900 | " elif u >=0.4: return '>=40'\n", 901 | " elif u >= 0.3: return '>=0.3'\n", 902 | " else: return '<0.3'\n", 903 | "df_complete['category'] = df_complete[['efficiency']].apply(classification, axis = 1)\n", 904 | "\n", 905 | "#Creating the frequency table\n", 906 | "df_freq = df_complete.groupby('category').count().reset_index()\n", 907 | "categories = ['>=80', '>=90', '100']\n", 908 | "#Ploting the distribution graph\n", 909 | "mapping = {category: i for i, category in enumerate(categories)}\n", 910 | "key = df_freq['category'].map(mapping) \n", 911 | "df_freq = df_freq.iloc[key.argsort()]\n", 912 | "\n", 913 | "# Draw the bar chart\n", 914 | "plt.bar(df_freq['category'], df_freq['efficiency'], tick_label=categories)\n", 915 | "plt.title('Proportion of efficient units %')\n", 916 | "plt.ylabel('Frequency')\n", 917 | "plt.xlabel('Category')\n", 918 | "plt.show()" 919 | ] 920 | } 921 | ], 922 | "metadata": { 923 | "kernelspec": { 924 | "display_name": "Python 3", 925 | "language": "python", 926 | "name": "python3" 927 | }, 928 | "language_info": { 929 | "codemirror_mode": { 930 | "name": "ipython", 931 | "version": 3 932 | }, 933 | "file_extension": ".py", 934 | "mimetype": "text/x-python", 935 | "name": "python", 936 | "nbconvert_exporter": "python", 937 | "pygments_lexer": "ipython3", 938 | "version": "3.7.0" 939 | } 940 | }, 941 | "nbformat": 4, 942 | "nbformat_minor": 2 943 | } 944 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Data Envelopment Analysis (DEA)" 3 | author: "EPonkratova" 4 | date: December 28, 2018 5 | --- 6 | ### Data Envelopment Analysis concepts 7 | The project was done to explore the optimiztion techniques, data envelopment analysis, in particular. 8 | 9 | 1. Data Envelopment analysis was used by Chames, Cooper and Rhodes in 1978 to evaluate educational programs for disadvantaged students but later being adopted by the private sector to measure units’ efficiency productivity. 10 | 2. Efficiency in DEA is defined as the ratio of the weighted sum of outputs of a unit to its weighted sum of inputs. A unit is deemed to be efficient if it is not possible to find a mixture of proportions of other units whose combined inputs do not exceed those of the unit being considered, but whose outputs are equal to or exceed, those of the unit. Should this not be possible, then the unit is deemed to be inefficient. Watch here, the productivity of those units which got a 100% efficiency score can be improved even further by introducing some technological changes. 11 | 3. Management can use the results of DEA to (1) locate inefficient units that require remedial management actions and do more targeted resource allocation; (2) reward the more efficient managers;(3) identify best practices to be introduced into less efficient branches; (4) set performance targets, among others. 12 | 13 | The story behind the idea is @ https://medium.com/@eponkratova/whos-better-who-s-best-data-envelopment-analysis-a-non-mathematical-introduction-4986184f9ea3 (part 1), https://medium.com/@eponkratova/what-must-we-know-and-know-how-to-implement-and-interpret-data-envelopment-analysis-3517a6231be9 (part 2) 14 | 15 | The interactive visualization is available @ https://eponkratova.github.io/data_envelopment_analysis/ 16 | -------------------------------------------------------------------------------- /code.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 34, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stdout", 10 | "output_type": "stream", 11 | "text": [ 12 | "code.ipynb\n", 13 | "index.html\n", 14 | "COMMIT_EDITMSG\n", 15 | "config\n", 16 | "description\n", 17 | "HEAD\n", 18 | "index\n", 19 | "applypatch-msg.sample\n", 20 | "commit-msg.sample\n", 21 | "fsmonitor-watchman.sample\n", 22 | "post-update.sample\n", 23 | "pre-applypatch.sample\n", 24 | "pre-commit.sample\n", 25 | "pre-push.sample\n", 26 | "pre-rebase.sample\n", 27 | "pre-receive.sample\n", 28 | "prepare-commit-msg.sample\n", 29 | "update.sample\n", 30 | "exclude\n", 31 | "HEAD\n", 32 | "master\n", 33 | "master\n", 34 | "5108efed29355b7dc8d328cde74b1e98755c9a\n", 35 | "d2e71734748a0730bb35c5b59771ef7f38937e\n", 36 | "f88d872b837c92b626f9cde570a42e7f36d38c\n", 37 | "4dfa6c0777414e1da32daa7a159c86cad1ca08\n", 38 | "f318ffa38cc91f1286a42fe06fb9d64706808d\n", 39 | "436dd894d232e6debd0b154dfd8648e3e224ea\n", 40 | "fe557a9d7fe3d267c5110019f3891a6fe652ab\n", 41 | "cda8e721177be429e875da5b6c54d1f634833e\n", 42 | "d97b9467177cdcac011907be76475a8c661163\n", 43 | "17a9483ed9b1f41d7ab90159100a3a713a6d2b\n", 44 | "8dc13db4f492af8daa95597fb199d2d6b411ec\n", 45 | "b6eac46829b50005531cd378f4916c23278fd6\n", 46 | "c1332e34dd9736a5f23a7cff7738cdeb81fb3f\n", 47 | "bf6b84f253938597b2c29d19213e0443f62403\n", 48 | "ecf7572746cbe4314b23d11bf3449fcc7d36f3\n", 49 | "ff1eb5bc7d3d8f398a986aa34a649fe9e15aee\n", 50 | "b752815fda2e17ae4d83f564cc5a035a60ab3b\n", 51 | "993c66eaf205a66c2ab69b5578ae669294c8b9\n", 52 | "9df40e4ae146d34b7773563240d9efdda9e13f\n", 53 | "fa95aa9f0d9fd6db0813e2e8d422f0356291e2\n", 54 | "cc70a1a5b034dad80cbb2e32c07d6f4dabdd5a\n", 55 | "f4c0b71722e5dedd6ee12b60848cb2876446d5\n", 56 | "61658c9707de1d7db437db7b96e7a9b54aa284\n", 57 | "6dd04e8f3b8fa25c0f9a1f4c51e73104c15fa2\n", 58 | "974439b2c59fa27d2a58d1878e765763c74692\n", 59 | "49ec1a8424948ef406e7106265d6691b2f8394\n", 60 | "95824add0b9d0289eec00502e3de6a3786ff93\n", 61 | "45ab90dfbba840067a3752ca0cfc0a64ad8cb7\n", 62 | "aa48a82028af149de515bd94a7e98a5156db9e\n", 63 | "5564097f981c38aa4cab02606443eca258c996\n", 64 | "56c58d2f9e12b0d2bbb4f4227b9f15eacadc63\n", 65 | "b57e79579d123b40a17a49db81bb3b1463510e\n", 66 | "dd83eb9e13b6290890f491d2c4ed8fd854f8ba\n", 67 | "ec4b755231d6c2887302a875e11b842afb92cf\n", 68 | "e31e385e5afde9144636e7036a114d8a039056\n", 69 | "f6d4df333be5fe507af8f097d40411ce41b2ac\n", 70 | "0801f82ccbd9ac8ec6f8b82b95b26ce7d3fde4\n", 71 | "c90d0db24ddab9cf6711fe3346ad23aaff6bfe\n", 72 | "e3cb375ce5a973f4929135aa68368302f9ff78\n", 73 | "e86a18f4311a0edcc5992c4412147f7c93d0fb\n", 74 | "1b85fd305d759c509914bbec165023b0f947b3\n", 75 | "6b2b5abae6b2048c725131cf3971e76bf1f2ba\n", 76 | "3adaf209492ddf30d07be793e9e9b3d06a9a50\n", 77 | "0f940e1dccba882446710ff1824cc253c6b93b\n", 78 | "e2765302456ffa3fef8453c7f57fe291a48030\n", 79 | "0a311989f100a4999b6699e41dd3c5cbfc505b\n", 80 | "2153bff2453cacbea6e3654728c1c90aa89cf6\n", 81 | "ff4eaf27c067b1d582e0e589440aa600bf2eaa\n", 82 | "d4fe3f1dd0cade3006d79acffd476b617288b9\n", 83 | "6bbfa454883ee8a17971d492ec95e1bfbb3cb5\n", 84 | "a139182aa638104db2a3820221bab4e788e259\n", 85 | "46415f2054c3c65a062e39554ee9bc6b9c56d1\n", 86 | "cbbd1fe778b3c87a40354789e5546f7a7a44a1\n", 87 | "8bac4719d3264677d064f508cdfe698efe848a\n", 88 | "98c9eff18cc7b6837c0d0850911b49355b6eef\n", 89 | "389c79af89edc25996ca90c87289466bf4657c\n", 90 | "3e5843b74b0f9ba4e23eb47aa141339e8819cf\n", 91 | "1df928f44307e2249538ad1d6cd4c413516ed4\n", 92 | "3ed08025a1fcdccb667ed864b6c6e6ac1352e4\n", 93 | "225d3d49dd14f6672a0b64e4fcae2b57114cb3\n", 94 | "31903048e7604b14b329991c2ebc71b754de1c\n", 95 | "7f967913c4f2a2014fd5679db49ab1cde7d2db\n", 96 | "52624e1779be00cd3ec756cef58513f9f95a60\n", 97 | "1277492b853ee61a892950732deab942f2f8a3\n", 98 | "a152f9d4235a6513f1ad3eab61edb27025f7a4\n", 99 | "f1a6e265cfb14bae540efc9beddc58031c8cc8\n", 100 | "42b740cb6751b816431d542cd2f306561d72dc\n", 101 | "bd21297cce1f0371e0dbd6e0f3220dbd3afb49\n", 102 | "08b8dfb84d0b2efa99d70bd4a0d498f9e087d6\n", 103 | "459f4828926fc4deb86ee067aabb3ccf8083ad\n", 104 | "0ce6b87132ebb05a1cc3b877ffbcaae774e8ce\n", 105 | "f5d0d04daade7eb79513d09d9e3659e5d2e636\n", 106 | "118417d6a1eb6e476c07edad22b7a714203e1d\n", 107 | "45a32f92de27db64f3c034bcb11d83235ebcd5\n", 108 | "e7cd6d4718403c5a6201391139f925e30fe7b2\n", 109 | "2a30d3c20f68c0078696e252103d0516a6ae9f\n", 110 | "826073cbb690876d4aed75403d186cd11f86ee\n", 111 | "391d105aca196e1bea494fb0655abeecccf5b1\n", 112 | "fd0f80a7ffb113e7a442cc13623010578c526b\n", 113 | "31b7f6a1871c35de16628c57186de1bb2d5fd0\n", 114 | "69f00578b08e8533347ba085fdce18e1d04d7c\n", 115 | "e240bd55641ffccbfdaf3fa14f82dd21a3bd98\n", 116 | "01acc35f660d4f65f1bef8cccdd8b6e3b67f25\n", 117 | "7dd3e960039c7bf2cc3408cf6ad31bb51dfac6\n", 118 | "c7dc1f57ab6a5182737cf1ea92f30e38ea0791\n", 119 | "ad70007360660d3efc58089f5359aca666d657\n", 120 | "c0ac53473cbd7905aa0d5afc946b672e9e5e60\n", 121 | "76c2ded903dc79bbc640e528c94a5dd7c481f7\n", 122 | "baa3a0b4aaa343280a2c01961190c170b779f7\n", 123 | "ef72b9d96c9eee2a20f85a78b269ed2ad8d171\n", 124 | "0ca1999638086a15b5a9dfaea780f048d20ad1\n", 125 | "78a778cacb3b1d1d9771bbc1b2a367625297e9\n", 126 | "8b3ad588e11c6b5063aba7d3e62f276db50f9e\n", 127 | "b80f0071ebc6a6eb0110ad7b1ed5e915569c40\n", 128 | "16d1edeb862236c0f20d30145984f876811803\n", 129 | "631584a2e315bc25b91caab96bac3eda61df76\n", 130 | "6ee278758c501c6dfa8c934f93d8bb316f13bf\n", 131 | "a2b0633fae29f68c433512758947f371afcf14\n", 132 | "adb97397a1046dfe219e4a0bba8ee40feac5d3\n", 133 | "d3aa278f8b5b3abd1a2f5e143782e62e104a4f\n", 134 | "215ec350c113f4e68faa123a03f46f590fb71f\n", 135 | "bf33f6b671625d44f87c95f8bca26535bfae3b\n", 136 | "f4918186963313b23f8fa9f5bbd1eb2a29e358\n", 137 | "8a41b6398bd51cab82f4feb87483702901cdec\n", 138 | "fb8e08468422d77a0bd2d1b0eecc4006dd2d17\n", 139 | "7d351583312c8c974f398ddd920347c7b0e0b1\n", 140 | "2da83ba5215532bdda75e463e982e9527c4533\n", 141 | "16cd2c1aec0cb62ca7a0159cc079352f64c99c\n", 142 | "776fab8dabc75db76af83e1103e0e08d0503bb\n", 143 | "7b5d4af04b009a840ecd16ff3ca78fdf137b24\n", 144 | "256aef8f49b33e2779cce514605fdc2876d0bd\n", 145 | "215267620a23e92f4c8a4bdaee708c08a4da56\n", 146 | "350698b1c2e7f4a223434b9f831530ef686623\n", 147 | "fb41b846baab5909c132bcf56c80f29a1b9275\n", 148 | "cc0fad42eb435792ed92bda49d10566a12e61f\n", 149 | "533dbdf37e79912da604882762acfd7e3f3b06\n", 150 | "7ec55aa0e1ea4d836f10b32b8709e34fe25953\n", 151 | "e75ab3d1c17a7223464357865b0a6d77c96aa9\n", 152 | "b739f20acfd870c3b5772250510c2fe5b9a2ce\n", 153 | "fa1344048a808a713226d0d16a8ec2e8f739c1\n", 154 | "906907af4dcce951306c4c9d3869a625645e96\n", 155 | "2a303f562bc5b6b8303f71bc617b3cb74379a7\n", 156 | "9d988be0f52a70841fc66f022ca98c3fe22ed5\n", 157 | "acb517e395b2c5cbfed48a29fcd6031d0f32b7\n", 158 | "91576e9f97b197f8935ae67c13e854875beb35\n", 159 | "64635398aec430c25920239ec6dd6557eff202\n", 160 | "ad6f86693b7066df3e3bc6cece85eb0f150213\n", 161 | "f27d76095e582e03330f403eabf04081d131e9\n", 162 | "498c952989e794dbba7ccec88d891208e7ce8b\n", 163 | "24bbff34fca7267ca1170b5521e68d33488214\n", 164 | "2b9c21ee9620f78e3ca5307ac8bb8a92456696\n", 165 | "6eec80e959b77b47dc98038fb4926ff76d56b2\n", 166 | "afdadbbb2cb94263efab62514826744a5cc809\n", 167 | "2e9ba71dff5aaeee0d8075bc9ab3b4b2dd629a\n", 168 | "55c9c636a1fa6beff97d46afdd2bfaf4b9f554\n", 169 | "3e3920e52311149e7cdfba4271be2c1c98a14d\n", 170 | "a75e75875cfc03fffe63129cb2710f696173a5\n", 171 | "2584557cf16e72ccd52fc174410e7bb6a06ea0\n", 172 | "3ad5f78fbde662c6bdbd5cf681d8e0cad32dc5\n", 173 | "51f4462cf1deb0f6a7eb7d98539d8ef68be5a7\n", 174 | "5c711695638c111465d42849808d2bc1a425da\n", 175 | "ac7ce433b26978079c2655ec15157542c19494\n", 176 | "40288205f74b655c829fc678b33b30959a326a\n", 177 | "a2582119cbc81247252e07cd7f904360c4772b\n", 178 | "f190376cfd6b0310ea7fc547abeb3f804ce1ea\n", 179 | "b55dd29ccf0ca873fc21f9e3617ec300e56cb5\n", 180 | "573270c75149539fcf04c9bcc413e58374a7a8\n", 181 | "d34ca5e45f3fc8bf19e8f2eae183093a61e8a2\n", 182 | "ef05199ea684c2fd98a7eb991f3fe482b54aa6\n", 183 | "d952c7f58decde8292f55f9ac811cb7b3e651e\n", 184 | "d873da07f944186d2697b30a63afa8622d6f2b\n", 185 | "6f364d3499cba7a58f168ff278ccd568a576c4\n", 186 | "2eb0b48154b27c68e427476cc7336e39710b92\n", 187 | "a23409bc932358b950308e991cb4db371f4351\n", 188 | "85501c06123c51221df3bc9cda3204c7bf33a7\n", 189 | "b21e89cb829783f9993dab2dbcc5cd560b3275\n", 190 | "02b5a224433fd30c85ab60079459b20aa9ed5d\n", 191 | "d385c5bb8672cfd868fb16ec71379cc04dbcd2\n", 192 | "36c73800d8d1ee67b2731e42a578e444bcba95\n", 193 | "6e2a75c7e6a509f4d228706c29cbb62edfcfdd\n", 194 | "c683e248c951811a59f539debc3a0c90a63580\n", 195 | "0d463eec5c32372101dc435e5d253bab903b23\n", 196 | "dcc681cc8d152d171e969d9d7d8e474424ff5d\n", 197 | "b2977e87dea6793957a3f0d0966ba73651f794\n", 198 | "36cd0448c045213c35f79be57a6dc5acc47deb\n", 199 | "800c2487a1c2d44e5252b77718cd4d87ad99a0\n", 200 | "d7303d15f0df0bd6a9d28e2039e7071ceb4a8b\n", 201 | "a6fa44366ec94abce55e460710e859d7df45e2\n", 202 | "cd12a7a3588627c434d683891ab8fcdaaa1f74\n", 203 | "d96abeba6d5e13c8374fe78607e06bc52f6afb\n", 204 | "966c952ea08cbb773865131f9f06a9b97a62ee\n", 205 | "ca30d1eaec6b80c5ee8d3df83b6fb00c81ab27\n", 206 | "31f0502924e1cfdc62159f43b725a613d4e27d\n", 207 | "597d24ca7dd5d46efcea359b178a4a97493f8f\n", 208 | "cc95e6fed3a563f6b12e2883760505d52cae8e\n", 209 | "1fccb903fb46e6e6855f22f90b31425f66f723\n", 210 | "5f052ee344ba3c1fb97655893efaae4dda4d0e\n", 211 | "2b486796dccc5ea2876068367a7c72011a61d0\n", 212 | "544e64b9fd3e9a025826d34b596264e58c1a78\n", 213 | "e4b1ab92c9f1026dd8ce53806d5c8e13ecf787\n", 214 | "8995527d7106738065c43853e7171001d9de97\n", 215 | "26dd87117e5c6c7979ab647f3e44a8d2ce585a\n", 216 | "a1641c1c47b5bb46d2f5a281e63dd2d5ee923f\n", 217 | "1a0d115b54b77637da6eac6342ce3fb5d5dbf0\n", 218 | "b218999a1d30670052633e242b3a445bc639ce\n", 219 | "85a2065895a2f7ab2768b64166239dd1f52c94\n", 220 | "e4398bc399b14110a7da9c97ef942f240eebe8\n", 221 | "ce5190b79c5c986380369c72dae66ad1770eb5\n", 222 | "4d4f444280d1fe8629648a1f0bc0a7f320e9fc\n", 223 | "master\n", 224 | "master\n", 225 | "code-checkpoint.ipynb\n", 226 | "1sherman_h_d_zhu_j_auth_service_productivity_management_impro.pdf\n", 227 | "data-2018-09-24.csv\n", 228 | "example.csv\n", 229 | "output.csv\n" 230 | ] 231 | } 232 | ], 233 | "source": [ 234 | "#Importing libraries\n", 235 | "import pandas as pd\n", 236 | "import numpy as np\n", 237 | "from scipy.optimize import fmin_slsqp\n", 238 | "import os\n", 239 | "import matplotlib.pyplot as plt\n", 240 | "#import seaborn as sns\n", 241 | "from pprint import pprint\n", 242 | "import random\n", 243 | "\n", 244 | "#Listing the existing files in the dir\n", 245 | "for root, dirs, files in os.walk(\".\"): \n", 246 | " for filename in files:\n", 247 | " print(filename)" 248 | ] 249 | }, 250 | { 251 | "cell_type": "code", 252 | "execution_count": 2, 253 | "metadata": {}, 254 | "outputs": [], 255 | "source": [ 256 | "#Loading df\n", 257 | "df = pd.read_csv('./files/data-2018-09-24.csv')\n", 258 | "df = df.drop(df.loc[:,['name', 'pft']].head(0).columns, axis=1)\n", 259 | "inpt_df = df.iloc[:, 1:6]\n", 260 | "inpt_arr = np.array(inpt_df)\n", 261 | "outpt_df = df.iloc[:, 6:]\n", 262 | "outpt_arr = np.array(outpt_df)\n", 263 | "comp = np.array(df.iloc[:, 0])" 264 | ] 265 | }, 266 | { 267 | "cell_type": "code", 268 | "execution_count": 7, 269 | "metadata": {}, 270 | "outputs": [ 271 | { 272 | "data": { 273 | "text/plain": [ 274 | "[]" 275 | ] 276 | }, 277 | "execution_count": 7, 278 | "metadata": {}, 279 | "output_type": "execute_result" 280 | }, 281 | { 282 | "data": { 283 | "image/png": "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\n", 284 | "text/plain": [ 285 | "
" 286 | ] 287 | }, 288 | "metadata": {}, 289 | "output_type": "display_data" 290 | } 291 | ], 292 | "source": [ 293 | "#For the article\n", 294 | "inputs = pd.DataFrame(inpt_df.iloc[:4,4])\n", 295 | "outputs = outpt_df.iloc[:4,0:2]\n", 296 | "l = []\n", 297 | "for col in inputs.columns:\n", 298 | " l.append(outputs.div(inputs[col], axis=0))\n", 299 | "complete = pd.concat(l, axis=1)\n", 300 | "complete.columns = ['y1', 'y2']\n", 301 | "completed = pd.DataFrame(df.iloc[:4, 0]).join(complete)\n", 302 | "\n", 303 | "#Plotting the graph\n", 304 | "p1 = sns.regplot(data = completed, x=\"y1\", y=\"y2\", fit_reg = False, marker=\"o\", color = 'black')\n", 305 | " \n", 306 | "# add annotations one by one with a loop\n", 307 | "for line in range(0,completed.shape[0]):\n", 308 | " p1.text(completed.y1[line]+0.2, completed.y2[line], completed.firm[line], horizontalalignment='left', size='medium', color='black', weight='semibold')\n", 309 | "\n", 310 | "p1.set_title('Efficient frontier')\n", 311 | "\n", 312 | "plt.plot([0, 4.938],[6.778,6.778], \"r--\")\n", 313 | "plt.plot([4.938, 6.058889],[6.778, 6.553333], \"r--\")\n", 314 | "plt.plot([6.058889, 6.058889],[6.553333, 0], \"r--\")\n", 315 | "plt.plot([0,5.8],[0,6.6] , \"b\")" 316 | ] 317 | }, 318 | { 319 | "cell_type": "code", 320 | "execution_count": 8, 321 | "metadata": {}, 322 | "outputs": [ 323 | { 324 | "ename": "NameError", 325 | "evalue": "name 'inpt_arr_2' is not defined", 326 | "output_type": "error", 327 | "traceback": [ 328 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", 329 | "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", 330 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0moutputss\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdf2\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0miloc\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[0mcomp_2\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdf2\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0miloc\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 5\u001b[1;33m \u001b[0ml\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minpt_arr_2\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 6\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mzeros\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minpt_arr_2\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfloat\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 331 | "\u001b[1;31mNameError\u001b[0m: name 'inpt_arr_2' is not defined" 332 | ] 333 | } 334 | ], 335 | "source": [ 336 | "df2 = pd.read_csv('./files/example.csv')\n", 337 | "inputss = pd.DataFrame(df2.iloc[:,1:3])\n", 338 | "outputss = pd.DataFrame(df2.iloc[:,3])\n", 339 | "comp_2 = np.array(df2.iloc[:, 0])\n", 340 | "l = range(inpt_arr_2.shape[1])\n", 341 | "np.zeros((inpt_arr_2.shape[1],1), dtype=np.float) " 342 | ] 343 | }, 344 | { 345 | "cell_type": "code", 346 | "execution_count": 43, 347 | "metadata": {}, 348 | "outputs": [ 349 | { 350 | "name": "stdout", 351 | "output_type": "stream", 352 | "text": [ 353 | "Optimization terminated successfully. (Exit mode 0)\n", 354 | " Current function value: 1.00000000438\n", 355 | " Iterations: 5\n", 356 | " Function evaluations: 40\n", 357 | " Gradient evaluations: 5\n", 358 | "Optimization terminated successfully. (Exit mode 0)\n", 359 | " Current function value: 0.444444444457\n", 360 | " Iterations: 9\n", 361 | " Function evaluations: 72\n", 362 | " Gradient evaluations: 9\n", 363 | "Optimization terminated successfully. (Exit mode 0)\n", 364 | " Current function value: 0.666666678013\n", 365 | " Iterations: 5\n", 366 | " Function evaluations: 40\n", 367 | " Gradient evaluations: 5\n", 368 | "---------------------------\n", 369 | "\n", 370 | "Efficient units:\n", 371 | "'A': 1.000000004375134\n", 372 | "\n", 373 | "\n", 374 | "Inefficient units:\n", 375 | "'C': 0.6666666780128222, 'B': 0.4444444444571152\n", 376 | "(array([0.34522801, 0.32736447]), array([0.2817355]))\n", 377 | "(array([0.34522801, 0.32736447]), array([0.2817355]))\n", 378 | "(array([0.34522801, 0.32736447]), array([0.2817355]))\n" 379 | ] 380 | } 381 | ], 382 | "source": [ 383 | "inpt_arr_2 = np.array(inputss)\n", 384 | "outpt_arr_2 = np.array(outputss)\n", 385 | "\n", 386 | "class DEA(object):\n", 387 | " random.seed(5)\n", 388 | " def __init__(self, inputs, outputs):\n", 389 | " \"\"\"\n", 390 | " Initialize the DEA object with input data\n", 391 | " n = number of entities (observations)\n", 392 | " m = number of inputs (variables, features)\n", 393 | " r = number of outputs\n", 394 | " :param inputs: inputs, n x m numpy array\n", 395 | " :param outputs: outputs, n x r numpy array\n", 396 | " :return: self\n", 397 | " \"\"\"\n", 398 | "\n", 399 | " # supplied data\n", 400 | " self.inputs = inputs\n", 401 | " self.outputs = outputs\n", 402 | "\n", 403 | " # parameters\n", 404 | " self.n = inputs.shape[0]\n", 405 | " self.m = inputs.shape[1]\n", 406 | " self.r = outputs.shape[1]\n", 407 | "\n", 408 | " # iterators\n", 409 | " self.unit_ = range(self.n)\n", 410 | " self.input_ = range(self.m)\n", 411 | " self.output_ = range(self.r)\n", 412 | "\n", 413 | " # result arrays\n", 414 | " self.output_w = np.zeros((self.r, 1), dtype=np.float) # output weights\n", 415 | " self.input_w = np.zeros((self.m, 1), dtype=np.float) # input weights\n", 416 | " self.lambdas = np.zeros((self.n, 1), dtype=np.float) # unit efficiencies\n", 417 | " self.efficiency = np.zeros_like(self.lambdas) # thetas\n", 418 | "\n", 419 | " # names\n", 420 | " self.names = []\n", 421 | "\n", 422 | " def __efficiency(self, unit):\n", 423 | " \"\"\"\n", 424 | " Efficiency function with already computed weights\n", 425 | " :param unit: which unit to compute for\n", 426 | " :return: efficiency\n", 427 | " \"\"\"\n", 428 | "\n", 429 | " # compute efficiency\n", 430 | " denominator = np.dot(self.inputs, self.input_w)\n", 431 | " numerator = np.dot(self.outputs, self.output_w)\n", 432 | "\n", 433 | " return (numerator/denominator)[unit]\n", 434 | "\n", 435 | " def __target(self, x, unit):\n", 436 | " \"\"\"\n", 437 | " Theta target function for one unit\n", 438 | " :param x: combined weights\n", 439 | " :param unit: which production unit to compute\n", 440 | " :return: theta\n", 441 | " \"\"\"\n", 442 | " in_w, out_w, lambdas = x[:self.m], x[self.m:(self.m+self.r)], x[(self.m+self.r):] # unroll the weights\n", 443 | " denominator = np.dot(self.inputs[unit], in_w)\n", 444 | " numerator = np.dot(self.outputs[unit], out_w)\n", 445 | "\n", 446 | " return numerator/denominator\n", 447 | "\n", 448 | " def __constraints(self, x, unit):\n", 449 | " \"\"\"\n", 450 | " Constraints for optimization for one unit\n", 451 | " :param x: combined weights\n", 452 | " :param unit: which production unit to compute\n", 453 | " :return: array of constraints\n", 454 | " \"\"\"\n", 455 | "\n", 456 | " in_w, out_w, lambdas = x[:self.m], x[self.m:(self.m+self.r)], x[(self.m+self.r):] # unroll the weights\n", 457 | " constr = [] # init the constraint array\n", 458 | "\n", 459 | " # for each input, lambdas with inputs\n", 460 | " for input in self.input_:\n", 461 | " t = self.__target(x, unit)\n", 462 | " lhs = np.dot(self.inputs[:, input], lambdas)\n", 463 | " cons = t*self.inputs[unit, input] - lhs\n", 464 | " constr.append(cons)\n", 465 | "\n", 466 | " # for each output, lambdas with outputs\n", 467 | " for output in self.output_:\n", 468 | " lhs = np.dot(self.outputs[:, output], lambdas)\n", 469 | " cons = lhs - self.outputs[unit, output]\n", 470 | " constr.append(cons)\n", 471 | "\n", 472 | " # for each unit\n", 473 | " for u in self.unit_:\n", 474 | " constr.append(lambdas[u])\n", 475 | "\n", 476 | " return np.array(constr)\n", 477 | "\n", 478 | " def __optimize(self):\n", 479 | " \"\"\"\n", 480 | " Optimization of the DEA model\n", 481 | " Use: http://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.optimize.linprog.html\n", 482 | " A = coefficients in the constraints\n", 483 | " b = rhs of constraints\n", 484 | " c = coefficients of the target function\n", 485 | " :return:\n", 486 | " \"\"\"\n", 487 | " d0 = self.m + self.r + self.n\n", 488 | " # iterate over units\n", 489 | " for unit in self.unit_:\n", 490 | " # weights\n", 491 | " x0 = np.random.rand(d0) - 0.5\n", 492 | " x0 = fmin_slsqp(self.__target, x0, f_ieqcons=self.__constraints, args=(unit,))\n", 493 | " # unroll weights\n", 494 | " self.input_w, self.output_w, self.lambdas = x0[:self.m], x0[self.m:(self.m+self.r)], x0[(self.m+self.r):]\n", 495 | " self.efficiency[unit] = self.__efficiency(unit)\n", 496 | "\n", 497 | " def name_units(self, names):\n", 498 | " \"\"\"\n", 499 | " Provide names for units for presentation purposes\n", 500 | " :param names: a list of names, equal in length to the number of units\n", 501 | " :return: nothing\n", 502 | " \"\"\"\n", 503 | "\n", 504 | " assert(self.n == len(names))\n", 505 | "\n", 506 | " self.names = names\n", 507 | "\n", 508 | " def fit(self):\n", 509 | " \"\"\"\n", 510 | " Optimize the dataset, generate basic table\n", 511 | " :return: table\n", 512 | " \"\"\"\n", 513 | "\n", 514 | " self.__optimize() # optimize\n", 515 | " print(\"---------------------------\\n\") \n", 516 | "\n", 517 | " m = {}\n", 518 | " l = {} \n", 519 | " for n, eff in enumerate(self.efficiency): \n", 520 | " if eff >= 1.:\n", 521 | " m.update({self.names[n]: eff[0]}) \n", 522 | " else:\n", 523 | " l.update({self.names[n]: eff[0]}) \n", 524 | " print(\"Efficient units:\") \n", 525 | " print(str(m).replace(\"{\",\"\").replace(\"}\", \"\")) \n", 526 | " print(\"\\n\") \n", 527 | " print(\"Inefficient units:\")\n", 528 | " print(str(l).replace(\"{\",\"\").replace(\"}\", \"\")) \n", 529 | " for n in enumerate(self.efficiency):\n", 530 | " print(self.input_w, self.output_w)\n", 531 | " \n", 532 | "\n", 533 | "\n", 534 | "dea = DEA(inpt_arr_2, outpt_arr_2)\n", 535 | "dea.name_units(comp_2)\n", 536 | "dea.fit()\n" 537 | ] 538 | }, 539 | { 540 | "cell_type": "code", 541 | "execution_count": 36, 542 | "metadata": {}, 543 | "outputs": [ 544 | { 545 | "name": "stdout", 546 | "output_type": "stream", 547 | "text": [ 548 | "Optimization terminated successfully. (Exit mode 0)\n", 549 | " Current function value: 1.00000003588\n", 550 | " Iterations: 18\n", 551 | " Function evaluations: 650\n", 552 | " Gradient evaluations: 18\n", 553 | "Optimization terminated successfully. (Exit mode 0)\n", 554 | " Current function value: 0.966316603098\n", 555 | " Iterations: 14\n", 556 | " Function evaluations: 504\n", 557 | " Gradient evaluations: 14\n", 558 | "Optimization terminated successfully. (Exit mode 0)\n", 559 | " Current function value: 0.99581214551\n", 560 | " Iterations: 20\n", 561 | " Function evaluations: 722\n", 562 | " Gradient evaluations: 20\n", 563 | "Optimization terminated successfully. (Exit mode 0)\n", 564 | " Current function value: 0.932140293891\n", 565 | " Iterations: 15\n", 566 | " Function evaluations: 540\n", 567 | " Gradient evaluations: 15\n", 568 | "Optimization terminated successfully. (Exit mode 0)\n", 569 | " Current function value: 1.00000000444\n", 570 | " Iterations: 8\n", 571 | " Function evaluations: 288\n", 572 | " Gradient evaluations: 8\n", 573 | "Optimization terminated successfully. (Exit mode 0)\n", 574 | " Current function value: 0.928787206476\n", 575 | " Iterations: 9\n", 576 | " Function evaluations: 324\n", 577 | " Gradient evaluations: 9\n", 578 | "Optimization terminated successfully. (Exit mode 0)\n", 579 | " Current function value: 0.922897920306\n", 580 | " Iterations: 12\n", 581 | " Function evaluations: 432\n", 582 | " Gradient evaluations: 12\n", 583 | "Optimization terminated successfully. (Exit mode 0)\n", 584 | " Current function value: 1.00000001492\n", 585 | " Iterations: 10\n", 586 | " Function evaluations: 360\n", 587 | " Gradient evaluations: 10\n", 588 | "Optimization terminated successfully. (Exit mode 0)\n", 589 | " Current function value: 0.871090264284\n", 590 | " Iterations: 18\n", 591 | " Function evaluations: 648\n", 592 | " Gradient evaluations: 18\n", 593 | "Optimization terminated successfully. (Exit mode 0)\n", 594 | " Current function value: 1.00000015567\n", 595 | " Iterations: 17\n", 596 | " Function evaluations: 612\n", 597 | " Gradient evaluations: 17\n", 598 | "Optimization terminated successfully. (Exit mode 0)\n", 599 | " Current function value: 1.0000000317\n", 600 | " Iterations: 14\n", 601 | " Function evaluations: 504\n", 602 | " Gradient evaluations: 14\n", 603 | "Optimization terminated successfully. (Exit mode 0)\n", 604 | " Current function value: 0.974436819017\n", 605 | " Iterations: 14\n", 606 | " Function evaluations: 504\n", 607 | " Gradient evaluations: 14\n", 608 | "Optimization terminated successfully. (Exit mode 0)\n", 609 | " Current function value: 0.873789625393\n", 610 | " Iterations: 14\n", 611 | " Function evaluations: 505\n", 612 | " Gradient evaluations: 14\n", 613 | "Optimization terminated successfully. (Exit mode 0)\n", 614 | " Current function value: 0.984484190762\n", 615 | " Iterations: 9\n", 616 | " Function evaluations: 324\n", 617 | " Gradient evaluations: 9\n", 618 | "Optimization terminated successfully. (Exit mode 0)\n", 619 | " Current function value: 0.999999999517\n", 620 | " Iterations: 6\n", 621 | " Function evaluations: 216\n", 622 | " Gradient evaluations: 6\n", 623 | "Optimization terminated successfully. (Exit mode 0)\n", 624 | " Current function value: 1.00000000023\n", 625 | " Iterations: 12\n", 626 | " Function evaluations: 432\n", 627 | " Gradient evaluations: 12\n", 628 | "Optimization terminated successfully. (Exit mode 0)\n", 629 | " Current function value: 1.00000000005\n", 630 | " Iterations: 6\n", 631 | " Function evaluations: 217\n", 632 | " Gradient evaluations: 6\n", 633 | "Optimization terminated successfully. (Exit mode 0)\n", 634 | " Current function value: 1.0\n", 635 | " Iterations: 9\n", 636 | " Function evaluations: 325\n", 637 | " Gradient evaluations: 9\n", 638 | "Optimization terminated successfully. (Exit mode 0)\n", 639 | " Current function value: 0.982341644768\n", 640 | " Iterations: 18\n", 641 | " Function evaluations: 648\n", 642 | " Gradient evaluations: 18\n", 643 | "Optimization terminated successfully. (Exit mode 0)\n", 644 | " Current function value: 1.00000000082\n", 645 | " Iterations: 7\n", 646 | " Function evaluations: 252\n", 647 | " Gradient evaluations: 7\n", 648 | "Optimization terminated successfully. (Exit mode 0)\n", 649 | " Current function value: 1.00000000023\n", 650 | " Iterations: 10\n", 651 | " Function evaluations: 360\n", 652 | " Gradient evaluations: 10\n", 653 | "Optimization terminated successfully. (Exit mode 0)\n", 654 | " Current function value: 1.00000042344\n", 655 | " Iterations: 7\n", 656 | " Function evaluations: 252\n", 657 | " Gradient evaluations: 7\n", 658 | "Optimization terminated successfully. (Exit mode 0)\n", 659 | " Current function value: 0.982558049119\n", 660 | " Iterations: 22\n", 661 | " Function evaluations: 793\n", 662 | " Gradient evaluations: 22\n", 663 | "Optimization terminated successfully. (Exit mode 0)\n", 664 | " Current function value: 0.999999999995\n", 665 | " Iterations: 6\n", 666 | " Function evaluations: 217\n", 667 | " Gradient evaluations: 6\n", 668 | "Optimization terminated successfully. (Exit mode 0)\n", 669 | " Current function value: 0.984999924808\n", 670 | " Iterations: 15\n", 671 | " Function evaluations: 540\n", 672 | " Gradient evaluations: 15\n", 673 | "Optimization terminated successfully. (Exit mode 0)\n", 674 | " Current function value: 0.956899154838\n", 675 | " Iterations: 18\n", 676 | " Function evaluations: 649\n", 677 | " Gradient evaluations: 18\n", 678 | "---------------------------\n", 679 | "\n", 680 | "Efficient units:\n", 681 | "'A': 1.0000000358829255, 'E': 1.0000000044424062, 'H': 1.0000000149214712, 'K': 1.0000000316962117, 'J': 1.0000001556692342, 'Q': 1.0000000000484728, 'P': 1.0000000002282767, 'R': 1.0000000000013682, 'U': 1.0000000002335174, 'T': 1.0000000008183176, 'V': 1.0000004234448105\n", 682 | "\n", 683 | "\n", 684 | "Inefficient units:\n", 685 | "'C': 0.9958121455099681, 'B': 0.9663166030979251, 'D': 0.9321402938915002, 'G': 0.9228979203055871, 'F': 0.9287872064756271, 'I': 0.8710902642835067, 'M': 0.8737896253930998, 'L': 0.9744368190168068, 'O': 0.9999999995173697, 'N': 0.9844841907617617, 'S': 0.9823416447678736, 'W': 0.9825580491186346, 'Y': 0.9849999248084184, 'X': 0.9999999999952303, 'Z': 0.9568991548383973\n" 686 | ] 687 | } 688 | ], 689 | "source": [ 690 | "#Calculating DEA\n", 691 | "class DEA(object):\n", 692 | "\n", 693 | " def __init__(self, inputs, outputs):\n", 694 | " \"\"\"\n", 695 | " Initialize the DEA object with input data\n", 696 | " n = number of entities (observations)\n", 697 | " m = number of inputs (variables, features)\n", 698 | " r = number of outputs\n", 699 | " :param inputs: inputs, n x m numpy array\n", 700 | " :param outputs: outputs, n x r numpy array\n", 701 | " :return: self\n", 702 | " \"\"\"\n", 703 | "\n", 704 | " # supplied data\n", 705 | " self.inputs = inputs\n", 706 | " self.outputs = outputs\n", 707 | "\n", 708 | " # parameters\n", 709 | " self.n = inputs.shape[0]\n", 710 | " self.m = inputs.shape[1]\n", 711 | " self.r = outputs.shape[1]\n", 712 | "\n", 713 | " # iterators\n", 714 | " self.unit_ = range(self.n)\n", 715 | " self.input_ = range(self.m)\n", 716 | " self.output_ = range(self.r)\n", 717 | "\n", 718 | " # result arrays\n", 719 | " self.output_w = np.zeros((self.r, 1), dtype=np.float) # output weights\n", 720 | " self.input_w = np.zeros((self.m, 1), dtype=np.float) # input weights\n", 721 | " self.lambdas = np.zeros((self.n, 1), dtype=np.float) # unit efficiencies\n", 722 | " self.efficiency = np.zeros_like(self.lambdas) # thetas\n", 723 | "\n", 724 | " # names\n", 725 | " self.names = []\n", 726 | "\n", 727 | " def __efficiency(self, unit):\n", 728 | " \"\"\"\n", 729 | " Efficiency function with already computed weights\n", 730 | " :param unit: which unit to compute for\n", 731 | " :return: efficiency\n", 732 | " \"\"\"\n", 733 | "\n", 734 | " # compute efficiency\n", 735 | " denominator = np.dot(self.inputs, self.input_w)\n", 736 | " numerator = np.dot(self.outputs, self.output_w)\n", 737 | "\n", 738 | " return (numerator/denominator)[unit]\n", 739 | "\n", 740 | " def __target(self, x, unit):\n", 741 | " \"\"\"\n", 742 | " Theta target function for one unit\n", 743 | " :param x: combined weights\n", 744 | " :param unit: which production unit to compute\n", 745 | " :return: theta\n", 746 | " \"\"\"\n", 747 | " in_w, out_w, lambdas = x[:self.m], x[self.m:(self.m+self.r)], x[(self.m+self.r):] # unroll the weights\n", 748 | " denominator = np.dot(self.inputs[unit], in_w)\n", 749 | " numerator = np.dot(self.outputs[unit], out_w)\n", 750 | "\n", 751 | " return numerator/denominator\n", 752 | "\n", 753 | " def __constraints(self, x, unit):\n", 754 | " \"\"\"\n", 755 | " Constraints for optimization for one unit\n", 756 | " :param x: combined weights\n", 757 | " :param unit: which production unit to compute\n", 758 | " :return: array of constraints\n", 759 | " \"\"\"\n", 760 | "\n", 761 | " in_w, out_w, lambdas = x[:self.m], x[self.m:(self.m+self.r)], x[(self.m+self.r):] # unroll the weights\n", 762 | " constr = [] # init the constraint array\n", 763 | "\n", 764 | " # for each input, lambdas with inputs\n", 765 | " for input in self.input_:\n", 766 | " t = self.__target(x, unit)\n", 767 | " lhs = np.dot(self.inputs[:, input], lambdas)\n", 768 | " cons = t*self.inputs[unit, input] - lhs\n", 769 | " constr.append(cons)\n", 770 | "\n", 771 | " # for each output, lambdas with outputs\n", 772 | " for output in self.output_:\n", 773 | " lhs = np.dot(self.outputs[:, output], lambdas)\n", 774 | " cons = lhs - self.outputs[unit, output]\n", 775 | " constr.append(cons)\n", 776 | "\n", 777 | " # for each unit\n", 778 | " for u in self.unit_:\n", 779 | " constr.append(lambdas[u])\n", 780 | "\n", 781 | " return np.array(constr)\n", 782 | "\n", 783 | " def __optimize(self):\n", 784 | " \"\"\"\n", 785 | " Optimization of the DEA model\n", 786 | " Use: http://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.optimize.linprog.html\n", 787 | " A = coefficients in the constraints\n", 788 | " b = rhs of constraints\n", 789 | " c = coefficients of the target function\n", 790 | " :return:\n", 791 | " \"\"\"\n", 792 | " d0 = self.m + self.r + self.n\n", 793 | " # iterate over units\n", 794 | " for unit in self.unit_:\n", 795 | " # weights\n", 796 | " x0 = np.random.rand(d0) - 0.5\n", 797 | " x0 = fmin_slsqp(self.__target, x0, f_ieqcons=self.__constraints, args=(unit,))\n", 798 | " # unroll weights\n", 799 | " self.input_w, self.output_w, self.lambdas = x0[:self.m], x0[self.m:(self.m+self.r)], x0[(self.m+self.r):]\n", 800 | " self.efficiency[unit] = self.__efficiency(unit)\n", 801 | "\n", 802 | " def name_units(self, names):\n", 803 | " \"\"\"\n", 804 | " Provide names for units for presentation purposes\n", 805 | " :param names: a list of names, equal in length to the number of units\n", 806 | " :return: nothing\n", 807 | " \"\"\"\n", 808 | "\n", 809 | " assert(self.n == len(names))\n", 810 | "\n", 811 | " self.names = names\n", 812 | "\n", 813 | " def fit(self):\n", 814 | " \"\"\"\n", 815 | " Optimize the dataset, generate basic table\n", 816 | " :return: table\n", 817 | " \"\"\"\n", 818 | "\n", 819 | " self.__optimize() # optimize\n", 820 | " print(\"---------------------------\\n\") \n", 821 | "\n", 822 | " m = {}\n", 823 | " l = {} \n", 824 | " for n, eff in enumerate(self.efficiency): \n", 825 | " if eff >= 1.:\n", 826 | " m.update({self.names[n]: eff[0]}) \n", 827 | " else:\n", 828 | " l.update({self.names[n]: eff[0]}) \n", 829 | " print(\"Efficient units:\") \n", 830 | " print(str(m).replace(\"{\",\"\").replace(\"}\", \"\")) \n", 831 | " print(\"\\n\") \n", 832 | " print(\"Inefficient units:\")\n", 833 | " print(str(l).replace(\"{\",\"\").replace(\"}\", \"\")) \n", 834 | " \n", 835 | "\n", 836 | "dea = DEA(inpt_arr,outpt_arr)\n", 837 | "dea.name_units(comp)\n", 838 | "dea.fit()" 839 | ] 840 | }, 841 | { 842 | "cell_type": "code", 843 | "execution_count": 22, 844 | "metadata": {}, 845 | "outputs": [], 846 | "source": [ 847 | "#Calculation efficiency by dividing output by input to be used for the graph\n", 848 | "frst = outpt_df.div(inpt_df.x1, axis = 0)\n", 849 | "frst.columns = ['y1-x1', 'y2-x1', 'y3-x1']\n", 850 | "sec = outpt_df.div(inpt_df.x2, axis = 0)\n", 851 | "sec.columns = ['y1-x2', 'y2-x2', 'y3-x2']\n", 852 | "th = outpt_df.div(inpt_df.x3, axis = 0)\n", 853 | "th.columns = ['y1-x3', 'y2-x3', 'y3-x3']\n", 854 | "fo = outpt_df.div(inpt_df.x4, axis = 0)\n", 855 | "fo.columns = ['y1-x4', 'y2-x4', 'y3-x4']\n", 856 | "fi = outpt_df.div(inpt_df.x5, axis = 0)\n", 857 | "fi.columns = ['y1-x5', 'y2-x5', 'y3-x5']\n", 858 | "complete = pd.DataFrame(df.iloc[:,0]).join(frst).join(sec).join(th).join(fo).join(fi)" 859 | ] 860 | }, 861 | { 862 | "cell_type": "code", 863 | "execution_count": null, 864 | "metadata": {}, 865 | "outputs": [], 866 | "source": [ 867 | "#Building a graph\n", 868 | "eff = ['y1-x1', 'y2-x1', 'y3-x1', 'y1-x2', 'y2-x2', 'y3-x2',\n", 869 | " 'y1-x3', 'y2-x3', 'y3-x3', 'y1-x4', 'y2-x4', 'y3-x4', 'y1-x5',\n", 870 | " 'y2-x5', 'y3-x5']\n", 871 | "x = [i for i, _ in enumerate(eff)]\n", 872 | "\n", 873 | "min_max_range = {}\n", 874 | "for e in eff:\n", 875 | " min_max_range[e] = [complete[e].min(), complete[e].max(), np.ptp(complete[e])]\n", 876 | " complete[e] = np.true_divide(complete[e] - complete[e].min(), np.ptp(complete[e]))\n", 877 | " \n", 878 | "fig, axes = plt.subplots(1, len(x)-1, sharey = False, figsize = (50,10), gridspec_kw = {'wspace':0, 'hspace':0}) \n", 879 | "\n", 880 | "# Plot each row\n", 881 | "for i, ax in enumerate(axes):\n", 882 | " for idx in complete.index:\n", 883 | " ax.plot(x, complete.loc[idx, eff], color='gray') \n", 884 | " ax.set_xlim([x[i], x[i+1]])\n", 885 | "\n", 886 | "plt.title(\"Efficiency by a firm\")\n", 887 | "plt.show()" 888 | ] 889 | }, 890 | { 891 | "cell_type": "code", 892 | "execution_count": 97, 893 | "metadata": {}, 894 | "outputs": [], 895 | "source": [ 896 | "firms = ['1', '2', '3']\n", 897 | "df = pd.DataFrame(firms)\n", 898 | "output = { 'firms': ['1', '2', '3'],\n", 899 | "'Sales': [150, 200, 50],\n", 900 | "'Profit':[200, 210, 90],\n", 901 | "'Sth':[1, 2, 3]}\n", 902 | "df1 = pd.DataFrame.from_dict(output)\n", 903 | "inputs = { 'firms': ['1', '2', '3'],\n", 904 | "'Salary': [10000, 20000, 500],\n", 905 | "'employees':[2, 4, 5]}\n", 906 | "df2 = pd.DataFrame.from_dict(inputs)" 907 | ] 908 | }, 909 | { 910 | "cell_type": "code", 911 | "execution_count": null, 912 | "metadata": {}, 913 | "outputs": [], 914 | "source": [ 915 | "complete.to_csv('./files/output.csv')" 916 | ] 917 | } 918 | ], 919 | "metadata": { 920 | "kernelspec": { 921 | "display_name": "Python 3", 922 | "language": "python", 923 | "name": "python3" 924 | }, 925 | "language_info": { 926 | "codemirror_mode": { 927 | "name": "ipython", 928 | "version": 3 929 | }, 930 | "file_extension": ".py", 931 | "mimetype": "text/x-python", 932 | "name": "python", 933 | "nbconvert_exporter": "python", 934 | "pygments_lexer": "ipython3", 935 | "version": "3.7.0" 936 | } 937 | }, 938 | "nbformat": 4, 939 | "nbformat_minor": 2 940 | } 941 | -------------------------------------------------------------------------------- /files/1sherman_h_d_zhu_j_auth_service_productivity_management_impro.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eponkratova/data_envelopment_analysis/649dbd7c8b46e81860a9eb043d3ce1f4aacab2c4/files/1sherman_h_d_zhu_j_auth_service_productivity_management_impro.pdf -------------------------------------------------------------------------------- /files/data-2018-09-24.csv: -------------------------------------------------------------------------------- 1 | dmu,x1,x2,x3,x4,x5,y1,y2,y3,pft,name 2 | A,86.13,16.24,48.21,49.69,9,54.53,58.98,38.16,1,Berkely 3 | B,29.26,10.24,41.96,40.65,5,24.69,33.89,26.02,1,Buffalo 4 | C,43.12,11.31,38.19,35.03,9,36.41,40.62,28.51,1,Duluth 5 | D,24.96,6.14,24.81,25.15,7,14.94,17.58,16.19,1,Fresno 6 | E,11.62,2.21,6.85,6.37,4,7.81,6.94,5.37,1,Lebanon 7 | F,11.88,4.97,18.73,18.04,4,12.59,16.85,12.84,1,Salt Lake 8 | G,32.64,6.88,28.1,25.45,7,17.06,16.99,17.82,1,Tacoma 9 | H,20.79,12.97,54.85,52.07,8,20.29,30.64,33.16,1,Baltimore 10 | I,34.4,11.04,38.16,42.4,8,26.13,29.8,26.29,1,Lakewood 11 | J,61.74,14.5,49.09,42.92,9,46.42,51.59,35.2,1,Lincoln 12 | K,52.92,11.67,39.48,39.64,5,39.8,37.73,30.29,1,Wichita 13 | L,36,10.15,37.8,39.52,5,37.84,47.85,25.35,1,New York 14 | M,39.2,10.8,41.04,41.12,7,26.48,31.36,26.54,1,Philidelphia 15 | N,14.6,2.88,9.64,11.14,3,10.31,10.86,7.47,1,Brattleboro 16 | O,4.29,5.42,21.45,17.27,5,14.39,18.3,14.33,1,Fall River 17 | P,27.25,14.17,56.46,55.26,9,32.94,36.03,38.19,1,Wilmington 18 | Q,22.63,4.43,15.4,15,2,17.25,20.8,12.07,1,New York 19 | R,28,7.61,28.73,27.04,9,27.55,38.19,20.44,1,E. St. Loius 20 | S,53.56,13.7,53.04,49.85,7,41.12,43.8,36.54,1,Grand Rapids 21 | T,25.42,9.05,29.69,31.74,4,29.43,42.63,23.34,1,Racine 22 | U,31.57,10.08,39.34,40.57,6,37.46,51.02,27.44,1,Flint 23 | V,16.34,5.84,20.89,22.1,4,19.4,25.18,16.52,1,New York 24 | W,44.28,14.14,56.7,52.27,11,39.88,47.72,38.97,1,Philidelphia 25 | X,19.74,6.43,24.2,25.66,3,25.72,30.81,16.54,1,Portageville 26 | Y,24.4,8.05,33.42,31.29,7,24.88,25.27,22.43,1,Kansas City 27 | Z,41.4,11.7,44.01,46.35,7,31.62,40.78,31.16,1,Lousville 28 | -------------------------------------------------------------------------------- /files/data-2018-09-24.reduced.csv: -------------------------------------------------------------------------------- 1 | dmu,x1,x2,x3,x4,x5,y1,y2,y3,pft,name 2 | A,86.13,16.24,48.21,49.69,9,54.53,58.98,38.16,1,Berkely 3 | B,29.26,10.24,41.96,40.65,5,24.69,33.89,26.02,1,Buffalo 4 | C,43.12,11.31,38.19,35.03,9,36.41,40.62,28.51,1,Duluth 5 | D,24.96,6.14,24.81,25.15,7,14.94,17.58,16.19,1,Fresno 6 | E,11.62,2.21,6.85,6.37,4,7.81,6.94,5.37,1,Lebanon 7 | -------------------------------------------------------------------------------- /files/example.csv: -------------------------------------------------------------------------------- 1 | <<<<<<< HEAD 2 | firm,x4,x5,y1 3 | A,1,2,6 4 | B,2,3,4 5 | C,3,2,4 6 | ======= 7 | firm,x4,x5,y1 8 | A,1,2,6 9 | B,2,3,4 10 | C,3,2,4 11 | >>>>>>> 8b8ed6c895f3e3d3d77bc7fd7b5073581b2e52a0 12 | -------------------------------------------------------------------------------- /files/output.csv: -------------------------------------------------------------------------------- 1 | <<<<<<< HEAD 2 | firm,y1-x1,y2-x1,y3-x1,y1-x2,y2-x2,y3-x2,y1-x3,y2-x3,y3-x3,y1-x4,y2-x4,y3-x4,y1-x5,y2-x5,y3-x5 3 | A,0.039002535,0.043856547,0,0.736313052,0.470298641,0,0.988246531,0.757827316,1,0.84617767,0.726436157,0.663390627,0.615419841,0.540020547,0.614462941 4 | B,0.113412165,0.170273496,0.154012789,0.347654086,0.350925843,0.399283024,0.283681682,0.283918333,0.083199171,0.260299411,0.297681392,0.089929159,0.447433496,0.565200336,0.818895133 5 | C,0.113614759,0.112542583,0.075286915,0.679455412,0.4553822,0.357034621,0.757532784,0.57569747,0.759296572,0.776821308,0.693202518,0.869306616,0.31368386,0.311385075,0.387080432 6 | D,0.026799347,0.049076045,0.070958611,0.356724441,0.185547518,0.599261118,0.301545225,0.170960995,0.256721507,0.244344823,0.134197744,0.106250742,0.027244019,0.087019173,0.205780329 7 | E,0.052776988,0.020484625,0.006586551,0.808646989,0.28820244,0.167240737,1,0.518140201,0.959378251,1,0.608126155,1,0,0,0 8 | F,0.18967545,0.239725904,0.220122994,0.397771243,0.380850909,0.487976531,0.392436647,0.38874041,0.433060865,0.368518412,0.419457705,0.411291851,0.179093293,0.277668815,0.396034355 9 | G,0,0,0.035517745,0.375785868,0.039680158,0.501786735,0.307960073,0.052451832,0.158337534,0.335567852,0.096059675,0.359467135,0.072632875,0.077572749,0.255161549 10 | H,0.160076239,0.25452757,0.397596479,0,0,0.431961882,0,0,0,0,0,0.075293039,0.08748595,0.234799664,0.594316615 11 | I,0.083669318,0.09231855,0.110860367,0.329471868,0.124818089,0.065941544,0.408749693,0.253422602,0.451298548,0.270932598,0.138839281,0,0.196890221,0.223031662,0.412204432 12 | J,0.080939321,0.084127238,0.043862459,0.672107935,0.442940835,0.162485032,0.747430794,0.561217276,0.601630911,0.827219046,0.744696062,0.897367513,0.480371342,0.447993524,0.544716597 13 | K,0.081015587,0.051381936,0.044635799,0.757948414,0.322585616,0.513118048,0.828569448,0.452632394,0.869968839,0.734546296,0.441038698,0.646194285,0.900337205,0.651274867,1 14 | L,0.186619555,0.215913203,0.090124497,0.888356514,0.871357879,0.308515884,0.819419991,0.806247616,0.353392552,0.678894815,0.755347211,0.095979237,0.84158861,0.87811712,0.79047821 15 | M,0.053975291,0.074621514,0.080761959,0.364372223,0.200556604,0.22474049,0.357434686,0.234282787,0.225310025,0.304045408,0.211438809,0.113832318,0.274313547,0.307649201,0.519335929 16 | N,0.06480088,0.059625179,0.023674877,0.82750233,0.52181886,0.509372579,0.908281823,0.647431595,0.911002051,0.640639826,0.469013728,0.226533041,0.222430373,0.211263659,0.243346411 17 | O,1,1,1,0.447771785,0.375679512,0.61409081,0.390721322,0.335755665,0.339649561,0.530336403,0.571907604,0.940567272,0.138703634,0.215746708,0.323083448 18 | P,0.242310315,0.214053538,0.330799335,0.312138164,0.066807049,0.721017079,0.277195747,0.090668551,0.384268487,0.246802307,0.07715622,0.318654677,0.255901087,0.254226207,0.61516983 19 | Q,0.084612044,0.106431207,0.031171217,0.95644034,0.864308905,0.782548566,0.974012741,0.902889377,0.958440328,0.909062182,0.968825118,0.828012804,1,0.971140375,0.995122468 20 | R,0.162893897,0.225194907,0.099040921,0.844079386,0.984027802,0.701829716,0.764721577,0.878520632,0.571687083,0.752270786,1,0.609372755,0.166146289,0.281124498,0.196927391 21 | S,0.086545423,0.079367435,0.082551476,0.59002641,0.309249493,0.662611048,0.52626752,0.304572019,0.451152689,0.520338455,0.352218154,0.506585495,0.587753573,0.506824641,0.822288198 22 | T,0.224279237,0.308794389,0.163989763,0.692864201,0.869954289,0.478591656,0.806676546,1,0.971046226,0.642705193,0.915947623,0.5171284,0.810041214,1,0.952709151 23 | U,0.234456984,0.292524332,0.147079024,0.883508067,1,0.777574292,0.756001484,0.841615851,0.497119687,0.638067653,0.812149465,0.252569592,0.64306232,0.75856916,0.685151804 24 | V,0.234704535,0.272475361,0.196034095,0.721597783,0.722183368,1,0.725442374,0.73726672,0.996106379,0.5836502,0.668672041,0.571672785,0.434245036,0.511067526,0.591135617 25 | W,0.133477655,0.14876626,0.150841766,0.515674889,0.375101339,0.848113219,0.432901686,0.322618431,0.442529054,0.44631445,0.393868248,0.562885069,0.250723798,0.291754757,0.466594693 26 | X,0.275552829,0.27775854,0.136280258,1,0.900002687,0.464629079,0.899593282,0.814532263,0.422042743,0.732516079,0.7431155,0.110042487,0.992256775,0.956570468,0.884494398 27 | Y,0.175516812,0.137543462,0.164365161,0.626659117,0.28777969,0.911418518,0.486279934,0.225164802,0.356174019,0.484790041,0.266008073,0.434123838,0.240057807,0.210142897,0.394822546 28 | Z,0.085143761,0.124024428,0.106861029,0.467307895,0.416094828,0.654457996,0.452534969,0.419498078,0.553339902,0.349755769,0.353664292,0.234245424,0.384360113,0.458471761,0.659299877 29 | ======= 30 | firm,y1-x1,y2-x1,y3-x1,y1-x2,y2-x2,y3-x2,y1-x3,y2-x3,y3-x3,y1-x4,y2-x4,y3-x4,y1-x5,y2-x5,y3-x5 31 | A,0.039002535,0.043856547,0,0.736313052,0.470298641,0,0.988246531,0.757827316,1,0.84617767,0.726436157,0.663390627,0.615419841,0.540020547,0.614462941 32 | B,0.113412165,0.170273496,0.154012789,0.347654086,0.350925843,0.399283024,0.283681682,0.283918333,0.083199171,0.260299411,0.297681392,0.089929159,0.447433496,0.565200336,0.818895133 33 | C,0.113614759,0.112542583,0.075286915,0.679455412,0.4553822,0.357034621,0.757532784,0.57569747,0.759296572,0.776821308,0.693202518,0.869306616,0.31368386,0.311385075,0.387080432 34 | D,0.026799347,0.049076045,0.070958611,0.356724441,0.185547518,0.599261118,0.301545225,0.170960995,0.256721507,0.244344823,0.134197744,0.106250742,0.027244019,0.087019173,0.205780329 35 | E,0.052776988,0.020484625,0.006586551,0.808646989,0.28820244,0.167240737,1,0.518140201,0.959378251,1,0.608126155,1,0,0,0 36 | F,0.18967545,0.239725904,0.220122994,0.397771243,0.380850909,0.487976531,0.392436647,0.38874041,0.433060865,0.368518412,0.419457705,0.411291851,0.179093293,0.277668815,0.396034355 37 | G,0,0,0.035517745,0.375785868,0.039680158,0.501786735,0.307960073,0.052451832,0.158337534,0.335567852,0.096059675,0.359467135,0.072632875,0.077572749,0.255161549 38 | H,0.160076239,0.25452757,0.397596479,0,0,0.431961882,0,0,0,0,0,0.075293039,0.08748595,0.234799664,0.594316615 39 | I,0.083669318,0.09231855,0.110860367,0.329471868,0.124818089,0.065941544,0.408749693,0.253422602,0.451298548,0.270932598,0.138839281,0,0.196890221,0.223031662,0.412204432 40 | J,0.080939321,0.084127238,0.043862459,0.672107935,0.442940835,0.162485032,0.747430794,0.561217276,0.601630911,0.827219046,0.744696062,0.897367513,0.480371342,0.447993524,0.544716597 41 | K,0.081015587,0.051381936,0.044635799,0.757948414,0.322585616,0.513118048,0.828569448,0.452632394,0.869968839,0.734546296,0.441038698,0.646194285,0.900337205,0.651274867,1 42 | L,0.186619555,0.215913203,0.090124497,0.888356514,0.871357879,0.308515884,0.819419991,0.806247616,0.353392552,0.678894815,0.755347211,0.095979237,0.84158861,0.87811712,0.79047821 43 | M,0.053975291,0.074621514,0.080761959,0.364372223,0.200556604,0.22474049,0.357434686,0.234282787,0.225310025,0.304045408,0.211438809,0.113832318,0.274313547,0.307649201,0.519335929 44 | N,0.06480088,0.059625179,0.023674877,0.82750233,0.52181886,0.509372579,0.908281823,0.647431595,0.911002051,0.640639826,0.469013728,0.226533041,0.222430373,0.211263659,0.243346411 45 | O,1,1,1,0.447771785,0.375679512,0.61409081,0.390721322,0.335755665,0.339649561,0.530336403,0.571907604,0.940567272,0.138703634,0.215746708,0.323083448 46 | P,0.242310315,0.214053538,0.330799335,0.312138164,0.066807049,0.721017079,0.277195747,0.090668551,0.384268487,0.246802307,0.07715622,0.318654677,0.255901087,0.254226207,0.61516983 47 | Q,0.084612044,0.106431207,0.031171217,0.95644034,0.864308905,0.782548566,0.974012741,0.902889377,0.958440328,0.909062182,0.968825118,0.828012804,1,0.971140375,0.995122468 48 | R,0.162893897,0.225194907,0.099040921,0.844079386,0.984027802,0.701829716,0.764721577,0.878520632,0.571687083,0.752270786,1,0.609372755,0.166146289,0.281124498,0.196927391 49 | S,0.086545423,0.079367435,0.082551476,0.59002641,0.309249493,0.662611048,0.52626752,0.304572019,0.451152689,0.520338455,0.352218154,0.506585495,0.587753573,0.506824641,0.822288198 50 | T,0.224279237,0.308794389,0.163989763,0.692864201,0.869954289,0.478591656,0.806676546,1,0.971046226,0.642705193,0.915947623,0.5171284,0.810041214,1,0.952709151 51 | U,0.234456984,0.292524332,0.147079024,0.883508067,1,0.777574292,0.756001484,0.841615851,0.497119687,0.638067653,0.812149465,0.252569592,0.64306232,0.75856916,0.685151804 52 | V,0.234704535,0.272475361,0.196034095,0.721597783,0.722183368,1,0.725442374,0.73726672,0.996106379,0.5836502,0.668672041,0.571672785,0.434245036,0.511067526,0.591135617 53 | W,0.133477655,0.14876626,0.150841766,0.515674889,0.375101339,0.848113219,0.432901686,0.322618431,0.442529054,0.44631445,0.393868248,0.562885069,0.250723798,0.291754757,0.466594693 54 | X,0.275552829,0.27775854,0.136280258,1,0.900002687,0.464629079,0.899593282,0.814532263,0.422042743,0.732516079,0.7431155,0.110042487,0.992256775,0.956570468,0.884494398 55 | Y,0.175516812,0.137543462,0.164365161,0.626659117,0.28777969,0.911418518,0.486279934,0.225164802,0.356174019,0.484790041,0.266008073,0.434123838,0.240057807,0.210142897,0.394822546 56 | Z,0.085143761,0.124024428,0.106861029,0.467307895,0.416094828,0.654457996,0.452534969,0.419498078,0.553339902,0.349755769,0.353664292,0.234245424,0.384360113,0.458471761,0.659299877 57 | >>>>>>> 8b8ed6c895f3e3d3d77bc7fd7b5073581b2e52a0 58 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | DEA 5 | 64 | 65 | 66 |

Efficiency of Firms

67 | 68 | 69 | 324 | -------------------------------------------------------------------------------- /main.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 21, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "#Importing libraries\n", 10 | "import pandas as pd\n", 11 | "import numpy as np\n", 12 | "from scipy.optimize import fmin_slsqp\n", 13 | "import matplotlib.pyplot as plt\n", 14 | "import os\n", 15 | "from pprint import pprint\n", 16 | "import random" 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": null, 22 | "metadata": {}, 23 | "outputs": [], 24 | "source": [ 25 | "#Listing the existing files in the dir\n", 26 | "for root, dirs, files in os.walk(\".\"): \n", 27 | " for filename in files:\n", 28 | " print(filename)" 29 | ] 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": 2, 34 | "metadata": {}, 35 | "outputs": [ 36 | { 37 | "data": { 38 | "text/html": [ 39 | "
\n", 40 | "\n", 53 | "\n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \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 | "
dmux1x2x3x4x5y1y2y3
0A86.1316.2448.2149.69954.5358.9838.16
1B29.2610.2441.9640.65524.6933.8926.02
2C43.1211.3138.1935.03936.4140.6228.51
3D24.966.1424.8125.15714.9417.5816.19
4E11.622.216.856.3747.816.945.37
\n", 131 | "
" 132 | ], 133 | "text/plain": [ 134 | " dmu x1 x2 x3 x4 x5 y1 y2 y3\n", 135 | "0 A 86.13 16.24 48.21 49.69 9 54.53 58.98 38.16\n", 136 | "1 B 29.26 10.24 41.96 40.65 5 24.69 33.89 26.02\n", 137 | "2 C 43.12 11.31 38.19 35.03 9 36.41 40.62 28.51\n", 138 | "3 D 24.96 6.14 24.81 25.15 7 14.94 17.58 16.19\n", 139 | "4 E 11.62 2.21 6.85 6.37 4 7.81 6.94 5.37" 140 | ] 141 | }, 142 | "execution_count": 2, 143 | "metadata": {}, 144 | "output_type": "execute_result" 145 | } 146 | ], 147 | "source": [ 148 | "#Loading df\n", 149 | "df = pd.read_csv('./files/data-2018-09-24.csv') #skiprows = 1)\n", 150 | "df = df.drop(df.loc[:,['name', 'pft']].head(0).columns, axis=1)\n", 151 | "df.head() #where xs are input vars and ys are output vars" 152 | ] 153 | }, 154 | { 155 | "cell_type": "code", 156 | "execution_count": 3, 157 | "metadata": {}, 158 | "outputs": [ 159 | { 160 | "name": "stdout", 161 | "output_type": "stream", 162 | "text": [ 163 | "[[86.13 16.24 48.21 49.69 9. ]\n", 164 | " [29.26 10.24 41.96 40.65 5. ]\n", 165 | " [43.12 11.31 38.19 35.03 9. ]\n", 166 | " [24.96 6.14 24.81 25.15 7. ]\n", 167 | " [11.62 2.21 6.85 6.37 4. ]\n", 168 | " [11.88 4.97 18.73 18.04 4. ]\n", 169 | " [32.64 6.88 28.1 25.45 7. ]\n", 170 | " [20.79 12.97 54.85 52.07 8. ]\n", 171 | " [34.4 11.04 38.16 42.4 8. ]\n", 172 | " [61.74 14.5 49.09 42.92 9. ]\n", 173 | " [52.92 11.67 39.48 39.64 5. ]\n", 174 | " [36. 10.15 37.8 39.52 5. ]\n", 175 | " [39.2 10.8 41.04 41.12 7. ]\n", 176 | " [14.6 2.88 9.64 11.14 3. ]\n", 177 | " [ 4.29 5.42 21.45 17.27 5. ]\n", 178 | " [27.25 14.17 56.46 55.26 9. ]\n", 179 | " [22.63 4.43 15.4 15. 2. ]\n", 180 | " [28. 7.61 28.73 27.04 9. ]\n", 181 | " [53.56 13.7 53.04 49.85 7. ]\n", 182 | " [25.42 9.05 29.69 31.74 4. ]\n", 183 | " [31.57 10.08 39.34 40.57 6. ]\n", 184 | " [16.34 5.84 20.89 22.1 4. ]\n", 185 | " [44.28 14.14 56.7 52.27 11. ]\n", 186 | " [19.74 6.43 24.2 25.66 3. ]\n", 187 | " [24.4 8.05 33.42 31.29 7. ]\n", 188 | " [41.4 11.7 44.01 46.35 7. ]] [[54.53 58.98 38.16]\n", 189 | " [24.69 33.89 26.02]\n", 190 | " [36.41 40.62 28.51]\n", 191 | " [14.94 17.58 16.19]\n", 192 | " [ 7.81 6.94 5.37]\n", 193 | " [12.59 16.85 12.84]\n", 194 | " [17.06 16.99 17.82]\n", 195 | " [20.29 30.64 33.16]\n", 196 | " [26.13 29.8 26.29]\n", 197 | " [46.42 51.59 35.2 ]\n", 198 | " [39.8 37.73 30.29]\n", 199 | " [37.84 47.85 25.35]\n", 200 | " [26.48 31.36 26.54]\n", 201 | " [10.31 10.86 7.47]\n", 202 | " [14.39 18.3 14.33]\n", 203 | " [32.94 36.03 38.19]\n", 204 | " [17.25 20.8 12.07]\n", 205 | " [27.55 38.19 20.44]\n", 206 | " [41.12 43.8 36.54]\n", 207 | " [29.43 42.63 23.34]\n", 208 | " [37.46 51.02 27.44]\n", 209 | " [19.4 25.18 16.52]\n", 210 | " [39.88 47.72 38.97]\n", 211 | " [25.72 30.81 16.54]\n", 212 | " [24.88 25.27 22.43]\n", 213 | " [31.62 40.78 31.16]] ['A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' 'N' 'O' 'P' 'Q' 'R'\n", 214 | " 'S' 'T' 'U' 'V' 'W' 'X' 'Y' 'Z']\n" 215 | ] 216 | } 217 | ], 218 | "source": [ 219 | "#Save input, output and unit as separate numpy arrays\n", 220 | "inpt_df = df.iloc[:, 1:6]\n", 221 | "inpt_arr = np.array(inpt_df)\n", 222 | "outpt_df = df.iloc[:, 6:]\n", 223 | "outpt_arr = np.array(outpt_df)\n", 224 | "comp = np.array(df.iloc[:, 0])\n", 225 | "print(inpt_arr, outpt_arr, comp)" 226 | ] 227 | }, 228 | { 229 | "cell_type": "code", 230 | "execution_count": 11, 231 | "metadata": {}, 232 | "outputs": [ 233 | { 234 | "name": "stdout", 235 | "output_type": "stream", 236 | "text": [ 237 | "Optimization terminated successfully. (Exit mode 0)\n", 238 | " Current function value: 1.0000000171370762\n", 239 | " Iterations: 14\n", 240 | " Function evaluations: 504\n", 241 | " Gradient evaluations: 14\n", 242 | "Optimization terminated successfully. (Exit mode 0)\n", 243 | " Current function value: 0.9663164619553417\n", 244 | " Iterations: 15\n", 245 | " Function evaluations: 541\n", 246 | " Gradient evaluations: 15\n", 247 | "Optimization terminated successfully. (Exit mode 0)\n", 248 | " Current function value: 0.9958121448686142\n", 249 | " Iterations: 15\n", 250 | " Function evaluations: 540\n", 251 | " Gradient evaluations: 15\n", 252 | "Optimization terminated successfully. (Exit mode 0)\n", 253 | " Current function value: 0.9321405795718042\n", 254 | " Iterations: 13\n", 255 | " Function evaluations: 469\n", 256 | " Gradient evaluations: 13\n", 257 | "Optimization terminated successfully. (Exit mode 0)\n", 258 | " Current function value: 1.0000000470033805\n", 259 | " Iterations: 8\n", 260 | " Function evaluations: 288\n", 261 | " Gradient evaluations: 8\n", 262 | "Optimization terminated successfully. (Exit mode 0)\n", 263 | " Current function value: 0.9287872073441278\n", 264 | " Iterations: 8\n", 265 | " Function evaluations: 288\n", 266 | " Gradient evaluations: 8\n", 267 | "Optimization terminated successfully. (Exit mode 0)\n", 268 | " Current function value: 0.92289779518485\n", 269 | " Iterations: 12\n", 270 | " Function evaluations: 432\n", 271 | " Gradient evaluations: 12\n", 272 | "Optimization terminated successfully. (Exit mode 0)\n", 273 | " Current function value: 1.0000000117566126\n", 274 | " Iterations: 10\n", 275 | " Function evaluations: 360\n", 276 | " Gradient evaluations: 10\n", 277 | "Optimization terminated successfully. (Exit mode 0)\n", 278 | " Current function value: 0.8710904562515944\n", 279 | " Iterations: 18\n", 280 | " Function evaluations: 648\n", 281 | " Gradient evaluations: 18\n", 282 | "Optimization terminated successfully. (Exit mode 0)\n", 283 | " Current function value: 1.0000000000375744\n", 284 | " Iterations: 19\n", 285 | " Function evaluations: 686\n", 286 | " Gradient evaluations: 19\n", 287 | "Optimization terminated successfully. (Exit mode 0)\n", 288 | " Current function value: 1.0000000049971765\n", 289 | " Iterations: 11\n", 290 | " Function evaluations: 396\n", 291 | " Gradient evaluations: 11\n", 292 | "Optimization terminated successfully. (Exit mode 0)\n", 293 | " Current function value: 0.9744366411566949\n", 294 | " Iterations: 15\n", 295 | " Function evaluations: 540\n", 296 | " Gradient evaluations: 15\n", 297 | "Optimization terminated successfully. (Exit mode 0)\n", 298 | " Current function value: 0.8737896253934904\n", 299 | " Iterations: 16\n", 300 | " Function evaluations: 577\n", 301 | " Gradient evaluations: 16\n", 302 | "Optimization terminated successfully. (Exit mode 0)\n", 303 | " Current function value: 0.9844841846940163\n", 304 | " Iterations: 11\n", 305 | " Function evaluations: 396\n", 306 | " Gradient evaluations: 11\n", 307 | "Optimization terminated successfully. (Exit mode 0)\n", 308 | " Current function value: 1.000000023566161\n", 309 | " Iterations: 6\n", 310 | " Function evaluations: 216\n", 311 | " Gradient evaluations: 6\n", 312 | "Optimization terminated successfully. (Exit mode 0)\n", 313 | " Current function value: 1.000000000161572\n", 314 | " Iterations: 11\n", 315 | " Function evaluations: 396\n", 316 | " Gradient evaluations: 11\n", 317 | "Optimization terminated successfully. (Exit mode 0)\n", 318 | " Current function value: 1.0000000683667205\n", 319 | " Iterations: 7\n", 320 | " Function evaluations: 252\n", 321 | " Gradient evaluations: 7\n", 322 | "Optimization terminated successfully. (Exit mode 0)\n", 323 | " Current function value: 1.0000000000211322\n", 324 | " Iterations: 9\n", 325 | " Function evaluations: 324\n", 326 | " Gradient evaluations: 9\n", 327 | "Optimization terminated successfully. (Exit mode 0)\n", 328 | " Current function value: 0.9823415586216158\n", 329 | " Iterations: 18\n", 330 | " Function evaluations: 648\n", 331 | " Gradient evaluations: 18\n", 332 | "Optimization terminated successfully. (Exit mode 0)\n", 333 | " Current function value: 1.0000000015285573\n", 334 | " Iterations: 7\n", 335 | " Function evaluations: 252\n", 336 | " Gradient evaluations: 7\n", 337 | "Optimization terminated successfully. (Exit mode 0)\n", 338 | " Current function value: 1.000000000294568\n", 339 | " Iterations: 12\n", 340 | " Function evaluations: 432\n", 341 | " Gradient evaluations: 12\n", 342 | "Optimization terminated successfully. (Exit mode 0)\n", 343 | " Current function value: 1.0000000463524783\n", 344 | " Iterations: 7\n", 345 | " Function evaluations: 252\n", 346 | " Gradient evaluations: 7\n", 347 | "Optimization terminated successfully. (Exit mode 0)\n", 348 | " Current function value: 0.9825580491212562\n", 349 | " Iterations: 22\n", 350 | " Function evaluations: 793\n", 351 | " Gradient evaluations: 22\n", 352 | "Optimization terminated successfully. (Exit mode 0)\n", 353 | " Current function value: 1.0000000000353004\n", 354 | " Iterations: 7\n", 355 | " Function evaluations: 252\n", 356 | " Gradient evaluations: 7\n", 357 | "Optimization terminated successfully. (Exit mode 0)\n", 358 | " Current function value: 0.9849999257640922\n", 359 | " Iterations: 15\n", 360 | " Function evaluations: 540\n", 361 | " Gradient evaluations: 15\n", 362 | "Optimization terminated successfully. (Exit mode 0)\n", 363 | " Current function value: 0.9568991664215988\n", 364 | " Iterations: 17\n", 365 | " Function evaluations: 612\n", 366 | " Gradient evaluations: 17\n", 367 | "---------------------------\n", 368 | "\n", 369 | "Efficient units:\n", 370 | "'A': 1.0000000171370762, 'E': 1.0000000470033805, 'H': 1.0000000117566126, 'J': 1.0000000000375744, 'K': 1.0000000049971765, 'O': 1.000000023566161, 'P': 1.000000000161572, 'Q': 1.0000000683667205, 'R': 1.0000000000211322, 'T': 1.0000000015285573, 'U': 1.000000000294568, 'V': 1.0000000463524783, 'X': 1.0000000000353004\n", 371 | "\n", 372 | "\n", 373 | "Inefficient units:\n", 374 | "'B': 0.9663164619553417, 'C': 0.9958121448686142, 'D': 0.9321405795718042, 'F': 0.9287872073441278, 'G': 0.92289779518485, 'I': 0.8710904562515944, 'L': 0.9744366411566949, 'M': 0.8737896253934904, 'N': 0.9844841846940163, 'S': 0.9823415586216158, 'W': 0.9825580491212562, 'Y': 0.9849999257640922, 'Z': 0.9568991664215988\n" 375 | ] 376 | } 377 | ], 378 | "source": [ 379 | "#Estimating efficient and non efficient units\n", 380 | "class DEA(object):\n", 381 | " random.seed(5)\n", 382 | " def __init__(self, inputs, outputs):\n", 383 | " \"\"\"\n", 384 | " Initialize the DEA object with input data\n", 385 | " n = number of entities (observations)\n", 386 | " m = number of inputs (variables, features)\n", 387 | " r = number of outputs\n", 388 | " :param inputs: inputs, n x m numpy array\n", 389 | " :param outputs: outputs, n x r numpy array\n", 390 | " :return: self\n", 391 | " \"\"\"\n", 392 | " # supplied data\n", 393 | " self.inputs = inputs\n", 394 | " self.outputs = outputs\n", 395 | " # parameters\n", 396 | " self.n = inputs.shape[0]\n", 397 | " self.m = inputs.shape[1]\n", 398 | " self.r = outputs.shape[1]\n", 399 | " # iterators\n", 400 | " self.unit_ = range(self.n)\n", 401 | " self.input_ = range(self.m)\n", 402 | " self.output_ = range(self.r)\n", 403 | " # result arrays\n", 404 | " self.output_w = np.zeros((self.r, 1), dtype=np.float) # output weights\n", 405 | " self.input_w = np.zeros((self.m, 1), dtype=np.float) # input weights\n", 406 | " self.lambdas = np.zeros((self.n, 1), dtype=np.float) # unit efficiencies\n", 407 | " self.efficiency = np.zeros_like(self.lambdas) # thetas\n", 408 | " # names\n", 409 | " self.names = []\n", 410 | "\n", 411 | " def __efficiency(self, unit):\n", 412 | " \"\"\"\n", 413 | " Efficiency function with already computed weights\n", 414 | " :param unit: which unit to compute for\n", 415 | " :return: efficiency\n", 416 | " \"\"\"\n", 417 | " # compute efficiency\n", 418 | " denominator = np.dot(self.inputs, self.input_w)\n", 419 | " numerator = np.dot(self.outputs, self.output_w)\n", 420 | " return (numerator/denominator)[unit]\n", 421 | "\n", 422 | " def __target(self, x, unit):\n", 423 | " \"\"\"\n", 424 | " Theta target function for one unit\n", 425 | " :param x: combined weights\n", 426 | " :param unit: which production unit to compute\n", 427 | " :return: theta\n", 428 | " \"\"\"\n", 429 | " in_w, out_w, lambdas = x[:self.m], x[self.m:(self.m+self.r)], x[(self.m+self.r):] # unroll the weights\n", 430 | " denominator = np.dot(self.inputs[unit], in_w)\n", 431 | " numerator = np.dot(self.outputs[unit], out_w)\n", 432 | " return numerator/denominator\n", 433 | "\n", 434 | " def __constraints(self, x, unit):\n", 435 | " \"\"\"\n", 436 | " Constraints for optimization for one unit\n", 437 | " :param x: combined weights\n", 438 | " :param unit: which production unit to compute\n", 439 | " :return: array of constraints\n", 440 | " \"\"\"\n", 441 | " in_w, out_w, lambdas = x[:self.m], x[self.m:(self.m+self.r)], x[(self.m+self.r):] # unroll the weights\n", 442 | " constr = [] # init the constraint array\n", 443 | " # for each input, lambdas with inputs\n", 444 | " for input in self.input_:\n", 445 | " t = self.__target(x, unit)\n", 446 | " lhs = np.dot(self.inputs[:, input], lambdas)\n", 447 | " cons = t*self.inputs[unit, input] - lhs\n", 448 | " constr.append(cons)\n", 449 | " # for each output, lambdas with outputs\n", 450 | " for output in self.output_:\n", 451 | " lhs = np.dot(self.outputs[:, output], lambdas)\n", 452 | " cons = lhs - self.outputs[unit, output]\n", 453 | " constr.append(cons)\n", 454 | " # for each unit\n", 455 | " for u in self.unit_:\n", 456 | " constr.append(lambdas[u])\n", 457 | " return np.array(constr)\n", 458 | "\n", 459 | " def __optimize(self):\n", 460 | " \"\"\"\n", 461 | " Optimization of the DEA model\n", 462 | " Use: http://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.optimize.linprog.html\n", 463 | " A = coefficients in the constraints\n", 464 | " b = rhs of constraints\n", 465 | " c = coefficients of the target function\n", 466 | " :return:\n", 467 | " \"\"\"\n", 468 | " d0 = self.m + self.r + self.n\n", 469 | " # iterate over units\n", 470 | " for unit in self.unit_:\n", 471 | " # weights\n", 472 | " x0 = np.random.rand(d0) - 0.5\n", 473 | " x0 = fmin_slsqp(self.__target, x0, f_ieqcons=self.__constraints, args=(unit,))\n", 474 | " # unroll weights\n", 475 | " self.input_w, self.output_w, self.lambdas = x0[:self.m], x0[self.m:(self.m+self.r)], x0[(self.m+self.r):]\n", 476 | " self.efficiency[unit] = self.__efficiency(unit)\n", 477 | "\n", 478 | " def name_units(self, names):\n", 479 | " \"\"\"\n", 480 | " Provide names for units for presentation purposes\n", 481 | " :param names: a list of names, equal in length to the number of units\n", 482 | " :return: nothing\n", 483 | " \"\"\"\n", 484 | " assert(self.n == len(names))\n", 485 | " self.names = names\n", 486 | "\n", 487 | " def fit(self):\n", 488 | " global not_efficient, alls\n", 489 | " \"\"\"\n", 490 | " Optimize the dataset, generate basic table\n", 491 | " :return: table\n", 492 | " \"\"\"\n", 493 | " self.__optimize() # optimize\n", 494 | " print(\"---------------------------\\n\") \n", 495 | "\n", 496 | " efficient = {}\n", 497 | " not_efficient = {} \n", 498 | " alls = {}\n", 499 | " for n, eff in enumerate(self.efficiency): \n", 500 | " if eff >= 1.:\n", 501 | " efficient.update({self.names[n]: eff[0]}) \n", 502 | " else:\n", 503 | " not_efficient.update({self.names[n]: eff[0]})\n", 504 | " for n, eff in enumerate(self.efficiency): \n", 505 | " alls.update({self.names[n]: eff[0]}) \n", 506 | " print(\"Efficient units:\") \n", 507 | " print(str(efficient).replace(\"{\",\"\").replace(\"}\", \"\")) \n", 508 | " print(\"\\n\") \n", 509 | " print(\"Inefficient units:\")\n", 510 | " print(str(not_efficient).replace(\"{\",\"\").replace(\"}\", \"\")) \n", 511 | "\n", 512 | "def save_results(dataframe): \n", 513 | " df_results = pd.DataFrame([]) \n", 514 | " df_results = df_results.append(not_efficient, ignore_index = True).T\n", 515 | " df_results = df_results.reset_index()\n", 516 | " df_results.columns = ['dmu', 'efficiency'] \n", 517 | " dataframe = dataframe.merge(df_results)\n", 518 | " return dataframe \n", 519 | "\n", 520 | "def save_results_complete(dataframe): \n", 521 | " df_results_complete = pd.DataFrame([]) \n", 522 | " df_results_complete = df_results_complete.append(alls, ignore_index = True).T\n", 523 | " df_results_complete = df_results_complete.reset_index()\n", 524 | " df_results_complete.columns = ['dmu', 'efficiency'] \n", 525 | " dataframe_complete = dataframe.merge(df_results_complete)\n", 526 | " return dataframe_complete \n", 527 | "\n", 528 | "dea = DEA(inpt_arr, outpt_arr)\n", 529 | "dea.name_units(comp)\n", 530 | "dea.fit()" 531 | ] 532 | }, 533 | { 534 | "cell_type": "code", 535 | "execution_count": 12, 536 | "metadata": {}, 537 | "outputs": [ 538 | { 539 | "data": { 540 | "text/html": [ 541 | "
\n", 542 | "\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 | "
dmux1x2x3x4x5y1y2y3efficiency
0A86.1316.2448.2149.69954.5358.9838.161.000000
1B29.2610.2441.9640.65524.6933.8926.020.966316
2C43.1211.3138.1935.03936.4140.6228.510.995812
3D24.966.1424.8125.15714.9417.5816.190.932141
4E11.622.216.856.3747.816.945.371.000000
\n", 639 | "
" 640 | ], 641 | "text/plain": [ 642 | " dmu x1 x2 x3 x4 x5 y1 y2 y3 efficiency\n", 643 | "0 A 86.13 16.24 48.21 49.69 9 54.53 58.98 38.16 1.000000\n", 644 | "1 B 29.26 10.24 41.96 40.65 5 24.69 33.89 26.02 0.966316\n", 645 | "2 C 43.12 11.31 38.19 35.03 9 36.41 40.62 28.51 0.995812\n", 646 | "3 D 24.96 6.14 24.81 25.15 7 14.94 17.58 16.19 0.932141\n", 647 | "4 E 11.62 2.21 6.85 6.37 4 7.81 6.94 5.37 1.000000" 648 | ] 649 | }, 650 | "execution_count": 12, 651 | "metadata": {}, 652 | "output_type": "execute_result" 653 | } 654 | ], 655 | "source": [ 656 | "df_ineff = save_results(df)\n", 657 | "df_complete = save_results_complete(df)\n", 658 | "df_complete.head()" 659 | ] 660 | }, 661 | { 662 | "cell_type": "code", 663 | "execution_count": 6, 664 | "metadata": {}, 665 | "outputs": [ 666 | { 667 | "data": { 668 | "text/html": [ 669 | "
\n", 670 | "\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 | "
x1x2x3x4x5dmu
01.00.31.41.40.2B
10.20.00.20.10.0C
21.70.41.71.70.5D
30.80.41.31.30.3F
42.50.52.22.00.5G
\n", 743 | "
" 744 | ], 745 | "text/plain": [ 746 | " x1 x2 x3 x4 x5 dmu\n", 747 | "0 1.0 0.3 1.4 1.4 0.2 B\n", 748 | "1 0.2 0.0 0.2 0.1 0.0 C\n", 749 | "2 1.7 0.4 1.7 1.7 0.5 D\n", 750 | "3 0.8 0.4 1.3 1.3 0.3 F\n", 751 | "4 2.5 0.5 2.2 2.0 0.5 G" 752 | ] 753 | }, 754 | "execution_count": 6, 755 | "metadata": {}, 756 | "output_type": "execute_result" 757 | } 758 | ], 759 | "source": [ 760 | "#Estimating the improvement options - input oriented\n", 761 | "heading = list(df_ineff.iloc[:, 1:6])\n", 762 | "\n", 763 | "inter = []\n", 764 | "for c in df_ineff.iloc[:, 1:6].columns:\n", 765 | " inter.append(df_ineff[c].multiply((1- df_ineff.iloc[:,-1])))\n", 766 | " df_improvement = round(pd.concat(inter, axis = 1),1)\n", 767 | " df_improvement = df_improvement.rename(columns = dict(zip(df_improvement.columns, heading)))\n", 768 | "df_improvement = pd.concat([df_improvement,df_ineff[['dmu']]], axis = 1)\n", 769 | "df_improvement.head()" 770 | ] 771 | }, 772 | { 773 | "cell_type": "code", 774 | "execution_count": 7, 775 | "metadata": {}, 776 | "outputs": [ 777 | { 778 | "data": { 779 | "text/html": [ 780 | "
\n", 781 | "\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 | "
y1y2y3dmu
01.41.51.0A
10.91.31.0B
21.31.41.0C
30.91.11.0D
41.51.31.0E
\n", 842 | "
" 843 | ], 844 | "text/plain": [ 845 | " y1 y2 y3 dmu\n", 846 | "0 1.4 1.5 1.0 A\n", 847 | "1 0.9 1.3 1.0 B\n", 848 | "2 1.3 1.4 1.0 C\n", 849 | "3 0.9 1.1 1.0 D\n", 850 | "4 1.5 1.3 1.0 E" 851 | ] 852 | }, 853 | "execution_count": 7, 854 | "metadata": {}, 855 | "output_type": "execute_result" 856 | } 857 | ], 858 | "source": [ 859 | "#Estimating the improvement options - output oriented\n", 860 | "heading_output = list(df.iloc[:, 6:9])\n", 861 | "\n", 862 | "inter_out = []\n", 863 | "for c in df.iloc[:, 6:9].columns:\n", 864 | " inter_out.append(df[c].multiply((1- df.iloc[:,-1])/df.iloc[:,-1]).add(df[c]))\n", 865 | " df_improvement_outpt = round(pd.concat(inter_out, axis = 1),1)\n", 866 | " df_improvement_outpt = df_improvement_outpt.rename(columns = dict(zip(df_improvement_outpt.columns, heading_output)))\n", 867 | "df_improvement_outpt = pd.concat([df_improvement_outpt,df[['dmu']]], axis = 1)\n", 868 | "df_improvement_outpt.head()" 869 | ] 870 | }, 871 | { 872 | "cell_type": "code", 873 | "execution_count": 43, 874 | "metadata": {}, 875 | "outputs": [ 876 | { 877 | "data": { 878 | "image/png": "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\n", 879 | "text/plain": [ 880 | "
" 881 | ] 882 | }, 883 | "metadata": { 884 | "needs_background": "light" 885 | }, 886 | "output_type": "display_data" 887 | } 888 | ], 889 | "source": [ 890 | "#Assigning lables depending on the efficiency score\n", 891 | "def classification(x):\n", 892 | " \"\"\"The function assings lables depending on the efficiency score a unit falls into\"\"\"\n", 893 | " for u in x:\n", 894 | " if u >= 1.0 : return '100'\n", 895 | " elif u >= 0.9: return '>=90'\n", 896 | " elif u >= 0.8: return '>=80'\n", 897 | " elif u >= 0.7: return '>=70'\n", 898 | " elif u >= 0.6: return '>=60'\n", 899 | " elif u >=0.5: return '>=50'\n", 900 | " elif u >=0.4: return '>=40'\n", 901 | " elif u >= 0.3: return '>=0.3'\n", 902 | " else: return '<0.3'\n", 903 | "df_complete['category'] = df_complete[['efficiency']].apply(classification, axis = 1)\n", 904 | "\n", 905 | "#Creating the frequency table\n", 906 | "df_freq = df_complete.groupby('category').count().reset_index()\n", 907 | "categories = ['>=80', '>=90', '100']\n", 908 | "#Ploting the distribution graph\n", 909 | "mapping = {category: i for i, category in enumerate(categories)}\n", 910 | "key = df_freq['category'].map(mapping) \n", 911 | "df_freq = df_freq.iloc[key.argsort()]\n", 912 | "\n", 913 | "# Draw the bar chart\n", 914 | "plt.bar(df_freq['category'], df_freq['efficiency'], tick_label=categories)\n", 915 | "plt.title('Proportion of efficient units %')\n", 916 | "plt.ylabel('Frequency')\n", 917 | "plt.xlabel('Category')\n", 918 | "plt.show()" 919 | ] 920 | } 921 | ], 922 | "metadata": { 923 | "kernelspec": { 924 | "display_name": "Python 3", 925 | "language": "python", 926 | "name": "python3" 927 | }, 928 | "language_info": { 929 | "codemirror_mode": { 930 | "name": "ipython", 931 | "version": 3 932 | }, 933 | "file_extension": ".py", 934 | "mimetype": "text/x-python", 935 | "name": "python", 936 | "nbconvert_exporter": "python", 937 | "pygments_lexer": "ipython3", 938 | "version": "3.7.0" 939 | } 940 | }, 941 | "nbformat": 4, 942 | "nbformat_minor": 2 943 | } 944 | --------------------------------------------------------------------------------