Fetch data


In [1]:
!wget https://raw.githubusercontent.com/dwillis/smpa3193-exercises/master/arrest.csv


--2017-02-28 08:56:07--  https://raw.githubusercontent.com/dwillis/smpa3193-exercises/master/arrest.csv
Resolving raw.githubusercontent.com... 151.101.32.133
Connecting to raw.githubusercontent.com|151.101.32.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1204206 (1.1M) [text/plain]
Saving to: 'arrest.csv'

arrest.csv          100%[===================>]   1.15M  3.43MB/s    in 0.3s    

2017-02-28 08:56:08 (3.43 MB/s) - 'arrest.csv' saved [1204206/1204206]

Read the data


In [30]:
import agate
import agatestats
from Levenshtein import distance

#agatestats.patch()
results = agate.Table.from_csv("arrest.csv")

In [5]:
print(results)


| column         | data_type |
| -------------- | --------- |
| LName          | Text      |
| FName          | Text      |
| MName          | Text      |
| Age            | Number    |
| DateArr        | Date      |
| Charge         | Text      |
| Charge Descrip | Text      |
| Address        | Text      |


In [6]:
print(results.print_table(5))


| LName                | FName                | MName                | Age |    DateArr | Charge               | ... |
| -------------------- | -------------------- | -------------------- | --- | ---------- | -------------------- | --- |
| ABAGOBEZ         ... | MARONE               | BERHANE          ... |  35 | 2016-02-09 | 18.2-96(2)       ... | ... |
| ABARCA SANTOS    ... | ROBERTO              | CARLOS           ... |  33 | 2016-02-08 | 82-1-6[46.2-300] ... | ... |
| ABAWI            ... | KAIS                 |                      |  24 | 2016-02-02 | 82-1-6[46.2-300] ... | ... |
| ABAWI            ... | KAIS                 |                      |  24 | 2016-02-02 | 82-1-6[46.2-300] ... | ... |
| ABBAS            ... | ALI                  | BABUR GHULAM     ... |  29 | 2015-11-22 | 82-1-6[46.2-300] ... | ... |
| ...                  | ...                  | ...                  | ... |        ... | ...                  | ... |
None

Find data with nulls in Charge Descrip


In [7]:
smelly_data = results.where(lambda x: x['Charge Descrip'] is None)
smelly_data.print_table()


| LName                | FName                | MName                | Age |    DateArr | Charge | ... |
| -------------------- | -------------------- | -------------------- | --- | ---------- | ------ | --- |
| CAMPANARO        ... | WILLIAM              | ARNETT           ... |  37 | 2016-02-20 |        | ... |
| DUODU            ... | MAXWELL              | N                ... |  41 | 2016-02-04 |        | ... |
| FACKLAM          ... | RYAN                 | JOSEPH           ... |  26 | 2015-12-14 |        | ... |
| GOMEZ            ... | TULIO                | A                ... |  34 | 2015-12-22 |        | ... |
| KANADE           ... | SAKET                |                      |  18 | 2016-01-19 |        | ... |
| KARGBO           ... | SANTIGIE             |                      |  22 | 2016-02-19 |        | ... |
| KING             ... | CARLTON              | R                ... |  49 | 2015-11-19 |        | ... |
| MATTOX           ... | MARTY                |                      |  32 | 2016-02-01 |        | ... |
| REAVES           ... | BRITTANY             | COLLETE          ... |  28 | 2016-02-06 |        | ... |
| SELNICK          ... | ALEXANDER            | RENATO           ... |  27 | 2016-01-21 |        | ... |
| SMITH            ... | ROBERT               | SYPHAX           ... |  53 | 2016-02-02 |        | ... |
| WARREN           ... | BRENT                | BROOKS           ... |  23 | 2016-02-17 |        | ... |
| WRIGHT           ... | JOSEPH               | A                ... |  43 | 2015-10-08 |        | ... |

Cleanup names


In [8]:
results = results.compute([
    ('LName', agate.Formula(agate.Text(), lambda row: row['LName'].strip() if row['LName'] else None, results.columns['LName'])),
    ('MName', agate.Formula(agate.Text(), lambda row: row['MName'].strip() if row['MName'] else None, results.columns['MName'])),
    ('FName', agate.Formula(agate.Text(), lambda row: row['FName'].strip() if row['FName'] else None, results.columns['FName']))
], replace=True)

Compute Age distribution


In [9]:
age_distribution = results.pivot('Age').order_by('Count', True)
age_distribution.print_table()


| Age | Count |
| --- | ----- |
|  22 |   177 |
|  27 |   169 |
|  19 |   167 |
|  21 |   161 |
|  25 |   160 |
|  23 |   159 |
|  24 |   158 |
|  26 |   145 |
|  20 |   144 |
|  30 |   137 |
|  18 |   137 |
|  31 |   124 |
|  32 |   121 |
|  28 |   119 |
|  29 |   111 |
|  33 |    95 |
|  35 |    88 |
|  36 |    75 |
|  37 |    72 |
|  34 |    71 |
| ... |   ... |

Histogram of Age Distribution


In [10]:
age_distribution.print_bars('Age', 'Count')


Age Count
22    177 ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░             
27    169 ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░                 
19    167 ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░                  
21    161 ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░                     
25    160 ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░                      
23    159 ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░                      
24    158 ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░                       
26    145 ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░                              
20    144 ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░                               
30    137 ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░                                  
18    137 ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░                                  
31    124 ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░                                         
32    121 ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░                                           
28    119 ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░                                            
29    111 ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░                                                 
33     95 ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░                                                         
35     88 ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░                                                             
36     75 ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░                                                                    
37     72 ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░                                                                      
34     71 ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░                                                                      
39     67 ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░                                                                        
38     64 ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░                                                                          
44     63 ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░                                                                           
42     57 ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░                                                                              
41     52 ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░                                                                                 
45     48 ▓░░░░░░░░░░░░░░░░░░░░░░░░░░                                                                                   
47     46 ▓░░░░░░░░░░░░░░░░░░░░░░░░░                                                                                    
43     43 ▓░░░░░░░░░░░░░░░░░░░░░░░                                                                                      
50     42 ▓░░░░░░░░░░░░░░░░░░░░░░░                                                                                      
48     40 ▓░░░░░░░░░░░░░░░░░░░░░░                                                                                       
40     36 ▓░░░░░░░░░░░░░░░░░░░░                                                                                         
54     33 ▓░░░░░░░░░░░░░░░░░░                                                                                           
46     31 ▓░░░░░░░░░░░░░░░░░                                                                                            
51     29 ▓░░░░░░░░░░░░░░░░                                                                                             
55     29 ▓░░░░░░░░░░░░░░░░                                                                                             
52     28 ▓░░░░░░░░░░░░░░░                                                                                              
49     27 ▓░░░░░░░░░░░░░░░                                                                                              
53     26 ▓░░░░░░░░░░░░░░                                                                                               
57     24 ▓░░░░░░░░░░░░░                                                                                                
56     23 ▓░░░░░░░░░░░░░                                                                                                
59     18 ▓░░░░░░░░░░                                                                                                   
60     16 ▓░░░░░░░░░                                                                                                    
58     14 ▓░░░░░░░░                                                                                                     
62     14 ▓░░░░░░░░                                                                                                     
63      7 ▓░░░░                                                                                                         
65      5 ▓░░░                                                                                                          
61      5 ▓░░░                                                                                                          
67      5 ▓░░░                                                                                                          
69      5 ▓░░░                                                                                                          
64      4 ▓░░                                                                                                           
78      4 ▓░░                                                                                                           
71      3 ▓░░                                                                                                           
70      3 ▓░░                                                                                                           
76      3 ▓░░                                                                                                           
66      2 ▓░                                                                                                            
72      2 ▓░                                                                                                            
83      1 ▓░                                                                                                            
73      1 ▓░                                                                                                            
88      1 ▓░                                                                                                            
86      1 ▓░                                                                                                            
          +--------------------------+--------------------------+---------------------------+--------------------------+
          0                         50                         100                         150                       200

Identify Outliers


In [27]:
results.stdev_outliers('Age', deviations=3, reject=False).print_table()


| LName         | FName   | MName        | Age |    DateArr | Charge               | ... |
| ------------- | ------- | ------------ | --- | ---------- | -------------------- | --- |
| ABAGOBEZ      | MARONE  | BERHANE      |  35 | 2016-02-09 | 18.2-96(2)       ... | ... |
| ABARCA SANTOS | ROBERTO | CARLOS       |  33 | 2016-02-08 | 82-1-6[46.2-300] ... | ... |
| ABAWI         | KAIS    |              |  24 | 2016-02-02 | 82-1-6[46.2-300] ... | ... |
| ABAWI         | KAIS    |              |  24 | 2016-02-02 | 82-1-6[46.2-300] ... | ... |
| ABBAS         | ALI     | BABUR GHULAM |  29 | 2015-11-22 | 82-1-6[46.2-300] ... | ... |
| ABBOTT        | RAYNARD | DOUGLAS      |  19 | 2016-02-10 | 18.2-95(ii)      ... | ... |
| ABBOTT        | RAYNARD | DOUGLAS      |  19 | 2016-02-10 | 18.2-94          ... | ... |
| ABBOTT        | RAYNARD | DOUGLAS      |  19 | 2016-02-10 | 18.2-186.3(A)    ... | ... |
| ABDALLAH      | RAMI    | OSAMA        |  21 | 2016-02-25 | 18.2-250.1       ... | ... |
| ABDEL SAMAD   | JABER   | ABDELKADER   |  63 | 2016-02-05 | 82-1-6[46.2-301] ... | ... |
| ABDELLA       | EKRAM   | BEYAN        |  31 | 2016-02-13 | 82-1-6[46.2-301] ... | ... |
| ABDELLA       | MEDINA  | SULTAN       |  25 | 2016-02-06 | 82-1-6[46.2-300] ... | ... |
| ABDELLATIF    | MANAL   |              |  43 | 2015-09-21 | 82-1-6[46.2-862] ... | ... |
| ABDELRASOUL   | RAGAI   | KHALIL       |  19 | 2016-02-27 | 18.2-95(ii)      ... | ... |
| ABDELRASOUL   | RAGAI   | KHALIL       |  19 | 2016-02-27 | 18.2-95(ii)      ... | ... |
| ABDELRASOUL   | RAGAI   | KHALIL       |  19 | 2016-02-27 | 82-1-6[46.2-301] ... | ... |
| ABDI          | MOHAMED | JAMA         |  34 | 2016-02-28 | 5/1/2001             | ... |
| ABDI          | MOHAMED | JAMA         |  34 | 2016-02-28 | 18.2-119         ... | ... |
| ABDULGADER    | RUDDAD  | M            |  25 | 2015-11-18 | 82-1-6[46.2-300] ... | ... |
| ABDULKADIR    | MOHAMED | FAKHRUDIN    |  22 | 2016-02-15 | 19.2-128(B)      ... | ... |
| ...           | ...     | ...          | ... |        ... | ...                  | ... |

Mean age by Charge Description


In [86]:
charges = results.group_by('Charge')
charges.aggregate([('Mean Age', agate.Mean('Age'))]).print_table()


| Charge               | Mean Age |
| -------------------- | -------- |
| 18.2-96(2)       ... |  31.531… |
| 82-1-6[46.2-300] ... |  31.517… |
| 18.2-95(ii)      ... |  31.817… |
| 18.2-94          ... |  31.889… |
| 18.2-186.3(A)    ... |  29.857… |
| 18.2-250.1       ... |  25.318… |
| 82-1-6[46.2-301] ... |  33.113… |
| 82-1-6[46.2-862] ... |  31.268… |
| 5/1/2001             |  34.119… |
| 18.2-119         ... |  34.500… |
| 19.2-128(B)      ... |  28.250… |
| 18.2-186.3(B1)   ... |  22.900… |
| 18.2-250(A)(a)   ... |  31.127… |
| 18.2-248.1(a)(2) ... |  25.700… |
| 54.1-3466        ... |  33.364… |
| 46.2-707         ... |  35.917… |
| 18.2-57.2(A)     ... |  35.979… |
| 18.2-164(A)      ... |  34.750… |
| 46.2-300         ... |  32.704… |
| 46.2-894         ... |  37.833… |
| ...                  |      ... |

Extract City from Address


In [61]:
results = results.compute([
        ('city', agate.Formula(agate.Text(), lambda x: x['Address'].split(',')[-2].strip()))
    ],  replace=True)

Number of arrests in Alexandria


In [81]:
alexandria_begin = results.where(lambda x: x['city'].startswith('ALEX') if x['city'] else False)
len(alexandria_begin)


Out[81]:
655

Try edit distance

NOTE: DOESN'T WORK.


In [88]:
search_alexandria = results.where(lambda x: distance(x['city'], 'ALEX') <= 3 if x['city'] else False)
len(search_alexandria)


Out[88]:
63