{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "code", "collapsed": false, "input": [ "!date" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Mon Jan 20 17:00:20 EST 2014\r\n" ] } ], "prompt_number": 10 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Extracting Altitude for NFL Stadiums" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Recently I did some [analysis](http://nbviewer.ipython.org/github/jgbos/iPython-Notebooks/blob/master/Cold%20Weather%20FG.ipynb) on the likelihood of making NFL Field Goal over distance and temperature. I would lke to add alitude as a feature, but unfortunately the dataset I am using has the Stadium name, but not the city the game was played in. So took the stadium names and Google's [geocoding API](https://developers.google.com/maps/documentation/geocoding/) to get the location of the stadium and Google's [elevation API](https://developers.google.com/maps/documentation/elevation/) to get the stadium's elevation. The following is an overview of extracting the elevation for each stadium." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import pandas as pd\n", "import pandas.io.sql as psql\n", "import mysql.connector as sql\n", "\n", "import urllib2\n", "import urllib\n", "import json\n", "import time" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "I use the NFL data set from [Armchair Analysis](http://armchairanalysis.com/). One of the tables includes the stadium each game was played in. Tge data us stored in a MySQL database, so lets extract the unique stadium names into a pandas DataFrame to get elevation using *pandas.io.sql*." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import pickle\n", "with open('sql.config','rb') as fp:\n", " config = pickle.load(fp)\n", "\n", "con = sql.connect(**config)\n", "df = psql.frame_query('''\n", " SELECT DISTINCT(STAD) \n", " FROM games;''', con)\n", "\n", "con.close()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 12 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now lets call Google's API for both location and elevation and save them into our pandas DataFrame object. We will not get a result for every entry, but luckily we will get them for most. Also, Google has rate limiting, so I had to use *time.sleep* value between calls to ensure Google does not deny my request." ] }, { "cell_type": "code", "collapsed": true, "input": [ "main_url = \"http://maps.googleapis.com/maps/api/geocode/json?\"\n", "\n", "ELEVATION_BASE_URL = 'http://maps.googleapis.com/maps/api/elevation/json'\n", "LOCATION_BASE_URL = 'http://maps.googleapis.com/maps/api/geocode/json'\n", "\n", "def getAlt(d): \n", " loc_args = {'address': d, 'sensor': 'false'}\n", " url = LOCATION_BASE_URL + '?' + urllib.urlencode(loc_args)\n", " page = urllib2.urlopen(url)\n", " data = json.load(page)\n", " time.sleep(0.1)\n", " if 'results' in data and len(data['results'])>0:\n", " ll = data['results'][0]['geometry']['location']\n", " loc = ','.join(str(x) for x in [ll['lat'],ll['lng']])\n", " el_args = {'locations': loc, 'sensor': 'false'}\n", " url = ELEVATION_BASE_URL + '?' + urllib.urlencode(el_args)\n", " page = urllib2.urlopen(url)\n", " el_data = json.load(page)\n", " if 'results' in el_data: \n", " return ll['lat'], ll['lng'], el_data['results'][0]['elevation']\n", " else:\n", " return None, None, None\n", " return None, None, None\n", "\n", "df['lat'], df['lng'], df['alt'] = zip(*df.STAD.map(getAlt))\n", "df.head()" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
STADlatlngalt
0 Georgia Dome 33.75769-84.40083 303.1637
1 Cleveland Browns Stadium 41.50648-81.70004 183.6383
2 Texas Stadium 32.84107 -96.9109 133.4713
3 Lambeau Field 44.50136-88.06075 190.2768
4 Arrowhead Stadium 39.04894-94.48392 256.7705
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 13, "text": [ " STAD lat lng alt\n", "0 Georgia Dome 33.75769 -84.40083 303.1637\n", "1 Cleveland Browns Stadium 41.50648 -81.70004 183.6383\n", "2 Texas Stadium 32.84107 -96.9109 133.4713\n", "3 Lambeau Field 44.50136 -88.06075 190.2768\n", "4 Arrowhead Stadium 39.04894 -94.48392 256.7705" ] } ], "prompt_number": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "As I mentioned above, there will be some stadium names that do not get a result from Google's API. Here is the list of stadiums without a location and elevation." ] }, { "cell_type": "code", "collapsed": false, "input": [ "df[df.lat.isnull()].head(12)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
STADlatlngalt
10 Network Associates Coliseum None None None
14 Trans World Dome None None None
15 PSINet Stadium None None None
19 RCA Dome None None None
39 Seahawks Stadium None None None
44 Qwest Field None None None
47 McAfee Coliseum None None None
48 Azteca Stadium None None None
60 Mall of America Field at HHH Metrodome None None None
62 New Meadowlands Stadium None None None
68 Mercedes-Benz Superdome None None None
69 Snapdragon Stadium None None None
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 14, "text": [ " STAD lat lng alt\n", "10 Network Associates Coliseum None None None\n", "14 Trans World Dome None None None\n", "15 PSINet Stadium None None None\n", "19 RCA Dome None None None\n", "39 Seahawks Stadium None None None\n", "44 Qwest Field None None None\n", "47 McAfee Coliseum None None None\n", "48 Azteca Stadium None None None\n", "60 Mall of America Field at HHH Metrodome None None None\n", "62 New Meadowlands Stadium None None None\n", "68 Mercedes-Benz Superdome None None None\n", "69 Snapdragon Stadium None None None" ] } ], "prompt_number": 14 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since there are only 12, I will manually enter the rest by searching for the right city and finding the elevation. I will ignore putting in latitude and longitude for now, those columns are actually not needed for my analsysis." ] }, { "cell_type": "code", "collapsed": false, "input": [ "df.ix[df.STAD.str.contains('Network Associates Coliseum'),'alt'] = 13.11\n", "df.ix[df.STAD.str.contains('Trans World Dome'),'alt'] = 142.03\n", "df.ix[df.STAD.str.contains('PSINet'),'alt'] = 3.05\n", "df.ix[df.STAD.str.contains('RCA'),'alt'] = 216.34\n", "df.ix[df.STAD.str.contains('Seahawks'),'alt'] = 5.31\n", "df.ix[df.STAD.str.contains('Qwest'),'alt'] = 5.31\n", "df.ix[df.STAD.str.contains('McAfee'),'alt'] = 10.74\n", "df.ix[df.STAD.str.contains('Azteca'),'alt'] = 2268.13\n", "df.ix[df.STAD.str.contains('Mall of America'),'alt'] = 253.42\n", "df.ix[df.STAD.str.contains('New Meadowlands'),'alt'] = 0.86\n", "df.ix[df.STAD.str.contains('Mercedes-Benz'),'alt'] = 0.0006\n", "df.ix[df.STAD.str.contains('Snapdragon'),'alt'] = 22.89\n", "\n", "\n", "df[df.lat.isnull()].head(12)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
STADlatlngalt
10 Network Associates Coliseum None None 13.11
14 Trans World Dome None None 142.03
15 PSINet Stadium None None 3.05
19 RCA Dome None None 216.34
39 Seahawks Stadium None None 5.31
44 Qwest Field None None 5.31
47 McAfee Coliseum None None 10.74
48 Azteca Stadium None None 2268.13
60 Mall of America Field at HHH Metrodome None None 253.42
62 New Meadowlands Stadium None None 0.86
68 Mercedes-Benz Superdome None None 0.0006
69 Snapdragon Stadium None None 22.89
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 15, "text": [ " STAD lat lng alt\n", "10 Network Associates Coliseum None None 13.11\n", "14 Trans World Dome None None 142.03\n", "15 PSINet Stadium None None 3.05\n", "19 RCA Dome None None 216.34\n", "39 Seahawks Stadium None None 5.31\n", "44 Qwest Field None None 5.31\n", "47 McAfee Coliseum None None 10.74\n", "48 Azteca Stadium None None 2268.13\n", "60 Mall of America Field at HHH Metrodome None None 253.42\n", "62 New Meadowlands Stadium None None 0.86\n", "68 Mercedes-Benz Superdome None None 0.0006\n", "69 Snapdragon Stadium None None 22.89" ] } ], "prompt_number": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now lets save the results to a CSV file to avoid runing this code whenever we need the data." ] }, { "cell_type": "code", "collapsed": false, "input": [ "df.to_csv('stadium_with_altitude.csv')" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 16 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lastly, here is a histogram of the elevation. Denver and Mexico City are the outlier stadiums, and the reason there is a count greater than one for Denver is that there are multiple stadium names in the dataset for the Broncos (as expected). This is true for a number of teams." ] }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "\n", "df.alt.hist(figsize=(12,8), bins=20)\n", "plt.xlabel('Elevation (m)')\n", "plt.ylabel('Count')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 17, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAtYAAAHuCAYAAAC70UubAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3X+QVfV9P/7XFYjRABETXazYLkUJv5bdFRTLSF1K0DgC\nQW2NplWsaGaYSVurk8SktUOmE4Np1PprPk0pqbRprdqMxPmOUo26qWJFRUg0RqMtOzFm2WqQuPgL\nhfv9Q3Z7kTdBk3PuPWfv4zGzw77P3d3zXvLM8bWX555bqVar1QAAAH4tBzR6AwAAMBQYrAEAIAMG\nawAAyIDBGgAAMmCwBgCADBisAQAgA7kN1m+88UbMmjUrOjo6YsqUKfHFL34xIiKWL18e48aNi87O\nzujs7Iy1a9fmtQUAAKibSp73sX7ttdfi4IMPjrfffjtOPPHE+PrXvx733ntvjBo1Ki655JK8TgsA\nAHWXaxXk4IMPjoiIHTt2xM6dO2PMmDEREeE1aQAAGGpyHax37doVHR0d0dLSEnPnzo2pU6dGRMT1\n118f7e3tsXTp0ti2bVueWwAAgLrItQoy4Be/+EWccsopsWLFipgyZUocdthhERFx+eWXR29vb6xa\ntWrPTVUqeW8JAABiwoQJ8dxzz2XytYZn8lX248Mf/nCcdtpp8dhjj0VXV9fg8QsvvDAWLly4j8+q\nf11k1KhPxcqVZ8SnPvWpup+b/Vu+fHksX7680dugYOSCFLkgRS5IyfIJ3dyqIC+99NJgzeP111+P\ne+65Jzo7O2PLli2DH3P77bdHW1tbXltgiOnp6Wn0FigguSBFLkiRC/KW2zPWvb29sWTJkti1a1fs\n2rUrzj333Jg3b16cd955sWnTpqhUKjF+/Pj4xje+kdcWAACgbnIbrNva2uLxxx/f6/g//dM/5XVK\nhrjzzz+/0VuggOSCFLkgRS7IW11+efH9eqfromMNAEC+KpVKZreC9pLmlEZ3d3ejt0AByQUpckGK\nXJA3gzUAAGRAFaSGKggAQHNRBQEAgIIxWFMaunGkyAUpckGKXJA3gzUAAGRAx7qGjjUAQHPRsQYA\ngIIxWFMaunGkyAUpckGKXJA3gzUAAGRAx7qGjjUAQHPRsQYAgIIxWFMaunGkyAUpckGKXJA3gzUA\nAGRAx7qGjjUAQHPRsQYAgIIxWFMaunGkyAUpckGKXJA3gzUAAGRAx7qGjjUAQHPRsQYAgIIxWFMa\nunGkyAUpckGKXJA3gzUAAGRAx7qGjjUAQHPRsQYAgIIxWFMaunGkyAUpckGKXJA3gzUAAGRAx7qG\njjUAQHPRsQYAgIIxWFMaunGkyAUpckGKXJA3gzUAAGRAx7qGjjUAQHPRsQYAgIIxWFMaunGkyAUp\nckGKXJA3gzUAAGRAx7qGjjUAQHPRsQYAgIIxWFMaunGkyAUpckGKXJA3gzUAAGRAx7qGjjUAQHPR\nsQYAgIIxWFMaunGkyAUpckGKXJA3gzUAAGRAx7qGjjUAQHPRsQYAgIIxWFMaunGkyAUpckGKXJA3\ngzUAAGRAx7qGjjUAQHPRsQYAgIIxWFMaunGkyAUpckGKXJA3gzUAAGRAx7qGjjUAQHPRsQYAgIIx\nWFMaunGkyAUpckGKXJA3gzUAAGQgt8H6jTfeiFmzZkVHR0dMmTIlvvjFL0ZExNatW2P+/PkxceLE\nOPnkk2Pbtm15bYEhpqurq9FboIDkghS5IEUuyFtug/UHP/jBuP/++2PTpk3xgx/8IO6///548MEH\nY8WKFTF//vz48Y9/HPPmzYsVK1bktQUAAKibXKsgBx98cERE7NixI3bu3BljxoyJO+64I5YsWRIR\nEUuWLIk1a9bkuQWGEN04UuSCFLkgRS7IW66D9a5du6KjoyNaWlpi7ty5MXXq1Ojr64uWlpaIiGhp\naYm+vr48twAAAHUxPM8vfsABB8SmTZviF7/4RZxyyilx//337/F4pVLZfc/qlPMjonX3+4dEREdE\ndO1ed+/+M+v17tXun2gHuljW1tbFXQ8cK8p+rK2ti7seOFaU/Vg3Zj3wfk9PT2Stbi8Q89d//ddx\n0EEHxT/8wz9Ed3d3jB07Nnp7e2Pu3Lnx9NNP77kpLxADAEAdlOIFYl566aXBO368/vrrcc8990Rn\nZ2csWrQoVq9eHRERq1evjsWLF+e1BYaY2p80YYBckCIXpMgFecutCtLb2xtLliyJXbt2xa5du+Lc\nc8+NefPmRWdnZ5x11lmxatWqaG1tjVtvvTWvLQAAQN3UrQryfqiCAABQD6WoggAAQDMxWFMaunGk\nyAUpckGKXJA3gzUAAGRAx7qGjjUAQHPRsQYAgIIxWFMaunGkyAUpckGKXJA3gzUAAGRAx7qGjjUA\nQHPRsQYAgIIxWFMaunGkyAUpckGKXJA3gzUAAGRAx7qGjjUAQHPRsQYAgIIxWFMaunGkyAUpckGK\nXJA3gzUAAGRAx7qGjjUAQHPRsQYAgIIxWFMaunGkyAUpckGKXJA3gzUAAGRAx7qGjjUAQHPRsQYA\ngIIxWFMaunGkyAUpckGKXJA3gzUAAGRAx7qGjjUAQHPRsQYAgIIxWFMaunGkyAUpckGKXJA3gzUA\nAGRAx7qGjjUAQHPRsQYAgIIxWFMaunGkyAUpckGKXJA3gzUAAGRAx7qGjjUAQHPRsQYAgIIxWFMa\nunGkyAUpckGKXJA3gzUAAGRAx7qGjjUAQHPRsQYAgIIxWFMaunGkyAUpckGKXJA3gzUAAGRAx7qG\njjUAQHPRsQYAgIIxWFMaunGkyAUpckGKXJA3gzUAAGRAx7qGjjUAQHPRsQYAgIIxWFMaunGkyAUp\nckGKXJA3gzUAAGRAx7qGjjUAQHPRsQYAgIIxWFMaunGkyAUpckGKXJA3gzUAAGRAx7qGjjUAQHPR\nsQYAgIIxWFMaunGkyAUpckGKXJA3gzUAAGQgt8H6+eefj7lz58bUqVNj2rRpcd1110VExPLly2Pc\nuHHR2dkZnZ2dsXbt2ry2wBDT1dXV6C1QQHJBilyQIhfkbXheX3jEiBFxzTXXREdHR2zfvj1mzJgR\n8+fPj0qlEpdccklccskleZ0aAADqLrdnrMeOHRsdHR0RETFy5MiYPHlyvPDCCxERmf3mJc1FN44U\nuSBFLkiRC/JWl451T09PbNy4MU444YSIiLj++uujvb09li5dGtu2bavHFgAAIFe538d6+/bt0dXV\nFX/5l38Zixcvjv/93/+Nww47LCIiLr/88ujt7Y1Vq1btualKJSKWRETr7iOHRERHRHTtXnfv/jPb\n9ahR/y9WrjwjWlpa3nl0dxdr4Cdca2tra2tra2vrcq8H3u/p6YmIiNWrV2fWpsh1sH7rrbdiwYIF\nceqpp8bFF1+81+M9PT2xcOHCeOKJJ/bclBeIAQCgDkrxAjHVajWWLl0aU6ZM2WOo7u3tHXz/9ttv\nj7a2try2wBBT+5MmDJALUuSCFLkgb7ndFWTdunXxrW99K6ZPnx6dnZ0REXHFFVfEzTffHJs2bYpK\npRLjx4+Pb3zjG3ltAQAA6ib3jvWvQhUEAIB6KEUVBAAAmonBmtLQjSNFLkiRC1LkgrwZrAEAIAM6\n1jV0rAEAmouONQAAFIzBmtLQjSNFLkiRC1LkgrwZrAEAIAM61jV0rAEAmouONQAAFIzBmtLQjSNF\nLkiRC1LkgrwZrAEAIAM61jV0rAEAmouONQAAFIzBmtLQjSNFLkiRC1LkgrwZrAEAIAM61jV0rAEA\nmouONQAAFIzBmtLQjSNFLkiRC1LkgrwZrAEAIAM61jV0rAEAmouONQAAFIzBmtLQjSNFLkiRC1Lk\ngrwZrAEAIAM61jV0rAEAmouONQAAFIzBmtLQjSNFLkiRC1LkgrwZrAEAIAM61jV0rAEAmouONQAA\nFIzBmtLQjSNFLkiRC1LkgrwZrAEAIAM61jV0rAEAmouONQAAFIzBmtLQjSNFLkiRC1LkgrwZrAEA\nIAM61jV0rAEAmouONQAAFIzBmtLQjSNFLkiRC1LkgrwZrAEAIAM61jV0rAEAmouONQAAFIzBmtLQ\njSNFLkiRC1LkgrwZrAEAIAM61jV0rAEAmouONQAAFIzBmtLQjSNFLkiRC1LkgrwZrAEAIAM61jV0\nrAEAmouONQAAFIzBmtLQjSNFLkiRC1LkgrwZrAEAIAM61jV0rAEAmouONQAAFIzBmtLQjSNFLkiR\nC1LkgrwZrAEAIAO5DdbPP/98zJ07N6ZOnRrTpk2L6667LiIitm7dGvPnz4+JEyfGySefHNu2bctr\nCwwxXV1djd4CBSQXpMgFKXJB3nIbrEeMGBHXXHNN/PCHP4yHH344brzxxvjRj34UK1asiPnz58eP\nf/zjmDdvXqxYsSKvLQAAQN3kNliPHTs2Ojo6IiJi5MiRMXny5HjhhRfijjvuiCVLlkRExJIlS2LN\nmjV5bYEhRjeOFLkgRS5IkQvyVpeOdU9PT2zcuDFmzZoVfX190dLSEhERLS0t0dfXV48tAABArobn\nfYLt27fHmWeeGddee22MGjVqj8cqlcrue1annB8RrbvfPyQiOiKia/e6e/efWa93r3b/RDvQxbK2\nti7ueuBYUfZjbW1d3PXAsaLsx7ox64H3e3p6Imu5vkDMW2+9FQsWLIhTTz01Lr744oiImDRpUnR3\nd8fYsWOjt7c35s6dG08//fSem/ICMQAA1EEpXiCmWq3G0qVLY8qUKYNDdUTEokWLYvXq1RERsXr1\n6li8eHFeW2CIqf1JEwbIBSlyQYpckLfcqiDr1q2Lb33rWzF9+vTo7OyMiIivfvWrcdlll8VZZ50V\nq1atitbW1rj11lvz2gIAANRNrlWQX5UqCAAA9VCKKggAADQTgzWloRtHilyQIhekyAV5M1gDAEAG\ndKxr6FgDADQXHWsAACgYgzWloRtHilyQIhekyAV5M1gDAEAGdKxr6FgDADQXHWsAACgYgzWloRtH\nilyQIhekyAV5M1gDAEAGdKxr6FgDADQXHWsAACgYgzWloRtHilyQIhekyAV52+9g/eCDD+51bN26\ndblsBgAAymq/HevOzs7YuHHjfo9luikdawAA6iDLjvXwfT3wX//1X/HQQw/Fiy++GFdfffXgCfv7\n+2PXrl2ZnBwAAIaKfVZBduzYEf39/bFz587o7++P7du3x/bt22P06NHx7//+7/XcI0SEbhxpckGK\nXJAiF+Rtn89Yn3TSSXHSSSfF+eefH62trXXcEgAAlM8+B+sBb775Zlx00UXR09MTb7/9dkS800W5\n7777ct8c1Orq6mr0FigguSBFLkiRC/K238H6D/7gD2LZsmVx4YUXxrBhwyJi4JcLAQCAAfu93d6I\nESNi2bJlMWvWrJg5c2bMnDkzZsyYUY+9wR5040iRC1LkghS5IG/7HawXLlwYN954Y/T29sbWrVsH\n3wAAgP+z3/tYt7a2Jqsfmzdvzm9T7mMNAEAd1OU+1gN6enoyOREAAAxl+x2sV69enXzG+rzzzstl\nQ7Av3d3dfqObvcgFKXJBilyQt/0O1o8++ujgYP3666/HfffdF8cee6zBGgAAauy3Y/1u27Zti099\n6lPxH//xH3ntSccaAIC6yLJjvd+7grzbwQcfnOsvLgIAQBm9p9vtDbyddtpp8bGPfSxOP/30euwN\n9uD+o6TIBSlyQYpckLf9dqwvvfTSiHjnafLhw4fHb/7mb8ZRRx2V+8YAAKBM3lPHesuWLYO/xHj8\n8cfH4Ycfnu+mdKwBAKiDunasb7311pg1a1bcdtttceutt8bxxx8ft912WyYnBwCAoWK/z1hPnz49\nvvvd7w4+S/3iiy/GvHnz4gc/+EF+m2rgM9ZvvXVXvPFGfwPOPSZeecVLxf8y7j9KilyQIhekyAUp\ndX3lxWq1Gocddtjg+iMf+UhmJy+id4bq+n9//f17vwgPAADlsd9nrD/3uc/F97///fj0pz8d1Wo1\nbrnllpg+fXp87Wtfy29TDXzGur//1oacOyK7n5YAAHhv6vKM9bPPPht9fX3xN3/zN/Htb3871q1b\nFxERs2fPjk9/+tOZnBwAAIaKff7y4sUXXxyjR4+OiIgzzzwzrr766rj66qtj8eLF8ed//ud12yAM\ncP9RUuSCFLkgRS7I2z4H676+vpg+ffpex6dPn+6VFwEA4F322bE++uij47nnnkt+0i97LJNN6VgD\nAFAHdbmP9cyZM+Pv//7v9zq+cuXKmDFjRiYnBwCAoWKfz1hv2bIlTj/99PjABz4wOEhv2LAh3nzz\nzbj99tvjiCOOyG9TnrEmwf1HSZELUuSCFLkgpS53BRk7dmw89NBDcf/998eTTz4ZlUolFixYEL/3\ne7+XyYkBAGAo2e99rBvBM9YAANRDXTrWAADAe2ewpjTcf5QUuSBFLkiRC/JmsAYAgAzoWNfQsQYA\naC461gAAUDAGa0pDN44UuSBFLkiRC/JmsAYAgAzoWNfQsQYAaC461gAAUDAGa0pDN44UuSBFLkiR\nC/KW62B9wQUXREtLS7S1tQ0eW758eYwbNy46Ozujs7Mz1q5dm+cWAACgLnLtWD/wwAMxcuTIOO+8\n8+KJJ56IiIgvf/nLMWrUqLjkkkv2vSkdawAA6qA0Hes5c+bEmDFj9jpugAQAYKhpSMf6+uuvj/b2\n9li6dGls27atEVughHTjSJELUuSCFLkgb8PrfcJly5bFX/3VX0VExOWXXx6XXnpprFq1KvGR50dE\n6+73D4mIjojo2r3u3v1n1uvYz+P1Of/A//G7urqsY+8LYVH2Y12M9aZNmwq1H+tirAcUZT/WxVi7\nXlgP6O7ujp6ensha7vex7unpiYULFw52rN/LYzrWAADUQ2k61im9vb2D799+++173DEEAADKKtfB\n+pxzzonZs2fHM888E0cddVR885vfjC984Qsxffr0aG9vj+9973txzTXX5LkFhpDaf8KBAXJBilyQ\nIhfkLdeO9c0337zXsQsuuCDPUwIAQEPk3rH+VehYAwBQD6XuWAMAwFBksKY0dONIkQtS5IIUuSBv\nBmsAAMiAjnUNHWsAgOaiYw0AAAVjsKY0dONIkQtS5IIUuSBvBmsAAMiAjnUNHWsAgOaiYw0AAAVj\nsKY0dONIkQtS5IIUuSBvBmsAAMiAjnUNHWsAgOaiYw0AAAVjsKY0dONIkQtS5IIUuSBvBmsAAMiA\njnUNHWsAgOaiYw0AAAVjsKY0dONIkQtS5IIUuSBvBmsAAMiAjnUNHWsAgOaiYw0AAAVjsKY0dONI\nkQtS5IIUuSBvBmsAAMiAjnUNHWsAgOaiYw0AAAVjsKY0dONIkQtS5IIUuSBvBmsAAMiAjnUNHWsA\ngOaiYw0AAAVjsKY0dONIkQtS5IIUuSBvBmsAAMiAjnUNHWsAgOaiYw0AAAVjsC6M4VGpVBryNnr0\noY3+5t8T3ThS5IIUuSBFLsjb8EZvgAFvR2MqKBH9/ZWGnBcAYCjRsa7R6I51owZr/W4AoFnpWAMA\nQMEYrCkN3ThS5IIUuSBFLsibwRoAADKgY11DxxoAoLnoWAMAQMEYrCkN3ThS5IIUuSBFLsibwRoA\nADKgY11DxxoAoLnoWAMAQMEYrCkN3ThS5IIUuSBFLsibwRoAADKgY11DxxoAoLnoWAMAQMEYrCkN\n3ThS5IIUuSBFLsibwRoAADKgY11DxxoAoLnoWAMAQMEYrCkN3ThS5IIUuSBFLshbroP1BRdcEC0t\nLdHW1jZ4bOvWrTF//vyYOHFinHzyybFt27Y8twAAAHWRa8f6gQceiJEjR8Z5550XTzzxREREfP7z\nn4+PfvSj8fnPfz6uvPLKePnll2PFihV7bkrHuu7n1rEGAJpRaTrWc+bMiTFjxuxx7I477oglS5ZE\nRMSSJUtizZo1eW4BAADqou4d676+vmhpaYmIiJaWlujr66v3Figp3ThS5IIUuSBFLsjb8EaevFKp\n7K59pJwfEa273z8kIjoiomv3unv3n1mvYz+PD9Xzv3Ox6erqGnw/Igq3rt1rEfZjXYz1pk2bCrUf\n62KsBxRlP9bFWLteWA/o7u6Onp6eyFru97Hu6emJhQsXDnasJ02aFN3d3TF27Njo7e2NuXPnxtNP\nP73npnSs635uHWsAoBmVpmOdsmjRoli9enVERKxevToWL15c7y0AAEDmch2szznnnJg9e3Y888wz\ncdRRR8U//uM/xmWXXRb33HNPTJw4Me6777647LLL8twCQ0jtP+HAALkgRS5IkQvylmvH+uabb04e\n/+53v5vnaQEAoO5y71j/KnSs63/uAsYAACB3pe5YAwDAUGSwpjR040iRC1LkghS5IG8GawAAyICO\ndQ0dawCA5qJjDQAABWOwpjR040iRC1LkghS5IG8GawAAyICOdQ0dawCA5qJjDQAABWOwpjR040iR\nC1LkghS5IG8GawAAyICOdQ0dawCA5qJjDQAABWOwpjR040iRC1LkghS5IG8GawAAyICOdQ0dawCA\n5qJjDQAABWOwpjR040iRC1LkghS5IG8GawAAyICOdQ0dawCA5qJjDQAABWOwpjR040iRC1LkghS5\nIG8GawAAyICOdQ0dawCA5qJjDQAABWOwpjR040iRC1LkghS5IG8GawAAyICOdQ0dawCA5qJjDQAA\nBWOwpjR040iRC1LkghS5IG8GawAAyICOdQ0dawCA5qJjDQAABWOwpjR040iRC1LkghS5IG8GawAA\nyICOdQ0dawCA5qJjDQAABWOwpjR040iRC1LkghS5IG8GawAAyICOdQ0dawCA5qJjDQAABWOwpjR0\n40iRC1LkghS5IG8GawAAyICOdQ0dawCA5qJjDQAABWOwpjR040iRC1LkghS5IG8GawAAyICOdQ0d\nawCA5qJjDQAABWOwpjR040iRC1LkghS5IG8GawAAyICOdQ0dawCA5qJjDQAABWOwpjR040iRC1Lk\nghS5IG/DG3Xi1tbWGD16dAwbNixGjBgRjzzySKO2AgAAv7aGdazHjx8fGzZsiEMPPXSvx3Ss639u\nHWsAoBkNmY61YQ4AgKGiYYN1pVKJj3/84zFz5sxYuXJlo7ZBiejGkSIXpMgFKXJB3hrWsV63bl0c\nccQR8eKLL8b8+fNj0qRJMWfOnJqPOD8iWne/f0hEdERE1+519+4/s17Hfh4fqud/52LT1dU1+H5E\nFG5du9ci7Me6GOtNmzYVaj/WxVgPKMp+rIuxdr2wHtDd3R09PT2RtULcx/rLX/5yjBw5Mi699NKI\n0LFuxLkLEAMAgLorfcf6tddei/7+/oiIePXVV+Puu++Otra2RmwFAAAy0ZDBuq+vL+bMmRMdHR0x\na9asWLBgQZx88smN2AolUvtPODBALkiRC1Lkgrw1pGM9fvz4wZ4TAAAMBYXoWL+bjnX9z13AGAAA\n5K70HWsAABhqDNaUhm4cKXJBilyQIhfkzWANAAAZ0LGuoWMNANBcdKwBAKBgDNaUhm4cKXJBilyQ\nIhfkzWANAAAZ0LGuoWMNANBcdKwBAKBgDNaUhm4cKXJBilyQIhfkzWANAAAZ0LGuoWMNANBcdKwB\nAKBgDNaUhm4cKXJBilyQIhfkzWANAAAZ0LGuoWMNANBcdKwBAKBgDNaUhm4cKXJBilyQIhfkzWAN\nAAAZ0LGuoWMNANBcsuxYD8/kqwBAnY0efWj097/ckHOPGjUmXnlla0PODRSXKgiloRtHilw0r3eG\n6uo+3u7/JY/9+m+NGuj59bhekDeDNQAAZEDHuoaONUB5NOq/FbvP7roJQ4T7WAMAQMEYrCkN3ThS\n5IK07kZvgAJyvSBvBmsAAMiAjnUNHWuA8tCxBrKgYw0AAAVjsKY0dONIkQvSuhu9AQrI9YK8GawB\nACADOtY1dKwBykPHGshClh3r4Zl8FUpu+O7/QNXXqFFj4pVXttb9vAAAeVAFISLejnee9anvW3//\ny+9rl7pxpMgFad2N3gAF5HpB3gzWAACQAR3rGs3csW7U91zA+AEloWMNZMF9rAEAoGAM1pSGbhwp\nckFad6M3QAG5XpA3gzUAAGRAx7qGjnX9z1vA+AEloWMNZEHHGgAACsZgTWnoxpEiF6R1N3oDFJDr\nBXkzWAMAQAZ0rGvoWNf/vAWMH1ASOtZAFnSsAQCgYAzWlIZuHClyQVp3ozdAAZXlejF69KFRqVTq\n/jZ69KGN/tZLb3ijNwAAwP/p7385GlFz6u+v1P2cQ42OdQ0d6/qft4DxA0pCx5qhqnHZbs5c61gD\nAEDBGKwpjbJ046gvuSCtu9EboIBcL8ibwRoAADKgY11Dx7r+5y1g/ICS0LFmqNKxri8dawAAKBiD\nNaWhG0eKXJDW3egNUECuF+StIYP12rVrY9KkSXHMMcfElVde2YgtUEKbNm1q9BYoILkgTS7Ym+sF\neav7YL1z58747Gc/G2vXro2nnnoqbr755vjRj35U721QQtu2bWv0FigguSBNLtib6wV5q/tg/cgj\nj8TRRx8dra2tMWLEiDj77LPjO9/5Tr23AQAAmar7S5q/8MILcdRRRw2ux40bF+vXr9/r40aPXljP\nbUVExI4dG+p+Tt67np6eRm+BApIL0noavQEKyPWCvNV9sH7nFjK/3IQJE+K///v/q8Nu9mX/exxa\n523cud9LHmqtXr06p51QZnLRzH7ZNSTfXLzf6xfFUJ7rRTn+uzwUTJgwIbOvVffB+sgjj4znn39+\ncP3888/HuHHj9viY5557rt7bAgCAX0vdO9YzZ86MZ599Nnp6emLHjh1xyy23xKJFi+q9DQAAyFTd\nn7EePnx43HDDDXHKKafEzp07Y+nSpTF58uR6bwMAADJVyJc0BwCAsincKy968Zjm1traGtOnT4/O\nzs44/vjjIyJi69atMX/+/Jg4cWKcfPLJe9yH9Ktf/Wocc8wxMWnSpLj77rsbtW0ydMEFF0RLS0u0\ntbUNHvtVMrBhw4Zoa2uLY445Jv7sz/6srt8D2UvlYvny5TFu3Ljo7OyMzs7OuOuuuwYfk4vm8Pzz\nz8fcuXNj6tSpMW3atLjuuusiwjWj2e0rF3W5ZlQL5O23365OmDChunnz5uqOHTuq7e3t1aeeeqrR\n26KOWlsQYWidAAAJKUlEQVRbqz//+c/3OPa5z32ueuWVV1ar1Wp1xYoV1S984QvVarVa/eEPf1ht\nb2+v7tixo7p58+bqhAkTqjt37qz7nsnWf/7nf1Yff/zx6rRp0waPvZ8M7Nq1q1qtVqvHHXdcdf36\n9dVqtVo99dRTq3fddVedvxOylMrF8uXLq1ddddVeHysXzaO3t7e6cePGarVarfb391cnTpxYfeqp\np1wzmty+clGPa0ahnrH24jFERFTf1U664447YsmSJRERsWTJklizZk1ERHznO9+Jc845J0aMGBGt\nra1x9NFHxyOPPFL3/ZKtOXPmxJgxY/Y49n4ysH79+ujt7Y3+/v7Bf/U477zzBj+HckrlImLv60WE\nXDSTsWPHRkdHR0REjBw5MiZPnhwvvPCCa0aT21cuIvK/ZhRqsE69eMzAXwTNoVKpxMc//vGYOXNm\nrFy5MiIi+vr6oqWlJSIiWlpaoq+vLyIifvazn+1xq0Z5GbrebwbeffzII4+UjSHq+uuvj/b29li6\ndOngP/fLRXPq6emJjRs3xqxZs1wzGDSQixNOOCEi8r9mFGqwbsabkrOndevWxcaNG+Ouu+6KG2+8\nMR544IE9Hq9UKr80JzI09O0vAzSPZcuWxebNm2PTpk1xxBFHxKWXXtroLdEg27dvjzPPPDOuvfba\nGDVq1B6PuWY0r+3bt8fv//7vx7XXXhsjR46syzWjUIP1e3nxGIa2I444IiIiDjvssDj99NPjkUce\niZaWltiyZUtERPT29sbhhx8eEXvn5ac//WkceeSR9d80uXs/GRg3blwceeSR8dOf/nSP47Ix9Bx+\n+OGDQ9OFF144WAWTi+by1ltvxZlnnhnnnntuLF68OCJcM/i/XPzRH/3RYC7qcc0o1GDtxWOa22uv\nvRb9/f0REfHqq6/G3XffHW1tbbFo0aLBl6BdvXr14P9BFi1aFP/2b/8WO3bsiM2bN8ezzz472INi\naHm/GRg7dmyMHj061q9fH9VqNf75n/958HMYOnp7ewffv/322wfvGCIXzaNarcbSpUtjypQpcfHF\nFw8ed81obvvKRV2uGdn8/mV27rzzzurEiROrEyZMqF5xxRWN3g519D//8z/V9vb2ant7e3Xq1KmD\n//v//Oc/r86bN696zDHHVOfPn199+eWXBz/nK1/5SnXChAnVj33sY9W1a9c2autk6Oyzz64eccQR\n1REjRlTHjRtX/eY3v/krZeCxxx6rTps2rTphwoTqn/zJnzTiWyFD787FqlWrqueee261ra2tOn36\n9OonP/nJ6pYtWwY/Xi6awwMPPFCtVCrV9vb2akdHR7Wjo6N61113uWY0uVQu7rzzzrpcM7xADAAA\nZKBQVRAAACgrgzUAAGTAYA0AABkwWAMAQAYM1gAAkAGDNQAAZMBgDZCRYcOGRWdn5+Db1772tYiI\n6Orqig0bNmR6rr/927+N119/fXB92mmnxSuvvJLJ177hhhvipptues8f/+abb8bv/u7vxq5duzI5\nP0BZuY81QEZGjRo1+OqhtebOnRtXXXVVHHvssZmda/z48fHYY4/FRz7ykcy+ZsQ7r1h27LHHxqOP\nPhrDhw9/z5/3F3/xFzFjxow444wzMt0PQJl4xhqgju6+++6YPXt2zJgxI84666x49dVXY+3atXHW\nWWcNfkx3d3csXLgwIiKWLVsWxx13XEybNi2WL18eERHXXXdd/OxnP4u5c+fGvHnzIiKitbU1tm7d\nGhERV199dbS1tUVbW1tce+21ERHR09MTkydPjs985jMxbdq0OOWUU+KNN97Ya3/r1q2LSZMmDQ7V\nXV1dcckll8Rxxx0XkydPjkcffTROP/30mDhxYlx++eWDn7do0aK4+eabs/8LAygRgzVARl5//fU9\nqiC33XbbHo+/9NJL8ZWvfCXuvffe2LBhQ8yYMSOuvvrqmD9/fqxfv36w2nHLLbfEOeecExERV1xx\nRTz66KPx/e9/P773ve/Fk08+GX/6p38av/EbvxHd3d1x7733RkREpVKJiIgNGzbETTfdFI888kg8\n/PDDsXLlyti0aVNERDz33HPx2c9+Np588sk45JBD4tvf/vZe38ODDz4YM2fOHFxXKpU48MAD49FH\nH41ly5bFJz/5yfi7v/u7ePLJJ+Omm26Kl19+OSIiOjo64qGHHsr4bxSgXN77v/MB8EsddNBBsXHj\nxuRj1Wo1Hn744Xjqqadi9uzZERGxY8eOmD17dgwbNiw+8YlPxB133BFnnnlm3HnnnfH1r389It4Z\nsleuXBlvv/129Pb2xlNPPRXTpk3b5zkefPDBOOOMM+Kggw6KiIgzzjgjHnjggVi0aFGMHz8+pk+f\nHhERM2bMiJ6enr2+xk9+8pM48cQT9zi2aNGiiIiYNm1aTJs2LVpaWiIi4rd/+7fjJz/5SYwZMyYO\nPPDA2LVrV7zxxhvxwQ9+8H3+zQEMDQZrgDqaP39+/Ou//utex88+++y44YYb4tBDD42ZM2fGhz70\nodi8eXNcddVV8dhjj8WHP/zh+OM//uNkfaNWpVKJ2l+dqVarg89mH3jggYPHhw0btscvP9Z696/e\nDHzeAQccsMfXOOCAA2Lnzp3JcwE0I1UQgDqoVCpxwgknxLp16+K///u/IyLi1VdfjWeffTYiIk46\n6aR4/PHHY+XKlYM1kFdeeSU+9KEPxejRo6Ovry/uuuuuwa83atSove4CUqlUYs6cObFmzZp4/fXX\n49VXX401a9bEnDlz9hqW9+W3fuu3YsuWLe/7+3vzzTdj2LBhewzeAM3GYA2QkXd3rL/0pS/t8fhH\nP/rRuOmmm+Kcc86J9vb2mD17djzzzDMR8c6zvwsWLIi1a9fGggULIiKivb09Ojs7Y9KkSfGHf/iH\ne1Q0PvOZz8QnPvGJwV9eHNDZ2Rnnn39+HH/88XHCCSfERRddFO3t7RERez2bnHp2+cQTT4zHHnss\n+f1VKpV9PiO9cePG+J3f+Z1f9tcDMOS53R4AgwZut7d+/fr4wAc+8J4/70tf+lIcd9xxcfrpp+e4\nO4Bi84w1AIMqlUpcdNFF8S//8i/v+XPefPPNePDBB2Px4sU57gyg+DxjDQAAGfCMNQAAZMBgDQAA\nGTBYAwBABgzWAACQAYM1AABk4P8HPZd7sd14s+gAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "print 'Denver elevation: %.2f (m)' % df[df.STAD.str.contains('Mile')].alt[:1]\n", "print 'Mexico City elevation: %.2f (m)' % df[df.STAD.str.contains('Azteca')].alt[:1]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Denver elevation: 1583.44 (m)\n", "Mexico City elevation: 2268.13 (m)\n" ] } ], "prompt_number": 21 }, { "cell_type": "code", "collapsed": false, "input": [ "from IPython.core.display import HTML\n", "def css_styling():\n", " styles = open(\"style.css\", \"r\").read()\n", " return HTML(styles)\n", "css_styling()" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "" ], "metadata": {}, "output_type": "pyout", "prompt_number": 20, "text": [ "" ] } ], "prompt_number": 20 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }