├── README.md ├── check_workshop.ipynb ├── content ├── .ipynb_checkpoints │ ├── 00_introduction-checkpoint.ipynb │ ├── 01_data_processing-checkpoint.ipynb │ ├── 02_geovisualization-checkpoint.ipynb │ ├── 02_points_visualization-checkpoint.ipynb │ ├── 03_spatial_weights-checkpoint.ipynb │ ├── 04_spatial_autocorrelation-checkpoint.ipynb │ ├── 05_esda_morans_viz-checkpoint.ipynb │ ├── 06_esda_morans_viz-checkpoint.ipynb │ ├── 06_spatial_dynamics_analytics-checkpoint.ipynb │ ├── 07_moran_bv_test-checkpoint.ipynb │ ├── 07_spatial_dynamics_visualization-checkpoint.ipynb │ ├── 09_spatial_dynamics_analytics-checkpoint.ipynb │ ├── 11_taz_example-checkpoint.ipynb │ ├── 18_gol-checkpoint.ipynb │ └── 19_points_visualization-checkpoint.ipynb ├── 00_introduction.ipynb ├── 00_introduction.slides.html ├── 01_data_processing.ipynb ├── 02_geovisualization.ipynb ├── 03_spatial_weights.ipynb ├── 04_spatial_autocorrelation.ipynb ├── 05_esda_morans_viz.ipynb ├── 06_spatial_dynamics_analytics.ipynb ├── 07_spatial_dynamics_visualization.ipynb ├── choropleth.html ├── data │ ├── CPI1913-2016.csv │ ├── README.md │ ├── Surrey_park_street_trees_April2018.csv │ ├── US_state_pci_constant09_1929_2009.csv │ ├── Zipcodes.geojson │ ├── airports.csv │ ├── boston.dbf │ ├── boston.shp │ ├── boston.shx │ ├── continents.geojson │ ├── countries.geojson │ ├── countries_simplified.geojson │ ├── listings.csv.gz │ ├── mexicojoin.dbf │ ├── mexicojoin.prj │ ├── mexicojoin.qpj │ ├── mexicojoin.shp │ ├── mexicojoin.shx │ ├── participants2016.csv │ ├── participants2017.csv │ ├── participants2018.csv │ ├── san_diego.cpg │ ├── san_diego.dbf │ ├── san_diego.prj │ ├── san_diego.shp │ ├── san_diego.shx │ ├── san_diego.tif │ ├── texas.dbf │ ├── texas.geojson │ ├── texas.prj │ ├── texas.qgs │ ├── texas.qgs~ │ ├── texas.qpj │ ├── texas.shp │ ├── texas.shx │ └── tm_world_borders.geojson ├── figs │ ├── UCR.png │ ├── anaconda.png │ ├── ancienthistory.png │ ├── cartodb.png │ ├── cast.png │ ├── giddydoc.png │ ├── githubstars.png │ ├── githubstarspysal.png │ ├── googlecode.png │ ├── install.png │ ├── pysalGraphic.png │ ├── pysalanaconda.png │ ├── pysalcli.png │ ├── pysalcloud.png │ ├── pysalcloud.png_ │ ├── pysaldebian.png │ ├── pysalml.png │ ├── pysalnew.png │ ├── pysalnotebook.png │ ├── pysalqgiselection.jpg │ ├── pysalrefactor.png │ ├── pysalscipy2009.png │ ├── pysalstructure.png │ ├── pysalteam.png │ └── qgis.png ├── hr90.html └── makefile ├── environment.yml ├── figs └── readmefigs │ ├── anaconda.png │ ├── anacondastartwin.png │ ├── directory.png │ ├── download.png │ ├── htmlout.png │ ├── inc.png │ ├── quad.png │ ├── routes18.png │ ├── routes2016-17.png │ └── routes2017.png └── workshop.yml /README.md: -------------------------------------------------------------------------------- 1 | # Spatial Data Analysis with PySAL @FOSS4G 2 | [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/sjsrey/pysalfoss4g19/master) 3 | 4 | ### Instructors 5 | 6 | - [Sergio Rey](http://sergerey.org) - University of California, Riverside 7 | - [Wei Kang](http://spatial.ucr.edu/peopleKang.html) - University of California, Riverside 8 | - [Elijah Knaap](http://spatial.ucr.edu/peopleKaap.html) - University of California, Riverside 9 | - [Stefanie Lumnitz](https://github.com/slumnitz) - University of British Columbia 10 | --- 11 | 12 | This repository contains the materials and instructions for the PySAL workshop at [FOSS4G 2019](https://2019.foss4g-na.org/). 13 | 14 | 15 | ## Schedule (Proposed) 16 | 17 | 18 | * 2:00-3:30 19 | * PySAL Overview 20 | * Spatial data processing 21 | * Spatial weights 22 | * Choropleth mapping and geovisualization 23 | * 3:30-4:00 24 | * Break 25 | * 4:00-5:30 26 | * Global spatial autocorrelation 27 | * Local spatial autocorrelation 28 | * Spatial dynamics 29 | 30 | ## Obtaining Workshop Materials 31 | 32 | If you are familiar with GitHub, you should clone or fork this GitHub repository to a specific directory. Cloning can be done by: 33 | 34 | ```bash 35 | git clone https://github.com/sjsrey/pysalfoss4g19.git 36 | ``` 37 | 38 | If you are not using git, you can grab the workshop materials as a zip file by pointing your browser to (https://github.com/sjsrey/pysalfoss4g19.git) and clicking on the green *Clone or download* button in the upper right. 39 | 40 | ![download](figs/readmefigs/download.png) 41 | 42 | Extract the downloaded zip file to a working directory. 43 | 44 | ## Installation 45 | 46 | We will be using a number of Python packages for geospatial analysis. 47 | 48 | 49 | An easy way to install all of these packages is to use a Python distribution such as [Anaconda](https://www.anaconda.com/download/#macos). In this workshop we will use anaconda to build an [environment](https://conda.io/docs/user-guide/tasks/manage-environments.html) for **Python 3.6**. It does not matter which version of anaconda is downloaded. We recommend installing Anaconda 3.7. 50 | 51 | ![anaconda](figs/readmefigs/anaconda.png) 52 | 53 | 54 | On windows, all our work will begin from an anaconda prompt, which you can start as follows: 55 | 56 | ![anacondaprompt](figs/readmefigs/anacondastartwin.png) 57 | 58 | Start a terminal and navigate to the directory of the downloaded/ cloned materials. For example, if the materials now live in the directory ```/Users/weikang/Downloads/pysalnarsc18-master```, you need to navigate to that directory from the terminal (using command ```cd```): 59 | 60 | ![directory](figs/readmefigs/directory.png) 61 | 62 | Once we have done that, run: 63 | 64 | ```bash 65 | conda-env create -f workshop.yml 66 | ``` 67 | 68 | This will build a conda python 3.6 environment that sandboxes the installation of the required packages for this workshop so we don't break anything in your computer's system Python (if it has one). 69 | 70 | This may take 10-15 minutes to complete depending on the speed of your network connection. 71 | 72 | Once this completes, you can activate the workshop environment with: 73 | 74 | * on Mac, Linux 75 | ```bash 76 | source activate workshop 77 | ``` 78 | * on Windows: 79 | ```bash 80 | activate workshop 81 | ``` 82 | 83 | Next, you will want to test your installation with: 84 | ```bash 85 | jupyter-nbconvert --execute --ExecutePreprocessor.timeout=120 check_workshop.ipynb 86 | ``` 87 | 88 | You should see something like: 89 | ```bash 90 | [NbConvertApp] Converting notebook check_workshop.ipynb to html 91 | [NbConvertApp] Executing notebook with kernel: python3 92 | [NbConvertApp] Writing 347535 bytes to check_workshop.html 93 | ``` 94 | 95 | Open check_workshop.html in a browser, and scroll all the way down, you should see something like: 96 | 97 | ![htmlout](figs/readmefigs/htmlout.png) 98 | 99 | You should also see a new file in the current directory called `inc.png` that contains a map looking something line: 100 | 101 | ![incmap](figs/readmefigs/inc.png) 102 | 103 | If you do see the above, you are ready for the tutorial. If not, please contact either of us for help. 104 | 105 | ## Troubleshooting 106 | 107 | 108 | If you encounter the following error when starting jupyterlab: 109 | ```bash 110 | FileNotFoundError: [WinError 2] The system cannot find the file specified 111 | ``` 112 | A solution is to issue the following command in the anaconda prompt: 113 | ```bash 114 | python -m ipykernel install --user 115 | ``` 116 | 117 | -------------------------------------------------------------------------------- /check_workshop.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Check `PySAL Workshop` stack\n", 8 | "\n", 9 | "This notebook checks all software requirements for the PySAL Workshop are correctly installed. \n", 10 | "\n", 11 | "A successful run of the notebook implies no errors returned in any cell *and* every cell beyond the first one returning a printout of `True`. This ensures a correct environment installed." 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 6, 17 | "metadata": {}, 18 | "outputs": [], 19 | "source": [ 20 | "import matplotlib.pyplot as plt\n", 21 | "%matplotlib inline" 22 | ] 23 | }, 24 | { 25 | "cell_type": "markdown", 26 | "metadata": {}, 27 | "source": [ 28 | "---" 29 | ] 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": 7, 34 | "metadata": {}, 35 | "outputs": [ 36 | { 37 | "data": { 38 | "text/plain": [ 39 | "True" 40 | ] 41 | }, 42 | "execution_count": 7, 43 | "metadata": {}, 44 | "output_type": "execute_result" 45 | } 46 | ], 47 | "source": [ 48 | "import bokeh as bk\n", 49 | "\n", 50 | "float(bk.__version__[:2]) >= 0.12" 51 | ] 52 | }, 53 | { 54 | "cell_type": "code", 55 | "execution_count": 8, 56 | "metadata": {}, 57 | "outputs": [ 58 | { 59 | "data": { 60 | "text/plain": [ 61 | "True" 62 | ] 63 | }, 64 | "execution_count": 8, 65 | "metadata": {}, 66 | "output_type": "execute_result" 67 | } 68 | ], 69 | "source": [ 70 | "import matplotlib as mpl\n", 71 | "float(mpl.__version__[:3]) >= 1.5" 72 | ] 73 | }, 74 | { 75 | "cell_type": "code", 76 | "execution_count": 9, 77 | "metadata": {}, 78 | "outputs": [], 79 | "source": [ 80 | "import mplleaflet as mpll" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": 10, 86 | "metadata": {}, 87 | "outputs": [ 88 | { 89 | "data": { 90 | "text/plain": [ 91 | "True" 92 | ] 93 | }, 94 | "execution_count": 10, 95 | "metadata": {}, 96 | "output_type": "execute_result" 97 | } 98 | ], 99 | "source": [ 100 | "import seaborn as sns\n", 101 | "float(sns.__version__[:3]) >= 0.6" 102 | ] 103 | }, 104 | { 105 | "cell_type": "markdown", 106 | "metadata": {}, 107 | "source": [ 108 | "---" 109 | ] 110 | }, 111 | { 112 | "cell_type": "code", 113 | "execution_count": 11, 114 | "metadata": {}, 115 | "outputs": [ 116 | { 117 | "data": { 118 | "text/plain": [ 119 | "True" 120 | ] 121 | }, 122 | "execution_count": 11, 123 | "metadata": {}, 124 | "output_type": "execute_result" 125 | } 126 | ], 127 | "source": [ 128 | "import pandas as pd\n", 129 | "float(pd.__version__[:4]) >= 0.18" 130 | ] 131 | }, 132 | { 133 | "cell_type": "code", 134 | "execution_count": 12, 135 | "metadata": {}, 136 | "outputs": [ 137 | { 138 | "data": { 139 | "text/plain": [ 140 | "True" 141 | ] 142 | }, 143 | "execution_count": 12, 144 | "metadata": {}, 145 | "output_type": "execute_result" 146 | } 147 | ], 148 | "source": [ 149 | "import sklearn\n", 150 | "float(sklearn.__version__[:4]) >= 0.17" 151 | ] 152 | }, 153 | { 154 | "cell_type": "code", 155 | "execution_count": 13, 156 | "metadata": {}, 157 | "outputs": [ 158 | { 159 | "data": { 160 | "text/plain": [ 161 | "True" 162 | ] 163 | }, 164 | "execution_count": 13, 165 | "metadata": {}, 166 | "output_type": "execute_result" 167 | } 168 | ], 169 | "source": [ 170 | "import statsmodels.api as sm\n", 171 | "float(sm.version.version[:3]) >= 0.6" 172 | ] 173 | }, 174 | { 175 | "cell_type": "code", 176 | "execution_count": 14, 177 | "metadata": {}, 178 | "outputs": [], 179 | "source": [ 180 | "import xlrd" 181 | ] 182 | }, 183 | { 184 | "cell_type": "code", 185 | "execution_count": 15, 186 | "metadata": {}, 187 | "outputs": [], 188 | "source": [ 189 | "import xlsxwriter" 190 | ] 191 | }, 192 | { 193 | "cell_type": "markdown", 194 | "metadata": {}, 195 | "source": [ 196 | "---" 197 | ] 198 | }, 199 | { 200 | "cell_type": "code", 201 | "execution_count": 16, 202 | "metadata": {}, 203 | "outputs": [ 204 | { 205 | "data": { 206 | "text/plain": [ 207 | "True" 208 | ] 209 | }, 210 | "execution_count": 16, 211 | "metadata": {}, 212 | "output_type": "execute_result" 213 | } 214 | ], 215 | "source": [ 216 | "import fiona\n", 217 | "float(fiona.__version__[:3]) >= 1.7" 218 | ] 219 | }, 220 | { 221 | "cell_type": "code", 222 | "execution_count": 17, 223 | "metadata": {}, 224 | "outputs": [ 225 | { 226 | "data": { 227 | "text/plain": [ 228 | "True" 229 | ] 230 | }, 231 | "execution_count": 17, 232 | "metadata": {}, 233 | "output_type": "execute_result" 234 | } 235 | ], 236 | "source": [ 237 | "import geopandas as gpd\n", 238 | "float(gpd.__version__[:3]) >= 0.2" 239 | ] 240 | }, 241 | { 242 | "cell_type": "code", 243 | "execution_count": 18, 244 | "metadata": { 245 | "scrolled": true 246 | }, 247 | "outputs": [], 248 | "source": [ 249 | "import pysal\n", 250 | "from pysal.explore import esda\n", 251 | "from pysal.viz import mapclassify\n", 252 | "from pysal.explore import giddy" 253 | ] 254 | }, 255 | { 256 | "cell_type": "code", 257 | "execution_count": 19, 258 | "metadata": {}, 259 | "outputs": [], 260 | "source": [ 261 | "import rasterio as rio" 262 | ] 263 | }, 264 | { 265 | "cell_type": "markdown", 266 | "metadata": {}, 267 | "source": [ 268 | "# Test" 269 | ] 270 | }, 271 | { 272 | "cell_type": "code", 273 | "execution_count": 20, 274 | "metadata": {}, 275 | "outputs": [ 276 | { 277 | "data": { 278 | "text/html": [ 279 | "
\n", 280 | "\n", 293 | "\n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | " \n", 430 | " \n", 431 | " \n", 432 | " \n", 433 | " \n", 434 | " \n", 435 | " \n", 436 | " \n", 437 | " \n", 438 | " \n", 439 | " \n", 440 | " \n", 441 | " \n", 442 | "
AREAPERIMETERCOLUMBUS_COLUMBUS_IPOLYIDNEIGHOVALINCCRIMEOPEN...DISCBDXYNSANSBEWCPTHOUSNEIGNOgeometry
00.3094412.440629251580.46700319.53115.7259802.850747...5.0338.79999944.0700001.01.01.00.01000.01005.0POLYGON ((8.624129295349121 14.23698043823242,...
10.2593292.236939312144.56700121.23218.8017545.296720...4.2735.61999942.3800011.01.00.00.01000.01001.0POLYGON ((8.252790451049805 14.23694038391113,...
20.1924682.187547463626.35000015.95630.6267814.534649...3.8939.82000041.1800001.01.01.00.01000.01006.0POLYGON ((8.653305053710938 14.00809001922607,...
30.0838411.427635524233.2000014.47732.3877600.394427...3.7036.50000040.5200001.01.00.00.01000.01002.0POLYGON ((8.459499359130859 13.82034969329834,...
40.4888882.997133675723.22500011.25250.7315100.405664...2.8340.00999838.0000001.01.01.00.01000.01007.0POLYGON ((8.685274124145508 13.63951969146729,...
\n", 443 | "

5 rows × 21 columns

\n", 444 | "
" 445 | ], 446 | "text/plain": [ 447 | " AREA PERIMETER COLUMBUS_ COLUMBUS_I POLYID NEIG HOVAL \\\n", 448 | "0 0.309441 2.440629 2 5 1 5 80.467003 \n", 449 | "1 0.259329 2.236939 3 1 2 1 44.567001 \n", 450 | "2 0.192468 2.187547 4 6 3 6 26.350000 \n", 451 | "3 0.083841 1.427635 5 2 4 2 33.200001 \n", 452 | "4 0.488888 2.997133 6 7 5 7 23.225000 \n", 453 | "\n", 454 | " INC CRIME OPEN ... DISCBD X Y NSA NSB \\\n", 455 | "0 19.531 15.725980 2.850747 ... 5.03 38.799999 44.070000 1.0 1.0 \n", 456 | "1 21.232 18.801754 5.296720 ... 4.27 35.619999 42.380001 1.0 1.0 \n", 457 | "2 15.956 30.626781 4.534649 ... 3.89 39.820000 41.180000 1.0 1.0 \n", 458 | "3 4.477 32.387760 0.394427 ... 3.70 36.500000 40.520000 1.0 1.0 \n", 459 | "4 11.252 50.731510 0.405664 ... 2.83 40.009998 38.000000 1.0 1.0 \n", 460 | "\n", 461 | " EW CP THOUS NEIGNO geometry \n", 462 | "0 1.0 0.0 1000.0 1005.0 POLYGON ((8.624129295349121 14.23698043823242,... \n", 463 | "1 0.0 0.0 1000.0 1001.0 POLYGON ((8.252790451049805 14.23694038391113,... \n", 464 | "2 1.0 0.0 1000.0 1006.0 POLYGON ((8.653305053710938 14.00809001922607,... \n", 465 | "3 0.0 0.0 1000.0 1002.0 POLYGON ((8.459499359130859 13.82034969329834,... \n", 466 | "4 1.0 0.0 1000.0 1007.0 POLYGON ((8.685274124145508 13.63951969146729,... \n", 467 | "\n", 468 | "[5 rows x 21 columns]" 469 | ] 470 | }, 471 | "execution_count": 20, 472 | "metadata": {}, 473 | "output_type": "execute_result" 474 | } 475 | ], 476 | "source": [ 477 | "shp = pysal.lib.examples.get_path('columbus.shp')\n", 478 | "db = gpd.read_file(shp)\n", 479 | "db.head()" 480 | ] 481 | }, 482 | { 483 | "cell_type": "code", 484 | "execution_count": 21, 485 | "metadata": {}, 486 | "outputs": [], 487 | "source": [ 488 | "db.crs['init'] = 'epsg:26918'" 489 | ] 490 | }, 491 | { 492 | "cell_type": "code", 493 | "execution_count": 22, 494 | "metadata": {}, 495 | "outputs": [ 496 | { 497 | "data": { 498 | "image/png": "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\n", 499 | "text/plain": [ 500 | "
" 501 | ] 502 | }, 503 | "metadata": { 504 | "needs_background": "light" 505 | }, 506 | "output_type": "display_data" 507 | } 508 | ], 509 | "source": [ 510 | "db_wgs84 = db.to_crs(epsg=4326)\n", 511 | "db_wgs84.plot()\n", 512 | "plt.show()" 513 | ] 514 | }, 515 | { 516 | "cell_type": "code", 517 | "execution_count": 23, 518 | "metadata": { 519 | "scrolled": true 520 | }, 521 | "outputs": [ 522 | { 523 | "data": { 524 | "image/png": "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\n", 525 | "text/plain": [ 526 | "
" 527 | ] 528 | }, 529 | "metadata": { 530 | "needs_background": "light" 531 | }, 532 | "output_type": "display_data" 533 | } 534 | ], 535 | "source": [ 536 | "db.plot(column='INC', scheme='fisher_jenks', cmap=plt.matplotlib.cm.Blues)\n", 537 | "#plt.show()\n", 538 | "plt.savefig(fname='inc.png')" 539 | ] 540 | }, 541 | { 542 | "cell_type": "code", 543 | "execution_count": null, 544 | "metadata": {}, 545 | "outputs": [], 546 | "source": [] 547 | }, 548 | { 549 | "cell_type": "code", 550 | "execution_count": null, 551 | "metadata": {}, 552 | "outputs": [], 553 | "source": [] 554 | }, 555 | { 556 | "cell_type": "code", 557 | "execution_count": null, 558 | "metadata": {}, 559 | "outputs": [], 560 | "source": [] 561 | } 562 | ], 563 | "metadata": { 564 | "kernelspec": { 565 | "display_name": "Python 3", 566 | "language": "python", 567 | "name": "python3" 568 | }, 569 | "language_info": { 570 | "codemirror_mode": { 571 | "name": "ipython", 572 | "version": 3 573 | }, 574 | "file_extension": ".py", 575 | "mimetype": "text/x-python", 576 | "name": "python", 577 | "nbconvert_exporter": "python", 578 | "pygments_lexer": "ipython3", 579 | "version": "3.6.7" 580 | } 581 | }, 582 | "nbformat": 4, 583 | "nbformat_minor": 2 584 | } 585 | -------------------------------------------------------------------------------- /content/.ipynb_checkpoints/00_introduction-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "slideshow": { 7 | "slide_type": "slide" 8 | } 9 | }, 10 | "source": [ 11 | "# Geospatial Data Science with PySAL @FOSS4G2019\n", 12 | "\n", 13 | "Sergio Rey \n", 14 | "Stefanie Lumnitz \n", 15 | "Elijah Knaap \n", 16 | "Wei Kang \n", 17 | "\n", 18 | "\n", 19 | "\"drawing\"\n" 20 | ] 21 | }, 22 | { 23 | "cell_type": "markdown", 24 | "metadata": { 25 | "slideshow": { 26 | "slide_type": "slide" 27 | } 28 | }, 29 | "source": [ 30 | "## Origins\n", 31 | "![anaconda](figs/ancienthistory.png)\n" 32 | ] 33 | }, 34 | { 35 | "cell_type": "markdown", 36 | "metadata": { 37 | "slideshow": { 38 | "slide_type": "subslide" 39 | } 40 | }, 41 | "source": [ 42 | "## Motivation\n", 43 | "\n", 44 | "- Leverage Existing Tools\n", 45 | " - GeoDa/PySpace\n", 46 | " - STARS\n", 47 | "- Develop Core Library\n", 48 | " - spatial data analytical functions\n", 49 | " - enhanced specialization, modularity\n", 50 | " - fill void in Python scientific stack\n", 51 | "- Flexible Delivery System\n", 52 | " - interactive shells\n", 53 | " - GUI\n", 54 | " - Toolkits\n", 55 | " - webservices" 56 | ] 57 | }, 58 | { 59 | "cell_type": "markdown", 60 | "metadata": { 61 | "slideshow": { 62 | "slide_type": "subslide" 63 | } 64 | }, 65 | "source": [ 66 | "## Release History\n", 67 | "![anaconda](figs/googlecode.png)\n" 68 | ] 69 | }, 70 | { 71 | "cell_type": "markdown", 72 | "metadata": { 73 | "slideshow": { 74 | "slide_type": "slide" 75 | } 76 | }, 77 | "source": [ 78 | "## Use Case: shell\n", 79 | "![anaconda](figs/pysalcli.png)\n" 80 | ] 81 | }, 82 | { 83 | "cell_type": "markdown", 84 | "metadata": { 85 | "slideshow": { 86 | "slide_type": "subslide" 87 | } 88 | }, 89 | "source": [ 90 | "## Use Case: notebook\n", 91 | "![anaconda](figs/pysalnotebook.png)\n" 92 | ] 93 | }, 94 | { 95 | "cell_type": "markdown", 96 | "metadata": { 97 | "slideshow": { 98 | "slide_type": "subslide" 99 | } 100 | }, 101 | "source": [ 102 | "## Use Case: application\n", 103 | "![anaconda](figs/cast.png)\n" 104 | ] 105 | }, 106 | { 107 | "cell_type": "markdown", 108 | "metadata": { 109 | "slideshow": { 110 | "slide_type": "subslide" 111 | } 112 | }, 113 | "source": [ 114 | "## Use Case: toolkit\n", 115 | "![anaconda](figs/qgis.png)\n" 116 | ] 117 | }, 118 | { 119 | "cell_type": "markdown", 120 | "metadata": { 121 | "slideshow": { 122 | "slide_type": "subslide" 123 | } 124 | }, 125 | "source": [ 126 | "## Use Case: cloud\n", 127 | "![anaconda](figs/pysalcloud.png)\n" 128 | ] 129 | }, 130 | { 131 | "cell_type": "markdown", 132 | "metadata": { 133 | "slideshow": { 134 | "slide_type": "slide" 135 | } 136 | }, 137 | "source": [ 138 | "## Adoption\n", 139 | "\n", 140 | "![anaconda](figs/cartodb.png)" 141 | ] 142 | }, 143 | { 144 | "cell_type": "markdown", 145 | "metadata": { 146 | "slideshow": { 147 | "slide_type": "subslide" 148 | } 149 | }, 150 | "source": [ 151 | "## Adoption\n", 152 | "\n", 153 | "![anaconda](figs/pysalanaconda.png)" 154 | ] 155 | }, 156 | { 157 | "cell_type": "markdown", 158 | "metadata": { 159 | "slideshow": { 160 | "slide_type": "subslide" 161 | } 162 | }, 163 | "source": [ 164 | "## Adoption\n", 165 | "\n", 166 | "![anaconda](figs/pysaldebian.png)" 167 | ] 168 | }, 169 | { 170 | "cell_type": "markdown", 171 | "metadata": { 172 | "slideshow": { 173 | "slide_type": "subslide" 174 | } 175 | }, 176 | "source": [ 177 | "http://angrybirdsriogame.info/?d=How+To+Prepare+Your+Data+For+Machine+Learning+in+Python\n", 178 | "\n", 179 | "![anaconda](figs/pysalml.png)" 180 | ] 181 | }, 182 | { 183 | "cell_type": "markdown", 184 | "metadata": { 185 | "slideshow": { 186 | "slide_type": "subslide" 187 | } 188 | }, 189 | "source": [ 190 | "## PySAL GitHub Stars\n", 191 | "![anaconda](figs/githubstars.png)" 192 | ] 193 | }, 194 | { 195 | "cell_type": "markdown", 196 | "metadata": { 197 | "slideshow": { 198 | "slide_type": "slide" 199 | } 200 | }, 201 | "source": [ 202 | "## PySAL 2.0\n", 203 | "![components](figs/pysalstructure.png)" 204 | ] 205 | }, 206 | { 207 | "cell_type": "markdown", 208 | "metadata": { 209 | "slideshow": { 210 | "slide_type": "slide" 211 | } 212 | }, 213 | "source": [ 214 | "## Installation Options\n", 215 | "\n", 216 | "![installation](figs/install.png)" 217 | ] 218 | } 219 | ], 220 | "metadata": { 221 | "celltoolbar": "Slideshow", 222 | "kernelspec": { 223 | "display_name": "Python 3", 224 | "language": "python", 225 | "name": "python3" 226 | }, 227 | "language_info": { 228 | "codemirror_mode": { 229 | "name": "ipython", 230 | "version": 3 231 | }, 232 | "file_extension": ".py", 233 | "mimetype": "text/x-python", 234 | "name": "python", 235 | "nbconvert_exporter": "python", 236 | "pygments_lexer": "ipython3", 237 | "version": "3.6.7" 238 | } 239 | }, 240 | "nbformat": 4, 241 | "nbformat_minor": 2 242 | } 243 | -------------------------------------------------------------------------------- /content/.ipynb_checkpoints/09_spatial_dynamics_analytics-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Spatial dynamics analytics with [pysal/giddy](https://giddy.readthedocs.io/en/latest/index.html)\n", 8 | "\n", 9 | "* Dynamics of cross-sectional spatial autocorrelation \n", 10 | "* Modeling spatial dynamics with Markov-based methods\n", 11 | " * Classic Markov\n", 12 | " * Spatial Markov\n", 13 | " * LISA Markov" 14 | ] 15 | }, 16 | { 17 | "cell_type": "code", 18 | "execution_count": null, 19 | "metadata": {}, 20 | "outputs": [], 21 | "source": [ 22 | "from pysal.lib import io, examples, weights" 23 | ] 24 | }, 25 | { 26 | "cell_type": "code", 27 | "execution_count": null, 28 | "metadata": {}, 29 | "outputs": [], 30 | "source": [ 31 | "import matplotlib\n", 32 | "import numpy as np\n", 33 | "import geopandas as gpd\n", 34 | "import matplotlib.pyplot as plt\n", 35 | "%matplotlib inline\n", 36 | "import seaborn as sns\n", 37 | "import pandas as pd" 38 | ] 39 | }, 40 | { 41 | "cell_type": "code", 42 | "execution_count": null, 43 | "metadata": {}, 44 | "outputs": [], 45 | "source": [ 46 | "pdUS_real = pd.read_csv(\"data/US_state_pci_constant09_1929_2009.csv\")\n", 47 | "data_table = gpd.read_file(examples.get_path('us48.shp'))\n", 48 | "complete_table = data_table.merge(pdUS_real,left_on='STATE_NAME',right_on='Name')\n", 49 | "complete_table.head()" 50 | ] 51 | }, 52 | { 53 | "cell_type": "markdown", 54 | "metadata": {}, 55 | "source": [ 56 | "## Dynamics of Spatial Dependence" 57 | ] 58 | }, 59 | { 60 | "cell_type": "code", 61 | "execution_count": null, 62 | "metadata": {}, 63 | "outputs": [], 64 | "source": [ 65 | "names = pdUS_real[\"Name\"].values\n", 66 | "years = range(1929,2010)\n", 67 | "pd_pci_real = pdUS_real[list(map(str,years))]\n", 68 | "pd_pci_real.index = names\n", 69 | "pd_pci_real.head()" 70 | ] 71 | }, 72 | { 73 | "cell_type": "code", 74 | "execution_count": null, 75 | "metadata": {}, 76 | "outputs": [], 77 | "source": [ 78 | "pci_real = pd_pci_real.values.T\n", 79 | "pci_real.shape" 80 | ] 81 | }, 82 | { 83 | "cell_type": "markdown", 84 | "metadata": {}, 85 | "source": [ 86 | "Prepare the spatial weight matrix - queen contiguity" 87 | ] 88 | }, 89 | { 90 | "cell_type": "code", 91 | "execution_count": null, 92 | "metadata": {}, 93 | "outputs": [], 94 | "source": [ 95 | "w = io.open(examples.get_path(\"states48.gal\")).read()\n", 96 | "w.transform = 'R'" 97 | ] 98 | }, 99 | { 100 | "cell_type": "code", 101 | "execution_count": null, 102 | "metadata": {}, 103 | "outputs": [], 104 | "source": [ 105 | "from pysal.explore import esda\n", 106 | "mits = [esda.moran.Moran(cs, w) for cs in pci_real]\n", 107 | "res = np.array([(mi.I, mi.EI, mi.seI_norm, mi.sim[974]) for mi in mits])\n", 108 | "fig, ax = plt.subplots(nrows=1, ncols=1,figsize = (10,5) )\n", 109 | "ax.plot(years, res[:,0], label='Moran\\'s I')\n", 110 | "#plot(years, res[:,1], label='E[I]')\n", 111 | "ax.plot(years, res[:,1]+1.96*res[:,2], label='Upper bound',linestyle='dashed')\n", 112 | "ax.plot(years, res[:,1]-1.96*res[:,2], label='Lower bound',linestyle='dashed')\n", 113 | "ax.set_title(\"Global spatial autocorrelation for annual US per capita incomes\",fontdict={'fontsize':15})\n", 114 | "ax.set_xlim([1929,2009])\n", 115 | "ax.legend()" 116 | ] 117 | }, 118 | { 119 | "cell_type": "markdown", 120 | "metadata": {}, 121 | "source": [ 122 | "## Markov-based methods \n", 123 | "* Role of space in shaping per capita income dynamics" 124 | ] 125 | }, 126 | { 127 | "cell_type": "markdown", 128 | "metadata": {}, 129 | "source": [ 130 | "Spatial Markov - consider the impacts of regions' income levels on their neighbors in the following time period" 131 | ] 132 | }, 133 | { 134 | "cell_type": "code", 135 | "execution_count": null, 136 | "metadata": {}, 137 | "outputs": [], 138 | "source": [ 139 | "mean = pci_real.mean(axis=1)\n", 140 | "mean.shape = (81,1)\n", 141 | "rpci_real = pci_real / mean" 142 | ] 143 | }, 144 | { 145 | "cell_type": "markdown", 146 | "metadata": {}, 147 | "source": [ 148 | "Discretization" 149 | ] 150 | }, 151 | { 152 | "cell_type": "code", 153 | "execution_count": null, 154 | "metadata": {}, 155 | "outputs": [], 156 | "source": [ 157 | "pooled_rpci_real = rpci_real.flatten()\n", 158 | "sns.kdeplot(pooled_rpci_real,shade=True)\n" 159 | ] 160 | }, 161 | { 162 | "cell_type": "code", 163 | "execution_count": null, 164 | "metadata": {}, 165 | "outputs": [], 166 | "source": [ 167 | "pooled_n = len(pooled_rpci_real)\n", 168 | "pooled_rpci_real.sort()\n", 169 | "plt.axvline(pooled_rpci_real[int(pooled_n * 0.2)],color=\"r\")" 170 | ] 171 | }, 172 | { 173 | "cell_type": "code", 174 | "execution_count": null, 175 | "metadata": {}, 176 | "outputs": [], 177 | "source": [ 178 | "sns.kdeplot(pooled_rpci_real,shade=True)\n", 179 | "plt.axvline(pooled_rpci_real[int(pooled_n * 0.2)],color=\"r\")\n", 180 | "plt.axvline(pooled_rpci_real[int(pooled_n * 0.4)],color=\"r\")\n", 181 | "plt.axvline(pooled_rpci_real[int(pooled_n * 0.6)],color=\"r\")\n", 182 | "plt.axvline(pooled_rpci_real[int(pooled_n * 0.8)],color=\"r\")" 183 | ] 184 | }, 185 | { 186 | "cell_type": "code", 187 | "execution_count": null, 188 | "metadata": {}, 189 | "outputs": [], 190 | "source": [ 191 | "from pysal.explore import giddy\n", 192 | "smarkov = giddy.markov.Spatial_Markov(rpci_real.T, w, fixed = True, k = 5)" 193 | ] 194 | }, 195 | { 196 | "cell_type": "code", 197 | "execution_count": null, 198 | "metadata": {}, 199 | "outputs": [], 200 | "source": [ 201 | "giddy.markov.Spatial_Markov?" 202 | ] 203 | }, 204 | { 205 | "cell_type": "code", 206 | "execution_count": null, 207 | "metadata": {}, 208 | "outputs": [], 209 | "source": [ 210 | "smarkov.summary()" 211 | ] 212 | }, 213 | { 214 | "cell_type": "markdown", 215 | "metadata": {}, 216 | "source": [ 217 | "Steady state distributions" 218 | ] 219 | }, 220 | { 221 | "cell_type": "code", 222 | "execution_count": null, 223 | "metadata": {}, 224 | "outputs": [], 225 | "source": [ 226 | "smarkov.s" 227 | ] 228 | }, 229 | { 230 | "cell_type": "code", 231 | "execution_count": null, 232 | "metadata": {}, 233 | "outputs": [], 234 | "source": [ 235 | "smarkov.S" 236 | ] 237 | }, 238 | { 239 | "cell_type": "code", 240 | "execution_count": null, 241 | "metadata": {}, 242 | "outputs": [], 243 | "source": [ 244 | "smarkov.F" 245 | ] 246 | }, 247 | { 248 | "cell_type": "markdown", 249 | "metadata": {}, 250 | "source": [ 251 | "LISA Markov - consider the joint transitions of regions' and neighbors' income levels\n", 252 | "\n", 253 | "* Markov state space={1(HH), 2(LH), 3(LL), 4(HL)}" 254 | ] 255 | }, 256 | { 257 | "cell_type": "code", 258 | "execution_count": null, 259 | "metadata": {}, 260 | "outputs": [], 261 | "source": [ 262 | "giddy.markov.LISA_Markov?" 263 | ] 264 | }, 265 | { 266 | "cell_type": "code", 267 | "execution_count": null, 268 | "metadata": {}, 269 | "outputs": [], 270 | "source": [ 271 | "lm = giddy.markov.LISA_Markov(pci_real.T, w)\n", 272 | "lm.classes" 273 | ] 274 | }, 275 | { 276 | "cell_type": "code", 277 | "execution_count": null, 278 | "metadata": {}, 279 | "outputs": [], 280 | "source": [ 281 | "lm.p" 282 | ] 283 | }, 284 | { 285 | "cell_type": "code", 286 | "execution_count": null, 287 | "metadata": {}, 288 | "outputs": [], 289 | "source": [ 290 | "lm.steady_state" 291 | ] 292 | }, 293 | { 294 | "cell_type": "code", 295 | "execution_count": null, 296 | "metadata": {}, 297 | "outputs": [], 298 | "source": [ 299 | "giddy.ergodic.fmpt(lm.p)" 300 | ] 301 | }, 302 | { 303 | "cell_type": "code", 304 | "execution_count": null, 305 | "metadata": {}, 306 | "outputs": [], 307 | "source": [ 308 | "lm.chi_2" 309 | ] 310 | }, 311 | { 312 | "cell_type": "code", 313 | "execution_count": null, 314 | "metadata": {}, 315 | "outputs": [], 316 | "source": [] 317 | }, 318 | { 319 | "cell_type": "code", 320 | "execution_count": null, 321 | "metadata": {}, 322 | "outputs": [], 323 | "source": [] 324 | }, 325 | { 326 | "cell_type": "code", 327 | "execution_count": null, 328 | "metadata": {}, 329 | "outputs": [], 330 | "source": [] 331 | } 332 | ], 333 | "metadata": { 334 | "kernelspec": { 335 | "display_name": "Python 3", 336 | "language": "python", 337 | "name": "python3" 338 | }, 339 | "language_info": { 340 | "codemirror_mode": { 341 | "name": "ipython", 342 | "version": 3 343 | }, 344 | "file_extension": ".py", 345 | "mimetype": "text/x-python", 346 | "name": "python", 347 | "nbconvert_exporter": "python", 348 | "pygments_lexer": "ipython3", 349 | "version": "3.6.7" 350 | } 351 | }, 352 | "nbformat": 4, 353 | "nbformat_minor": 2 354 | } 355 | -------------------------------------------------------------------------------- /content/.ipynb_checkpoints/11_taz_example-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### Weights operations" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": null, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "import numpy as np\n", 17 | "import libpysal as ps\n", 18 | "import random as rdm\n", 19 | "import geopandas as gpd\n", 20 | "from matplotlib.collections import LineCollection\n", 21 | "import matplotlib.pyplot as plt\n", 22 | "%matplotlib inline" 23 | ] 24 | }, 25 | { 26 | "cell_type": "code", 27 | "execution_count": null, 28 | "metadata": {}, 29 | "outputs": [], 30 | "source": [ 31 | "shp = gpd.read_file(ps.examples.get_path(\"taz.shp\"))\n", 32 | "shp.head()" 33 | ] 34 | }, 35 | { 36 | "cell_type": "code", 37 | "execution_count": null, 38 | "metadata": {}, 39 | "outputs": [], 40 | "source": [ 41 | "shp.plot(figsize=(15,15),color='white', edgecolor='grey')\n", 42 | "plt.axis('off')" 43 | ] 44 | }, 45 | { 46 | "cell_type": "markdown", 47 | "metadata": {}, 48 | "source": [ 49 | "## County as unique values" 50 | ] 51 | }, 52 | { 53 | "cell_type": "code", 54 | "execution_count": null, 55 | "metadata": {}, 56 | "outputs": [], 57 | "source": [ 58 | "shp[\"CNTY\"].describe()" 59 | ] 60 | }, 61 | { 62 | "cell_type": "code", 63 | "execution_count": null, 64 | "metadata": {}, 65 | "outputs": [], 66 | "source": [ 67 | "fig, ax = plt.subplots(figsize=(15,15))\n", 68 | "ax.set_aspect('equal')\n", 69 | "shp.plot(ax=ax,color='white', edgecolor='black')\n", 70 | "shp.plot(column=\"CNTY\", ax=ax, categorical=True,cmap=\"Pastel1\",alpha=0.6)\n", 71 | "ax.set_axis_off()" 72 | ] 73 | }, 74 | { 75 | "cell_type": "markdown", 76 | "metadata": {}, 77 | "source": [ 78 | "### Construct a Rook contiguity weight" 79 | ] 80 | }, 81 | { 82 | "cell_type": "code", 83 | "execution_count": null, 84 | "metadata": {}, 85 | "outputs": [], 86 | "source": [ 87 | "wrook = ps.weights.Rook.from_dataframe(shp)" 88 | ] 89 | }, 90 | { 91 | "cell_type": "code", 92 | "execution_count": null, 93 | "metadata": {}, 94 | "outputs": [], 95 | "source": [ 96 | "def w2line_graph(w, shp):\n", 97 | " segments = []\n", 98 | " centroids = shp.centroid.values\n", 99 | " for i in w.id2i:\n", 100 | " origin = np.array(centroids[i].coords)[0] \n", 101 | " for j in w.neighbors[i]:\n", 102 | " dest = np.array(centroids[j].coords)[0]\n", 103 | " ij = [i,j]\n", 104 | " ij.sort()\n", 105 | " segments.append([origin, dest])\n", 106 | "\n", 107 | " return segments " 108 | ] 109 | }, 110 | { 111 | "cell_type": "code", 112 | "execution_count": null, 113 | "metadata": {}, 114 | "outputs": [], 115 | "source": [ 116 | "segs = w2line_graph(wrook, shp)\n", 117 | "fig, ax = plt.subplots(figsize=(15,15))\n", 118 | "ax.set_aspect('equal')\n", 119 | "shp.plot(ax=ax, color='white', edgecolor='grey')\n", 120 | "segs_plot = LineCollection(np.array(segs),colors=\"red\")\n", 121 | "segs_plot.set_linewidth(0.20)\n", 122 | "ax.add_collection(segs_plot)\n", 123 | "ax.set_axis_off()" 124 | ] 125 | }, 126 | { 127 | "cell_type": "markdown", 128 | "metadata": {}, 129 | "source": [ 130 | "## Intersection weights" 131 | ] 132 | }, 133 | { 134 | "cell_type": "code", 135 | "execution_count": null, 136 | "metadata": {}, 137 | "outputs": [], 138 | "source": [ 139 | "ps.weights.block_weights?" 140 | ] 141 | }, 142 | { 143 | "cell_type": "code", 144 | "execution_count": null, 145 | "metadata": {}, 146 | "outputs": [], 147 | "source": [ 148 | "wb = ps.weights.block_weights(shp[\"CNTY\"])" 149 | ] 150 | }, 151 | { 152 | "cell_type": "code", 153 | "execution_count": null, 154 | "metadata": { 155 | "scrolled": true 156 | }, 157 | "outputs": [], 158 | "source": [ 159 | "wint = ps.weights.w_intersection(wb, wrook)" 160 | ] 161 | }, 162 | { 163 | "cell_type": "code", 164 | "execution_count": null, 165 | "metadata": {}, 166 | "outputs": [], 167 | "source": [ 168 | "segs = w2line_graph(wint, shp)\n", 169 | "fig, ax = plt.subplots(figsize=(15,15))\n", 170 | "ax.set_aspect('equal')\n", 171 | "shp.plot(ax=ax, color='white', edgecolor='grey')\n", 172 | "segs_plot = LineCollection(np.array(segs),colors=\"red\")\n", 173 | "segs_plot.set_linewidth(0.20)\n", 174 | "ax.add_collection(segs_plot)\n", 175 | "ax.set_axis_off()" 176 | ] 177 | }, 178 | { 179 | "cell_type": "code", 180 | "execution_count": null, 181 | "metadata": {}, 182 | "outputs": [], 183 | "source": [ 184 | "fig, ax = plt.subplots(figsize=(15,15))\n", 185 | "ax.set_aspect('equal')\n", 186 | "shp.plot(ax=ax,color='white', edgecolor='black')\n", 187 | "shp.plot(column=\"CNTY\", ax=ax, categorical=True,cmap=\"Pastel1\",alpha=0.6)\n", 188 | "segs_plot = LineCollection(np.array(segs),colors=\"red\")\n", 189 | "segs_plot.set_linewidth(0.20)\n", 190 | "ax.add_collection(segs_plot)\n", 191 | "ax.set_axis_off()" 192 | ] 193 | }, 194 | { 195 | "cell_type": "code", 196 | "execution_count": null, 197 | "metadata": {}, 198 | "outputs": [], 199 | "source": [] 200 | }, 201 | { 202 | "cell_type": "code", 203 | "execution_count": null, 204 | "metadata": {}, 205 | "outputs": [], 206 | "source": [] 207 | }, 208 | { 209 | "cell_type": "code", 210 | "execution_count": null, 211 | "metadata": {}, 212 | "outputs": [], 213 | "source": [] 214 | }, 215 | { 216 | "cell_type": "code", 217 | "execution_count": null, 218 | "metadata": {}, 219 | "outputs": [], 220 | "source": [] 221 | } 222 | ], 223 | "metadata": { 224 | "anaconda-cloud": {}, 225 | "kernelspec": { 226 | "display_name": "Python 3", 227 | "language": "python", 228 | "name": "python3" 229 | }, 230 | "language_info": { 231 | "codemirror_mode": { 232 | "name": "ipython", 233 | "version": 3 234 | }, 235 | "file_extension": ".py", 236 | "mimetype": "text/x-python", 237 | "name": "python", 238 | "nbconvert_exporter": "python", 239 | "pygments_lexer": "ipython3", 240 | "version": "3.6.6" 241 | } 242 | }, 243 | "nbformat": 4, 244 | "nbformat_minor": 2 245 | } 246 | -------------------------------------------------------------------------------- /content/.ipynb_checkpoints/18_gol-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Conway's Game of Life with PySAL" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "## Rules ##\n", 15 | "\n", 16 | " 1. A cell that is currently alive and that has two **or** three live neighbors stays alive\n", 17 | " 2. A cell that is currently dead with **exactly** three live neighbors comes alive \n", 18 | " 3. All other cells remain dead, or die due to loneliness (less than 2 neighbors) or overcrowding (more than 3 neighbors)" 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": null, 24 | "metadata": {}, 25 | "outputs": [], 26 | "source": [ 27 | "import libpysal as ps\n", 28 | "from scipy.stats import bernoulli\n", 29 | "%pylab inline" 30 | ] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "execution_count": null, 35 | "metadata": {}, 36 | "outputs": [], 37 | "source": [ 38 | "k = 8 # dimension of lattice" 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": null, 44 | "metadata": {}, 45 | "outputs": [], 46 | "source": [ 47 | "w = ps.weights.lat2W(k,k,rook=False)" 48 | ] 49 | }, 50 | { 51 | "cell_type": "code", 52 | "execution_count": null, 53 | "metadata": {}, 54 | "outputs": [], 55 | "source": [ 56 | "w.n" 57 | ] 58 | }, 59 | { 60 | "cell_type": "code", 61 | "execution_count": null, 62 | "metadata": {}, 63 | "outputs": [], 64 | "source": [ 65 | "w.neighbors[0]" 66 | ] 67 | }, 68 | { 69 | "cell_type": "code", 70 | "execution_count": null, 71 | "metadata": {}, 72 | "outputs": [], 73 | "source": [ 74 | "w.neighbors[45]" 75 | ] 76 | }, 77 | { 78 | "cell_type": "code", 79 | "execution_count": null, 80 | "metadata": {}, 81 | "outputs": [], 82 | "source": [ 83 | "w.weights[0]" 84 | ] 85 | }, 86 | { 87 | "cell_type": "code", 88 | "execution_count": null, 89 | "metadata": {}, 90 | "outputs": [], 91 | "source": [ 92 | "y = bernoulli.rvs(0.45,size=w.n)" 93 | ] 94 | }, 95 | { 96 | "cell_type": "code", 97 | "execution_count": null, 98 | "metadata": {}, 99 | "outputs": [], 100 | "source": [ 101 | "y" 102 | ] 103 | }, 104 | { 105 | "cell_type": "code", 106 | "execution_count": null, 107 | "metadata": {}, 108 | "outputs": [], 109 | "source": [ 110 | "wy = ps.weights.lag_spatial(w,y)" 111 | ] 112 | }, 113 | { 114 | "cell_type": "code", 115 | "execution_count": null, 116 | "metadata": {}, 117 | "outputs": [], 118 | "source": [ 119 | "wy" 120 | ] 121 | }, 122 | { 123 | "cell_type": "markdown", 124 | "metadata": {}, 125 | "source": [ 126 | "## Rules ##\n", 127 | "\n", 128 | " 1. A cell that is currently alive and that has two **or** three live neighbors stays alive\n", 129 | " 2. A cell that is currently dead with **exactly** three live neighbors comes alive \n", 130 | " 3. All other cells remain dead, or die due to loneliness (less than 2 neighbors) or overcrowding (more than 3 neighbors)" 131 | ] 132 | }, 133 | { 134 | "cell_type": "markdown", 135 | "metadata": {}, 136 | "source": [ 137 | "Rule 1: find live cells and count their neighbors" 138 | ] 139 | }, 140 | { 141 | "cell_type": "code", 142 | "execution_count": null, 143 | "metadata": {}, 144 | "outputs": [], 145 | "source": [ 146 | "ywy = y*wy" 147 | ] 148 | }, 149 | { 150 | "cell_type": "code", 151 | "execution_count": null, 152 | "metadata": {}, 153 | "outputs": [], 154 | "source": [ 155 | "lw23 = np.nonzero( (ywy==2) + (ywy==3) )" 156 | ] 157 | }, 158 | { 159 | "cell_type": "code", 160 | "execution_count": null, 161 | "metadata": {}, 162 | "outputs": [], 163 | "source": [ 164 | "lw23" 165 | ] 166 | }, 167 | { 168 | "cell_type": "markdown", 169 | "metadata": {}, 170 | "source": [ 171 | "Rule 2: find dead cells with exactly 3 neighbors" 172 | ] 173 | }, 174 | { 175 | "cell_type": "code", 176 | "execution_count": null, 177 | "metadata": {}, 178 | "outputs": [], 179 | "source": [ 180 | "dw3 = (1-y) * wy" 181 | ] 182 | }, 183 | { 184 | "cell_type": "code", 185 | "execution_count": null, 186 | "metadata": {}, 187 | "outputs": [], 188 | "source": [ 189 | "np.nonzero(dw3==3)" 190 | ] 191 | }, 192 | { 193 | "cell_type": "markdown", 194 | "metadata": {}, 195 | "source": [ 196 | "Rules 1 and 2 give us the surviving cells" 197 | ] 198 | }, 199 | { 200 | "cell_type": "code", 201 | "execution_count": null, 202 | "metadata": {}, 203 | "outputs": [], 204 | "source": [ 205 | "live_next = np.nonzero( (ywy==2) + (ywy==3) + (dw3==3) )" 206 | ] 207 | }, 208 | { 209 | "cell_type": "code", 210 | "execution_count": null, 211 | "metadata": {}, 212 | "outputs": [], 213 | "source": [ 214 | "live_next" 215 | ] 216 | }, 217 | { 218 | "cell_type": "code", 219 | "execution_count": null, 220 | "metadata": {}, 221 | "outputs": [], 222 | "source": [ 223 | "y[live_next]" 224 | ] 225 | }, 226 | { 227 | "cell_type": "markdown", 228 | "metadata": {}, 229 | "source": [ 230 | "So we see that in the future, some dead cells will becoming alive. But what about live cells now that die in the next period?\n", 231 | "\n", 232 | "We know that they will be dead next period. Allocate an array with zeros for the next period and assign the live cells. Everyone else is dead." 233 | ] 234 | }, 235 | { 236 | "cell_type": "code", 237 | "execution_count": null, 238 | "metadata": {}, 239 | "outputs": [], 240 | "source": [ 241 | "y1 = np.zeros_like(y)" 242 | ] 243 | }, 244 | { 245 | "cell_type": "code", 246 | "execution_count": null, 247 | "metadata": {}, 248 | "outputs": [], 249 | "source": [ 250 | "y1[live_next] = 1" 251 | ] 252 | }, 253 | { 254 | "cell_type": "code", 255 | "execution_count": null, 256 | "metadata": {}, 257 | "outputs": [], 258 | "source": [ 259 | "y1" 260 | ] 261 | }, 262 | { 263 | "cell_type": "markdown", 264 | "metadata": {}, 265 | "source": [ 266 | "We would then iterate these steps for future generations. \n", 267 | "\n", 268 | "Let's place the process inside a function for reuse later" 269 | ] 270 | }, 271 | { 272 | "cell_type": "code", 273 | "execution_count": null, 274 | "metadata": {}, 275 | "outputs": [], 276 | "source": [ 277 | "def generation(y,w):\n", 278 | " y1 = np.zeros_like(y)\n", 279 | " wy = ps.weights.lag_spatial(w,y)\n", 280 | " ywy = y * wy\n", 281 | " live_next = np.nonzero( ( ywy == 2 ) + ( ywy == 3 ) + ( ( 1-y ) * wy == 3 ) )\n", 282 | " y1[live_next] = 1\n", 283 | " return y1\n", 284 | " " 285 | ] 286 | }, 287 | { 288 | "cell_type": "markdown", 289 | "metadata": {}, 290 | "source": [ 291 | "Try this out on some fresh data." 292 | ] 293 | }, 294 | { 295 | "cell_type": "code", 296 | "execution_count": null, 297 | "metadata": {}, 298 | "outputs": [], 299 | "source": [ 300 | "y = bernoulli.rvs(0.45,size=w.n)" 301 | ] 302 | }, 303 | { 304 | "cell_type": "code", 305 | "execution_count": null, 306 | "metadata": {}, 307 | "outputs": [], 308 | "source": [ 309 | "y1 = generation(y,w)" 310 | ] 311 | }, 312 | { 313 | "cell_type": "code", 314 | "execution_count": null, 315 | "metadata": {}, 316 | "outputs": [], 317 | "source": [ 318 | "y1" 319 | ] 320 | }, 321 | { 322 | "cell_type": "code", 323 | "execution_count": null, 324 | "metadata": {}, 325 | "outputs": [], 326 | "source": [ 327 | "y" 328 | ] 329 | }, 330 | { 331 | "cell_type": "code", 332 | "execution_count": null, 333 | "metadata": {}, 334 | "outputs": [], 335 | "source": [ 336 | "y2 = generation(y1,w)" 337 | ] 338 | }, 339 | { 340 | "cell_type": "code", 341 | "execution_count": null, 342 | "metadata": {}, 343 | "outputs": [], 344 | "source": [ 345 | "y2" 346 | ] 347 | }, 348 | { 349 | "cell_type": "markdown", 350 | "metadata": {}, 351 | "source": [ 352 | "One interesting initial pattern is the so called R-pentomino.\n", 353 | "\n", 354 | "We will create one and then run a simulation to see how the solutions evolve." 355 | ] 356 | }, 357 | { 358 | "cell_type": "code", 359 | "execution_count": null, 360 | "metadata": {}, 361 | "outputs": [], 362 | "source": [ 363 | "ngen=350\n", 364 | "k = 50\n", 365 | "w = ps.weights.lat2W(k, k, rook=False)\n", 366 | "#y = bernoulli.rvs(0.45,size=w.n)\n", 367 | "y = np.zeros((w.n,))\n", 368 | "#R-pentomino pattern http://conwaylife.com/w/index.php?title=R-pentomino\n", 369 | "ymat = np.zeros((k,k))\n", 370 | "mid = k//2\n", 371 | "ymat[mid,mid] = 1\n", 372 | "ymat[mid-1,mid ] = 1 # left\n", 373 | "ymat[mid,mid+1] = 1 # top\n", 374 | "ymat[mid+1, mid+1] = 1 # top right\n", 375 | "ymat[mid, mid-1] = 1 # bottom\n", 376 | "\n" 377 | ] 378 | }, 379 | { 380 | "cell_type": "code", 381 | "execution_count": null, 382 | "metadata": {}, 383 | "outputs": [], 384 | "source": [ 385 | "\n", 386 | "imshow(ymat,cmap='Greys' )" 387 | ] 388 | }, 389 | { 390 | "cell_type": "code", 391 | "execution_count": null, 392 | "metadata": {}, 393 | "outputs": [], 394 | "source": [ 395 | "y = ymat.reshape((k*k,1))" 396 | ] 397 | }, 398 | { 399 | "cell_type": "code", 400 | "execution_count": null, 401 | "metadata": {}, 402 | "outputs": [], 403 | "source": [ 404 | "results = {}\n", 405 | "for i in range(ngen):\n", 406 | " y1 = generation(y,w)\n", 407 | " results[i] = y\n", 408 | " y = y1\n", 409 | " " 410 | ] 411 | }, 412 | { 413 | "cell_type": "code", 414 | "execution_count": null, 415 | "metadata": {}, 416 | "outputs": [], 417 | "source": [ 418 | "ngen" 419 | ] 420 | }, 421 | { 422 | "cell_type": "markdown", 423 | "metadata": {}, 424 | "source": [ 425 | "Create some graphs to look at both the the individual maps from every 10th generation and then plot the aggregate population size by generation." 426 | ] 427 | }, 428 | { 429 | "cell_type": "code", 430 | "execution_count": null, 431 | "metadata": {}, 432 | "outputs": [], 433 | "source": [ 434 | "generations = np.zeros((ngen,))\n", 435 | "living = np.zeros_like(generations)\n", 436 | "keys = list(results.keys())\n", 437 | "keys.sort()\n", 438 | "for i in keys:\n", 439 | " generations[i] = i\n", 440 | " living[i] = results[i].sum()\n", 441 | " if not i%50:\n", 442 | " ymat = results[i]\n", 443 | " ymat.shape = (k,k)\n", 444 | " imshow(ymat,cmap='Greys', interpolation='nearest')\n", 445 | " title(\"Generation %d\"%i)\n", 446 | " show()\n", 447 | " " 448 | ] 449 | }, 450 | { 451 | "cell_type": "code", 452 | "execution_count": null, 453 | "metadata": {}, 454 | "outputs": [], 455 | "source": [ 456 | "generations.shape" 457 | ] 458 | }, 459 | { 460 | "cell_type": "code", 461 | "execution_count": null, 462 | "metadata": {}, 463 | "outputs": [], 464 | "source": [ 465 | "plot(generations,living)" 466 | ] 467 | }, 468 | { 469 | "cell_type": "code", 470 | "execution_count": null, 471 | "metadata": {}, 472 | "outputs": [], 473 | "source": [ 474 | "ymat = results[ngen-1]" 475 | ] 476 | }, 477 | { 478 | "cell_type": "code", 479 | "execution_count": null, 480 | "metadata": {}, 481 | "outputs": [], 482 | "source": [ 483 | "ymat.shape" 484 | ] 485 | }, 486 | { 487 | "cell_type": "code", 488 | "execution_count": null, 489 | "metadata": {}, 490 | "outputs": [], 491 | "source": [ 492 | "ymat.shape=(50,50)" 493 | ] 494 | }, 495 | { 496 | "cell_type": "code", 497 | "execution_count": null, 498 | "metadata": {}, 499 | "outputs": [], 500 | "source": [ 501 | "imshow(ymat, cmap='Greys', interpolation='nearest')\n", 502 | "title(\"Last Generation\")" 503 | ] 504 | }, 505 | { 506 | "cell_type": "code", 507 | "execution_count": null, 508 | "metadata": {}, 509 | "outputs": [], 510 | "source": [ 511 | "ymat = results[0]" 512 | ] 513 | }, 514 | { 515 | "cell_type": "code", 516 | "execution_count": null, 517 | "metadata": {}, 518 | "outputs": [], 519 | "source": [ 520 | "ymat.shape = (k,k)" 521 | ] 522 | }, 523 | { 524 | "cell_type": "code", 525 | "execution_count": null, 526 | "metadata": {}, 527 | "outputs": [], 528 | "source": [ 529 | "imshow(ymat, cmap='Greys', interpolation='nearest')\n", 530 | "title('First Generation: R-pentomino')" 531 | ] 532 | }, 533 | { 534 | "cell_type": "code", 535 | "execution_count": null, 536 | "metadata": {}, 537 | "outputs": [], 538 | "source": [ 539 | "ymat = results[ngen-2]\n", 540 | "ymat.shape=(50,50)\n", 541 | "imshow(ymat, cmap='Greys', interpolation='nearest')\n", 542 | "title(\"Penultimate Generation\")" 543 | ] 544 | }, 545 | { 546 | "cell_type": "code", 547 | "execution_count": null, 548 | "metadata": {}, 549 | "outputs": [], 550 | "source": [ 551 | "ymat = results[ngen-1]\n", 552 | "ymat.shape=(50,50)\n", 553 | "imshow(ymat, cmap='Greys', interpolation='nearest')\n", 554 | "title(\"Final Generation\")" 555 | ] 556 | }, 557 | { 558 | "cell_type": "code", 559 | "execution_count": null, 560 | "metadata": {}, 561 | "outputs": [], 562 | "source": [] 563 | }, 564 | { 565 | "cell_type": "code", 566 | "execution_count": null, 567 | "metadata": {}, 568 | "outputs": [], 569 | "source": [] 570 | }, 571 | { 572 | "cell_type": "code", 573 | "execution_count": null, 574 | "metadata": {}, 575 | "outputs": [], 576 | "source": [] 577 | }, 578 | { 579 | "cell_type": "code", 580 | "execution_count": null, 581 | "metadata": {}, 582 | "outputs": [], 583 | "source": [] 584 | }, 585 | { 586 | "cell_type": "code", 587 | "execution_count": null, 588 | "metadata": {}, 589 | "outputs": [], 590 | "source": [] 591 | } 592 | ], 593 | "metadata": { 594 | "anaconda-cloud": {}, 595 | "kernelspec": { 596 | "display_name": "Python 3", 597 | "language": "python", 598 | "name": "python3" 599 | }, 600 | "language_info": { 601 | "codemirror_mode": { 602 | "name": "ipython", 603 | "version": 3 604 | }, 605 | "file_extension": ".py", 606 | "mimetype": "text/x-python", 607 | "name": "python", 608 | "nbconvert_exporter": "python", 609 | "pygments_lexer": "ipython3", 610 | "version": "3.6.6" 611 | } 612 | }, 613 | "nbformat": 4, 614 | "nbformat_minor": 2 615 | } 616 | -------------------------------------------------------------------------------- /content/00_introduction.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "slideshow": { 7 | "slide_type": "slide" 8 | } 9 | }, 10 | "source": [ 11 | "# Geospatial Data Science with PySAL @FOSS4G2019\n", 12 | "\n", 13 | "Sergio Rey \n", 14 | "Stefanie Lumnitz \n", 15 | "Elijah Knaap \n", 16 | "Wei Kang \n", 17 | "\n", 18 | "\n", 19 | "\"drawing\"\n" 20 | ] 21 | }, 22 | { 23 | "cell_type": "markdown", 24 | "metadata": { 25 | "slideshow": { 26 | "slide_type": "slide" 27 | } 28 | }, 29 | "source": [ 30 | "## Origins\n", 31 | "![anaconda](figs/ancienthistory.png)\n" 32 | ] 33 | }, 34 | { 35 | "cell_type": "markdown", 36 | "metadata": { 37 | "slideshow": { 38 | "slide_type": "subslide" 39 | } 40 | }, 41 | "source": [ 42 | "## Motivation\n", 43 | "\n", 44 | "- Leverage Existing Tools\n", 45 | " - GeoDa/PySpace\n", 46 | " - STARS\n", 47 | "- Develop Core Library\n", 48 | " - spatial data analytical functions\n", 49 | " - enhanced specialization, modularity\n", 50 | " - fill void in Python scientific stack\n", 51 | "- Flexible Delivery System\n", 52 | " - interactive shells\n", 53 | " - GUI\n", 54 | " - Toolkits\n", 55 | " - webservices" 56 | ] 57 | }, 58 | { 59 | "cell_type": "markdown", 60 | "metadata": { 61 | "slideshow": { 62 | "slide_type": "subslide" 63 | } 64 | }, 65 | "source": [ 66 | "## Release History\n", 67 | "![anaconda](figs/googlecode.png)\n" 68 | ] 69 | }, 70 | { 71 | "cell_type": "markdown", 72 | "metadata": { 73 | "slideshow": { 74 | "slide_type": "slide" 75 | } 76 | }, 77 | "source": [ 78 | "## Use Case: shell\n", 79 | "![anaconda](figs/pysalcli.png)\n" 80 | ] 81 | }, 82 | { 83 | "cell_type": "markdown", 84 | "metadata": { 85 | "slideshow": { 86 | "slide_type": "subslide" 87 | } 88 | }, 89 | "source": [ 90 | "## Use Case: notebook\n", 91 | "![anaconda](figs/pysalnotebook.png)\n" 92 | ] 93 | }, 94 | { 95 | "cell_type": "markdown", 96 | "metadata": { 97 | "slideshow": { 98 | "slide_type": "subslide" 99 | } 100 | }, 101 | "source": [ 102 | "## Use Case: application\n", 103 | "![anaconda](figs/cast.png)\n" 104 | ] 105 | }, 106 | { 107 | "cell_type": "markdown", 108 | "metadata": { 109 | "slideshow": { 110 | "slide_type": "subslide" 111 | } 112 | }, 113 | "source": [ 114 | "## Use Case: toolkit\n", 115 | "![anaconda](figs/qgis.png)\n" 116 | ] 117 | }, 118 | { 119 | "cell_type": "markdown", 120 | "metadata": { 121 | "slideshow": { 122 | "slide_type": "subslide" 123 | } 124 | }, 125 | "source": [ 126 | "## Use Case: cloud\n", 127 | "![anaconda](figs/pysalcloud.png)\n" 128 | ] 129 | }, 130 | { 131 | "cell_type": "markdown", 132 | "metadata": { 133 | "slideshow": { 134 | "slide_type": "slide" 135 | } 136 | }, 137 | "source": [ 138 | "## Adoption\n", 139 | "\n", 140 | "![anaconda](figs/cartodb.png)" 141 | ] 142 | }, 143 | { 144 | "cell_type": "markdown", 145 | "metadata": { 146 | "slideshow": { 147 | "slide_type": "subslide" 148 | } 149 | }, 150 | "source": [ 151 | "## Adoption\n", 152 | "\n", 153 | "![anaconda](figs/pysalanaconda.png)" 154 | ] 155 | }, 156 | { 157 | "cell_type": "markdown", 158 | "metadata": { 159 | "slideshow": { 160 | "slide_type": "subslide" 161 | } 162 | }, 163 | "source": [ 164 | "## Adoption\n", 165 | "\n", 166 | "![anaconda](figs/pysaldebian.png)" 167 | ] 168 | }, 169 | { 170 | "cell_type": "markdown", 171 | "metadata": { 172 | "slideshow": { 173 | "slide_type": "subslide" 174 | } 175 | }, 176 | "source": [ 177 | "http://angrybirdsriogame.info/?d=How+To+Prepare+Your+Data+For+Machine+Learning+in+Python\n", 178 | "\n", 179 | "![anaconda](figs/pysalml.png)" 180 | ] 181 | }, 182 | { 183 | "cell_type": "markdown", 184 | "metadata": { 185 | "slideshow": { 186 | "slide_type": "subslide" 187 | } 188 | }, 189 | "source": [ 190 | "## PySAL GitHub Stars\n", 191 | "![anaconda](figs/githubstars.png)" 192 | ] 193 | }, 194 | { 195 | "cell_type": "markdown", 196 | "metadata": { 197 | "slideshow": { 198 | "slide_type": "slide" 199 | } 200 | }, 201 | "source": [ 202 | "## PySAL 2.0\n", 203 | "![components](figs/pysalstructure.png)" 204 | ] 205 | }, 206 | { 207 | "cell_type": "markdown", 208 | "metadata": { 209 | "slideshow": { 210 | "slide_type": "slide" 211 | } 212 | }, 213 | "source": [ 214 | "## Installation Options\n", 215 | "\n", 216 | "![installation](figs/install.png)" 217 | ] 218 | } 219 | ], 220 | "metadata": { 221 | "celltoolbar": "Slideshow", 222 | "kernelspec": { 223 | "display_name": "Python 3", 224 | "language": "python", 225 | "name": "python3" 226 | }, 227 | "language_info": { 228 | "codemirror_mode": { 229 | "name": "ipython", 230 | "version": 3 231 | }, 232 | "file_extension": ".py", 233 | "mimetype": "text/x-python", 234 | "name": "python", 235 | "nbconvert_exporter": "python", 236 | "pygments_lexer": "ipython3", 237 | "version": "3.7.3" 238 | } 239 | }, 240 | "nbformat": 4, 241 | "nbformat_minor": 2 242 | } 243 | -------------------------------------------------------------------------------- /content/data/CPI1913-2016.csv: -------------------------------------------------------------------------------- 1 | year,cpi 1913,9.9 1914,10 1915,10.1 1916,10.9 1917,12.8 1918,15.1 1919,17.3 1920,20 1921,17.9 1922,16.8 1923,17.1 1924,17.1 1925,17.5 1926,17.7 1927,17.4 1928,17.1 1929,17.1 1930,16.7 1931,15.2 1932,13.7 1933,13 1934,13.4 1935,13.7 1936,13.9 1937,14.4 1938,14.1 1939,13.9 1940,14 1941,14.7 1942,16.3 1943,17.3 1944,17.6 1945,18 1946,19.5 1947,22.3 1948,24.1 1949,23.8 1950,24.1 1951,26 1952,26.5 1953,26.7 1954,26.9 1955,26.8 1956,27.2 1957,28.1 1958,28.9 1959,29.1 1960,29.6 1961,29.9 1962,30.2 1963,30.6 1964,31 1965,31.5 1966,32.4 1967,33.4 1968,34.8 1969,36.7 1970,38.8 1971,40.5 1972,41.8 1973,44.4 1974,49.3 1975,53.8 1976,56.9 1977,60.6 1978,65.2 1979,72.6 1980,82.4 1981,90.9 1982,96.5 1983,99.6 1984,103.9 1985,107.6 1986,109.6 1987,113.6 1988,118.3 1989,124 1990,130.7 1991,136.2 1992,140.3 1993,144.5 1994,148.2 1995,152.4 1996,156.9 1997,160.5 1998,163 1999,166.6 2000,172.2 2001,177.1 2002,179.9 2003,184 2004,188.9 2005,195.3 2006,201.6 2007,207.342 2008,215.303 2009,214.537 2010,218.056 2011,224.939 2012,229.594 2013,232.957 2014,236.736 2015,237.017 2016,240.007 -------------------------------------------------------------------------------- /content/data/README.md: -------------------------------------------------------------------------------- 1 | # Data 2 | 3 | This tutorial makes use of a variety of data sources. Below is a brief description of each dataset as well as the links to the original source where the data was downloaded from. For convenience, we have repackaged the data and included them in the compressed file with the notebooks. You can download it [here](../../gds_scipy16.zip). 4 | 5 | ## Texas counties 6 | 7 | This includes Texas counties from the Census Bureau and a list of attached 8 | socio-economic variables. This is an extract of the national cover dataset 9 | `NAT` that is part of the example datasets shipped with `PySAL`. 10 | 11 | ## AirBnb listing for Austin (TX) 12 | 13 | This dataset contains information for [AirBnb](https://www.airbnb.com/) properties for the area of Austin (TX). It is originally provided by [Inside AirBnb](http://insideairbnb.com/). Same as the source, the dataset is released under a [CC0 1.0 Universal License](http://creativecommons.org/publicdomain/zero/1.0/). You can see a summary of the dataset [here](http://insideairbnb.com/austin/index.html). 14 | 15 | **Source**: [Inside AirBnb](http://insideairbnb.com/get-the-data.html)’s extract of AirBnb locations in Austin (TX). 16 | 17 | **Path**: `data/listings.csv.gz` 18 | 19 | ## Austin Zipcodes 20 | 21 | Boundaries for Zipcodes in Austin. The original source is provided by the City of Austin GIS Division. 22 | 23 | **Source**: open data from the city of Austin [[url]](https://data.austintexas.gov/Geodata/Zipcodes/23x8-agw7) 24 | 25 | **Path**: `data/Zipcodes.geojson` 26 | -------------------------------------------------------------------------------- /content/data/Surrey_park_street_trees_April2018.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/data/Surrey_park_street_trees_April2018.csv -------------------------------------------------------------------------------- /content/data/boston.dbf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/data/boston.dbf -------------------------------------------------------------------------------- /content/data/boston.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/data/boston.shp -------------------------------------------------------------------------------- /content/data/boston.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/data/boston.shx -------------------------------------------------------------------------------- /content/data/listings.csv.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/data/listings.csv.gz -------------------------------------------------------------------------------- /content/data/mexicojoin.dbf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/data/mexicojoin.dbf -------------------------------------------------------------------------------- /content/data/mexicojoin.prj: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/data/mexicojoin.prj -------------------------------------------------------------------------------- /content/data/mexicojoin.qpj: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /content/data/mexicojoin.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/data/mexicojoin.shp -------------------------------------------------------------------------------- /content/data/mexicojoin.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/data/mexicojoin.shx -------------------------------------------------------------------------------- /content/data/participants2016.csv: -------------------------------------------------------------------------------- 1 | name,email,lon,lat 2 | Debra McKay,dmckay@iastate.edu,-93.6465,42.0266 3 | Alain Pholo Bala,apholo@uj.ac.za,27.9977,-26.1836 4 | Cory Yemen,yemenc@gmail.com,-74.4471,40.5015 5 | Johanna Manrique Hernandez,jemanriqueh@gmail.com,-74.0721,-4.711 6 | Sudhir Thakur,thakurs@csus.edu,-121.4944,38.5816 7 | David Patton,grazi1m@cmich.edu,-84.7752,43.5912 8 | Henry Renski,hrenski@umass.edu,-72.4969,42.3404 9 | Enza Maltese,enzamaltese@gmail.com,13.3614,38.1157 10 | Xian Bak,fangxian8663@gmail.com,-88.2073,40.1106 11 | Cynthia Goytia,cgoytia@utdt.edu,-96.797,32.7767 12 | Kenzo Asahi,kasahi@uc.cl,-70.6693,-33.4489 13 | Andrea Caragliu,10268614@polimi.it,9.1859,45.4654 14 | Daniel Broxterman,dbroxterman@fsu.edu,-84.2807,30.4383 15 | Nicholas Garcia,garcia.119@buckeyemail.osu.edu,-82.9988,39.9612 16 | Miriam Valdes,miriam.valdes@uadec.edu.mx,-101.7068,27.0587 17 | Hernan Ocampo Solarte,hocampo@uao.edu.co,-76.5358,3.4525 18 | Andres Vallone,andres.vallone@predoc.uam.es,-70.3975,-23.6509 19 | Jorge Alberto Orellana Aragón,jorgealbertoorellanaaragon@gmail.com,-51.2177,-30.0346 20 | Seva Rodnyansky,rodnyans@usc.edu,-118.2851,34.0224 21 | -------------------------------------------------------------------------------- /content/data/participants2017.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/data/participants2017.csv -------------------------------------------------------------------------------- /content/data/participants2018.csv: -------------------------------------------------------------------------------- 1 | name,email,lat,lon,affiliation 2 | Alain Pholo Bala,apholo@uj.ac.za,-26.2614,27.9226,University of Johannesburg 3 | Annie Lee,annieslee777@gmail.com,40.5008,-74.4474,Rutgers University 4 | Yan Cen,cenyan0304@live.cn,43.8171,125.3235,Northeast Normal University 5 | Brian Asquith,basquith86@gmail.com,42.2900,-85.5981,W.E. Upjohn Institute 6 | Raul Silveira Neto,rau.silveira@uol.com.br,-8.0441,-34.8861,Federal University of Pernambuco 7 | Alin Halimatussadiah,alin.halimah@gmail.com,6.3628,106.8270,University of Indonesia 8 | Zhangliang Chen,zchen105@gmail.com,42.3770,-71.1167,Harvard Kennedy School 9 | André Chagas,achagas@usp.br,-23.5447, -46.62529,University of Sao Paulo 10 | Mitsuru Ota,ota@sk.tsukuba.ac.jp,36.1088,140.1037,University of Tsukuba 11 | Vikash Dangal,vdangal@agcenter.lsu.edu,30.4133,-91.1800,Louisiana State University 12 | Bryce Pludow,bapludow@gmail.com,34.4140,-119.8489,University of Santa Barbara 13 | Mark Folden,mfolden@nctcog.org,32.7503,-97.0678,North Central Texas Council of Governments 14 | Ziv Rubin,ziv.rubin@utoronto.ca,43.6629,-79.3957,University of Toronto 15 | Diego Firmino Costa da Silva,diegofirmino@gmail.com,-8.0175,-34.9492,Universidade Federal Rural de Pernambuco 16 | Toru Murayama,torumurayama0224@gmail.com,34.2305,135.1708,Wakayama College Japan 17 | -------------------------------------------------------------------------------- /content/data/san_diego.cpg: -------------------------------------------------------------------------------- 1 | ISO-8859-1 -------------------------------------------------------------------------------- /content/data/san_diego.dbf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/data/san_diego.dbf -------------------------------------------------------------------------------- /content/data/san_diego.prj: -------------------------------------------------------------------------------- 1 | PROJCS["WGS_1984_Web_Mercator_Auxiliary_Sphere",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Mercator_Auxiliary_Sphere"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",0.0],PARAMETER["Standard_Parallel_1",0.0],PARAMETER["Auxiliary_Sphere_Type",0.0],UNIT["Meter",1.0]] -------------------------------------------------------------------------------- /content/data/san_diego.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/data/san_diego.shp -------------------------------------------------------------------------------- /content/data/san_diego.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/data/san_diego.shx -------------------------------------------------------------------------------- /content/data/san_diego.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/data/san_diego.tif -------------------------------------------------------------------------------- /content/data/texas.dbf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/data/texas.dbf -------------------------------------------------------------------------------- /content/data/texas.prj: -------------------------------------------------------------------------------- 1 | GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] -------------------------------------------------------------------------------- /content/data/texas.qgs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | degrees 13 | 14 | -106.96550759144044207 15 | 25.57898068428039551 16 | -93.16609696216796976 17 | 36.76009440422058105 18 | 19 | 0 20 | 0 21 | 22 | 23 | +proj=longlat +datum=WGS84 +no_defs 24 | 3452 25 | 4326 26 | EPSG:4326 27 | WGS 84 28 | longlat 29 | WGS84 30 | true 31 | 32 | 33 | 0 34 | 35 | 36 | 37 | 38 | texas20160611154218713 39 | 40 | 41 | 42 | 43 | 46 | 47 | 48 | 49 | 50 | texas20160611154218713 51 | /home/serge/Dropbox/p/pysal/workshops/scipy16/gds_scipy16/content/data/texas.shp 52 | 53 | 54 | 55 | texas 56 | 57 | 58 | +proj=longlat +datum=WGS84 +no_defs 59 | 3452 60 | 4326 61 | EPSG:4326 62 | WGS 84 63 | longlat 64 | WGS84 65 | true 66 | 67 | 68 | ogr 69 | COALESCE( "NAME", '<NULL>' ) 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 0 541 | 0 542 | 0 543 | NAME 544 | 545 | 546 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 0 578 | 579 | 596 | 0 597 | generatedlayout 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | +proj=longlat +datum=WGS84 +no_defs 612 | EPSG:4326 613 | 3452 614 | 615 | 616 | false 617 | 618 | 619 | 0 620 | 255 621 | 255 622 | 255 623 | 255 624 | 255 625 | 255 626 | 627 | 628 | 2 629 | current_layer 630 | off 631 | 0 632 | 633 | 634 | 2 635 | true 636 | 637 | 638 | false 639 | 640 | 641 | 642 | 643 | -------------------------------------------------------------------------------- /content/data/texas.qgs~: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | degrees 16 | 17 | -106.97807064056397053 18 | 25.57898068428039551 19 | -93.17866001129149822 20 | 36.76009440422058105 21 | 22 | 0 23 | 0 24 | 25 | 26 | +proj=longlat +datum=WGS84 +no_defs 27 | 3452 28 | 4326 29 | EPSG:4326 30 | WGS 84 31 | longlat 32 | WGS84 33 | true 34 | 35 | 36 | 0 37 | 38 | 39 | 40 | 41 | texas20160611154218713 42 | south20161025171731157 43 | 44 | 45 | 46 | 47 | 50 | 51 | 52 | 55 | 56 | 57 | 58 | 59 | south20161025171731157 60 | ../../../../../src/pysal/pysal/examples/south/south.shp 61 | 62 | 63 | 64 | 65 | 66 | 67 | south 68 | 69 | 70 | +proj=longlat +datum=WGS84 +no_defs 71 | 3452 72 | 4326 73 | EPSG:4326 74 | WGS 84 75 | longlat 76 | WGS84 77 | true 78 | 79 | 80 | ogr 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 0 321 | 0 322 | 0 323 | NAME 324 | 325 | 326 | 345 | . 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | . 421 | 422 | 0 423 | . 424 | 425 | 0 426 | generatedlayout 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | texas20160611154218713 435 | ./texas.shp 436 | 437 | 438 | 439 | 440 | 441 | 442 | texas 443 | 444 | 445 | +proj=longlat +datum=WGS84 +no_defs 446 | 3452 447 | 4326 448 | EPSG:4326 449 | WGS 84 450 | longlat 451 | WGS84 452 | true 453 | 454 | 455 | ogr 456 | COALESCE( "NAME", '<NULL>' ) 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | 764 | 765 | 766 | 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | 783 | 784 | 785 | 786 | 787 | 788 | 789 | 790 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 830 | 831 | 832 | 833 | 834 | 835 | 836 | 837 | 838 | 839 | 840 | 841 | 842 | 843 | 844 | 845 | 846 | 847 | 848 | 849 | 850 | 851 | 852 | 853 | 854 | 855 | 856 | 857 | 858 | 859 | 860 | 861 | 862 | 863 | 864 | 865 | 866 | 867 | 868 | 869 | 870 | 871 | 872 | 873 | 874 | 875 | 876 | 877 | 878 | 879 | 880 | 881 | 882 | 883 | 884 | 885 | 886 | 887 | 888 | 889 | 890 | 891 | 892 | 893 | 894 | 895 | 896 | 897 | 898 | 899 | 900 | 901 | 902 | 903 | 904 | 905 | 906 | 907 | 908 | 909 | 910 | 911 | 912 | 913 | 914 | 915 | 916 | 917 | 918 | 919 | 920 | 921 | 922 | 923 | 924 | 925 | 926 | 927 | 0 928 | 0 929 | 0 930 | NAME 931 | 932 | 933 | 952 | 953 | 954 | 955 | 956 | 957 | 958 | 959 | . 960 | 961 | 962 | 963 | 964 | 965 | 966 | 967 | 968 | 969 | 970 | 971 | 972 | 973 | 974 | 975 | 976 | 977 | 978 | 979 | 980 | 981 | 982 | 983 | 984 | 985 | 986 | 987 | 988 | 989 | 990 | 991 | 992 | 993 | 994 | 995 | 996 | 997 | 998 | 999 | 1000 | 1001 | 1002 | 1003 | 1004 | 1005 | 1006 | 1007 | 1008 | 1009 | 1010 | 1011 | 1012 | 1013 | 1014 | 1015 | 1016 | 1017 | 1018 | 1019 | 1020 | 1021 | 1022 | 1023 | 1024 | 1025 | 1026 | 1027 | 1028 | 1029 | 1030 | 1031 | 1032 | 1033 | 1034 | . 1035 | 1036 | 0 1037 | . 1038 | 1055 | 0 1056 | generatedlayout 1057 | 1058 | 1059 | 1060 | 1061 | 1062 | 1063 | 1064 | 1065 | 1066 | 1067 | 1068 | 1069 | 1070 | +proj=longlat +datum=WGS84 +no_defs 1071 | EPSG:4326 1072 | 3452 1073 | 1074 | 1075 | false 1076 | 1077 | 1078 | 0 1079 | 255 1080 | 255 1081 | 255 1082 | 255 1083 | 255 1084 | 255 1085 | 1086 | 1087 | 2 1088 | 1089 | south20161025171731157 1090 | texas20160611154218713 1091 | 1092 | 1093 | disabled 1094 | disabled 1095 | 1096 | current_layer 1097 | 1098 | 1099 | 2 1100 | 2 1101 | 1102 | 1103 | to_vertex_and_segment 1104 | to_vertex_and_segment 1105 | 1106 | off 1107 | 0 1108 | 1109 | 0.000000 1110 | 0.000000 1111 | 1112 | 1113 | 1114 | 2 1115 | true 1116 | 1117 | 1118 | false 1119 | 1120 | 1121 | 1122 | 1123 | -------------------------------------------------------------------------------- /content/data/texas.qpj: -------------------------------------------------------------------------------- 1 | GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]] 2 | -------------------------------------------------------------------------------- /content/data/texas.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/data/texas.shp -------------------------------------------------------------------------------- /content/data/texas.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/data/texas.shx -------------------------------------------------------------------------------- /content/figs/UCR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/figs/UCR.png -------------------------------------------------------------------------------- /content/figs/anaconda.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/figs/anaconda.png -------------------------------------------------------------------------------- /content/figs/ancienthistory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/figs/ancienthistory.png -------------------------------------------------------------------------------- /content/figs/cartodb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/figs/cartodb.png -------------------------------------------------------------------------------- /content/figs/cast.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/figs/cast.png -------------------------------------------------------------------------------- /content/figs/giddydoc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/figs/giddydoc.png -------------------------------------------------------------------------------- /content/figs/githubstars.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/figs/githubstars.png -------------------------------------------------------------------------------- /content/figs/githubstarspysal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/figs/githubstarspysal.png -------------------------------------------------------------------------------- /content/figs/googlecode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/figs/googlecode.png -------------------------------------------------------------------------------- /content/figs/install.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/figs/install.png -------------------------------------------------------------------------------- /content/figs/pysalGraphic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/figs/pysalGraphic.png -------------------------------------------------------------------------------- /content/figs/pysalanaconda.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/figs/pysalanaconda.png -------------------------------------------------------------------------------- /content/figs/pysalcli.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/figs/pysalcli.png -------------------------------------------------------------------------------- /content/figs/pysalcloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/figs/pysalcloud.png -------------------------------------------------------------------------------- /content/figs/pysalcloud.png_: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/figs/pysalcloud.png_ -------------------------------------------------------------------------------- /content/figs/pysaldebian.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/figs/pysaldebian.png -------------------------------------------------------------------------------- /content/figs/pysalml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/figs/pysalml.png -------------------------------------------------------------------------------- /content/figs/pysalnew.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/figs/pysalnew.png -------------------------------------------------------------------------------- /content/figs/pysalnotebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/figs/pysalnotebook.png -------------------------------------------------------------------------------- /content/figs/pysalqgiselection.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/figs/pysalqgiselection.jpg -------------------------------------------------------------------------------- /content/figs/pysalrefactor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/figs/pysalrefactor.png -------------------------------------------------------------------------------- /content/figs/pysalscipy2009.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/figs/pysalscipy2009.png -------------------------------------------------------------------------------- /content/figs/pysalstructure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/figs/pysalstructure.png -------------------------------------------------------------------------------- /content/figs/pysalteam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/figs/pysalteam.png -------------------------------------------------------------------------------- /content/figs/qgis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/content/figs/qgis.png -------------------------------------------------------------------------------- /content/makefile: -------------------------------------------------------------------------------- 1 | nb: 2 | notedown 00_introduction.md > 00_introduction.ipynb 3 | 4 | slides: 5 | jupyter nbconvert 00_introduction.ipynb --to slides --post serve \n--SlidesExporter.reveal_theme=serif \n--SlidesExporter.reveal_scroll=True \n--SlidesExporter.reveal_transition=none 6 | -------------------------------------------------------------------------------- /environment.yml: -------------------------------------------------------------------------------- 1 | # Run `conda-env create -f workshop.yml` 2 | name: workshop 3 | channels: 4 | - conda-forge 5 | 6 | dependencies: 7 | - python=3.6 8 | - dill 9 | - bokeh 10 | - pip 11 | - geopandas 12 | - ipython 13 | - ipywidgets 14 | - jupyter 15 | - jupyterlab 16 | - pysal 17 | - nbconvert 18 | - networkx 19 | - palettable 20 | - rasterio 21 | - scikit-learn 22 | - seaborn 23 | - statsmodels 24 | - xlrd 25 | - xlsxwriter 26 | - pip: 27 | - cenpy==1.0.0rc2 28 | - contextily 29 | - mplleaflet 30 | -------------------------------------------------------------------------------- /figs/readmefigs/anaconda.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/figs/readmefigs/anaconda.png -------------------------------------------------------------------------------- /figs/readmefigs/anacondastartwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/figs/readmefigs/anacondastartwin.png -------------------------------------------------------------------------------- /figs/readmefigs/directory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/figs/readmefigs/directory.png -------------------------------------------------------------------------------- /figs/readmefigs/download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/figs/readmefigs/download.png -------------------------------------------------------------------------------- /figs/readmefigs/htmlout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/figs/readmefigs/htmlout.png -------------------------------------------------------------------------------- /figs/readmefigs/inc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/figs/readmefigs/inc.png -------------------------------------------------------------------------------- /figs/readmefigs/quad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/figs/readmefigs/quad.png -------------------------------------------------------------------------------- /figs/readmefigs/routes18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/figs/readmefigs/routes18.png -------------------------------------------------------------------------------- /figs/readmefigs/routes2016-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/figs/readmefigs/routes2016-17.png -------------------------------------------------------------------------------- /figs/readmefigs/routes2017.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sjsrey/pysalfoss4g19/782deffc9fd87d5d59119b4de21e3f3e5cc1bc17/figs/readmefigs/routes2017.png -------------------------------------------------------------------------------- /workshop.yml: -------------------------------------------------------------------------------- 1 | # Run `conda-env create -f workshop.yml` 2 | name: workshop 3 | channels: 4 | - conda-forge 5 | 6 | dependencies: 7 | - python=3.6 8 | - dill 9 | - bokeh 10 | - pip 11 | - geopandas 12 | - ipython 13 | - ipywidgets 14 | - jupyter 15 | - jupyterlab 16 | - pysal 17 | - nbconvert 18 | - networkx 19 | - palettable 20 | - qgrid 21 | - rasterio 22 | - scikit-learn 23 | - seaborn 24 | - statsmodels 25 | - xlrd 26 | - xlsxwriter 27 | - pip: 28 | - cenpy==1.0.0rc2 29 | - contextily 30 | - mplleaflet 31 | --------------------------------------------------------------------------------