{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Session 1: Basic Operations and Basic Plotting\n", "\n", "In this notebook we replicate examples from Chapters 6-8 of the Lecture Notes using Python. Packages `pandas` and `plotnine` will provide similar functionality to what we saw using `tidyverse`. Datasets are available at `https://www.hcbravo.org/IntroDataSci/static/.csv`, and assumed to be downloaded to a subdirectory `data`.\n", "\n", "First we load the same dataset" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "arrest_tab = pd.read_csv('data/BPD_Arrests.csv')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
arrestageracesexarrestDatearrestTimearrestLocationincidentOffenseincidentLocationchargechargeDescriptiondistrictpostneighborhoodLocation 1
011126858.023BM01/01/201100:00:00NaNUnknown OffenseNaN3 0233Cds:P W/I Dist:Narc || Cds:Poss W/Intent Dist:...NaNNaNNaNNaN
111127013.037BM01/01/201100:01:002000 Wilkens Ave79-OtherWilkens Av & S Payson St1 1425Reckless Endangerment || Hand Gun ViolationSOUTHERN934.0Carrollton Ridge(39.2814026274, -76.6483635135)
211126887.046BM01/01/201100:01:002800 Mayfield AveUnknown OffenseNaNNaNUnknown ChargeNORTHEASTERN415.0Belair-Edison(39.3227699160, -76.5735750473)
311126873.050BM01/01/201100:04:002100 Ashburton St79-Other2100 Ashburton St1 1106Reg Firearm:Illegal Possession || HgvWESTERN735.0Panway/Braddish Avenue(39.3117196723, -76.6623546313)
411126968.033BM01/01/201100:05:004000 Wilsby AveUnknown Offense1700 Aliceanna StNaNUnknown ChargeNORTHERN525.0Pen Lucy(39.3382885254, -76.6045667070)
\n", "
" ], "text/plain": [ " arrest age race sex arrestDate arrestTime arrestLocation \\\n", "0 11126858.0 23 B M 01/01/2011 00:00:00 NaN \n", "1 11127013.0 37 B M 01/01/2011 00:01:00 2000 Wilkens Ave \n", "2 11126887.0 46 B M 01/01/2011 00:01:00 2800 Mayfield Ave \n", "3 11126873.0 50 B M 01/01/2011 00:04:00 2100 Ashburton St \n", "4 11126968.0 33 B M 01/01/2011 00:05:00 4000 Wilsby Ave \n", "\n", " incidentOffense incidentLocation charge \\\n", "0 Unknown Offense NaN 3 0233 \n", "1 79-Other Wilkens Av & S Payson St 1 1425 \n", "2 Unknown Offense NaN NaN \n", "3 79-Other 2100 Ashburton St 1 1106 \n", "4 Unknown Offense 1700 Aliceanna St NaN \n", "\n", " chargeDescription district post \\\n", "0 Cds:P W/I Dist:Narc || Cds:Poss W/Intent Dist:... NaN NaN \n", "1 Reckless Endangerment || Hand Gun Violation SOUTHERN 934.0 \n", "2 Unknown Charge NORTHEASTERN 415.0 \n", "3 Reg Firearm:Illegal Possession || Hgv WESTERN 735.0 \n", "4 Unknown Charge NORTHERN 525.0 \n", "\n", " neighborhood Location 1 \n", "0 NaN NaN \n", "1 Carrollton Ridge (39.2814026274, -76.6483635135) \n", "2 Belair-Edison (39.3227699160, -76.5735750473) \n", "3 Panway/Braddish Avenue (39.3117196723, -76.6623546313) \n", "4 Pen Lucy (39.3382885254, -76.6045667070) " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arrest_tab.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Operations that subset attributes\n", "\n", "First we look at the different variants of `select`" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/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", "
agesexdistrict
023MNaN
137MSOUTHERN
246MNORTHEASTERN
350MWESTERN
433MNORTHERN
\n", "
" ], "text/plain": [ " age sex district\n", "0 23 M NaN\n", "1 37 M SOUTHERN\n", "2 46 M NORTHEASTERN\n", "3 50 M WESTERN\n", "4 33 M NORTHERN" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# selection by attribute name\n", "arrest_tab[['age','sex','district']].head()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/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", "
arrestracesex
011126858.0BM
111127013.0BM
211126887.0BM
311126873.0BM
411126968.0BM
\n", "
" ], "text/plain": [ " arrest race sex\n", "0 11126858.0 B M\n", "1 11127013.0 B M\n", "2 11126887.0 B M\n", "3 11126873.0 B M\n", "4 11126968.0 B M" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# selection by attribute index\n", "arrest_tab.iloc[:,[0,2,3]].head()\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/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", "
arrestageracesexarrestDate
011126858.023BM01/01/2011
111127013.037BM01/01/2011
211126887.046BM01/01/2011
311126873.050BM01/01/2011
411126968.033BM01/01/2011
\n", "
" ], "text/plain": [ " arrest age race sex arrestDate\n", "0 11126858.0 23 B M 01/01/2011\n", "1 11127013.0 37 B M 01/01/2011\n", "2 11126887.0 46 B M 01/01/2011\n", "3 11126873.0 50 B M 01/01/2011\n", "4 11126968.0 33 B M 01/01/2011" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# select a slice of attributes\n", "arrest_tab.iloc[:,:5].head()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
arrestageracesexarrest_datearrestTimearrestLocationincidentOffenseincidentLocationchargechargeDescriptiondistrictpostneighborhoodLocation 1
011126858.023BM01/01/201100:00:00NaNUnknown OffenseNaN3 0233Cds:P W/I Dist:Narc || Cds:Poss W/Intent Dist:...NaNNaNNaNNaN
111127013.037BM01/01/201100:01:002000 Wilkens Ave79-OtherWilkens Av & S Payson St1 1425Reckless Endangerment || Hand Gun ViolationSOUTHERN934.0Carrollton Ridge(39.2814026274, -76.6483635135)
211126887.046BM01/01/201100:01:002800 Mayfield AveUnknown OffenseNaNNaNUnknown ChargeNORTHEASTERN415.0Belair-Edison(39.3227699160, -76.5735750473)
311126873.050BM01/01/201100:04:002100 Ashburton St79-Other2100 Ashburton St1 1106Reg Firearm:Illegal Possession || HgvWESTERN735.0Panway/Braddish Avenue(39.3117196723, -76.6623546313)
411126968.033BM01/01/201100:05:004000 Wilsby AveUnknown Offense1700 Aliceanna StNaNUnknown ChargeNORTHERN525.0Pen Lucy(39.3382885254, -76.6045667070)
\n", "
" ], "text/plain": [ " arrest age race sex arrest_date arrestTime arrestLocation \\\n", "0 11126858.0 23 B M 01/01/2011 00:00:00 NaN \n", "1 11127013.0 37 B M 01/01/2011 00:01:00 2000 Wilkens Ave \n", "2 11126887.0 46 B M 01/01/2011 00:01:00 2800 Mayfield Ave \n", "3 11126873.0 50 B M 01/01/2011 00:04:00 2100 Ashburton St \n", "4 11126968.0 33 B M 01/01/2011 00:05:00 4000 Wilsby Ave \n", "\n", " incidentOffense incidentLocation charge \\\n", "0 Unknown Offense NaN 3 0233 \n", "1 79-Other Wilkens Av & S Payson St 1 1425 \n", "2 Unknown Offense NaN NaN \n", "3 79-Other 2100 Ashburton St 1 1106 \n", "4 Unknown Offense 1700 Aliceanna St NaN \n", "\n", " chargeDescription district post \\\n", "0 Cds:P W/I Dist:Narc || Cds:Poss W/Intent Dist:... NaN NaN \n", "1 Reckless Endangerment || Hand Gun Violation SOUTHERN 934.0 \n", "2 Unknown Charge NORTHEASTERN 415.0 \n", "3 Reg Firearm:Illegal Possession || Hgv WESTERN 735.0 \n", "4 Unknown Charge NORTHERN 525.0 \n", "\n", " neighborhood Location 1 \n", "0 NaN NaN \n", "1 Carrollton Ridge (39.2814026274, -76.6483635135) \n", "2 Belair-Edison (39.3227699160, -76.5735750473) \n", "3 Panway/Braddish Avenue (39.3117196723, -76.6623546313) \n", "4 Pen Lucy (39.3382885254, -76.6045667070) " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# rename attributes\n", "arrest_tab.rename(columns={'arrestDate': 'arrest_date'}).head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Operations that subset entitites\n", "\n", "Next, we see operations that subset entities" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/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", "
arrestageracesexarrestDatearrestTimearrestLocationincidentOffenseincidentLocationchargechargeDescriptiondistrictpostneighborhoodLocation 1
011126858.023BM01/01/201100:00:00NaNUnknown OffenseNaN3 0233Cds:P W/I Dist:Narc || Cds:Poss W/Intent Dist:...NaNNaNNaNNaN
211126887.046BM01/01/201100:01:002800 Mayfield AveUnknown OffenseNaNNaNUnknown ChargeNORTHEASTERN415.0Belair-Edison(39.3227699160, -76.5735750473)
911127018.053BM01/01/201100:15:003300 Woodland Ave54-Armed Person3300 Woodland Av1 1425Reckless Endangerment || HgvNORTHWESTERN614.0Central Park Heights(39.3436773374, -76.6727297618)
\n", "
" ], "text/plain": [ " arrest age race sex arrestDate arrestTime arrestLocation \\\n", "0 11126858.0 23 B M 01/01/2011 00:00:00 NaN \n", "2 11126887.0 46 B M 01/01/2011 00:01:00 2800 Mayfield Ave \n", "9 11127018.0 53 B M 01/01/2011 00:15:00 3300 Woodland Ave \n", "\n", " incidentOffense incidentLocation charge \\\n", "0 Unknown Offense NaN 3 0233 \n", "2 Unknown Offense NaN NaN \n", "9 54-Armed Person 3300 Woodland Av 1 1425 \n", "\n", " chargeDescription district post \\\n", "0 Cds:P W/I Dist:Narc || Cds:Poss W/Intent Dist:... NaN NaN \n", "2 Unknown Charge NORTHEASTERN 415.0 \n", "9 Reckless Endangerment || Hgv NORTHWESTERN 614.0 \n", "\n", " neighborhood Location 1 \n", "0 NaN NaN \n", "2 Belair-Edison (39.3227699160, -76.5735750473) \n", "9 Central Park Heights (39.3436773374, -76.6727297618) " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# subset entities by index \n", "arrest_tab.iloc[[0,2,9],:]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
arrestageracesexarrestDatearrestTimearrestLocationincidentOffenseincidentLocationchargechargeDescriptiondistrictpostneighborhoodLocation 1
011126858.023BM01/01/201100:00:00NaNUnknown OffenseNaN3 0233Cds:P W/I Dist:Narc || Cds:Poss W/Intent Dist:...NaNNaNNaNNaN
111127013.037BM01/01/201100:01:002000 Wilkens Ave79-OtherWilkens Av & S Payson St1 1425Reckless Endangerment || Hand Gun ViolationSOUTHERN934.0Carrollton Ridge(39.2814026274, -76.6483635135)
211126887.046BM01/01/201100:01:002800 Mayfield AveUnknown OffenseNaNNaNUnknown ChargeNORTHEASTERN415.0Belair-Edison(39.3227699160, -76.5735750473)
311126873.050BM01/01/201100:04:002100 Ashburton St79-Other2100 Ashburton St1 1106Reg Firearm:Illegal Possession || HgvWESTERN735.0Panway/Braddish Avenue(39.3117196723, -76.6623546313)
411126968.033BM01/01/201100:05:004000 Wilsby AveUnknown Offense1700 Aliceanna StNaNUnknown ChargeNORTHERN525.0Pen Lucy(39.3382885254, -76.6045667070)
\n", "
" ], "text/plain": [ " arrest age race sex arrestDate arrestTime arrestLocation \\\n", "0 11126858.0 23 B M 01/01/2011 00:00:00 NaN \n", "1 11127013.0 37 B M 01/01/2011 00:01:00 2000 Wilkens Ave \n", "2 11126887.0 46 B M 01/01/2011 00:01:00 2800 Mayfield Ave \n", "3 11126873.0 50 B M 01/01/2011 00:04:00 2100 Ashburton St \n", "4 11126968.0 33 B M 01/01/2011 00:05:00 4000 Wilsby Ave \n", "\n", " incidentOffense incidentLocation charge \\\n", "0 Unknown Offense NaN 3 0233 \n", "1 79-Other Wilkens Av & S Payson St 1 1425 \n", "2 Unknown Offense NaN NaN \n", "3 79-Other 2100 Ashburton St 1 1106 \n", "4 Unknown Offense 1700 Aliceanna St NaN \n", "\n", " chargeDescription district post \\\n", "0 Cds:P W/I Dist:Narc || Cds:Poss W/Intent Dist:... NaN NaN \n", "1 Reckless Endangerment || Hand Gun Violation SOUTHERN 934.0 \n", "2 Unknown Charge NORTHEASTERN 415.0 \n", "3 Reg Firearm:Illegal Possession || Hgv WESTERN 735.0 \n", "4 Unknown Charge NORTHERN 525.0 \n", "\n", " neighborhood Location 1 \n", "0 NaN NaN \n", "1 Carrollton Ridge (39.2814026274, -76.6483635135) \n", "2 Belair-Edison (39.3227699160, -76.5735750473) \n", "3 Panway/Braddish Avenue (39.3117196723, -76.6623546313) \n", "4 Pen Lucy (39.3382885254, -76.6045667070) " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# subset entities by a slice of indices\n", "arrest_tab.iloc[:5,]" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
arrestageracesexarrestDatearrestTimearrestLocationincidentOffenseincidentLocationchargechargeDescriptiondistrictpostneighborhoodLocation 1
111127013.037BM01/01/201100:01:002000 Wilkens Ave79-OtherWilkens Av & S Payson St1 1425Reckless Endangerment || Hand Gun ViolationSOUTHERN934.0Carrollton Ridge(39.2814026274, -76.6483635135)
311126873.050BM01/01/201100:04:002100 Ashburton St79-Other2100 Ashburton St1 1106Reg Firearm:Illegal Possession || HgvWESTERN735.0Panway/Braddish Avenue(39.3117196723, -76.6623546313)
511127041.041BM01/01/201100:05:002900 Spellman Rd81-Recovered Property2900 Spelman Rd1 1425Reckless Endangerment || Handgun ViolationSOUTHERN924.0Cherry Hill(39.2449886230, -76.6273582432)
711126940.020WM01/01/201100:05:005200 Moravia RdUnknown OffenseNaN1 5200Deadly Weapon-Int/Injure || Aggravated AssaultNORTHEASTERN436.0Frankford(39.3235271620, -76.5496555072)
911127018.053BM01/01/201100:15:003300 Woodland Ave54-Armed Person3300 Woodland Av1 1425Reckless Endangerment || HgvNORTHWESTERN614.0Central Park Heights(39.3436773374, -76.6727297618)
\n", "
" ], "text/plain": [ " arrest age race sex arrestDate arrestTime arrestLocation \\\n", "1 11127013.0 37 B M 01/01/2011 00:01:00 2000 Wilkens Ave \n", "3 11126873.0 50 B M 01/01/2011 00:04:00 2100 Ashburton St \n", "5 11127041.0 41 B M 01/01/2011 00:05:00 2900 Spellman Rd \n", "7 11126940.0 20 W M 01/01/2011 00:05:00 5200 Moravia Rd \n", "9 11127018.0 53 B M 01/01/2011 00:15:00 3300 Woodland Ave \n", "\n", " incidentOffense incidentLocation charge \\\n", "1 79-Other Wilkens Av & S Payson St 1 1425 \n", "3 79-Other 2100 Ashburton St 1 1106 \n", "5 81-Recovered Property 2900 Spelman Rd 1 1425 \n", "7 Unknown Offense NaN 1 5200 \n", "9 54-Armed Person 3300 Woodland Av 1 1425 \n", "\n", " chargeDescription district post \\\n", "1 Reckless Endangerment || Hand Gun Violation SOUTHERN 934.0 \n", "3 Reg Firearm:Illegal Possession || Hgv WESTERN 735.0 \n", "5 Reckless Endangerment || Handgun Violation SOUTHERN 924.0 \n", "7 Deadly Weapon-Int/Injure || Aggravated Assault NORTHEASTERN 436.0 \n", "9 Reckless Endangerment || Hgv NORTHWESTERN 614.0 \n", "\n", " neighborhood Location 1 \n", "1 Carrollton Ridge (39.2814026274, -76.6483635135) \n", "3 Panway/Braddish Avenue (39.3117196723, -76.6623546313) \n", "5 Cherry Hill (39.2449886230, -76.6273582432) \n", "7 Frankford (39.3235271620, -76.5496555072) \n", "9 Central Park Heights (39.3436773374, -76.6727297618) " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# subset entities by a non-consecutive slice of indices\n", "arrest_tab.iloc[1:len(arrest_tab):2,].head()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
arrestageracesexarrestDatearrestTimearrestLocationincidentOffenseincidentLocationchargechargeDescriptiondistrictpostneighborhoodLocation 1
18611127698.017BM01/03/201115:00:00NaNUnknown OffenseNaN1A0007Murder-Att || Att-MurderNaNNaNNaNNaN
80611130540.017BM01/07/201118:40:00500 N Athol St79-Other500 N Athol Av1 0621NaNNaNNaNNaNNaN
110911131601.017AM01/10/201122:00:00NaNUnknown OffenseNaN2 0705Armed Robbery || Armed RobberyNaNNaNNaNNaN
139411133119.017BM01/13/201101:00:00NaNUnknown OffenseNaN1 5212Handgun On Person || Handgun On PersonNaNNaNNaNNaN
146111133667.017BF01/13/201113:40:001400 N Wilmer CtUnknown OffenseNaN1 0521Theft Less Than $100.00 || Armed RobberyNaNNaNNaNNaN
\n", "
" ], "text/plain": [ " arrest age race sex arrestDate arrestTime arrestLocation \\\n", "186 11127698.0 17 B M 01/03/2011 15:00:00 NaN \n", "806 11130540.0 17 B M 01/07/2011 18:40:00 500 N Athol St \n", "1109 11131601.0 17 A M 01/10/2011 22:00:00 NaN \n", "1394 11133119.0 17 B M 01/13/2011 01:00:00 NaN \n", "1461 11133667.0 17 B F 01/13/2011 13:40:00 1400 N Wilmer Ct \n", "\n", " incidentOffense incidentLocation charge \\\n", "186 Unknown Offense NaN 1A0007 \n", "806 79-Other 500 N Athol Av 1 0621 \n", "1109 Unknown Offense NaN 2 0705 \n", "1394 Unknown Offense NaN 1 5212 \n", "1461 Unknown Offense NaN 1 0521 \n", "\n", " chargeDescription district post neighborhood \\\n", "186 Murder-Att || Att-Murder NaN NaN NaN \n", "806 NaN NaN NaN NaN \n", "1109 Armed Robbery || Armed Robbery NaN NaN NaN \n", "1394 Handgun On Person || Handgun On Person NaN NaN NaN \n", "1461 Theft Less Than $100.00 || Armed Robbery NaN NaN NaN \n", "\n", " Location 1 \n", "186 NaN \n", "806 NaN \n", "1109 NaN \n", "1394 NaN \n", "1461 NaN " ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# subset entities that satisfy conditions ('filter')\n", "arrest_tab.query('age < 18').head()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
arrestageracesexarrestDatearrestTimearrestLocationincidentOffenseincidentLocationchargechargeDescriptiondistrictpostneighborhoodLocation 1
011126858.023BM01/01/201100:00:00NaNUnknown OffenseNaN3 0233Cds:P W/I Dist:Narc || Cds:Poss W/Intent Dist:...NaNNaNNaNNaN
711126940.020WM01/01/201100:05:005200 Moravia RdUnknown OffenseNaN1 5200Deadly Weapon-Int/Injure || Aggravated AssaultNORTHEASTERN436.0Frankford(39.3235271620, -76.5496555072)
811127051.024BM01/01/201100:07:002400 Gainsdbourgh Ct54-Armed Person2400 Gainsborough Ct1 1106Reg Firearm:Illegal Possession || Firearms Vio...NaNNaNNaNNaN
1111126892.025BM01/01/201100:20:002800 Violet Ave79-Other2800 Violet Av1 5212Handgun On Person || HgvNORTHWESTERN612.0Park Circle(39.3298283117, -76.6618069447)
1411126963.024BM01/01/201100:40:003900 Greenmount Ave79-Other3900 Greenmount AvNaNUnknown ChargeNORTHERN526.0Guilford(39.3364339198, -76.6095420543)
\n", "
" ], "text/plain": [ " arrest age race sex arrestDate arrestTime arrestLocation \\\n", "0 11126858.0 23 B M 01/01/2011 00:00:00 NaN \n", "7 11126940.0 20 W M 01/01/2011 00:05:00 5200 Moravia Rd \n", "8 11127051.0 24 B M 01/01/2011 00:07:00 2400 Gainsdbourgh Ct \n", "11 11126892.0 25 B M 01/01/2011 00:20:00 2800 Violet Ave \n", "14 11126963.0 24 B M 01/01/2011 00:40:00 3900 Greenmount Ave \n", "\n", " incidentOffense incidentLocation charge \\\n", "0 Unknown Offense NaN 3 0233 \n", "7 Unknown Offense NaN 1 5200 \n", "8 54-Armed Person 2400 Gainsborough Ct 1 1106 \n", "11 79-Other 2800 Violet Av 1 5212 \n", "14 79-Other 3900 Greenmount Av NaN \n", "\n", " chargeDescription district post \\\n", "0 Cds:P W/I Dist:Narc || Cds:Poss W/Intent Dist:... NaN NaN \n", "7 Deadly Weapon-Int/Injure || Aggravated Assault NORTHEASTERN 436.0 \n", "8 Reg Firearm:Illegal Possession || Firearms Vio... NaN NaN \n", "11 Handgun On Person || Hgv NORTHWESTERN 612.0 \n", "14 Unknown Charge NORTHERN 526.0 \n", "\n", " neighborhood Location 1 \n", "0 NaN NaN \n", "7 Frankford (39.3235271620, -76.5496555072) \n", "8 NaN NaN \n", "11 Park Circle (39.3298283117, -76.6618069447) \n", "14 Guilford (39.3364339198, -76.6095420543) " ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# filter on multiple conditions\n", "arrest_tab.query('age >= 18 & age <= 25').head()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
arrestageracesexarrestDatearrestTimearrestLocationincidentOffenseincidentLocationchargechargeDescriptiondistrictpostneighborhoodLocation 1
2523411251345.020BM06/23/201110:30:005100 Queensberry Ave97-Search & Seizure5100 Queensberry Av5 3550Cds:Poss Para || Cds ViolationNORTHWESTERN615.0Central Park Heights(39.3500168319, -76.6719283535)
15542NaN23BM04/23/201118:45:004700 Sinclair LnUnknown OffenseNaNNaNUnknown ChargeNORTHEASTERN436.0Parkside(39.3190208298, -76.5537618137)
1769211212484.053BM05/06/201119:30:002000 North Ave87-Narcotics2000 E North Av2 2210Trespass-Posted Property || Poss/MarijuanaEASTERN331.0Broadway East(39.3123594708, -76.5893006446)
9058712550486.048BM09/12/201210:40:001100 Riggs Ave87-Narcotics1100 Riggs Av4 3550Cds:Possess-Not Marihuana || Poss HeroinWESTERN715.0Sandtown-Winchester(39.3012258129, -76.6360573428)
8346112521898.029BM07/28/201200:35:005500 Bowleys Ln55-Disorderly Person5500 Bowleys La5 5311Dis.Erly House || Disorderly Conduct/FtoNORTHEASTERN433.0Frankford(39.3188979630, -76.5515936576)
29711128101.025BM01/04/201111:25:001200 W North Ave87-Narcotics1200 W North Av2C0696Con-Cds Manuf/Dist-Narc || Distribution Of Coc...WESTERN733.0Penn North(39.3103195075, -76.6370672730)
3118111285515.046BM08/02/201109:15:00NaNUnknown OffenseNaN1 2474Fta/Misdemeanor Defendant || Fta/Misdemeanor D...NaNNaNNaNNaN
2384111242998.029BM06/14/201116:00:002800 Westwood St87-Narcotics2800 Westwood Av1 0573Cds: Possession-Marihuana || Poss MarjuianaSOUTHWESTERN811.0Northwest Community Action(39.3081394023, -76.6650149717)
51029NaN32WM12/16/201110:00:002800 Boston StUnknown OffenseNaNNaNUnknown ChargeSOUTHEASTERN231.0Canton(39.2785486881, -76.5765176724)
6124412431901.029BM02/29/201218:00:00NaNUnknown OffenseNaN1 0340Tel Misuse:Repeat Calls || Tel Misuse:Repeat C...NaNNaNNaNNaN
\n", "
" ], "text/plain": [ " arrest age race sex arrestDate arrestTime arrestLocation \\\n", "25234 11251345.0 20 B M 06/23/2011 10:30:00 5100 Queensberry Ave \n", "15542 NaN 23 B M 04/23/2011 18:45:00 4700 Sinclair Ln \n", "17692 11212484.0 53 B M 05/06/2011 19:30:00 2000 North Ave \n", "90587 12550486.0 48 B M 09/12/2012 10:40:00 1100 Riggs Ave \n", "83461 12521898.0 29 B M 07/28/2012 00:35:00 5500 Bowleys Ln \n", "297 11128101.0 25 B M 01/04/2011 11:25:00 1200 W North Ave \n", "31181 11285515.0 46 B M 08/02/2011 09:15:00 NaN \n", "23841 11242998.0 29 B M 06/14/2011 16:00:00 2800 Westwood St \n", "51029 NaN 32 W M 12/16/2011 10:00:00 2800 Boston St \n", "61244 12431901.0 29 B M 02/29/2012 18:00:00 NaN \n", "\n", " incidentOffense incidentLocation charge \\\n", "25234 97-Search & Seizure 5100 Queensberry Av 5 3550 \n", "15542 Unknown Offense NaN NaN \n", "17692 87-Narcotics 2000 E North Av 2 2210 \n", "90587 87-Narcotics 1100 Riggs Av 4 3550 \n", "83461 55-Disorderly Person 5500 Bowleys La 5 5311 \n", "297 87-Narcotics 1200 W North Av 2C0696 \n", "31181 Unknown Offense NaN 1 2474 \n", "23841 87-Narcotics 2800 Westwood Av 1 0573 \n", "51029 Unknown Offense NaN NaN \n", "61244 Unknown Offense NaN 1 0340 \n", "\n", " chargeDescription district post \\\n", "25234 Cds:Poss Para || Cds Violation NORTHWESTERN 615.0 \n", "15542 Unknown Charge NORTHEASTERN 436.0 \n", "17692 Trespass-Posted Property || Poss/Marijuana EASTERN 331.0 \n", "90587 Cds:Possess-Not Marihuana || Poss Heroin WESTERN 715.0 \n", "83461 Dis.Erly House || Disorderly Conduct/Fto NORTHEASTERN 433.0 \n", "297 Con-Cds Manuf/Dist-Narc || Distribution Of Coc... WESTERN 733.0 \n", "31181 Fta/Misdemeanor Defendant || Fta/Misdemeanor D... NaN NaN \n", "23841 Cds: Possession-Marihuana || Poss Marjuiana SOUTHWESTERN 811.0 \n", "51029 Unknown Charge SOUTHEASTERN 231.0 \n", "61244 Tel Misuse:Repeat Calls || Tel Misuse:Repeat C... NaN NaN \n", "\n", " neighborhood Location 1 \n", "25234 Central Park Heights (39.3500168319, -76.6719283535) \n", "15542 Parkside (39.3190208298, -76.5537618137) \n", "17692 Broadway East (39.3123594708, -76.5893006446) \n", "90587 Sandtown-Winchester (39.3012258129, -76.6360573428) \n", "83461 Frankford (39.3188979630, -76.5515936576) \n", "297 Penn North (39.3103195075, -76.6370672730) \n", "31181 NaN NaN \n", "23841 Northwest Community Action (39.3081394023, -76.6650149717) \n", "51029 Canton (39.2785486881, -76.5765176724) \n", "61244 NaN NaN " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# sample some number of entities at random\n", "arrest_tab.sample(n=10)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
arrestageracesexarrestDatearrestTimearrestLocationincidentOffenseincidentLocationchargechargeDescriptiondistrictpostneighborhoodLocation 1
3056911282169.048BM07/28/201113:50:00200 Biddel St87-Narcotics2500 E Biddle St4 3550Cds:Possess-Not Marihuana || Cds ViolationCENTRAL142.0Mid-Town Belvedere(39.3035761870, -76.6131838645)
10305312604234.020BM12/16/201202:42:00300 Eutaw StUnknown Offense300 N Eutaw StNaNUnknown ChargeCENTRAL121.0Downtown(39.2929794458, -76.6211885580)
1721011210128.037BF05/04/201113:30:00800 N Bradford Ave87-Narcotics800 N Bradford St4 3550Cds:Possess-Not Marihuana || Cds ViolationEASTERN325.0Milton-Montford(39.3001834090, -76.5845447584)
701411158314.024BM02/24/201108:40:002800 Waldorf St97-Search & Seizure2800 Waldorf Av1 0493Firearm/Drug Traf Crime || Pwi CocaineNORTHWESTERN613.0Lucille Park(39.3399480325, -76.6717941985)
30140NaN33BM07/26/201101:48:002000 N Washington StUnknown OffenseNaNNaNUnknown ChargeEASTERN331.0South Clifton Park(39.3132585484, -76.5905157866)
\n", "
" ], "text/plain": [ " arrest age race sex arrestDate arrestTime arrestLocation \\\n", "30569 11282169.0 48 B M 07/28/2011 13:50:00 200 Biddel St \n", "103053 12604234.0 20 B M 12/16/2012 02:42:00 300 Eutaw St \n", "17210 11210128.0 37 B F 05/04/2011 13:30:00 800 N Bradford Ave \n", "7014 11158314.0 24 B M 02/24/2011 08:40:00 2800 Waldorf St \n", "30140 NaN 33 B M 07/26/2011 01:48:00 2000 N Washington St \n", "\n", " incidentOffense incidentLocation charge \\\n", "30569 87-Narcotics 2500 E Biddle St 4 3550 \n", "103053 Unknown Offense 300 N Eutaw St NaN \n", "17210 87-Narcotics 800 N Bradford St 4 3550 \n", "7014 97-Search & Seizure 2800 Waldorf Av 1 0493 \n", "30140 Unknown Offense NaN NaN \n", "\n", " chargeDescription district post \\\n", "30569 Cds:Possess-Not Marihuana || Cds Violation CENTRAL 142.0 \n", "103053 Unknown Charge CENTRAL 121.0 \n", "17210 Cds:Possess-Not Marihuana || Cds Violation EASTERN 325.0 \n", "7014 Firearm/Drug Traf Crime || Pwi Cocaine NORTHWESTERN 613.0 \n", "30140 Unknown Charge EASTERN 331.0 \n", "\n", " neighborhood Location 1 \n", "30569 Mid-Town Belvedere (39.3035761870, -76.6131838645) \n", "103053 Downtown (39.2929794458, -76.6211885580) \n", "17210 Milton-Montford (39.3001834090, -76.5845447584) \n", "7014 Lucille Park (39.3399480325, -76.6717941985) \n", "30140 South Clifton Park (39.3132585484, -76.5905157866) " ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# sample some fraction of entities at random\n", "arrest_tab.sample(frac=.1).head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pipelines of operations\n", "\n", "Similar to the `%>%` operator in `dplyr` the dot\n", "syntax in pandas permits to construct pipelines of\n", "operators. Notice that the semantics between the two\n", "languages is significantly different. The dot calls a\n", "method of an `DataFrame` object. The `%>%` operator is\n", "syntactic sugar that modifies a function call." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/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", "
sexdistrictarrest_date
16505FNaN04/29/2011
62537MNORTHEASTERN03/08/2012
92962MNaN09/27/2012
15619MNaN04/24/2011
77447FNORTHERN06/17/2012
\n", "
" ], "text/plain": [ " sex district arrest_date\n", "16505 F NaN 04/29/2011\n", "62537 M NORTHEASTERN 03/08/2012\n", "92962 M NaN 09/27/2012\n", "15619 M NaN 04/24/2011\n", "77447 F NORTHERN 06/17/2012" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "analysis_tab = (arrest_tab.query('age >= 18 & age <= 25') \n", " .loc[:,['sex','district','arrestDate']] \n", " .rename(columns={'arrestDate': 'arrest_date'}) \n", " .sample(frac=.5)) \n", "analysis_tab.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Operations that sort entities" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
arrestageracesexarrestDatearrestTimearrestLocationincidentOffenseincidentLocationchargechargeDescriptiondistrictpostneighborhoodLocation 1
75360NaN0BM06/03/201218:31:00NaNUnknown OffenseNaNNaNUnknown ChargeNaNNaNNaNNaN
12073NaN0BM03/30/201116:00:00NaNUnknown OffenseNaNNaNUnknown ChargeNaNNaNNaNNaN
9989112590772.00BM11/20/201218:25:003500 W Forest Park Ave87-Narcotics3500 W Forest Park Av4 3550Cds:Possess-Not Marihuana || Poss Of Cocaine &...NORTHWESTERN621.0Forest Park(39.3242568088, -76.6753989196)
1078511176627.00WM03/22/201108:00:00NaNUnknown OffenseNaN1 0340Tel Misuse:Repeat Calls || Tel Misuse:Repeat C...NaNNaNNaNNaN
2498811249315.00BM06/21/201121:15:002700 Harford Rd87-Narcotics2700 Harford Rd4 3550Cds:Possess-Not Marihuana || Poss CocaineNORTHEASTERN411.0Coldstream Homestead Montebello(39.3203734534, -76.5916378412)
\n", "
" ], "text/plain": [ " arrest age race sex arrestDate arrestTime \\\n", "75360 NaN 0 B M 06/03/2012 18:31:00 \n", "12073 NaN 0 B M 03/30/2011 16:00:00 \n", "99891 12590772.0 0 B M 11/20/2012 18:25:00 \n", "10785 11176627.0 0 W M 03/22/2011 08:00:00 \n", "24988 11249315.0 0 B M 06/21/2011 21:15:00 \n", "\n", " arrestLocation incidentOffense incidentLocation charge \\\n", "75360 NaN Unknown Offense NaN NaN \n", "12073 NaN Unknown Offense NaN NaN \n", "99891 3500 W Forest Park Ave 87-Narcotics 3500 W Forest Park Av 4 3550 \n", "10785 NaN Unknown Offense NaN 1 0340 \n", "24988 2700 Harford Rd 87-Narcotics 2700 Harford Rd 4 3550 \n", "\n", " chargeDescription district post \\\n", "75360 Unknown Charge NaN NaN \n", "12073 Unknown Charge NaN NaN \n", "99891 Cds:Possess-Not Marihuana || Poss Of Cocaine &... NORTHWESTERN 621.0 \n", "10785 Tel Misuse:Repeat Calls || Tel Misuse:Repeat C... NaN NaN \n", "24988 Cds:Possess-Not Marihuana || Poss Cocaine NORTHEASTERN 411.0 \n", "\n", " neighborhood Location 1 \n", "75360 NaN NaN \n", "12073 NaN NaN \n", "99891 Forest Park (39.3242568088, -76.6753989196) \n", "10785 NaN NaN \n", "24988 Coldstream Homestead Montebello (39.3203734534, -76.5916378412) " ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arrest_tab.sort_values(['age']).head()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
arrestageracesexarrestDatearrestTimearrestLocationincidentOffenseincidentLocationchargechargeDescriptiondistrictpostneighborhoodLocation 1
8605912532020.087BM08/14/201207:25:00NaNUnknown OffenseNaN1 1415Asslt-Sec Degree || Assault-Sec DegreeNaNNaNNaNNaN
3510511307549.087BM08/28/201115:00:003200 E Baltimore St79-Other3200 E Baltimore St2 3030Burglary-Fourth Degree || Burglary 4Th DegSOUTHEASTERN223.0Baltimore-Linwood(39.2924321320, -76.5716581336)
674111157007.086BM02/22/201115:15:00700 W Saratoga St4A-Agg. Asslt.- Gun700 W Saratoga St1 1106Reg Firearm:Illegal Possession || Agg AssaultCENTRAL122.0Poppleton(39.2925909270, -76.6299394290)
816311163616.085BM03/04/201109:23:002000 Ellsworth St4E-Common Assault2000 Ellsworth St1 1415Asslt-Sec Degree || Common AssaultEASTERN332.0Broadway East(39.3060746696, -76.5893534628)
284911139456.085WM01/25/201108:05:003100 Pulaski Hwy4B-Agg. Asslt.- Cut1700 E Pratt St1 1415Asslt-Sec Degree || 1 St Degree AssaultSOUTHEASTERN223.0Ellwood Park/Monument(39.2954696201, -76.5733132576)
\n", "
" ], "text/plain": [ " arrest age race sex arrestDate arrestTime arrestLocation \\\n", "86059 12532020.0 87 B M 08/14/2012 07:25:00 NaN \n", "35105 11307549.0 87 B M 08/28/2011 15:00:00 3200 E Baltimore St \n", "6741 11157007.0 86 B M 02/22/2011 15:15:00 700 W Saratoga St \n", "8163 11163616.0 85 B M 03/04/2011 09:23:00 2000 Ellsworth St \n", "2849 11139456.0 85 W M 01/25/2011 08:05:00 3100 Pulaski Hwy \n", "\n", " incidentOffense incidentLocation charge \\\n", "86059 Unknown Offense NaN 1 1415 \n", "35105 79-Other 3200 E Baltimore St 2 3030 \n", "6741 4A-Agg. Asslt.- Gun 700 W Saratoga St 1 1106 \n", "8163 4E-Common Assault 2000 Ellsworth St 1 1415 \n", "2849 4B-Agg. Asslt.- Cut 1700 E Pratt St 1 1415 \n", "\n", " chargeDescription district post \\\n", "86059 Asslt-Sec Degree || Assault-Sec Degree NaN NaN \n", "35105 Burglary-Fourth Degree || Burglary 4Th Deg SOUTHEASTERN 223.0 \n", "6741 Reg Firearm:Illegal Possession || Agg Assault CENTRAL 122.0 \n", "8163 Asslt-Sec Degree || Common Assault EASTERN 332.0 \n", "2849 Asslt-Sec Degree || 1 St Degree Assault SOUTHEASTERN 223.0 \n", "\n", " neighborhood Location 1 \n", "86059 NaN NaN \n", "35105 Baltimore-Linwood (39.2924321320, -76.5716581336) \n", "6741 Poppleton (39.2925909270, -76.6299394290) \n", "8163 Broadway East (39.3060746696, -76.5893534628) \n", "2849 Ellwood Park/Monument (39.2954696201, -76.5733132576) " ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# sort in descending order\n", "arrest_tab.sort_values(['age'], ascending=False).head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Operations to create new attributes" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/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", "
ageage_months
023276
137444
246552
350600
433396
541492
629348
720240
824288
953636
1028336
\n", "
" ], "text/plain": [ " age age_months\n", "0 23 276\n", "1 37 444\n", "2 46 552\n", "3 50 600\n", "4 33 396\n", "5 41 492\n", "6 29 348\n", "7 20 240\n", "8 24 288\n", "9 53 636\n", "10 28 336" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(arrest_tab.assign(age_months = 12 * arrest_tab.age)\n", " .loc[:10,['age','age_months']])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Operations that summarize attribute values over entities" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
age
min0.000000
mean33.196388
max87.000000
\n", "
" ], "text/plain": [ " age\n", "min 0.000000\n", "mean 33.196388\n", "max 87.000000" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arrest_tab.agg({'age': ['min', 'mean', 'max']})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Operations that group entities" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arrest_tab.groupby('district')" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/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", "
age
minmeanmax
district
CENTRAL033.03977286
EASTERN034.13602285
NORTHEASTERN030.42344078
NORTHERN1433.12887880
NORTHWESTERN034.61401978
SOUTHEASTERN032.51003787
SOUTHERN032.33834384
SOUTHWESTERN032.44925080
WESTERN034.36067373
\n", "
" ], "text/plain": [ " age \n", " min mean max\n", "district \n", "CENTRAL 0 33.039772 86\n", "EASTERN 0 34.136022 85\n", "NORTHEASTERN 0 30.423440 78\n", "NORTHERN 14 33.128878 80\n", "NORTHWESTERN 0 34.614019 78\n", "SOUTHEASTERN 0 32.510037 87\n", "SOUTHERN 0 32.338343 84\n", "SOUTHWESTERN 0 32.449250 80\n", "WESTERN 0 34.360673 73" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arrest_tab.groupby('district').agg({'age': ['min','mean','max']})" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/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", " \n", "
age
districtsex
CENTRALF35.672609
M35.339896
EASTERNF36.896000
M37.097640
NORTHEASTERNF33.528404
M32.806923
NORTHERNF35.866412
M35.629150
NORTHWESTERNF37.535328
M37.153008
SOUTHEASTERNF33.336996
M34.700698
SOUTHERNF33.742613
M34.538799
SOUTHWESTERNF35.389277
M34.973515
WESTERNF37.070691
M37.279273
\n", "
" ], "text/plain": [ " age\n", "district sex \n", "CENTRAL F 35.672609\n", " M 35.339896\n", "EASTERN F 36.896000\n", " M 37.097640\n", "NORTHEASTERN F 33.528404\n", " M 32.806923\n", "NORTHERN F 35.866412\n", " M 35.629150\n", "NORTHWESTERN F 37.535328\n", " M 37.153008\n", "SOUTHEASTERN F 33.336996\n", " M 34.700698\n", "SOUTHERN F 33.742613\n", " M 34.538799\n", "SOUTHWESTERN F 35.389277\n", " M 34.973515\n", "WESTERN F 37.070691\n", " M 37.279273" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(arrest_tab.query('age >= 21')\n", " .groupby(['district','sex'])\n", " .agg({'age': 'mean'}))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Functions\n", "\n", "Syntax to create a function that abstracts a pipeline of operations." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/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", "
age
districtsex
NORTHEASTERNM46.000000
NORTHERNM36.750000
NORTHWESTERNM35.333333
SOUTHERNM39.000000
WESTERNM40.375000
\n", "
" ], "text/plain": [ " age\n", "district sex \n", "NORTHEASTERN M 46.000000\n", "NORTHERN M 36.750000\n", "NORTHWESTERN M 35.333333\n", "SOUTHERN M 39.000000\n", "WESTERN M 40.375000" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def summarize_district(df):\n", " res = (df.query('age >= 21')\n", " .groupby(['district','sex'])\n", " .agg({'age': 'mean'}))\n", " return res\n", "\n", "summarize_district(arrest_tab.loc[:20,:])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Basic Plotting\n", "\n", "We will use the grammar of graphics here again. The python package `plotnine` implements this plotting framework." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "from plotnine import *" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/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", "
districtnum_arrests
0CENTRAL7719
1EASTERN8109
2NORTHEASTERN7935
3NORTHERN3352
4NORTHWESTERN7604
5SOUTHEASTERN5978
6SOUTHERN7519
7SOUTHWESTERN6197
8WESTERN9388
\n", "
" ], "text/plain": [ " district num_arrests\n", "0 CENTRAL 7719\n", "1 EASTERN 8109\n", "2 NORTHEASTERN 7935\n", "3 NORTHERN 3352\n", "4 NORTHWESTERN 7604\n", "5 SOUTHEASTERN 5978\n", "6 SOUTHERN 7519\n", "7 SOUTHWESTERN 6197\n", "8 WESTERN 9388" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "summary_tab = (arrest_tab.groupby('district')\n", " .size()\n", " .reset_index(name='num_arrests'))\n", "summary_tab" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/hcorrada/opt/miniconda3/envs/cmsc320/lib/python3.6/site-packages/plotnine/utils.py:284: FutureWarning: Method .as_matrix will be removed in a future version. Use .values instead.\n", " ndistinct = ids.apply(len_unique, axis=0).as_matrix()\n", "/Users/hcorrada/opt/miniconda3/envs/cmsc320/lib/python3.6/site-packages/pandas/core/generic.py:5191: FutureWarning: Attribute 'is_copy' is deprecated and will be removed in a future version.\n", " object.__getattribute__(self, name)\n", "/Users/hcorrada/opt/miniconda3/envs/cmsc320/lib/python3.6/site-packages/pandas/core/generic.py:5192: FutureWarning: Attribute 'is_copy' is deprecated and will be removed in a future version.\n", " return object.__setattr__(self, name, value)\n", "/Users/hcorrada/opt/miniconda3/envs/cmsc320/lib/python3.6/site-packages/matplotlib/font_manager.py:281: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.\n", " 'Matplotlib is building the font cache using fc-list. '\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAosAAAGyCAYAAACMd47vAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi40LCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcv7US4rQAAIABJREFUeJzs3X1cVHXe//H3zIgTICgKCqJSlyYo\nkJq6aV3elLjeo4s3iTflJtqlWVZqW2REmq27atTuZm2Krqjgoual1pVWFtWWW+imgTe4ZT/KTUwQ\nRVFHwPn90cOTExwZCAX09Xw89rGd7znznc8cPozvOTeDxel0OgUAAABUwFrbBQAAAKDuIiwCAADA\nFGERAAAApgiLAAAAMEVYBAAAgCnCIgAAAEwRFgEAAGCKsAgAAABThEUAAACYIiwCAADAFGERAAAA\npgiLAAAAMNWgtgtA/ZSfn1/bJdRJFotFnp6eOnfunJxOZ22XU+c1bNhQFy5cqO0y6jz6qmroq8rR\nU1VzPfWUv79/lR/DkUWgBlmtVnl5eclq5VfLHXa7vbZLqBfoq6qhrypHT1XNjd5TdAkAAABMERYB\nAABgirAIAAAAU4RFAAAAmCIsAgAAwBRhEQAAAKYIiwAAADBFWAQAAIApwiIAAABMERYBAABgirAI\nAAAAU4RFAAAAmCIsAgAAwBRhEQAAAKYIiwAAADBFWAQAAICpBrVdQH2zfv167dmzRwsWLDDGfve7\n3+n06dNaunSpMbZw4UL5+/vrzJkz+uijj9SgwU+72sPDQ2vXrpUkZWZmKjU1VUePHpXValXr1q0V\nFxenL774Qhs2bJAkXbx4USUlJbLb7cYc6enpio+PV05Ojmw2mzEeHByspKQkSVJ0dLTsdrssFos8\nPT3VrVs3TZkyRTfddJMkKTU1VevWrdPMmTPVr18/Y4777rtPc+bMUWRkZE3uOgAAUA8RFqsoMjJS\nf//731VSUiIPDw9duHBBR44ckd1uV2Fhofz8/CRJ+/bt00MPPaR//vOfGj58uO6///5ycx09elSL\nFy/WE088oS5dusjhcCg7O1sNGjTQmDFjNGbMGEnS7t279eqrr2r58uXl5oiLi9OgQYNM601KSlKr\nVq1UUFCgxMREbdiwQRMmTDDW+/j4KC0tTb1795aHh8cv3T0AAOA6w2noKrr11ltltVp16NAhSdLB\ngwfVtm1bRUREaN++fZKk7777TkVFRQoPD7/iXIcPH5a/v7+6du0qq9UqT09Pde/eXbfcckuN192s\nWTPdfvvtOnz4sMt4p06d5Ovrq23bttX4cwIAgPqPsFhFNptNYWFhys7OlvTjEcTw8HCFh4e7jIWE\nhMjHx+eKc7Vt21Z5eXl6/fXX9cUXX6i4uPiq1X38+HHt2rVLQUFBLuMWi0UTJ05Uenq6zp07d9We\nHwAAVM7hcCg5OVkJCQlKTk6Ww+Go7ZI4DV0dERERysrK0r333qvs7GzFxsaqSZMmevPNNyVJ2dnZ\nLtf7bdmyxeXIXbt27TR//nwFBgZqwYIF2rp1q1566SUVFRWpe/fueuihh9S4cWO3aklOTlZKSoqx\n3LNnTz3yyCPG8qxZs+R0OnX+/Hl17txZsbGx5ebo0qWLQkJCtHnzZo0dO7bK+wMAAPxyDodDw4YN\nMw4+ST/eo7BlyxaX+xauNcJiNURERGj9+vU6f/68vvnmG4WGhsrDw0NFRUUqKirS/v37FRcXZ2wf\nHR1d4TWLkhQWFqawsDBJUm5urpKSkrRs2TLNnj3brVomT558xWsWlyxZouDgYO3Zs0cvv/yyzpw5\no0aNGpXbbuLEiUpMTNTgwYMrnCc/P1/5+fnGstVqVUBAgFs13kgu3Wx0+U1HMGexWNhXbqCvqoa+\nqhw9VTXXqqdSU1OVnZ2tkpISYywrK0tpaWmaPHnyVX9+M4TFamjfvr0k6e2331abNm2MG0M6dOig\nHTt2qKCgQBEREVWeNyQkRFFRUdq+fXuN1muxWNSlSxf17dtXK1asUHx8fLltQkNDFRkZadyB/XMb\nN27UsmXLjOVJkyZpxowZNVrn9cTX17e2S6g3GjZsWNsl1Bv0lfvoK/fQU+67Fj2Vl5dnOn7pBtra\nQFishgYNGigsLEybNm3Sr3/9a2M8IiJC6enpatOmjVu/gPv371dubq7uuOMONW3aVD/88IM+/PBD\nhYaGXpW6hw8frilTpujrr79W27Zty62fMGGCZs+eLafTWW7dyJEj1adPH2PZarWqsLDwqtRZn9ls\nNvn6+qqoqEhlZWW1XU6d5+3tfVWv1b1e0FdVQ19Vjp6qmmvVU4GBgabjNfVvbnVCJ2GxmiIiIrR3\n716XO57Dw8N18uRJ3XXXXS7bbt68WW+99ZbL2MqVK+Xt7a3du3crLS1N586dk4+Pj7p37256yroi\n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\nnL744gtt2LBB0o/Xh5aUlMhutxtzpKenKz4+Xjk5ObLZbMZ4cHCwkpKSKt0fkpSamqp169Zp5syZ\n6tevnzHHfffdpzlz5igyMrKKP0kAAHA9qlZYvOeee3ThwgWNHj1akuTl5SWLxWKst1gsOnXqlNvz\neXl5KTU1VbNnzy63LicnR88884zGjh2rJ598UpK0fft2zZ07V/Pnz3f5nsekpCS1atVKBQUFSkxM\n1IYNGzRhwgQlJiYa26xatUqFhYV69NFHq/SaIyMj9fe//10lJSXy8PDQhQsXdOTIEdntdhUWFsrP\nz0+StG/fPj300EPG44YPH67777+/3HxHjx7V4sWL9cQTT6hLly5yOBzKzs5WgwYNNGbMGI0ZM0aS\ntHv3br366qtavnx5uTni4uI0aNAg05rN9sclPj4+SktLU+/evY3wDAAAcLlqhcVZs2a5hMNfasiQ\nIdq8ebMOHz6s//qv/3JZt3LlSvXu3VsxMTHGWExMjL7//nv97W9/0+9///ty8zVr1ky33367Dh8+\nXGM13nrrrbJarTp06JDCw8N18OBBtW3bVk2aNNG+ffv03//93/ruu+9UVFSk8PDwSuc7fPiw/P39\n1bVrV0mSp6enunfvXmP1Xs5sf3Tq1El5eXnatm2bhg0bdlWeGwAA1G/VCouXH6mrCX5+fho6dKjW\nrFmjhIQEY9zhcOjgwYOKjY0t95hevXrp2WeflcPhcDlFK0nHjx/Xrl271Llz5xqr0WazKSwsTNnZ\n2QoPD9e+ffsUHh6uJk2aKDs7W//93/+tffv2KSQkRD4+PpXO17ZtW+Xl5en1119X9+7d1b59e3l7\ne9dYvZcz2x8Wi0UTJ07Uiy++qKioqF90OQEAoOocDofWrFmj3NxchYSEaMKECeX+TQNqW7VPQy9d\nulRhYWHl1h06dEj/8z//o/fff79Kc8bExGjq1Knat2+fGjduLEk6c+aMLl68qGbNmpXbvmnTprp4\n8aLOnDlj/GLNmjVLTqdT58+fV+fOnSsMmVcya9Ysly8cLykpcbkuMiIiQllZWbr33nuVnZ2t2NhY\nNWnSRG+++aYkKTs7u9y1flu2bNG2bduM5Xbt2mn+/PkKDAzUggULtHXrVr300ksqKipS9+7d9dBD\nDxmvvzLJyclKSUkxlnv27KlHHnnE5fVUtj+6dOmikJAQbd68WWPHjnXreQEAv5zD4dCwYcOUnZ1t\njKWnp2vLli0ERtQp1QqLGRkZKioqqnBdUVGRPvrooyrP6e3trZiYGKWkpOjhhx+WJDVq1EhWq1UF\nBQUuN55I0okTJ2S1WtWoUSNjbMmSJQoODtaePXv08ssv68yZMy7rK7NkyZIKb3C5JCIiQuvXr9f5\n8+f1zTffKDQ0VB4eHioqKlJRUZH279+vuLg4lzmjo6MrvGZRksLCwozAnZubq6SkJC1btqzCazcr\nMnny5Ctes+ju/pg4caISExM1ePBg07ny8/Nd/mqL1WpVQECAW3XeSC7dcHT5jUcwZ7FY2FduoK+q\npr70VWpqqrKzs1VSUmKMZWVlKS0tTZMnT76qz01PVU196amrpVphUZLpNYuffvqpmjdvXq05hw4d\nqq1btyozM1PSj9/pGBYWpk8++USdOnVy2fYf//iHwsLCyn36slgs6tKli/r27asVK1YoPj6+WrVU\n5NJRxrfffltt2rQxbgrp0KGDduzYoYKCAkVERFRr7pCQEEVFRWn79u01Vq/k3v4IDQ1VZGSkcQd2\nRTZu3Khly5YZy5MmTdKMGTNqtNbria+vb22XUG80bNiwtkuoN+gr99WHvsrLyzMdv3TT5NVGT7mv\nPvTU1eJ2WPz9739v3ExisVh09913l/sb0Q6HQ6WlpZo+fXq1irHb7Ro7dqxWr15tjN1///1KSEhQ\nUFCQBgwYIKfTqXfffVcZGRmaP3++6VzDhw/XlClT9PXXX6tt27bVqufnGjRooLCwMG3atEm//vWv\njfGIiAilp6erTZs2bv/i7d+/X7m5ubrjjjvUtGlT/fDDD/rwww9d7u6uSZXtjwkTJmj27Nky+1Ph\nI0eOVJ8+fYxlq9XKF7NXwGazydfXV0VFRfy9VTd4e3uruLi4tsuo8+irqqkvfRUYGGg6frXfX+mp\nqqkvPeWO6nwQcTss3nnnncY1cPPmzVNsbGy5U8MNGzZUhw4dftGdtf3799emTZuMP9jdoUMHzZ8/\nX2vXrtW6desk/XiEb/78+RVeM3mJn5+f7rnnHq1bt05PP/10tev5uYiICO3du9fljufw8HCdPHlS\nd911V7ntN2/erLfeestlbOXKlfL29tbu3buVlpamc+fOycfHR927dzc9ZV2R5cuXa+XKlcayt7e3\ny/LlKtsfbdq00Z133ml6ram/v7/LHx/Pz8/nDeYKysrK2D9ucDqd7KcqoK/cU1/6aty4cUpLS3O5\nZjEyMlKxsbHXrH56yj31paeuFovT7FDSFTz33HOKi4tTcHDw1agJ9cDl1y/iJzabTX5+fiosLLyh\n31jc5ePjY3wwhDn6qmrqU185HA6tXbvWuBt6/Pjx1+TmFnqqaupTT1Xm8gM/7qrWNYvPPvtsubH/\n9//+n7766ivdfvvtatq0aXWmBQDghmK32/XAAw/UdhnAFVXrb0PPmjXL5S+gbNq0SaGhofr1r3+t\nW2+9Vbt3766xAgEAAFB7qhUWN23apG7duhnL8fHxGjx4sL788kv96le/0ty5c2usQAAAANSeaoXF\no0ePqk2bNpKkr7/+Wjk5OZo7d64iIiL0yCOPaNeuXTVaJAAAAGpHtcJi48aN9cMPP0iS3n33XTVt\n2tT4G8cNGzbUuXPnaq5CAAAA1Jpq3eDSu3dvJSQk6NixY1q8eLFGjBhhrMvJyTGOOgIAAKB+q9aR\nxaSkJAUGBurJJ59UmzZttGDBAmPd6tWr1atXrxorEAAAALWnWkcWg4ODTb+8efv27brpppt+UVEA\nAACoG6r9t6HN8HcmAQAArh9uh8Xo6GgtWbJEt956q6Kjo6+4rcVi0ebNm39xcQAAAKhdbofF06dP\nG38SqKioSBaL5aoVBQAAgLrB7bD4wQcfGP+dkZFxNWoBAABAHeN2WExJSXF7UovFookTJ1arIAAA\nANQdbofFSZMmuSxfOg3tdDrLjUkiLAIAAFwH3P6exePHjxv/27lzp9q0aaMnn3xSu3fv1pEjR7R7\n92797ne/U5s2bfTpp59ezZoBAABwjbh9ZLFZs2bGf48dO1ZTp07VU089ZYy1bNlSXbp0UaNGjRQf\nH68dO3bUbKUAAAC45qr1F1w+/fRTdevWrcJ13bp10z//+c9fVBQAAADqhmqFxebNm+vvf/97hevW\nrVungICAX1QUAAAA6oZq/QWX+Ph4Pfjgg/r66681YsQINW/eXD/88IM2bdqkjz76SH/9619ruk4A\nAADUgmqFxSlTpigoKEgLFizQnDlzVFpaqgYNGuj222/X5s2bNWzYsJquEwAAALWg2n8beujQoRo6\ndKguXryo48ePKyAgQFZrtc5qAwAAoI6qdli8xGq1qkWLFjVRCwAAAOoYDgUCAADAFGERAAAApgiL\nAAAAMEVYBAAAgCnCIgAAAEwRFgEAAGCKsAgAAABThEUAAACY+sVfyn09iY+P14EDB/TKK6+oZcuW\nkqQjR45o+vTp2rJliyTp0KFDWr16tQ4dOiRJat++vSZOnKj27dsb80RHR8tut8tiscjT01PdunXT\nlClTdNNNNykxMVH79++XJJWWlsrpdMrDw0OS1LFjRyUmJio6OlpLly5Vq1atjDnffvttffzxx3rh\nhReMWnNycmSz2YxtgoODlZSUVGkNkpSamqp169Zp5syZ6tevnzHHfffdpzlz5igyMrJmdy4AAKiX\nCIs/4+XlpdTUVM2ePbvcupycHD3zzDMaO3asnnzySUnS9u3bNXfuXM2fP1+hoaHGtklJSWrVqpUK\nCgqUmJioDRs2aMKECUpMTDS2WbVqlQoLC/Xoo49Wq9a4uDgNGjTIdL1ZDZf4+PgoLS1NvXv3NgIr\nAADA5TgN/TNDhgxRZmamDh8+XG7dypUr1bt3b8XExMjb21ve3t6KiYlR79699be//a3C+Zo1a6bb\nb7+9wvmuFbMaOnXqJF9fX23btq2WKgMAAHUdYfFn/Pz8NHToUK1Zs8Zl3OFw6ODBg+rVq1e5x/Tq\n1UsHDhyQw+Eot+748ePatWuXgoKCrlrNlTGrwWKxaOLEiUpPT9e5c+dqqbqfOBwOJScnKyEhQcnJ\nyRXuTwAAcG1xGroCMTExmjp1qvbt26fGjRtLks6cOaOLFy+qWbNm5bZv2rSpLl68qDNnzshut0uS\nZs2aJafTqfPnz6tz586KjY2tUg2zZs2S1fpTli8pKXG5LlKSkpOTlZKSYiz37NlTjzzyiMscldXQ\npUsXhYSEaPPmzRo7dmyVaqxJDodDw4YNU3Z2tjGWnp6uLVu2GPsUAABce4TFClw6vZySkqKHH35Y\nktSoUSNZrVYVFBS43HgiSSdOnJDValWjRo2MsSVLlig4OFh79uzRyy+/rDNnzrisr8ySJUsqvMHl\ncpMnT77iNYvu1jBx4kQlJiZq8ODBpnPl5+crPz/fWLZarQoICHD79VQmNTVV2dnZKikpMcaysrKU\nlpamyZMn19jzXG2Xbji6/MYjmLNYLOwrN9BXVUNfVY6eqpobvacIiyaGDh2qrVu3KjMzU5Jkt9sV\nFhamTz75RJ06dXLZ9h//+IfCwsLKHQGzWCzq0qWL+vbtqxUrVig+Pv6a1V+VGkJDQxUZGakNGzaY\nzrNx40YtW7bMWJ40aZJmzJhRY3Xm5eWZjvv5+dXY81wrvr6+tV1CvdGwYcPaLqHeoK/cR1+5h55y\n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\niwAAADBFWAQAAIApwiIAAABMERYBAABgirAIAAAAUw1qu4D6Lj4+Xjk5ObLZbMZYcHCwkpKSJEml\npaWaNGmSmjdvrhdffNHlsd99952Sk5P173//W2VlZQoICNCIESMUGBio5557ztju/Pnzstvtslgs\nkqRnn31We/fu1fr16+Xh4eEy5+uvv64mTZq41OXh4aF27dpp6tSpCg4OliRlZWXp6aefVr9+/TRz\n5kzj8YsWLVJwcLDGjRtXszsKAADUS4TFGhAXF6dBgwZVuC4zM1NlZWU6fPiwcnNzFRISYqybP3++\noqKiFB8fL4vFom+++UZFRUUKDw9Xenq6JOnChQsaNWqU/vKXv6hFixbGY/fu3as777xTc+bMqbQu\nh8OhV155RX/605/0hz/8wVhvt9v1ySefKCYmRq1bt/6luwEAAFyHOA19le3YsUN9+vRRRESE3nvv\nPWO8qKhIeXl5GjBggBo2bCgPDw+1b99e3bp1q/Ea7Ha7evXqpcOHD7uMe3p6asCAAVq9enWNPycA\noH5yOBxKTk5WQkKCkpOT5XA4arsk1DLC4lVUWFio3bt3q0+fPurbt68yMjJUWloqSfLx8VHLli2V\nlJSkTz/9VAUFBVetjrNnz+rDDz9UUFBQuXWjR4/Wl19+qUOHDl215wcA1A8Oh0PDhg3TM888o+XL\nl+uZZ55RdHQ0gfEGx2noGpCcnKyUlBRjuWfPnnrkkUeUkZGhgIAAdejQQSEhIXrttde0a9cu9ejR\nQxaLRc8//7w2btyolJQUHT16VG3bttX06dPVrl07t553586dio2NNZabNGmiV1991aWuVatW6ezZ\nswoMDFR8fHy5OXx9fTVixAilpKTo+eefN32u/Px85efnG8tWq1UBAQFu1XkjuXTt6uXXsMKcxWJh\nX7mBvqoa+qpyZj2Vmpqq7OxslZSUGGNZWVlKS0vT5MmTr2mNdcmN3lOExRowefLkCq9ZvHQKWpK8\nvLx0xx13aMeOHerRo4ckyd/fXw8++KCkH49Crly5UgsWLNCKFSuMm1mupGfPnle8ZvFSXXl5eXru\nuef0/fff6+abby633fDhw/XWW29pz549pnNt3LhRy5YtM5YnTZqkGTNmVFrjjcrX17e2S6g3GjZs\nWNsl1Bv0lfvoK/f8vKfy8vIq3C4vL09+fn7XoqQ660buKcLiVXLo0CF9++23Kigo0Pbt2yX9eHj/\n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\nupSwCHzNERYBAK3cuHHjtu3Xr1+/xzMB0NUIiwDQTpmZmXryySdVUlKiIUOGKCAgQMOGDdOpU6ck\nfXnmzGQyaefOnW795s6dq+joaNfy5s2bZTKZdPLkSY0ZM0b+/v4aMGCAPvjgAzU3N+snP/mJrFar\nevfurSVLlqi5udnjOb777rsaOXKkevbsqdDQUD3zzDM6efKk2zY2m02BgYE6efKkEhMT5evrq9Wr\nV7vmv3nzZs2aNUsPP/ywhg4d6uq3f/9+DR8+XH5+furVq5eys7NVV1fnWt/Y2KhFixYpKipKFotF\nffr00fPPP68rV66opKRESUlJkqShQ4fKZDLJZDLdsR+Ae4+wCAAdUF1drXnz5mnRokUqLCxUfX29\nUlJS1NjY2OaxMjMzlZycrN27d6tv37767ne/q/nz5+vs2bPasmWL5s6dq1/84hfavn27x2NWVlZq\nxowZ2rFjh/Lz8/Xoo49q9OjR+vzzz922u3nzpjIyMjR9+nQdPHhQ48aNc61bsmSJTCaTCgoK9Mtf\n/lKStHPnTk2ePFmxsbHavXu3li9frt///vfKyspy9fv5z3+utWvX6pVXXtGHH36o3NxcRUREqKGh\nQXFxcVqzZo0kadOmTTpx4oROnDhxx34AuoATANAu3//+950mk8lZVlbmavvjH//olOQ8evSo88yZ\nM05Jzh07drj1mzNnjjMqKsq1vGnTJqck5zvvvONqO336tFOSc/jw4W594+PjncnJye2ar8PhcDY2\nNjpjYmKcS5YscbW//vrrTknOoqIit+1b5j9x4kS39ubmZmdUVJQzLS3NrX3//v1ux2PSpEnOqVOn\nGs7n8OHDTknO0tJSt/Y79QNwb3FmEQA6ICIiQoMGDXItDxw4UJJ07ty5No81duxY1/cDBgxo1dbS\n/s9//tPjMcvLy5WSkqLw8HCZzWZ5e3vrs88+a3VmUZImTpx42zH+v/3zzz9XVVWVUlNT1dTU5Pp6\n+umnZTKZ9PHHH0uS4uLi9P7778tms6m0tNTjy+ft7Qfg7iAsAkAHhISEuC37+PhIMn5AxNOxWsa5\n3fiejn316lWNGzdOVVVVysnJ0dGjR1VaWqrBgwe3GsPf318BAQG3Had3795uy3a7XZKUkpIib29v\n11dgYKCam5tdYfbHP/6xXnnlFW3ZskXDhg2T1WrV0qVL5XQ6v3Le7e0H4O54qKsnAADdla+vr6Qv\n7we81aVLl+7J/k+cOKFz587pvffe0+DBg13tV65c0SOPPOK2bcvDJbfz/+t69uwpScrNzdXw4cNb\nbR8RESFJslgsstlsstls+sc//qGNGzfKZrPpscce0/Tp0w33195+AO4OziwCwF3Su3dv+fj4qLy8\n3NXW0NCgo0eP3pP9t7zmpuUspSQdP35clZWVHRr38ccf1yOPPKKKigolJCS0+moJi7fq37+/li1b\npp49e7qOhydnYW/XD8C9xZlFALhLvLy8lJKSotzcXPXv319hYWFatWrVV57F60xPPfWUAgMDNWfO\nHP3oRz/S+fPnZbPZ1Ldv3w6NazKZlJOTo/T0dNXV1WnSpEkKCAhQVVWV9u/fr2XLlmnAgAFKTk5W\nfHy867VC+/bt06VLl/Tss89K+vL+S7PZrI0bN7rup0xISLhjPwD3FmERAO6i1atXa/bs2Zo3b56C\ngoK0ePFiffOb39R777131/cdHh6uHTt2aOHChZoyZYoGDBigtWvX6q233urw2C+88IJCQkL05ptv\nauvWrZKk6OhojR8/XuHh4ZKk73znOyoqKtKKFSvU1NSkmJgY5efnux7aCQsL05o1a7R8+XL97ne/\nU1NTk5xO5x37Abi3TE7uGAYAAIAB7lkEAACAIS5DA8B9qqmpyXCdyWSS2Wy+h7MB0F1xGRoA7lNf\n9aBMVFRUh596BgCJM4sAcN8qLS01XGexWO7hTAB0Z5xZBAAAgCEecAEAAIAhwiIAAAAMERYBAABg\niLAIAAAAQ4RFAAAAGCIsAgAAwBBhEQAAAIYIiwAAADD0X6HFQxg7GseKAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(ggplot(summary_tab,aes(y='district',x='num_arrests'))\n", " + geom_point())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Frequently Used Plots\n", "\n", "Again, we use the `mpg` dataset to illustrate" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/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", "
manufacturermodeldisplyearcyltransdrvctyhwyflclass
0audia41.819994auto(l5)f1829pcompact
1audia41.819994manual(m5)f2129pcompact
2audia42.020084manual(m6)f2031pcompact
3audia42.020084auto(av)f2130pcompact
4audia42.819996auto(l5)f1626pcompact
\n", "
" ], "text/plain": [ " manufacturer model displ year cyl trans drv cty hwy fl class\n", "0 audi a4 1.8 1999 4 auto(l5) f 18 29 p compact\n", "1 audi a4 1.8 1999 4 manual(m5) f 21 29 p compact\n", "2 audi a4 2.0 2008 4 manual(m6) f 20 31 p compact\n", "3 audi a4 2.0 2008 4 auto(av) f 21 30 p compact\n", "4 audi a4 2.8 1999 6 auto(l5) f 16 26 p compact" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mpg = pd.read_csv('data/auto-mpg.csv')\n", "mpg.head()" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/hcorrada/opt/miniconda3/envs/cmsc320/lib/python3.6/site-packages/pandas/core/generic.py:5191: FutureWarning: Attribute 'is_copy' is deprecated and will be removed in a future version.\n", " object.__getattribute__(self, name)\n", "/Users/hcorrada/opt/miniconda3/envs/cmsc320/lib/python3.6/site-packages/pandas/core/generic.py:5192: FutureWarning: Attribute 'is_copy' is deprecated and will be removed in a future version.\n", " return object.__setattr__(self, name, value)\n" ] }, { "data": { "image/png": "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\nN9jYPGqZF3UYIiJ9RqeVRURERCSg5FBEREREAkoORURERCSg5FBEREREAkoORURERCSg5FBERERE\nAkoORURERCSg5FBEREREAkoORURERCSg5FBEREREAkoORURERCSg5FBEREREAsZaa6MOQvJXVVXF\n8uXLOe+886ioqIg6nAFP4xkejWW4NJ7h0ViGS+M5+GnmcICpqqrigQceoKqqKupQBgWNZ3g0luHS\neIZHYxkujefgp+RQRERERAJKDkVEREQk4N500003RR2EdE8qlWLu3LkUFxdHHcqgoPEMj8YyXBrP\n8Ggsw6XxHNy0IEVEREREAjqtLCIiIiIBJYciIiIiEohFHYDkJ5PJsHTpUtauXUtNTQ0VFRVccMEF\nLFiwIOrQBqx77rmH1atX09DQQFlZGaeddhoXXnhh1GENaNXV1XzmM59h3Lhx3H777VGHMyB9+9vf\n5ve//z2x2N5fz4sXL2b06NERRjWwrVy5kkceeYT33nuP8vJyrrjiCo4++uiowxpwOv5+TKfTzJ07\nlxtvvDGiiKSvKDkcIDzPY+TIkSxatIgxY8bwxhtvcPPNNzN27FimTp0adXgD0tlnn82VV15JIpFg\n+/bt3HTTTYwfP55jjz026tAGrAcffJCJEyfS1NQUdSgD2jnnnMMll1wSdRiDwtq1a/nOd77Ddddd\nx9SpU6murqaxsTHqsAakxx57LPjc8zyuuOIKjjnmmAgjkr6i08oDRDKZ5OKLL2bs2LE4jsP06dOZ\nNm0a69atizq0AevAAw8kkUgEXxtj2LJlS4QRDWyvvPIK7777LieeeGLUoYgEHnnkERYuXMj06dNx\nHIfhw4czduzYqMMa8F566SUaGxs1AztIaeZwgGpsbGTjxo2cddZZUYcyoH3ve9/jiSeeoKmpiTFj\nxiix6aFMJsN9993Hddddx5tvvhl1OAPeM888wzPPPENFRQVnnXUWp556atQhDUie5/HXv/6VuXPn\nctVVV5FOp5k1axZXXnklpaWlUYc3oD377LMcd9xx7f7BlsFDM4cDkLWWO++8k8mTJzN79uyowxnQ\nLrnkEh577DHuuOMOFixYQElJSdQhDUg/+tGPmD17NhMnTow6lAHvrLPOYunSpXz/+9/nyiuv5KGH\nHmLlypVRhzUg7d69m2w2y3PPPcett97KPffcQ3V1NQ888EDUoQ1o1dXVrFq1ilNOOSXqUKSPKDkc\nYKy1LFmyhB07dvCv//qvGGOiDmnAM8YwefJkYrEYy5YtizqcAWfLli389re/5ROf+ETUoQwKBx10\nEOXl5biuy4wZMzjzzDN5/vnnow5rQGqd1TrzzDOpqKigtLSUCy64gBdffDHiyAa23/72t4wbN44p\nU6ZEHYr0EZ1WHkCstSxdupRNmzZxyy23kEwmow5pUPF9n61bt0YdxoCzbt06duzYwT/90z8BkM1m\nSafTXHzxxTzwwAOqoNBLxhhUq6BnSktLqaio0D/RIXv22Wc1azjIKTkcQO677z7Wr1/PokWL9Ae3\nl+rq6li1ahXz588nmUzyxhtv8PTTT7Nw4cKoQxtwjj32WGbNmhV8/fzzz/Ob3/yGG2+8kVQqFWFk\nA9Nzzz3HnDlzgvflk08+yVVXXRV1WAPWaaedxpNPPsncuXNJJBIsX76cefPmRR3WgPXmm2+yefNm\nbaM2yCk5HCC2bdvGU089RTwe5/LLLw+On3/++dqbrweMMTz77LPcf//9+L7PyJEj+ehHP8qZZ54Z\ndWgDTiKRaHdRemlpKbFYjIqKigijGrieeOIJFi9ejO/7VFRUcPHFF3P88cdHHdaAdcEFF1BdXc01\n11yD67rMnTs3mOWW7vvVr37F3LlzGTFiRNShSB9SbWURERERCWhBioiIiIgElByKiIiISEDJoYiI\niIgElByKiIiISEDJoYiIiIgElByKiIiISEDJoYiIiIgElByKiIiISEDJoYj0uaqqKowxPPTQQwAs\nWLCAj3zkI6H3c+mll3LYYYeF3q6IyFCi8nki0u+WLFmC67pRhyEiIjkoORSRfjd9+vSoQxARkS7o\ntLKIhO6BBx5g4sSJFBcXc/LJJ7Nx48Z293c8rfzOO+9w4YUXUllZSTKZZNKkSfzLv/xLcP9NN91E\naWkpf/7zn5k3bx7JZJJp06bxxBNP9NtrEhEZKjRzKCKheuKJJ7jqqqu49NJLueiii1i9ejUXXXTR\nPp/z6U9/mi1btnDXXXdRWVnJ5s2bWb16dbvHZDIZFi5cyLXXXsukSZO49957Offcc1mzZo2uMxQR\nCZGSQxEJ1aJFizjuuOP47ne/C8Dpp59OXV0dt912W5fPWbVqFbfddhsLFy4Mjn36059u95h0Os2N\nN97I5ZdfHrR78MEHc+utt/LII4/0wSsRERmadFpZRELjeR4vvvgi5557brvj559//j6fN2fOHG6/\n/XbuvffeTqeg22rbruu6nH322bzwwgu9C1pERNpRcigiodm+fTvZbJYxY8a0O15ZWbnP5/3whz/k\n5JNP5oYbbmDy5MlMnTqVxx9/vN1j4vE4I0aMaHdszJgxbN26NZzgRUQEUHIoIiEaPXo0sViMbdu2\ntTv+3nvv7fN548aN48EHH6SqqopVq1YxZcoUFi5cyKZNm4LHZDIZdu3a1e5527ZtY9y4ceG9ABER\nUXIoIuFxXZc5c+bwk5/8pN3xH//4x3k933EcjjzySBYtWkQ2m+10irltu57nsWLFCubPn9/7wEVE\nJKAFKSISqhtuuIFzzjmHyy67LFitvK8FI3v27OH000/nU5/6FFOmTCGTyXDXXXcxfPhw5syZEzyu\nqKiIRYsW0djYyKRJk1iyZAnvvPMO119/fX+8LBGRIUPJoYiE6uyzz2bp0qV8/etf59FHH2X+/Pks\nW7aMo48+Oufjk8kkM2bM4O6772bz5s2kUinmzp3LL37xCyoqKoLHxeNxli1bxjXXXMMrr7zCpEmT\nWL58OTNnzuyvlyYiMiQYa62NOggRkX256aabuP3226mtrY06FBGRQU/XHIqIiIhIQMmhiIiIiAR0\nWllEREREApo5FBEREZGAkkMRERERCSg5FBEREZGAkkMRERERCSg5FBEREZGAkkMRERERCSg5FBER\nEZGAkkMRERERCSg5FBEREZHA/wOu4d4X83XeiQAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# scatterplot\n", "\n", "(ggplot(mpg, aes(x='displ', y='hwy')) \n", " + geom_point(mapping=aes(color='cyl')))" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/hcorrada/opt/miniconda3/envs/cmsc320/lib/python3.6/site-packages/pandas/core/generic.py:5191: FutureWarning: Attribute 'is_copy' is deprecated and will be removed in a future version.\n", " object.__getattribute__(self, name)\n", "/Users/hcorrada/opt/miniconda3/envs/cmsc320/lib/python3.6/site-packages/pandas/core/generic.py:5192: FutureWarning: Attribute 'is_copy' is deprecated and will be removed in a future version.\n", " return object.__setattr__(self, name, value)\n", "/Users/hcorrada/opt/miniconda3/envs/cmsc320/lib/python3.6/site-packages/plotnine/positions/position.py:188: FutureWarning: Method .as_matrix will be removed in a future version. Use .values instead.\n", " intervals = data[xminmax].drop_duplicates().as_matrix().flatten()\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAGyCAYAAAD+lC4cAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi40LCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcv7US4rQAAIABJREFUeJzt3XtwVPX9//HX2U02l00i0IUELLfK\nRaDoCLEStSBiGRTRQORSrqkIQqVMHdQqojJ+wSutBSICsQh2CIoGEdFqBaEKESk6Ih1BigLJKBeX\ngYbcSNjs74/+SBsSLIfs7tnP8nzMOONecvKet0Gfnj27sYLBYFAAAAAGcjk9AAAAwIUiZAAAgLEI\nGQAAYCxCBgAAGIuQAQAAxiJkAACAsQgZAABgLEIGAAAYi5ABAADGImQAAICx4pweQJLy8vK0Y8cO\nVVZWKjU1VQMHDtSIESMkSQcPHtTChQt14MABZWRkaOrUqerRo4fDEwMAgGhgRcPvWiouLlZ6eroS\nEhL0/fffa/bs2frlL3+pPn36aOrUqRo0aJBuu+02bdmyRfn5+Vq6dKlSUlKcHhsAADgsKs7ItGvX\nrt5ty7L03XffadeuXTp16pSGDh0ql8ul/v37a926dSoqKtLAgQPPeTy/3x+SuTwej6qrq0NyrEix\nLEtJSUmqrKxUFDSqLew7sth3ZJm4b4mdR9rFvm+fz2f7a6LmGpkVK1Zo+PDhmjhxoqqqqtS/f38V\nFxerffv2crn+M2bHjh1VXFwckZkSEhIi8n1CyeVyKTk5ud7OTMG+I4t9R5aJ+5bYeaSxb/ui4oyM\nJE2YMEHjx4/Xvn379Mknn8jr9aqyslJer7fe87xeryoqKurd5/f7652FcblcatmyZZNnsixLbre7\nyceJpDPzmja3xL4jjX1Hlon7lth5pLFv+6ImZKR/L6Fz58769NNPtWrVKvl8vgbRUlFRoaSkpHr3\nFRYWKj8/v+52bm6upk2bFpKZPB5PSI4TaWlpaU6PcEHYd2Sx78gydd8SO4809n3+oipkzqitrdWh\nQ4fUq1cvrVmzRrW1tXWn2fbv369BgwbVe35OTo769etXd9vlcun48eNNnsPr9aq8vLzJx4kkt9ut\ntLQ0lZaWKhAIOD2OLew7sth3ZJm4b4mdR9rFvu/mzZvb/hrHQ6a8vFzbt2/XNddco8TERO3Zs0d/\n+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\nWlVXV8vlcqlnz56Kj4/X2rVrNWTIEBUVFenw4cPKyspqcIycnBz169ev7rbL5dLx48ebPJvX61V5\neXmTj4PGnf3PiH2HF/uOrFjZt9vtVlpamkpLSxUIBJwexxZTd26Cxv4bG4p9nyuQfojjIfPqq6/q\nlVdeqbu9detW3Xjjjfrtb3+rWbNmKS8vTwUFBUpPT9fMmTOVmpra4Bg+n08+n6/utt/vD8kfuGAw\naNwfXJOcvVv2HV7sO7Jibd9n/qfTJKbvPJo1tlen9u14yIwePVqjR49u9LEOHTpo3rx5EZ4IAACY\nImrftQQAAPC/EDIAAMBYhAwAADAWIQMAAIxFyAAAAGMRMgAAwFiEDAAAMBYhAwAAjEXIAAAAYxEy\nAADAWIQMAAAwFiEDAACMRcgAAABjETIAAMBYhAwAADAWIQMAAIxFyAAAAGMRMgAAwFiEDAAAMBYh\nAwAAjEXIAAAAYxEyAADAWIQMAAAwFiEDAACMRcgAAABjETIAAMBYhAwAADAWIQMAAIxFyAAAAGMR\nMgAAwFiEDAAAMBYhAwAAjEXIAAAAYxEyAADAWIQMAAAwFiEDAACMRcgAAABjETIAAMBYhAwAADAW\nIQMAAIxFyAAAAGMRMgAAwFiEDAAAMBYhAwAAjEXIAAAAYxEyAADAWIQMAAAwFiEDAACMRcgAAABj\nETIAAMBYhAwAADAWIQMAAIxFyAAAAGMRMgAAwFhxTg8QDh6PRwkJCU0+TlxcnFJTU0MwERpz9m7Z\nd3ix78iKlX1bliVJ8nq9CgaDDk9jj6k7N0Fje3Vq3zEZMtXV1aqurm7ycVJTU3Xy5MkQTITGnL1b\n9h1e7DuyYmXfbrdbHo9H5eXlCgQCTo9ji6k7N0Fjew3Fvi/kJAQvLQEAAGMRMgAAwFiEDAAAMBYh\nAwAAjEXIAAAAYxEyAADAWIQMAAAwFiEDAACMRcgAAABjETIAAMBYhAwAADAWIQMAAIxFyAAAAGMR\nMgAAwFiEDAAAMBYhAwAAjEXIAAAAYxEyAADAWIQMAAAwFiEDAACMRcgAAABjETIAAMBYhAwAADAW\nIQMAAIxFyAAAAGMRMgAAwFiEDAAAMBYhAwAAjEXIAAAAYxEyAADAWIQMAAAwFiEDAACMRcgAAABj\nETIAAMBYhAwAADAWIQMAAIxFyAAAAGMRMgAAwFiEDAAAMBYhAwAAjEXIAAAAYxEyAADAWIQMAAAw\n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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# barplot\n", "plot_df = (mpg\n", " .groupby('cyl')\n", " .agg({'hwy': 'mean'})\n", " .reset_index()\n", " .rename(columns={'hwy': 'mean_mpg'}))\n", "(ggplot(plot_df,aes(x='cyl',y='mean_mpg')) +\n", " geom_bar(stat='identity'))" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/hcorrada/opt/miniconda3/envs/cmsc320/lib/python3.6/site-packages/plotnine/stats/stat_bin.py:90: UserWarning: 'stat_bin()' using 'bins = 11'. Pick better value with 'binwidth'.\n", " warn(msg.format(params['bins']))\n", "/Users/hcorrada/opt/miniconda3/envs/cmsc320/lib/python3.6/site-packages/pandas/core/generic.py:5191: FutureWarning: Attribute 'is_copy' is deprecated and will be removed in a future version.\n", " object.__getattribute__(self, name)\n", "/Users/hcorrada/opt/miniconda3/envs/cmsc320/lib/python3.6/site-packages/pandas/core/generic.py:5192: FutureWarning: Attribute 'is_copy' is deprecated and will be removed in a future version.\n", " return object.__setattr__(self, name, value)\n", "/Users/hcorrada/opt/miniconda3/envs/cmsc320/lib/python3.6/site-packages/plotnine/positions/position.py:188: FutureWarning: Method .as_matrix will be removed in a future version. Use .values instead.\n", " intervals = data[xminmax].drop_duplicates().as_matrix().flatten()\n" ] }, { "data": { "image/png": "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\nS8gAAMn6f89R0kZ7f+7IAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# histogram\n", "\n", "(ggplot(mpg, aes(x='hwy')) \n", " + geom_histogram())" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/hcorrada/opt/miniconda3/envs/cmsc320/lib/python3.6/site-packages/plotnine/utils.py:284: FutureWarning: Method .as_matrix will be removed in a future version. Use .values instead.\n", " ndistinct = ids.apply(len_unique, axis=0).as_matrix()\n", "/Users/hcorrada/opt/miniconda3/envs/cmsc320/lib/python3.6/site-packages/pandas/core/generic.py:5191: FutureWarning: Attribute 'is_copy' is deprecated and will be removed in a future version.\n", " object.__getattribute__(self, name)\n", "/Users/hcorrada/opt/miniconda3/envs/cmsc320/lib/python3.6/site-packages/pandas/core/generic.py:5192: FutureWarning: Attribute 'is_copy' is deprecated and will be removed in a future version.\n", " return object.__setattr__(self, name, value)\n", "/Users/hcorrada/opt/miniconda3/envs/cmsc320/lib/python3.6/site-packages/plotnine/positions/position.py:188: FutureWarning: Method .as_matrix will be removed in a future version. Use .values instead.\n", " intervals = data[xminmax].drop_duplicates().as_matrix().flatten()\n" ] }, { "data": { "image/png": "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\ngGURZAAAgGURZAAAgGURZAAAgGURZAAAgGURZAAAgGURZAAAgGURZAAAgGURZAAAgGURZAAAgGUR\nZAAAgGURZAAAgGURZAAAgGURZAAAgGURZAAAgGURZAAAgGURZAAAgGURZBAx3G63Zs6cKbfbbXYp\nAACLIMggYrjdbs2aNYsgAwA4aQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZ\nAABgWQQZAABgWQQZIIIx2jEA/DyCDBDBGO0YAH4eQQYAAFgWQQYAAFgWQQYAAFgWQQYAAFgWQQYA\nAFgWQQYAAFgWQQYAAFgWQQYAAFgWQQYAAFgWQQYAAFgWQQYAAFgWQQYAAFgWQQYAAFhWjNkFAAB+\nPUpLS1VVVRXWZZSUlEiSiouL5fV6w7osp9Op1NTUsC4DPy8igsyMGTO0YcMGVVRUKDk5WVdccYWu\nv/56SdKuXbv01FNP6bvvvlODBg102223qX379iZXDAA4VaWlpRo8eLB8Pl+dLG/s2LFhX4bdbtei\nRYsIMyaKiCDTv39/5eXlyel0qqioSA899JAaNmyoCy+8UPn5+erXr58eeeQRrV27VpMnT9bzzz+v\nevXqmV02AOAUVFVVyefzac6cOcrOzja7nNNWWFio3NzcsG9hws+LiCBz5plnBty22Wzat2+fNm/e\nrKqqKg0YMEB2u12XXHKJXnvtNa1bt05XXHGFSdUCAE5Hdna2GjRoYHYZiBIREWQk6cUXX9S//vUv\nVVVVKTs7W5dcconWrVunpk2bym7/3zHJZ511lnbv3m1ipQAAIFJETJAZPny4hg0bpu3bt+vjjz9W\nUlKSKioqlJSUFDBfUlKSysvLA6YVFxeruLjYf9tutysrK6tO6q4th8MR8C/kD6x2u52+/Bc9CcT7\nJpiVemKFGmvD4XBE/Guz0npyqiImyEhHdym1bNlSn332mRYtWiSXyxUUWsrLy5WQkBAwbenSpZo1\na5b/9k033aTbb7+9Tmo+XSkpKWaXEDGO7WdOTk5Wenq6ydVEBnpyfLxvglmhJ9F6LElqaqpl3p9W\nWE9OVUQFmWN8Pp/279+v8847T8uWLZPP5/P/Mt25c6f69esXMP/AgQPVq1cv/2273e4//S5SORwO\npaSk6PDhw2E/PdAqysrK/P86nU6Tq4kM9CQQ75tgVupJaWmp2SWERWlpacS/P62yntQmEJoeZNxu\ntz755BNdcMEFio+P19dff60VK1bod7/7nTp27KjY2FgtX75cOTk5WrdunQoKCtStW7eA53C5XHK5\nXP7bdTF2QKh4vV7L1Bpux07J9Pl89OS/6Mnx8b4JZoWeRHp9tWWF3h9jpVpPlulBxmazadWqVXr+\n+efl8/mUkZGha665RldffbVsNpsmTpyoGTNmaOHChapfv74mTJig5ORks8sGAAARwPQgk5iYqPz8\n/BPe36xZM02ZMqUOKwIAAFbBtZYAAIBlEWQAAIBl1SrIjB8/Xl9//XWoawEAADgltQoyS5YsUfv2\n7dW9e3fNmTNHbrc71HUBAAD8oloFmV27dunf//63GjdurDFjxuiMM87QiBEjtG7dulDXBwAAcEK1\nOmvJZrOpX79+6tevnw4ePKgFCxZo3rx5mjt3rlq3bq1bbrlFQ4cOjYqrm+Ko0tLSsI/KeWwQw7oY\nB8jpdCo1NfW0niOaehKKfgCAGU779OuMjAyNHTtWvXv31tixY7V69WrdfffdmjBhggYNGqQpU6ZE\n/HWP8PNKS0s1ePBg/+Bs4TZ27NiwL8Nut2vRokW1/vKOtp6cbj8AwCynFWRKS0u1cOFCzZ49W59/\n/rk6deqkp59+WgMGDNAbb7yh/Px8DRo0SKtWrQpVvTBBVVWVfD6f5syZExVb2QoLC5Wbm3taW1Oi\nqSeh6AcAmKVWQebdd9/V7NmztXz5csXExGjw4MGaOXOmunTp4p8nNzdXTZo0UU5OTsiKhbmys7PV\noEEDs8uIKPQEAMxVqyBz2WWX6YILLtBTTz2lQYMGKTEx8bjztWrVSoMHDz6tAgEAAE6kVkFm06ZN\n6tix4y/O17RpU82dO7c2iwAAAPhFtTr9evPmzdq7d2+oawEAADgltdoik5ubq5qaGjVt2lQ9e/ZU\nr1691LNnT7Vo0SLU9QEAAJxQrYLMoUOHtG7dOq1Zs0arV6/W7bffrsrKSjVo0MAfbEaNGhXqWgEA\nAALUatdSfHy8+vTpowcffFCrVq1SaWmpVq5cqVatWmnx4sUaM2ZMqOsEAAAIUutxZA4fPqy1a9fq\ngw8+0OrVq7Vx40bVq1dPOTk56tWrVyhrBAAAOK5aBZmuXbtq06ZNcrlc6tmzp2688UbNnDlT55xz\nTqjrAwAAOKFaBZmNGzcqPj5evXv39h/o265du1DXBgAA8LNqdYzMwYMHtXjxYjVu3Fhz587Vueee\nq+zsbA0cOFDTp0/X559/Huo6AQAAgtRqi0xaWppycnL8lx9wu916//33NWXKFI0bN042m00ejyek\nhQIAAPxUrQ/2ra6u1vr16/0H+3700UcqLy9Xdna2evbsGcoaAQAAjqtWQaZXr1769NNPVVlZqSZN\nmqhnz56aOnWqevbsqdatW4e6RgAAgOOqVZBp2bKlbrnlFvXs2VPNmjULcUkAAAAnp1ZB5oUXXpDX\n69XHH3+sTz75RJWVlUHzDBs27LSLAwAAp6eqqkpbtmxRTEyMmjRpovT0dLNLCqlaBZnPP/9cAwYM\n0J49e2QYRtD9NpuNIAMAgMkOHDigu+++WwUFBbLb7bLb7XrggQfUtWtXs0sLmVoFmVGjRik5OVlv\nvfWW2rVrp7i4uFDXhQi0detWFRQUmF3GaTt48GDInisaehLKfgCILNOmTVNhYaF8Pp98Pp8kKT8/\nXwsXLlRiYqLJ1YVGrYLMli1btGTJEl166aWhrgcR7J577jG7hIhDTwBEsm3btgUNh1JZWam9e/eq\nZcuWJlUVWrUaEK9Vq1YqKysLdS0AACCEkpOTjzs9JSWljisJn1ptkZk6darGjh2rTp06qU2bNqGu\nCRHqscceU0ZGhtllnLaDBw+GbEtKNPQklP0AEFmGDx+uRx55xH88q8PhUM+ePVW/fn2TKwudkw4y\nHTt2lM1m89/ev3+/OnTooIYNGyotLS1gXpvNpk2bNoWuSkSEdu3aqUGDBmaXcdpCeUxLNPTE6sf4\nADixnj17yul0avny5fJ4POrSpYuuu+46s8sKqZMOMl26dAkIMgAAIPJdcMEF6t69u9LT01VSUiKv\n12t2SSF10kFm3rx5YSwDAADg1NXqYF8AAIBIQJABAACWVeurXwMAgMj3zjvvaNmyZaqpqVGXLl2U\nm5sbVQPZEmQAAHUqGkbElqwxKvZbb72lqVOn+k+/3r9/v/bt26dJkyZFzQk8BJnjKC0tVVVVVViX\n4XA4VFVVpdLS0rAfQe50OpWamnraz1NYWBiCaswXytcRDT2JhtcAa2HcorqzcOHCgGsiejweffLJ\nJ9q/f78aNmxoYmWhQ5D5idLSUg0ePNh/TYpoYLfbtWjRolqHGafTKbvdrtzc3BBXZh673S6n01nr\nx0dbT063HwAiU0VFxSlNtyKCzE9UVVXJ5/Npzpw5ys7ONruc01ZYWKjc3NzT2sKUmpqqRYsWhX0r\nVUlJicaOHavp06eH/TLzp7uVKtp6EqqtdsDJiIYRsSVrjIrdsWNHrV+/PuB6S0lJSWrUqJGJVYUW\nQeYEsrOzLT9iayjVxZecw+GQJLlcLmVmZoZ9eaeLngC1Ew0jYkvWGBX7zjvvVEFBgbZv3y6bzabE\nxERNmjRJ8fHxZpcWMgQZAACiVEpKiqZPn66dO3cqNjZW2dnZSkhIMLuskCLIAAAQxRwOh1q3bh21\nlyhgQDwAAGBZBBkAAGBZ7FoCACCKHT58WG+88Ya8Xq8uvPBCtWjRwuySQoogAwBAlNq+fbvGjh3r\nPy5mwYIFGjZsmG644QaTKwsdgswJMIQ2AMDq7r///qCDe+fPn6++fftGzZAOBJkTiPRBjgAA+CWH\nDx8+7vRNmzapT58+dVxNeERlkImLi6v1cOtutzvE1USGpKQkJScnm13GzyovL5ckJSQkRHytdYWe\nBDp2kbukpKSA68f8mlmpJ3y+1j2HwxEwqu8xZ511VsTWfKqiMshUV1erurq6Vo899kaLtiG03W63\nysrKzC7nZx279kdFRUXE11pX6Ekgh8OhuLg4ud3uqBsLo7as1JNoDTKR/Pmak5OjV199NWBadna2\nzjrrrIisuTYbIaIyyIQCQ2gDAKxu5MiRSkhI0GuvvSav16s2bdpo0qRJZpcVUgQZAACi2LBhw3Tz\nzTdH7ci+BBkAQJ0qLCw0u4SQiJbXYXUEGQBAnXA6nbLb7crNzTW7lJCx2+21PrkEoUGQAQDUidTU\nVC1atEhVVVVhXU5JSYnGjh2r6dOnKz09PazLcjqdSk1NDesy8PMIMgCAOlMXX/oOh0OS5HK5ombQ\nt9PxzjvvaNmyZaqpqVGXLl2Um5uruLg4s8sKGYIMAABR6q233tLUqVP9Ywzt379f+/bt06RJk/xj\nEFkdQeYEouUgrmh5HbCG0tLSsO42cDgcqqqqUmlpadjPvGCXAaLBwoULAwZK9Hg8+uSTT7R//341\nbNjQxMpChyDzExyMBtROaWmpBg8eLJ/PZ3YpIWG327Vo0SLCDCzt2KCaJzvdiggyP8HBaEDtVFVV\nyefzac6cOcrOzja7nNNSWFio3NzcsH8OAOHWsWNHrV+/PuAyBUlJSWrUqJGJVYUWQeY4OBgNqL3s\n7OyoGBUbiAZ33nmnCgoKtH37dtlsNiUmJmrSpEmKj483u7SQIcgAABClUlJSNH36dO3cuVOxsbHK\nzs5WQkKC2WWFFEEGAIAo5nA41Lp166i9RIHd7AIAAABqiyADAAAsi11LAABEsaqqKm3ZskUxMTFq\n0qRJ2M+UrWsEGQAAotSBAwd09913q6CgQHa7XXa7XQ888IC6du1qdmkhQ5ABEFJbt25VQUGB2WWc\nloMHD5pdAhAS06ZNU2FhoXw+n3+wyvz8fC1cuFCJiYkmVxcaBBkAIXXPPfeYXQKA/9q2bVvAYHiS\nVFlZqb1796ply5YmVRVaHOxrkqSkJOXl5SkpKcnsUiIGPQlGTwCcjuTk5ONOT0lJqeNKwoctMiZJ\nSkrSyJEjo/Kc/tqiJ8Gs2JPHHntMGRkZZpdxWg4ePMiWJUSF4cOH65FHHvFfONLhcKhnz56qX7++\nyZWFDkEGQEi1a9fO8pcosPoxPsAxPXv2lNPp1PLly+XxeNSlSxddd911ZpcVUgQZAACi2AUXXKDu\n3bszsi8AAECkIcgAAADLIsgAAADL4hgZALCorVu3avbs2SopKVHz5s112223KTMz0+yygDpFkAEA\nC9q+fbvuvvtu+Xw+GYahwsJCbdu2Tc899xzjDuFXhSADIKQKCwvNLuG0WeE1vPbaazIMwz8+iMfj\nUUlJidavX69LL73U5OqAukOQARASTqdTdrtdubm5ZpcSEna7XU6n0+wyTujIkSP+a+ccY7fbVVFR\nYVJFiGRut1tLlizR1Vdfrfj4eLPLCSmCDICQSE1N1aJFi1RVVRW2ZZSUlGjs2LGaPn260tPTw7Yc\n6WgwS01NDesyTkenTp308ccfB4wJUlNTo7Zt25pYFSKV2+3WrFmz1Lt3b4IMAJxIuL/4HQ6HJMnl\ncv3qD2rNycnRN998o1WrVslms8lms+mOO+5QixYtzC4NqFMEGQCwILvdrvHjx2vw4MGqrq5WWlqa\n5a9xBdQGQQYALMpms6lp06ZRO/Q8cDIYEA8AAFgWQQYAAFgWQQYAAFgWQQYAAFgWQQYAAFgWQQYA\nAFgWQQaAZSQlJSkvL4+LIgLwI8gAsIykpCSNHDmSIAPAjyADAAAsiyADAAAsiyADAAAsy/RrLdXU\n1Oi5557Tpk2bVFZWJpfLpeuuu069e/eWJO3atUtPPfWUvvvuOzVo0EC33Xab2rdvb27RAAAgIpi+\nRcbr9SojI0P5+flatGiRxowZo+eee05ff/21PB6P8vPz1a1bNy1atEgDBw7U5MmTdeTIEbPLBgAA\nEcD0IBMfH68bb7xRDRo0kN1uV7t27dS2bVt99dVX2rx5s6qqqjRgwADFxsbqkksuUf369bVu3Tqz\nywYAABHA9CDzU5WVldq+fbuaNm2q3bt3q2nTprLb/1fmWWedpd27d5tYIQAAiBSmHyPzY4ZhaPr0\n6WrZsqU6d+6sb775Jmi8iKSkJJWXlwdMKy4uVnFxsf+23W5XVlZWndRcWw6HI+Bf0JPjoSeB6Ecw\nehLs2I9fu91OX/4rmnsSMUHGMAw988wzOnDggB5++GHZbDYlJCQEhZby8nIlJCQETFu6dKlmzZrl\nv33TTTfp9ttvr5O6T1dKSorZJUQcehKMngSiH/9z5MgRzZw5UzfeeCN9+a/Y2Fjl5eXpjDPOUL16\n9cwuJyJUVVVJkpKTk5Wenm5yNaEVEUHGMAw999xz2rFjh/785z8rPj5eknTmmWdq2bJl8vl8/jS5\nc+dO9evXL+DxAwcOVK9evfy37Xa7SkpK6u4F1ILD4VBKSooOHz4sr9drdjkRgZ4EoyeB6Eew4uJi\nzZo1S3369JHL5TK7nIjgcDg0cuRIHT58OOK/C+pKWVmZ/1+n02lyNSdWm5AVEUFm5syZ2rZtm/Lz\n85WYmOif3rFjR8XGxmr58uXKycnRunXrVFBQoG7dugU83uVyBbyBi4uLLfMh5/V6LVNrXaEnwehJ\nIPrxPz6fz/8vPQnEevI/0byemB5kCgsL9cYbbyg2Nla5ubn+6ddee62uv/56TZw4UTNmzNDChQtV\nv359TZgwQcnJySZWDAAAIoXpQSY7O1uvvfbaCe9v1qyZpkyZUocVAQAAq4i4068BAABOFkEGAABY\nFkEGAABYFkEGAABYFkEGAABYlulnLQEA8GtWWlrqH3k3XI4NDFgX46w5nU6lpqaGdRk/RpABAMAk\npaWlGjx4sH/AunAbO3Zs2Jdht9u1aNGiOgszBBkAAExSVVUln8+nOXPmKDs72+xyTlthYaFyc3PD\nvoXpxwgyAACYLDs7Ww0aNDC7DEviYF8AAGBZBBkAAGBZBBkAAGBZBBkAAGBZBBkAAGBZBBkAAGBZ\nnH4NAGEU7lFbo3nEVuBkEGQAIEzqctTWaByxFTgZBBkACJNoGrXVjBFbgZNBkAGAMGPUViB8CDIA\nAJhs69atKigoMLuM03bw4ME6XyZBBgAAk91zzz1ml2BZnH4NAAAsiy0yAACY7LHHHlNGRobZZZy2\ngwcP1vnWJYIMAAAma9euXVQcEG7GcT4EGQCWUF1drbfeekslJSVKT0/XFVdcobi4OLPLAmAyggyA\niFddXa3x48drx44d/mlvv/22Hn/8cUuEmWg4I8WMs1GAk0GQARDxVq5cqR07dsjj8finffvtt3rz\nzTeVk5NjYmUnhzNS8EsKCwteMTYjAAAcDUlEQVTNLiEkzHgdBBkAEa+goECGYQRMMwzD8ls5AKfT\nKbvdrtzcXLNLCRm73S6n01lnyyPIAIh4DRo0kM1mC5hms9ksc3BkNJyRYsbZKL8GqampWrRoUdgv\n/VBSUqKxY8dq+vTpSk9PD+uy6vriogQZABGvX79+eueddwKOkWnRooX69u1rYlUnLxrOSGHrV/jU\nxZe+w+GQJLlcLmVmZoZ9eXWJIAMg4sXFxWnKlCl6++23/WctXX755ZY40BdAeBFkAFhCXFyc+vfv\nr/T0dJWUlMjr9ZpdEoAIwCUKAACAZRFkAACAZRFkAACAZRFkAACAZXGwLwCEWTSM2hoNrwHRiSAD\nAGESbaO21vWIrcDJIMgAQJjUxait0TxiK3AyCDIAEEbh/uKP5hFbgZPBwb4AAMCyCDIAAMCyCDIA\nAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyonJAvLi4uIgfRttms0mSkpKSZBiGydVE\nBnoSjJ4Eoh/B7Ha78vLylJWVpaSkJLPLiQisJ8HKy8slSQkJCUpOTja5mtCKyiBTXV2t6upqs8v4\nWQ6HQ3FxcXK73fJ6vWaXExHoSTB6Eoh+BHM4HBo5cqRKSkpUVlZmdjkRgfUkWEVFhf/fSF5ParMR\ngl1LAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAABEuaSk\nJOXl5UXl6M8EGQAAolxSUpJGjhxJkAEAAIgkBBkAAGBZBBkAAGBZBBkAAGBZBBkAAGBZBBkAAGBZ\nBBkAAGBZBBkAAGBZBBkAAGBZBBkAAGBZBBkAAGBZBBkAAGBZBBkAAGBZBBkAAGBZBBkAAGBZBBkA\nAGBZBBkAsKjZs2erb9++6tq1q6666ipt2LDB7JIQgaZPn66rr75aF154oUaOHKkjR46YXVJIEWQA\nwIJefvll/eMf/5DP55Mk1dTUaOLEidq9e7fJlSGSPPnkk1qxYoWqq6vl8Xi0Y8cOjRgxwr/eRAOC\nDABY0OLFi487/emnn67jShDJVq1aFTTt0KFD+uKLL0yoJjwIMgBgQR6P57jTy8vL67gSRLITbXk5\ndOhQHVcSPgQZALCgJk2aHHd6jx496rgSRLKMjIzjTj/33HPruJLwIcgAgAVNmzZN8fHxAdPatGmj\n3/3udyZVhEj02GOPyel0BkwbM2aM0tLSTKoo9GLMLgAAcOri4uK0dOlSrVixQnv37lXnzp31m9/8\nxuyyEGEaNWqkf/zjH1qzZo18Pp86d+4sl8tldlkhRZABAItyOBz67W9/q/T0dJWUlMjr9ZpdEiJQ\nXFycrrjiiqhdT9i1BAAALIsgAwAALIsgAwAALIsgAwAALIsgAwAALIsgAwAALIsgAwAALIsgAwAA\nLIsgAwAALIsgAwAALIsgAwAALIsgAwAALMtmGIZhdhG/RsXFxVq6dKkGDhwYdVcirS16EoyeBKIf\nwehJMHoSLJp7whYZkxQXF2vWrFkqLi42u5SIQU+C0ZNA9CMYPQlGT4JFc08IMgAAwLIIMgAAwLIc\nDz300ENmF/FrlZCQoK5duyoxMdHsUiIGPQlGTwLRj2D0JBg9CRatPeFgXwAAYFnsWgIAAJZFkAHq\n2EMPPaS33nrruPdVV1erf//++uGHH372ObZs2aJbb701HOXVuZ/rx08988wzWrhwYZgrMldRUZGu\nv/561dTU/OK8/fv31/fff18HVYXHhAkTtGLFCrPLgMXFmF1ApKupqdFzzz2nTZs2qaysTC6XS9dd\nd5169+4dtmVOmDBBF198sa688sqwLePXZtq0aUpPT9fw4cPNLkWhOCytffv2ev7550+/mAhwKv0Y\nPXp0+AqJEFlZWVqyZInZZSAE+CyvGwSZX+D1epWRkaH8/HxlZ2fr66+/1sMPP6wGDRqoTZs2Zpd3\nXB6PRzEx/GkBANGPb7tfEB8frxtvvNF/u127dmrbtq2++uorNW/eXDNmzNBnn30mn8+nBg0a6P77\n75fL5VJ5ebnmzp2rDRs2yOv1qnv37srNzVVcXJzKy8v1xBNP6JtvvpHH41GbNm00evRoZWVlacGC\nBdq6dau2bdumuXPn6sILL9S4ceNUUlKiWbNmafPmzYqNjdVll12mQYMGyW63a9WqVVqxYoXat2+v\nVatWqXv37mH55XrgwAHNmTNHmzdvlsfjUfv27XX//fdrw4YNevHFF1VUVKTGjRvr1ltvVatWrSQd\n/UXStm1bbd26Vdu3b1fz5s1177336vXXX9ebb74pp9Op2267Teeff76ko1tOYmNjVVxcrK1bt6px\n48a688471bRpU0nSsmXLtHLlSpWWliozM1NDhgxR9+7d/TW+++67WrZsmYqKipSamqqRI0eqqKhI\nH3zwgWw2m/7973+refPmevTRR0PamxEjRuiqq67S6tWrtXfvXnXq1El33XWX5s2bp7Vr1yo9PV2/\n//3v1apVq4BfaT6fTwsWLNDbb7+tuLg4DRo0KOB5N2zYoLlz56q4uFgJCQm66qqrdP3112vz5s16\n/PHHNX/+fK1bt07Tpk3zP8br9So9PV0vvPCCDMPQ8uXL9eabb+rw4cNq3bq1xowZE/aRPWvbj2Pr\ncqdOnbRy5UrFxsbqpptu8m8B/fGWtTFjxuiGG27QRRdd5F/ubbfdpmHDhqlbt26aPXu2PvzwQ7nd\nbp1xxhkaMWKEOnToIElauHChdu3apeTkZK1du1YpKSkaPXq0zj333LD25ac96tu3r1avXq2ioiJ1\n6tRJd9xxh9xut/Ly8vTKK68oLi5ObrdbL774oj799FNVVFSoWbNmmjRpkpxOZ8Dzffvtt5o8ebJG\njBih7t27q3///nrmmWfUuHFjSdKLL76okpIS3XXXXfrhhx+Ul5en22+/XS+//LJqamp0+eWXa8iQ\nIbLba3fEwdKlS/Wvf/1L5eXlSktL06233qo1a9YEbAn9/vvvNXr0aL322mv+xxUWFuqee+7Rrl27\n1LJlS40dO1ZZWVn++WfPnq1vvvlGknTxxRdr1KhRkqRVq1bplVde0aFDh3T22Wdr1KhRatSokb+3\nJ7v+SUc/p1q3bq0tW7Yct46fW5d8Pp/++c9/6s0331RJSYlcLpfGjRundevWHfezPFxOtf9r1qzR\n4sWLNWPGDP9zfPDBB1q6dKn+9re/ha3OsDBwSioqKowhQ4YYn332mbFixQrj4YcfNiorKw2Px2Ns\n377dKCsrMwzDMP7yl78YU6dONdxut1FWVmY88MADxvz58w3DMIyysjJj7dq1RmVlpeF2u41HHnnE\nmDRpkn8Z9913n/HGG2/4b3u9XmPcuHHG/PnzjaqqKqO4uNi48847jZUrVxqGYRjvvPOO8dvf/tZY\nunSpUVNTY1RWVob8dXs8HuOuu+4ynnnmGcPtdhvV1dXG5s2bjb179xoDBw40PvnkE8Pj8RgrV640\nbrjhBn8f7rvvPmPEiBHGnj17jKqqKmPixIlGXl6esWLFCsPj8RhvvvmmMWzYMMPr9RqGYRhTp041\nBg4caHz++edGTU2N8fLLLxt5eXmGx+MxDMMw1q5daxQXFxter9dYvXq1MXDgQKOoqMgwDMP46KOP\njKFDhxpbt241fD6fUVhYaOzevdv/vPPmzQt5X4655ZZbjN///vdGcXGxceTIEWPMmDHGqFGj/H15\n6aWXjHHjxvl7cuzvu3LlSiMvL8/Yv3+/4Xa7jfz8fCMnJ8coKCgwDMMwhg0bZnz55ZeGYRxdb775\n5hvDMAzjiy++MIYOHRpUR1VVlfGHP/zBv669/vrrxl133WUUFBQYNTU1xoIFC4y77747bH043X68\n8847xjXXXGP861//Mjwej/Hhhx8a1113neF2uw3DCPw7Ll682Jg8ebJ/md98840xePBgo7q62jAM\nw3jvvfeM0tJSw+PxGMuWLTOGDBnif2/8/e9/NwYMGGB89NFHhsfjMZYvX27cfPPNYe/Lj91yyy3G\nqFGj/H/7SZMmGU8++aRRUFBg5OTkGFVVVYZhGEZ+fr4xefJk49ChQ4bH4zG2bNnif405OTnGnj17\njC+++MIYPny48fnnn/uf/9h9x8ybN8+YOnWqYRiGfxl/+ctfDLfbbezbt88YMWKE8fbbb9fqtezZ\ns8e4+eabjeLiYsMwDOOHH34w9u7dG/S+27Nnj5GTk+O/fd999xlDhgwxtm/fblRVVRkzZsww7r33\nXsMwDKO8vNy4+eabjcWLFxuVlZVGZWWlsWXLFsMwjq7/gwYNMr766iujurraeOmll4yRI0caNTU1\n/t6e7Pr3S3UYxs+vS8uXLzdGjRplfPfdd4bP5zO+//5744cffvA/748/y8OlNv2vqqoyfve73xk7\nduzw3z9p0iRj6dKlYa831DjY9xQYhqHp06erZcuW6ty5sxwOh8rKyrRv3z45HA61aNFC9erV06FD\nh/TJJ5/o1ltvVWJiourVq6frr79eq1evliTVq1dPF110kZxOpxITE3X99ddry5YtJ1zu9u3bVVxc\nrCFDhiguLk6ZmZm65ppr/M8nSWlpaRowYIBiYmKCfqmFwn/+8x/98MMPGjFihBITExUbG6sOHTpo\nzZo1Ou+883T++efL4XCob9++crlc+vTTT/2P7dOnjxo3bqy4uDh169ZNPp9P/fr1k8PhUK9evVRS\nUqKDBw/65+/SpYvOPfdcxcTE6Nprr1V5ebm2bdsmSbrooouUmZkpu92uiy++WI0aNfL/WluxYoUG\nDBigtm3bymazKSsrS02aNAl5L07k6quvVmZmppKSktSlSxdlZGT4+3LxxRdr586d8vl8AY9ZvXq1\n+vfvrwYNGigxMVE33HBDwP0Oh0N79uxReXm56tWrp5YtW/5sDU899ZQyMjI0ZMgQSUd7MmTIENWv\nX18xMTEaPHiwtm/frqKiotC++OOoTT8kKTMzU1dffbUcDoe6d+8um82mvXv3Bs3Xu3dvbdy4UUeO\nHJEkvf/++7rooosUGxvrvz8lJUUOh0MDBgyQx+PRnj17/I9v06aNLrzwQjkcDvXp00fFxcU6fPhw\nmLpxfFdffbX/bz906FCtWbNGxo9GxCgpKdHHH3+sMWPGKDU1VQ6HQ+3atfO/Rklav369nnjiCd13\n332nvEVp8ODBSkxM1BlnnKGcnBx98MEHtXoddrtdNTU12r17tzwej7Kzs9WwYcOTemzv3r3VokUL\nxcXFafjw4dq6dauKi4v16aef+j8fnU6nnE6n2rVrJ+no3/rSSy9VmzZtFBsbq0GDBqmsrMz/WSCd\n+vp3ojqO3XeidWnlypUaMmSImjZtKpvNpkaNGik7O7tWfayt2vT/2Ofx+++/L0k6fPiw/t//+3/q\n1atXHVQcWuxaOkmGYeiZZ57RgQMH9PDDD8tms+mSSy7RgQMHNGXKFB05ckQ9e/bUsGHDVFhYKJ/P\np1tuuSXg8cfeNFVVVXrhhRcCPoQrKipUU1MT8AF1TGFhoUpLSwO+5Hw+X8DugczMTNlstnC9fBUX\nFysrKyuovgMHDgS9abOzswOCSVpamv//Tqcz6LYkVVZW+qcd25wrHf0iz8zM1IEDByQd3XX0z3/+\nU4WFhZKO9u3Yl09xcbHOOOOM03qdp+OXXqfH45HH4wl4zMGDBwP+jj9+7ZJ03333acmSJXrxxRfV\ntGlTDR06VO3btz/u8hcvXqzdu3frr3/9q39d+OGHH/TYY48F7C6w2+3+v2c41aYfP33csXl/vH4c\nk52drbPPPlvr1q3TpZdeqrVr1+qee+7x3//qq6/q7bff1sGDB2Wz2VReXh4QVNLT0wOWIR1dn1JS\nUmrxamvnp397j8ej0tJS/7SioiIlJSUpNTX1hM/xz3/+U926dVPr1q1Pefk/Xgeys7P977NT1bBh\nQ40YMUKLFy/WY489pk6dOgV8/p1sDfXq1VNiYqIOHDigoqKiE76fDxw4oPPOO89/2+FwyOVyBdR/\nsutfXFzcz9bhcrl+dl36uTrrSm3737t3b02fPl033XST1qxZo3bt2ikzM7MOKg4tgsxJMAxDzz33\nnHbs2KE///nPio+PlyTFxMRo0KBBGjRokIqKivwHAXfv3l0Oh0Pz588/bjB59dVXtWfPHj3++OPK\nyMjQzp07NXbsWP8vsZ8GEpfLJZfLpRdeeOGENYYzxByroaioKOhA4szMTH377bcB8xYWFgYct3Kq\nfry1wOv16sCBA8rMzFRhYaFmzJihhx9+WG3btpXD4Qjom8vl0v79+4/7nOHuT21lZGQEXMTtp1tK\nWrZsqfvvv19er1crVqzQI488opdeeinoedatW6cVK1bo8ccf96+f0tEP59GjR6tjx47hexEm6t27\ntz744AO5XC7Fxsb6f7Fv2bJFr7zyivLz89W0aVPZ7XYNHjw4YGtHJPjp3z4mJiYgSGVlZcntduvw\n4cMnDFh//OMf9eyzz2rhwoUBP3bi4+NVVVXlv11SUhL02GNB6dj/T+dLrFevXurVq5fKy8v17LPP\navbs2UpLSzupGo5xu90qLy9XZmamsrKy/FsLfiozMzPoc6K4uPi06j9RHb+0LmVlZWn//v1q3rx5\n0HPW5edObfrfsWNHGYahLVu26P3331ffvn3rrN5QYtfSSZg5c6a2bdumSZMmBQzt/MUXX+i7776T\n1+tVfHy87Ha77Ha70tPT1bVrV82aNUtHjhyRYRgqKirSZ599Junor764uDglJSXpyJEjWrx4ccDy\n0tLSVFBQ4L/dsmVLpaSk6OWXX1ZlZaV8Pp/27dunL7/8sm4a8N8asrKyNHv2bJWXl8vj8ejLL79U\njx499Pnnn2vjxo3yer16++23VVRUpK5du9Z6WRs3btSmTZvk8Xi0dOlSJSQkqFWrVv5f5cd+nb77\n7rvavXu3/3F9+/bV8uXL9fXXX8swDBUXF/vH2PhpTyPFxRdfrNdff10FBQUqLy/XokWL/PfV1NTo\n/fffl9vtlsPh8K9jP7Vjxw49/fTTuvfee4O2slx55ZVasGCBP+AdOXJEa9euDe+LqkM9evTQtm3b\n9Oqrr6pXr17+L46KigrZ7XalpKTI6/VqyZIlqqioMLnaYG+88Yb/b//3v/9dPXr0CPgbp6en6ze/\n+Y2eeeYZHT58WF6vV1999VXAGDNpaWnKz8/XmjVrAtaf5s2b67333vM/5uOPPw5a/ssvv6zy8nIV\nFBTo9ddf18UXX1yr1/H9999r06ZN/q3KTqdTDodDzZs314YNG1RaWqqysjItXbo06LEffPCBduzY\noerqar344otq27atXC6Xzj//fJWVlemVV15RVVWVqqqqtHXrVklHv7Tfffdd/ec//1FNTY0WL16s\nevXq+Q/erY0T1fFL61Lfvn21cOFC7d69W4ZhaN++ff4txnX1uVPb/tvtdvXs2VNLlizRzp07T+sH\nqJnYIvMLCgsL9cYbbyg2Nla5ubn+6ddee63q16+vZ599VgcOHJDT6VS3bt10+eWXS5LuuusuLViw\nQGPHjtWRI0fkcrnUr18/denSRf3799cTTzyhoUOHKiMjQ9dcc43WrVvnf+6cnBxNnz5db731ln7z\nm9/o97//vf70pz9p7ty5GjVqlCorK1W/fn0NHDiwzvrgcDj0pz/9SbNmzVJeXp4kqUOHDrrvvvt0\n9913a+7cuSoqKlKjRo30wAMPKDk5udbL6t27t5YvX67JkyercePGmjBhgmJiYnTmmWdqwIAB+uMf\n/yibzaY+ffoEnALfvXt3HTlyRH/7299UXFysjIwM3XrrrWrcuLEuv/xy/fWvf9XgwYPVvHlzTZ48\n+bR7EgqXX3659u/fr/Hjx/vPWlq/fr3//vfee0/PP/+8vF6vGjZsqLvvvjvoOdavXy+3260HHnjA\nPy0rK0tPP/20/u///k82m01//vOfdeDAASUlJencc89Vjx496uT1hVu9evV03nnnaf369QEDBHbu\n3Fnnn3++Ro8erfj4ePXv3z/sZ2rVxiWXXKLJkyerqKhI55xzjvLy8lReXh4wz1133aU5c+bojjvu\nUHV1tc466yw9+OCDAfOkp6dr8uTJuv/++2Wz2TRo0CDl5eVp2rRpuuGGG3TuueeqZ8+eAb/OJem8\n887T7bffrurqal1++eW67LLLavU6ampqtGDBAu3Zs0d2u91/JmZaWpo2b96skSNHKiMjQ7/97W+1\ncePGgMdeeumleu6557Rr1y6dffbZ+sMf/iDp6HWBHn74Yb3wwgtaunSp/5i6du3a6ZxzztHw4cP1\nxBNPqLS0VM2bN9ef/vSn0xp24kR1/NK6lJOTI4/Ho/z8fJWWlio7O1t33XWXsrOzj/tZHg6n0//e\nvXvr1VdfVY8ePSx7DSautYSIEkkD1wHhNGLECN12223q0qVLnS/72OnXx07x/rVj4DprY9cSAACw\nLIIMAACwLHYtAQAAy2KLDAAAsCyCDAAAsCyCDAAAsCyCDAAAsCyCDAAAsCyCDIA6Y7PZNGXKFLPL\nABBFCDIAAMCyCDIAAMCyCDIAQuqjjz7SFVdcoZSUFCUnJ+uCCy7Q22+/fdx5//3vf+vyyy9Xdna2\nUlJSdMEFF2jlypUB8xw6dEh5eXlq1KiR4uPj1aRJEw0aNOik7wcQ3bj6NYCQ+fDDD9WnTx9deOGF\neuGFF5SWlqYNGzZo9+7dx51/586dysnJ0fjx42W327VixQpdddVVevfdd9W7d29J0rhx47RixQo9\n+uijatasmfbv368VK1b4n+OX7gcQ3bhEAYCQueiii3To0CF98cUXcjgcQffbbDY9/vjjGj9+fNB9\nPp9PPp9PV199tTIzM7Vw4UJJUocOHdS3b1898cQTx13mL90PILqxawlASJSXl2v9+vUaPnz4cUPM\n8Xz//fcaPny4GjVqpJiYGMXGxuqtt97SN99845/nvPPO07x58zRlyhR9+eWXQc/xS/cDiG4EGQAh\nUVJSIp/Pp4YNG57U/D6fT/3799fatWv18MMP67333tOnn36qK6+8UpWVlf75nnrqKQ0dOlRPPPGE\nOnbsqDPPPFPPPvvsSd8PILoRZACERFpamux2u/bt23dS82/fvl2ff/65nnzySd1yyy3q1auXunbt\nqoqKioD5UlNTNW3aNO3fv19ffPGFrrjiCo0ePVqrV68+qfsBRDeCDICQSEpKUrdu3TR//nx5vd5f\nnP9YYImLi/NP27Vrlz788MMTPqZjx46aOnWqJOnrr78+5fsBRB/OWgIQMo8++qj69Omjyy67TKNH\nj1Z6ero2btwol8ul3NzcgHnbtGmjxo0b695775XX65Xb7daDDz6oRo0aBcx30UUXacCAAerQoYMc\nDofmz5+vuLg4XXzxxSd1P4DoRpABEDI9evTQ+++/r4kTJ+qmm26Sw+FQ+/btlZ+fHzSv0+nUsmXL\nNGbMGF133XVq0qSJJk6cqHfffVcbNmzwz3fRRRdp/vz52rlzp+x2uzp27KjXX39dbdu2Pan7AUQ3\nTr8GAACWxTEyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggy\nAADAsggyAADAsggyAADAsggyAADAsv4/wOTGEwUevEwAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# boxplot\n", "\n", "(ggplot(mpg, aes(x='class', y='hwy')) \n", " + geom_boxplot())" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.6" } }, "nbformat": 4, "nbformat_minor": 4 }