Skip to content

Instantly share code, notes, and snippets.

@manojgulati
Created January 2, 2014 18:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save manojgulati/8224331 to your computer and use it in GitHub Desktop.
Save manojgulati/8224331 to your computer and use it in GitHub Desktop.
{
"metadata": {
"name": "Script_4"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"[Topic]: Introduction to \"Pandas\" Python data analytics library "
]
},
{
"cell_type": "heading",
"level": 5,
"metadata": {},
"source": [
"[MG]: This is my 3rd IPython NB for CS109 Course\n",
"[Author]: manoj\n",
"[Location]: IIITD India"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"from pandas import* \n",
"import json"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"path = 'ch02_pandas/usagov_bitly_data2012-03-16-1331923249.txt'"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"path"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 3,
"text": [
"'ch02_pandas/usagov_bitly_data2012-03-16-1331923249.txt'"
]
}
],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# To open a file in python console located at path defined by 'path'\n",
"# Readline is a object to check one line of the loaded file terminated by new line '\\n'\n",
"open(path).readline()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 4,
"text": [
"'{ \"a\": \"Mozilla\\\\/5.0 (Windows NT 6.1; WOW64) AppleWebKit\\\\/535.11 (KHTML, like Gecko) Chrome\\\\/17.0.963.78 Safari\\\\/535.11\", \"c\": \"US\", \"nk\": 1, \"tz\": \"America\\\\/New_York\", \"gr\": \"MA\", \"g\": \"A6qOVH\", \"h\": \"wfLQtf\", \"l\": \"orofrog\", \"al\": \"en-US,en;q=0.8\", \"hh\": \"1.usa.gov\", \"r\": \"http:\\\\/\\\\/www.facebook.com\\\\/l\\\\/7AQEFzjSi\\\\/1.usa.gov\\\\/wfLQtf\", \"u\": \"http:\\\\/\\\\/www.ncbi.nlm.nih.gov\\\\/pubmed\\\\/22415991\", \"t\": 1331923247, \"hc\": 1331822918, \"cy\": \"Danvers\", \"ll\": [ 42.576698, -70.954903 ] }\\n'"
]
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Specializing JSON object decoding: \n",
"# Each line is loaded as a seperate record which can be decoded as indiviual json object\n",
"records = [json.loads(line) for line in open(path)]"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Sanity check for json decode\n",
"records[0]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 6,
"text": [
"{u'a': u'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.78 Safari/535.11',\n",
" u'al': u'en-US,en;q=0.8',\n",
" u'c': u'US',\n",
" u'cy': u'Danvers',\n",
" u'g': u'A6qOVH',\n",
" u'gr': u'MA',\n",
" u'h': u'wfLQtf',\n",
" u'hc': 1331822918,\n",
" u'hh': u'1.usa.gov',\n",
" u'l': u'orofrog',\n",
" u'll': [42.576698, -70.954903],\n",
" u'nk': 1,\n",
" u'r': u'http://www.facebook.com/l/7AQEFzjSi/1.usa.gov/wfLQtf',\n",
" u't': 1331923247,\n",
" u'tz': u'America/New_York',\n",
" u'u': u'http://www.ncbi.nlm.nih.gov/pubmed/22415991'}"
]
}
],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Accessing indiviual values: string level parsing\n",
"time_zones = [rec['tz'] for rec in records if 'tz' in rec]\n",
"time_zones[0:10]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 7,
"text": [
"[u'America/New_York',\n",
" u'America/Denver',\n",
" u'America/New_York',\n",
" u'America/Sao_Paulo',\n",
" u'America/New_York',\n",
" u'America/New_York',\n",
" u'Europe/Warsaw',\n",
" u'',\n",
" u'',\n",
" u'']"
]
}
],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"#sequence = time_zones\n",
"def get_counts(sequence):\n",
" counts = {}\n",
" for x in sequence:\n",
" if x in counts:\n",
" counts[x] += 1\n",
" else:\n",
" counts[x] = 1\n",
" return counts"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"counts = get_counts(time_zones)\n",
"counts['America/New_York']"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 9,
"text": [
"1251"
]
}
],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"len(time_zones)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 10,
"text": [
"3440"
]
}
],
"prompt_number": 10
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"time_zones.sort()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 11
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"time_zones[-10:]\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 12,
"text": [
"[u'Pacific/Honolulu',\n",
" u'Pacific/Honolulu',\n",
" u'Pacific/Honolulu',\n",
" u'Pacific/Honolulu',\n",
" u'Pacific/Honolulu',\n",
" u'Pacific/Honolulu',\n",
" u'Pacific/Honolulu',\n",
" u'Pacific/Honolulu',\n",
" u'Pacific/Honolulu',\n",
" u'Pacific/Honolulu']"
]
}
],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Using dictionary modules for couting elements\n",
"from collections import defaultdict"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 13
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def top_counts(count_dict, n=10):\n",
" value_key_pairs = [(count, tz) for tz, count in count_dict.items()]\n",
" value_key_pairs.sort()\n",
" return value_key_pairs[-n:]"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 14
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"top_counts(counts)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 15,
"text": [
"[(33, u'America/Sao_Paulo'),\n",
" (35, u'Europe/Madrid'),\n",
" (36, u'Pacific/Honolulu'),\n",
" (37, u'Asia/Tokyo'),\n",
" (74, u'Europe/London'),\n",
" (191, u'America/Denver'),\n",
" (382, u'America/Los_Angeles'),\n",
" (400, u'America/Chicago'),\n",
" (521, u''),\n",
" (1251, u'America/New_York')]"
]
}
],
"prompt_number": 15
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"value_key_pairs = [(count, ts) for ts, count in counts.items()]"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 16
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"value_key_pairs.sort()\n",
"value_key_pairs[-10:]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 17,
"text": [
"[(33, u'America/Sao_Paulo'),\n",
" (35, u'Europe/Madrid'),\n",
" (36, u'Pacific/Honolulu'),\n",
" (37, u'Asia/Tokyo'),\n",
" (74, u'Europe/London'),\n",
" (191, u'America/Denver'),\n",
" (382, u'America/Los_Angeles'),\n",
" (400, u'America/Chicago'),\n",
" (521, u''),\n",
" (1251, u'America/New_York')]"
]
}
],
"prompt_number": 17
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Python data analytics library\n",
"import pandas as pd\n",
"from pandas import DataFrame, Series"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 18
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"#help(pandas.DataFrame)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 19
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Inserting all records stored in form of lists in to 'pandas DataFrame'\n",
"frame = DataFrame(records)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 20
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"frame"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<pre>\n",
"&lt;class 'pandas.core.frame.DataFrame'&gt;\n",
"Int64Index: 3560 entries, 0 to 3559\n",
"Data columns (total 18 columns):\n",
"_heartbeat_ 120 non-null values\n",
"a 3440 non-null values\n",
"al 3094 non-null values\n",
"c 2919 non-null values\n",
"cy 2919 non-null values\n",
"g 3440 non-null values\n",
"gr 2919 non-null values\n",
"h 3440 non-null values\n",
"hc 3440 non-null values\n",
"hh 3440 non-null values\n",
"kw 93 non-null values\n",
"l 3440 non-null values\n",
"ll 2919 non-null values\n",
"nk 3440 non-null values\n",
"r 3440 non-null values\n",
"t 3440 non-null values\n",
"tz 3440 non-null values\n",
"u 3440 non-null values\n",
"dtypes: float64(4), object(14)\n",
"</pre>"
],
"output_type": "pyout",
"prompt_number": 21,
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"Int64Index: 3560 entries, 0 to 3559\n",
"Data columns (total 18 columns):\n",
"_heartbeat_ 120 non-null values\n",
"a 3440 non-null values\n",
"al 3094 non-null values\n",
"c 2919 non-null values\n",
"cy 2919 non-null values\n",
"g 3440 non-null values\n",
"gr 2919 non-null values\n",
"h 3440 non-null values\n",
"hc 3440 non-null values\n",
"hh 3440 non-null values\n",
"kw 93 non-null values\n",
"l 3440 non-null values\n",
"ll 2919 non-null values\n",
"nk 3440 non-null values\n",
"r 3440 non-null values\n",
"t 3440 non-null values\n",
"tz 3440 non-null values\n",
"u 3440 non-null values\n",
"dtypes: float64(4), object(14)"
]
}
],
"prompt_number": 21
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Output shown for the 'frame' is the summary view used for large datasets \n",
"# Series object is returned by frame['tz']\n",
"frame['tz'][:10]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 22,
"text": [
"0 America/New_York\n",
"1 America/Denver\n",
"2 America/New_York\n",
"3 America/Sao_Paulo\n",
"4 America/New_York\n",
"5 America/New_York\n",
"6 Europe/Warsaw\n",
"7 \n",
"8 \n",
"9 \n",
"Name: tz, dtype: object"
]
}
],
"prompt_number": 22
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Series object is returned by frame['tz'] has a method \"value_counts\" that gives us counts for this particular object\n",
"tz_counts = frame['tz'].value_counts()\n",
"tz_counts[:10]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 23,
"text": [
"America/New_York 1251\n",
" 521\n",
"America/Chicago 400\n",
"America/Los_Angeles 382\n",
"America/Denver 191\n",
"Europe/London 74\n",
"Asia/Tokyo 37\n",
"Pacific/Honolulu 36\n",
"Europe/Madrid 35\n",
"America/Sao_Paulo 33\n",
"dtype: int64"
]
}
],
"prompt_number": 23
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Little Data munging to fill in a substitute value for unknown and missing time zone data in the records. \n",
"# The fillna function can replace missing (NA) values and unknown(empty strings) values can be replaced by boolean array indexing\n",
"clean_tz = frame['tz'].fillna('Missing')\n",
"clean_tz[clean_tz == ''] = 'Unknown'"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 24
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"tz_counts = clean_tz.value_counts()\n",
"tz_counts[:50]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 25,
"text": [
"America/New_York 1251\n",
"Unknown 521\n",
"America/Chicago 400\n",
"America/Los_Angeles 382\n",
"America/Denver 191\n",
"Missing 120\n",
"Europe/London 74\n",
"Asia/Tokyo 37\n",
"Pacific/Honolulu 36\n",
"Europe/Madrid 35\n",
"America/Sao_Paulo 33\n",
"Europe/Berlin 28\n",
"Europe/Rome 27\n",
"America/Rainy_River 25\n",
"Europe/Amsterdam 22\n",
"America/Indianapolis 20\n",
"America/Phoenix 20\n",
"Europe/Warsaw 16\n",
"America/Mexico_City 15\n",
"Europe/Stockholm 14\n",
"Europe/Paris 14\n",
"America/Vancouver 12\n",
"Pacific/Auckland 11\n",
"Asia/Hong_Kong 10\n",
"Europe/Prague 10\n",
"Europe/Helsinki 10\n",
"America/Puerto_Rico 10\n",
"Europe/Oslo 10\n",
"Europe/Moscow 10\n",
"Asia/Calcutta 9\n",
"Asia/Istanbul 9\n",
"America/Montreal 9\n",
"Europe/Lisbon 8\n",
"Australia/NSW 6\n",
"Europe/Athens 6\n",
"Asia/Bangkok 6\n",
"Europe/Vienna 6\n",
"Chile/Continental 6\n",
"America/Edmonton 6\n",
"Europe/Budapest 5\n",
"America/Anchorage 5\n",
"Europe/Copenhagen 5\n",
"Asia/Seoul 5\n",
"Asia/Dubai 4\n",
"Europe/Bucharest 4\n",
"Asia/Beirut 4\n",
"Europe/Zurich 4\n",
"America/Winnipeg 4\n",
"Europe/Brussels 4\n",
"America/Halifax 4\n",
"dtype: int64"
]
}
],
"prompt_number": 25
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# PLot a bar graph after data munging, for top 10 values and rotate by 90 deg.\n",
"#import pylab as pl\n",
"import matplotlib.pyplot as plt \n",
"tz_counts[:10].plot(kind='barh', rot=0)\n",
"plt.show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAdYAAAD7CAYAAADXX7UGAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XtYVXXa//E3eDZIHceZyjQsyxFB2KJgIIqoCQiZIp5K\nIU2ThkaznJpqHnEqTcWmHp1Jh98YjCY4oqhpeEq2Z1FRTDO1A2hYmSIKKqLg/fsD2Y8keNy694L7\ndV3rkrX2Onz2ws13r++9Dg4iIiillFLKKhxtHUAppZSqTrRhVUoppaxIG1allFLKirRhVUoppaxI\nG1allFLKirRhVUoppayotq0DKOvz9PRk7969to6hlFKG4uHhQVZW1h2vR49Yq6G9e/ciIoYdJk6c\naPMMNTW/kbNrftsPRs9vrQMSbViV3cnJybF1hDti5PxGzg6a39aMnt9atGFVSimlrEgbVmV3oqKi\nbB3hjhg5v5Gzg+a3NaPntxYHEdF7BVczDg4O133d2bkJBQWn7lEapZQyBgcHB6zRJOoRa7UlVQ6F\nhfm2DHZDZrPZ1hHuiJHzGzk7aH5bM3p+a9GGVSmllLIi7Qquhsq6gq/3a7VOd4dSSlUnNa4ruFat\nWphMJsswbdo0m+YJCQnh2LFjBAQE8Mgjj1R47ZlnnsHZ2fmW1hcbG8uMGTMqfW3OnDnMmzfvmuk5\nOTm4u7vf0naUUkrdXYZpWBs2bMiePXssw5///OebXrakpMSqWYqKisjLy6N58+YANGnShC1btgBw\n+vRpfvrppxueQPRrVc1fWlrKiy++yLBhw+4stIEYvU5j5PxGzg6a39aMnt9aDNOwVsXFxYVTp8rO\ncN21axfdu3cHyo4AR48ejZ+fH1FRUfz000+MHTsWDw8PXnnlFY4fPw6UnR4+fvx4vLy8CAgIICMj\nAwARIT4+nl69etGzZ0+WLFli2abZbLZsx8HBgUGDBpGcnAzAkiVLCA8Pt3QnnD17lp49e9KhQwdC\nQkLYsGGDZT1JSUl06NCBLl26cPToUUvjGhAQwFtvvUXHjh356KOPmDRpkuVo9tChQ4SHh9OuXTsS\nExPv2n5VSil1ewzTsBYVFVXoCl60aBFw/UtLNm7cyNKlS5k/fz7Tp0/n4YcfZu/evfzud7/jgw8+\nsMy3a9cuzGYz06ZNY9SoUQBs2LCBgwcPsmbNGpYtW8a7777LxYsXAUhLSyMoKMiyfI8ePdi4cSOX\nL19m4cKFDBo0yPJagwYNSE1NZffu3cyePZvY2FgATp48ycSJE/n8889ZsGABq1evtizj4OBAdnY2\nW7duZfz48RXe54QJExg8eDBZWVkcPXr0Tnap3QoICLB1hDti5PxGzg6a39aMnt9aDHMT/gYNGrBn\nz55bWiY0NJRmzZoBZY3h5s2bARg5ciQBAQFMnToVBwcH+vXrh7OzM97e3ogIx44dY/HixaxZs4b1\n69cDUFBQwPbt2+natStbt26t0DDXqlWLLl26kJSUxIULFyrUXGvVqsVHH33E559/zrlz5/j+++85\nffo0q1evJigoiAceeACAnj17Vsg+dOhQ6tatW2HaxYsX2b17N8uWLcPBwYFhw4axY8eOKt59FOBy\n5efGgCcQYHnVbDZbPgTl3Tc6ruM6ruM1adxsNpOQkACU9X5ajRiEk5NTpdP/8Ic/yI8//igiIqtX\nr5aAgAAREYmNjZW4uLgK8504cUJERI4fPy5t27YVEZGoqCiZMWOGZT43NzfJzc2Vl156SRISEq7Z\n3nfffSfPPPOMZTwgIEAyMzNl48aN0rRpU5k1a1aFvOnp6fLUU09JQUGBlJaWStOmTSUnJ0c+/fRT\niYmJsawnMjLSkqN8neViY2NlxowZUlxcLM2bN5fLly9b1u3m5nZNRkBArjPY9689PT3d1hHuiJHz\nGzm7iOa3NaPnt9bfRsN0BVflySefxGw2c+nSpQpnzsqvTpkOCQkhMTGRy5cvM3fuXJ5++mnLfMuW\nLePs2bPs3LkTR0dHmjdvztChQ/nPf/7DiRMnADh8+DDnz58nLS2N4ODga3L4+/vz5ptvMmTIkArT\njx07RvPmzXF2diY5OZlTp07h4OBA7969WbNmDcePH+eHH37giy++qLDcr/OLCHXr1sXLy4vFixdz\n6dIl5s+ff/s7Timl1F1hmIb11zXWN998E4CXX36Z2bNn4+3tzaOPPmqpRTo4OFSov7722mscPXoU\nk8nE8ePHK9Quvby86NatGxMmTCA+Ph4APz8/hg4dSkREBO7u7kRHR1NSUmLpwq3M+PHj+c1vfmNZ\nL5RdenP69Gnatm3L5s2bcXV1BaBp06ZMmjSJ4OBghgwZQu/evSus69e14/Lx6dOnk5SUhMlkokWL\nFrd89rERlHfZGJWR8xs5O2h+WzN6fmup8TeIeP755wkLC6N///43nLe4uBh/f//r1DXtg94gQiml\nbl2Nu0GEPahXr57dN6rVQfnJBUZl5PxGzg6a39aMnt9aDHNW8N3yySef2DqCUkqpaqTGdwVXR9oV\nrJRSt85aXcE1/oi1+qr6pCZn5yb3MIdSStUsWmOtpkSkysHeH3Ju9DqNkfMbOTtoflszen5r0YZV\nKaWUsiKtsVZD1qoTKKVUTaKX2yillFJ2SBtWZXeMXqcxcn4jZwfNb2tGz28t2rBWU+W3dKxsuP/+\n39g6nlJKVVtaY62G9DpWpZS6dVpjVUoppeyQNqzK7hi9TmPk/EbODprf1oye31rsqmGtVasWJpMJ\nLy8vJkyYwKVLl255HX369KGgoACA+fPn4+3tzbBhw/jss8+YOnXqDZcfM2YMW7duJSoqisWLF1d4\nzcnJ6Zbz3EhAQACZmZnXnSc2NpYZM2ZYfdtKKaWsz64a1oYNG7Jnzx62b9/OgQMHWL169S2vY+XK\nldx///0A/P3vf2fRokXMmzePsLAwXn/99Rsun5GRQefOna95nitc+4xUa6hsO5XNU5MY/ZmORs5v\n5Oyg+W3N6Pmtxa4a1nJ16tQhMDCQzZs3s2LFCjp37ozJZOKll17i1Kmy2/EVFRURFxeHj48PHh4e\npKamAuDi4kJeXh5jxoxh//79hIWF8eGHH5KQkMDLL78MQF5eHhMnTsTLywtPT0+2bdsGwNdff02b\nNm1wdCzbLdcrYs+ZMwdfX1/69Olj6f4wm8306NGDwYMH4+rqyltvvWWZPzMzk4iICDp16sSMGTMo\nKSm5Zp1XHxGnpKTw/PPPW8bLG9erj3BPnjxJq1atbm3nKqWUuqvssmE9ffo0K1asoHfv3nTp0oXt\n27ezZ88eXFxcWLRoEQALFy5k3759pKens3fvXrp37w783xHg7NmzeeihhzCbzYwbN67CUd/MmTO5\ndOkSGRkZ7N69m3bt2gGQlpZGUFAQUNaoTpgwAZPJZBnK1/Hll1+SmJhIWloaH3zwAaNGjbKse9Om\nTUyaNIk9e/awfPlycnNzARg9ejSvvfYaGzduZNOmTaxdu/aa9311xqqOUm/mCNfojF6nMXJ+I2cH\nzW9rRs9vLXb1dJuioiJMJhP3338/ffv2pVu3bnz33XdMmDCB7du3c+nSJdq1a8eLL75ISkoKb7/9\nNg0bNgSgcePGN72dxYsXs2bNGmrXLnv75V3Ha9asISEhAShrwOLi4ujfv79lOWdnZwBWrFjBgAED\naNSoEY0aNeKJJ54gIyMDAG9vb9q0aQOAr68vW7Zswd/fn0uXLuHj4wPAs88+y/LlywkODr6DvXUj\nUYDLlZ8bA55AgOVVs9ls6bYp/zDYy3hWVpZd5alp+XVcx2vKuNlstvzNd3FxwWrEjjg5OV0zLTIy\nUv79739LaWmppKamSkBAgIiIhISEyNatW6+Z38XFRfLy8q75OSEhQWJiYkREpF27dnLs2LEKy507\nd058fHws41FRUZKSklJpvsmTJ0tcXJxlekhIiGRkZIjZbJbQ0FDL9JiYGElMTJRjx46Ju7u7ZfrC\nhQslOjpaREQCAgIkMzNTREQaNWpkmWfOnDkSFRUlIiKxsbEyY8YMEREJCgqSLVu2iIjIoUOHxMXF\n5Zp9AAjIdQa7+rUrpZRdsNbfRrvsCr7asWPHaN26NRcuXCAxMdEyfcCAAcyePZvz588DZd3H1yNX\n1UvDw8Mt3cGlpaUUFBSQnp5OYGDgTWUKDQ0lNTWVM2fOcPjwYb755hu8vb2rrMk+9NBD1KtXjx07\ndlBUVERycjJPP/30NfN16NCBbdu2ce7cORYuXGjp8pUrj3sDePLJJ9mwYQOXL1+2fNNSSillP+yq\nYa2sdvjmm28ybtw4/P398fT0tMwzePBg3NzcLNPLD++rWt/VtcmxY8dSp04dOnXqRKdOnThw4ECF\n+mpVecrH3d3dGT58OMHBwYwbN474+PhrtvFrs2fPZvr06XTt2hU/Pz969epV6Xv905/+RGBgIF5e\nXpVmHzZsGFu2bMHDwwNnZ+dqWW+t7HdpJEbOb+TsoPltzej5rUVvaXiFl5cXO3bsoFatWraOcseM\nfktD81X1XyMycn4jZwfNb2tGz2+tWxpqw1oNGb1hVUopW9B7BSullFJ2SBtWZXeMXqcxcn4jZwfN\nb2tGz28tdnUdq7Kmqk9qcnZucg9zKKVUzaI11mrIWnUCpZSqSbTGqpRSStkhbViV3TF6ncbI+Y2c\nHTS/rRk9v7Vow6qUUkpZkdZYqyGtsSql1K3TGqu6rvLbIFY13H//b2wdUSmlqiVtWKstue5QWJhv\nw2zXZ/Q6jZHzGzk7aH5bM3p+a9GGVSmllLKiGl1jXbp0Kf379+frr7+2PJy8Mn369CEpKcnyQPSq\nvP/++1y+fJlFixYB8OWXX9K+fXsARo4cSUxMTIX5ExISyMzMZObMmXf4Tiq68b2CQe8XrJRSFelN\n+K1g0KBBFBUV0aFDB2JjY+94fYGBgSxatIimTZsC4OzsTGFhYZXzJyYmsmvXLm1YlVLKDujJS3fo\n7NmzZGRkMGvWLBYuXAjAuXPn6NevHyaTCXd3d7Zs2QKAi4sLp06dAqBfv354eXkRGBhIamqqZX0F\nBQVcvHjR0qhe7eLFi0yfPp2OHTsycOBA9uzZc808K1euxNfXl+nTp/PKK69YpsfHxzN+/HgAUlJS\nCAwMvGbb1Y3R6zRGzm/k7KD5bc3o+a2lxt4reNmyZQQFBdGyZUuaNWvG7t27+fLLL3FzcyM1NRUR\n4dy5c0DFB57PnTuXJk2aUFBQQEBAAP369QNg3bp19OzZs9JtrVq1iu3bt7N582YyMzOJjo5m+/bt\nlm9Gqamp/P3vfyctLY3atWvj4eFBXFwctWrVIiEhgX/961/k5+fz9ttvk56ezuXLlwkMDKRHjx43\n7J5WSil1b9XYI9akpCQiIiIAiIiIICkpCQ8PDxYtWsT//M//kJOTg5OT0zXLJScn06NHD/z8/Pj+\n++/Zt28fAKtXryY4OLjSba1YsYJnn32W+vXr4+fnx7lz5/j5558BWL9+PdOmTePzzz+nUaNG3Hff\nfQQGBvLZZ59x8OBBLl26RLt27UhLS+Opp57iwQcfpHnz5vTs2ZO0tLS7tHdsy8gPSgZj5zdydtD8\ntmb0/NZSI49YT506RXp6Ovv378fBwYHS0lIcHByYPn0627dvJykpiaeffpopU6YQGhpqWe7777/n\n448/xmw285vf/AaTyUR+ftllKzt27GD27NmVbq+yfnsRwcHBgccee4zs7GwOHTqEl5cXAC+88ALv\nvfcebdu2ZcSIEZWuo3z5qkUBLld+bgx4AgFXxs0V5izvvin/UOi4juu4jteEcbPZTEJCAlBW8rMa\nqYHmzJkjY8aMqTCtW7dusmHDBikpKRERkSlTpsh7770nIiIuLi6Sl5cnmzZtksDAQBER2bx5szg4\nOMiGDRtk//79Mnjw4Gu24+TkJCIiy5cvlwEDBkhRUZFs2bJFOnfuLCIin3zyicTExMjBgwfF1dVV\nvvrqK8uyHTp0kBYtWsjp06dFRCQ/P1/+8Ic/yE8//STHjh2TNm3aSEFBQaXvDxCQGwz2+6tPT0+3\ndYQ7YuT8Rs4uovltzej5rfV3sUYesSYnJ/PGG29UmBYeHk5UVBT33XcfdevWxcXFhfj4+ArzdOnS\nhUceeYS2bdvi5uZGz549ERHS0tIq7QYuP6Ls3bs3Bw8epEuXLjz66KN8/PHHltcdHBxo06YNn376\nKREREaxYsYJWrVoxcOBA9u7dS6NGjQBo3Lgx77zzDkOGDMHBwYEpU6bg7Ox8N3aPUkqpO1CjL7ex\nlqeeeop58+bx+9//3mrrDAoK4q9//St+fn63vKxebqOUUrdOL7exI2vWrLFao3r69GlcXV159NFH\nb6tRVUopZVvasNqZxo0bc+DAAf75z3/aOorNlJ9cYFRGzm/k7KD5bc3o+a1FG1allFLKirTGWg1p\njVUppW6dtWqsNfKs4Jrhete4grNzk3uUQymlahbtCq6mROS6Q0HBKVtHrJLR6zRGzm/k7KD5bc3o\n+a1FG1allFLKirTGWg1Zq06glFI1iV7HqpRSStkhbVirqfLbJd7JcP/9v7FJdqPXaYyc38jZQfPb\nmtHzW4ueFVxt3Xl3RmHh9c8sVkopdS2tsVZDN3cd602tSWu1SqkaQ2usSimllB2y+4a1Vq1amEwm\nyzBt2jSb5gkJCeHYsWMEBASQmZlp1XXHxsYyY8YMq67TiIxepzFyfiNnB81va0bPby12X2Nt2LAh\ne/bsua1lS0pKqF3bem+xqKiIvLw8mjdvbjnBx5qsvT6llFL3nt0fsVbFxcWFU6fK7h60a9cuunfv\nDpQd9Y0ePRo/Pz+ioqL46aefGDt2LB4eHrzyyiscP34cgKioKMaPH4+XlxcBAQFkZGQAZXcsio+P\np1evXvTs2ZMlS5ZYtmk2my3bqUxBQQF//etf8fT0ZOTIkXz33XeWTNHR0XTv3p327duTnJxsWSYp\nKYkOHTrQpUsXjh49apn+zTffMGLECDw9PZk4cSKFhYUABAQEMGnSJDp27Ei3bt1u+0uHPQsICLB1\nhDti5PxGzg6a39aMnt9a7L5hLSoqqtAVvGjRIuD6R3cbN25k6dKlzJ8/n+nTp/Pwww+zd+9efve7\n3/HBBx9Y5tu1axdms5lp06YxatQoADZs2MDBgwdZs2YNy5Yt49133+XixYsApKWlERQUVOV2ExIS\nOHPmDLt37yYwMJA333zT8tqWLVtITU1l5cqVvP322wCcPHmSiRMn8vnnn7NgwQJWr15teV+vv/46\nvXv3ZteuXZw4cYL58+db3veRI0fIyMhg9OjRzJw583Z2q1JKqbvE7hvWBg0asGfPHssQERFxw2VC\nQ0Np1qwZUNYYjhgxAoCRI0fy2WefAWUNVL9+/XB2dsbb2xsR4dixYyxevJgVK1ZYjiLPnDnD9u3b\nAdi6dStdunSpcrsrV64kKioKR0dHBg0axLZt27h06RIAffv2pXHjxrRo0YJatWpx/PhxVq9eTVBQ\nEA888AAtW7akZ8+eAFy6dImdO3cycOBAateuzfPPP8/y5cst23n22WepVasW3bt3Z9u2bbexV+2b\n0es0Rs5v5Oyg+W3N6Pmtxe5rrFWpX78+xcXFAJYuYShrMB988MEK81Z1+nRl0y9fvsybb75JZGRk\nhenff/89LVq0uGHNtrJ1Ojg40LhxY8t43bp1uXDhwg1P7RaRSudp0qRJhfVULgpwufJzY8ATCLgy\nbr7y743Gr4xd+bCUd/Pc7fGsrKx7uj3Nr+M6XjPHzWYzCQkJQFl50WrEzjk5OVU6/fnnn5cFCxbI\nxYsX5bnnnpOAgAAREZk4caLExcVZ5hs/frzExcVJaWmpTJkyRV5//XUREYmMjJSuXbtKYWGh7Nix\nQ9q3by8iIps3b5bAwED55ZdfRETk0KFDcu7cOZk1a5bMmTPHst6AgADZtWtXhUz/+7//K2PHjpWS\nkhJZsGCBDBo0qNJMbm5ucuTIETl58qQ88cQT8vPPP8vRo0fl4YcflhkzZoiISP/+/eW///2vXLp0\nSV566SX5+OOPLdvNzMwUEZETJ06Ii4vLNfsGEBArDHb/30MppazGWn/z7L4r+Nc11vK65csvv8zs\n2bPx9vbm0UcftdQmf3227muvvcbRo0cxmUwcP36c8ePHW+bz8vKiW7duTJgwgfj4eAD8/PwYOnQo\nERERuLu7Ex0dTUlJiaXb9mp9+vShRYsWtGjRgkGDBhEZGYmzszNeXl6sW7eOyZMnV5qpXNOmTZk0\naRLBwcEMGTKE3r17W157//33SUtLo2PHjvz2t7/lueeeq3T/6JnESillX2rsnZeef/55wsLC6N+/\n/w3nLS4uxt/fnx07dtyDZHfO6HdeMpvNlm4bIzJyfiNnB81va0bPr3deuofq1atnmEZVKaWUbdXY\nI9bqzOhHrEopZQt6xKqUUkrZIW1Yld0pPx3eqIyc38jZQfPbmtHzW4thr2NVN3LnZws7OzexQg6l\nlKpZtMZaDVmrTqCUUjWJ1liVUkopO6QNq7I7Rq/TGDm/kbOD5rc1o+e3Fm1YlVJKKSvSGms1ZIvb\nHDo7N6Gg4NSNZ1RKKTtlrRqrNqzVkPVuEHFLW9UTppRShqYnL6lqy+h1GiPnN3J20Py2ZvT81qIN\nq1JKKWVF2hV8GxwdHXn22WeZN28eACUlJTz44IN07tyZzz77jM8++4wDBw7w+uuv39J6/fz82LJl\nyx3n065gpZS6ddbqCtY7L92G++67j6+++ooLFy5Qv3591q5dy8MPP2w5aSgsLIywsLBbXq81GlWl\nlFK2pV3BtykkJISVK1cCkJSUxJAhQyzfdBISEnj55ZcBWLt2LV27dsXDw4Nu3boB8MMPPxAcHIyn\npyceHh589913ADg5OQFldYoePXowePBgXF1deeuttyzbzcjIoEePHphMJt54443basDtndHrNEbO\nb+TsoPltzej5rUUb1ts0aNAgkpOTKS4uZt++ffj4+FR4vfzo9b333iMhIYG9e/fy2WefAfDvf/+b\nAQMGkJWVRWZmJs2bN6+wDMCmTZuYNGkSe/bsYfny5eTm5gLwwgsvEBcXx5YtW9i3b59NLq1RSilV\nNW1Yb5O7uzs5OTkkJSXRp0+fa14vP3rt0qULI0eOJCEhgXr16gHQqVMnPvzwQ6ZOncqpU6eoX7/+\nNct7e3vTpk0b6tWrh6+vL1u2bCE3NxdHR0dMJhMNGzZk4MCB16kHRAGxV4YPAfNVr5nvwvhVY2Zz\nhW+utzpePs1a67vX40bOHxAQYFd5NL995atu+c1mM1FRUURFRREbG4vViLplTk5OIiLyt7/9TZo2\nbSr79++X9PR0CQ0NFRGRTz75RGJiYizz7927VyZMmCCtW7eWixcviojITz/9JNOnT5fWrVvLnj17\nKqz36nWJiMTExEhiYqLk5uZK+/btLdM/+eSTCvOVAwTkHg/6X0kpZWzW+jumR6x3YMSIEcTGxtKu\nXbsq5/nuu+9o3749U6dOpV69ehw/fpzs7Gx+//vf89prr9GjRw8OHDhwU9tr3rw5IkJWVhbnz58n\nJSWlWnYFX/3t0oiMnN/I2UHz25rR81uLnhV8G8obs+bNmxMTE2OZVj796p///Oc/880339CwYUOe\ne+45Hn74YaZOncq8efNo0KABbdu2ZeDAgRXW++ufrzZnzhzGjx9Pfn4+Tz75JHXq1Llr71MppdSt\n0+tYDebcuXPcd999FBUVERUVxYgRI+jdu3eFefQ6VqWUunV6S8MaKj4+HpPJxJNPPombmxvdu3e3\ndSSllFJX0YbVYMaNG8eePXvIysrir3/9K3Xr1rV1JKszep3GyPmNnB00v60ZPb+1aMOqlFJKWZHW\nWKshfR6rUkrdOr1XsLou/b6klFK2oV3Byu4YvU5j5PxGzg6a39aMnt9atGFVSimlrEhrrNWQteoE\nSilVk+h1rEoppZQd0oa1miq/raKRhvvv/w1g/DqNkfMbOTtoflszen5r0bOCqy3jdQUXFla/Bwoo\npWoerbFWQ7a5V7A1aG1YKWU7WmNVSiml7JDdNKxLly7F0dGRQ4cO3ZX1Z2ZmMnbs2NtePjk5mcmT\nJ5OQkECzZs0wmUw89thj9O3bly+//NKKSZXR6zRGzm/k7KD5bc3o+a3FbhrWpKQkQkNDSUpKsvq6\nS0pK8PLy4qOPPrrtdaxatYrg4GAcHBwYMmQIe/bsYceOHQQHB9OrVy+OHTtmxcQ3p6Sk5J5vUyml\n1PXZRcN69uxZMjIymDVrFgsXLgTKvvn06NGD8PBwWrduzfvvv09qaiodO3YkODiY3NxcAPLz85k0\naRJ+fn5ERESQlZUFQGxsLKNHj8bPz4/IyEg2bNhAWFgYAOfPnycuLg4fHx88PDxITU0FIDo6mk6d\nOuHr60t8fLwln4iQlZWFyWRCRCx98E2bNmXMmDF07tyZf/zjHwAcO3aMCRMm8OSTTxIZGUl2djYA\nUVFRvP766/j6+tKxY0fWrVsHwJAhQ/j8888t24qKimLJkiWICPHx8fTq1YuePXuyZMkSy37p3r07\n4eHhuLu7351fiI0FBATYOsIdMXJ+I2cHzW9rRs9vNWIH5s+fLy+++KKIiPj7+0tmZqakp6dL3bp1\n5dtvv5XCwkJp3Lix/OlPf5LS0lKJjY2VuLg4ERGZOHGiLF26VERE9u3bJyEhIZbpbdq0kV9++UVE\nRNLT0yU0NFRERD755BMZPny4nDt3TkRE8vPzRUTk1KlTIiJSXFwsPj4+UlhYKCIimZmZMnz4cMuy\nMTExFfLHx8dL//79RURkxIgRsmvXLhERWblypYwZM0ZERCIjI6V3795SVFQkmzdvlu7du4uISGpq\nqkRGRlq226JFC7lw4YKkp6fL+PHj5fLly3L27FkxmUxSXFws6enp4ujoKLt3765yfwICYsDBLv47\nKqVqKGv9DbKLy22SkpJ45ZVXAIiIiLB0C3t7e/PYY48B4OrqSt++fXF0dMTX15c5c+YAsGTJEpYt\nW0ZsbCwAp0+fpqioCIDQ0FCaNWt2zfZSUlJ4++23adiwIQCNGzcGYO3atSQmJpKTk8OJEydYv349\nTz/9NKtMbR38AAAgAElEQVRWrSIkJKTK/KWlpTg6OlJSUsLnn3/O7t27r5nHwcGBiIgI6tevz5NP\nPmmZJygoiLFjx3Lx4kXS0tLo1q0b9erVY/HixaxZs4b169cDUFBQwPbt2wHw9PTEZDLdYK9GAS5X\nfm4MeAIBV8bNV/61t/EyH374IZ6enpZvv+V1G6OMGzn/1TUye8ij+e0rX3XLbzabSUhIAMDFxQWr\nsUrzfAfy8vKkYcOG8sgjj4iLi4u0aNFCWrZsWeEIU0QkICBAMjMzRaTi0aerq6scOXLkmvVefVT7\n62VCQkJk69atFeYvKCiQVq1aSW5uroiIPPPMM5KYmGjZdvnRbEJCwjVHrKGhofLWW29JcXGxPPTQ\nQ3LhwoVr8kRFRUlKSopl3MnJyfLz8OHDZfny5TJ06FD57LPPRETkpZdekoSEhGvW8+v9UhkMfsSa\nnp5+3fdn74yc38jZRTS/rRk9v7WaRJvXWFNSUhg+fDg5OTlkZ2dz9OhRWrVqxcaNG29q+aFDhzJz\n5kyKi4sB2Lt37w2XGTBgALNnz+b8+fNA2VFufn4+derU4YEHHuDw4cN88cUXAJw5c4aSkhKaNGkC\nVHwcW15eHvHx8ezcuZOXXnqJunXrEhISwscff0xpaSkiclNnDA8aNIi5c+eyadMmgoKCLO/rP//5\nDydOnADg8OHDlrzVXfk3S6Mycn4jZwfNb2tGz28tNm9Yk5OT6devX4Vp4eHhJCcnV/nA7vJb4AHE\nxMTQqFEjunTpQrt27SxdxOXzVbbM4MGDcXNzw9/fH09PT8xmMy1btiQ8PBw3NzdiYmIICwtDRFi7\ndi29evWqsJ6FCxdiMpno1KkTK1euZO3atTz00EMATJo0iZ9//pmOHTvi5ubG8uXLq8xT7qmnnmLj\nxo306tWL2rXLeuf9/PwYOnQoERERuLu7Ex0dTUlJSYX3oZRSyv7onZduYNSoUYwaNQpvb29bR7lp\nRr/zktlsNvQ3XyPnN3J20Py2ZvT81rrzkl2cvGTPrr7sRimllLoRPWKthox+xKqUUrag9wpWSiml\n7JA2rNWWg+EGZ+eyM6+vvhbOiIyc38jZQfPbmtHzW4vWWKsp7VJVSinb0BprNWStOoFSStUkWmNV\nSiml7JA2rMruGL1OY+T8Rs4Omt/WjJ7fWrRhVUoppaxIa6zVkN7y8N5xdm5CQcEpW8dQSlmBtWqs\n2rBWQ8a9QYQR6YliSlUXevKSqsbMtg5wR4xcZzJydtD8tmb0/NaiDatSSillRTfVFbx06VL69+/P\n119/TZs2baweIjMzk//85z989NFHt7V8cnIy33//Pc2bN2fXrl3MnDnTygnh5MmTPPjgg8yaNYsX\nX3zR6usHcHJy4uzZs3e8Hu0Kvpe0K1ip6uKedgUnJSURGhpKUlLSHW/w10pKSvDy8rrtRhVg1apV\nBAcHWzHVtRYtWkRQUNBd2Qfl9KQjpZQyvhs2rGfPniUjI4NZs2axcOFCoKwfvUePHoSHh9O6dWve\nf/99UlNT6dixI8HBweTm5gKQn5/PpEmT8PPzIyIigqysLABiY2MZPXo0fn5+REZGsmHDBsLCwgA4\nf/48cXFx+Pj44OHhQWpqKgDR0dF06tQJX1/fCo9yExGysrIwmUxVftNISUkhMDCQwMBAy/pEhOef\nf54OHTrg7u7Of//73+vuh+TkZN59911++eUXjh07Zpnu5OTEO++8Q7t27Rg6dCinTpWdIZqbm8uI\nESNo27YtkydPxtnZ2bLMokWLCA0Nxd/fn3/961+Vbq+yeW41s3GZbR3gjhi5zmTk7KD5bc3o+a3l\nhg3rsmXLCAoKomXLljRr1ozdu3cDsHnzZqZNm0ZWVhZTp07FbDazY8cOOnfubGmAP/roIzw9Pdmy\nZQsTJ07krbfesqx348aNLF26lE8//bRCg/jf//6Xffv2kZ6ezt69e+nevTsAkydPZufOnZjNZv79\n739bukz37NmDh4dHlfnz8/N5++23+fTTT5k3bx5vvPEGBQUFmM1mSkpK2L17N/v27SMoKKjKdfzw\nww/88ssveHh4MGDAAMv7g7IvAg899BBfffUV9913HytWrABgypQpeHh48PXXX3Px4kXL0WhOTg4p\nKSksXbqUL774ggULFvDTTz9V2F5V89xKZqWUUrZxw4Y1KSmJiIgIACIiIkhKSsLBwQFvb28ee+wx\nnJyccHV1pW/fvjg6OuLr68u2bdsAWLJkCbGxsZhMJoYNG8aBAwcoKioCIDQ0lGbNml2zvZSUFKKj\no2nYsCEAjRs3BmDt2rX06dMHk8nE999/z/r164GybuCQkJAq86elpfHUU0/x4IMP0rx5c3r27Ela\nWhpt27Zlx44dvPrqq+zbt4/777+/ynUsXLiQAQMGVNgH5WrXrs2zzz4LQGBgoOW9r127lmHDhgEQ\nFRVl+fKwePFiduzYQadOnfDx8eHHH3+0vJdyVc1zK5khCoi9MnxIxaNAs52Pc4PX7WvcbDZf8039\n6vFfv27P4wEBAXaVR/PbV77qlt9sNhMVFUVUVBSxsbFYjVxHXl6eNGzYUB555BFxcXGRFi1aSMuW\nLSU9PV1CQ0Mt8wUEBEhmZqaISIXXXF1d5ciRI9esNzY2VuLi4izjVy8TEhIiW7durTB/QUGBtGrV\nSnJzc0VE5JlnnpHExETLtk+dOiUiIgkJCRITE1Nh2QULFlSYFh0dLQsXLhQRkfPnz0tiYqL4+PjI\nP/7xjyr3Q4cOHaR58+bi4uIiLi4uUq9ePfn2229FRMTJycky36JFiyQqKkpERB5//HHJy8sTEZHs\n7GzLfNOmTZPY2NhKt3Mz8xQVFd0wMyAgOtyT4bofIaWUgVjr83zdI9aUlBSGDx9OTk4O2dnZHD16\nlFatWrFx48abarSHDh3KzJkzKS4uBmDv3r03XGbAgAHMnj2b8+fPA3D69Gny8/OpU6cODzzwAIcP\nH+aLL74A4MyZM5SUlNCkSZPyLwnXrC8oKIh169bx888/W478goOD+emnn3BwcGD48OGMHTuWPXv2\nVJrn8OHDnDt3jtzcXLKzs8nOzuaNN95gwYIF130fTz31FPPnz+fy5cvMmzfPMn3w4MEsXryYo0eP\nAnDs2DFOnDhRYdmq5invMr5RZuMz2zrAHbn627HRGDk7aH5bM3p+a7luw5qcnEy/fv0qTAsPDyc5\nObnKM1gdHBwsr8XExNCoUSO6dOlCu3btmDNnToX5Kltm8ODBuLm54e/vj6enJ2azmZYtWxIeHo6b\nmxsxMTGEhYUhIqxdu5ZevXpVWE9CQgItWrSgRYsWtGzZkvPnz/POO+8wZMgQnnvuOaZMmYKzszP7\n9u3Dx8eHDh068Omnn/L6669XuQ/69+9f6T643vt444032L17N+3atePs2bM8+uijALRo0YLY2FjG\njBlD+/btGThwoKVeXL5sZfMUFhbedGallFK2Y+hbGo4aNYpRo0bh7e1t6yjXKCoqokGDBogIf//7\n3zlx4gRTpky5J9vW61jvJb2OVanqQu8VbOc2b95MTEwMJSUldOvWjb/85S88/PDD92Tb2rDeS9qw\nKlVd6L2C74L+/ftjMpkqDGvXrr2tdXXp0oWsrCz279/PP/7xj3vWqFYPZlsHuCNGrjMZOTtoflsz\nen5rqW3rAPZkyZIlto6glFLK4LQruBrSWyPeO/o8VqWqD2t1BesRazWl35eUUso2tMaq7I7R6zRG\nzm/k7KD5bc3o+a1FG1allFLKirTGWg1Zq06glFI1idZY1XXpCUy2oyc0KVWzaVdwtSUGHtLtIMPt\nD4WF+TfzC7JLRq+RaX7bMnp+a9GGVSmllLIirbFWQ3pLQ1vTGrdSRlQtbmm4dOlSHB0dOXTo0F1Z\nf2ZmJmPHjr3t5ZOTk5k8eTJQdu9fPz8/Hn/8cdq2bctrr70GlD3EfPHixdcs++OPP1oeEK+UUqrm\nsGnDmpSURGhoKElJSVZfd0lJCV5eXnz00Ue3vY5Vq1YRHBxMXl4ezz33HOPGjePQoUPs37+fBx98\nEKj6JKGHHnqIRYsW3fa2azazrQPUWEavkWl+2zJ6fmuxWcN69uxZMjIymDVrFgsXLgTKfik9evQg\nPDyc1q1b8/7775OamkrHjh0JDg4mNzcXgPz8fCZNmoSfnx8RERFkZWUBEBsby+jRo/Hz8yMyMpIN\nGzYQFhYGwPnz54mLi8PHxwcPDw9SU1MBiI6OplOnTvj6+hIfH2/JJyJkZWVhMplYunQpAwcOJCIi\nAkdHR2rVqsWrr75qmXfnzp34+vrSsWNH1q1bB0BOTg7u7u6Wdc2ZMwd/f388PDz4xz/+AcDf/vY3\nvL296dSpk+XIGODgwYP0798fNzc3YmNjLeu5dOkS06dPp2PHjgwcOLAaP+hcKaUMTGxk/vz58uKL\nL4qIiL+/v2RmZkp6errUrVtXvv32WyksLJTGjRvLn/70JyktLZXY2FiJi4sTEZGJEyfK0qVLRURk\n3759EhISYpnepk0b+eWXX0REJD09XUJDQ0VE5JNPPpHhw4fLuXPnREQkPz9fREROnTolIiLFxcXi\n4+MjhYWFIiKSmZkpkZGRIiISEhIiX3zxRaXvIzIyUnr37i1FRUWyefNm6d69u4iIZGdni5ubmyVH\nr169LNv69b8lJSUSFhYmBw8etGwvNTVVLl26JC+88IK4u7uLiMiyZcukf//+lm35+PhUmgkQEB1s\nNtjsY6WUugPW+uza7Ig1KSnJUoOMiIggKSkJBwcHvL29eeyxx3BycsLV1ZW+ffvi6OiIr68v27Zt\nA8qeQhMbG4vJZGLYsGEcOHCAoqIiAEJDQ2nWrNk120tJSSE6OpqGDRsC0LhxYwDWrl1Lnz59MJlM\nfP/996xfvx74v27gclJFQdvBwYGIiAjq16/Pk08+ye7du6+ZZ9GiRYwYMYImTZoAWP7dtWsX4eHh\ntG/fnt27d7NmzRqKi4vZu3cvzzzzDLVr1+a5556zbHvFihU8++yz1K9fHz8/P86dO8fx48dvcc8r\npZS6m2xyg4hTp06Rnp7O/v37cXBwoLS0FAcHB/r06WNp8ADq1q1rGa9Tpw7FxcUAlJaWsmLFClq2\nbFlhvQ4ODpba56+JyDWNY2FhIW+88QabNm2iefPm9OvXj9OnTwNlDW50dDQA4eHhrFq1ih49elS6\n7vKMjo6OlJaWVrn9X4+//PLLpKSk4ObmxiuvvEJ+fv41Ndurl6vsjLWqGnyIAlzKEwKeQMCVcfOV\nf+11/EOD5f31eFlZIyAgwPIzYIjxq2tk9pBH89tXvuqW32w2k5CQAICLiwtWY5Xj3ls0Z84cGTNm\nTIVp3bp1k0mTJlm6bkVEAgICJDMzU0Qqduu+++678tprr8mFCxdERCQrK0tEpEJ38a+XmTt37jVd\nwUeOHJEnnnhCSkpK5NChQ+Ls7CyJiYly+vRp6dKli2U9J0+eFBcXF1m8eLGUlpZKaWmpfPDBByIi\nEhUVJSkpKZZ5nZycRKRiV/D69eulV69ekpeXJyJlXcBFRUXy0EMPSWFhoeTm5kqrVq1k0qRJIiLS\np08fWbZsmVy8eFFGjRpl6Qpevny5DBgwQIqKimTLli3SuXPnSvcvhu8KTreDDDWzKzg9Pd3WEe6I\n5rcto+e31mfXJl3BycnJ9OvXr8K08PBwkpOTqzzL1sHBwfJaTEwMjRo1okuXLrRr1445c+ZUmK+y\nZQYPHoybmxv+/v54enpiNptp2bIl4eHhuLm5ERMTQ1hYGCLC2rVr6dWrl2U9TZs2JTExkRkzZvDE\nE0/g7u5eoQv219v89c/dunUjPDycPn364OnpSVJSEvXr1+eNN97A29ubQYMGERISYllu2rRpzJ07\nF5PJxH333UerVq0A6N27N97e3nTp0oUPP/yQjz/++Cb3uNEE2DpAjVX+rd6oNL9tGT2/tegNIiox\natQoRo0ahbe3t022f+7cOe677z5KS0v585//zBNPPMGLL75408vrDSJsTW8QoZQRVYsbRNir+Ph4\nmzWqACtXrsRkMuHp6Unt2rUZNGiQzbLYhtnWAWoso1+HqPlty+j5rUWfbmOHBg4cyMCBA20dQyml\n1G3QruBqSLuCbU27gpUyIu0KVkoppeyQNqzVloMONhoaNHC6mV+QXTJ6jUzz25bR81uL1lirKSN3\nRZqvurmCEekfF6VqNq2xVkPWqhMopVRNojVWpZRSyg5pw6rsjtG7Uo2c38jZQfPbmtHzW4vWWKup\nqm4NqaofZ+cmFBScsnUMpdQVWmOthvQ61ppGa+pKWYPWWJVSSik7pA2rskNmWwe4Q2ZbB7htRq+R\naX7bMnp+a9GG9VdycnJwd3evMC02NpYZM2ZUuUxCQgIvv/zy3Y6mlFLKALRhvQk3OhFITxSytgBb\nB7hDAbYOcNuMfGMO0Py2ZvT81qIN6y3o3r07kyZNomPHjnTr1o09e/ZcM8/KlSvx9fUlLy+PqKgo\nXn/9dXx9fenYsSPr1q2zzDdnzhx8fX3p06ePpfvkj3/8I5999hkA/fr1Y+TIkQDMnTuXt99+myNH\njuDq6sof//hHXF1dGTNmDJcuXbr7b1wppdRN04b1Fh05coSMjAxGjx7NzJkzK7yWmprK1KlTSUtL\no2nTpgDs3buX9evX89FHHzF58mQAvvzySxITE0lLS+ODDz5g1KhRAHTt2pVNmzYBcOzYMb7++msA\nNm3aRLdu3RARDh48SP/+/dm/fz85OTls27btXr31e8hs6wB3yGzrALfN6DUyzW9bRs9vLXod669U\ndrq1iFi6e5999llq1apF9+7deffddy2vr1+/nl27drF27VqcnJws64qIiKB+/fo8+eST7N69G4AV\nK1YwYMAAGjVqRKNGjXjiiSfIyMjA39+fDz/8kK+//pp27dpx+vRpfv75Z7Zv386sWbM4ceIEzZs3\np0ePHgB069aNbdu20bVr10reSRTgcuXnxoAn/9dFab7yr72OZ9lZnlsdv9f5K95fufyPm47ruI5f\nf9xsNpOQkACAi4sL1qLXsf5KaWkpjzzyCNnZ2dSpUwcoe/D4mDFjeOedd5gxYwYdOnTg5MmTdOrU\niezsbBITE1m8eDHZ2dkkJCTg5eUFwPPPP09oaCjh4eEAODs7U1hYyJQpU6hbty6vvvoqAH369GHi\nxIl4e3vTtm1bRo8eTePGjTl16hS1a9dm/vz57Ny5k5ycHMLCwti3bx8AM2bM4OzZs0ycOLHCe9Dr\nWGsavY5VKWvQ61jvkvKj0aSkJAAOHz7Mvn376NatW5XLiAiPPPIIKSkpDB8+nAMHDlx3G6GhoaSm\npnLmzBkOHz7MN998g7e3NwCdO3fmww8/pFu3bvj7+xMXF1fFEalSSil7pA1rJf72t7+xe/duTCYT\nf/nLX5g1axa1atW6Zr7y7mEHBwccHBxo06YNn376KREREXz//fcV5rn6Z3d3d4YPH05wcDDjxo0j\nPj7eMo+/vz+lpaU8+uijmEwm8vPz8ff3v2YdVY1XD2ZbB7hDZlsHuG1Gr5Fpftsyen5r0a7gasj4\nXcFmjHzJyr3Pb72u4KtrtUak+W3L6Pmt1RWsDWs1ZPyGVd0arbEqZQ1aY1VKKaXskDasyg6ZbR3g\nDpltHeC2Gb1Gpvlty+j5rUUbVqWUUsqKtMZaDVXPM4VVVfRB50pZh7VqrHrnpWpKvy8ppZRtaFew\nsjtGr9MYOb+Rs4PmtzWj57cWbViVUkopK9IaazVkrTqBUkrVJFpjVdelJzAppexddT3xTruCqy0x\n8JBuBxlqan4jZ9f8th9uLX9hYT7VkTasSimllBVpjbUa0nsFK6WMwb7OBzHEvYKXLl2Ko6Mjhw4d\nuivrz8zMZOzYsbe9fHJyMpMnTyYhIYFatWpZHiAO4ObmxtGjR60R0yI+Pp7BgwdbxgsKCmjdujU5\nOTk3tbyTk5NV8yillLK+u9qwJiUlERoaanlouDWVlJTg5eXFRx99dNvrWLVqFcHBwTg4OPDwww/z\n3nvvWV67Gyf/jBo1ih9++IEvvvgCgP/5n/9h5MiRuLi43HDZy5cv16ATksy2DnCHzLYOcAfMtg5w\nh8y2DnCHzLYOcIfMtg5gF+5aw3r27FkyMjKYNWsWCxcuBMouHu7Rowfh4eG0bt2a999/n9TUVDp2\n7EhwcDC5ubkA5OfnM2nSJPz8/IiIiCArKwuA2NhYRo8ejZ+fH5GRkWzYsIGwsDAAzp8/T1xcHD4+\nPnh4eJCamgpAdHQ0nTp1wtfXt8IDxUWErKwsTCYTAKGhoXz11VccPnz4mveyc+dOhg8fjo+PD2+8\n8QbFxcXs3LmT8PBwAJYtW0bDhg0pKSnhwoULPPbYY1Xul9mzZzNu3Dh27drF+vXrmTBhAikpKQQG\nBhIYGGjJnZOTQ9u2bRk9ejTu7u6WfQNw8uRJfH19SUtLu71fjlJKqbtH7pL58+fLiy++KCIi/v7+\nkpmZKenp6VK3bl359ttvpbCwUBo3bix/+tOfpLS0VGJjYyUuLk5ERCZOnChLly4VEZF9+/ZJSEiI\nZXqbNm3kl19+ERGR9PR0CQ0NFRGRTz75RIYPHy7nzp0TEZH8/HwRETl16pSIiBQXF4uPj48UFhaK\niEhmZqYMHz5cREQSEhIkJiZG/vOf/0hkZKSIiLi5ucmRI0dERCQgIEBOnz4tIiJ//vOfJTk5WUpK\nSuTRRx8VEZFXX31VvL29ZcuWLWI2m2Xo0KHX3TevvvqqNGrUSDZs2CCnTp2SNm3ayI8//ii5ubny\nxBNPyJkzZyQ7O1scHBws+0FExMnJSY4fPy4+Pj6ybt26KtcPCIgOOuigg50PXPdv5b1mrTx37TrW\npKQkXnnlFQAiIiIs3cLe3t6WIzpXV1f69u2Lo6Mjvr6+zJkzB4AlS5awbNkyYmNjATh9+jRFRUVA\n2ZFls2bNrtleSkoKb7/9Ng0bNgSgcePGAKxdu5bExERycnI4ceIE69ev5+mnn2bVqlWEhIRA2Z4E\nYOjQobz33nsVap6ZmZns37+fgIAAAC5evMjZs2cZNGgQjz32GAcPHmTnzp2MHz+ejRs3Ulpair+/\n/3X3zR//+EfS0tLo2rUrCxYs4KmnnuLBBx8EoGfPnqSlpeHj40PTpk3p27evZbmLFy/So0cP/vnP\nf95wGxAFuFz5uTHgCQRcGTdf+VfHdVzHddy24+W3QSz/G3svx81mMwkJCQA3VZK7aVZpnn8lLy9P\nGjZsKI888oi4uLhIixYtpGXLlhWOMEXKjgQzMzNFpOLRp6urq+Vo8WpXH9X+epmQkBDZunVrhfkL\nCgqkVatWkpubKyIizzzzjCQmJlq2XX40W37EKiLyr3/9S1588UXLEeuOHTskICCg0vf5zjvvyIwZ\nM6RHjx5y4sQJCQkJkaCgINm/f/919092dra4ubmJiMiCBQss2xYRiY6OloULF0pOTo5lnnL33Xef\nREVFyZtvvnnd9YPRj1jT7SBDTc1v5Oya3/bDrebnun/L7jVr5bkrNdaUlBSGDx9OTk4O2dnZHD16\nlFatWrFx48abWn7o0KHMnDmT4uJiAPbu3XvDZQYMGMDs2bM5f/48UHaUm5+fT506dXjggQc4fPiw\n5aShM2fOUFJSQpMmTQAo259loqKiWLduHSdOnACgU6dOHD9+nO3btwNw7tw5vvnmGwD8/f358MMP\n8fX15be//S15eXkcPnyYdu3a3dT7BAgKCmLdunX8/PPP/Pjjj6xfv57g4OAKmco5ODgwd+5cDh48\nyLRp0256G0oppe6du9KwJicn069fvwrTwsPDSU5OrvLMVgcHB8trMTExNGrUiC5dutCuXTtLF3H5\nfJUtM3jwYNzc3PD398fT0xOz2UzLli0JDw/Hzc2NmJgYwsLCEBHWrl1Lr169Kl1PnTp1GDt2rKVh\nBZg3bx4ff/wx7du3x9fX13L5kLe3N7/88gtdu3YFwMPDA3d395vaR+Xba9KkCe+88w5Dhgzhueee\nY8qUKTg7O1/zXq/OmZSUxPr165k9e/ZNbct4Amwd4A4F2DrAHQiwdYA7FGDrAHcowNYB7lCArQPY\nhRp5g4hRo0YxatQovL29bR3lrtAbRCiljKF63iCiRjas1Z3xG1Yzxv7ma8a4+c0YNztoflszc2v5\nq2fDqk+3uUtiYmLYsmVLhWnjxo0jMjLSRomUUkrdC3rEWg0Z/4hVKVUz6BGrMpSacvtDpZRROTs3\nsXWEu0IfG1dNiYhhh/T0dJtnqKn5jZxd89t+uNX81fEh56ANq7JD5feGNioj5zdydtD8tmb0/Nai\nDauyO6dPn7Z1hDti5PxGzg6a39aMnt9atGFVSimlrEgbVmV3bvbB7/bKyPmNnB00v60ZPb+16OU2\n1ZCnp+dN3V9ZKaXU//Hw8LBKnVgbVqWUUsqKtCtYKaWUsiJtWJVSSikr0oa1Gtm4cSNt27bl8ccf\nZ+bMmbaOU6kffviB7t27065dOwICAliwYAEAhYWF9O3bl5YtW/LMM89w9uxZyzL/+7//y+OPP46r\nqyubN2+2VfQKSktLMZlMhIWFAcbKf+7cOSIjI3niiSdwdXUlIyPDMPnj4+Px9fXFy8uLcePGAfa9\n70eMGMHvf//7Co+TvJ28X3/9NR06dODRRx/lrbfesmn+CRMm0LZtWzp06MC4ceMoKioyVP5yM2bM\nwNHRkVOn/u8mFVbLL6ra8PT0lA0bNkhOTo60adNGTpw4YetI1/jpp59kz549IiJy4sQJadWqlRQU\nFMjUqVMlJiZGLly4IH/84x9l+vTpIiJy/PhxadOmjRw5ckTMZrOYTCZbxreYMWOGDB06VMLCwkRE\nDJX/1VdflbfffluKiork0qVLcvr0aUPkz8vLExcXFzl79qyUlpZKcHCwrFq1yq6zb9y4UXbv3i1u\nbm6WabeTNzg4WJKTk+XkyZPi5+cnO3futFn+NWvWSGlpqZSWlsoLL7wg/+///T9D5RcROXr0qPTu\n3Y6zyS4AAATHSURBVFtcXFwkLy/P6vn1iLWaOHPmDABdu3blkUce4amnniIjI8PGqa71wAMP4Onp\nCcBvf/tb2rVrx86dO9mxYwcjR46kXr16jBgxwpI9IyODoKAgWrZsSbdu3RARCgsLbfkWyM3N5fPP\nP+eFF15Arpz7Z6T869at480336R+/frUrl2bRo0aGSJ/gwYNEBHOnDlDUVER58+fp3Hjxnad3d/f\nnyZNKt4P91bylh/NHjp0iEGDBtG0aVP69+9/zz7bleXv1asXjo6OODo60rt3bzZs2GCo/ADjx49n\n2rRpFaZZM782rNXEzp07+cMf/mAZd3V1Zfv27TZMdGPffvstX331Fd7e3hXy/+EPf2DHjh1A2X/2\ntm3bWpZp06aN5TVbeeWVV5g+fTqOjv/38TFK/tzcXC5cuEB0dDQ+Pj5MnTqVoqIiQ+Rv0KABH3/8\nMS4uLjzwwAP4+fnh4+NjiOxXu5W8GRkZfPvtt/zud7+zTLenz3Z8fLylHLJjxw5D5F+2bBkPP/ww\n7du3rzDdmvm1YVU2UVhYyKBBg/j73/+Ok5OT5cjvZpQ9Fs82VqxYwe9+9ztMJlOFzEbJf+HCBQ4f\nPkx4eDhms5mvvvqK//73v4bIf+LECaKjozlw4AA5OTls27aNFStWGCL71e40760sfzf97W9/w9nZ\nmYiICKDyXPaW//z580yePJlJkyZdk8ea+bVhrSY6derEwYMHLeNfffUVnTt3tmGiql26dInw8HCG\nDRtG3759gbL8X3/9NVB2okCnTp0A8PHx4cCBA5ZlDx48aHnNFrZu3cry5ctp1aoVQ4YMYf369Qwb\nNsww+Vu3bk2bNm0ICwujQYMGDBkyhFWrVhki/44dO+jcuTOtW7emadOmREREsGnTJkNkv9qt5m3d\nujXHjx+3TD9w4IDNP9sJCQmsXr2a+fPnW6YZIf93331HTk4OHh4etGrVitzcXLy8vDh+/LhV82vD\nWk00atQIKDszOCcnh7Vr1+Lj42PjVNcSEUaOHImbm5vlrE4o+1DOnTuXoqIi5s6da/mP6+3tzerV\nqzl69ChmsxlHR0ecnZ1tFZ/Jkyfzww8/kJ2dTXJyMoGBgcybN88w+QEef/xxMjIyuHz5MitXrqRn\nz56GyO/v78+uXbs4deoUxcXFpKWl8dT/b+cOVRWGAjCOH4PiG4hwFGWGGWQTBJvRqNVXMFsMvoFF\nH0CtNsGicWi3GUzLgkmt8t02vHDTvYerwv8XB4M/g/HBOKzd/oj2Z7/p9X3fLJdLc7lczGq1eum7\nvd1uzXg8Nuv12mSz2eT6J/TXajVzPp9NHMcmjmNjrTWHw8Hkcjm3/X85cYX3EkWRfN+X53maTqev\nzvnRfr9XKpVSEAQKw1BhGGqz2eh6varT6ahQKKjb7ep2uyX3TCYTeZ6narWq3W73wvrvoihKTgV/\nUv/pdFKz2VQQBBoMBrrf7x/Tv1gs1Gq11Gg0NBqN9Hg83rq91+spn88rk8nIWqv5fP6r3uPxqHq9\nrlKppOFw+O/96XRa1lrNZjNVKhUVi8Xk/e33+2/f//z8n5XL5eRUsMt+fmkIAIBDfAoGAMAhhhUA\nAIcYVgAAHGJYAQBwiGEFAMAhhhUAAIcYVgAAHGJYAQBw6Asn9QjAFbHF9QAAAABJRU5ErkJggg==\n"
}
],
"prompt_number": 27
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"tz_counts.plot(kind='barh')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 75,
"text": [
"<matplotlib.axes.AxesSubplot at 0xda480b8>"
]
}
],
"prompt_number": 75
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment