├── 0-intro.ipynb ├── 1-pandas.ipynb ├── 2-bokeh.ipynb ├── 3-sklearn.ipynb ├── CheatSheet.pdf ├── README.md ├── data ├── baseball │ └── lahman2013.sqlite ├── boston │ ├── housing.data │ └── housing.names └── reviews │ └── reviews_Clothing_Shoes_and_Jewelry_5.json.gz ├── environment.yml ├── examples ├── AmazonReviews.ipynb ├── Baseball.ipynb ├── BostonHousingData.ipynb └── sklearn_examples.ipynb ├── exercises ├── AmazonReviewExercise.ipynb ├── BaseballExercise.ipynb └── BostonHousingExercise.ipynb ├── images ├── accuracy.png ├── confusion.png ├── crossvalidation.png ├── ml-1.png ├── ml-model.png └── training-data.png └── resources.md /0-intro.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# PyData 101
Essential Data Skills for hackers\n", 8 | "\n", 9 | "*PyCon 2016, Portland, OR*\n", 10 | "\n", 11 | "by Christine Doig and Andy Terrel\n", 12 | "\n", 13 | "
" 14 | ] 15 | }, 16 | { 17 | "cell_type": "markdown", 18 | "metadata": { 19 | "collapsed": true 20 | }, 21 | "source": [ 22 | "## Tutorial sections\n", 23 | "\n", 24 | "- Section 0: Introduction\n", 25 | "- Section 1: Data Manipulation with Pandas\n", 26 | "- Section 2: Data Visualization with Bokeh\n", 27 | "- Section 3: Data Modeling with Scikit-learn\n", 28 | "\n", 29 | "
\n" 30 | ] 31 | }, 32 | { 33 | "cell_type": "markdown", 34 | "metadata": {}, 35 | "source": [ 36 | "## Follow along\n", 37 | "\n", 38 | "### http://bit.ly/pydata101\n", 39 | "\n", 40 | "
\n", 41 | "\n", 42 | "- Option A: Download repository\n", 43 | "\n", 44 | "### https://github.com/aterrel/pydata101\n", 45 | "\n", 46 | "- Option B: View notebooks on nbviewer\n", 47 | "\n", 48 | "### http://nbviewer.ipython.org/github/aterrel/pydata101\n", 49 | "\n", 50 | "- Option C: Run on docker in the cloud via binder\n", 51 | "\n", 52 | "### http://mybinder.org/repo/aterrel/pydata101\n", 53 | "\n", 54 | "
\n" 55 | ] 56 | }, 57 | { 58 | "cell_type": "markdown", 59 | "metadata": {}, 60 | "source": [ 61 | "# Pandas\n", 62 | "\n", 63 | "http://pandas.pydata.org" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 1, 69 | "metadata": { 70 | "collapsed": false 71 | }, 72 | "outputs": [ 73 | { 74 | "data": { 75 | "text/html": [ 76 | "\n", 77 | " \n", 84 | " " 85 | ], 86 | "text/plain": [ 87 | "" 88 | ] 89 | }, 90 | "execution_count": 1, 91 | "metadata": {}, 92 | "output_type": "execute_result" 93 | } 94 | ], 95 | "source": [ 96 | "from IPython.display import IFrame\n", 97 | "IFrame('http://pandas.pydata.org/', width='100%', height=350)" 98 | ] 99 | }, 100 | { 101 | "cell_type": "markdown", 102 | "metadata": {}, 103 | "source": [ 104 | "
" 105 | ] 106 | }, 107 | { 108 | "cell_type": "markdown", 109 | "metadata": {}, 110 | "source": [ 111 | "## Bokeh\n", 112 | "\n", 113 | "\n", 114 | "### http://bokeh.pydata.org/" 115 | ] 116 | }, 117 | { 118 | "cell_type": "code", 119 | "execution_count": 2, 120 | "metadata": { 121 | "collapsed": false 122 | }, 123 | "outputs": [ 124 | { 125 | "data": { 126 | "text/html": [ 127 | "\n", 128 | " \n", 135 | " " 136 | ], 137 | "text/plain": [ 138 | "" 139 | ] 140 | }, 141 | "execution_count": 2, 142 | "metadata": {}, 143 | "output_type": "execute_result" 144 | } 145 | ], 146 | "source": [ 147 | "from IPython.display import IFrame\n", 148 | "IFrame('http://bokeh.pydata.org', width='100%', height=350)" 149 | ] 150 | }, 151 | { 152 | "cell_type": "markdown", 153 | "metadata": {}, 154 | "source": [ 155 | "
" 156 | ] 157 | }, 158 | { 159 | "cell_type": "markdown", 160 | "metadata": {}, 161 | "source": [ 162 | "## Scikit-Learn\n" 163 | ] 164 | }, 165 | { 166 | "cell_type": "markdown", 167 | "metadata": {}, 168 | "source": [ 169 | "### http://scikit-learn.org/\n" 170 | ] 171 | }, 172 | { 173 | "cell_type": "code", 174 | "execution_count": 3, 175 | "metadata": { 176 | "collapsed": false 177 | }, 178 | "outputs": [ 179 | { 180 | "data": { 181 | "text/html": [ 182 | "\n", 183 | " \n", 190 | " " 191 | ], 192 | "text/plain": [ 193 | "" 194 | ] 195 | }, 196 | "execution_count": 3, 197 | "metadata": {}, 198 | "output_type": "execute_result" 199 | } 200 | ], 201 | "source": [ 202 | "from IPython.display import IFrame\n", 203 | "IFrame('http://scikit-learn.org/', width='100%', height=350)" 204 | ] 205 | }, 206 | { 207 | "cell_type": "markdown", 208 | "metadata": {}, 209 | "source": [ 210 | "
" 211 | ] 212 | }, 213 | { 214 | "cell_type": "markdown", 215 | "metadata": {}, 216 | "source": [ 217 | "### Tutorial goals\n", 218 | "\n", 219 | "- basic examples of taking raw data and producing insights,\n", 220 | "- building an interactive exploratory data visualizations,\n", 221 | "- modelling, or predicting, phenomena with that data\n", 222 | "\n", 223 | "
" 224 | ] 225 | }, 226 | { 227 | "cell_type": "markdown", 228 | "metadata": {}, 229 | "source": [ 230 | "### Installation" 231 | ] 232 | }, 233 | { 234 | "cell_type": "markdown", 235 | "metadata": {}, 236 | "source": [ 237 | "### Run locally\n", 238 | "\n", 239 | "- Download and install the [Anaconda Python Distribution](http://continuum.io/downloads)\n", 240 | "- Download [archive of this repository](https://github.com/aterrel/pydata-apps/archive/master.zip) or checkout with git \n", 241 | "\n", 242 | " ```\n", 243 | " git clone https://github.com/aterrel/pydata101.git\n", 244 | " ```\n", 245 | "\n", 246 | "- Each tutorial has a slightly different set of requirements. To download all the requirements try:\n", 247 | " \n", 248 | " ```\n", 249 | " conda update conda\n", 250 | " conda env create\n", 251 | " ```\n", 252 | "\n", 253 | "- Activate the environment\n", 254 | "\n", 255 | " ```\n", 256 | " source activate pydata101\n", 257 | " ```\n", 258 | "\n", 259 | "### Editable Online Notebooks\n", 260 | "\n", 261 | "[Binder: http://mybinder.org/repo/aterrel/pydata101](http://mybinder.org/repo/aterrel/pydata101)\n", 262 | "\n", 263 | "### Static Online Notebooks\n", 264 | "\n", 265 | "For those want to just follow a static notebook (not all interactive elements will work), see the following links:\n", 266 | "\n", 267 | "[NBViewer: http://nbviewer.jupyter.org/github/aterrel/pydata101/tree/master/](http://nbviewer.jupyter.org/github/aterrel/pydata101/tree/master/)\n" 268 | ] 269 | }, 270 | { 271 | "cell_type": "code", 272 | "execution_count": null, 273 | "metadata": { 274 | "collapsed": true 275 | }, 276 | "outputs": [], 277 | "source": [] 278 | } 279 | ], 280 | "metadata": { 281 | "kernelspec": { 282 | "display_name": "Python 3", 283 | "language": "python", 284 | "name": "python3" 285 | }, 286 | "language_info": { 287 | "codemirror_mode": { 288 | "name": "ipython", 289 | "version": 3 290 | }, 291 | "file_extension": ".py", 292 | "mimetype": "text/x-python", 293 | "name": "python", 294 | "nbconvert_exporter": "python", 295 | "pygments_lexer": "ipython3", 296 | "version": "3.5.1" 297 | } 298 | }, 299 | "nbformat": 4, 300 | "nbformat_minor": 0 301 | } 302 | -------------------------------------------------------------------------------- /CheatSheet.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aterrel/pydata101/5e0eb6b13bd902ad869a34d59566da2f3aa73c27/CheatSheet.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # pydata101 2 | Tutorial PyData 101 for PyCon 2016 3 | 4 | Follow along at: http://bit.ly/pydata101 5 | Ask questions at: http://bit.ly/pydata101-doc 6 | Run on: [![Binder](http://mybinder.org/badge.svg)](http://mybinder.org/repo/aterrel/pydata101) 7 | Download Anaconda to run locally: https://www.continuum.io/downloads 8 | 9 | ## Basics 10 | 11 | Python Level: Novice 12 | 13 | Audience: New programmers looking to begin working with datasets, basic statistics, and visualization 14 | Objectives: Learn how to use Pandas DataFrames to load and manipulate data, how to use basic classification techniques using SciKit Learn, and how to create interactive visualizations using Bokeh 15 | 16 | Description: 17 | Data Science is fun and with the PyData toolset something you can start to build with in an afternoon. Join us as we start with a few datasets, learn how to munge, model, and materialize into simple web applications for predictions. At the end of the day you will come away with a solid understanding of the PyData ecosystem and tools used everyday by data scientists. 18 | 19 | ## Abstract 20 | Data science applications are all around us. One can find directions on our phones, recommendations on e-commerce sites, or predictions of attacks on our servers. As the uses and opportunities to use data in our applications rise, it becomes an essential skill for programmers to be exposed to the ideas and paradigms of data science applications. We start from the beginning and build out concepts and demonstrations to begin your journey learning the wide world of data science applications. 21 | 22 | ## LEARNING GOALS 23 | In this tutorial we will start with basic examples of taking raw data and producing insights. A set of exercises with different data properties will be given to help students work through the various challenges that exist working with data. For these tasks we will use the excellent Pandas library that has become the industry standard for representing building data applications. 24 | 25 | After we have a good understanding of our data sets and the observations present, we will begin the process of modelling, or predicting, phenomena with that data. Answering questions like "Will it rain today?" or "Will this shopper buy this book?" has never been easier with the Python data ecosystem. Using Scikit Learn, we will explore how to build a model and evaluate its fitness for use in real applications. 26 | 27 | Finally, having data and being able to predict phenomena is much less meaningful without a way to communicate it to the world. In the final exercise we will use the up and coming Bokeh library to build interactive visualizations that can be deployed to the web, or viewed on a local machine. By building an interactive exploratory data visualizations, you will be communicating the predictions in a way that appeals to mass audiences. 28 | 29 | Come learn the joy of building data applications the PyData way. 30 | 31 | ## TUTORIAL PREREQUISITE KNOWLEDGE 32 | A basic understanding of the Python programming language and 33 | Understanding of basic mathematics and statistics 34 | Curiosity and willingness to work on real life exercises 35 | ## INSTALLATION PREREQUISITES 36 | Basic libraries: 37 | Pandas (http://pandas.pydata.org) 38 | Scikit Learn (http://scikit-learn.org/) 39 | Bokeh (http://bokeh.pydata.org) 40 | Recommended ways to install: 41 | Anaconda (https://www.continuum.io/downloads) 42 | Python 2.7 or Python 3.3+ 43 | Using pip from the command line: pip install pandas sklearn bokeh 44 | Your favorite linux package management system 45 | Other useful things to download 46 | IPython notebook (http://ipython.org/notebook.html) 47 | Your favorite census dataset (http://www.census.gov/data/developers/data-sets.html) 48 | An interesting research dataset (https://archive.ics.uci.edu/ml/datasets.html) 49 | 50 | 51 | ##Outline 52 | 53 | - Introduction to Jupyter [15 min] 54 | - What is Jupyter and why 55 | - Using the notebook to create intactive analysis 56 | - Sharing notebooks 57 | - Introduction to Pandas [45 min] 58 | - Reading data 59 | - Getting a feel of the data 60 | - Basic statistics 61 | - Dropping the cruft 62 | - Quick and dirty visualization 63 | - The power of the groupby 64 | - Advance mappings for custom statistics 65 | - Break [5 min] 66 | - Introduction to SciKit Learn [45 min] 67 | - What is a model 68 | - How models fit to data 69 | - Build a few basic models with data from pandas exercises 70 | - Understanding the error in your model 71 | - Steps to building better and better models 72 | - Break [5 min] 73 | - Introduction to Bokeh [45 min] 74 | - Elements of visualization 75 | - Embedding in a webpage 76 | - Sending queries to your model from SciKit Learn exercises 77 | - Break [5 min] 78 | - Hacking Challenges [15 min] 79 | - Putting the above work together in teams with prepared challenges 80 | - Advanced topics as requested 81 | - Deep Learning 82 | - Natural Language Processing 83 | - Where to learn more 84 | - Get started with Kaggle 85 | 86 | ## Installation 87 | 88 | There are a lot of ways to install the packages we are going to use for the 89 | course. Our recommendation is to use [Anaconda](http://anaconda.org) and its 90 | package manger [conda](http://conda.org) to get started. You can then integrate 91 | the packages into your own python environment later. 92 | 93 | ### Download Anaconda 94 | 95 | See https://www.continuum.io/downloads 96 | 97 | ### Download Miniconda for a smaller install 98 | 99 | The fastest way to install is to download miniconda (a minimal set of packages 100 | to bootstrap a conda environment). The steps to do so are the following: 101 | 102 | - Download the appropriate installer file at http://conda.pydata.org/miniconda.html 103 | - Open a terminal application and run the file (see http://conda.pydata.org/docs/install/quick.html) 104 | - Open a new terminal, go to the directory containing this code and run: 105 | ``` 106 | $ conda env create 107 | ``` 108 | 109 | This will create an environment with the following packages: 110 | 111 | - Python3, 112 | - [pandas](http://pandas.pydata.org/), 113 | - [scikit-learn](http://scikit-learn.org/), 114 | - [bokeh](http://bokeh.pydata.org/), 115 | - [Jupyter](http://jupyter.org/), 116 | - [seaborn](https://web.stanford.edu/~mwaskom/software/seaborn/), 117 | - [pip](https://pip.pypa.io) 118 | 119 | Finally we tell your terminal to use this created environment. Do this for 120 | every new terminal that you use this project for. 121 | ``` 122 | $ source activate pydata101 123 | ``` 124 | 125 | To get started, open your terminal app, navigate to this directory and execute: 126 | ``` 127 | $ jupyter notebook 128 | ``` 129 | -------------------------------------------------------------------------------- /data/baseball/lahman2013.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aterrel/pydata101/5e0eb6b13bd902ad869a34d59566da2f3aa73c27/data/baseball/lahman2013.sqlite -------------------------------------------------------------------------------- /data/boston/housing.data: -------------------------------------------------------------------------------- 1 | 0.00632 18.00 2.310 0 0.5380 6.5750 65.20 4.0900 1 296.0 15.30 396.90 4.98 24.00 2 | 0.02731 0.00 7.070 0 0.4690 6.4210 78.90 4.9671 2 242.0 17.80 396.90 9.14 21.60 3 | 0.02729 0.00 7.070 0 0.4690 7.1850 61.10 4.9671 2 242.0 17.80 392.83 4.03 34.70 4 | 0.03237 0.00 2.180 0 0.4580 6.9980 45.80 6.0622 3 222.0 18.70 394.63 2.94 33.40 5 | 0.06905 0.00 2.180 0 0.4580 7.1470 54.20 6.0622 3 222.0 18.70 396.90 5.33 36.20 6 | 0.02985 0.00 2.180 0 0.4580 6.4300 58.70 6.0622 3 222.0 18.70 394.12 5.21 28.70 7 | 0.08829 12.50 7.870 0 0.5240 6.0120 66.60 5.5605 5 311.0 15.20 395.60 12.43 22.90 8 | 0.14455 12.50 7.870 0 0.5240 6.1720 96.10 5.9505 5 311.0 15.20 396.90 19.15 27.10 9 | 0.21124 12.50 7.870 0 0.5240 5.6310 100.00 6.0821 5 311.0 15.20 386.63 29.93 16.50 10 | 0.17004 12.50 7.870 0 0.5240 6.0040 85.90 6.5921 5 311.0 15.20 386.71 17.10 18.90 11 | 0.22489 12.50 7.870 0 0.5240 6.3770 94.30 6.3467 5 311.0 15.20 392.52 20.45 15.00 12 | 0.11747 12.50 7.870 0 0.5240 6.0090 82.90 6.2267 5 311.0 15.20 396.90 13.27 18.90 13 | 0.09378 12.50 7.870 0 0.5240 5.8890 39.00 5.4509 5 311.0 15.20 390.50 15.71 21.70 14 | 0.62976 0.00 8.140 0 0.5380 5.9490 61.80 4.7075 4 307.0 21.00 396.90 8.26 20.40 15 | 0.63796 0.00 8.140 0 0.5380 6.0960 84.50 4.4619 4 307.0 21.00 380.02 10.26 18.20 16 | 0.62739 0.00 8.140 0 0.5380 5.8340 56.50 4.4986 4 307.0 21.00 395.62 8.47 19.90 17 | 1.05393 0.00 8.140 0 0.5380 5.9350 29.30 4.4986 4 307.0 21.00 386.85 6.58 23.10 18 | 0.78420 0.00 8.140 0 0.5380 5.9900 81.70 4.2579 4 307.0 21.00 386.75 14.67 17.50 19 | 0.80271 0.00 8.140 0 0.5380 5.4560 36.60 3.7965 4 307.0 21.00 288.99 11.69 20.20 20 | 0.72580 0.00 8.140 0 0.5380 5.7270 69.50 3.7965 4 307.0 21.00 390.95 11.28 18.20 21 | 1.25179 0.00 8.140 0 0.5380 5.5700 98.10 3.7979 4 307.0 21.00 376.57 21.02 13.60 22 | 0.85204 0.00 8.140 0 0.5380 5.9650 89.20 4.0123 4 307.0 21.00 392.53 13.83 19.60 23 | 1.23247 0.00 8.140 0 0.5380 6.1420 91.70 3.9769 4 307.0 21.00 396.90 18.72 15.20 24 | 0.98843 0.00 8.140 0 0.5380 5.8130 100.00 4.0952 4 307.0 21.00 394.54 19.88 14.50 25 | 0.75026 0.00 8.140 0 0.5380 5.9240 94.10 4.3996 4 307.0 21.00 394.33 16.30 15.60 26 | 0.84054 0.00 8.140 0 0.5380 5.5990 85.70 4.4546 4 307.0 21.00 303.42 16.51 13.90 27 | 0.67191 0.00 8.140 0 0.5380 5.8130 90.30 4.6820 4 307.0 21.00 376.88 14.81 16.60 28 | 0.95577 0.00 8.140 0 0.5380 6.0470 88.80 4.4534 4 307.0 21.00 306.38 17.28 14.80 29 | 0.77299 0.00 8.140 0 0.5380 6.4950 94.40 4.4547 4 307.0 21.00 387.94 12.80 18.40 30 | 1.00245 0.00 8.140 0 0.5380 6.6740 87.30 4.2390 4 307.0 21.00 380.23 11.98 21.00 31 | 1.13081 0.00 8.140 0 0.5380 5.7130 94.10 4.2330 4 307.0 21.00 360.17 22.60 12.70 32 | 1.35472 0.00 8.140 0 0.5380 6.0720 100.00 4.1750 4 307.0 21.00 376.73 13.04 14.50 33 | 1.38799 0.00 8.140 0 0.5380 5.9500 82.00 3.9900 4 307.0 21.00 232.60 27.71 13.20 34 | 1.15172 0.00 8.140 0 0.5380 5.7010 95.00 3.7872 4 307.0 21.00 358.77 18.35 13.10 35 | 1.61282 0.00 8.140 0 0.5380 6.0960 96.90 3.7598 4 307.0 21.00 248.31 20.34 13.50 36 | 0.06417 0.00 5.960 0 0.4990 5.9330 68.20 3.3603 5 279.0 19.20 396.90 9.68 18.90 37 | 0.09744 0.00 5.960 0 0.4990 5.8410 61.40 3.3779 5 279.0 19.20 377.56 11.41 20.00 38 | 0.08014 0.00 5.960 0 0.4990 5.8500 41.50 3.9342 5 279.0 19.20 396.90 8.77 21.00 39 | 0.17505 0.00 5.960 0 0.4990 5.9660 30.20 3.8473 5 279.0 19.20 393.43 10.13 24.70 40 | 0.02763 75.00 2.950 0 0.4280 6.5950 21.80 5.4011 3 252.0 18.30 395.63 4.32 30.80 41 | 0.03359 75.00 2.950 0 0.4280 7.0240 15.80 5.4011 3 252.0 18.30 395.62 1.98 34.90 42 | 0.12744 0.00 6.910 0 0.4480 6.7700 2.90 5.7209 3 233.0 17.90 385.41 4.84 26.60 43 | 0.14150 0.00 6.910 0 0.4480 6.1690 6.60 5.7209 3 233.0 17.90 383.37 5.81 25.30 44 | 0.15936 0.00 6.910 0 0.4480 6.2110 6.50 5.7209 3 233.0 17.90 394.46 7.44 24.70 45 | 0.12269 0.00 6.910 0 0.4480 6.0690 40.00 5.7209 3 233.0 17.90 389.39 9.55 21.20 46 | 0.17142 0.00 6.910 0 0.4480 5.6820 33.80 5.1004 3 233.0 17.90 396.90 10.21 19.30 47 | 0.18836 0.00 6.910 0 0.4480 5.7860 33.30 5.1004 3 233.0 17.90 396.90 14.15 20.00 48 | 0.22927 0.00 6.910 0 0.4480 6.0300 85.50 5.6894 3 233.0 17.90 392.74 18.80 16.60 49 | 0.25387 0.00 6.910 0 0.4480 5.3990 95.30 5.8700 3 233.0 17.90 396.90 30.81 14.40 50 | 0.21977 0.00 6.910 0 0.4480 5.6020 62.00 6.0877 3 233.0 17.90 396.90 16.20 19.40 51 | 0.08873 21.00 5.640 0 0.4390 5.9630 45.70 6.8147 4 243.0 16.80 395.56 13.45 19.70 52 | 0.04337 21.00 5.640 0 0.4390 6.1150 63.00 6.8147 4 243.0 16.80 393.97 9.43 20.50 53 | 0.05360 21.00 5.640 0 0.4390 6.5110 21.10 6.8147 4 243.0 16.80 396.90 5.28 25.00 54 | 0.04981 21.00 5.640 0 0.4390 5.9980 21.40 6.8147 4 243.0 16.80 396.90 8.43 23.40 55 | 0.01360 75.00 4.000 0 0.4100 5.8880 47.60 7.3197 3 469.0 21.10 396.90 14.80 18.90 56 | 0.01311 90.00 1.220 0 0.4030 7.2490 21.90 8.6966 5 226.0 17.90 395.93 4.81 35.40 57 | 0.02055 85.00 0.740 0 0.4100 6.3830 35.70 9.1876 2 313.0 17.30 396.90 5.77 24.70 58 | 0.01432 100.00 1.320 0 0.4110 6.8160 40.50 8.3248 5 256.0 15.10 392.90 3.95 31.60 59 | 0.15445 25.00 5.130 0 0.4530 6.1450 29.20 7.8148 8 284.0 19.70 390.68 6.86 23.30 60 | 0.10328 25.00 5.130 0 0.4530 5.9270 47.20 6.9320 8 284.0 19.70 396.90 9.22 19.60 61 | 0.14932 25.00 5.130 0 0.4530 5.7410 66.20 7.2254 8 284.0 19.70 395.11 13.15 18.70 62 | 0.17171 25.00 5.130 0 0.4530 5.9660 93.40 6.8185 8 284.0 19.70 378.08 14.44 16.00 63 | 0.11027 25.00 5.130 0 0.4530 6.4560 67.80 7.2255 8 284.0 19.70 396.90 6.73 22.20 64 | 0.12650 25.00 5.130 0 0.4530 6.7620 43.40 7.9809 8 284.0 19.70 395.58 9.50 25.00 65 | 0.01951 17.50 1.380 0 0.4161 7.1040 59.50 9.2229 3 216.0 18.60 393.24 8.05 33.00 66 | 0.03584 80.00 3.370 0 0.3980 6.2900 17.80 6.6115 4 337.0 16.10 396.90 4.67 23.50 67 | 0.04379 80.00 3.370 0 0.3980 5.7870 31.10 6.6115 4 337.0 16.10 396.90 10.24 19.40 68 | 0.05789 12.50 6.070 0 0.4090 5.8780 21.40 6.4980 4 345.0 18.90 396.21 8.10 22.00 69 | 0.13554 12.50 6.070 0 0.4090 5.5940 36.80 6.4980 4 345.0 18.90 396.90 13.09 17.40 70 | 0.12816 12.50 6.070 0 0.4090 5.8850 33.00 6.4980 4 345.0 18.90 396.90 8.79 20.90 71 | 0.08826 0.00 10.810 0 0.4130 6.4170 6.60 5.2873 4 305.0 19.20 383.73 6.72 24.20 72 | 0.15876 0.00 10.810 0 0.4130 5.9610 17.50 5.2873 4 305.0 19.20 376.94 9.88 21.70 73 | 0.09164 0.00 10.810 0 0.4130 6.0650 7.80 5.2873 4 305.0 19.20 390.91 5.52 22.80 74 | 0.19539 0.00 10.810 0 0.4130 6.2450 6.20 5.2873 4 305.0 19.20 377.17 7.54 23.40 75 | 0.07896 0.00 12.830 0 0.4370 6.2730 6.00 4.2515 5 398.0 18.70 394.92 6.78 24.10 76 | 0.09512 0.00 12.830 0 0.4370 6.2860 45.00 4.5026 5 398.0 18.70 383.23 8.94 21.40 77 | 0.10153 0.00 12.830 0 0.4370 6.2790 74.50 4.0522 5 398.0 18.70 373.66 11.97 20.00 78 | 0.08707 0.00 12.830 0 0.4370 6.1400 45.80 4.0905 5 398.0 18.70 386.96 10.27 20.80 79 | 0.05646 0.00 12.830 0 0.4370 6.2320 53.70 5.0141 5 398.0 18.70 386.40 12.34 21.20 80 | 0.08387 0.00 12.830 0 0.4370 5.8740 36.60 4.5026 5 398.0 18.70 396.06 9.10 20.30 81 | 0.04113 25.00 4.860 0 0.4260 6.7270 33.50 5.4007 4 281.0 19.00 396.90 5.29 28.00 82 | 0.04462 25.00 4.860 0 0.4260 6.6190 70.40 5.4007 4 281.0 19.00 395.63 7.22 23.90 83 | 0.03659 25.00 4.860 0 0.4260 6.3020 32.20 5.4007 4 281.0 19.00 396.90 6.72 24.80 84 | 0.03551 25.00 4.860 0 0.4260 6.1670 46.70 5.4007 4 281.0 19.00 390.64 7.51 22.90 85 | 0.05059 0.00 4.490 0 0.4490 6.3890 48.00 4.7794 3 247.0 18.50 396.90 9.62 23.90 86 | 0.05735 0.00 4.490 0 0.4490 6.6300 56.10 4.4377 3 247.0 18.50 392.30 6.53 26.60 87 | 0.05188 0.00 4.490 0 0.4490 6.0150 45.10 4.4272 3 247.0 18.50 395.99 12.86 22.50 88 | 0.07151 0.00 4.490 0 0.4490 6.1210 56.80 3.7476 3 247.0 18.50 395.15 8.44 22.20 89 | 0.05660 0.00 3.410 0 0.4890 7.0070 86.30 3.4217 2 270.0 17.80 396.90 5.50 23.60 90 | 0.05302 0.00 3.410 0 0.4890 7.0790 63.10 3.4145 2 270.0 17.80 396.06 5.70 28.70 91 | 0.04684 0.00 3.410 0 0.4890 6.4170 66.10 3.0923 2 270.0 17.80 392.18 8.81 22.60 92 | 0.03932 0.00 3.410 0 0.4890 6.4050 73.90 3.0921 2 270.0 17.80 393.55 8.20 22.00 93 | 0.04203 28.00 15.040 0 0.4640 6.4420 53.60 3.6659 4 270.0 18.20 395.01 8.16 22.90 94 | 0.02875 28.00 15.040 0 0.4640 6.2110 28.90 3.6659 4 270.0 18.20 396.33 6.21 25.00 95 | 0.04294 28.00 15.040 0 0.4640 6.2490 77.30 3.6150 4 270.0 18.20 396.90 10.59 20.60 96 | 0.12204 0.00 2.890 0 0.4450 6.6250 57.80 3.4952 2 276.0 18.00 357.98 6.65 28.40 97 | 0.11504 0.00 2.890 0 0.4450 6.1630 69.60 3.4952 2 276.0 18.00 391.83 11.34 21.40 98 | 0.12083 0.00 2.890 0 0.4450 8.0690 76.00 3.4952 2 276.0 18.00 396.90 4.21 38.70 99 | 0.08187 0.00 2.890 0 0.4450 7.8200 36.90 3.4952 2 276.0 18.00 393.53 3.57 43.80 100 | 0.06860 0.00 2.890 0 0.4450 7.4160 62.50 3.4952 2 276.0 18.00 396.90 6.19 33.20 101 | 0.14866 0.00 8.560 0 0.5200 6.7270 79.90 2.7778 5 384.0 20.90 394.76 9.42 27.50 102 | 0.11432 0.00 8.560 0 0.5200 6.7810 71.30 2.8561 5 384.0 20.90 395.58 7.67 26.50 103 | 0.22876 0.00 8.560 0 0.5200 6.4050 85.40 2.7147 5 384.0 20.90 70.80 10.63 18.60 104 | 0.21161 0.00 8.560 0 0.5200 6.1370 87.40 2.7147 5 384.0 20.90 394.47 13.44 19.30 105 | 0.13960 0.00 8.560 0 0.5200 6.1670 90.00 2.4210 5 384.0 20.90 392.69 12.33 20.10 106 | 0.13262 0.00 8.560 0 0.5200 5.8510 96.70 2.1069 5 384.0 20.90 394.05 16.47 19.50 107 | 0.17120 0.00 8.560 0 0.5200 5.8360 91.90 2.2110 5 384.0 20.90 395.67 18.66 19.50 108 | 0.13117 0.00 8.560 0 0.5200 6.1270 85.20 2.1224 5 384.0 20.90 387.69 14.09 20.40 109 | 0.12802 0.00 8.560 0 0.5200 6.4740 97.10 2.4329 5 384.0 20.90 395.24 12.27 19.80 110 | 0.26363 0.00 8.560 0 0.5200 6.2290 91.20 2.5451 5 384.0 20.90 391.23 15.55 19.40 111 | 0.10793 0.00 8.560 0 0.5200 6.1950 54.40 2.7778 5 384.0 20.90 393.49 13.00 21.70 112 | 0.10084 0.00 10.010 0 0.5470 6.7150 81.60 2.6775 6 432.0 17.80 395.59 10.16 22.80 113 | 0.12329 0.00 10.010 0 0.5470 5.9130 92.90 2.3534 6 432.0 17.80 394.95 16.21 18.80 114 | 0.22212 0.00 10.010 0 0.5470 6.0920 95.40 2.5480 6 432.0 17.80 396.90 17.09 18.70 115 | 0.14231 0.00 10.010 0 0.5470 6.2540 84.20 2.2565 6 432.0 17.80 388.74 10.45 18.50 116 | 0.17134 0.00 10.010 0 0.5470 5.9280 88.20 2.4631 6 432.0 17.80 344.91 15.76 18.30 117 | 0.13158 0.00 10.010 0 0.5470 6.1760 72.50 2.7301 6 432.0 17.80 393.30 12.04 21.20 118 | 0.15098 0.00 10.010 0 0.5470 6.0210 82.60 2.7474 6 432.0 17.80 394.51 10.30 19.20 119 | 0.13058 0.00 10.010 0 0.5470 5.8720 73.10 2.4775 6 432.0 17.80 338.63 15.37 20.40 120 | 0.14476 0.00 10.010 0 0.5470 5.7310 65.20 2.7592 6 432.0 17.80 391.50 13.61 19.30 121 | 0.06899 0.00 25.650 0 0.5810 5.8700 69.70 2.2577 2 188.0 19.10 389.15 14.37 22.00 122 | 0.07165 0.00 25.650 0 0.5810 6.0040 84.10 2.1974 2 188.0 19.10 377.67 14.27 20.30 123 | 0.09299 0.00 25.650 0 0.5810 5.9610 92.90 2.0869 2 188.0 19.10 378.09 17.93 20.50 124 | 0.15038 0.00 25.650 0 0.5810 5.8560 97.00 1.9444 2 188.0 19.10 370.31 25.41 17.30 125 | 0.09849 0.00 25.650 0 0.5810 5.8790 95.80 2.0063 2 188.0 19.10 379.38 17.58 18.80 126 | 0.16902 0.00 25.650 0 0.5810 5.9860 88.40 1.9929 2 188.0 19.10 385.02 14.81 21.40 127 | 0.38735 0.00 25.650 0 0.5810 5.6130 95.60 1.7572 2 188.0 19.10 359.29 27.26 15.70 128 | 0.25915 0.00 21.890 0 0.6240 5.6930 96.00 1.7883 4 437.0 21.20 392.11 17.19 16.20 129 | 0.32543 0.00 21.890 0 0.6240 6.4310 98.80 1.8125 4 437.0 21.20 396.90 15.39 18.00 130 | 0.88125 0.00 21.890 0 0.6240 5.6370 94.70 1.9799 4 437.0 21.20 396.90 18.34 14.30 131 | 0.34006 0.00 21.890 0 0.6240 6.4580 98.90 2.1185 4 437.0 21.20 395.04 12.60 19.20 132 | 1.19294 0.00 21.890 0 0.6240 6.3260 97.70 2.2710 4 437.0 21.20 396.90 12.26 19.60 133 | 0.59005 0.00 21.890 0 0.6240 6.3720 97.90 2.3274 4 437.0 21.20 385.76 11.12 23.00 134 | 0.32982 0.00 21.890 0 0.6240 5.8220 95.40 2.4699 4 437.0 21.20 388.69 15.03 18.40 135 | 0.97617 0.00 21.890 0 0.6240 5.7570 98.40 2.3460 4 437.0 21.20 262.76 17.31 15.60 136 | 0.55778 0.00 21.890 0 0.6240 6.3350 98.20 2.1107 4 437.0 21.20 394.67 16.96 18.10 137 | 0.32264 0.00 21.890 0 0.6240 5.9420 93.50 1.9669 4 437.0 21.20 378.25 16.90 17.40 138 | 0.35233 0.00 21.890 0 0.6240 6.4540 98.40 1.8498 4 437.0 21.20 394.08 14.59 17.10 139 | 0.24980 0.00 21.890 0 0.6240 5.8570 98.20 1.6686 4 437.0 21.20 392.04 21.32 13.30 140 | 0.54452 0.00 21.890 0 0.6240 6.1510 97.90 1.6687 4 437.0 21.20 396.90 18.46 17.80 141 | 0.29090 0.00 21.890 0 0.6240 6.1740 93.60 1.6119 4 437.0 21.20 388.08 24.16 14.00 142 | 1.62864 0.00 21.890 0 0.6240 5.0190 100.00 1.4394 4 437.0 21.20 396.90 34.41 14.40 143 | 3.32105 0.00 19.580 1 0.8710 5.4030 100.00 1.3216 5 403.0 14.70 396.90 26.82 13.40 144 | 4.09740 0.00 19.580 0 0.8710 5.4680 100.00 1.4118 5 403.0 14.70 396.90 26.42 15.60 145 | 2.77974 0.00 19.580 0 0.8710 4.9030 97.80 1.3459 5 403.0 14.70 396.90 29.29 11.80 146 | 2.37934 0.00 19.580 0 0.8710 6.1300 100.00 1.4191 5 403.0 14.70 172.91 27.80 13.80 147 | 2.15505 0.00 19.580 0 0.8710 5.6280 100.00 1.5166 5 403.0 14.70 169.27 16.65 15.60 148 | 2.36862 0.00 19.580 0 0.8710 4.9260 95.70 1.4608 5 403.0 14.70 391.71 29.53 14.60 149 | 2.33099 0.00 19.580 0 0.8710 5.1860 93.80 1.5296 5 403.0 14.70 356.99 28.32 17.80 150 | 2.73397 0.00 19.580 0 0.8710 5.5970 94.90 1.5257 5 403.0 14.70 351.85 21.45 15.40 151 | 1.65660 0.00 19.580 0 0.8710 6.1220 97.30 1.6180 5 403.0 14.70 372.80 14.10 21.50 152 | 1.49632 0.00 19.580 0 0.8710 5.4040 100.00 1.5916 5 403.0 14.70 341.60 13.28 19.60 153 | 1.12658 0.00 19.580 1 0.8710 5.0120 88.00 1.6102 5 403.0 14.70 343.28 12.12 15.30 154 | 2.14918 0.00 19.580 0 0.8710 5.7090 98.50 1.6232 5 403.0 14.70 261.95 15.79 19.40 155 | 1.41385 0.00 19.580 1 0.8710 6.1290 96.00 1.7494 5 403.0 14.70 321.02 15.12 17.00 156 | 3.53501 0.00 19.580 1 0.8710 6.1520 82.60 1.7455 5 403.0 14.70 88.01 15.02 15.60 157 | 2.44668 0.00 19.580 0 0.8710 5.2720 94.00 1.7364 5 403.0 14.70 88.63 16.14 13.10 158 | 1.22358 0.00 19.580 0 0.6050 6.9430 97.40 1.8773 5 403.0 14.70 363.43 4.59 41.30 159 | 1.34284 0.00 19.580 0 0.6050 6.0660 100.00 1.7573 5 403.0 14.70 353.89 6.43 24.30 160 | 1.42502 0.00 19.580 0 0.8710 6.5100 100.00 1.7659 5 403.0 14.70 364.31 7.39 23.30 161 | 1.27346 0.00 19.580 1 0.6050 6.2500 92.60 1.7984 5 403.0 14.70 338.92 5.50 27.00 162 | 1.46336 0.00 19.580 0 0.6050 7.4890 90.80 1.9709 5 403.0 14.70 374.43 1.73 50.00 163 | 1.83377 0.00 19.580 1 0.6050 7.8020 98.20 2.0407 5 403.0 14.70 389.61 1.92 50.00 164 | 1.51902 0.00 19.580 1 0.6050 8.3750 93.90 2.1620 5 403.0 14.70 388.45 3.32 50.00 165 | 2.24236 0.00 19.580 0 0.6050 5.8540 91.80 2.4220 5 403.0 14.70 395.11 11.64 22.70 166 | 2.92400 0.00 19.580 0 0.6050 6.1010 93.00 2.2834 5 403.0 14.70 240.16 9.81 25.00 167 | 2.01019 0.00 19.580 0 0.6050 7.9290 96.20 2.0459 5 403.0 14.70 369.30 3.70 50.00 168 | 1.80028 0.00 19.580 0 0.6050 5.8770 79.20 2.4259 5 403.0 14.70 227.61 12.14 23.80 169 | 2.30040 0.00 19.580 0 0.6050 6.3190 96.10 2.1000 5 403.0 14.70 297.09 11.10 23.80 170 | 2.44953 0.00 19.580 0 0.6050 6.4020 95.20 2.2625 5 403.0 14.70 330.04 11.32 22.30 171 | 1.20742 0.00 19.580 0 0.6050 5.8750 94.60 2.4259 5 403.0 14.70 292.29 14.43 17.40 172 | 2.31390 0.00 19.580 0 0.6050 5.8800 97.30 2.3887 5 403.0 14.70 348.13 12.03 19.10 173 | 0.13914 0.00 4.050 0 0.5100 5.5720 88.50 2.5961 5 296.0 16.60 396.90 14.69 23.10 174 | 0.09178 0.00 4.050 0 0.5100 6.4160 84.10 2.6463 5 296.0 16.60 395.50 9.04 23.60 175 | 0.08447 0.00 4.050 0 0.5100 5.8590 68.70 2.7019 5 296.0 16.60 393.23 9.64 22.60 176 | 0.06664 0.00 4.050 0 0.5100 6.5460 33.10 3.1323 5 296.0 16.60 390.96 5.33 29.40 177 | 0.07022 0.00 4.050 0 0.5100 6.0200 47.20 3.5549 5 296.0 16.60 393.23 10.11 23.20 178 | 0.05425 0.00 4.050 0 0.5100 6.3150 73.40 3.3175 5 296.0 16.60 395.60 6.29 24.60 179 | 0.06642 0.00 4.050 0 0.5100 6.8600 74.40 2.9153 5 296.0 16.60 391.27 6.92 29.90 180 | 0.05780 0.00 2.460 0 0.4880 6.9800 58.40 2.8290 3 193.0 17.80 396.90 5.04 37.20 181 | 0.06588 0.00 2.460 0 0.4880 7.7650 83.30 2.7410 3 193.0 17.80 395.56 7.56 39.80 182 | 0.06888 0.00 2.460 0 0.4880 6.1440 62.20 2.5979 3 193.0 17.80 396.90 9.45 36.20 183 | 0.09103 0.00 2.460 0 0.4880 7.1550 92.20 2.7006 3 193.0 17.80 394.12 4.82 37.90 184 | 0.10008 0.00 2.460 0 0.4880 6.5630 95.60 2.8470 3 193.0 17.80 396.90 5.68 32.50 185 | 0.08308 0.00 2.460 0 0.4880 5.6040 89.80 2.9879 3 193.0 17.80 391.00 13.98 26.40 186 | 0.06047 0.00 2.460 0 0.4880 6.1530 68.80 3.2797 3 193.0 17.80 387.11 13.15 29.60 187 | 0.05602 0.00 2.460 0 0.4880 7.8310 53.60 3.1992 3 193.0 17.80 392.63 4.45 50.00 188 | 0.07875 45.00 3.440 0 0.4370 6.7820 41.10 3.7886 5 398.0 15.20 393.87 6.68 32.00 189 | 0.12579 45.00 3.440 0 0.4370 6.5560 29.10 4.5667 5 398.0 15.20 382.84 4.56 29.80 190 | 0.08370 45.00 3.440 0 0.4370 7.1850 38.90 4.5667 5 398.0 15.20 396.90 5.39 34.90 191 | 0.09068 45.00 3.440 0 0.4370 6.9510 21.50 6.4798 5 398.0 15.20 377.68 5.10 37.00 192 | 0.06911 45.00 3.440 0 0.4370 6.7390 30.80 6.4798 5 398.0 15.20 389.71 4.69 30.50 193 | 0.08664 45.00 3.440 0 0.4370 7.1780 26.30 6.4798 5 398.0 15.20 390.49 2.87 36.40 194 | 0.02187 60.00 2.930 0 0.4010 6.8000 9.90 6.2196 1 265.0 15.60 393.37 5.03 31.10 195 | 0.01439 60.00 2.930 0 0.4010 6.6040 18.80 6.2196 1 265.0 15.60 376.70 4.38 29.10 196 | 0.01381 80.00 0.460 0 0.4220 7.8750 32.00 5.6484 4 255.0 14.40 394.23 2.97 50.00 197 | 0.04011 80.00 1.520 0 0.4040 7.2870 34.10 7.3090 2 329.0 12.60 396.90 4.08 33.30 198 | 0.04666 80.00 1.520 0 0.4040 7.1070 36.60 7.3090 2 329.0 12.60 354.31 8.61 30.30 199 | 0.03768 80.00 1.520 0 0.4040 7.2740 38.30 7.3090 2 329.0 12.60 392.20 6.62 34.60 200 | 0.03150 95.00 1.470 0 0.4030 6.9750 15.30 7.6534 3 402.0 17.00 396.90 4.56 34.90 201 | 0.01778 95.00 1.470 0 0.4030 7.1350 13.90 7.6534 3 402.0 17.00 384.30 4.45 32.90 202 | 0.03445 82.50 2.030 0 0.4150 6.1620 38.40 6.2700 2 348.0 14.70 393.77 7.43 24.10 203 | 0.02177 82.50 2.030 0 0.4150 7.6100 15.70 6.2700 2 348.0 14.70 395.38 3.11 42.30 204 | 0.03510 95.00 2.680 0 0.4161 7.8530 33.20 5.1180 4 224.0 14.70 392.78 3.81 48.50 205 | 0.02009 95.00 2.680 0 0.4161 8.0340 31.90 5.1180 4 224.0 14.70 390.55 2.88 50.00 206 | 0.13642 0.00 10.590 0 0.4890 5.8910 22.30 3.9454 4 277.0 18.60 396.90 10.87 22.60 207 | 0.22969 0.00 10.590 0 0.4890 6.3260 52.50 4.3549 4 277.0 18.60 394.87 10.97 24.40 208 | 0.25199 0.00 10.590 0 0.4890 5.7830 72.70 4.3549 4 277.0 18.60 389.43 18.06 22.50 209 | 0.13587 0.00 10.590 1 0.4890 6.0640 59.10 4.2392 4 277.0 18.60 381.32 14.66 24.40 210 | 0.43571 0.00 10.590 1 0.4890 5.3440 100.00 3.8750 4 277.0 18.60 396.90 23.09 20.00 211 | 0.17446 0.00 10.590 1 0.4890 5.9600 92.10 3.8771 4 277.0 18.60 393.25 17.27 21.70 212 | 0.37578 0.00 10.590 1 0.4890 5.4040 88.60 3.6650 4 277.0 18.60 395.24 23.98 19.30 213 | 0.21719 0.00 10.590 1 0.4890 5.8070 53.80 3.6526 4 277.0 18.60 390.94 16.03 22.40 214 | 0.14052 0.00 10.590 0 0.4890 6.3750 32.30 3.9454 4 277.0 18.60 385.81 9.38 28.10 215 | 0.28955 0.00 10.590 0 0.4890 5.4120 9.80 3.5875 4 277.0 18.60 348.93 29.55 23.70 216 | 0.19802 0.00 10.590 0 0.4890 6.1820 42.40 3.9454 4 277.0 18.60 393.63 9.47 25.00 217 | 0.04560 0.00 13.890 1 0.5500 5.8880 56.00 3.1121 5 276.0 16.40 392.80 13.51 23.30 218 | 0.07013 0.00 13.890 0 0.5500 6.6420 85.10 3.4211 5 276.0 16.40 392.78 9.69 28.70 219 | 0.11069 0.00 13.890 1 0.5500 5.9510 93.80 2.8893 5 276.0 16.40 396.90 17.92 21.50 220 | 0.11425 0.00 13.890 1 0.5500 6.3730 92.40 3.3633 5 276.0 16.40 393.74 10.50 23.00 221 | 0.35809 0.00 6.200 1 0.5070 6.9510 88.50 2.8617 8 307.0 17.40 391.70 9.71 26.70 222 | 0.40771 0.00 6.200 1 0.5070 6.1640 91.30 3.0480 8 307.0 17.40 395.24 21.46 21.70 223 | 0.62356 0.00 6.200 1 0.5070 6.8790 77.70 3.2721 8 307.0 17.40 390.39 9.93 27.50 224 | 0.61470 0.00 6.200 0 0.5070 6.6180 80.80 3.2721 8 307.0 17.40 396.90 7.60 30.10 225 | 0.31533 0.00 6.200 0 0.5040 8.2660 78.30 2.8944 8 307.0 17.40 385.05 4.14 44.80 226 | 0.52693 0.00 6.200 0 0.5040 8.7250 83.00 2.8944 8 307.0 17.40 382.00 4.63 50.00 227 | 0.38214 0.00 6.200 0 0.5040 8.0400 86.50 3.2157 8 307.0 17.40 387.38 3.13 37.60 228 | 0.41238 0.00 6.200 0 0.5040 7.1630 79.90 3.2157 8 307.0 17.40 372.08 6.36 31.60 229 | 0.29819 0.00 6.200 0 0.5040 7.6860 17.00 3.3751 8 307.0 17.40 377.51 3.92 46.70 230 | 0.44178 0.00 6.200 0 0.5040 6.5520 21.40 3.3751 8 307.0 17.40 380.34 3.76 31.50 231 | 0.53700 0.00 6.200 0 0.5040 5.9810 68.10 3.6715 8 307.0 17.40 378.35 11.65 24.30 232 | 0.46296 0.00 6.200 0 0.5040 7.4120 76.90 3.6715 8 307.0 17.40 376.14 5.25 31.70 233 | 0.57529 0.00 6.200 0 0.5070 8.3370 73.30 3.8384 8 307.0 17.40 385.91 2.47 41.70 234 | 0.33147 0.00 6.200 0 0.5070 8.2470 70.40 3.6519 8 307.0 17.40 378.95 3.95 48.30 235 | 0.44791 0.00 6.200 1 0.5070 6.7260 66.50 3.6519 8 307.0 17.40 360.20 8.05 29.00 236 | 0.33045 0.00 6.200 0 0.5070 6.0860 61.50 3.6519 8 307.0 17.40 376.75 10.88 24.00 237 | 0.52058 0.00 6.200 1 0.5070 6.6310 76.50 4.1480 8 307.0 17.40 388.45 9.54 25.10 238 | 0.51183 0.00 6.200 0 0.5070 7.3580 71.60 4.1480 8 307.0 17.40 390.07 4.73 31.50 239 | 0.08244 30.00 4.930 0 0.4280 6.4810 18.50 6.1899 6 300.0 16.60 379.41 6.36 23.70 240 | 0.09252 30.00 4.930 0 0.4280 6.6060 42.20 6.1899 6 300.0 16.60 383.78 7.37 23.30 241 | 0.11329 30.00 4.930 0 0.4280 6.8970 54.30 6.3361 6 300.0 16.60 391.25 11.38 22.00 242 | 0.10612 30.00 4.930 0 0.4280 6.0950 65.10 6.3361 6 300.0 16.60 394.62 12.40 20.10 243 | 0.10290 30.00 4.930 0 0.4280 6.3580 52.90 7.0355 6 300.0 16.60 372.75 11.22 22.20 244 | 0.12757 30.00 4.930 0 0.4280 6.3930 7.80 7.0355 6 300.0 16.60 374.71 5.19 23.70 245 | 0.20608 22.00 5.860 0 0.4310 5.5930 76.50 7.9549 7 330.0 19.10 372.49 12.50 17.60 246 | 0.19133 22.00 5.860 0 0.4310 5.6050 70.20 7.9549 7 330.0 19.10 389.13 18.46 18.50 247 | 0.33983 22.00 5.860 0 0.4310 6.1080 34.90 8.0555 7 330.0 19.10 390.18 9.16 24.30 248 | 0.19657 22.00 5.860 0 0.4310 6.2260 79.20 8.0555 7 330.0 19.10 376.14 10.15 20.50 249 | 0.16439 22.00 5.860 0 0.4310 6.4330 49.10 7.8265 7 330.0 19.10 374.71 9.52 24.50 250 | 0.19073 22.00 5.860 0 0.4310 6.7180 17.50 7.8265 7 330.0 19.10 393.74 6.56 26.20 251 | 0.14030 22.00 5.860 0 0.4310 6.4870 13.00 7.3967 7 330.0 19.10 396.28 5.90 24.40 252 | 0.21409 22.00 5.860 0 0.4310 6.4380 8.90 7.3967 7 330.0 19.10 377.07 3.59 24.80 253 | 0.08221 22.00 5.860 0 0.4310 6.9570 6.80 8.9067 7 330.0 19.10 386.09 3.53 29.60 254 | 0.36894 22.00 5.860 0 0.4310 8.2590 8.40 8.9067 7 330.0 19.10 396.90 3.54 42.80 255 | 0.04819 80.00 3.640 0 0.3920 6.1080 32.00 9.2203 1 315.0 16.40 392.89 6.57 21.90 256 | 0.03548 80.00 3.640 0 0.3920 5.8760 19.10 9.2203 1 315.0 16.40 395.18 9.25 20.90 257 | 0.01538 90.00 3.750 0 0.3940 7.4540 34.20 6.3361 3 244.0 15.90 386.34 3.11 44.00 258 | 0.61154 20.00 3.970 0 0.6470 8.7040 86.90 1.8010 5 264.0 13.00 389.70 5.12 50.00 259 | 0.66351 20.00 3.970 0 0.6470 7.3330 100.00 1.8946 5 264.0 13.00 383.29 7.79 36.00 260 | 0.65665 20.00 3.970 0 0.6470 6.8420 100.00 2.0107 5 264.0 13.00 391.93 6.90 30.10 261 | 0.54011 20.00 3.970 0 0.6470 7.2030 81.80 2.1121 5 264.0 13.00 392.80 9.59 33.80 262 | 0.53412 20.00 3.970 0 0.6470 7.5200 89.40 2.1398 5 264.0 13.00 388.37 7.26 43.10 263 | 0.52014 20.00 3.970 0 0.6470 8.3980 91.50 2.2885 5 264.0 13.00 386.86 5.91 48.80 264 | 0.82526 20.00 3.970 0 0.6470 7.3270 94.50 2.0788 5 264.0 13.00 393.42 11.25 31.00 265 | 0.55007 20.00 3.970 0 0.6470 7.2060 91.60 1.9301 5 264.0 13.00 387.89 8.10 36.50 266 | 0.76162 20.00 3.970 0 0.6470 5.5600 62.80 1.9865 5 264.0 13.00 392.40 10.45 22.80 267 | 0.78570 20.00 3.970 0 0.6470 7.0140 84.60 2.1329 5 264.0 13.00 384.07 14.79 30.70 268 | 0.57834 20.00 3.970 0 0.5750 8.2970 67.00 2.4216 5 264.0 13.00 384.54 7.44 50.00 269 | 0.54050 20.00 3.970 0 0.5750 7.4700 52.60 2.8720 5 264.0 13.00 390.30 3.16 43.50 270 | 0.09065 20.00 6.960 1 0.4640 5.9200 61.50 3.9175 3 223.0 18.60 391.34 13.65 20.70 271 | 0.29916 20.00 6.960 0 0.4640 5.8560 42.10 4.4290 3 223.0 18.60 388.65 13.00 21.10 272 | 0.16211 20.00 6.960 0 0.4640 6.2400 16.30 4.4290 3 223.0 18.60 396.90 6.59 25.20 273 | 0.11460 20.00 6.960 0 0.4640 6.5380 58.70 3.9175 3 223.0 18.60 394.96 7.73 24.40 274 | 0.22188 20.00 6.960 1 0.4640 7.6910 51.80 4.3665 3 223.0 18.60 390.77 6.58 35.20 275 | 0.05644 40.00 6.410 1 0.4470 6.7580 32.90 4.0776 4 254.0 17.60 396.90 3.53 32.40 276 | 0.09604 40.00 6.410 0 0.4470 6.8540 42.80 4.2673 4 254.0 17.60 396.90 2.98 32.00 277 | 0.10469 40.00 6.410 1 0.4470 7.2670 49.00 4.7872 4 254.0 17.60 389.25 6.05 33.20 278 | 0.06127 40.00 6.410 1 0.4470 6.8260 27.60 4.8628 4 254.0 17.60 393.45 4.16 33.10 279 | 0.07978 40.00 6.410 0 0.4470 6.4820 32.10 4.1403 4 254.0 17.60 396.90 7.19 29.10 280 | 0.21038 20.00 3.330 0 0.4429 6.8120 32.20 4.1007 5 216.0 14.90 396.90 4.85 35.10 281 | 0.03578 20.00 3.330 0 0.4429 7.8200 64.50 4.6947 5 216.0 14.90 387.31 3.76 45.40 282 | 0.03705 20.00 3.330 0 0.4429 6.9680 37.20 5.2447 5 216.0 14.90 392.23 4.59 35.40 283 | 0.06129 20.00 3.330 1 0.4429 7.6450 49.70 5.2119 5 216.0 14.90 377.07 3.01 46.00 284 | 0.01501 90.00 1.210 1 0.4010 7.9230 24.80 5.8850 1 198.0 13.60 395.52 3.16 50.00 285 | 0.00906 90.00 2.970 0 0.4000 7.0880 20.80 7.3073 1 285.0 15.30 394.72 7.85 32.20 286 | 0.01096 55.00 2.250 0 0.3890 6.4530 31.90 7.3073 1 300.0 15.30 394.72 8.23 22.00 287 | 0.01965 80.00 1.760 0 0.3850 6.2300 31.50 9.0892 1 241.0 18.20 341.60 12.93 20.10 288 | 0.03871 52.50 5.320 0 0.4050 6.2090 31.30 7.3172 6 293.0 16.60 396.90 7.14 23.20 289 | 0.04590 52.50 5.320 0 0.4050 6.3150 45.60 7.3172 6 293.0 16.60 396.90 7.60 22.30 290 | 0.04297 52.50 5.320 0 0.4050 6.5650 22.90 7.3172 6 293.0 16.60 371.72 9.51 24.80 291 | 0.03502 80.00 4.950 0 0.4110 6.8610 27.90 5.1167 4 245.0 19.20 396.90 3.33 28.50 292 | 0.07886 80.00 4.950 0 0.4110 7.1480 27.70 5.1167 4 245.0 19.20 396.90 3.56 37.30 293 | 0.03615 80.00 4.950 0 0.4110 6.6300 23.40 5.1167 4 245.0 19.20 396.90 4.70 27.90 294 | 0.08265 0.00 13.920 0 0.4370 6.1270 18.40 5.5027 4 289.0 16.00 396.90 8.58 23.90 295 | 0.08199 0.00 13.920 0 0.4370 6.0090 42.30 5.5027 4 289.0 16.00 396.90 10.40 21.70 296 | 0.12932 0.00 13.920 0 0.4370 6.6780 31.10 5.9604 4 289.0 16.00 396.90 6.27 28.60 297 | 0.05372 0.00 13.920 0 0.4370 6.5490 51.00 5.9604 4 289.0 16.00 392.85 7.39 27.10 298 | 0.14103 0.00 13.920 0 0.4370 5.7900 58.00 6.3200 4 289.0 16.00 396.90 15.84 20.30 299 | 0.06466 70.00 2.240 0 0.4000 6.3450 20.10 7.8278 5 358.0 14.80 368.24 4.97 22.50 300 | 0.05561 70.00 2.240 0 0.4000 7.0410 10.00 7.8278 5 358.0 14.80 371.58 4.74 29.00 301 | 0.04417 70.00 2.240 0 0.4000 6.8710 47.40 7.8278 5 358.0 14.80 390.86 6.07 24.80 302 | 0.03537 34.00 6.090 0 0.4330 6.5900 40.40 5.4917 7 329.0 16.10 395.75 9.50 22.00 303 | 0.09266 34.00 6.090 0 0.4330 6.4950 18.40 5.4917 7 329.0 16.10 383.61 8.67 26.40 304 | 0.10000 34.00 6.090 0 0.4330 6.9820 17.70 5.4917 7 329.0 16.10 390.43 4.86 33.10 305 | 0.05515 33.00 2.180 0 0.4720 7.2360 41.10 4.0220 7 222.0 18.40 393.68 6.93 36.10 306 | 0.05479 33.00 2.180 0 0.4720 6.6160 58.10 3.3700 7 222.0 18.40 393.36 8.93 28.40 307 | 0.07503 33.00 2.180 0 0.4720 7.4200 71.90 3.0992 7 222.0 18.40 396.90 6.47 33.40 308 | 0.04932 33.00 2.180 0 0.4720 6.8490 70.30 3.1827 7 222.0 18.40 396.90 7.53 28.20 309 | 0.49298 0.00 9.900 0 0.5440 6.6350 82.50 3.3175 4 304.0 18.40 396.90 4.54 22.80 310 | 0.34940 0.00 9.900 0 0.5440 5.9720 76.70 3.1025 4 304.0 18.40 396.24 9.97 20.30 311 | 2.63548 0.00 9.900 0 0.5440 4.9730 37.80 2.5194 4 304.0 18.40 350.45 12.64 16.10 312 | 0.79041 0.00 9.900 0 0.5440 6.1220 52.80 2.6403 4 304.0 18.40 396.90 5.98 22.10 313 | 0.26169 0.00 9.900 0 0.5440 6.0230 90.40 2.8340 4 304.0 18.40 396.30 11.72 19.40 314 | 0.26938 0.00 9.900 0 0.5440 6.2660 82.80 3.2628 4 304.0 18.40 393.39 7.90 21.60 315 | 0.36920 0.00 9.900 0 0.5440 6.5670 87.30 3.6023 4 304.0 18.40 395.69 9.28 23.80 316 | 0.25356 0.00 9.900 0 0.5440 5.7050 77.70 3.9450 4 304.0 18.40 396.42 11.50 16.20 317 | 0.31827 0.00 9.900 0 0.5440 5.9140 83.20 3.9986 4 304.0 18.40 390.70 18.33 17.80 318 | 0.24522 0.00 9.900 0 0.5440 5.7820 71.70 4.0317 4 304.0 18.40 396.90 15.94 19.80 319 | 0.40202 0.00 9.900 0 0.5440 6.3820 67.20 3.5325 4 304.0 18.40 395.21 10.36 23.10 320 | 0.47547 0.00 9.900 0 0.5440 6.1130 58.80 4.0019 4 304.0 18.40 396.23 12.73 21.00 321 | 0.16760 0.00 7.380 0 0.4930 6.4260 52.30 4.5404 5 287.0 19.60 396.90 7.20 23.80 322 | 0.18159 0.00 7.380 0 0.4930 6.3760 54.30 4.5404 5 287.0 19.60 396.90 6.87 23.10 323 | 0.35114 0.00 7.380 0 0.4930 6.0410 49.90 4.7211 5 287.0 19.60 396.90 7.70 20.40 324 | 0.28392 0.00 7.380 0 0.4930 5.7080 74.30 4.7211 5 287.0 19.60 391.13 11.74 18.50 325 | 0.34109 0.00 7.380 0 0.4930 6.4150 40.10 4.7211 5 287.0 19.60 396.90 6.12 25.00 326 | 0.19186 0.00 7.380 0 0.4930 6.4310 14.70 5.4159 5 287.0 19.60 393.68 5.08 24.60 327 | 0.30347 0.00 7.380 0 0.4930 6.3120 28.90 5.4159 5 287.0 19.60 396.90 6.15 23.00 328 | 0.24103 0.00 7.380 0 0.4930 6.0830 43.70 5.4159 5 287.0 19.60 396.90 12.79 22.20 329 | 0.06617 0.00 3.240 0 0.4600 5.8680 25.80 5.2146 4 430.0 16.90 382.44 9.97 19.30 330 | 0.06724 0.00 3.240 0 0.4600 6.3330 17.20 5.2146 4 430.0 16.90 375.21 7.34 22.60 331 | 0.04544 0.00 3.240 0 0.4600 6.1440 32.20 5.8736 4 430.0 16.90 368.57 9.09 19.80 332 | 0.05023 35.00 6.060 0 0.4379 5.7060 28.40 6.6407 1 304.0 16.90 394.02 12.43 17.10 333 | 0.03466 35.00 6.060 0 0.4379 6.0310 23.30 6.6407 1 304.0 16.90 362.25 7.83 19.40 334 | 0.05083 0.00 5.190 0 0.5150 6.3160 38.10 6.4584 5 224.0 20.20 389.71 5.68 22.20 335 | 0.03738 0.00 5.190 0 0.5150 6.3100 38.50 6.4584 5 224.0 20.20 389.40 6.75 20.70 336 | 0.03961 0.00 5.190 0 0.5150 6.0370 34.50 5.9853 5 224.0 20.20 396.90 8.01 21.10 337 | 0.03427 0.00 5.190 0 0.5150 5.8690 46.30 5.2311 5 224.0 20.20 396.90 9.80 19.50 338 | 0.03041 0.00 5.190 0 0.5150 5.8950 59.60 5.6150 5 224.0 20.20 394.81 10.56 18.50 339 | 0.03306 0.00 5.190 0 0.5150 6.0590 37.30 4.8122 5 224.0 20.20 396.14 8.51 20.60 340 | 0.05497 0.00 5.190 0 0.5150 5.9850 45.40 4.8122 5 224.0 20.20 396.90 9.74 19.00 341 | 0.06151 0.00 5.190 0 0.5150 5.9680 58.50 4.8122 5 224.0 20.20 396.90 9.29 18.70 342 | 0.01301 35.00 1.520 0 0.4420 7.2410 49.30 7.0379 1 284.0 15.50 394.74 5.49 32.70 343 | 0.02498 0.00 1.890 0 0.5180 6.5400 59.70 6.2669 1 422.0 15.90 389.96 8.65 16.50 344 | 0.02543 55.00 3.780 0 0.4840 6.6960 56.40 5.7321 5 370.0 17.60 396.90 7.18 23.90 345 | 0.03049 55.00 3.780 0 0.4840 6.8740 28.10 6.4654 5 370.0 17.60 387.97 4.61 31.20 346 | 0.03113 0.00 4.390 0 0.4420 6.0140 48.50 8.0136 3 352.0 18.80 385.64 10.53 17.50 347 | 0.06162 0.00 4.390 0 0.4420 5.8980 52.30 8.0136 3 352.0 18.80 364.61 12.67 17.20 348 | 0.01870 85.00 4.150 0 0.4290 6.5160 27.70 8.5353 4 351.0 17.90 392.43 6.36 23.10 349 | 0.01501 80.00 2.010 0 0.4350 6.6350 29.70 8.3440 4 280.0 17.00 390.94 5.99 24.50 350 | 0.02899 40.00 1.250 0 0.4290 6.9390 34.50 8.7921 1 335.0 19.70 389.85 5.89 26.60 351 | 0.06211 40.00 1.250 0 0.4290 6.4900 44.40 8.7921 1 335.0 19.70 396.90 5.98 22.90 352 | 0.07950 60.00 1.690 0 0.4110 6.5790 35.90 10.7103 4 411.0 18.30 370.78 5.49 24.10 353 | 0.07244 60.00 1.690 0 0.4110 5.8840 18.50 10.7103 4 411.0 18.30 392.33 7.79 18.60 354 | 0.01709 90.00 2.020 0 0.4100 6.7280 36.10 12.1265 5 187.0 17.00 384.46 4.50 30.10 355 | 0.04301 80.00 1.910 0 0.4130 5.6630 21.90 10.5857 4 334.0 22.00 382.80 8.05 18.20 356 | 0.10659 80.00 1.910 0 0.4130 5.9360 19.50 10.5857 4 334.0 22.00 376.04 5.57 20.60 357 | 8.98296 0.00 18.100 1 0.7700 6.2120 97.40 2.1222 24 666.0 20.20 377.73 17.60 17.80 358 | 3.84970 0.00 18.100 1 0.7700 6.3950 91.00 2.5052 24 666.0 20.20 391.34 13.27 21.70 359 | 5.20177 0.00 18.100 1 0.7700 6.1270 83.40 2.7227 24 666.0 20.20 395.43 11.48 22.70 360 | 4.26131 0.00 18.100 0 0.7700 6.1120 81.30 2.5091 24 666.0 20.20 390.74 12.67 22.60 361 | 4.54192 0.00 18.100 0 0.7700 6.3980 88.00 2.5182 24 666.0 20.20 374.56 7.79 25.00 362 | 3.83684 0.00 18.100 0 0.7700 6.2510 91.10 2.2955 24 666.0 20.20 350.65 14.19 19.90 363 | 3.67822 0.00 18.100 0 0.7700 5.3620 96.20 2.1036 24 666.0 20.20 380.79 10.19 20.80 364 | 4.22239 0.00 18.100 1 0.7700 5.8030 89.00 1.9047 24 666.0 20.20 353.04 14.64 16.80 365 | 3.47428 0.00 18.100 1 0.7180 8.7800 82.90 1.9047 24 666.0 20.20 354.55 5.29 21.90 366 | 4.55587 0.00 18.100 0 0.7180 3.5610 87.90 1.6132 24 666.0 20.20 354.70 7.12 27.50 367 | 3.69695 0.00 18.100 0 0.7180 4.9630 91.40 1.7523 24 666.0 20.20 316.03 14.00 21.90 368 | 13.52220 0.00 18.100 0 0.6310 3.8630 100.00 1.5106 24 666.0 20.20 131.42 13.33 23.10 369 | 4.89822 0.00 18.100 0 0.6310 4.9700 100.00 1.3325 24 666.0 20.20 375.52 3.26 50.00 370 | 5.66998 0.00 18.100 1 0.6310 6.6830 96.80 1.3567 24 666.0 20.20 375.33 3.73 50.00 371 | 6.53876 0.00 18.100 1 0.6310 7.0160 97.50 1.2024 24 666.0 20.20 392.05 2.96 50.00 372 | 9.23230 0.00 18.100 0 0.6310 6.2160 100.00 1.1691 24 666.0 20.20 366.15 9.53 50.00 373 | 8.26725 0.00 18.100 1 0.6680 5.8750 89.60 1.1296 24 666.0 20.20 347.88 8.88 50.00 374 | 11.10810 0.00 18.100 0 0.6680 4.9060 100.00 1.1742 24 666.0 20.20 396.90 34.77 13.80 375 | 18.49820 0.00 18.100 0 0.6680 4.1380 100.00 1.1370 24 666.0 20.20 396.90 37.97 13.80 376 | 19.60910 0.00 18.100 0 0.6710 7.3130 97.90 1.3163 24 666.0 20.20 396.90 13.44 15.00 377 | 15.28800 0.00 18.100 0 0.6710 6.6490 93.30 1.3449 24 666.0 20.20 363.02 23.24 13.90 378 | 9.82349 0.00 18.100 0 0.6710 6.7940 98.80 1.3580 24 666.0 20.20 396.90 21.24 13.30 379 | 23.64820 0.00 18.100 0 0.6710 6.3800 96.20 1.3861 24 666.0 20.20 396.90 23.69 13.10 380 | 17.86670 0.00 18.100 0 0.6710 6.2230 100.00 1.3861 24 666.0 20.20 393.74 21.78 10.20 381 | 88.97620 0.00 18.100 0 0.6710 6.9680 91.90 1.4165 24 666.0 20.20 396.90 17.21 10.40 382 | 15.87440 0.00 18.100 0 0.6710 6.5450 99.10 1.5192 24 666.0 20.20 396.90 21.08 10.90 383 | 9.18702 0.00 18.100 0 0.7000 5.5360 100.00 1.5804 24 666.0 20.20 396.90 23.60 11.30 384 | 7.99248 0.00 18.100 0 0.7000 5.5200 100.00 1.5331 24 666.0 20.20 396.90 24.56 12.30 385 | 20.08490 0.00 18.100 0 0.7000 4.3680 91.20 1.4395 24 666.0 20.20 285.83 30.63 8.80 386 | 16.81180 0.00 18.100 0 0.7000 5.2770 98.10 1.4261 24 666.0 20.20 396.90 30.81 7.20 387 | 24.39380 0.00 18.100 0 0.7000 4.6520 100.00 1.4672 24 666.0 20.20 396.90 28.28 10.50 388 | 22.59710 0.00 18.100 0 0.7000 5.0000 89.50 1.5184 24 666.0 20.20 396.90 31.99 7.40 389 | 14.33370 0.00 18.100 0 0.7000 4.8800 100.00 1.5895 24 666.0 20.20 372.92 30.62 10.20 390 | 8.15174 0.00 18.100 0 0.7000 5.3900 98.90 1.7281 24 666.0 20.20 396.90 20.85 11.50 391 | 6.96215 0.00 18.100 0 0.7000 5.7130 97.00 1.9265 24 666.0 20.20 394.43 17.11 15.10 392 | 5.29305 0.00 18.100 0 0.7000 6.0510 82.50 2.1678 24 666.0 20.20 378.38 18.76 23.20 393 | 11.57790 0.00 18.100 0 0.7000 5.0360 97.00 1.7700 24 666.0 20.20 396.90 25.68 9.70 394 | 8.64476 0.00 18.100 0 0.6930 6.1930 92.60 1.7912 24 666.0 20.20 396.90 15.17 13.80 395 | 13.35980 0.00 18.100 0 0.6930 5.8870 94.70 1.7821 24 666.0 20.20 396.90 16.35 12.70 396 | 8.71675 0.00 18.100 0 0.6930 6.4710 98.80 1.7257 24 666.0 20.20 391.98 17.12 13.10 397 | 5.87205 0.00 18.100 0 0.6930 6.4050 96.00 1.6768 24 666.0 20.20 396.90 19.37 12.50 398 | 7.67202 0.00 18.100 0 0.6930 5.7470 98.90 1.6334 24 666.0 20.20 393.10 19.92 8.50 399 | 38.35180 0.00 18.100 0 0.6930 5.4530 100.00 1.4896 24 666.0 20.20 396.90 30.59 5.00 400 | 9.91655 0.00 18.100 0 0.6930 5.8520 77.80 1.5004 24 666.0 20.20 338.16 29.97 6.30 401 | 25.04610 0.00 18.100 0 0.6930 5.9870 100.00 1.5888 24 666.0 20.20 396.90 26.77 5.60 402 | 14.23620 0.00 18.100 0 0.6930 6.3430 100.00 1.5741 24 666.0 20.20 396.90 20.32 7.20 403 | 9.59571 0.00 18.100 0 0.6930 6.4040 100.00 1.6390 24 666.0 20.20 376.11 20.31 12.10 404 | 24.80170 0.00 18.100 0 0.6930 5.3490 96.00 1.7028 24 666.0 20.20 396.90 19.77 8.30 405 | 41.52920 0.00 18.100 0 0.6930 5.5310 85.40 1.6074 24 666.0 20.20 329.46 27.38 8.50 406 | 67.92080 0.00 18.100 0 0.6930 5.6830 100.00 1.4254 24 666.0 20.20 384.97 22.98 5.00 407 | 20.71620 0.00 18.100 0 0.6590 4.1380 100.00 1.1781 24 666.0 20.20 370.22 23.34 11.90 408 | 11.95110 0.00 18.100 0 0.6590 5.6080 100.00 1.2852 24 666.0 20.20 332.09 12.13 27.90 409 | 7.40389 0.00 18.100 0 0.5970 5.6170 97.90 1.4547 24 666.0 20.20 314.64 26.40 17.20 410 | 14.43830 0.00 18.100 0 0.5970 6.8520 100.00 1.4655 24 666.0 20.20 179.36 19.78 27.50 411 | 51.13580 0.00 18.100 0 0.5970 5.7570 100.00 1.4130 24 666.0 20.20 2.60 10.11 15.00 412 | 14.05070 0.00 18.100 0 0.5970 6.6570 100.00 1.5275 24 666.0 20.20 35.05 21.22 17.20 413 | 18.81100 0.00 18.100 0 0.5970 4.6280 100.00 1.5539 24 666.0 20.20 28.79 34.37 17.90 414 | 28.65580 0.00 18.100 0 0.5970 5.1550 100.00 1.5894 24 666.0 20.20 210.97 20.08 16.30 415 | 45.74610 0.00 18.100 0 0.6930 4.5190 100.00 1.6582 24 666.0 20.20 88.27 36.98 7.00 416 | 18.08460 0.00 18.100 0 0.6790 6.4340 100.00 1.8347 24 666.0 20.20 27.25 29.05 7.20 417 | 10.83420 0.00 18.100 0 0.6790 6.7820 90.80 1.8195 24 666.0 20.20 21.57 25.79 7.50 418 | 25.94060 0.00 18.100 0 0.6790 5.3040 89.10 1.6475 24 666.0 20.20 127.36 26.64 10.40 419 | 73.53410 0.00 18.100 0 0.6790 5.9570 100.00 1.8026 24 666.0 20.20 16.45 20.62 8.80 420 | 11.81230 0.00 18.100 0 0.7180 6.8240 76.50 1.7940 24 666.0 20.20 48.45 22.74 8.40 421 | 11.08740 0.00 18.100 0 0.7180 6.4110 100.00 1.8589 24 666.0 20.20 318.75 15.02 16.70 422 | 7.02259 0.00 18.100 0 0.7180 6.0060 95.30 1.8746 24 666.0 20.20 319.98 15.70 14.20 423 | 12.04820 0.00 18.100 0 0.6140 5.6480 87.60 1.9512 24 666.0 20.20 291.55 14.10 20.80 424 | 7.05042 0.00 18.100 0 0.6140 6.1030 85.10 2.0218 24 666.0 20.20 2.52 23.29 13.40 425 | 8.79212 0.00 18.100 0 0.5840 5.5650 70.60 2.0635 24 666.0 20.20 3.65 17.16 11.70 426 | 15.86030 0.00 18.100 0 0.6790 5.8960 95.40 1.9096 24 666.0 20.20 7.68 24.39 8.30 427 | 12.24720 0.00 18.100 0 0.5840 5.8370 59.70 1.9976 24 666.0 20.20 24.65 15.69 10.20 428 | 37.66190 0.00 18.100 0 0.6790 6.2020 78.70 1.8629 24 666.0 20.20 18.82 14.52 10.90 429 | 7.36711 0.00 18.100 0 0.6790 6.1930 78.10 1.9356 24 666.0 20.20 96.73 21.52 11.00 430 | 9.33889 0.00 18.100 0 0.6790 6.3800 95.60 1.9682 24 666.0 20.20 60.72 24.08 9.50 431 | 8.49213 0.00 18.100 0 0.5840 6.3480 86.10 2.0527 24 666.0 20.20 83.45 17.64 14.50 432 | 10.06230 0.00 18.100 0 0.5840 6.8330 94.30 2.0882 24 666.0 20.20 81.33 19.69 14.10 433 | 6.44405 0.00 18.100 0 0.5840 6.4250 74.80 2.2004 24 666.0 20.20 97.95 12.03 16.10 434 | 5.58107 0.00 18.100 0 0.7130 6.4360 87.90 2.3158 24 666.0 20.20 100.19 16.22 14.30 435 | 13.91340 0.00 18.100 0 0.7130 6.2080 95.00 2.2222 24 666.0 20.20 100.63 15.17 11.70 436 | 11.16040 0.00 18.100 0 0.7400 6.6290 94.60 2.1247 24 666.0 20.20 109.85 23.27 13.40 437 | 14.42080 0.00 18.100 0 0.7400 6.4610 93.30 2.0026 24 666.0 20.20 27.49 18.05 9.60 438 | 15.17720 0.00 18.100 0 0.7400 6.1520 100.00 1.9142 24 666.0 20.20 9.32 26.45 8.70 439 | 13.67810 0.00 18.100 0 0.7400 5.9350 87.90 1.8206 24 666.0 20.20 68.95 34.02 8.40 440 | 9.39063 0.00 18.100 0 0.7400 5.6270 93.90 1.8172 24 666.0 20.20 396.90 22.88 12.80 441 | 22.05110 0.00 18.100 0 0.7400 5.8180 92.40 1.8662 24 666.0 20.20 391.45 22.11 10.50 442 | 9.72418 0.00 18.100 0 0.7400 6.4060 97.20 2.0651 24 666.0 20.20 385.96 19.52 17.10 443 | 5.66637 0.00 18.100 0 0.7400 6.2190 100.00 2.0048 24 666.0 20.20 395.69 16.59 18.40 444 | 9.96654 0.00 18.100 0 0.7400 6.4850 100.00 1.9784 24 666.0 20.20 386.73 18.85 15.40 445 | 12.80230 0.00 18.100 0 0.7400 5.8540 96.60 1.8956 24 666.0 20.20 240.52 23.79 10.80 446 | 10.67180 0.00 18.100 0 0.7400 6.4590 94.80 1.9879 24 666.0 20.20 43.06 23.98 11.80 447 | 6.28807 0.00 18.100 0 0.7400 6.3410 96.40 2.0720 24 666.0 20.20 318.01 17.79 14.90 448 | 9.92485 0.00 18.100 0 0.7400 6.2510 96.60 2.1980 24 666.0 20.20 388.52 16.44 12.60 449 | 9.32909 0.00 18.100 0 0.7130 6.1850 98.70 2.2616 24 666.0 20.20 396.90 18.13 14.10 450 | 7.52601 0.00 18.100 0 0.7130 6.4170 98.30 2.1850 24 666.0 20.20 304.21 19.31 13.00 451 | 6.71772 0.00 18.100 0 0.7130 6.7490 92.60 2.3236 24 666.0 20.20 0.32 17.44 13.40 452 | 5.44114 0.00 18.100 0 0.7130 6.6550 98.20 2.3552 24 666.0 20.20 355.29 17.73 15.20 453 | 5.09017 0.00 18.100 0 0.7130 6.2970 91.80 2.3682 24 666.0 20.20 385.09 17.27 16.10 454 | 8.24809 0.00 18.100 0 0.7130 7.3930 99.30 2.4527 24 666.0 20.20 375.87 16.74 17.80 455 | 9.51363 0.00 18.100 0 0.7130 6.7280 94.10 2.4961 24 666.0 20.20 6.68 18.71 14.90 456 | 4.75237 0.00 18.100 0 0.7130 6.5250 86.50 2.4358 24 666.0 20.20 50.92 18.13 14.10 457 | 4.66883 0.00 18.100 0 0.7130 5.9760 87.90 2.5806 24 666.0 20.20 10.48 19.01 12.70 458 | 8.20058 0.00 18.100 0 0.7130 5.9360 80.30 2.7792 24 666.0 20.20 3.50 16.94 13.50 459 | 7.75223 0.00 18.100 0 0.7130 6.3010 83.70 2.7831 24 666.0 20.20 272.21 16.23 14.90 460 | 6.80117 0.00 18.100 0 0.7130 6.0810 84.40 2.7175 24 666.0 20.20 396.90 14.70 20.00 461 | 4.81213 0.00 18.100 0 0.7130 6.7010 90.00 2.5975 24 666.0 20.20 255.23 16.42 16.40 462 | 3.69311 0.00 18.100 0 0.7130 6.3760 88.40 2.5671 24 666.0 20.20 391.43 14.65 17.70 463 | 6.65492 0.00 18.100 0 0.7130 6.3170 83.00 2.7344 24 666.0 20.20 396.90 13.99 19.50 464 | 5.82115 0.00 18.100 0 0.7130 6.5130 89.90 2.8016 24 666.0 20.20 393.82 10.29 20.20 465 | 7.83932 0.00 18.100 0 0.6550 6.2090 65.40 2.9634 24 666.0 20.20 396.90 13.22 21.40 466 | 3.16360 0.00 18.100 0 0.6550 5.7590 48.20 3.0665 24 666.0 20.20 334.40 14.13 19.90 467 | 3.77498 0.00 18.100 0 0.6550 5.9520 84.70 2.8715 24 666.0 20.20 22.01 17.15 19.00 468 | 4.42228 0.00 18.100 0 0.5840 6.0030 94.50 2.5403 24 666.0 20.20 331.29 21.32 19.10 469 | 15.57570 0.00 18.100 0 0.5800 5.9260 71.00 2.9084 24 666.0 20.20 368.74 18.13 19.10 470 | 13.07510 0.00 18.100 0 0.5800 5.7130 56.70 2.8237 24 666.0 20.20 396.90 14.76 20.10 471 | 4.34879 0.00 18.100 0 0.5800 6.1670 84.00 3.0334 24 666.0 20.20 396.90 16.29 19.90 472 | 4.03841 0.00 18.100 0 0.5320 6.2290 90.70 3.0993 24 666.0 20.20 395.33 12.87 19.60 473 | 3.56868 0.00 18.100 0 0.5800 6.4370 75.00 2.8965 24 666.0 20.20 393.37 14.36 23.20 474 | 4.64689 0.00 18.100 0 0.6140 6.9800 67.60 2.5329 24 666.0 20.20 374.68 11.66 29.80 475 | 8.05579 0.00 18.100 0 0.5840 5.4270 95.40 2.4298 24 666.0 20.20 352.58 18.14 13.80 476 | 6.39312 0.00 18.100 0 0.5840 6.1620 97.40 2.2060 24 666.0 20.20 302.76 24.10 13.30 477 | 4.87141 0.00 18.100 0 0.6140 6.4840 93.60 2.3053 24 666.0 20.20 396.21 18.68 16.70 478 | 15.02340 0.00 18.100 0 0.6140 5.3040 97.30 2.1007 24 666.0 20.20 349.48 24.91 12.00 479 | 10.23300 0.00 18.100 0 0.6140 6.1850 96.70 2.1705 24 666.0 20.20 379.70 18.03 14.60 480 | 14.33370 0.00 18.100 0 0.6140 6.2290 88.00 1.9512 24 666.0 20.20 383.32 13.11 21.40 481 | 5.82401 0.00 18.100 0 0.5320 6.2420 64.70 3.4242 24 666.0 20.20 396.90 10.74 23.00 482 | 5.70818 0.00 18.100 0 0.5320 6.7500 74.90 3.3317 24 666.0 20.20 393.07 7.74 23.70 483 | 5.73116 0.00 18.100 0 0.5320 7.0610 77.00 3.4106 24 666.0 20.20 395.28 7.01 25.00 484 | 2.81838 0.00 18.100 0 0.5320 5.7620 40.30 4.0983 24 666.0 20.20 392.92 10.42 21.80 485 | 2.37857 0.00 18.100 0 0.5830 5.8710 41.90 3.7240 24 666.0 20.20 370.73 13.34 20.60 486 | 3.67367 0.00 18.100 0 0.5830 6.3120 51.90 3.9917 24 666.0 20.20 388.62 10.58 21.20 487 | 5.69175 0.00 18.100 0 0.5830 6.1140 79.80 3.5459 24 666.0 20.20 392.68 14.98 19.10 488 | 4.83567 0.00 18.100 0 0.5830 5.9050 53.20 3.1523 24 666.0 20.20 388.22 11.45 20.60 489 | 0.15086 0.00 27.740 0 0.6090 5.4540 92.70 1.8209 4 711.0 20.10 395.09 18.06 15.20 490 | 0.18337 0.00 27.740 0 0.6090 5.4140 98.30 1.7554 4 711.0 20.10 344.05 23.97 7.00 491 | 0.20746 0.00 27.740 0 0.6090 5.0930 98.00 1.8226 4 711.0 20.10 318.43 29.68 8.10 492 | 0.10574 0.00 27.740 0 0.6090 5.9830 98.80 1.8681 4 711.0 20.10 390.11 18.07 13.60 493 | 0.11132 0.00 27.740 0 0.6090 5.9830 83.50 2.1099 4 711.0 20.10 396.90 13.35 20.10 494 | 0.17331 0.00 9.690 0 0.5850 5.7070 54.00 2.3817 6 391.0 19.20 396.90 12.01 21.80 495 | 0.27957 0.00 9.690 0 0.5850 5.9260 42.60 2.3817 6 391.0 19.20 396.90 13.59 24.50 496 | 0.17899 0.00 9.690 0 0.5850 5.6700 28.80 2.7986 6 391.0 19.20 393.29 17.60 23.10 497 | 0.28960 0.00 9.690 0 0.5850 5.3900 72.90 2.7986 6 391.0 19.20 396.90 21.14 19.70 498 | 0.26838 0.00 9.690 0 0.5850 5.7940 70.60 2.8927 6 391.0 19.20 396.90 14.10 18.30 499 | 0.23912 0.00 9.690 0 0.5850 6.0190 65.30 2.4091 6 391.0 19.20 396.90 12.92 21.20 500 | 0.17783 0.00 9.690 0 0.5850 5.5690 73.50 2.3999 6 391.0 19.20 395.77 15.10 17.50 501 | 0.22438 0.00 9.690 0 0.5850 6.0270 79.70 2.4982 6 391.0 19.20 396.90 14.33 16.80 502 | 0.06263 0.00 11.930 0 0.5730 6.5930 69.10 2.4786 1 273.0 21.00 391.99 9.67 22.40 503 | 0.04527 0.00 11.930 0 0.5730 6.1200 76.70 2.2875 1 273.0 21.00 396.90 9.08 20.60 504 | 0.06076 0.00 11.930 0 0.5730 6.9760 91.00 2.1675 1 273.0 21.00 396.90 5.64 23.90 505 | 0.10959 0.00 11.930 0 0.5730 6.7940 89.30 2.3889 1 273.0 21.00 393.45 6.48 22.00 506 | 0.04741 0.00 11.930 0 0.5730 6.0300 80.80 2.5050 1 273.0 21.00 396.90 7.88 11.90 507 | -------------------------------------------------------------------------------- /data/boston/housing.names: -------------------------------------------------------------------------------- 1 | 1. Title: Boston Housing Data 2 | 3 | 2. Sources: 4 | (a) Origin: This dataset was taken from the StatLib library which is 5 | maintained at Carnegie Mellon University. 6 | (b) Creator: Harrison, D. and Rubinfeld, D.L. 'Hedonic prices and the 7 | demand for clean air', J. Environ. Economics & Management, 8 | vol.5, 81-102, 1978. 9 | (c) Date: July 7, 1993 10 | 11 | 3. Past Usage: 12 | - Used in Belsley, Kuh & Welsch, 'Regression diagnostics ...', Wiley, 13 | 1980. N.B. Various transformations are used in the table on 14 | pages 244-261. 15 | - Quinlan,R. (1993). Combining Instance-Based and Model-Based Learning. 16 | In Proceedings on the Tenth International Conference of Machine 17 | Learning, 236-243, University of Massachusetts, Amherst. Morgan 18 | Kaufmann. 19 | 20 | 4. Relevant Information: 21 | 22 | Concerns housing values in suburbs of Boston. 23 | 24 | 5. Number of Instances: 506 25 | 26 | 6. Number of Attributes: 13 continuous attributes (including "class" 27 | attribute "MEDV"), 1 binary-valued attribute. 28 | 29 | 7. Attribute Information: 30 | 31 | 1. CRIM per capita crime rate by town 32 | 2. ZN proportion of residential land zoned for lots over 33 | 25,000 sq.ft. 34 | 3. INDUS proportion of non-retail business acres per town 35 | 4. CHAS Charles River dummy variable (= 1 if tract bounds 36 | river; 0 otherwise) 37 | 5. NOX nitric oxides concentration (parts per 10 million) 38 | 6. RM average number of rooms per dwelling 39 | 7. AGE proportion of owner-occupied units built prior to 1940 40 | 8. DIS weighted distances to five Boston employment centres 41 | 9. RAD index of accessibility to radial highways 42 | 10. TAX full-value property-tax rate per $10,000 43 | 11. PTRATIO pupil-teacher ratio by town 44 | 12. B 1000(Bk - 0.63)^2 where Bk is the proportion of blacks 45 | by town 46 | 13. LSTAT % lower status of the population 47 | 14. MEDV Median value of owner-occupied homes in $1000's 48 | 49 | 8. Missing Attribute Values: None. 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /data/reviews/reviews_Clothing_Shoes_and_Jewelry_5.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aterrel/pydata101/5e0eb6b13bd902ad869a34d59566da2f3aa73c27/data/reviews/reviews_Clothing_Shoes_and_Jewelry_5.json.gz -------------------------------------------------------------------------------- /environment.yml: -------------------------------------------------------------------------------- 1 | name: pydata101 2 | dependencies: 3 | - python=3.5 4 | - pandas=0.18 5 | - seaborn=0.7 6 | - bokeh=0.11 7 | - scikit-learn=0.17 8 | - pip=8.1 9 | - jupyter=1.0 10 | # Needed for pd.read_html 11 | - lxml=3.6 12 | - html5lib=0.999 13 | - BeautifulSoup4=4.4 14 | -------------------------------------------------------------------------------- /examples/sklearn_examples.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 3, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "name": "stdout", 12 | "output_type": "stream", 13 | "text": [ 14 | "Confusion matrix, without normalization\n", 15 | "[[13 0 0]\n", 16 | " [ 0 15 1]\n", 17 | " [ 0 0 9]]\n", 18 | "Normalized confusion matrix\n", 19 | "[[ 1. 0. 0. ]\n", 20 | " [ 0. 0.94 0.06]\n", 21 | " [ 0. 0. 1. ]]\n" 22 | ] 23 | }, 24 | { 25 | "data": { 26 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVoAAAEpCAYAAADS5+oZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xe8XFW5//HP94TQOwRCEaQEEKWEEkAwAem9KFXpUkVR\nlKtcI02qP2wgSL0BVAx4FQUBKV4kdEIKHRI6BAgSQAiJISTP74+1TphMTpkzc+bM7HO+b17zYvbe\na/ZeM0meWfPsVRQRmJlZ/bQ0ugJmZr2dA62ZWZ050JqZ1ZkDrZlZnTnQmpnVmQOtmVmdOdBa3Uha\nUNLNkt6XdH0N5zlI0t+7s26NImkrSc80uh7Ws+R+tCbpIOC7wDrAB8B44JyIuL/G834dOAHYIvrA\nXzRJs4E1I+LFRtfFmotbtH2cpJOAnwNnAcsBqwAXA7t3w+lXBSb0hSCbdfg+JfXrqYpYk4kIP/ro\nA1gc+BDYp4My8wO/BCYBrwO/APrnY8OA14CTgMm5zKH52OnADOBjUiv5cOA04Lcl514VmA205O3D\ngBdy+ReAA/P+Q4F7S173ReAR4D3gYVKLufXY3cCZwH35PH8Hlm7nvbXW/+SS+u8J7Aw8B7wDnFJS\nflPggXzdScBFwHz52D35vUzN19235Pz/BbwJXNO6L79mdWAKsGHeXhF4Gxja6L8bfnTvwy3avm0L\nYAHgLx2UGQ4MAdYHNsjPh5ccHwgsRgoS3wAukbRERJwOnAOMjIjFI2JELl/e6gsASQsDvwJ2jIjF\nScF0fBvllgL+Rgr+y5AC/y15f6sDScF5QH5/3+/g/Q0kfZmsSPoiuAL4GjAYGAr8WNKquews4DvA\n0qTP7svA8QARMSyXWS+/3z+WnH9J0i+Fo0vfS6QUw38Bv5O0EDACGBERozqorxWQA23ftgzwTkTM\n7qDMQcAZETElIqYAZwAHlxz/GPhJRMyKiNtILbq1q6zPLGA9SQtGxOSIaOum0a6kdMR1ETE7IkYC\nzzJ3qmNERLwQETOAG4ANO7jmx6R89CxgJLAs8MuImBYRTwNPk75giIixEfFIJK8Cl5NaqKXUxns6\nLSJm5vrMJSKuAp4ntcyXZ+4vMeslHGj7tinAspI6+nuwIvBqyfYred+cc5QF6mnAol2tSERMA/YH\njgPezL0V2grYK+Y6lHoFWKlk+60u1GdKRLS2sqfn/79dcnx66+slDcr1elPS+8DZpMDckX9FxMxO\nylwJfB64qIKyVkAOtH3bg6Q86l4dlJlEyqW2WhV4o8rrfQQsXLK9QunBiLgzInYg/dx+jtRiLPcG\n8Nmyfavketbbb4BngDUiYkngR8zbgi3X2Q2yRUhpkKuA0yUt2R0VtebiQNuHRcQHpLzkxZL2lLSQ\npPkk7SzpvFxsJDBc0rKSlgV+DPy2ykuOB4ZK+oykJYAfth6QtJykPXKudiYpBdFWSuNWYJCkAyT1\nk7Q/8Dng5irr1BWLAR9ExDRJ65Ba36XeIt3g6ooLgUci4mjSe7us9mpas3Gg7eMi4uekXgPDST+Z\nXyXd4Gm9QXYW8CjwOPBYfn52R6fs4Fp3Adfnc41m7uDYkusxiXS3fyjzBjIi4l1gN9INrnfy/3eN\niPc6u36F2rxZl30f+JqkD0gBcWRZ2dOBayW9K+mrnV1I0h7ADuQbaqT3P1jSgdVU3JqXByyYWZ8j\n6SrSF/bkiFg/7zsNOIpPc/T/HRHzjEiUtBMp3dMCXBUR53d6PQdaM+trJG1FSk9dWxZoP8y/8tp7\nXQswAdiWdL9gNHBARDzb0fWcOjCzPici7iMNPCnX2c3NIcDEiHgl9xAZSRrk0iEHWjOzT50gabyk\nK/MN23IrkUb7tXqdubsWtsmB1swsuQRYPSI2JPUgaTeF0FXzddeJ+gJJTmibVSkiOvtZXjHNv3gw\n88NKi0+OiIGdFYqIf5VsXkHbXQYnkfptt1qZCvpwO9B20UJfuarRVQBg5tN/pf+6naaG6u7dkUc0\nugpznHXm6Qw/9fRGV6OpNMtnslD/bouxycwPWXDwtyoq+p9xFy3fziFRkpOVNDAiWkcV7gM82cZr\nRgNr5vkv3gQOIM2t0SEHWjMrJlUfvCVdB2wNLCPpVdLAnW0kbUgaKPMycEwuuwJwRUTsFhGzJJ0A\n3MGn3bs6ncjdgdbMiqnDKTo6FhEHtbF7RBv7iIg3SX1uW7f/ThcnTnKgLaiWAdVOkNV7DR22daOr\n0HR69WfSUpx51B1oC6rfgHUaXYWm06uDSpV69WdSQ+qgpznQmlkx1ZA66GkOtGZWTG7RmpnVmXO0\nZmZ15tSBmVmdOXVgZlZnbtGamdVZP+dozczqyy1aM7M6c47WzKzO3KI1M6uz2mbvamtxxjNJy9LM\nBiYDh5VMm1j62peBf+dyMyNiSGfXK85XgplZqZZ+lT3aNgLYsWzfTyNig4gYDNxCmjqxLbOBrSNi\ncCVBFtyiNbOiqm2axPvy5N2l+6aWbC5CCqhtXpkuNlIdaM2smOpwM0zSWcAhwPvANu0UC+BOSbOA\nyyPiis7O69SBmRWTWip7dEFEDI+IVYDfA+2tlbNlRGwE7AJ8U9JWnZ3XLVozK6Z28q+zpkxk9pSJ\ntZ79OuBW4PTyA3nFBSLiX5JuBIYA93V0MgdaMyumdlqr/ZZdm37LfroCyayJt7V7BuZenHHNiHg+\nb+4FzLMWmKSFgZaImCppEWAH4IzOqupAa2bF1P2LM+4qaW1gFvAKcGwuO2dxRmB54EZJQYqfv4+I\nOzq7ngOtmRVTAxZnjIiXgA27ej0HWjMrJk/8bWZWZ57rwMysvuRAa2ZWXw60ZmZ1ppbiBNpeMzJM\n0qGSBja6HmbWMyRV9GgGvSbQAocBKzW6EmbWMxxou4mkhSX9TdI4SY9L2lfSRpL+KWm0pNskDZT0\nFWAT4HeSxkpaQNK2+fljkq6U1D+f8zxJT0oaL+mned9ukh6SNEbSHZIGNPJ9m1nnihRomz1HuxMw\nKY/IQNLiwG3AHhExRdJ+wNkRcaSkE4CTImKcpAVInY+3iYgXJF0DHCfpd8BeEbFOyfkA7o2IzfO+\nI4EfAN/vyTdqZl3UHDG0Is0eaJ8ALpB0Lmki3veAL5CmKGudE/KNkvKtH/3awIsR8ULevgY4HrgY\nmC7pyny+v+Xjn5F0A7AC0B94qb0KzXz6r3OetwxYm34D1qnpDZr1RqPu+Sej7vlnXa/R0tLUP8jn\n0tSBNiImSmqdjuwnwN3AkxGxZQUvn+f7LiJmSRoCbAvsC5yQn18EXBARt0gaRvszq9N/3T27/kbM\n+pihw7Zm6LCt52yf/ZNO513psmZJC1Siqb8S8mQO0yPiOuACYDNggKTWn/nzSVo3F/8AaE0FPAes\nKmn1vH0wcE+eeWfJiPg7cBKwfj6+OJ+2jA+t53sys+5RpBxtUwdaYD3gEUnjgFOBHwNfBc6XNB4Y\nB2yRy14DXCppbN4+AvhfSY+RZuO5lBRQ/5b3jQK+m8uekcuOBv5V/7dlZjVThY+2XipdJWmypMdL\n9v1U0jP5RvmfSu7hlL92J0nPSpog6QcVVTUiuvDO+jZJsdBXrmp0NZrKuyOPaHQVrAAW6i8iotua\nl5Ji2cNGVlT2nasPmOfaeVWEqcC1Javgbgf8X0TMlnQeEBFxStnrWoAJpJTjG8Bo4ICIeLajOjR7\ni9bMrE21pA4i4j7SzfXSfXdFROuCjA8BK7fx0iHAxIh4JSJmAiNJS5R3yIHWzIqphtRBBY4gdSUt\ntxLwWsn261QwUKqpex2YmbWnvdbqx28+xcdvPlXLeX8EzMw34buFA62ZFVJ7/WgXXGk9FlxpvTnb\n08b9b8XnlHQYqTvpl9spMglYpWR75byvQw60ZlZI3dB1q3xxxp2Ak4GhETGjndeMBtaUtCrwJnAA\ncGBnF3KO1syKqbbuXdcBDwBrSXpV0uGkgUuLkkaejpV0SS67gqS/QRr0RBrodAfwFDAyIuZZLbec\nW7RmVki1tGirXZwxb/+dNMy/Yg60ZlZIzTLqqxIOtGZWSEVaYcGB1swKyS1aM7M6c6A1M6szB1oz\nszpzjtbMrM7cojUzqzMHWjOzOitQnHWgNbNianGO1sysvoqUOvCkMmZWSFJlj7Zf2+aaYUtJukPS\nc5Jul7REO699WdJjksZJeqSSujrQmlkhtbSookc7RgA7lu37IXBXRKwN/B9wyjyvSmYDW0fE4IgY\nUlFdKylkZtZsagm0ba0ZRlr765r8/Bpgr3YuLboYOx1ozayQakkdtGO5iJgMEBFvAcu1Uy5Ic9aO\nlnRUJSf2zTAzK6QeuBkW7ezfMiLelDSAFHCfyS3kdjnQmlkhtRdop748nqkvP1bNKSdLWj4iJksa\nCLzdVqE8ETgR8S9JN5KWIHegNbPep70G7WKrbchiq204Z/vtUb9t9xTMvdjNTcBhwPnAocBf572m\nFgZaImKqpEWAHYAzOqurc7RmVki13AxrZ82w84DtJT0HbJu351ozDFgeuE/SOOAh4OaIuKOzurpF\na2aFVIc1wwC2a6PsnDXDIuIlYMPyMp1xoDWzQirQwDAHWjMrpiINwXWg7aJ3Rx7R6Co0laU2PaHR\nVWg6r4z6RaOr0Cd4UhkzszorUIPWgdbMismpAzOzOitQnHWgNbNico7WzKzOnDowM6szB1ozszor\nUJx1oDWzYnKO1syszoqUOvDsXWZWSDUuzniipCfy49vtlLlQ0kRJ4yV1eSKZUg60ZlZILVJFj3KS\nPg8cCWxCmolrN0mrl5XZGVgjIgYBxwCX1lTX9g5IWryjRy0XNTOrVQ0t2s8BD0fEjIiYBYwC9ikr\nsydwLUBEPAwsIWn5auvaUY72KdKaOaVVbd0OYJVqL2pmVqt+1d8MexI4S9JSwAxgF2B0WZmVgNdK\ntiflfZOruWC7gTYiPlPNCc3MekK1N8Mi4llJ5wN3AlOBccCsbqzaPCrqdSDpAGD1iDhH0srA8hEx\npp4VMzPrSHtxdspzY5gyYWyHr42IEcCIdB6dzdytV0gt2NLG5sp5X1U6DbSSfg30B4YC5wDTSInh\nTau9qJlZrUTbkXbZtTdh2bU3mbP9/C1XzvtaaUBexXYVYG9g87IiNwHfBK6XtDnwfkRUlTaAylq0\nX4yIjfJiZETEu5Lmr/aCZmbdoYYcLcCfJC0NzASOj4gPJB0DRERcHhG3StpF0vPAR8DhtVyskkA7\nU1IL6QYYkpYBZtdyUTOzWtUyXiEihrax77Ky7W5bPqSSQHsx8CdggKQzgP2oYB1zM7N6aquPbLPq\nNNBGxLWSxvDpMrz7RsST9a2WmVnHChRnK57roB8plxF4NJmZNYEiTSrTadCU9CPgD8CKpC4O10k6\npd4VMzPrSLVDcBuhkhbtIcDgiJgGc/qcjQPOrWfFzMw60hwhtDKVBNo3y8rNl/eZmTVMkaZJbDfQ\nSvoFKSf7LvCUpNvz9g7MOy7YzKxHFShF22GLtrVnwVPALSX7H6pfdczMKlOkm2EdTSpzVU9WxMys\nK3pF6qCVpDWAs4F1gQVb90fEWnWsl5lZhwrUoK2oT+zVpFluBOwM3ABcX8c6mZl1SlJFj2ZQSaBd\nOCJuB4iIFyJiOCngmpk1TD+pokczqCTQzsiTyrwg6VhJuwOL1blebZJ0hqQvV/G6YZJurkedzKwx\nalyccS1J4ySNzf//d/kijTluvJ/LjJU0vNq6VtKP9rvAIsC3SbnaJYAjqr1gJSQpIqJ8f0ScVsNp\n5zlfB9fvl9cSMrMmVUtaICImAIPzeVqA14Eb2yg6KiL2qPpCWSWTyjycn34IHFzpiSWdC7wWEZfk\n7dNIy0aINAPY/MCNEXGGpFWB24GHgY2AXSSdCWxMCpD/ExG/kjQCuDki/ixpU+CXpC+B/wDbAp8A\nvyGtbjkT+F5E/LOsXksB/wOsTppn8uiIeDLXb428/xXga5W+VzPred2YFdgOeCEiyldZgG4agNbR\ngIUb6aAVGBHlq0aWu54UCC/J2/sB5wFbRcQQpa+jmyRtRVpGYhBwcESMlrQRsFJErJ/rMtequ5L6\nAyNJM4mNlbQoKdieCMyOiPUlrQ3cIWlQWb3OAMZGxN6StgF+S/5mI62OuWVEfNzJezOzBqtx4u9S\n+5Pmc2nLFpLGk5axOTkinq7mAh21aH9dzQlbRcR4SQMkDQSWI40wWx/YXtJY0jfFIqQA+xrwckS0\njjh7EVhN0q+AW4E7yk6/NvBGRIzN15oKkIP2hXnfc5JeBsq7oW1FXlo4Iu6WtHQO1AA3OciaFUN3\n9CjIjbY9gB+2cXgMsEpETJO0M/AX5o0nFelowMI/qjlhmT8C+wIDSS3cVYFzI+KK0kI5dfBRybXf\nl7QBsCNwbD7HN8rOXcmn3NU/iY86K3DWmafPeT502NYMHbZ1Fy9h1vvdf+89PHDvPXW9Rnt38l9/\n8hEmPflIpafZGRgTEf8qP9DagMvPb5N0iaSlI+Ldrta10vloq3UDcAWwDDCM1KI9U9J1EfGRpBVJ\nuVQoCYp5uZyPI+JGSRNIP+9LPQcMlLRxRIzJLdLpwL2k3Oo/Ja1FWsXyOeCLJa+9F/g6aV33rYF3\nImJqpd+Ow089veI3b9ZXbfmlYWz5pWFzti8476xuv0Z7/2Y/s95mfGa9zeZsj77hkjbLZQfSTtpA\n0vKtCzJKGgKomiALdQ60EfG0pMWA13OF75S0DvBg/pA+JAW92cydD14JGFGyVllrsz7yeWdK2h/4\ntaSFSCvzbkfKB/9G0uOkAH5oLltardOB/5H0GKkFe0j3v3Mzq7f5alyCQNLCpLhxdMm+OQs0Al+V\ndBwplkwn5XKru1Ybvajaq9QCETGj2gv1BpJi+syKe4n1CUtt2m3r1/Uar4z6RaOr0HSWX3x+IqLb\n7l5JipNueraisj/fY51uvXY1KllhYYikJ4CJeXsDSRfVvWZmZh1oUWWPZlBJ4/tCYDdgCkBEPAZs\nU89KmZl1ppaRYT2tkhxtS0S8Upbn9KgpM2uoZlkPrBKVBNrX8h23kNQP+BYwob7VMjPrWL/ixNmK\nAu1xpPTBKsBk4K68z8ysYXpVizYi3gYO6IG6mJlVrEBxtqIVFq6gjTkPIuLoNoqbmfWIZulRUIlK\nUgd3lTxfENibNDeBmVnDdOOkMnVXSepgrmVrJP0WuK9uNTIzq0CB4mxVQ3BXA5bv7oqYmXWFumeq\n2B5RSY72PT7N0baQpjtsa0oxM7Me02tatHly7g1Ik95CmlTbg/3NrOGKlKPtcAhuDqq3RsSs/HCQ\nNbOmUOtcB5KWkPRHSc9IekrSZm2UuVDSREnjJW1YdV0rKDNe0uDOi5mZ9ZxumOvgV6SG5OdIv9yf\nmfv82hlYIyIGAccAl1Zb147WDJsvIj4hrac1WtILpPlbRWrsblTtRc3MalXLyLC8DuGXIuIwgBzr\nPigrtidwbT7+cG4Bz5kMvCs6ytE+QlqRtualds3Mulu/2ib+Xg14J6+svQHwKHBiREwvKbMSc48Z\nmJT3dWugFUBEvNDVk5qZ1VtLO927Jox9iInjHurs5fORGpLfjIhHJf2S1JvqtG6tZMnF2jNA0knt\nHYyIn9ehPmZmFWkvc7D2xpuz9sabz9m+bcSv2ir2OvBaRDyat/8X+EFZmUmkdQdbrcynPbC6pKPG\ndz9gUWCxdh5mZg1TS6+DnGd9LS/iCrAt8HRZsZvIawpK2hx4v5r8LHTcon0zIs6s5qRmZvXWDdMk\nfhv4vaT+wIvA4aWLM0bErZJ2kfQ8qSPA4dVeqNMcrZlZM6p1wEJelmvTst2XlZXpltVHOwq023bH\nBczM6qFXzEcbEe/2ZEXMzLqitt5dPaua2bvMzBpOBWrSOtCaWSH1c6A1M6uv4oRZB1ozK6gCNWgd\naM2smJyjNTOrM+dozczqrDhh1oHWavTe6F83ugpN5ytXPtLoKvQJTh2YmdVZkQYsFKmuZmZzSKro\n0cHrWySNlXRTG8eGSXo/Hx8raXgtdXWL1swKqRsWwT2RNDXi4u0cHxUR3bLCjFu0ZlZILaiiR1sk\nrQzsAlzZwSW6LQnsQGtmhVTjKri/AE4GooNLbJGXGb9F0rq11NWB1swKSRX+N8/rpF2ByRExntRq\nbSscjwFWiYgNgV8Df6mlrs7RmlkhtTdg4fFH7ufx0fd39NItgT0k7QIsBCwm6dqIOKS1QERMLXl+\nm6RLJC1d7fSxiuio5WylJMX0mf68rGPuRzuvW4/bjIjotpynpPj7U29XVHanzy/X7rUlDQO+V37T\nS9LyreuDSRoC3BARn622vm7Rmlkhdfd4hdL1woCvSjoOmAlMB/av5dwOtGZWSG3lX7sqIu4B7snP\nLyvZfzFwcc0XyBxozayQPKmMmVmdFSjOOtCaWTF1R+qgpzjQmlkhdcMQ3B7jQGtmhdRSoNyBA62Z\nFVJxwqwDrZkVlFu0ZmZ1Vpww60BrZkVVoEjrQGtmheTUgZlZnRUnzDrQmllRFSjSeuJvMyukaif+\nBpC0gKSHJY2T9ISk09opd6GkiXmlhQ2rratbtGZWSLWMDIuIGZK2iYhpkvoB90u6LSLmTCYsaWdg\njYgYJGkz4FJg86rqWn1VzcwaSBU+2hER0/LTBUiNzvJZ/fcErs1lHwaWkLR8NVV1oDWzQqoldQAg\nqUXSOOAt4M6IGF1WZCXgtZLtSXlflznQmlkh1bgKLhExOyIGAysDm9W60m1HnKM1s0JqL4iOfvBe\nHn3w3orPExEfSLob2Al4uuTQJOAzJdsr531d5kBrZoXUXlpgyBZDGbLF0Dnbl/3yvHlfKy0LzIyI\nf0taCNgeKC94E/BN4HpJmwPvty7Y2FVNkTqQtIKkG6p43eWS1umkzDGSvl597cysGdWYOlgBuFvS\neOBh4PaIuDXHi6MBIuJW4CVJzwOXAcdXW9emaNFGxJvAfuX7JfWLiFkdvO7oCs59WWdlzKx4ahmv\nEBFPABu1sf+ysu0TarjMHD3eopV0rqTjS7ZPk/Q9SU/k7UMl/VXSP4C7lFwi6WlJt0u6RdI+uezd\nkjbKzz+UdFbuWPyApAEl5z8pP19D0p25zKOSVpO0iKS78vZjkvaYp9Jm1nQkVfRoBo1IHVzP3K3X\n/YCHmLsP22Bgn4jYBtgHWCUi1gUOAbZo57yLAA9ExIbAvcBRbZT5PXBRLvNF4E3Smu17RcQmwJeB\nn1X7xsys59Ta66An9XjqICLGSxogaSCwHPAu8HpZsTsj4t/5+VbAH/NrJ+e7g22ZkXMqAGOA7UoP\nSloUWDEibsrn+jjvnw84V9JQYDawoqTlIuLtmt6omdVVk8TQijQqR/tHYF9gIKmFW+6jKs45s+T5\nLNp+b2392XwNWBYYHBGzJb0ELNjeRc468/Q5z4cO25qhw7auoqpmvduUCWOYMmFsfS9SoEjbqEB7\nA3AFsAwwjA4CG3A/cIika0kt4K1JKYByHX7sETFV0muS9oyIv0qaH+gHLAG8nYPsNsCqHZ1n+Kmn\nd3TYzIBl1tqYZdbaeM7287dc2e3XKNJy4w3p3hURTwOLAa9X0C/tT6TUwlOkccdjgNa0Qmlet3yc\nclsOAb4t6TFSAF+eFLQ3zfu+DjxT6fsws8ZpUWWPZqCISuJTY0laJCI+krQ0qc/blo3IoUqK6TOb\n//OyxvrKlY90XqiPufW4zYiIbgt7kuK5tyrLMK49cJFuvXY1mqIfbQX+JmlJoD9wpm9UmVmRUgeF\nCLS5m5eZ2RzN0nWrEoUItGZm5RxozczqzKkDM7M6K1KLtilm7zIz66paVrKRdJWkyZIeb+f4MEnv\nSxqbH8NrqatbtGZWSDVOGDMCuIi8Jlg7RkVEt0wy5UBrZoVUS5yNiPskdTgKlG4c5OvUgZkVUo2L\n4FZiizyl6i21rifmFq2ZFVKdb4aNIU3POk3SzsBfgLWqPZkDrZkVUns52gfuu4cH7xtV07kjYmrJ\n89vy4gNLR8S71ZzPgdbMCqm9Bu2WWw1jy62Gzdn+xflndXSKNk8jafnWCa8kDSHNC1NVkAUHWjMr\nqFpSB5KuI025uoykV4HTgPmBiIjLga9KOo40z/V0YP9a6upAa2aFVMvIsIg4qJPjFwMXV32BMg60\nZlZMBRoZ5kBrZoXULJN6V8KB1swKyZPKmJnVW3HirAOtmRVTgeKsA62ZFVNLgeZJdKA1s0IqUJz1\npDJmZvXmFq2ZFVKRWrQOtGZWSM7RmpnVWXHCrAOtmRVVgSKtb4YV1Kh7/tnoKjQdfybzmjJhTKOr\nUDeq8L82XyvtJOlZSRMk/aCdMhdKmphXWdiwlro60BaUg8q8/JnMa8qEsY2uQt1IlT3mfZ1agF8D\nOwKfBw6UtE5ZmZ2BNSJiEHAMcGktdXWgNbNCqjbQAkOAiRHxSkTMBEYCe5aV2ZO8Qm5EPAwsIWn5\nauvqQGtmhVRD6mAl4LWS7dfzvo7KTGqjTMV8M6yLFurfPBn4s39yRqOr0HT8mczr+VuubHQV6uGV\nhefvdLnwVpPrWpMKONB2QUQ0T5Q168Mi4rM1vHwSsErJ9sp5X3mZz3RSpmJOHZhZXzMaWFPSqpLm\nBw4AbiorcxNwCICkzYH3WxdrrIZbtGbWp0TELEknAHeQGptXRcQzko4hL84YEbdK2kXS88BHwOG1\nXFMRUXvNzcysXU4dmJnVmQOt9UlSgWYkscJzoO2FJDn33gFJipwzk3SIpC0bXadG8RdOz/A/yF5G\n0vHAZpJeBu6KiHsbXKWmUxJk9wAOI9117nNav3AkbQ+sBcyIiF7Z6bbR3KLtRSR9E9iXNI57CHCO\npN0bW6vmJGkIcATwSES8nff1qdZdDrK7AL8EJgA/k3SepH4Nrlqv40DbS0haHFgK2AP4Yt59DXCy\npF0bVrEm0UYQfQd4Hvh8a+ogB54+E2wlLQ2cCOxPigUTgZ2AS/PEK9ZN3L2rF5C0YUSMl7QEMBC4\nBNgNWAz4M/ABqaU7LfrgH3hZTnY3IIApwOPAf5NSaH+NiAcbV8ueUZIuWDoi3pW0DOnvzNURsamk\nFUlj/88GTu2Lf1/qwd9aBSfpROBMSStHxL9Jf6bTScFkO+AJ4LCI+KgP/6MRgKRjgXOATUhfQPsA\nvwJmAAcu2AsiAAAMKklEQVTldEKvVRJkdwP+IGmFiJhC+qJ5VdICwHLAdcAdffjvS7fzzbACk7Qn\ncBCwY0S8L2lgHuEyCbge+AKwd2sOsq/Jc4w+FxGzc0vtAOCgiHhS0o3AX4GpwG9I+dqXGlfb+stB\ndkvgLODbEfFmPvQh8BYwAtiS9MV8b+kvAauNA20BSWqJiNnAqsBYYFBupews6ZOI+GIOLB9HxDsN\nrWyDSFoU+D4wW9IxEfFG7omxoKR+EfG4pO8Bu0XEXyRdEBEfN7TSdZDnUN0oIm7Lu1YGboiIUZIW\niojpEfGipEuBZYFLIuI++LR3htXOqYNiWiL//3fAmqQWyjPA1sBrOWf7Rl8Nstk0Uu+LWaS76pBm\nXzqJTz+/ZYAF8o2fmT1ew56xFfC8pCUl9QfmB3YHiIjpAJK2ABaKiLtbg6x1L98MKxhJR5Nmf38Z\nGB8RV5Qc2xM4F9i25Gdhn1J246sF+BxwMjApIn4k6Tekmz8f5mOHR8STDatwD8i9C84EHoyI30v6\nPenL5hukpVwuA46OiP9rYDV7NQfaApH0FeB0Uj5xLVILdgownHRj5wxg394eONpTFmRXI/36fVnS\nuqSW7FsRMVzS54EVScuZvNy4GtdP2WcxPymorgvcDdxMyksvSUoXnB8Rtzaqrn2BA20TK78ZIelw\nYPGI+JWkhUgtsu8Ap5F+Ki8YEa80prbNQ9J3+bRv6FOk1MrCpM/qE+DYvpB/lPQlUiB9Nt8kPQzY\nDLg9Iv6SyywVEe/5xld9OUfbpHI+bbv8/ARJWwPvAd+U9Ll8E2MsaZDCshEx2UF2Tr5xf2B70sCN\nT4CTIuIJ4BfAf4CqF9lrdq0DDSRtCvyW1H/6h5IOi4irgQeAPSUdnAdnvA++8VVv7nXQvPoBe0s6\nHVgc2D3/DF4duEjSWcAAUr/HNxpXzcZqoyU2ldThfr6I+CT3nX1Y0pERcZWkk3tp74IFImJG7sq2\nHSmVtFceyLIHsI8kIuLqPOnQWAfXnuNA26Qi4j+SRgI7APeQehPMR1pf/hNS16UZwFERUfVaRkVW\nloc8FBhHSqF8DGwgaVxE/FvSn0ktWXppkF0WOEXSaRExlZRSOha4DRgP3EsawHKwpPk8cUzPc462\nSeV/PP1JQfV8UkvtnIh4S9LCETFNUv9I69L3aXkynaOB/SPiWUlHAruQ5jKYQUol7BERzzWwmnWV\nf+nMBpaKiHGSvk8aXrxZREyUtBQwDHgpIh5rZF37IgfaJpQDx66kQPEMcC1pgpjnSf099yblHz/s\niz//8vj8f+fUwArASOCQ0hy1pB2AlYBBpHH8ExpT2/rKgy9m5eenAtsCJ+aUwcnAd4HtIuLp3Jr9\npJH17at8M6zJSDqAdAPjaGBpYFhEfETqnvNh3ndQRHzQR4PsmsAxwHz5xs8nwAKkG4Xk8fqQcpAj\nIuK/e2uQhTkLDa4pabOIOBO4HThL0uCI+H+kCYbul7QIqcVrDeAWbRPJw0Z3AF4BNga+CuySW26r\nRcRLbpWkLknAZ4HlIuJ2SZeR0ixH58/qCNKX1d6kyax73V/ykglivkTqP70gcFxEPCZpOLAp8JOI\neFTS6hHxYkMr3Mc50DYJpZURFiDdtDmfNCF1a/euo0hDbU+NiBmNq2Xj5K5IpasjnEEKtlcBbwLf\nAr5E6oy/O3Bwbx+4IWlb4ALSlIZHknpbXB4Ro3OvlI2B/YCpvfHLpkgcaJuA0nryR5Jm2pok6XzS\nKJ5vkuaVPYaULniqgdVsmLLeBXsDkyPigdxyWxH4E2nE076kXgfPRsTEhlW4h0i6APhXRJyfUyZn\nAYOB7+WW7aC+8DkUgQNtg+URXn8gDYkcQ0oXrERay+pu0k/CM/pqkC0l6STgQNKNr2fyvu8Da5Om\nhbynL/TCUJqpTcCipGHYP4mI13P3v3HAXcCPI2KqR3w1B98Ma7BIMyjdCpxHmg90ddIsU9fhlqxK\nnn+B9CX0RdJsVNtJOjQiLiBNsLMbKU/bq0nahDRJzlvAk6T+sV/OczusRkqjbEG6meoRX03CAxaa\nw7WklsgLkZYXOYi0uKL66o2vsnTB7qQ5C94gdeV6izSGf1lJy0TE2ZKWjYhpjatxfeQAumFE3Ji7\nsn0X+CgiRufj/wA2Bw4lfSb7kVaQGNigKlsb3KJtAhHxn/wP5/3c2f4U4Fu9MXBUqiTI7kqanWwa\n6e76a8CvI2J/0hfUIrl8b517d2ngdUmLRZr68h/AMvnvCRHxR9LNsMOAHYE1SH9//t6Y6lpb3KJt\nLguS+jru15qD7MskbQ5cTfrSeYvUkv1OPvYN4HjgkIZVsAdExJjcqh0j6fw8X8NMYKikjyPitxHx\nLvCupCWB44AD+2q6qVn5ZliT6cs3L8rfu9I8qtcC6wODI2JGvnm4CukO+5mRZuXqtSQtBxxFSpsc\nReq+dbWkr5GGGd8REdeUlJ+/N87nUHRu0TYZB1mQtCMpJTCedFPnHOAmSXvnOR5eIvU8mN64GveY\nKcAGpOkwjwVGSJoZaaWEfqTcfqle3+uiiNyitaaSu2vtDjxKunt+CvAwaRDH5sDWfSHAKi2uuXBE\nPJ8nGBoB/D9SaulqUmv+2gZW0brAN8OsaSgtOfOFiBhG6uL2AXAfqZV2Cmm6vwGNq2HPyPMSnAL8\nTGlVjdbPYeVIiyceQy9fGr23cYvWmoLSigBfIi2hPoD0U3mPiJgpaT/grnzTp0+QtDgpZfAz4EbS\nFIeDSHNfPJfL9Nl8ftG4RWsNlwcmDCMNRphEWmrmpBxkDwN+TOqR0Wfk2dnuBfYCRgMTSJ/LIiVl\nHGQLwi1aa6iSScznI60I8B6pr+wawNvAlqTubn2+u5KktXrzlI+9mQOtNYykbUhj9UdHxN8kbQ+s\nR+psP4DUWX9s9PFFJyW1RMTskm2nDArG3buskV4htV5/KmkQaRLvPYD7IuKehtasiZQG2bztIFsw\nztFaw0TEi5EWCtyLNBPV8sBQ4HuS+pdOKmNWZE4dWFPI86mKtLrvDc5FWm/iQGtNwXlH680caM3M\n6sw5WjOzOnOgNTOrMwdaM7M6c6A1M6szB1ozszpzoLWqSJolaaykJyRdL6nqSV8kDZN0c36+u6T/\n6qDsEpKOq+Iap+XlyivaX1ZmhKR9unCtVSX16pUfrGscaK1aH0XERhGxHmm+2GPLC3RxZFcARMTN\nEfHTDsotRVorrNm536TN4UBr3eFeYM3ckntW0jW5RbeypO0lPSDp0dzyXRhA0k6SnpH0KDCntSjp\nUEkX5efLSfqzpPGSxuXFGs8F1sit6fNzue9LeiSXO63kXD+S9JykUcDanb0JSd/I5xkn6Y9lrfTt\nJY3O72/XXL5F0k8lPZyvfVTNn6T1Sg60Vi0B5OkNdwZafyoPIi0Hvh5pifDhwLYRsQkwBjgpD7e9\nHNg17x9Ydu7W1uCFwD8jYkNgI+Ap4IfA87k1/YM849egiBgCDAY2kbSVpI2A/UgLO+4KbFrBe/pT\nRAyJiMHAs8CRJcdWjYhNgd2AS/PCkUcC70fEZsAQ4GhJq1ZwHetjPHuXVWshSWPz83uBq4CVgJcj\nYnTevzmwLnB/TiP0Bx4E1gFejIgXc7nfkVZ4Lfdl4GCYM2PVh5KWLiuzA6m1OZYU/BchBfvFgRsj\nYgYwQ9JNFbyn9SX9BFgyn+f2kmM35Ho8L+mF/B52ANaTtG8us3i+9sQKrmV9iAOtVWtaRGxUuiOn\nZD8q3UVaDvtrZeU2yMc6U0meU8C5EXFF2TVOrOC15UaQls95UtKhpFUf2qqL8raAb0XEnWXXdqvW\n5uLUgVWrvUBZuv8hYEtJa0BaTSHPO/sssKqk1XK5A9s51z/IN75yPnRx4ENgsZIytwNH5AUNkbSi\npAHAKGAvSQtIWoy0sm5nFgXektQf+FrZsX2VrAGsBjyXr318Tp8gaZCkhdr4HKyPc4vWqtVea3PO\n/oh4J6/59Yeclw1geERMlHQMcKukj0iph0XbONd3gMslHUmaFPy4iHg431x7HLgt52k/BzyYW9Qf\nAl+PiHGSbgAeByYDj1Twnk7N5d4mLXFeGtBfzccWA46JiI8lXQl8FhibUyNvk+bW7ejzsT7Is3eZ\nmdWZUwdmZnXmQGtmVmcOtGZmdeZAa2ZWZw60ZmZ15kBrZlZnDrRmZnXmQGtmVmf/HyCXw6jXSP5s\nAAAAAElFTkSuQmCC\n", 27 | "text/plain": [ 28 | "" 29 | ] 30 | }, 31 | "metadata": {}, 32 | "output_type": "display_data" 33 | }, 34 | { 35 | "data": { 36 | "image/png": "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\nEAdUM7MG+X9BlxvWQkyR8QAAAABJRU5ErkJggg==\n", 37 | "text/plain": [ 38 | "" 39 | ] 40 | }, 41 | "metadata": {}, 42 | "output_type": "display_data" 43 | } 44 | ], 45 | "source": [ 46 | "%matplotlib inline\n", 47 | "import numpy as np\n", 48 | "import matplotlib.pyplot as plt\n", 49 | "\n", 50 | "from sklearn import svm, datasets\n", 51 | "from sklearn.cross_validation import train_test_split\n", 52 | "from sklearn.metrics import confusion_matrix\n", 53 | "\n", 54 | "# import some data to play with\n", 55 | "iris = datasets.load_iris()\n", 56 | "X = iris.data\n", 57 | "y = iris.target\n", 58 | "\n", 59 | "# Split the data into a training set and a test set\n", 60 | "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)\n", 61 | "\n", 62 | "# Run classifier, using a model that is too regularized (C too low) to see\n", 63 | "# the impact on the results\n", 64 | "classifier = svm.SVC(kernel='linear', C=0.5)\n", 65 | "y_pred = classifier.fit(X_train, y_train).predict(X_test)\n", 66 | "\n", 67 | "\n", 68 | "def plot_confusion_matrix(cm, title='Confusion matrix', cmap=plt.cm.Blues):\n", 69 | " plt.imshow(cm, interpolation='nearest', cmap=cmap)\n", 70 | " plt.title(title)\n", 71 | " plt.colorbar()\n", 72 | " tick_marks = np.arange(len(iris.target_names))\n", 73 | " plt.xticks(tick_marks, iris.target_names, rotation=45)\n", 74 | " plt.yticks(tick_marks, iris.target_names)\n", 75 | " plt.tight_layout()\n", 76 | " plt.ylabel('True label')\n", 77 | " plt.xlabel('Predicted label')\n", 78 | "\n", 79 | "\n", 80 | "# Compute confusion matrix\n", 81 | "cm = confusion_matrix(y_test, y_pred)\n", 82 | "np.set_printoptions(precision=2)\n", 83 | "print('Confusion matrix, without normalization')\n", 84 | "print(cm)\n", 85 | "plt.figure()\n", 86 | "plot_confusion_matrix(cm)\n", 87 | "\n", 88 | "# Normalize the confusion matrix by row (i.e by the number of samples\n", 89 | "# in each class)\n", 90 | "cm_normalized = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n", 91 | "print('Normalized confusion matrix')\n", 92 | "print(cm_normalized)\n", 93 | "plt.figure()\n", 94 | "plot_confusion_matrix(cm_normalized, title='Normalized confusion matrix')\n", 95 | "\n", 96 | "plt.show()" 97 | ] 98 | }, 99 | { 100 | "cell_type": "code", 101 | "execution_count": 4, 102 | "metadata": { 103 | "collapsed": false 104 | }, 105 | "outputs": [ 106 | { 107 | "name": "stdout", 108 | "output_type": "stream", 109 | "text": [ 110 | "Loading 20 newsgroups dataset for categories:\n", 111 | "['alt.atheism', 'talk.religion.misc']\n", 112 | "857 documents\n", 113 | "2 categories\n", 114 | "\n", 115 | "Performing grid search...\n", 116 | "pipeline: ['vect', 'tfidf', 'clf']\n", 117 | "parameters:\n", 118 | "{'clf__alpha': (1e-05, 1e-06),\n", 119 | " 'clf__penalty': ('l2', 'elasticnet'),\n", 120 | " 'vect__max_df': (0.5, 0.75, 1.0),\n", 121 | " 'vect__ngram_range': ((1, 1), (1, 2))}\n", 122 | "Fitting 3 folds for each of 24 candidates, totalling 72 fits\n" 123 | ] 124 | }, 125 | { 126 | "name": "stderr", 127 | "output_type": "stream", 128 | "text": [ 129 | "[Parallel(n_jobs=-1)]: Done 34 tasks | elapsed: 7.8s\n", 130 | "[Parallel(n_jobs=-1)]: Done 72 out of 72 | elapsed: 15.9s finished\n" 131 | ] 132 | }, 133 | { 134 | "name": "stdout", 135 | "output_type": "stream", 136 | "text": [ 137 | "done in 17.706s\n", 138 | "\n", 139 | "Best score: 0.939\n", 140 | "Best parameters set:\n", 141 | "\tclf__alpha: 1e-05\n", 142 | "\tclf__penalty: 'elasticnet'\n", 143 | "\tvect__max_df: 0.5\n", 144 | "\tvect__ngram_range: (1, 2)\n" 145 | ] 146 | } 147 | ], 148 | "source": [ 149 | "# Author: Olivier Grisel \n", 150 | "# Peter Prettenhofer \n", 151 | "# Mathieu Blondel \n", 152 | "# License: BSD 3 clause\n", 153 | "from pprint import pprint\n", 154 | "from time import time\n", 155 | "import logging\n", 156 | "\n", 157 | "from sklearn.datasets import fetch_20newsgroups\n", 158 | "from sklearn.feature_extraction.text import CountVectorizer\n", 159 | "from sklearn.feature_extraction.text import TfidfTransformer\n", 160 | "from sklearn.linear_model import SGDClassifier\n", 161 | "from sklearn.grid_search import GridSearchCV\n", 162 | "from sklearn.pipeline import Pipeline\n", 163 | "\n", 164 | "# Display progress logs on stdout\n", 165 | "logging.basicConfig(level=logging.INFO,\n", 166 | " format='%(asctime)s %(levelname)s %(message)s')\n", 167 | "\n", 168 | "\n", 169 | "###############################################################################\n", 170 | "# Load some categories from the training set\n", 171 | "categories = [\n", 172 | " 'alt.atheism',\n", 173 | " 'talk.religion.misc',\n", 174 | "]\n", 175 | "# Uncomment the following to do the analysis on all the categories\n", 176 | "#categories = None\n", 177 | "\n", 178 | "print(\"Loading 20 newsgroups dataset for categories:\")\n", 179 | "print(categories)\n", 180 | "\n", 181 | "data = fetch_20newsgroups(subset='train', categories=categories)\n", 182 | "print(\"%d documents\" % len(data.filenames))\n", 183 | "print(\"%d categories\" % len(data.target_names))\n", 184 | "print()\n", 185 | "\n", 186 | "###############################################################################\n", 187 | "# define a pipeline combining a text feature extractor with a simple\n", 188 | "# classifier\n", 189 | "pipeline = Pipeline([\n", 190 | " ('vect', CountVectorizer()),\n", 191 | " ('tfidf', TfidfTransformer()),\n", 192 | " ('clf', SGDClassifier()),\n", 193 | "])\n", 194 | "\n", 195 | "# uncommenting more parameters will give better exploring power but will\n", 196 | "# increase processing time in a combinatorial way\n", 197 | "parameters = {\n", 198 | " 'vect__max_df': (0.5, 0.75, 1.0),\n", 199 | " #'vect__max_features': (None, 5000, 10000, 50000),\n", 200 | " 'vect__ngram_range': ((1, 1), (1, 2)), # unigrams or bigrams\n", 201 | " #'tfidf__use_idf': (True, False),\n", 202 | " #'tfidf__norm': ('l1', 'l2'),\n", 203 | " 'clf__alpha': (0.00001, 0.000001),\n", 204 | " 'clf__penalty': ('l2', 'elasticnet'),\n", 205 | " #'clf__n_iter': (10, 50, 80),\n", 206 | "}\n", 207 | "\n", 208 | "if __name__ == \"__main__\":\n", 209 | " # multiprocessing requires the fork to happen in a __main__ protected\n", 210 | " # block\n", 211 | "\n", 212 | " # find the best parameters for both the feature extraction and the\n", 213 | " # classifier\n", 214 | " grid_search = GridSearchCV(pipeline, parameters, n_jobs=-1, verbose=1)\n", 215 | "\n", 216 | " print(\"Performing grid search...\")\n", 217 | " print(\"pipeline:\", [name for name, _ in pipeline.steps])\n", 218 | " print(\"parameters:\")\n", 219 | " pprint(parameters)\n", 220 | " t0 = time()\n", 221 | " grid_search.fit(data.data, data.target)\n", 222 | " print(\"done in %0.3fs\" % (time() - t0))\n", 223 | " print()\n", 224 | "\n", 225 | " print(\"Best score: %0.3f\" % grid_search.best_score_)\n", 226 | " print(\"Best parameters set:\")\n", 227 | " best_parameters = grid_search.best_estimator_.get_params()\n", 228 | " for param_name in sorted(parameters.keys()):\n", 229 | " print(\"\\t%s: %r\" % (param_name, best_parameters[param_name]))" 230 | ] 231 | }, 232 | { 233 | "cell_type": "code", 234 | "execution_count": null, 235 | "metadata": { 236 | "collapsed": true 237 | }, 238 | "outputs": [], 239 | "source": [] 240 | } 241 | ], 242 | "metadata": { 243 | "kernelspec": { 244 | "display_name": "Python 3", 245 | "language": "python", 246 | "name": "python3" 247 | }, 248 | "language_info": { 249 | "codemirror_mode": { 250 | "name": "ipython", 251 | "version": 3 252 | }, 253 | "file_extension": ".py", 254 | "mimetype": "text/x-python", 255 | "name": "python", 256 | "nbconvert_exporter": "python", 257 | "pygments_lexer": "ipython3", 258 | "version": "3.5.1" 259 | } 260 | }, 261 | "nbformat": 4, 262 | "nbformat_minor": 0 263 | } 264 | -------------------------------------------------------------------------------- /exercises/AmazonReviewExercise.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "collapsed": true 7 | }, 8 | "source": [ 9 | "# Amazon Product Data Exercises" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 1, 15 | "metadata": { 16 | "collapsed": false 17 | }, 18 | "outputs": [ 19 | { 20 | "data": { 21 | "text/html": [ 22 | "\n", 23 | "
\n", 24 | " \n", 25 | " Loading BokehJS ...\n", 26 | "
" 27 | ] 28 | }, 29 | "metadata": {}, 30 | "output_type": "display_data" 31 | }, 32 | { 33 | "data": { 34 | "application/javascript": [ 35 | "\n", 36 | "(function(global) {\n", 37 | " function now() {\n", 38 | " return new Date();\n", 39 | " }\n", 40 | "\n", 41 | " if (typeof (window._bokeh_onload_callbacks) === \"undefined\") {\n", 42 | " window._bokeh_onload_callbacks = [];\n", 43 | " }\n", 44 | "\n", 45 | " function run_callbacks() {\n", 46 | " window._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n", 47 | " delete window._bokeh_onload_callbacks\n", 48 | " console.info(\"Bokeh: all callbacks have finished\");\n", 49 | " }\n", 50 | "\n", 51 | " function load_libs(js_urls, callback) {\n", 52 | " window._bokeh_onload_callbacks.push(callback);\n", 53 | " if (window._bokeh_is_loading > 0) {\n", 54 | " console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", 55 | " return null;\n", 56 | " }\n", 57 | " if (js_urls == null || js_urls.length === 0) {\n", 58 | " run_callbacks();\n", 59 | " return null;\n", 60 | " }\n", 61 | " console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", 62 | " window._bokeh_is_loading = js_urls.length;\n", 63 | " for (var i = 0; i < js_urls.length; i++) {\n", 64 | " var url = js_urls[i];\n", 65 | " var s = document.createElement('script');\n", 66 | " s.src = url;\n", 67 | " s.async = false;\n", 68 | " s.onreadystatechange = s.onload = function() {\n", 69 | " window._bokeh_is_loading--;\n", 70 | " if (window._bokeh_is_loading === 0) {\n", 71 | " console.log(\"Bokeh: all BokehJS libraries loaded\");\n", 72 | " run_callbacks()\n", 73 | " }\n", 74 | " };\n", 75 | " s.onerror = function() {\n", 76 | " console.warn(\"failed to load library \" + url);\n", 77 | " };\n", 78 | " console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", 79 | " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", 80 | " }\n", 81 | " };\n", 82 | "\n", 83 | " var js_urls = ['https://cdn.pydata.org/bokeh/release/bokeh-0.11.1.min.js', 'https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.11.1.min.js', 'https://cdn.pydata.org/bokeh/release/bokeh-compiler-0.11.1.min.js'];\n", 84 | "\n", 85 | " var inline_js = [\n", 86 | " function(Bokeh) {\n", 87 | " Bokeh.set_log_level(\"info\");\n", 88 | " },\n", 89 | " \n", 90 | " function(Bokeh) {\n", 91 | " Bokeh.$(\"#34688c87-cc41-4ca0-b982-f0af18496122\").text(\"BokehJS successfully loaded\");\n", 92 | " },\n", 93 | " function(Bokeh) {\n", 94 | " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-0.11.1.min.css\");\n", 95 | " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-0.11.1.min.css\");\n", 96 | " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.11.1.min.css\");\n", 97 | " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.11.1.min.css\");\n", 98 | " }\n", 99 | " ];\n", 100 | "\n", 101 | " function run_inline_js() {\n", 102 | " for (var i = 0; i < inline_js.length; i++) {\n", 103 | " inline_js[i](window.Bokeh);\n", 104 | " }\n", 105 | " }\n", 106 | "\n", 107 | " if (window._bokeh_is_loading === 0) {\n", 108 | " console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", 109 | " run_inline_js();\n", 110 | " } else {\n", 111 | " load_libs(js_urls, function() {\n", 112 | " console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n", 113 | " run_inline_js();\n", 114 | " });\n", 115 | " }\n", 116 | "}(this));" 117 | ] 118 | }, 119 | "metadata": {}, 120 | "output_type": "display_data" 121 | } 122 | ], 123 | "source": [ 124 | "## import statements\n", 125 | "import numpy as np\n", 126 | "import pandas as pd\n", 127 | "import matplotlib as mpl\n", 128 | "import matplotlib.pyplot as plt\n", 129 | "import seaborn as sns\n", 130 | "import sklearn\n", 131 | "import bokeh\n", 132 | "from bokeh.io import output_notebook, show\n", 133 | "output_notebook()" 134 | ] 135 | }, 136 | { 137 | "cell_type": "markdown", 138 | "metadata": {}, 139 | "source": [ 140 | "
" 141 | ] 142 | }, 143 | { 144 | "cell_type": "markdown", 145 | "metadata": {}, 146 | "source": [ 147 | "## Read data and explore" 148 | ] 149 | }, 150 | { 151 | "cell_type": "markdown", 152 | "metadata": {}, 153 | "source": [ 154 | "## Loading some data\n", 155 | "\n", 156 | "We have some data from an [Amazon Product](http://jmcauley.ucsd.edu/data/amazon/) scrape by [Julian McAuley](http://cseweb.ucsd.edu/~jmcauley/). If you use this data please cite Julian!\n", 157 | "\n", 158 | "Let's see what we have, note we can use some bash commands in Jupyter by starting a line with `!`" 159 | ] 160 | }, 161 | { 162 | "cell_type": "code", 163 | "execution_count": 2, 164 | "metadata": { 165 | "collapsed": false 166 | }, 167 | "outputs": [ 168 | { 169 | "name": "stdout", 170 | "output_type": "stream", 171 | "text": [ 172 | "ls: data: No such file or directory\r\n" 173 | ] 174 | } 175 | ], 176 | "source": [ 177 | "! ls -al data" 178 | ] 179 | }, 180 | { 181 | "cell_type": "markdown", 182 | "metadata": {}, 183 | "source": [ 184 | "But in reality you don't have to us it for some commands like `ls` and `cd`" 185 | ] 186 | }, 187 | { 188 | "cell_type": "code", 189 | "execution_count": 3, 190 | "metadata": { 191 | "collapsed": false 192 | }, 193 | "outputs": [ 194 | { 195 | "name": "stdout", 196 | "output_type": "stream", 197 | "text": [ 198 | "ls: data/reviews/: No such file or directory\r\n" 199 | ] 200 | } 201 | ], 202 | "source": [ 203 | "ls -alh data/reviews/" 204 | ] 205 | }, 206 | { 207 | "cell_type": "markdown", 208 | "metadata": {}, 209 | "source": [ 210 | "The complete data is pretty large, but the individual departments are not so bad. But let's try to get a feel for how to build this data:" 211 | ] 212 | }, 213 | { 214 | "cell_type": "code", 215 | "execution_count": 4, 216 | "metadata": { 217 | "collapsed": false 218 | }, 219 | "outputs": [ 220 | { 221 | "name": "stdout", 222 | "output_type": "stream", 223 | "text": [ 224 | "{\"reviewerID\": \"A1KLRMWW2FWPL4\", \"asin\": \"0000031887\", \"reviewerName\": \"Amazon Customer \\\"cameramom\\\"\", \"helpful\": [0, 0], \"reviewText\": \"This is a great tutu and at a really great price. It doesn't look cheap at all. I'm so glad I looked on Amazon and found such an affordable tutu that isn't made poorly. A++\", \"overall\": 5.0, \"summary\": \"Great tutu- not cheaply made\", \"unixReviewTime\": 1297468800, \"reviewTime\": \"02 12, 2011\"}\r\n", 225 | "{\"reviewerID\": \"A2G5TCU2WDFZ65\", \"asin\": \"0000031887\", \"reviewerName\": \"Amazon Customer\", \"helpful\": [0, 0], \"reviewText\": \"I bought this for my 4 yr old daughter for dance class, she wore it today for the first time and the teacher thought it was adorable. I bought this to go with a light blue long sleeve leotard and was happy the colors matched up great. Price was very good too since some of these go for over $15.00 dollars.\", \"overall\": 5.0, \"summary\": \"Very Cute!!\", \"unixReviewTime\": 1358553600, \"reviewTime\": \"01 19, 2013\"}\r\n", 226 | "gzcat: error writing to output: Broken pipe\r\n", 227 | "gzcat: ../data/reviews/reviews_Clothing_Shoes_and_Jewelry_5.json.gz: uncompress failed\r\n" 228 | ] 229 | } 230 | ], 231 | "source": [ 232 | "!gzcat ../data/reviews/reviews_Clothing_Shoes_and_Jewelry_5.json.gz | head -2" 233 | ] 234 | }, 235 | { 236 | "cell_type": "markdown", 237 | "metadata": {}, 238 | "source": [ 239 | "Oph! This is JSON Lines not JSON! Let's load it into lines" 240 | ] 241 | }, 242 | { 243 | "cell_type": "code", 244 | "execution_count": 5, 245 | "metadata": { 246 | "collapsed": false 247 | }, 248 | "outputs": [ 249 | { 250 | "data": { 251 | "text/plain": [ 252 | "278677" 253 | ] 254 | }, 255 | "execution_count": 5, 256 | "metadata": {}, 257 | "output_type": "execute_result" 258 | } 259 | ], 260 | "source": [ 261 | "import gzip\n", 262 | "review_lines = gzip.open('../data/reviews/reviews_Clothing_Shoes_and_Jewelry_5.json.gz', 'rt').readlines()\n", 263 | "len(review_lines)" 264 | ] 265 | }, 266 | { 267 | "cell_type": "markdown", 268 | "metadata": {}, 269 | "source": [ 270 | "Now we have something, but it's a lot of lines. So we load it into a `DataFrame`, an object that is the data hacker's go to for manipulating structured data. \n", 271 | "\n", 272 | "Unfortunately, its not as straight forward as `pd.read_json`, since first we have to turn all those JSON strings into Python objects, so let's turn each into a dict and then build a `DataFrame`" 273 | ] 274 | }, 275 | { 276 | "cell_type": "code", 277 | "execution_count": 6, 278 | "metadata": { 279 | "collapsed": false 280 | }, 281 | "outputs": [], 282 | "source": [ 283 | "import json\n", 284 | "df_reviews = pd.DataFrame(list(map(json.loads, review_lines)))" 285 | ] 286 | }, 287 | { 288 | "cell_type": "markdown", 289 | "metadata": {}, 290 | "source": [ 291 | "Now let's see what we have:" 292 | ] 293 | }, 294 | { 295 | "cell_type": "code", 296 | "execution_count": 7, 297 | "metadata": { 298 | "collapsed": false 299 | }, 300 | "outputs": [ 301 | { 302 | "data": { 303 | "text/html": [ 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 | "
asinhelpfuloverallreviewTextreviewTimereviewerIDreviewerNamesummaryunixReviewTime
00000031887[0, 0]5.0This is a great tutu and at a really great pri...02 12, 2011A1KLRMWW2FWPL4Amazon Customer \"cameramom\"Great tutu- not cheaply made1297468800
10000031887[0, 0]5.0I bought this for my 4 yr old daughter for dan...01 19, 2013A2G5TCU2WDFZ65Amazon CustomerVery Cute!!1358553600
20000031887[0, 0]5.0What can I say... my daughters have it in oran...01 4, 2013A1RLQXYNCMWRWNCarolaI have buy more than one1357257600
30000031887[0, 0]5.0We bought several tutus at once, and they are ...04 27, 2014A8U3FAMSJVHS5CaromcgAdorable, Sturdy1398556800
40000031887[0, 0]5.0Thank you Halo Heaven great product for Little...03 15, 2014A3GEOILWLK86XMCJGrammy's Angels Love it1394841600
\n", 383 | "
" 384 | ], 385 | "text/plain": [ 386 | " asin helpful overall \\\n", 387 | "0 0000031887 [0, 0] 5.0 \n", 388 | "1 0000031887 [0, 0] 5.0 \n", 389 | "2 0000031887 [0, 0] 5.0 \n", 390 | "3 0000031887 [0, 0] 5.0 \n", 391 | "4 0000031887 [0, 0] 5.0 \n", 392 | "\n", 393 | " reviewText reviewTime \\\n", 394 | "0 This is a great tutu and at a really great pri... 02 12, 2011 \n", 395 | "1 I bought this for my 4 yr old daughter for dan... 01 19, 2013 \n", 396 | "2 What can I say... my daughters have it in oran... 01 4, 2013 \n", 397 | "3 We bought several tutus at once, and they are ... 04 27, 2014 \n", 398 | "4 Thank you Halo Heaven great product for Little... 03 15, 2014 \n", 399 | "\n", 400 | " reviewerID reviewerName summary \\\n", 401 | "0 A1KLRMWW2FWPL4 Amazon Customer \"cameramom\" Great tutu- not cheaply made \n", 402 | "1 A2G5TCU2WDFZ65 Amazon Customer Very Cute!! \n", 403 | "2 A1RLQXYNCMWRWN Carola I have buy more than one \n", 404 | "3 A8U3FAMSJVHS5 Caromcg Adorable, Sturdy \n", 405 | "4 A3GEOILWLK86XM CJ Grammy's Angels Love it \n", 406 | "\n", 407 | " unixReviewTime \n", 408 | "0 1297468800 \n", 409 | "1 1358553600 \n", 410 | "2 1357257600 \n", 411 | "3 1398556800 \n", 412 | "4 1394841600 " 413 | ] 414 | }, 415 | "execution_count": 7, 416 | "metadata": {}, 417 | "output_type": "execute_result" 418 | } 419 | ], 420 | "source": [ 421 | "df_reviews.head()" 422 | ] 423 | }, 424 | { 425 | "cell_type": "markdown", 426 | "metadata": {}, 427 | "source": [ 428 | "Where to go from here:\n", 429 | "\n", 430 | "- split the helpful column into helpful_votes and overall_votes\n", 431 | "- add a computed column `percent_helpful` \n", 432 | "- add a computed column `helpful_review` with True if helpful and False otherwise\n", 433 | "- remove the reviews with no votes\n", 434 | "- plot the distribution of helpful votes" 435 | ] 436 | }, 437 | { 438 | "cell_type": "markdown", 439 | "metadata": {}, 440 | "source": [ 441 | "
" 442 | ] 443 | }, 444 | { 445 | "cell_type": "markdown", 446 | "metadata": {}, 447 | "source": [ 448 | "## Build some exploratory plots" 449 | ] 450 | }, 451 | { 452 | "cell_type": "markdown", 453 | "metadata": {}, 454 | "source": [ 455 | "Build a bokeh plot highlighting length versus helpfulness of the review." 456 | ] 457 | }, 458 | { 459 | "cell_type": "code", 460 | "execution_count": null, 461 | "metadata": { 462 | "collapsed": true 463 | }, 464 | "outputs": [], 465 | "source": [] 466 | }, 467 | { 468 | "cell_type": "markdown", 469 | "metadata": {}, 470 | "source": [ 471 | "
" 472 | ] 473 | }, 474 | { 475 | "cell_type": "markdown", 476 | "metadata": {}, 477 | "source": [ 478 | "## Model the review helpfulness" 479 | ] 480 | }, 481 | { 482 | "cell_type": "markdown", 483 | "metadata": {}, 484 | "source": [ 485 | "Build a model that predicts if a review is helpful from the word counted vectorizer. See `sklearn.feature_extraction.text.CountVectorizer`" 486 | ] 487 | }, 488 | { 489 | "cell_type": "code", 490 | "execution_count": null, 491 | "metadata": { 492 | "collapsed": true 493 | }, 494 | "outputs": [], 495 | "source": [] 496 | } 497 | ], 498 | "metadata": { 499 | "kernelspec": { 500 | "display_name": "Python 3", 501 | "language": "python", 502 | "name": "python3" 503 | }, 504 | "language_info": { 505 | "codemirror_mode": { 506 | "name": "ipython", 507 | "version": 3 508 | }, 509 | "file_extension": ".py", 510 | "mimetype": "text/x-python", 511 | "name": "python", 512 | "nbconvert_exporter": "python", 513 | "pygments_lexer": "ipython3", 514 | "version": "3.5.1" 515 | } 516 | }, 517 | "nbformat": 4, 518 | "nbformat_minor": 0 519 | } 520 | -------------------------------------------------------------------------------- /exercises/BaseballExercise.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "collapsed": true 7 | }, 8 | "source": [ 9 | "# Baseball Exercises" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 1, 15 | "metadata": { 16 | "collapsed": false 17 | }, 18 | "outputs": [ 19 | { 20 | "data": { 21 | "text/html": [ 22 | "\n", 23 | "
\n", 24 | " \n", 25 | " Loading BokehJS ...\n", 26 | "
" 27 | ] 28 | }, 29 | "metadata": {}, 30 | "output_type": "display_data" 31 | }, 32 | { 33 | "data": { 34 | "application/javascript": [ 35 | "\n", 36 | "(function(global) {\n", 37 | " function now() {\n", 38 | " return new Date();\n", 39 | " }\n", 40 | "\n", 41 | " if (typeof (window._bokeh_onload_callbacks) === \"undefined\") {\n", 42 | " window._bokeh_onload_callbacks = [];\n", 43 | " }\n", 44 | "\n", 45 | " function run_callbacks() {\n", 46 | " window._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n", 47 | " delete window._bokeh_onload_callbacks\n", 48 | " console.info(\"Bokeh: all callbacks have finished\");\n", 49 | " }\n", 50 | "\n", 51 | " function load_libs(js_urls, callback) {\n", 52 | " window._bokeh_onload_callbacks.push(callback);\n", 53 | " if (window._bokeh_is_loading > 0) {\n", 54 | " console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", 55 | " return null;\n", 56 | " }\n", 57 | " if (js_urls == null || js_urls.length === 0) {\n", 58 | " run_callbacks();\n", 59 | " return null;\n", 60 | " }\n", 61 | " console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", 62 | " window._bokeh_is_loading = js_urls.length;\n", 63 | " for (var i = 0; i < js_urls.length; i++) {\n", 64 | " var url = js_urls[i];\n", 65 | " var s = document.createElement('script');\n", 66 | " s.src = url;\n", 67 | " s.async = false;\n", 68 | " s.onreadystatechange = s.onload = function() {\n", 69 | " window._bokeh_is_loading--;\n", 70 | " if (window._bokeh_is_loading === 0) {\n", 71 | " console.log(\"Bokeh: all BokehJS libraries loaded\");\n", 72 | " run_callbacks()\n", 73 | " }\n", 74 | " };\n", 75 | " s.onerror = function() {\n", 76 | " console.warn(\"failed to load library \" + url);\n", 77 | " };\n", 78 | " console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", 79 | " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", 80 | " }\n", 81 | " };\n", 82 | "\n", 83 | " var js_urls = ['https://cdn.pydata.org/bokeh/release/bokeh-0.11.1.min.js', 'https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.11.1.min.js', 'https://cdn.pydata.org/bokeh/release/bokeh-compiler-0.11.1.min.js'];\n", 84 | "\n", 85 | " var inline_js = [\n", 86 | " function(Bokeh) {\n", 87 | " Bokeh.set_log_level(\"info\");\n", 88 | " },\n", 89 | " \n", 90 | " function(Bokeh) {\n", 91 | " Bokeh.$(\"#228a4951-2200-4a56-af8b-296e85a4ec90\").text(\"BokehJS successfully loaded\");\n", 92 | " },\n", 93 | " function(Bokeh) {\n", 94 | " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-0.11.1.min.css\");\n", 95 | " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-0.11.1.min.css\");\n", 96 | " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.11.1.min.css\");\n", 97 | " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.11.1.min.css\");\n", 98 | " }\n", 99 | " ];\n", 100 | "\n", 101 | " function run_inline_js() {\n", 102 | " for (var i = 0; i < inline_js.length; i++) {\n", 103 | " inline_js[i](window.Bokeh);\n", 104 | " }\n", 105 | " }\n", 106 | "\n", 107 | " if (window._bokeh_is_loading === 0) {\n", 108 | " console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", 109 | " run_inline_js();\n", 110 | " } else {\n", 111 | " load_libs(js_urls, function() {\n", 112 | " console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n", 113 | " run_inline_js();\n", 114 | " });\n", 115 | " }\n", 116 | "}(this));" 117 | ] 118 | }, 119 | "metadata": {}, 120 | "output_type": "display_data" 121 | } 122 | ], 123 | "source": [ 124 | "## import statements\n", 125 | "import numpy as np\n", 126 | "import pandas as pd\n", 127 | "import matplotlib as mpl\n", 128 | "import matplotlib.pyplot as plt\n", 129 | "import seaborn as sns\n", 130 | "import sklearn\n", 131 | "import bokeh\n", 132 | "from bokeh.io import output_notebook, show\n", 133 | "output_notebook()" 134 | ] 135 | }, 136 | { 137 | "cell_type": "markdown", 138 | "metadata": {}, 139 | "source": [ 140 | "
" 141 | ] 142 | }, 143 | { 144 | "cell_type": "markdown", 145 | "metadata": {}, 146 | "source": [ 147 | "## Read data and explore" 148 | ] 149 | }, 150 | { 151 | "cell_type": "code", 152 | "execution_count": 2, 153 | "metadata": { 154 | "collapsed": false 155 | }, 156 | "outputs": [ 157 | { 158 | "name": "stdout", 159 | "output_type": "stream", 160 | "text": [ 161 | "['AllstarFull', 'Appearances', 'AwardsManagers', 'AwardsPlayers', 'AwardsShareManagers', 'AwardsSharePlayers', 'Batting', 'BattingPost', 'Fielding', 'FieldingOF', 'FieldingPost', 'HallOfFame', 'Managers', 'ManagersHalf', 'Master', 'Pitching', 'PitchingPost', 'Salaries', 'Schools', 'SchoolsPlayers', 'SeriesPost', 'Teams', 'TeamsFranchises', 'TeamsHalf', 'temp']\n" 162 | ] 163 | } 164 | ], 165 | "source": [ 166 | "import sqlite3\n", 167 | "con = sqlite3.connect(\"../data/baseball/lahman2013.sqlite\")\n", 168 | "\n", 169 | "with con:\n", 170 | " cur = con.cursor()\n", 171 | " cur.execute(\"SELECT name FROM sqlite_master WHERE type='table';\")\n", 172 | " data = cur.fetchall()\n", 173 | "print([datum[0] for datum in data])" 174 | ] 175 | }, 176 | { 177 | "cell_type": "code", 178 | "execution_count": 3, 179 | "metadata": { 180 | "collapsed": false 181 | }, 182 | "outputs": [ 183 | { 184 | "name": "stdout", 185 | "output_type": "stream", 186 | "text": [ 187 | " yearID lgID teamID franchID divID Rank G Ghome W L ... \\\n", 188 | "0 1871 NA BS1 BNA None 3 31 NaN 20 10 ... \n", 189 | "1 1871 NA CH1 CNA None 2 28 NaN 19 9 ... \n", 190 | "2 1871 NA CL1 CFC None 8 29 NaN 10 19 ... \n", 191 | "3 1871 NA FW1 KEK None 7 19 NaN 7 12 ... \n", 192 | "4 1871 NA NY2 NNA None 5 33 NaN 16 17 ... \n", 193 | "\n", 194 | " DP FP name park \\\n", 195 | "0 NaN 0.83 Boston Red Stockings South End Grounds I \n", 196 | "1 NaN 0.82 Chicago White Stockings Union Base-Ball Grounds \n", 197 | "2 NaN 0.81 Cleveland Forest Citys National Association Grounds \n", 198 | "3 NaN 0.80 Fort Wayne Kekiongas Hamilton Field \n", 199 | "4 NaN 0.83 New York Mutuals Union Grounds (Brooklyn) \n", 200 | "\n", 201 | " attendance BPF PPF teamIDBR teamIDlahman45 teamIDretro \n", 202 | "0 NaN 103 98 BOS BS1 BS1 \n", 203 | "1 NaN 104 102 CHI CH1 CH1 \n", 204 | "2 NaN 96 100 CLE CL1 CL1 \n", 205 | "3 NaN 101 107 KEK FW1 FW1 \n", 206 | "4 NaN 90 88 NYU NY2 NY2 \n", 207 | "\n", 208 | "[5 rows x 48 columns]\n" 209 | ] 210 | } 211 | ], 212 | "source": [ 213 | "import pandas as pd\n", 214 | "\n", 215 | "# Read sqlite query results into a pandas DataFrame\n", 216 | "with con:\n", 217 | " df = pd.read_sql_query(\"SELECT * from Teams\", con)\n", 218 | "\n", 219 | "# verify that result of SQL query is stored in the dataframe\n", 220 | "print(df.head())" 221 | ] 222 | }, 223 | { 224 | "cell_type": "markdown", 225 | "metadata": {}, 226 | "source": [ 227 | "
" 228 | ] 229 | }, 230 | { 231 | "cell_type": "markdown", 232 | "metadata": {}, 233 | "source": [ 234 | "## Build some exploratory plots" 235 | ] 236 | }, 237 | { 238 | "cell_type": "code", 239 | "execution_count": null, 240 | "metadata": { 241 | "collapsed": true 242 | }, 243 | "outputs": [], 244 | "source": [] 245 | }, 246 | { 247 | "cell_type": "markdown", 248 | "metadata": {}, 249 | "source": [ 250 | "
" 251 | ] 252 | }, 253 | { 254 | "cell_type": "markdown", 255 | "metadata": {}, 256 | "source": [ 257 | "## Model" 258 | ] 259 | }, 260 | { 261 | "cell_type": "code", 262 | "execution_count": null, 263 | "metadata": { 264 | "collapsed": true 265 | }, 266 | "outputs": [], 267 | "source": [] 268 | } 269 | ], 270 | "metadata": { 271 | "kernelspec": { 272 | "display_name": "Python 3", 273 | "language": "python", 274 | "name": "python3" 275 | }, 276 | "language_info": { 277 | "codemirror_mode": { 278 | "name": "ipython", 279 | "version": 3 280 | }, 281 | "file_extension": ".py", 282 | "mimetype": "text/x-python", 283 | "name": "python", 284 | "nbconvert_exporter": "python", 285 | "pygments_lexer": "ipython3", 286 | "version": "3.4.4" 287 | } 288 | }, 289 | "nbformat": 4, 290 | "nbformat_minor": 0 291 | } 292 | -------------------------------------------------------------------------------- /exercises/BostonHousingExercise.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "collapsed": true 7 | }, 8 | "source": [ 9 | "# Boston Housing Data\n", 10 | "\n", 11 | "See UCI Data page: https://archive.ics.uci.edu/ml/datasets/Housing\n", 12 | "\n", 13 | "\n", 14 | "Data Columns:\n", 15 | "\n", 16 | "1. CRIM: per capita crime rate by town \n", 17 | "2. ZN: proportion of residential land zoned for lots over 25,000 sq.ft. \n", 18 | "3. INDUS: proportion of non-retail business acres per town \n", 19 | "4. CHAS: Charles River dummy variable (= 1 if tract bounds river; 0 otherwise) \n", 20 | "5. NOX: nitric oxides concentration (parts per 10 million) \n", 21 | "6. RM: average number of rooms per dwelling \n", 22 | "7. AGE: proportion of owner-occupied units built prior to 1940 \n", 23 | "8. DIS: weighted distances to five Boston employment centres \n", 24 | "9. RAD: index of accessibility to radial highways \n", 25 | "10. TAX: full-value property-tax rate per \\$10,000 \n", 26 | "11. PTRATIO: pupil-teacher ratio by town \n", 27 | "12. B: $1000(Bk - 0.63)^2$ where Bk is the proportion of blacks by town \n", 28 | "13. LSTAT: % lower status of the population \n", 29 | "14. MEDV: Median value of owner-occupied homes in \\$1000's\n", 30 | "\n", 31 | "Let's explore the data a bit, make some interactive plots and build a classifier for the data.\n", 32 | " \n", 33 | " " 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": 3, 39 | "metadata": { 40 | "collapsed": false 41 | }, 42 | "outputs": [ 43 | { 44 | "data": { 45 | "text/html": [ 46 | "\n", 47 | "
\n", 48 | " \n", 49 | " Loading BokehJS ...\n", 50 | "
" 51 | ] 52 | }, 53 | "metadata": {}, 54 | "output_type": "display_data" 55 | }, 56 | { 57 | "data": { 58 | "application/javascript": [ 59 | "\n", 60 | "(function(global) {\n", 61 | " function now() {\n", 62 | " return new Date();\n", 63 | " }\n", 64 | "\n", 65 | " if (typeof (window._bokeh_onload_callbacks) === \"undefined\") {\n", 66 | " window._bokeh_onload_callbacks = [];\n", 67 | " }\n", 68 | "\n", 69 | " function run_callbacks() {\n", 70 | " window._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n", 71 | " delete window._bokeh_onload_callbacks\n", 72 | " console.info(\"Bokeh: all callbacks have finished\");\n", 73 | " }\n", 74 | "\n", 75 | " function load_libs(js_urls, callback) {\n", 76 | " window._bokeh_onload_callbacks.push(callback);\n", 77 | " if (window._bokeh_is_loading > 0) {\n", 78 | " console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", 79 | " return null;\n", 80 | " }\n", 81 | " if (js_urls == null || js_urls.length === 0) {\n", 82 | " run_callbacks();\n", 83 | " return null;\n", 84 | " }\n", 85 | " console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", 86 | " window._bokeh_is_loading = js_urls.length;\n", 87 | " for (var i = 0; i < js_urls.length; i++) {\n", 88 | " var url = js_urls[i];\n", 89 | " var s = document.createElement('script');\n", 90 | " s.src = url;\n", 91 | " s.async = false;\n", 92 | " s.onreadystatechange = s.onload = function() {\n", 93 | " window._bokeh_is_loading--;\n", 94 | " if (window._bokeh_is_loading === 0) {\n", 95 | " console.log(\"Bokeh: all BokehJS libraries loaded\");\n", 96 | " run_callbacks()\n", 97 | " }\n", 98 | " };\n", 99 | " s.onerror = function() {\n", 100 | " console.warn(\"failed to load library \" + url);\n", 101 | " };\n", 102 | " console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", 103 | " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", 104 | " }\n", 105 | " };\n", 106 | "\n", 107 | " var js_urls = ['https://cdn.pydata.org/bokeh/release/bokeh-0.11.1.min.js', 'https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.11.1.min.js', 'https://cdn.pydata.org/bokeh/release/bokeh-compiler-0.11.1.min.js'];\n", 108 | "\n", 109 | " var inline_js = [\n", 110 | " function(Bokeh) {\n", 111 | " Bokeh.set_log_level(\"info\");\n", 112 | " },\n", 113 | " \n", 114 | " function(Bokeh) {\n", 115 | " Bokeh.$(\"#f8f188cc-eb88-4d7f-a98e-29ff95af8d06\").text(\"BokehJS successfully loaded\");\n", 116 | " },\n", 117 | " function(Bokeh) {\n", 118 | " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-0.11.1.min.css\");\n", 119 | " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-0.11.1.min.css\");\n", 120 | " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.11.1.min.css\");\n", 121 | " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.11.1.min.css\");\n", 122 | " }\n", 123 | " ];\n", 124 | "\n", 125 | " function run_inline_js() {\n", 126 | " for (var i = 0; i < inline_js.length; i++) {\n", 127 | " inline_js[i](window.Bokeh);\n", 128 | " }\n", 129 | " }\n", 130 | "\n", 131 | " if (window._bokeh_is_loading === 0) {\n", 132 | " console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", 133 | " run_inline_js();\n", 134 | " } else {\n", 135 | " load_libs(js_urls, function() {\n", 136 | " console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n", 137 | " run_inline_js();\n", 138 | " });\n", 139 | " }\n", 140 | "}(this));" 141 | ] 142 | }, 143 | "metadata": {}, 144 | "output_type": "display_data" 145 | } 146 | ], 147 | "source": [ 148 | "## import statements\n", 149 | "import numpy as np\n", 150 | "import pandas as pd\n", 151 | "import matplotlib as mpl\n", 152 | "import matplotlib.pyplot as plt\n", 153 | "import seaborn as sns\n", 154 | "import sklearn\n", 155 | "import bokeh\n", 156 | "from bokeh.io import output_notebook, show\n", 157 | "output_notebook()" 158 | ] 159 | }, 160 | { 161 | "cell_type": "markdown", 162 | "metadata": {}, 163 | "source": [ 164 | "
" 165 | ] 166 | }, 167 | { 168 | "cell_type": "markdown", 169 | "metadata": {}, 170 | "source": [ 171 | "## Read data and explore" 172 | ] 173 | }, 174 | { 175 | "cell_type": "code", 176 | "execution_count": 4, 177 | "metadata": { 178 | "collapsed": true 179 | }, 180 | "outputs": [], 181 | "source": [ 182 | "boston_cols = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']" 183 | ] 184 | }, 185 | { 186 | "cell_type": "code", 187 | "execution_count": 6, 188 | "metadata": { 189 | "collapsed": false 190 | }, 191 | "outputs": [], 192 | "source": [ 193 | "df = pd.read_csv(\"../data/boston/housing.data\", sep='\\s+', names=boston_cols)" 194 | ] 195 | }, 196 | { 197 | "cell_type": "code", 198 | "execution_count": null, 199 | "metadata": { 200 | "collapsed": true 201 | }, 202 | "outputs": [], 203 | "source": [] 204 | }, 205 | { 206 | "cell_type": "markdown", 207 | "metadata": {}, 208 | "source": [ 209 | "
" 210 | ] 211 | }, 212 | { 213 | "cell_type": "markdown", 214 | "metadata": {}, 215 | "source": [ 216 | "## Build some exploratory plots" 217 | ] 218 | }, 219 | { 220 | "cell_type": "code", 221 | "execution_count": null, 222 | "metadata": { 223 | "collapsed": true 224 | }, 225 | "outputs": [], 226 | "source": [] 227 | }, 228 | { 229 | "cell_type": "markdown", 230 | "metadata": {}, 231 | "source": [ 232 | "
" 233 | ] 234 | }, 235 | { 236 | "cell_type": "markdown", 237 | "metadata": {}, 238 | "source": [ 239 | "## Model and predict house value" 240 | ] 241 | }, 242 | { 243 | "cell_type": "code", 244 | "execution_count": null, 245 | "metadata": { 246 | "collapsed": true 247 | }, 248 | "outputs": [], 249 | "source": [] 250 | } 251 | ], 252 | "metadata": { 253 | "kernelspec": { 254 | "display_name": "Python 3", 255 | "language": "python", 256 | "name": "python3" 257 | }, 258 | "language_info": { 259 | "codemirror_mode": { 260 | "name": "ipython", 261 | "version": 3 262 | }, 263 | "file_extension": ".py", 264 | "mimetype": "text/x-python", 265 | "name": "python", 266 | "nbconvert_exporter": "python", 267 | "pygments_lexer": "ipython3", 268 | "version": "3.4.4" 269 | } 270 | }, 271 | "nbformat": 4, 272 | "nbformat_minor": 0 273 | } 274 | -------------------------------------------------------------------------------- /images/accuracy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aterrel/pydata101/5e0eb6b13bd902ad869a34d59566da2f3aa73c27/images/accuracy.png -------------------------------------------------------------------------------- /images/confusion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aterrel/pydata101/5e0eb6b13bd902ad869a34d59566da2f3aa73c27/images/confusion.png -------------------------------------------------------------------------------- /images/crossvalidation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aterrel/pydata101/5e0eb6b13bd902ad869a34d59566da2f3aa73c27/images/crossvalidation.png -------------------------------------------------------------------------------- /images/ml-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aterrel/pydata101/5e0eb6b13bd902ad869a34d59566da2f3aa73c27/images/ml-1.png -------------------------------------------------------------------------------- /images/ml-model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aterrel/pydata101/5e0eb6b13bd902ad869a34d59566da2f3aa73c27/images/ml-model.png -------------------------------------------------------------------------------- /images/training-data.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aterrel/pydata101/5e0eb6b13bd902ad869a34d59566da2f3aa73c27/images/training-data.png -------------------------------------------------------------------------------- /resources.md: -------------------------------------------------------------------------------- 1 | # Resources 2 | 3 | A collection of resources used to build this tutorial 4 | 5 | ## Amazon Product Reviews 6 | 7 | - http://trevor-smith.github.io/amazon-data-exploration/ 8 | - http://jmcauley.ucsd.edu/data/amazon/ 9 | 10 | ## Beer 11 | - http://blog.yhat.com/posts/recommender-system-in-r.html 12 | - http://blog.yhat.com/posts/the-beer-bandit.html 13 | - https://github.com/dustinstansbury/ipython_notebooks/blob/master/Beer%20Reviews.ipynb 14 | 15 | ## Tutorials: 16 | 17 | - http://nbviewer.jupyter.org/github/sarguido/hands-on-analysis-python/tree/master/ 18 | --------------------------------------------------------------------------------