├── .gitignore ├── slides └── slides.pdf ├── LICENSE ├── README.md └── notebooks ├── PythonScientificLibraries.ipynb ├── PythonCrashCourse.ipynb └── USIncomeGrowth.ipynb /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | */.ipynb_checkpoints 3 | *.pyc 4 | 5 | -------------------------------------------------------------------------------- /slides/slides.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuantEcon/GC_CUNY_workshop_2019/master/slides/slides.pdf -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 QuantEcon 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GC_CUNY_workshop_2019 2 | 3 | Materials for a 2 hour introduction to using Python for economics hosted for 4 | students at the Graduate Center CUNY. 5 | 6 | ### Goals 7 | 8 | In this workshop, we will not have time to help participants reach a high 9 | level of profiency in using Python, instead, our goal is to 10 | 11 | 1. Give a brief introduction to Python and familiarize participants with the language syntax 12 | 2. Explain why we think Python is a strong choice for solving economic problems 13 | 3. Demonstrate Python's capabilities via example 14 | 15 | ### Instructions 16 | 17 | In order to follow along, you will need access to a working Python installation with the 18 | necessary packages. There are two ways to achieve this: 19 | 20 | 1. You can install Python on your own laptop. We recommend installing the Anaconda distribution 21 | of Python which includes many of the scientific libraries we need -- To do this, you should 22 | be able to follow instructions on the [QE Lecture Site](https://lectures.quantecon.org/py/getting_started.html) 23 | 2. [Compute Canada](https://www.computecanada.ca/) and the [Pacific Institute for the Mathematical Sciences](http://www.pims.math.ca/) 24 | host a public cloud that has all of the scientific libraries we need installed on the cloud. This is a great 25 | option if you are unsure whether you want to use Python and don't want to spend time installing 26 | it on your own computer until you know more. One caveat here is that you will receive a limited 27 | amount of resources from this public service, so it will not necessarily be a long term solution. 28 | If you are interested in this route, you should sign in with a Google account at https://pims.syzygy.ca. 29 | 30 | Once you have either installed Python or logged into the public cloud service, you should download 31 | these materials. If you're doing this on your own computer, you can get them from https://github.com/QuantEcon/GC_CUNY_workshop_2019. 32 | If you're doing this on the PIMS cloud service, you can do this by going to the following link in 33 | your browser https://pims.syzygy.ca/jupyter/user-redirect/git-pull?repo=https://github.com/QuantEcon/GC_CUNY_workshop_2019 34 | 35 | -------------------------------------------------------------------------------- /notebooks/PythonScientificLibraries.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Python's Main Scientific Libraries" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "Material originally prepared by John Stachurski." 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "## Libraries" 22 | ] 23 | }, 24 | { 25 | "cell_type": "markdown", 26 | "metadata": {}, 27 | "source": [ 28 | "Anaconda comes with many libraries for scientific computing pre-installed.\n", 29 | "\n", 30 | "The most important ones are\n", 31 | "\n", 32 | "* NumPy\n", 33 | "* SciPy\n", 34 | "* Matplotlib\n", 35 | "* Pandas\n", 36 | "* Numba\n" 37 | ] 38 | }, 39 | { 40 | "cell_type": "markdown", 41 | "metadata": {}, 42 | "source": [ 43 | "Attributes are loaded into memory using `import`" 44 | ] 45 | }, 46 | { 47 | "cell_type": "code", 48 | "execution_count": null, 49 | "metadata": {}, 50 | "outputs": [], 51 | "source": [ 52 | "import matplotlib.pyplot as plt\n", 53 | "from mpl_toolkits.mplot3d import Axes3D\n", 54 | "from sklearn import datasets\n", 55 | "from sklearn.decomposition import PCA\n", 56 | "\n", 57 | "%matplotlib inline\n", 58 | "\n", 59 | "# import some data to play with\n", 60 | "iris = datasets.load_iris()\n", 61 | "X = iris.data[:, :2] \n", 62 | "y = iris.target\n", 63 | "x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5\n", 64 | "y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5\n", 65 | "\n", 66 | "\n", 67 | "fig = plt.figure(1, figsize=(8, 6))\n", 68 | "ax = Axes3D(fig, elev=-150, azim=110)\n", 69 | "X_reduced = PCA(n_components=3).fit_transform(iris.data)\n", 70 | "ax.scatter(X_reduced[:, 0], X_reduced[:, 1], X_reduced[:, 2], c=y,\n", 71 | " cmap=plt.cm.Set1, edgecolor='k', s=40)\n", 72 | "ax.set_title(\"First three PCA directions\")\n", 73 | "ax.set_xlabel(\"1st eigenvector\")\n", 74 | "ax.w_xaxis.set_ticklabels([])\n", 75 | "ax.set_ylabel(\"2nd eigenvector\")\n", 76 | "ax.w_yaxis.set_ticklabels([])\n", 77 | "ax.set_zlabel(\"3rd eigenvector\")\n", 78 | "ax.w_zaxis.set_ticklabels([])\n", 79 | "\n", 80 | "plt.show()" 81 | ] 82 | }, 83 | { 84 | "cell_type": "markdown", 85 | "metadata": {}, 86 | "source": [ 87 | "### NumPy" 88 | ] 89 | }, 90 | { 91 | "cell_type": "markdown", 92 | "metadata": {}, 93 | "source": [ 94 | "A library for fast array/vector/matrix processing in Python." 95 | ] 96 | }, 97 | { 98 | "cell_type": "code", 99 | "execution_count": null, 100 | "metadata": {}, 101 | "outputs": [], 102 | "source": [ 103 | "import numpy as np" 104 | ] 105 | }, 106 | { 107 | "cell_type": "markdown", 108 | "metadata": {}, 109 | "source": [ 110 | "#### Elementary functions\n", 111 | "\n", 112 | "With NumPy we can access standard functions like $\\exp$, $\\sin$, $\\cos$, etc." 113 | ] 114 | }, 115 | { 116 | "cell_type": "code", 117 | "execution_count": null, 118 | "metadata": {}, 119 | "outputs": [], 120 | "source": [ 121 | "x = 0\n", 122 | "np.exp(x)" 123 | ] 124 | }, 125 | { 126 | "cell_type": "code", 127 | "execution_count": null, 128 | "metadata": {}, 129 | "outputs": [], 130 | "source": [ 131 | "np.cos(x)" 132 | ] 133 | }, 134 | { 135 | "cell_type": "code", 136 | "execution_count": null, 137 | "metadata": {}, 138 | "outputs": [], 139 | "source": [ 140 | "np.sin(x)" 141 | ] 142 | }, 143 | { 144 | "cell_type": "markdown", 145 | "metadata": {}, 146 | "source": [ 147 | "#### Arrays\n", 148 | "\n", 149 | "We can make an \"array\" of evenly spaced numbers:" 150 | ] 151 | }, 152 | { 153 | "cell_type": "code", 154 | "execution_count": null, 155 | "metadata": {}, 156 | "outputs": [], 157 | "source": [ 158 | "x = np.linspace(-3, 3, 5)" 159 | ] 160 | }, 161 | { 162 | "cell_type": "code", 163 | "execution_count": null, 164 | "metadata": {}, 165 | "outputs": [], 166 | "source": [ 167 | "x" 168 | ] 169 | }, 170 | { 171 | "cell_type": "markdown", 172 | "metadata": {}, 173 | "source": [ 174 | "The functions listed above work directly on arrays:" 175 | ] 176 | }, 177 | { 178 | "cell_type": "code", 179 | "execution_count": null, 180 | "metadata": {}, 181 | "outputs": [], 182 | "source": [ 183 | "np.exp(x)" 184 | ] 185 | }, 186 | { 187 | "cell_type": "code", 188 | "execution_count": null, 189 | "metadata": {}, 190 | "outputs": [], 191 | "source": [ 192 | "np.sin(x)" 193 | ] 194 | }, 195 | { 196 | "cell_type": "markdown", 197 | "metadata": {}, 198 | "source": [ 199 | "Basic arithmetic operators are \"vectorized\"" 200 | ] 201 | }, 202 | { 203 | "cell_type": "code", 204 | "execution_count": null, 205 | "metadata": {}, 206 | "outputs": [], 207 | "source": [ 208 | "x" 209 | ] 210 | }, 211 | { 212 | "cell_type": "code", 213 | "execution_count": null, 214 | "metadata": {}, 215 | "outputs": [], 216 | "source": [ 217 | "2 * x" 218 | ] 219 | }, 220 | { 221 | "cell_type": "code", 222 | "execution_count": null, 223 | "metadata": {}, 224 | "outputs": [], 225 | "source": [ 226 | "2 * x - 1" 227 | ] 228 | }, 229 | { 230 | "cell_type": "markdown", 231 | "metadata": {}, 232 | "source": [ 233 | "#### Reductions" 234 | ] 235 | }, 236 | { 237 | "cell_type": "code", 238 | "execution_count": null, 239 | "metadata": {}, 240 | "outputs": [], 241 | "source": [ 242 | "np.sum(x)" 243 | ] 244 | }, 245 | { 246 | "cell_type": "code", 247 | "execution_count": null, 248 | "metadata": {}, 249 | "outputs": [], 250 | "source": [ 251 | "np.mean(x)" 252 | ] 253 | }, 254 | { 255 | "cell_type": "code", 256 | "execution_count": null, 257 | "metadata": {}, 258 | "outputs": [], 259 | "source": [ 260 | "np.std(x)" 261 | ] 262 | }, 263 | { 264 | "cell_type": "code", 265 | "execution_count": null, 266 | "metadata": {}, 267 | "outputs": [], 268 | "source": [ 269 | "np.max(x)" 270 | ] 271 | }, 272 | { 273 | "cell_type": "code", 274 | "execution_count": null, 275 | "metadata": {}, 276 | "outputs": [], 277 | "source": [ 278 | "np.min(x)" 279 | ] 280 | }, 281 | { 282 | "cell_type": "markdown", 283 | "metadata": {}, 284 | "source": [ 285 | "#### Matrix algebra" 286 | ] 287 | }, 288 | { 289 | "cell_type": "code", 290 | "execution_count": null, 291 | "metadata": {}, 292 | "outputs": [], 293 | "source": [ 294 | "A = np.random.randn(2, 2)\n", 295 | "B = np.random.randn(2, 3)" 296 | ] 297 | }, 298 | { 299 | "cell_type": "code", 300 | "execution_count": null, 301 | "metadata": {}, 302 | "outputs": [], 303 | "source": [ 304 | "A" 305 | ] 306 | }, 307 | { 308 | "cell_type": "code", 309 | "execution_count": null, 310 | "metadata": {}, 311 | "outputs": [], 312 | "source": [ 313 | "B" 314 | ] 315 | }, 316 | { 317 | "cell_type": "code", 318 | "execution_count": null, 319 | "metadata": {}, 320 | "outputs": [], 321 | "source": [ 322 | "A @ B # matrix multiplication" 323 | ] 324 | }, 325 | { 326 | "cell_type": "markdown", 327 | "metadata": {}, 328 | "source": [ 329 | "#### Types and speed" 330 | ] 331 | }, 332 | { 333 | "cell_type": "markdown", 334 | "metadata": {}, 335 | "source": [ 336 | "Arrays have to be homogeneous in terms of data type" 337 | ] 338 | }, 339 | { 340 | "cell_type": "code", 341 | "execution_count": null, 342 | "metadata": {}, 343 | "outputs": [], 344 | "source": [ 345 | "x" 346 | ] 347 | }, 348 | { 349 | "cell_type": "code", 350 | "execution_count": null, 351 | "metadata": { 352 | "scrolled": true 353 | }, 354 | "outputs": [], 355 | "source": [ 356 | "x[0] = \"foobar\"" 357 | ] 358 | }, 359 | { 360 | "cell_type": "markdown", 361 | "metadata": {}, 362 | "source": [ 363 | "Homogeneity makes them fast and efficient." 364 | ] 365 | }, 366 | { 367 | "cell_type": "code", 368 | "execution_count": null, 369 | "metadata": {}, 370 | "outputs": [], 371 | "source": [ 372 | "x = np.random.randn(1_000_000)" 373 | ] 374 | }, 375 | { 376 | "cell_type": "code", 377 | "execution_count": null, 378 | "metadata": {}, 379 | "outputs": [], 380 | "source": [ 381 | "np.sum(2 * x - x**2)" 382 | ] 383 | }, 384 | { 385 | "cell_type": "code", 386 | "execution_count": null, 387 | "metadata": {}, 388 | "outputs": [], 389 | "source": [ 390 | "%%timeit \n", 391 | "\n", 392 | "np.sum(2 * x - x**2)" 393 | ] 394 | }, 395 | { 396 | "cell_type": "code", 397 | "execution_count": null, 398 | "metadata": {}, 399 | "outputs": [], 400 | "source": [ 401 | "%%timeit\n", 402 | "\n", 403 | "y = 0.0\n", 404 | "for val in x:\n", 405 | " y = y + 2 * val - val**2" 406 | ] 407 | }, 408 | { 409 | "cell_type": "markdown", 410 | "metadata": {}, 411 | "source": [ 412 | "### JIT compilation via Numba" 413 | ] 414 | }, 415 | { 416 | "cell_type": "code", 417 | "execution_count": null, 418 | "metadata": {}, 419 | "outputs": [], 420 | "source": [ 421 | "from numba import jit\n", 422 | "\n", 423 | "@jit\n", 424 | "def sum_vec(v):\n", 425 | " y = 0.0\n", 426 | " for val in v:\n", 427 | " y = y + 2 * val - val**2\n", 428 | " return y" 429 | ] 430 | }, 431 | { 432 | "cell_type": "code", 433 | "execution_count": null, 434 | "metadata": {}, 435 | "outputs": [], 436 | "source": [ 437 | "sum_vec(x)" 438 | ] 439 | }, 440 | { 441 | "cell_type": "code", 442 | "execution_count": null, 443 | "metadata": {}, 444 | "outputs": [], 445 | "source": [ 446 | "%%timeit \n", 447 | "\n", 448 | "sum_vec(x)" 449 | ] 450 | }, 451 | { 452 | "cell_type": "markdown", 453 | "metadata": {}, 454 | "source": [ 455 | "### Matplotlib" 456 | ] 457 | }, 458 | { 459 | "cell_type": "markdown", 460 | "metadata": {}, 461 | "source": [ 462 | "The next line says \"show all figures inside the browser\"" 463 | ] 464 | }, 465 | { 466 | "cell_type": "code", 467 | "execution_count": null, 468 | "metadata": {}, 469 | "outputs": [], 470 | "source": [ 471 | "%matplotlib inline" 472 | ] 473 | }, 474 | { 475 | "cell_type": "markdown", 476 | "metadata": {}, 477 | "source": [ 478 | "Now let's import the main Python plotting library, called Matplotlib." 479 | ] 480 | }, 481 | { 482 | "cell_type": "code", 483 | "execution_count": null, 484 | "metadata": {}, 485 | "outputs": [], 486 | "source": [ 487 | "import matplotlib.pyplot as plt" 488 | ] 489 | }, 490 | { 491 | "cell_type": "markdown", 492 | "metadata": {}, 493 | "source": [ 494 | "#### Our first plot" 495 | ] 496 | }, 497 | { 498 | "cell_type": "code", 499 | "execution_count": null, 500 | "metadata": {}, 501 | "outputs": [], 502 | "source": [ 503 | "fig, ax = plt.subplots()\n", 504 | "\n", 505 | "x = np.linspace(-np.pi, np.pi, 100)\n", 506 | "y = np.sin(x)\n", 507 | "ax.plot(x, y)\n" 508 | ] 509 | }, 510 | { 511 | "cell_type": "markdown", 512 | "metadata": {}, 513 | "source": [ 514 | "A plot with two lines and a legend:" 515 | ] 516 | }, 517 | { 518 | "cell_type": "code", 519 | "execution_count": null, 520 | "metadata": {}, 521 | "outputs": [], 522 | "source": [ 523 | "fig, ax = plt.subplots()\n", 524 | "\n", 525 | "y1 = np.sin(x)\n", 526 | "y2 = np.cos(x)\n", 527 | "ax.plot(x, y1, label='sine')\n", 528 | "ax.plot(x, y2, label='cosine')\n", 529 | "ax.legend()" 530 | ] 531 | }, 532 | { 533 | "cell_type": "markdown", 534 | "metadata": {}, 535 | "source": [ 536 | "### An Example" 537 | ] 538 | }, 539 | { 540 | "cell_type": "code", 541 | "execution_count": null, 542 | "metadata": {}, 543 | "outputs": [], 544 | "source": [ 545 | "def g(x, β=0.5):\n", 546 | " return x * np.exp(-β * x)" 547 | ] 548 | }, 549 | { 550 | "cell_type": "code", 551 | "execution_count": null, 552 | "metadata": {}, 553 | "outputs": [], 554 | "source": [ 555 | "g(1)" 556 | ] 557 | }, 558 | { 559 | "cell_type": "code", 560 | "execution_count": null, 561 | "metadata": {}, 562 | "outputs": [], 563 | "source": [ 564 | "g(10)" 565 | ] 566 | }, 567 | { 568 | "cell_type": "code", 569 | "execution_count": null, 570 | "metadata": {}, 571 | "outputs": [], 572 | "source": [ 573 | "fig, ax = plt.subplots()\n", 574 | "\n", 575 | "x = np.linspace(0, 10, 100)\n", 576 | "y = g(x)\n", 577 | "ax.plot(x, y)" 578 | ] 579 | }, 580 | { 581 | "cell_type": "code", 582 | "execution_count": null, 583 | "metadata": {}, 584 | "outputs": [], 585 | "source": [ 586 | "def h(x):\n", 587 | " return np.abs(np.sin(x))\n", 588 | "\n", 589 | "fig, ax = plt.subplots()\n", 590 | "\n", 591 | "x = np.linspace(0, 10, 100)\n", 592 | "y = h(x)\n", 593 | "ax.plot(x, y)" 594 | ] 595 | }, 596 | { 597 | "cell_type": "markdown", 598 | "metadata": {}, 599 | "source": [ 600 | "### SciPy" 601 | ] 602 | }, 603 | { 604 | "cell_type": "markdown", 605 | "metadata": {}, 606 | "source": [ 607 | "A useful collection of subpackages for numerical methods.\n", 608 | "\n", 609 | "* linear algebra\n", 610 | "* numerical optimization and root finding\n", 611 | "* statistics and probability\n", 612 | "* interpolation and approximation\n", 613 | "* etc." 614 | ] 615 | }, 616 | { 617 | "cell_type": "code", 618 | "execution_count": null, 619 | "metadata": {}, 620 | "outputs": [], 621 | "source": [ 622 | "from scipy.linalg import eigvals" 623 | ] 624 | }, 625 | { 626 | "cell_type": "code", 627 | "execution_count": null, 628 | "metadata": {}, 629 | "outputs": [], 630 | "source": [ 631 | "eigvals(np.random.randn(2, 2))" 632 | ] 633 | }, 634 | { 635 | "cell_type": "code", 636 | "execution_count": null, 637 | "metadata": {}, 638 | "outputs": [], 639 | "source": [ 640 | "def f(x):\n", 641 | " return x**3" 642 | ] 643 | }, 644 | { 645 | "cell_type": "code", 646 | "execution_count": null, 647 | "metadata": {}, 648 | "outputs": [], 649 | "source": [ 650 | "fig, ax = plt.subplots()\n", 651 | "x = np.linspace(-1, 1, 100)\n", 652 | "ax.plot(x, f(x))\n", 653 | "ax.plot(x, 0 * x)" 654 | ] 655 | }, 656 | { 657 | "cell_type": "code", 658 | "execution_count": null, 659 | "metadata": {}, 660 | "outputs": [], 661 | "source": [ 662 | "from scipy.optimize import brentq" 663 | ] 664 | }, 665 | { 666 | "cell_type": "markdown", 667 | "metadata": {}, 668 | "source": [ 669 | "Find the root of $f$ on the interval $[-1, 1]$" 670 | ] 671 | }, 672 | { 673 | "cell_type": "code", 674 | "execution_count": null, 675 | "metadata": {}, 676 | "outputs": [], 677 | "source": [ 678 | "brentq(f, -1, 1)" 679 | ] 680 | }, 681 | { 682 | "cell_type": "markdown", 683 | "metadata": {}, 684 | "source": [ 685 | "### Exercises" 686 | ] 687 | }, 688 | { 689 | "cell_type": "markdown", 690 | "metadata": {}, 691 | "source": [ 692 | "Plot the function\n", 693 | "\n", 694 | "$$ f(x) = \\sin(2x) - 2 \\sin(x) $$\n", 695 | "\n", 696 | "on the interval $[-10, 10]$." 697 | ] 698 | }, 699 | { 700 | "cell_type": "code", 701 | "execution_count": null, 702 | "metadata": {}, 703 | "outputs": [], 704 | "source": [] 705 | } 706 | ], 707 | "metadata": { 708 | "@webio": { 709 | "lastCommId": "569af16b6e774f638bc3f181971a0177", 710 | "lastKernelId": "017d345f-e961-4c80-b946-ceee3c8e55a5" 711 | }, 712 | "anaconda-cloud": {}, 713 | "kernelspec": { 714 | "display_name": "Python 3", 715 | "language": "python", 716 | "name": "python3" 717 | }, 718 | "language_info": { 719 | "codemirror_mode": { 720 | "name": "ipython", 721 | "version": 3 722 | }, 723 | "file_extension": ".py", 724 | "mimetype": "text/x-python", 725 | "name": "python", 726 | "nbconvert_exporter": "python", 727 | "pygments_lexer": "ipython3", 728 | "version": "3.7.1" 729 | } 730 | }, 731 | "nbformat": 4, 732 | "nbformat_minor": 1 733 | } 734 | -------------------------------------------------------------------------------- /notebooks/PythonCrashCourse.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Python Crash Course\n", 8 | "\n", 9 | "We do not have time to do an in depth review of what is possible in Python, so we opt for a \"crash course\" style\n", 10 | "introduction\n", 11 | "\n", 12 | "Many of the examples we see below come from past QuantEcon workshops.\n" 13 | ] 14 | }, 15 | { 16 | "cell_type": "markdown", 17 | "metadata": {}, 18 | "source": [ 19 | "## Basic Python\n", 20 | "\n", 21 | "Here is a quick overview of Python syntax" 22 | ] 23 | }, 24 | { 25 | "cell_type": "markdown", 26 | "metadata": {}, 27 | "source": [ 28 | "### Variable Assignment\n", 29 | "\n", 30 | "Can store variables by \"assigning\" them with the `=`" 31 | ] 32 | }, 33 | { 34 | "cell_type": "code", 35 | "execution_count": null, 36 | "metadata": {}, 37 | "outputs": [], 38 | "source": [ 39 | "x = 1" 40 | ] 41 | }, 42 | { 43 | "cell_type": "markdown", 44 | "metadata": {}, 45 | "source": [ 46 | "Above we assigned 1 to the variable `x` -- Notice that we can reference `x` later in our code" 47 | ] 48 | }, 49 | { 50 | "cell_type": "code", 51 | "execution_count": null, 52 | "metadata": {}, 53 | "outputs": [], 54 | "source": [ 55 | "x" 56 | ] 57 | }, 58 | { 59 | "cell_type": "markdown", 60 | "metadata": {}, 61 | "source": [ 62 | "### Comments\n", 63 | "\n", 64 | "Python ignores anything that comes after a `#` in a given line" 65 | ] 66 | }, 67 | { 68 | "cell_type": "code", 69 | "execution_count": null, 70 | "metadata": {}, 71 | "outputs": [], 72 | "source": [ 73 | "x = 1 # 2, 3, 4" 74 | ] 75 | }, 76 | { 77 | "cell_type": "code", 78 | "execution_count": null, 79 | "metadata": {}, 80 | "outputs": [], 81 | "source": [ 82 | "x" 83 | ] 84 | }, 85 | { 86 | "cell_type": "markdown", 87 | "metadata": {}, 88 | "source": [ 89 | "### Numeric Types\n", 90 | "\n", 91 | "Two basic numeric types in Python\n", 92 | "\n", 93 | "* Integers\n", 94 | "* Floats" 95 | ] 96 | }, 97 | { 98 | "cell_type": "code", 99 | "execution_count": null, 100 | "metadata": {}, 101 | "outputs": [], 102 | "source": [ 103 | "x_i = 1" 104 | ] 105 | }, 106 | { 107 | "cell_type": "code", 108 | "execution_count": null, 109 | "metadata": {}, 110 | "outputs": [], 111 | "source": [ 112 | "type(x_i)" 113 | ] 114 | }, 115 | { 116 | "cell_type": "code", 117 | "execution_count": null, 118 | "metadata": {}, 119 | "outputs": [], 120 | "source": [ 121 | "x_f = 1.0" 122 | ] 123 | }, 124 | { 125 | "cell_type": "code", 126 | "execution_count": null, 127 | "metadata": {}, 128 | "outputs": [], 129 | "source": [ 130 | "type(x_f)" 131 | ] 132 | }, 133 | { 134 | "cell_type": "code", 135 | "execution_count": null, 136 | "metadata": {}, 137 | "outputs": [], 138 | "source": [ 139 | "x = 2\n", 140 | "y = 3\n", 141 | "\n", 142 | "print(\"x + y is\", x + y)\n", 143 | "print(\"x - y is\", x - y)\n", 144 | "print(\"x * y is\", x * y)\n", 145 | "print(\"x / y is\", x / y)\n" 146 | ] 147 | }, 148 | { 149 | "cell_type": "code", 150 | "execution_count": null, 151 | "metadata": {}, 152 | "outputs": [], 153 | "source": [ 154 | "print(\"x ^ y is\", x^y)" 155 | ] 156 | }, 157 | { 158 | "cell_type": "code", 159 | "execution_count": null, 160 | "metadata": {}, 161 | "outputs": [], 162 | "source": [ 163 | "print(\"x ** y is \", x**y)" 164 | ] 165 | }, 166 | { 167 | "cell_type": "markdown", 168 | "metadata": {}, 169 | "source": [ 170 | "### Collection Types\n", 171 | "\n", 172 | "* List: Mutable ordered structure\n", 173 | "* Tuple: Immutable ordered structure\n", 174 | "* Dictionary: Mutable unordered structure defined by sequence of \"keys\" and \"values\"" 175 | ] 176 | }, 177 | { 178 | "cell_type": "code", 179 | "execution_count": null, 180 | "metadata": {}, 181 | "outputs": [], 182 | "source": [ 183 | "c_l = [1, 2, 3]" 184 | ] 185 | }, 186 | { 187 | "cell_type": "code", 188 | "execution_count": null, 189 | "metadata": {}, 190 | "outputs": [], 191 | "source": [ 192 | "type(c_l)" 193 | ] 194 | }, 195 | { 196 | "cell_type": "code", 197 | "execution_count": null, 198 | "metadata": {}, 199 | "outputs": [], 200 | "source": [ 201 | "c_t = (1, 2, 3)" 202 | ] 203 | }, 204 | { 205 | "cell_type": "code", 206 | "execution_count": null, 207 | "metadata": {}, 208 | "outputs": [], 209 | "source": [ 210 | "type(c_t)" 211 | ] 212 | }, 213 | { 214 | "cell_type": "code", 215 | "execution_count": null, 216 | "metadata": {}, 217 | "outputs": [], 218 | "source": [ 219 | "c_d = {\"a\": 1, \"b\": 2, \"c\": 3}" 220 | ] 221 | }, 222 | { 223 | "cell_type": "code", 224 | "execution_count": null, 225 | "metadata": {}, 226 | "outputs": [], 227 | "source": [ 228 | "type(c_d)" 229 | ] 230 | }, 231 | { 232 | "cell_type": "markdown", 233 | "metadata": {}, 234 | "source": [ 235 | "**Indexing Collections**\n", 236 | "\n", 237 | "Collections are mostly useful if we can extract the values contained inside of them -- This is called \"indexing.\" In Python we index with square brackets (`[` and `]`)\n", 238 | "\n", 239 | "Python is a 0-based language meaning that collection items start at the \"0th\" item" 240 | ] 241 | }, 242 | { 243 | "cell_type": "code", 244 | "execution_count": null, 245 | "metadata": {}, 246 | "outputs": [], 247 | "source": [ 248 | "c_l[0]" 249 | ] 250 | }, 251 | { 252 | "cell_type": "code", 253 | "execution_count": null, 254 | "metadata": {}, 255 | "outputs": [], 256 | "source": [ 257 | "c_l[1]" 258 | ] 259 | }, 260 | { 261 | "cell_type": "code", 262 | "execution_count": null, 263 | "metadata": {}, 264 | "outputs": [], 265 | "source": [ 266 | "c_l[0] = 0" 267 | ] 268 | }, 269 | { 270 | "cell_type": "code", 271 | "execution_count": null, 272 | "metadata": {}, 273 | "outputs": [], 274 | "source": [ 275 | "c_l" 276 | ] 277 | }, 278 | { 279 | "cell_type": "code", 280 | "execution_count": null, 281 | "metadata": {}, 282 | "outputs": [], 283 | "source": [ 284 | "c_t[0]" 285 | ] 286 | }, 287 | { 288 | "cell_type": "code", 289 | "execution_count": null, 290 | "metadata": {}, 291 | "outputs": [], 292 | "source": [ 293 | "c_t[0] = 0" 294 | ] 295 | }, 296 | { 297 | "cell_type": "code", 298 | "execution_count": null, 299 | "metadata": {}, 300 | "outputs": [], 301 | "source": [ 302 | "c_d[\"a\"]" 303 | ] 304 | }, 305 | { 306 | "cell_type": "markdown", 307 | "metadata": {}, 308 | "source": [ 309 | "### Strings" 310 | ] 311 | }, 312 | { 313 | "cell_type": "code", 314 | "execution_count": null, 315 | "metadata": {}, 316 | "outputs": [], 317 | "source": [ 318 | "s = \"abc\"" 319 | ] 320 | }, 321 | { 322 | "cell_type": "code", 323 | "execution_count": null, 324 | "metadata": {}, 325 | "outputs": [], 326 | "source": [ 327 | "type(s)" 328 | ] 329 | }, 330 | { 331 | "cell_type": "markdown", 332 | "metadata": {}, 333 | "source": [ 334 | "### Booleans" 335 | ] 336 | }, 337 | { 338 | "cell_type": "code", 339 | "execution_count": null, 340 | "metadata": {}, 341 | "outputs": [], 342 | "source": [ 343 | "b = True" 344 | ] 345 | }, 346 | { 347 | "cell_type": "code", 348 | "execution_count": null, 349 | "metadata": {}, 350 | "outputs": [], 351 | "source": [ 352 | "print(\"1 < 2 is\", 1 < 2)\n", 353 | "print(\"1 <= 1 is\", 1 <= 1)\n", 354 | "print(\"2 > 3 is\", 2 > 3)\n", 355 | "print(\"2 >= 3 is\", 2 >= 3)\n", 356 | "print(\"2 != 3 is\", 2 != 3)" 357 | ] 358 | }, 359 | { 360 | "cell_type": "code", 361 | "execution_count": null, 362 | "metadata": {}, 363 | "outputs": [], 364 | "source": [ 365 | "type(b)" 366 | ] 367 | }, 368 | { 369 | "cell_type": "markdown", 370 | "metadata": {}, 371 | "source": [ 372 | "### Conditionals" 373 | ] 374 | }, 375 | { 376 | "cell_type": "code", 377 | "execution_count": null, 378 | "metadata": {}, 379 | "outputs": [], 380 | "source": [ 381 | "if True:\n", 382 | " print(\"True\")" 383 | ] 384 | }, 385 | { 386 | "cell_type": "code", 387 | "execution_count": null, 388 | "metadata": {}, 389 | "outputs": [], 390 | "source": [ 391 | "month = 10\n", 392 | "\n", 393 | "if month < 10:\n", 394 | " print(\"It is not October\")\n", 395 | "elif month > 10:\n", 396 | " print(\"October already came\")\n", 397 | "else:\n", 398 | " print(\"It must be October!\")" 399 | ] 400 | }, 401 | { 402 | "cell_type": "markdown", 403 | "metadata": {}, 404 | "source": [ 405 | "### Loops" 406 | ] 407 | }, 408 | { 409 | "cell_type": "code", 410 | "execution_count": null, 411 | "metadata": {}, 412 | "outputs": [], 413 | "source": [ 414 | "counter = 0\n", 415 | "while counter < 100:\n", 416 | " counter += 1\n", 417 | "\n", 418 | "print(\"The counter is now\", counter)" 419 | ] 420 | }, 421 | { 422 | "cell_type": "code", 423 | "execution_count": null, 424 | "metadata": {}, 425 | "outputs": [], 426 | "source": [ 427 | "value = 1.0\n", 428 | "fact_num = 5\n", 429 | "\n", 430 | "for i in range(1, fact_num + 1):\n", 431 | " value = value * i\n", 432 | "\n", 433 | "print(f\"Factorial of {fact_num} is \", value)" 434 | ] 435 | }, 436 | { 437 | "cell_type": "markdown", 438 | "metadata": {}, 439 | "source": [ 440 | "### Functions" 441 | ] 442 | }, 443 | { 444 | "cell_type": "markdown", 445 | "metadata": {}, 446 | "source": [ 447 | "**Built-in functions**" 448 | ] 449 | }, 450 | { 451 | "cell_type": "code", 452 | "execution_count": null, 453 | "metadata": {}, 454 | "outputs": [], 455 | "source": [ 456 | "x = [1, 2, 3, 4, 5]" 457 | ] 458 | }, 459 | { 460 | "cell_type": "code", 461 | "execution_count": null, 462 | "metadata": {}, 463 | "outputs": [], 464 | "source": [ 465 | "max(x)" 466 | ] 467 | }, 468 | { 469 | "cell_type": "code", 470 | "execution_count": null, 471 | "metadata": {}, 472 | "outputs": [], 473 | "source": [ 474 | "min(x)" 475 | ] 476 | }, 477 | { 478 | "cell_type": "code", 479 | "execution_count": null, 480 | "metadata": {}, 481 | "outputs": [], 482 | "source": [ 483 | "len(x)" 484 | ] 485 | }, 486 | { 487 | "cell_type": "markdown", 488 | "metadata": {}, 489 | "source": [ 490 | "**Methods**\n", 491 | "\n", 492 | "Methods are functions that are attached to a type -- For example, since lists are mutable, there is an `append` method which adds new items to a list" 493 | ] 494 | }, 495 | { 496 | "cell_type": "code", 497 | "execution_count": null, 498 | "metadata": {}, 499 | "outputs": [], 500 | "source": [ 501 | "x = [0, 1, 2]" 502 | ] 503 | }, 504 | { 505 | "cell_type": "code", 506 | "execution_count": null, 507 | "metadata": {}, 508 | "outputs": [], 509 | "source": [ 510 | "x.append(3)" 511 | ] 512 | }, 513 | { 514 | "cell_type": "code", 515 | "execution_count": null, 516 | "metadata": {}, 517 | "outputs": [], 518 | "source": [ 519 | "x" 520 | ] 521 | }, 522 | { 523 | "cell_type": "code", 524 | "execution_count": null, 525 | "metadata": {}, 526 | "outputs": [], 527 | "source": [ 528 | "s = \"capitalize me!\"" 529 | ] 530 | }, 531 | { 532 | "cell_type": "code", 533 | "execution_count": null, 534 | "metadata": {}, 535 | "outputs": [], 536 | "source": [ 537 | "s.upper()" 538 | ] 539 | }, 540 | { 541 | "cell_type": "markdown", 542 | "metadata": {}, 543 | "source": [ 544 | "Can find a type's methods by typing object name then `.` and hitting the `` button: Try it below for s:" 545 | ] 546 | }, 547 | { 548 | "cell_type": "code", 549 | "execution_count": null, 550 | "metadata": {}, 551 | "outputs": [], 552 | "source": [ 553 | "# s. # Uncomment and " 554 | ] 555 | }, 556 | { 557 | "cell_type": "markdown", 558 | "metadata": {}, 559 | "source": [ 560 | "**Define your own functions**" 561 | ] 562 | }, 563 | { 564 | "cell_type": "code", 565 | "execution_count": null, 566 | "metadata": {}, 567 | "outputs": [], 568 | "source": [ 569 | "def my_max(x, return_value_one=False):\n", 570 | " _max = -1e10\n", 571 | " for el in x:\n", 572 | " if el > _max:\n", 573 | " _max = el\n", 574 | " \n", 575 | " out = _max\n", 576 | " if return_value_one:\n", 577 | " out = 1\n", 578 | "\n", 579 | " return out" 580 | ] 581 | }, 582 | { 583 | "cell_type": "code", 584 | "execution_count": null, 585 | "metadata": {}, 586 | "outputs": [], 587 | "source": [ 588 | "my_max([1, 2, 3])" 589 | ] 590 | }, 591 | { 592 | "cell_type": "code", 593 | "execution_count": null, 594 | "metadata": {}, 595 | "outputs": [], 596 | "source": [ 597 | "my_max([1, 2, 3], return_value_one=True)" 598 | ] 599 | }, 600 | { 601 | "cell_type": "markdown", 602 | "metadata": {}, 603 | "source": [ 604 | "### Packages\n", 605 | "\n", 606 | "One of key features that makes Python such a useful language is the variety of packages available\n", 607 | "\n", 608 | "To use the functionality provided in a package, it must first be imported" 609 | ] 610 | }, 611 | { 612 | "cell_type": "code", 613 | "execution_count": null, 614 | "metadata": {}, 615 | "outputs": [], 616 | "source": [ 617 | "import math" 618 | ] 619 | }, 620 | { 621 | "cell_type": "code", 622 | "execution_count": null, 623 | "metadata": {}, 624 | "outputs": [], 625 | "source": [ 626 | "math.sqrt(4)" 627 | ] 628 | }, 629 | { 630 | "cell_type": "code", 631 | "execution_count": null, 632 | "metadata": {}, 633 | "outputs": [], 634 | "source": [ 635 | "math.log(1.0)" 636 | ] 637 | }, 638 | { 639 | "cell_type": "markdown", 640 | "metadata": {}, 641 | "source": [ 642 | "Can either nickname packages or import specific functions into the name space to facilitate access " 643 | ] 644 | }, 645 | { 646 | "cell_type": "code", 647 | "execution_count": null, 648 | "metadata": {}, 649 | "outputs": [], 650 | "source": [ 651 | "import random as r" 652 | ] 653 | }, 654 | { 655 | "cell_type": "code", 656 | "execution_count": null, 657 | "metadata": {}, 658 | "outputs": [], 659 | "source": [ 660 | "r.normalvariate(0.0, 1.0)" 661 | ] 662 | }, 663 | { 664 | "cell_type": "code", 665 | "execution_count": null, 666 | "metadata": {}, 667 | "outputs": [], 668 | "source": [ 669 | "from math import log" 670 | ] 671 | }, 672 | { 673 | "cell_type": "code", 674 | "execution_count": null, 675 | "metadata": {}, 676 | "outputs": [], 677 | "source": [ 678 | "log(1.0)" 679 | ] 680 | }, 681 | { 682 | "cell_type": "markdown", 683 | "metadata": {}, 684 | "source": [ 685 | "## Exercise:\n", 686 | "\n", 687 | "\n", 688 | "1. Define a function that takes a list of numbers as an input and computes the mean of those numbers\n", 689 | "2. Define a function that takes a list of numbers as an input and computes the standard deviation\n", 690 | "3. Write a function that simulates an AR(1) process:\n", 691 | " $$y_{t+1} = \\rho y_t + \\sigma \\varepsilon_{t+1}$$\n", 692 | " for 25 periods and returns the last value. Use $\\rho = 0.9$ and $\\sigma = 0.1$\n", 693 | "4. Create a list that contains $N$ values of the AR(1) that has been simulated for 25 periods. What are the mean and standard deviation of these simulation for $N = 10, 50, 100$? How does this compare with theoretical values?" 694 | ] 695 | }, 696 | { 697 | "cell_type": "code", 698 | "execution_count": null, 699 | "metadata": {}, 700 | "outputs": [], 701 | "source": [] 702 | }, 703 | { 704 | "cell_type": "code", 705 | "execution_count": null, 706 | "metadata": {}, 707 | "outputs": [], 708 | "source": [] 709 | }, 710 | { 711 | "cell_type": "code", 712 | "execution_count": null, 713 | "metadata": {}, 714 | "outputs": [], 715 | "source": [] 716 | }, 717 | { 718 | "cell_type": "code", 719 | "execution_count": null, 720 | "metadata": {}, 721 | "outputs": [], 722 | "source": [] 723 | } 724 | ], 725 | "metadata": { 726 | "@webio": { 727 | "lastCommId": "77284c09bcca45ceb8e3d24ea3aedf08", 728 | "lastKernelId": "ca492e90-c942-4a56-824f-3bf235c7f6cd" 729 | }, 730 | "kernelspec": { 731 | "display_name": "Python 3", 732 | "language": "python", 733 | "name": "python3" 734 | }, 735 | "language_info": { 736 | "codemirror_mode": { 737 | "name": "ipython", 738 | "version": 3 739 | }, 740 | "file_extension": ".py", 741 | "mimetype": "text/x-python", 742 | "name": "python", 743 | "nbconvert_exporter": "python", 744 | "pygments_lexer": "ipython3", 745 | "version": "3.7.1" 746 | } 747 | }, 748 | "nbformat": 4, 749 | "nbformat_minor": 2 750 | } 751 | -------------------------------------------------------------------------------- /notebooks/USIncomeGrowth.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# U.S. Income Growth\n", 8 | "\n", 9 | "The goal of this notebook is to demonstrate which counties/states have had the most income growth over the last 15 years -- We are also interested in whether this income growth is correlated with the growth of particular industries in those geographical areas." 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 94, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "import json\n", 19 | "import matplotlib.pyplot as plt\n", 20 | "import numpy as np\n", 21 | "import pandas as pd\n", 22 | "import requests as r\n", 23 | "import statsmodels.formula.api as sm\n", 24 | "\n", 25 | "from pandas_datareader import DataReader\n", 26 | "\n", 27 | "%matplotlib inline" 28 | ] 29 | }, 30 | { 31 | "cell_type": "markdown", 32 | "metadata": {}, 33 | "source": [ 34 | "## The Data\n", 35 | "\n", 36 | "We will be using the Bureau of Economic Analysis (BEA) data.\n", 37 | "\n", 38 | "**Note**: To follow along, you will need to register for your own API key at https://apps.bea.gov/API/signup/index.cfm.\n", 39 | "\n", 40 | "The BEA includes data on ..." 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": 3, 46 | "metadata": {}, 47 | "outputs": [], 48 | "source": [ 49 | "base_url = \"https://apps.bea.gov/api/data\"" 50 | ] 51 | }, 52 | { 53 | "cell_type": "code", 54 | "execution_count": 4, 55 | "metadata": {}, 56 | "outputs": [], 57 | "source": [ 58 | "# Insert your API key here\n", 59 | "api_key = \"1917F45C-CA3C-4490-9410-3EAC28D64A06\"" 60 | ] 61 | }, 62 | { 63 | "cell_type": "markdown", 64 | "metadata": {}, 65 | "source": [ 66 | "First, let's determine what datasets are available\n", 67 | "\n", 68 | "The data will come in a JSON format -- This is effectively a group of nested dictionaries." 69 | ] 70 | }, 71 | { 72 | "cell_type": "code", 73 | "execution_count": 40, 74 | "metadata": {}, 75 | "outputs": [ 76 | { 77 | "data": { 78 | "text/plain": [ 79 | "[{'DatasetName': 'RegionalData',\n", 80 | " 'DatasetDescription': 'The RegionalData dataset is obsolete. Please use the Regional dataset. See API documentation at apps.bea.gov/developers'},\n", 81 | " {'DatasetName': 'NIPA', 'DatasetDescription': 'Standard NIPA tables'},\n", 82 | " {'DatasetName': 'NIUnderlyingDetail',\n", 83 | " 'DatasetDescription': 'Standard NI underlying detail tables'},\n", 84 | " {'DatasetName': 'MNE', 'DatasetDescription': 'Multinational Enterprises'},\n", 85 | " {'DatasetName': 'FixedAssets',\n", 86 | " 'DatasetDescription': 'Standard Fixed Assets tables'},\n", 87 | " {'DatasetName': 'ITA',\n", 88 | " 'DatasetDescription': 'International Transactions Accounts'},\n", 89 | " {'DatasetName': 'IIP',\n", 90 | " 'DatasetDescription': 'International Investment Position'},\n", 91 | " {'DatasetName': 'GDPbyIndustry', 'DatasetDescription': 'GDP by Industry'},\n", 92 | " {'DatasetName': 'RegionalIncome',\n", 93 | " 'DatasetDescription': 'Regional Income data sets'},\n", 94 | " {'DatasetName': 'RegionalProduct',\n", 95 | " 'DatasetDescription': 'Regional Product data sets'},\n", 96 | " {'DatasetName': 'InputOutput', 'DatasetDescription': 'Input-Output Data'},\n", 97 | " {'DatasetName': 'UnderlyingGDPbyIndustry',\n", 98 | " 'DatasetDescription': 'Underlying GDP by Industry'},\n", 99 | " {'DatasetName': 'IntlServTrade',\n", 100 | " 'DatasetDescription': 'International Services Trade'},\n", 101 | " {'DatasetName': 'Regional', 'DatasetDescription': 'Regional data sets'},\n", 102 | " {'DatasetName': 'APIDatasetMetaData',\n", 103 | " 'DatasetDescription': 'Metadata about other API datasets'}]" 104 | ] 105 | }, 106 | "execution_count": 40, 107 | "metadata": {}, 108 | "output_type": "execute_result" 109 | } 110 | ], 111 | "source": [ 112 | "json.loads(\n", 113 | " r.get(base_url, params={\"UserID\": api_key, \"method\": \"GETDATASETLIST\"}).text\n", 114 | ")[\"BEAAPI\"][\"Results\"][\"Dataset\"]\n" 115 | ] 116 | }, 117 | { 118 | "cell_type": "code", 119 | "execution_count": 65, 120 | "metadata": {}, 121 | "outputs": [ 122 | { 123 | "data": { 124 | "text/plain": [ 125 | "{'ParamValue': [{'Key': 'ACArtsComp', 'Desc': 'ACPSA Compensation (NAICS)'},\n", 126 | " {'Key': 'ACArtsEmp', 'Desc': 'ACPSA Employment (NAICS)'},\n", 127 | " {'Key': 'ACArtsVA', 'Desc': 'ACPSA Value Added (NAICS)'},\n", 128 | " {'Key': 'ACComp', 'Desc': 'Total Compensation (NAICS)'},\n", 129 | " {'Key': 'ACCompLQ', 'Desc': 'Arts Compensation Location Quotient (NAICS)'},\n", 130 | " {'Key': 'ACCompRatio', 'Desc': 'Arts Compensation Ratio (NAICS)'},\n", 131 | " {'Key': 'ACEmp', 'Desc': 'Total Employment (NAICS)'},\n", 132 | " {'Key': 'ACEmpLQ', 'Desc': 'Arts Employment Location Quotient (NAICS)'},\n", 133 | " {'Key': 'ACEmpRatio', 'Desc': 'Arts Employment Ratio (NAICS)'},\n", 134 | " {'Key': 'ACVA', 'Desc': 'Total Value Added (NAICS)'},\n", 135 | " {'Key': 'ACVALQ', 'Desc': 'Arts Value Added Location Quotient (NAICS)'},\n", 136 | " {'Key': 'ACVARatio', 'Desc': 'Arts Value Added Ratio (NAICS)'},\n", 137 | " {'Key': 'CAEMP25N',\n", 138 | " 'Desc': 'Total Full-Time and Part-Time Employment by NAICS Industry (NAICS)'},\n", 139 | " {'Key': 'CAEMP25S',\n", 140 | " 'Desc': 'Total Full-Time and Part-Time Employment by SIC Industry (SIC)'},\n", 141 | " {'Key': 'CAINC1',\n", 142 | " 'Desc': 'Personal Income Summary: Personal Income, Population, Per Capita Personal Income (Non-Industry)'},\n", 143 | " {'Key': 'CAINC30', 'Desc': 'Economic Profile (Non-Industry)'},\n", 144 | " {'Key': 'CAINC35',\n", 145 | " 'Desc': 'Personal Current Transfer Receipts (Non-Industry)'},\n", 146 | " {'Key': 'CAINC4',\n", 147 | " 'Desc': 'Personal Income and Employment by Major Component (Non-Industry)'},\n", 148 | " {'Key': 'CAINC45', 'Desc': 'Farm Income and Expenses (Non-Industry)'},\n", 149 | " {'Key': 'CAINC5N',\n", 150 | " 'Desc': 'Personal Income by Major Component and Earnings by NAICS Industry (NAICS)'},\n", 151 | " {'Key': 'CAINC5S',\n", 152 | " 'Desc': 'Personal Income by Major Component and Earnings by SIC Industry (SIC)'},\n", 153 | " {'Key': 'CAINC6N',\n", 154 | " 'Desc': 'Compensation of Employees by NAICS Industry (NAICS)'},\n", 155 | " {'Key': 'CAINC6S',\n", 156 | " 'Desc': 'Compensation of Employees by SIC Industry (SIC)'},\n", 157 | " {'Key': 'CAINC91', 'Desc': 'Gross Flow of Earnings (Non-Industry)'},\n", 158 | " {'Key': 'MAGDP10',\n", 159 | " 'Desc': 'Per capita real GDP by metropolitan area (NAICS)'},\n", 160 | " {'Key': 'MAGDP2',\n", 161 | " 'Desc': 'Gross domestic product (GDP) by metropolitan area (NAICS)'},\n", 162 | " {'Key': 'MAGDP8',\n", 163 | " 'Desc': 'Quantity indexes for real GDP by metropolitan area (2009=100.0) (NAICS)'},\n", 164 | " {'Key': 'MAGDP9', 'Desc': 'Real GDP by metropolitan area (NAICS)'},\n", 165 | " {'Key': 'MAINC1',\n", 166 | " 'Desc': 'Personal Income Summary: Personal Income, Population, Per Capita Personal Income (Non-Industry)'},\n", 167 | " {'Key': 'MAINC30', 'Desc': 'Economic Profile (Non-Industry)'},\n", 168 | " {'Key': 'MAINC4',\n", 169 | " 'Desc': 'Personal Income and Employment by Major Component (Non-Industry)'},\n", 170 | " {'Key': 'MAIRPD', 'Desc': 'Implicit Price Deflators by MSA (Non-Industry)'},\n", 171 | " {'Key': 'MARPI', 'Desc': 'Real Personal Income by MSA (Non-Industry)'},\n", 172 | " {'Key': 'MARPP', 'Desc': 'Regional Price Parities by MSA (Non-Industry)'},\n", 173 | " {'Key': 'PAIRPD',\n", 174 | " 'Desc': 'Implicit Price Deflators by Portion (Non-Industry)'},\n", 175 | " {'Key': 'PARPI', 'Desc': 'Real Personal Income by Portion (Non-Industry)'},\n", 176 | " {'Key': 'PARPP',\n", 177 | " 'Desc': 'Regional Price Parities by Portion (Non-Industry)'},\n", 178 | " {'Key': 'SAEMP25N',\n", 179 | " 'Desc': 'Total Full-Time and Part-Time Employment by NAICS Industry (NAICS)'},\n", 180 | " {'Key': 'SAEMP25S',\n", 181 | " 'Desc': 'Total Full-Time and Part-Time Employment by SIC Industry (SIC)'},\n", 182 | " {'Key': 'SAEMP27N',\n", 183 | " 'Desc': 'Full-Time and Part-Time Wage and Salary Employment by NAICS Industry (NAICS)'},\n", 184 | " {'Key': 'SAEMP27S',\n", 185 | " 'Desc': 'Full-Time and Part-Time Wage and Salary Employment by SIC Industry (SIC)'},\n", 186 | " {'Key': 'SAEXP1',\n", 187 | " 'Desc': 'Total personal consumption expenditures (PCE) by state (NAICS)'},\n", 188 | " {'Key': 'SAEXP2',\n", 189 | " 'Desc': 'Per capita personal consumption expenditures (PCE) by state (NAICS)'},\n", 190 | " {'Key': 'SAGDP10N', 'Desc': 'Per capita real GDP by state (NAICS)'},\n", 191 | " {'Key': 'SAGDP10S', 'Desc': 'Per capita real GDP by state (SIC)'},\n", 192 | " {'Key': 'SAGDP11N',\n", 193 | " 'Desc': 'Contributions to percent change in real GDP (NAICS)'},\n", 194 | " {'Key': 'SAGDP2N', 'Desc': 'Gross domestic product (GDP) by state (NAICS)'},\n", 195 | " {'Key': 'SAGDP2S', 'Desc': 'Gross domestic product (GDP) by state (SIC)'},\n", 196 | " {'Key': 'SAGDP3N',\n", 197 | " 'Desc': 'Taxes on production and imports less subsidies (NAICS)'},\n", 198 | " {'Key': 'SAGDP3S',\n", 199 | " 'Desc': 'Taxes on production and imports less subsidies (SIC)'},\n", 200 | " {'Key': 'SAGDP4N', 'Desc': 'Compensation of employees (NAICS)'},\n", 201 | " {'Key': 'SAGDP4S', 'Desc': 'Compensation of employees (SIC)'},\n", 202 | " {'Key': 'SAGDP5N', 'Desc': 'Subsidies (NAICS)'},\n", 203 | " {'Key': 'SAGDP5S', 'Desc': 'Subsidies (SIC)'},\n", 204 | " {'Key': 'SAGDP6N', 'Desc': 'Taxes on production and imports (NAICS)'},\n", 205 | " {'Key': 'SAGDP6S', 'Desc': 'Taxes on production and imports (SIC)'},\n", 206 | " {'Key': 'SAGDP7N', 'Desc': 'Gross operating surplus (NAICS)'},\n", 207 | " {'Key': 'SAGDP7S', 'Desc': 'Gross operating surplus (SIC)'},\n", 208 | " {'Key': 'SAGDP8N',\n", 209 | " 'Desc': 'Quantity indexes for real GDP by state (2012=100.0) (NAICS)'},\n", 210 | " {'Key': 'SAGDP8S',\n", 211 | " 'Desc': 'Quantity indexes for real GDP by state (1997=100.0) (SIC)'},\n", 212 | " {'Key': 'SAGDP9N', 'Desc': 'Real GDP by state (NAICS)'},\n", 213 | " {'Key': 'SAGDP9S', 'Desc': 'Real GDP by state (SIC)'},\n", 214 | " {'Key': 'SAINC1',\n", 215 | " 'Desc': 'Personal Income Summary: Personal Income, Population, Per Capita Personal Income (Non-Industry)'},\n", 216 | " {'Key': 'SAINC30', 'Desc': 'Economic Profile (Non-Industry)'},\n", 217 | " {'Key': 'SAINC35',\n", 218 | " 'Desc': 'Personal Current Transfer Receipts (Non-Industry)'},\n", 219 | " {'Key': 'SAINC4',\n", 220 | " 'Desc': 'Personal Income and Employment by Major Component (Non-Industry)'},\n", 221 | " {'Key': 'SAINC40', 'Desc': 'Property Income (Non-Industry)'},\n", 222 | " {'Key': 'SAINC45', 'Desc': 'Farm Income and Expenses (Non-Industry)'},\n", 223 | " {'Key': 'SAINC50', 'Desc': 'Personal Current Taxes (Non-Industry)'},\n", 224 | " {'Key': 'SAINC51',\n", 225 | " 'Desc': 'Disposable Personal Income Summary: Disposable Personal Income, Population, and Per Capita Disposable Personal Income (Non-Industry)'},\n", 226 | " {'Key': 'SAINC5H',\n", 227 | " 'Desc': 'Personal Income by Major Component and Earnings by Industry (Historical) (SIC)'},\n", 228 | " {'Key': 'SAINC5N',\n", 229 | " 'Desc': 'Personal Income by Major Component and Earnings by NAICS Industry (NAICS)'},\n", 230 | " {'Key': 'SAINC5S',\n", 231 | " 'Desc': 'Personal Income by Major Component and Earnings by SIC Industry (SIC)'},\n", 232 | " {'Key': 'SAINC6N',\n", 233 | " 'Desc': 'Compensation of Employees by NAICS Industry (NAICS)'},\n", 234 | " {'Key': 'SAINC6S',\n", 235 | " 'Desc': 'Compensation of Employees by SIC Industry (SIC)'},\n", 236 | " {'Key': 'SAINC7H',\n", 237 | " 'Desc': 'Wages and Salaries by Industry (Historical) (SIC)'},\n", 238 | " {'Key': 'SAINC7N', 'Desc': 'Wages and Salaries by NAICS Industry (NAICS)'},\n", 239 | " {'Key': 'SAINC7S', 'Desc': 'Wages and Salaries by SIC Industry (SIC)'},\n", 240 | " {'Key': 'SAIRPD',\n", 241 | " 'Desc': 'Implicit Price Deflators by state (Non-Industry)'},\n", 242 | " {'Key': 'SARPI', 'Desc': 'Real Personal Income by state (Non-Industry)'},\n", 243 | " {'Key': 'SARPP', 'Desc': 'Regional Price Parities by state (Non-Industry)'},\n", 244 | " {'Key': 'SQGDP11',\n", 245 | " 'Desc': 'Contributions to percent change in real GDP (NAICS)'},\n", 246 | " {'Key': 'SQGDP2', 'Desc': 'Gross domestic product (GDP) by state (NAICS)'},\n", 247 | " {'Key': 'SQGDP8',\n", 248 | " 'Desc': 'Quantity indexes for real GDP by state (2012=100.0) (NAICS)'},\n", 249 | " {'Key': 'SQGDP9', 'Desc': 'Real GDP by state (NAICS)'},\n", 250 | " {'Key': 'SQINC1',\n", 251 | " 'Desc': 'Personal Income Summary: Personal Income, Population, Per Capita Personal Income (Non-Industry)'},\n", 252 | " {'Key': 'SQINC35',\n", 253 | " 'Desc': 'Personal Current Transfer Receipts (Non-Industry)'},\n", 254 | " {'Key': 'SQINC4',\n", 255 | " 'Desc': 'Personal Income by Major Component (Non-Industry)'},\n", 256 | " {'Key': 'SQINC5H',\n", 257 | " 'Desc': 'Personal Income by Major Component and Earnings by Industry (Historical) (SIC)'},\n", 258 | " {'Key': 'SQINC5N',\n", 259 | " 'Desc': 'Personal Income by Major Component and Earnings by NAICS Industry (NAICS)'},\n", 260 | " {'Key': 'SQINC5S',\n", 261 | " 'Desc': 'Personal Income by Major Component and Earnings by SIC Industry (SIC)'},\n", 262 | " {'Key': 'SQINC6N',\n", 263 | " 'Desc': 'Compensation of Employees by NAICS Industry (NAICS)'},\n", 264 | " {'Key': 'SQINC6S',\n", 265 | " 'Desc': 'Compensation of Employees by SIC Industry (SIC)'},\n", 266 | " {'Key': 'SQINC7H',\n", 267 | " 'Desc': 'Wages and Salaries by Industry (Historical) (SIC)'},\n", 268 | " {'Key': 'SQINC7N', 'Desc': 'Wages and Salaries by NAICS Industry (NAICS)'},\n", 269 | " {'Key': 'SQINC7S', 'Desc': 'Wages and Salaries by SIC Industry (SIC)'}]}" 270 | ] 271 | }, 272 | "execution_count": 65, 273 | "metadata": {}, 274 | "output_type": "execute_result" 275 | } 276 | ], 277 | "source": [ 278 | "json.loads(r.get(base_url, params={\n", 279 | " \"UserID\": api_key,\n", 280 | " \"method\": \"GetParameterValues\",\n", 281 | " \"DataSetName\": \"Regional\",\n", 282 | " \"ParameterName\": \"TableName\",\n", 283 | " \"ResultFormat\": \"json\"\n", 284 | "}).text)[\"BEAAPI\"][\"Results\"]" 285 | ] 286 | }, 287 | { 288 | "cell_type": "code", 289 | "execution_count": 53, 290 | "metadata": {}, 291 | "outputs": [ 292 | { 293 | "data": { 294 | "text/plain": [ 295 | "{'ParamValue': [{'Key': '10', 'Desc': '[CAINC4] Personal income'},\n", 296 | " {'Key': '11', 'Desc': '[CAINC4] Nonfarm personal income'},\n", 297 | " {'Key': '12', 'Desc': '[CAINC4] Farm income'},\n", 298 | " {'Key': '20', 'Desc': '[CAINC4] Population'},\n", 299 | " {'Key': '30', 'Desc': '[CAINC4] Per capita personal income'},\n", 300 | " {'Key': '35', 'Desc': '[CAINC4] Earnings by place of work'},\n", 301 | " {'Key': '36',\n", 302 | " 'Desc': '[CAINC4] Contributions for government social insurance'},\n", 303 | " {'Key': '37',\n", 304 | " 'Desc': '[CAINC4] Employee and self-employed contributions for government social insurance'},\n", 305 | " {'Key': '38',\n", 306 | " 'Desc': '[CAINC4] Employer contributions for government social insurance'},\n", 307 | " {'Key': '42', 'Desc': '[CAINC4] Adjustment for residence'},\n", 308 | " {'Key': '45', 'Desc': '[CAINC4] Net earnings by place of residence'},\n", 309 | " {'Key': '46', 'Desc': '[CAINC4] Dividends, interest, and rent'},\n", 310 | " {'Key': '47', 'Desc': '[CAINC4] Personal current transfer receipts'},\n", 311 | " {'Key': '50', 'Desc': '[CAINC4] Wages and salaries'},\n", 312 | " {'Key': '60', 'Desc': '[CAINC4] Supplements to wages and salaries'},\n", 313 | " {'Key': '61',\n", 314 | " 'Desc': '[CAINC4] Employer contributions for employee pension and insurance funds'},\n", 315 | " {'Key': '62',\n", 316 | " 'Desc': '[CAINC4] Employer contributions for government social insurance'},\n", 317 | " {'Key': '70', 'Desc': \"[CAINC4] Proprietors' income\"},\n", 318 | " {'Key': '7010', 'Desc': '[CAINC4] Total employment'},\n", 319 | " {'Key': '7020', 'Desc': '[CAINC4] Wage and salary employment'},\n", 320 | " {'Key': '7040', 'Desc': '[CAINC4] Proprietors employment'},\n", 321 | " {'Key': '71', 'Desc': \"[CAINC4] Farm proprietors' income\"},\n", 322 | " {'Key': '72', 'Desc': \"[CAINC4] Nonfarm proprietors' income\"}]}" 323 | ] 324 | }, 325 | "execution_count": 53, 326 | "metadata": {}, 327 | "output_type": "execute_result" 328 | } 329 | ], 330 | "source": [ 331 | "json.loads(r.get(base_url, params={\n", 332 | " \"UserID\": api_key,\n", 333 | " \"method\": \"GetParameterValuesFiltered\",\n", 334 | " \"DataSetName\": \"Regional\",\n", 335 | " \"TableName\": \"CAINC4\",\n", 336 | " \"TargetParameter\": \"LineCode\",\n", 337 | " \"ResultFormat\": \"json\"\n", 338 | "}).text)[\"BEAAPI\"][\"Results\"]" 339 | ] 340 | }, 341 | { 342 | "cell_type": "code", 343 | "execution_count": 54, 344 | "metadata": {}, 345 | "outputs": [], 346 | "source": [ 347 | "regional_income = json.loads(\n", 348 | " r.get(base_url, params={\n", 349 | " \"UserID\": api_key,\n", 350 | " \"method\": \"GetData\",\n", 351 | " \"datasetname\": \"Regional\",\n", 352 | " \"Year\": \"2002,2017\",\n", 353 | " \"TableName\": \"SAINC4\",\n", 354 | " \"LineCode\": \"30\",\n", 355 | " \"GeoFips\": \"COUNTY\",\n", 356 | " \"ResultFormat\": \"json\"\n", 357 | " }).text\n", 358 | ")\n" 359 | ] 360 | }, 361 | { 362 | "cell_type": "markdown", 363 | "metadata": {}, 364 | "source": [ 365 | "Get CPI data from FRED to make sure we can convert from 2002 to 2017 dollars" 366 | ] 367 | }, 368 | { 369 | "cell_type": "code", 370 | "execution_count": 73, 371 | "metadata": {}, 372 | "outputs": [], 373 | "source": [ 374 | "cpi = (\n", 375 | " DataReader(\"CPIAUCSL\", \"fred\", start=2000, end=2018)\n", 376 | " .resample(\"A\")\n", 377 | " .mean()\n", 378 | ")" 379 | ] 380 | }, 381 | { 382 | "cell_type": "code", 383 | "execution_count": 88, 384 | "metadata": {}, 385 | "outputs": [], 386 | "source": [ 387 | "convert_2002_to_2017 = (\n", 388 | " cpi.loc[\"2017\", \"CPIAUCSL\"].values / cpi.loc[\"2002\", \"CPIAUCSL\"].values\n", 389 | ")[0]" 390 | ] 391 | }, 392 | { 393 | "cell_type": "code", 394 | "execution_count": 89, 395 | "metadata": {}, 396 | "outputs": [ 397 | { 398 | "data": { 399 | "text/plain": [ 400 | "1.3628660118606373" 401 | ] 402 | }, 403 | "execution_count": 89, 404 | "metadata": {}, 405 | "output_type": "execute_result" 406 | } 407 | ], 408 | "source": [ 409 | "convert_2002_to_2017" 410 | ] 411 | }, 412 | { 413 | "cell_type": "markdown", 414 | "metadata": {}, 415 | "source": [ 416 | "Let's separate out the geographical codes so that we can reference them back and forth later" 417 | ] 418 | }, 419 | { 420 | "cell_type": "code", 421 | "execution_count": 55, 422 | "metadata": {}, 423 | "outputs": [], 424 | "source": [ 425 | "geofips = pd.DataFrame(regional_income[\"BEAAPI\"][\"Results\"][\"Data\"]).loc[:, [\"GeoFips\", \"GeoName\"]]\n", 426 | "\n", 427 | "fip_2_name = geofips.set_index(\"GeoFips\").to_dict()[\"GeoName\"]\n", 428 | "name_2_fip = geofips.set_index(\"GeoName\").to_dict()[\"GeoFips\"]" 429 | ] 430 | }, 431 | { 432 | "cell_type": "code", 433 | "execution_count": 56, 434 | "metadata": {}, 435 | "outputs": [ 436 | { 437 | "data": { 438 | "text/plain": [ 439 | "'United States'" 440 | ] 441 | }, 442 | "execution_count": 56, 443 | "metadata": {}, 444 | "output_type": "execute_result" 445 | } 446 | ], 447 | "source": [ 448 | "fip_2_name[\"00000\"]" 449 | ] 450 | }, 451 | { 452 | "cell_type": "code", 453 | "execution_count": 57, 454 | "metadata": {}, 455 | "outputs": [ 456 | { 457 | "data": { 458 | "text/plain": [ 459 | "'00000'" 460 | ] 461 | }, 462 | "execution_count": 57, 463 | "metadata": {}, 464 | "output_type": "execute_result" 465 | } 466 | ], 467 | "source": [ 468 | "name_2_fip[\"United States\"]" 469 | ] 470 | }, 471 | { 472 | "cell_type": "markdown", 473 | "metadata": {}, 474 | "source": [ 475 | "Now, we make the income data into a usable data structure" 476 | ] 477 | }, 478 | { 479 | "cell_type": "code", 480 | "execution_count": 58, 481 | "metadata": {}, 482 | "outputs": [], 483 | "source": [ 484 | "df_income = pd.DataFrame(regional_income[\"BEAAPI\"][\"Results\"][\"Data\"])\n", 485 | "df_income = (\n", 486 | " df_income.drop([\"CL_UNIT\", \"Code\", \"NoteRef\", \"UNIT_MULT\", \"GeoName\"], axis=1)\n", 487 | " .rename(columns={\"TimePeriod\": \"Year\", \"DataValue\": \"Income\"})\n", 488 | " .query(\"GeoFips < '57000'\")\n", 489 | " .assign(\n", 490 | " Income=lambda x: pd.to_numeric(x[\"Income\"].str.replace(\",\", \"\"), errors=\"coerce\"),\n", 491 | " FipsType=lambda x: x[\"GeoFips\"].map(\n", 492 | " lambda y: \"Country\" if y == \"00000\" else \"State\" if int(y) % 1000 == 0 else \"County\"\n", 493 | " ),\n", 494 | " )\n", 495 | " .set_index([\"Year\", \"GeoFips\"])\n", 496 | ")" 497 | ] 498 | }, 499 | { 500 | "cell_type": "code", 501 | "execution_count": 90, 502 | "metadata": {}, 503 | "outputs": [ 504 | { 505 | "data": { 506 | "text/html": [ 507 | "
\n", 508 | "\n", 521 | "\n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | "
IncomeFipsType
YearGeoFips
20020000031832Country
20170000051731Country
20020100025706State
20170100040802State
20020200034564State
\n", 569 | "
" 570 | ], 571 | "text/plain": [ 572 | " Income FipsType\n", 573 | "Year GeoFips \n", 574 | "2002 00000 31832 Country\n", 575 | "2017 00000 51731 Country\n", 576 | "2002 01000 25706 State\n", 577 | "2017 01000 40802 State\n", 578 | "2002 02000 34564 State" 579 | ] 580 | }, 581 | "execution_count": 90, 582 | "metadata": {}, 583 | "output_type": "execute_result" 584 | } 585 | ], 586 | "source": [ 587 | "df_income.head()" 588 | ] 589 | }, 590 | { 591 | "cell_type": "markdown", 592 | "metadata": {}, 593 | "source": [ 594 | "Now let's ask some basic questions of our data:" 595 | ] 596 | }, 597 | { 598 | "cell_type": "markdown", 599 | "metadata": {}, 600 | "source": [ 601 | "Which state has the highest per capita income in 2002? In 2017?" 602 | ] 603 | }, 604 | { 605 | "cell_type": "code", 606 | "execution_count": 60, 607 | "metadata": {}, 608 | "outputs": [ 609 | { 610 | "data": { 611 | "text/plain": [ 612 | "'District of Columbia'" 613 | ] 614 | }, 615 | "execution_count": 60, 616 | "metadata": {}, 617 | "output_type": "execute_result" 618 | } 619 | ], 620 | "source": [ 621 | "state_max = df_income.loc[\"2002\", :].query(\"FipsType == 'State'\")[\"Income\"].idxmax()\n", 622 | "\n", 623 | "fip_2_name[state_max]" 624 | ] 625 | }, 626 | { 627 | "cell_type": "code", 628 | "execution_count": 61, 629 | "metadata": {}, 630 | "outputs": [ 631 | { 632 | "data": { 633 | "text/plain": [ 634 | "'District of Columbia'" 635 | ] 636 | }, 637 | "execution_count": 61, 638 | "metadata": {}, 639 | "output_type": "execute_result" 640 | } 641 | ], 642 | "source": [ 643 | "state_max = df_income.loc[\"2017\", :].query(\"FipsType == 'State'\")[\"Income\"].idxmax()\n", 644 | "\n", 645 | "fip_2_name[state_max]" 646 | ] 647 | }, 648 | { 649 | "cell_type": "markdown", 650 | "metadata": {}, 651 | "source": [ 652 | "Which state has the lowest per capita income in 2002? In 2017?" 653 | ] 654 | }, 655 | { 656 | "cell_type": "code", 657 | "execution_count": 62, 658 | "metadata": {}, 659 | "outputs": [ 660 | { 661 | "data": { 662 | "text/plain": [ 663 | "'Mississippi'" 664 | ] 665 | }, 666 | "execution_count": 62, 667 | "metadata": {}, 668 | "output_type": "execute_result" 669 | } 670 | ], 671 | "source": [ 672 | "state_max = df_income.loc[\"2002\", :].query(\"FipsType == 'State'\")[\"Income\"].idxmin()\n", 673 | "\n", 674 | "fip_2_name[state_max]" 675 | ] 676 | }, 677 | { 678 | "cell_type": "code", 679 | "execution_count": 63, 680 | "metadata": {}, 681 | "outputs": [ 682 | { 683 | "data": { 684 | "text/plain": [ 685 | "'Mississippi'" 686 | ] 687 | }, 688 | "execution_count": 63, 689 | "metadata": {}, 690 | "output_type": "execute_result" 691 | } 692 | ], 693 | "source": [ 694 | "state_max = df_income.loc[\"2017\", :].query(\"FipsType == 'State'\")[\"Income\"].idxmin()\n", 695 | "\n", 696 | "fip_2_name[state_max]" 697 | ] 698 | }, 699 | { 700 | "cell_type": "markdown", 701 | "metadata": {}, 702 | "source": [ 703 | "Let's make a figure of where each state's per capital income was in 2002 vs 2017" 704 | ] 705 | }, 706 | { 707 | "cell_type": "code", 708 | "execution_count": 99, 709 | "metadata": {}, 710 | "outputs": [ 711 | { 712 | "data": { 713 | "image/png": "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\n", 714 | "text/plain": [ 715 | "
" 716 | ] 717 | }, 718 | "metadata": { 719 | "needs_background": "light" 720 | }, 721 | "output_type": "display_data" 722 | } 723 | ], 724 | "source": [ 725 | "fig, ax = plt.subplots()\n", 726 | "\n", 727 | "df_income[\"Income\"].unstack(level=\"Year\").plot(kind=\"scatter\", x=\"2002\", y=\"2017\", ax=ax)\n", 728 | "\n", 729 | "x = np.linspace(15000, 50000, 1000)\n", 730 | "y = convert_2002_to_2017*x\n", 731 | "ax.plot(x, y, \"k--\", linewidth=1.5)\n", 732 | "\n", 733 | "ax.set_title(\"Per Capita Income in 2002 and 2017\")\n", 734 | "\n", 735 | "ax.spines[\"right\"].set_visible(False)\n", 736 | "ax.spines[\"top\"].set_visible(False)" 737 | ] 738 | }, 739 | { 740 | "cell_type": "markdown", 741 | "metadata": {}, 742 | "source": [ 743 | "Now let's load up our employment data" 744 | ] 745 | }, 746 | { 747 | "cell_type": "code", 748 | "execution_count": 100, 749 | "metadata": {}, 750 | "outputs": [ 751 | { 752 | "data": { 753 | "text/plain": [ 754 | "{'ParamValue': [{'Key': '10', 'Desc': '[SAEMP25N] Total employment'},\n", 755 | " {'Key': '100',\n", 756 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Forestry, fishing, and related activities (NAICS:113-115)'},\n", 757 | " {'Key': '1000',\n", 758 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Finance and insurance (NAICS:52)'},\n", 759 | " {'Key': '1001',\n", 760 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Monetary Authorities-central bank (NAICS:521)'},\n", 761 | " {'Key': '1002',\n", 762 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Credit intermediation and related activities (NAICS:522)'},\n", 763 | " {'Key': '1003',\n", 764 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Securities, commodity contracts, and other financial investments and related activities (NAICS:523)'},\n", 765 | " {'Key': '1004',\n", 766 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Insurance carriers and related activities (NAICS:524)'},\n", 767 | " {'Key': '1005',\n", 768 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Funds, trusts, and other financial vehicles (NAICS:525)'},\n", 769 | " {'Key': '101',\n", 770 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Forestry and logging (NAICS:113)'},\n", 771 | " {'Key': '102',\n", 772 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Fishing, hunting and trapping (NAICS:114)'},\n", 773 | " {'Key': '103',\n", 774 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Support activities for agriculture and forestry (NAICS:115)'},\n", 775 | " {'Key': '1100',\n", 776 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Real estate and rental and leasing (NAICS:53)'},\n", 777 | " {'Key': '1101',\n", 778 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Real estate (NAICS:531)'},\n", 779 | " {'Key': '1102',\n", 780 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Rental and leasing services (NAICS:532)'},\n", 781 | " {'Key': '1103',\n", 782 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Lessors of nonfinancial intangible assets (except copyrighted works) (NAICS:533)'},\n", 783 | " {'Key': '1200',\n", 784 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Professional, scientific, and technical services (NAICS:54)'},\n", 785 | " {'Key': '1300',\n", 786 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Management of companies and enterprises (NAICS:55)'},\n", 787 | " {'Key': '1400',\n", 788 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Administrative and support and waste management and remediation services (NAICS:56)'},\n", 789 | " {'Key': '1401',\n", 790 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Administrative and support services (NAICS:561)'},\n", 791 | " {'Key': '1402',\n", 792 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Waste management and remediation services (NAICS:562)'},\n", 793 | " {'Key': '1500',\n", 794 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Educational services (NAICS:61)'},\n", 795 | " {'Key': '1600',\n", 796 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Health care and social assistance (NAICS:62)'},\n", 797 | " {'Key': '1601',\n", 798 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Ambulatory health care services (NAICS:621)'},\n", 799 | " {'Key': '1602',\n", 800 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Hospitals (NAICS:622)'},\n", 801 | " {'Key': '1603',\n", 802 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Nursing and residential care facilities (NAICS:623)'},\n", 803 | " {'Key': '1604',\n", 804 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Social assistance (NAICS:624)'},\n", 805 | " {'Key': '1700',\n", 806 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Arts, entertainment, and recreation (NAICS:71)'},\n", 807 | " {'Key': '1701',\n", 808 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Performing arts, spectator sports, and related industries (NAICS:711)'},\n", 809 | " {'Key': '1702',\n", 810 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Museums, historical sites, and similar institutions (NAICS:712)'},\n", 811 | " {'Key': '1703',\n", 812 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Amusement, gambling, and recreation industries (NAICS:713)'},\n", 813 | " {'Key': '1800',\n", 814 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Accommodation and food services (NAICS:72)'},\n", 815 | " {'Key': '1801',\n", 816 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Accommodation (NAICS:721)'},\n", 817 | " {'Key': '1802',\n", 818 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Food services and drinking places (NAICS:722)'},\n", 819 | " {'Key': '1900',\n", 820 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Other services (except government and government enterprises) (NAICS:81)'},\n", 821 | " {'Key': '1901',\n", 822 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Repair and maintenance (NAICS:811)'},\n", 823 | " {'Key': '1902',\n", 824 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Personal and laundry services (NAICS:812)'},\n", 825 | " {'Key': '1903',\n", 826 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Religious, grantmaking, civic, professional, and similar organizations (NAICS:813)'},\n", 827 | " {'Key': '1904',\n", 828 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Private households (NAICS:814)'},\n", 829 | " {'Key': '20', 'Desc': '[SAEMP25N] Wage and salary employment'},\n", 830 | " {'Key': '200',\n", 831 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Mining, quarrying, and oil and gas extraction (NAICS:21)'},\n", 832 | " {'Key': '2000',\n", 833 | " 'Desc': '[SAEMP25N] Employment: Government and government enterprises'},\n", 834 | " {'Key': '2001',\n", 835 | " 'Desc': '[SAEMP25N] Govt. and govt. enterprises employment: Federal civilian'},\n", 836 | " {'Key': '2002',\n", 837 | " 'Desc': '[SAEMP25N] Govt. and govt. enterprises employment: Military'},\n", 838 | " {'Key': '201',\n", 839 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Oil and gas extraction (NAICS:211)'},\n", 840 | " {'Key': '2010',\n", 841 | " 'Desc': '[SAEMP25N] Govt. and govt. enterprises employment: State and local'},\n", 842 | " {'Key': '2011',\n", 843 | " 'Desc': '[SAEMP25N] Govt. and govt. enterprises employment: State government'},\n", 844 | " {'Key': '2012',\n", 845 | " 'Desc': '[SAEMP25N] Govt. and govt. enterprises employment: Local government'},\n", 846 | " {'Key': '202',\n", 847 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Mining (except oil and gas) (NAICS:212)'},\n", 848 | " {'Key': '203',\n", 849 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Support activities for mining (NAICS:213)'},\n", 850 | " {'Key': '300',\n", 851 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Utilities (NAICS:22)'},\n", 852 | " {'Key': '40', 'Desc': '[SAEMP25N] Proprietors employment'},\n", 853 | " {'Key': '400',\n", 854 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Construction (NAICS:23)'},\n", 855 | " {'Key': '401',\n", 856 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Construction of buildings (NAICS:236)'},\n", 857 | " {'Key': '402',\n", 858 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Heavy and civil engineering construction (NAICS:237)'},\n", 859 | " {'Key': '403',\n", 860 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Specialty trade contractors (NAICS:238)'},\n", 861 | " {'Key': '50', 'Desc': '[SAEMP25N] Farm proprietors employment'},\n", 862 | " {'Key': '500',\n", 863 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Manufacturing (NAICS:31-33)'},\n", 864 | " {'Key': '510',\n", 865 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Durable goods manufacturing (NAICS:321,327-339)'},\n", 866 | " {'Key': '511',\n", 867 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Wood product manufacturing (NAICS:321)'},\n", 868 | " {'Key': '512',\n", 869 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Nonmetallic mineral product manufacturing (NAICS:327)'},\n", 870 | " {'Key': '513',\n", 871 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Primary metal manufacturing (NAICS:331)'},\n", 872 | " {'Key': '514',\n", 873 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Fabricated metal product manufacturing (NAICS:332)'},\n", 874 | " {'Key': '515',\n", 875 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Machinery manufacturing (NAICS:333)'},\n", 876 | " {'Key': '516',\n", 877 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Computer and electronic product manufacturing (NAICS:334)'},\n", 878 | " {'Key': '517',\n", 879 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Electrical equipment, appliance, and component manufacturing (NAICS:335)'},\n", 880 | " {'Key': '518',\n", 881 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Motor vehicles, bodies and trailers, and parts manufacturing (NAICS:3361-3363)'},\n", 882 | " {'Key': '519',\n", 883 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Other transportation equipment manufacturing (NAICS:3364-3369)'},\n", 884 | " {'Key': '521',\n", 885 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Furniture and related product manufacturing (NAICS:337)'},\n", 886 | " {'Key': '522',\n", 887 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Miscellaneous manufacturing (NAICS:339)'},\n", 888 | " {'Key': '530',\n", 889 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Nondurable goods manufacturing (NAICS:311-316,322-326)'},\n", 890 | " {'Key': '531',\n", 891 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Food manufacturing (NAICS:311)'},\n", 892 | " {'Key': '532',\n", 893 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Beverage and tobacco product manufacturing (NAICS:312)'},\n", 894 | " {'Key': '533',\n", 895 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Textile mills (NAICS:313)'},\n", 896 | " {'Key': '534',\n", 897 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Textile product mills (NAICS:314)'},\n", 898 | " {'Key': '535',\n", 899 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Apparel manufacturing (NAICS:315)'},\n", 900 | " {'Key': '536',\n", 901 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Leather and allied product manufacturing (NAICS:316)'},\n", 902 | " {'Key': '537',\n", 903 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Paper manufacturing (NAICS:322)'},\n", 904 | " {'Key': '538',\n", 905 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Printing and related support activities (NAICS:323)'},\n", 906 | " {'Key': '539',\n", 907 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Petroleum and coal products manufacturing (NAICS:324)'},\n", 908 | " {'Key': '541',\n", 909 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Chemical manufacturing (NAICS:325)'},\n", 910 | " {'Key': '542',\n", 911 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Plastics and rubber products manufacturing (NAICS:326)'},\n", 912 | " {'Key': '60', 'Desc': '[SAEMP25N] Nonfarm proprietors employment'},\n", 913 | " {'Key': '600',\n", 914 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Wholesale trade (NAICS:42)'},\n", 915 | " {'Key': '70', 'Desc': '[SAEMP25N] Farm employment (NAICS:111-112)'},\n", 916 | " {'Key': '700',\n", 917 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Retail trade (NAICS:44-45)'},\n", 918 | " {'Key': '701',\n", 919 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Motor vehicle and parts dealers (NAICS:441)'},\n", 920 | " {'Key': '702',\n", 921 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Furniture and home furnishings stores (NAICS:442)'},\n", 922 | " {'Key': '703',\n", 923 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Electronics and appliance stores (NAICS:443)'},\n", 924 | " {'Key': '704',\n", 925 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Building material and garden equipment and supplies dealers (NAICS:444)'},\n", 926 | " {'Key': '705',\n", 927 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Food and beverage stores (NAICS:445)'},\n", 928 | " {'Key': '706',\n", 929 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Health and personal care stores (NAICS:446)'},\n", 930 | " {'Key': '707',\n", 931 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Gasoline stations (NAICS:447)'},\n", 932 | " {'Key': '708',\n", 933 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Clothing and clothing accessories stores (NAICS:448)'},\n", 934 | " {'Key': '709',\n", 935 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Sporting goods, hobby, musical instrument, and book stores (NAICS:451)'},\n", 936 | " {'Key': '711',\n", 937 | " 'Desc': '[SAEMP25N] Private nonfarm employment: General merchandise stores (NAICS:452)'},\n", 938 | " {'Key': '712',\n", 939 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Miscellaneous store retailers (NAICS:453)'},\n", 940 | " {'Key': '713',\n", 941 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Nonstore retailers (NAICS:454)'},\n", 942 | " {'Key': '80', 'Desc': '[SAEMP25N] Nonfarm employment'},\n", 943 | " {'Key': '800',\n", 944 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Transportation and warehousing (NAICS:48-49)'},\n", 945 | " {'Key': '801',\n", 946 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Air transportation (NAICS:481)'},\n", 947 | " {'Key': '802',\n", 948 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Rail transportation (NAICS:482)'},\n", 949 | " {'Key': '803',\n", 950 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Water transportation (NAICS:483)'},\n", 951 | " {'Key': '804',\n", 952 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Truck transportation (NAICS:484)'},\n", 953 | " {'Key': '805',\n", 954 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Transit and ground passenger transportation (NAICS:485)'},\n", 955 | " {'Key': '806',\n", 956 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Pipeline transportation (NAICS:486)'},\n", 957 | " {'Key': '807',\n", 958 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Scenic and sightseeing transportation (NAICS:487)'},\n", 959 | " {'Key': '808',\n", 960 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Support activities for transportation (NAICS:488)'},\n", 961 | " {'Key': '809',\n", 962 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Couriers and messengers (NAICS:492)'},\n", 963 | " {'Key': '811',\n", 964 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Warehousing and storage (NAICS:493)'},\n", 965 | " {'Key': '90',\n", 966 | " 'Desc': '[SAEMP25N] Private nonfarm employment (NAICS:113-814)'},\n", 967 | " {'Key': '900',\n", 968 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Information (NAICS:51)'},\n", 969 | " {'Key': '901',\n", 970 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Publishing industries (except Internet) (NAICS:511)'},\n", 971 | " {'Key': '902',\n", 972 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Motion picture and sound recording industries (NAICS:512)'},\n", 973 | " {'Key': '903',\n", 974 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Broadcasting (except Internet) (NAICS:515)'},\n", 975 | " {'Key': '904',\n", 976 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Internet publishing and broadcasting (NAICS:516)'},\n", 977 | " {'Key': '905',\n", 978 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Telecommunications (NAICS:517)'},\n", 979 | " {'Key': '906',\n", 980 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Data processing, hosting, and related services (NAICS:518)'},\n", 981 | " {'Key': '907',\n", 982 | " 'Desc': '[SAEMP25N] Private nonfarm employment: Other information services (NAICS:519)'}]}" 983 | ] 984 | }, 985 | "execution_count": 100, 986 | "metadata": {}, 987 | "output_type": "execute_result" 988 | } 989 | ], 990 | "source": [ 991 | "json.loads(r.get(base_url, params={\n", 992 | " \"UserID\": api_key,\n", 993 | " \"method\": \"GetParameterValuesFiltered\",\n", 994 | " \"DataSetName\": \"Regional\",\n", 995 | " \"TableName\": \"SAEMP25N\",\n", 996 | " \"TargetParameter\": \"LineCode\",\n", 997 | " \"ResultFormat\": \"json\"\n", 998 | "}).text)[\"BEAAPI\"][\"Results\"]" 999 | ] 1000 | }, 1001 | { 1002 | "cell_type": "code", 1003 | "execution_count": 101, 1004 | "metadata": {}, 1005 | "outputs": [], 1006 | "source": [ 1007 | "industry_employment = json.loads(\n", 1008 | " r.get(base_url, params={\n", 1009 | " \"UserID\": api_key,\n", 1010 | " \"method\": \"GetData\",\n", 1011 | " \"datasetname\": \"Regional\",\n", 1012 | " \"Year\": \"2002,2017\",\n", 1013 | " \"TableName\": \"SAEMP25N\",\n", 1014 | " \"LineCode\": \"906\",\n", 1015 | " \"GeoFips\": \"COUNTY\",\n", 1016 | " \"ResultFormat\": \"json\"\n", 1017 | " }).text\n", 1018 | ")\n" 1019 | ] 1020 | }, 1021 | { 1022 | "cell_type": "code", 1023 | "execution_count": 112, 1024 | "metadata": {}, 1025 | "outputs": [], 1026 | "source": [ 1027 | "df_employment = pd.DataFrame(industry_employment[\"BEAAPI\"][\"Results\"][\"Data\"])\n", 1028 | "df_employment = (\n", 1029 | " df_employment.drop([\"CL_UNIT\", \"Code\", \"UNIT_MULT\"], axis=1)\n", 1030 | " .rename(columns={\"TimePeriod\": \"Year\", \"DataValue\": \"Employment\"})\n", 1031 | " .query(\"GeoFips < '57000'\")\n", 1032 | " .assign(\n", 1033 | " Employment=lambda x: pd.to_numeric(x[\"Employment\"].str.replace(\",\", \"\"), errors=\"coerce\"),\n", 1034 | " )\n", 1035 | " .set_index([\"Year\", \"GeoFips\"])\n", 1036 | ")" 1037 | ] 1038 | }, 1039 | { 1040 | "cell_type": "code", 1041 | "execution_count": 116, 1042 | "metadata": {}, 1043 | "outputs": [], 1044 | "source": [ 1045 | "df = df_income.merge(df_employment, left_index=True, right_index=True)" 1046 | ] 1047 | }, 1048 | { 1049 | "cell_type": "code", 1050 | "execution_count": 127, 1051 | "metadata": {}, 1052 | "outputs": [ 1053 | { 1054 | "data": { 1055 | "text/html": [ 1056 | "
\n", 1057 | "\n", 1070 | "\n", 1071 | " \n", 1072 | " \n", 1073 | " \n", 1074 | " \n", 1075 | " \n", 1076 | " \n", 1077 | " \n", 1078 | " \n", 1079 | " \n", 1080 | " \n", 1081 | " \n", 1082 | " \n", 1083 | " \n", 1084 | " \n", 1085 | " \n", 1086 | " \n", 1087 | " \n", 1088 | " \n", 1089 | " \n", 1090 | " \n", 1091 | " \n", 1092 | " \n", 1093 | " \n", 1094 | " \n", 1095 | " \n", 1096 | " \n", 1097 | " \n", 1098 | " \n", 1099 | " \n", 1100 | " \n", 1101 | " \n", 1102 | " \n", 1103 | " \n", 1104 | " \n", 1105 | " \n", 1106 | " \n", 1107 | " \n", 1108 | " \n", 1109 | " \n", 1110 | " \n", 1111 | " \n", 1112 | " \n", 1113 | " \n", 1114 | " \n", 1115 | " \n", 1116 | " \n", 1117 | " \n", 1118 | " \n", 1119 | " \n", 1120 | " \n", 1121 | " \n", 1122 | " \n", 1123 | " \n", 1124 | " \n", 1125 | " \n", 1126 | " \n", 1127 | " \n", 1128 | " \n", 1129 | " \n", 1130 | " \n", 1131 | "
IncomeFipsTypeEmploymentGeoName
YearGeoFips
20020000031832Country481600United States
20170000051731Country396100United States
20020100025706State3412Alabama
20170100040802State2531Alabama
20020200034564State345Alaska
\n", 1132 | "
" 1133 | ], 1134 | "text/plain": [ 1135 | " Income FipsType Employment GeoName\n", 1136 | "Year GeoFips \n", 1137 | "2002 00000 31832 Country 481600 United States\n", 1138 | "2017 00000 51731 Country 396100 United States\n", 1139 | "2002 01000 25706 State 3412 Alabama\n", 1140 | "2017 01000 40802 State 2531 Alabama\n", 1141 | "2002 02000 34564 State 345 Alaska" 1142 | ] 1143 | }, 1144 | "execution_count": 127, 1145 | "metadata": {}, 1146 | "output_type": "execute_result" 1147 | } 1148 | ], 1149 | "source": [ 1150 | "df.head()" 1151 | ] 1152 | }, 1153 | { 1154 | "cell_type": "code", 1155 | "execution_count": 178, 1156 | "metadata": {}, 1157 | "outputs": [], 1158 | "source": [ 1159 | "def compute_change(df):\n", 1160 | " geofip = df.index.get_level_values(\"GeoFips\").unique()[0]\n", 1161 | "\n", 1162 | " _x = df.loc[(\"2002\", geofip)]\n", 1163 | " _y = df.loc[(\"2017\", geofip)]\n", 1164 | "\n", 1165 | " return (_y - _x) / _x" 1166 | ] 1167 | }, 1168 | { 1169 | "cell_type": "code", 1170 | "execution_count": 189, 1171 | "metadata": {}, 1172 | "outputs": [ 1173 | { 1174 | "data": { 1175 | "text/html": [ 1176 | "
\n", 1177 | "\n", 1190 | "\n", 1191 | " \n", 1192 | " \n", 1193 | " \n", 1194 | " \n", 1195 | " \n", 1196 | " \n", 1197 | " \n", 1198 | " \n", 1199 | " \n", 1200 | " \n", 1201 | " \n", 1202 | " \n", 1203 | " \n", 1204 | " \n", 1205 | " \n", 1206 | " \n", 1207 | " \n", 1208 | " \n", 1209 | " \n", 1210 | " \n", 1211 | " \n", 1212 | " \n", 1213 | " \n", 1214 | " \n", 1215 | " \n", 1216 | " \n", 1217 | " \n", 1218 | " \n", 1219 | " \n", 1220 | " \n", 1221 | " \n", 1222 | " \n", 1223 | " \n", 1224 | " \n", 1225 | " \n", 1226 | " \n", 1227 | " \n", 1228 | " \n", 1229 | " \n", 1230 | " \n", 1231 | " \n", 1232 | " \n", 1233 | " \n", 1234 | " \n", 1235 | " \n", 1236 | " \n", 1237 | " \n", 1238 | " \n", 1239 | " \n", 1240 | " \n", 1241 | " \n", 1242 | " \n", 1243 | " \n", 1244 | " \n", 1245 | " \n", 1246 | " \n", 1247 | " \n", 1248 | " \n", 1249 | " \n", 1250 | " \n", 1251 | " \n", 1252 | " \n", 1253 | " \n", 1254 | " \n", 1255 | " \n", 1256 | " \n", 1257 | " \n", 1258 | " \n", 1259 | " \n", 1260 | " \n", 1261 | " \n", 1262 | " \n", 1263 | " \n", 1264 | " \n", 1265 | " \n", 1266 | " \n", 1267 | " \n", 1268 | " \n", 1269 | " \n", 1270 | " \n", 1271 | " \n", 1272 | " \n", 1273 | " \n", 1274 | " \n", 1275 | " \n", 1276 | " \n", 1277 | " \n", 1278 | " \n", 1279 | " \n", 1280 | " \n", 1281 | " \n", 1282 | " \n", 1283 | " \n", 1284 | " \n", 1285 | " \n", 1286 | " \n", 1287 | " \n", 1288 | " \n", 1289 | " \n", 1290 | " \n", 1291 | " \n", 1292 | " \n", 1293 | " \n", 1294 | " \n", 1295 | " \n", 1296 | " \n", 1297 | " \n", 1298 | " \n", 1299 | " \n", 1300 | " \n", 1301 | " \n", 1302 | " \n", 1303 | " \n", 1304 | " \n", 1305 | " \n", 1306 | " \n", 1307 | " \n", 1308 | " \n", 1309 | " \n", 1310 | " \n", 1311 | " \n", 1312 | " \n", 1313 | " \n", 1314 | " \n", 1315 | " \n", 1316 | " \n", 1317 | " \n", 1318 | " \n", 1319 | " \n", 1320 | " \n", 1321 | " \n", 1322 | " \n", 1323 | " \n", 1324 | " \n", 1325 | " \n", 1326 | " \n", 1327 | " \n", 1328 | " \n", 1329 | " \n", 1330 | " \n", 1331 | " \n", 1332 | " \n", 1333 | " \n", 1334 | " \n", 1335 | " \n", 1336 | " \n", 1337 | " \n", 1338 | " \n", 1339 | " \n", 1340 | " \n", 1341 | " \n", 1342 | " \n", 1343 | " \n", 1344 | " \n", 1345 | " \n", 1346 | " \n", 1347 | " \n", 1348 | " \n", 1349 | " \n", 1350 | " \n", 1351 | " \n", 1352 | " \n", 1353 | " \n", 1354 | " \n", 1355 | " \n", 1356 | " \n", 1357 | " \n", 1358 | " \n", 1359 | " \n", 1360 | " \n", 1361 | " \n", 1362 | " \n", 1363 | " \n", 1364 | " \n", 1365 | " \n", 1366 | " \n", 1367 | " \n", 1368 | " \n", 1369 | " \n", 1370 | " \n", 1371 | " \n", 1372 | " \n", 1373 | " \n", 1374 | " \n", 1375 | " \n", 1376 | " \n", 1377 | " \n", 1378 | " \n", 1379 | " \n", 1380 | " \n", 1381 | " \n", 1382 | " \n", 1383 | " \n", 1384 | " \n", 1385 | " \n", 1386 | " \n", 1387 | " \n", 1388 | " \n", 1389 | " \n", 1390 | " \n", 1391 | " \n", 1392 | " \n", 1393 | " \n", 1394 | " \n", 1395 | " \n", 1396 | " \n", 1397 | " \n", 1398 | " \n", 1399 | " \n", 1400 | " \n", 1401 | " \n", 1402 | " \n", 1403 | " \n", 1404 | " \n", 1405 | " \n", 1406 | " \n", 1407 | " \n", 1408 | " \n", 1409 | " \n", 1410 | " \n", 1411 | " \n", 1412 | " \n", 1413 | " \n", 1414 | " \n", 1415 | " \n", 1416 | " \n", 1417 | " \n", 1418 | " \n", 1419 | " \n", 1420 | " \n", 1421 | " \n", 1422 | " \n", 1423 | " \n", 1424 | " \n", 1425 | " \n", 1426 | " \n", 1427 | " \n", 1428 | " \n", 1429 | " \n", 1430 | " \n", 1431 | " \n", 1432 | " \n", 1433 | " \n", 1434 | " \n", 1435 | " \n", 1436 | " \n", 1437 | " \n", 1438 | " \n", 1439 | " \n", 1440 | " \n", 1441 | " \n", 1442 | " \n", 1443 | " \n", 1444 | " \n", 1445 | " \n", 1446 | " \n", 1447 | " \n", 1448 | " \n", 1449 | " \n", 1450 | " \n", 1451 | " \n", 1452 | " \n", 1453 | " \n", 1454 | " \n", 1455 | " \n", 1456 | " \n", 1457 | " \n", 1458 | " \n", 1459 | " \n", 1460 | " \n", 1461 | " \n", 1462 | " \n", 1463 | " \n", 1464 | " \n", 1465 | " \n", 1466 | " \n", 1467 | " \n", 1468 | " \n", 1469 | " \n", 1470 | " \n", 1471 | " \n", 1472 | " \n", 1473 | " \n", 1474 | " \n", 1475 | " \n", 1476 | " \n", 1477 | " \n", 1478 | " \n", 1479 | " \n", 1480 | " \n", 1481 | " \n", 1482 | " \n", 1483 | " \n", 1484 | " \n", 1485 | " \n", 1486 | " \n", 1487 | " \n", 1488 | " \n", 1489 | " \n", 1490 | " \n", 1491 | " \n", 1492 | " \n", 1493 | " \n", 1494 | " \n", 1495 | " \n", 1496 | " \n", 1497 | " \n", 1498 | " \n", 1499 | " \n", 1500 | " \n", 1501 | " \n", 1502 | " \n", 1503 | " \n", 1504 | " \n", 1505 | " \n", 1506 | " \n", 1507 | " \n", 1508 | " \n", 1509 | " \n", 1510 | " \n", 1511 | " \n", 1512 | " \n", 1513 | " \n", 1514 | " \n", 1515 | " \n", 1516 | " \n", 1517 | " \n", 1518 | " \n", 1519 | " \n", 1520 | " \n", 1521 | " \n", 1522 | " \n", 1523 | " \n", 1524 | " \n", 1525 | " \n", 1526 | " \n", 1527 | " \n", 1528 | " \n", 1529 | " \n", 1530 | " \n", 1531 | " \n", 1532 | " \n", 1533 | " \n", 1534 | " \n", 1535 | " \n", 1536 | " \n", 1537 | " \n", 1538 | " \n", 1539 | " \n", 1540 | " \n", 1541 | " \n", 1542 | " \n", 1543 | " \n", 1544 | " \n", 1545 | " \n", 1546 | " \n", 1547 | " \n", 1548 | " \n", 1549 | " \n", 1550 | " \n", 1551 | " \n", 1552 | " \n", 1553 | " \n", 1554 | " \n", 1555 | " \n", 1556 | " \n", 1557 | " \n", 1558 | " \n", 1559 | " \n", 1560 | " \n", 1561 | " \n", 1562 | " \n", 1563 | " \n", 1564 | " \n", 1565 | " \n", 1566 | " \n", 1567 | " \n", 1568 | " \n", 1569 | " \n", 1570 | " \n", 1571 | " \n", 1572 | " \n", 1573 | "
EmploymentIncomeGeoNameFipsType
GeoFips
00000-0.1775330.625126United StatesCountry
01000-0.2582060.587256AlabamaState
02000-0.4000000.654322AlaskaState
040000.0632290.556225ArizonaState
050000.1463120.686643ArkansasState
06000-0.1133470.752812CaliforniaState
080000.2425010.583038ColoradoState
09000-0.5102430.606586ConnecticutState
10000-0.5363840.327051DelawareState
11000-0.7561660.770009District of ColumbiaState
12000-0.1450760.553121FloridaState
13000-0.3187960.471642GeorgiaState
15000-0.4719790.681230HawaiiState
160000.5409580.594824IdahoState
17000-0.3173710.565404IllinoisState
180000.2107270.562902IndianaState
19000-0.5138250.627038IowaState
20000-0.1141660.661368KansasState
21000-0.4851080.557047KentuckyState
22000-0.0702250.673649LouisianaState
23000-0.3968580.565942MaineState
24000-0.4352980.606513MarylandState
25000-0.2126520.706065MassachusettsState
260000.0811950.508205MichiganState
27000-0.3514900.608236MinnesotaState
280000.6397060.574942MississippiState
29000-0.0006910.540942MissouriState
30000-0.2004720.835184MontanaState
31000-0.3639920.659436NebraskaState
320001.4285710.446274NevadaState
330000.5467510.597546New HampshireState
34000-0.3332470.610478New JerseyState
35000-0.6592450.569774New MexicoState
36000-0.2778920.768307New YorkState
370000.0185510.588772North CarolinaState
38000-0.4866510.903590North DakotaState
39000-0.2393430.567660OhioState
40000-0.5354190.715103OklahomaState
410000.4805000.658780OregonState
42000-0.4034800.660898PennsylvaniaState
44000-0.7414090.611218Rhode IslandState
450000.3122280.591496South CarolinaState
460000.2016810.759218South DakotaState
470000.3463150.610220TennesseeState
48000-0.0641230.623182TexasState
49000-0.0964170.710343UtahState
50000-0.5214290.682811VermontState
51000-0.4605050.601144VirginiaState
530001.2521780.722746WashingtonState
540000.1727170.567631West VirginiaState
55000-0.0995100.557768WisconsinState
56000-0.3688210.824727WyomingState
\n", 1574 | "
" 1575 | ], 1576 | "text/plain": [ 1577 | " Employment Income GeoName FipsType\n", 1578 | "GeoFips \n", 1579 | "00000 -0.177533 0.625126 United States Country\n", 1580 | "01000 -0.258206 0.587256 Alabama State\n", 1581 | "02000 -0.400000 0.654322 Alaska State\n", 1582 | "04000 0.063229 0.556225 Arizona State\n", 1583 | "05000 0.146312 0.686643 Arkansas State\n", 1584 | "06000 -0.113347 0.752812 California State\n", 1585 | "08000 0.242501 0.583038 Colorado State\n", 1586 | "09000 -0.510243 0.606586 Connecticut State\n", 1587 | "10000 -0.536384 0.327051 Delaware State\n", 1588 | "11000 -0.756166 0.770009 District of Columbia State\n", 1589 | "12000 -0.145076 0.553121 Florida State\n", 1590 | "13000 -0.318796 0.471642 Georgia State\n", 1591 | "15000 -0.471979 0.681230 Hawaii State\n", 1592 | "16000 0.540958 0.594824 Idaho State\n", 1593 | "17000 -0.317371 0.565404 Illinois State\n", 1594 | "18000 0.210727 0.562902 Indiana State\n", 1595 | "19000 -0.513825 0.627038 Iowa State\n", 1596 | "20000 -0.114166 0.661368 Kansas State\n", 1597 | "21000 -0.485108 0.557047 Kentucky State\n", 1598 | "22000 -0.070225 0.673649 Louisiana State\n", 1599 | "23000 -0.396858 0.565942 Maine State\n", 1600 | "24000 -0.435298 0.606513 Maryland State\n", 1601 | "25000 -0.212652 0.706065 Massachusetts State\n", 1602 | "26000 0.081195 0.508205 Michigan State\n", 1603 | "27000 -0.351490 0.608236 Minnesota State\n", 1604 | "28000 0.639706 0.574942 Mississippi State\n", 1605 | "29000 -0.000691 0.540942 Missouri State\n", 1606 | "30000 -0.200472 0.835184 Montana State\n", 1607 | "31000 -0.363992 0.659436 Nebraska State\n", 1608 | "32000 1.428571 0.446274 Nevada State\n", 1609 | "33000 0.546751 0.597546 New Hampshire State\n", 1610 | "34000 -0.333247 0.610478 New Jersey State\n", 1611 | "35000 -0.659245 0.569774 New Mexico State\n", 1612 | "36000 -0.277892 0.768307 New York State\n", 1613 | "37000 0.018551 0.588772 North Carolina State\n", 1614 | "38000 -0.486651 0.903590 North Dakota State\n", 1615 | "39000 -0.239343 0.567660 Ohio State\n", 1616 | "40000 -0.535419 0.715103 Oklahoma State\n", 1617 | "41000 0.480500 0.658780 Oregon State\n", 1618 | "42000 -0.403480 0.660898 Pennsylvania State\n", 1619 | "44000 -0.741409 0.611218 Rhode Island State\n", 1620 | "45000 0.312228 0.591496 South Carolina State\n", 1621 | "46000 0.201681 0.759218 South Dakota State\n", 1622 | "47000 0.346315 0.610220 Tennessee State\n", 1623 | "48000 -0.064123 0.623182 Texas State\n", 1624 | "49000 -0.096417 0.710343 Utah State\n", 1625 | "50000 -0.521429 0.682811 Vermont State\n", 1626 | "51000 -0.460505 0.601144 Virginia State\n", 1627 | "53000 1.252178 0.722746 Washington State\n", 1628 | "54000 0.172717 0.567631 West Virginia State\n", 1629 | "55000 -0.099510 0.557768 Wisconsin State\n", 1630 | "56000 -0.368821 0.824727 Wyoming State" 1631 | ] 1632 | }, 1633 | "execution_count": 189, 1634 | "metadata": {}, 1635 | "output_type": "execute_result" 1636 | } 1637 | ], 1638 | "source": [ 1639 | "df = df.groupby(level=\"GeoFips\").agg({\n", 1640 | " \"Employment\": lambda x: compute_change(x),\n", 1641 | " \"Income\": lambda x: compute_change(x),\n", 1642 | " \"GeoName\": lambda x: x.iloc[0],\n", 1643 | " \"FipsType\": lambda x: x.iloc[0]\n", 1644 | "})" 1645 | ] 1646 | }, 1647 | { 1648 | "cell_type": "code", 1649 | "execution_count": 158, 1650 | "metadata": {}, 1651 | "outputs": [], 1652 | "source": [ 1653 | "inc_per_change = df.groupby(level=\"GeoFips\")[[\"Income\"]].agg(lambda x: compute_change(x, \"Income\"))\n", 1654 | "emp_per_change = df.groupby(level=\"GeoFips\")[[\"Employment\"]].agg(lambda x: compute_change(x, \"Employment\"))" 1655 | ] 1656 | }, 1657 | { 1658 | "cell_type": "code", 1659 | "execution_count": 167, 1660 | "metadata": {}, 1661 | "outputs": [ 1662 | { 1663 | "data": { 1664 | "text/html": [ 1665 | "
\n", 1666 | "\n", 1679 | "\n", 1680 | " \n", 1681 | " \n", 1682 | " \n", 1683 | " \n", 1684 | " \n", 1685 | " \n", 1686 | " \n", 1687 | " \n", 1688 | " \n", 1689 | " \n", 1690 | " \n", 1691 | " \n", 1692 | " \n", 1693 | " \n", 1694 | " \n", 1695 | " \n", 1696 | " \n", 1697 | " \n", 1698 | " \n", 1699 | " \n", 1700 | " \n", 1701 | " \n", 1702 | " \n", 1703 | " \n", 1704 | " \n", 1705 | " \n", 1706 | " \n", 1707 | " \n", 1708 | " \n", 1709 | " \n", 1710 | " \n", 1711 | " \n", 1712 | " \n", 1713 | " \n", 1714 | " \n", 1715 | " \n", 1716 | " \n", 1717 | " \n", 1718 | " \n", 1719 | " \n", 1720 | " \n", 1721 | " \n", 1722 | " \n", 1723 | " \n", 1724 | " \n", 1725 | " \n", 1726 | " \n", 1727 | " \n", 1728 | " \n", 1729 | " \n", 1730 | " \n", 1731 | " \n", 1732 | " \n", 1733 | " \n", 1734 | " \n", 1735 | " \n", 1736 | " \n", 1737 | " \n", 1738 | " \n", 1739 | " \n", 1740 | " \n", 1741 | " \n", 1742 | " \n", 1743 | " \n", 1744 | " \n", 1745 | " \n", 1746 | " \n", 1747 | " \n", 1748 | " \n", 1749 | " \n", 1750 | " \n", 1751 | " \n", 1752 | " \n", 1753 | " \n", 1754 | " \n", 1755 | " \n", 1756 | " \n", 1757 | " \n", 1758 | " \n", 1759 | " \n", 1760 | " \n", 1761 | " \n", 1762 | " \n", 1763 | " \n", 1764 | " \n", 1765 | " \n", 1766 | " \n", 1767 | " \n", 1768 | " \n", 1769 | " \n", 1770 | " \n", 1771 | " \n", 1772 | " \n", 1773 | " \n", 1774 | " \n", 1775 | " \n", 1776 | " \n", 1777 | " \n", 1778 | " \n", 1779 | " \n", 1780 | " \n", 1781 | " \n", 1782 | " \n", 1783 | " \n", 1784 | " \n", 1785 | " \n", 1786 | " \n", 1787 | " \n", 1788 | " \n", 1789 | " \n", 1790 | " \n", 1791 | " \n", 1792 | " \n", 1793 | " \n", 1794 | " \n", 1795 | " \n", 1796 | " \n", 1797 | " \n", 1798 | " \n", 1799 | " \n", 1800 | " \n", 1801 | " \n", 1802 | " \n", 1803 | " \n", 1804 | " \n", 1805 | " \n", 1806 | " \n", 1807 | " \n", 1808 | " \n", 1809 | " \n", 1810 | " \n", 1811 | " \n", 1812 | " \n", 1813 | " \n", 1814 | " \n", 1815 | " \n", 1816 | " \n", 1817 | " \n", 1818 | " \n", 1819 | " \n", 1820 | " \n", 1821 | " \n", 1822 | " \n", 1823 | " \n", 1824 | " \n", 1825 | " \n", 1826 | " \n", 1827 | " \n", 1828 | " \n", 1829 | " \n", 1830 | " \n", 1831 | " \n", 1832 | " \n", 1833 | " \n", 1834 | " \n", 1835 | " \n", 1836 | " \n", 1837 | " \n", 1838 | " \n", 1839 | " \n", 1840 | " \n", 1841 | " \n", 1842 | " \n", 1843 | " \n", 1844 | " \n", 1845 | " \n", 1846 | " \n", 1847 | " \n", 1848 | " \n", 1849 | " \n", 1850 | " \n", 1851 | " \n", 1852 | " \n", 1853 | " \n", 1854 | " \n", 1855 | " \n", 1856 | " \n", 1857 | " \n", 1858 | " \n", 1859 | " \n", 1860 | " \n", 1861 | " \n", 1862 | " \n", 1863 | " \n", 1864 | " \n", 1865 | " \n", 1866 | " \n", 1867 | " \n", 1868 | " \n", 1869 | " \n", 1870 | " \n", 1871 | " \n", 1872 | " \n", 1873 | " \n", 1874 | " \n", 1875 | " \n", 1876 | " \n", 1877 | " \n", 1878 | " \n", 1879 | " \n", 1880 | " \n", 1881 | " \n", 1882 | " \n", 1883 | " \n", 1884 | " \n", 1885 | " \n", 1886 | " \n", 1887 | " \n", 1888 | " \n", 1889 | " \n", 1890 | " \n", 1891 | " \n", 1892 | " \n", 1893 | " \n", 1894 | " \n", 1895 | " \n", 1896 | " \n", 1897 | " \n", 1898 | " \n", 1899 | " \n", 1900 | " \n", 1901 | " \n", 1902 | " \n", 1903 | " \n", 1904 | " \n", 1905 | " \n", 1906 | " \n", 1907 | " \n", 1908 | " \n", 1909 | " \n", 1910 | " \n", 1911 | " \n", 1912 | " \n", 1913 | " \n", 1914 | " \n", 1915 | " \n", 1916 | " \n", 1917 | " \n", 1918 | " \n", 1919 | " \n", 1920 | " \n", 1921 | " \n", 1922 | " \n", 1923 | " \n", 1924 | " \n", 1925 | " \n", 1926 | " \n", 1927 | " \n", 1928 | " \n", 1929 | " \n", 1930 | " \n", 1931 | " \n", 1932 | " \n", 1933 | " \n", 1934 | " \n", 1935 | " \n", 1936 | " \n", 1937 | " \n", 1938 | " \n", 1939 | " \n", 1940 | " \n", 1941 | " \n", 1942 | " \n", 1943 | " \n", 1944 | " \n", 1945 | " \n", 1946 | " \n", 1947 | " \n", 1948 | " \n", 1949 | " \n", 1950 | " \n", 1951 | " \n", 1952 | " \n", 1953 | " \n", 1954 | "
IncomeEmployment
GeoFips
0000041781.5438850.0
0100033254.02971.5
0200045872.0276.0
0400034564.010882.5
0500032704.51775.0
0600047118.558590.0
0800044513.511476.0
0900058497.03890.5
1000043773.01599.0
1100062436.01992.0
1200039207.026869.5
1300037129.017964.5
1500042190.5872.5
1600033987.0822.0
1700044470.016040.5
1800037057.03771.5
1900038018.56127.5
2000038926.52469.5
2100033337.56358.0
2200034974.03091.5
2300038085.01173.5
2400049585.07660.0
2500053608.512305.0
2600038363.08394.5
2700044147.010456.5
2800029892.51077.0
2900037113.011577.0
3000034972.0763.0
3100040766.56483.5
3200039374.01920.0
3300048258.51607.0
3400052994.016060.0
3500032502.51686.0
3600051186.027298.0
3700036037.016104.0
3800039875.0992.0
3900038253.011255.0
4000035109.03184.0
4100038543.04865.5
4200042746.015643.5
4400042901.01849.5
4500033917.53451.0
4600038125.5262.0
4700036932.06175.5
4800038246.041632.0
4900034420.07226.0
5000041571.5621.0
5100044786.519431.5
5300045630.59330.5
5400031492.0987.5
5500040203.09110.0
5600044416.0429.0
\n", 1955 | "
" 1956 | ], 1957 | "text/plain": [ 1958 | " Income Employment\n", 1959 | "GeoFips \n", 1960 | "00000 41781.5 438850.0\n", 1961 | "01000 33254.0 2971.5\n", 1962 | "02000 45872.0 276.0\n", 1963 | "04000 34564.0 10882.5\n", 1964 | "05000 32704.5 1775.0\n", 1965 | "06000 47118.5 58590.0\n", 1966 | "08000 44513.5 11476.0\n", 1967 | "09000 58497.0 3890.5\n", 1968 | "10000 43773.0 1599.0\n", 1969 | "11000 62436.0 1992.0\n", 1970 | "12000 39207.0 26869.5\n", 1971 | "13000 37129.0 17964.5\n", 1972 | "15000 42190.5 872.5\n", 1973 | "16000 33987.0 822.0\n", 1974 | "17000 44470.0 16040.5\n", 1975 | "18000 37057.0 3771.5\n", 1976 | "19000 38018.5 6127.5\n", 1977 | "20000 38926.5 2469.5\n", 1978 | "21000 33337.5 6358.0\n", 1979 | "22000 34974.0 3091.5\n", 1980 | "23000 38085.0 1173.5\n", 1981 | "24000 49585.0 7660.0\n", 1982 | "25000 53608.5 12305.0\n", 1983 | "26000 38363.0 8394.5\n", 1984 | "27000 44147.0 10456.5\n", 1985 | "28000 29892.5 1077.0\n", 1986 | "29000 37113.0 11577.0\n", 1987 | "30000 34972.0 763.0\n", 1988 | "31000 40766.5 6483.5\n", 1989 | "32000 39374.0 1920.0\n", 1990 | "33000 48258.5 1607.0\n", 1991 | "34000 52994.0 16060.0\n", 1992 | "35000 32502.5 1686.0\n", 1993 | "36000 51186.0 27298.0\n", 1994 | "37000 36037.0 16104.0\n", 1995 | "38000 39875.0 992.0\n", 1996 | "39000 38253.0 11255.0\n", 1997 | "40000 35109.0 3184.0\n", 1998 | "41000 38543.0 4865.5\n", 1999 | "42000 42746.0 15643.5\n", 2000 | "44000 42901.0 1849.5\n", 2001 | "45000 33917.5 3451.0\n", 2002 | "46000 38125.5 262.0\n", 2003 | "47000 36932.0 6175.5\n", 2004 | "48000 38246.0 41632.0\n", 2005 | "49000 34420.0 7226.0\n", 2006 | "50000 41571.5 621.0\n", 2007 | "51000 44786.5 19431.5\n", 2008 | "53000 45630.5 9330.5\n", 2009 | "54000 31492.0 987.5\n", 2010 | "55000 40203.0 9110.0\n", 2011 | "56000 44416.0 429.0" 2012 | ] 2013 | }, 2014 | "execution_count": 167, 2015 | "metadata": {}, 2016 | "output_type": "execute_result" 2017 | } 2018 | ], 2019 | "source": [ 2020 | "df.groupby(\"GeoFips\").agg({\"Income\": \"mean\", \"Employment\": \"mean\"})" 2021 | ] 2022 | } 2023 | ], 2024 | "metadata": { 2025 | "@webio": { 2026 | "lastCommId": "b1b6b17a0b144a5fa92de74361b7617d", 2027 | "lastKernelId": "83a9e99f-0022-4472-b8e9-0623610ecfe1" 2028 | }, 2029 | "kernelspec": { 2030 | "display_name": "Python 3", 2031 | "language": "python", 2032 | "name": "python3" 2033 | }, 2034 | "language_info": { 2035 | "codemirror_mode": { 2036 | "name": "ipython", 2037 | "version": 3 2038 | }, 2039 | "file_extension": ".py", 2040 | "mimetype": "text/x-python", 2041 | "name": "python", 2042 | "nbconvert_exporter": "python", 2043 | "pygments_lexer": "ipython3", 2044 | "version": "3.7.1" 2045 | } 2046 | }, 2047 | "nbformat": 4, 2048 | "nbformat_minor": 2 2049 | } 2050 | --------------------------------------------------------------------------------