import pandas as pd
acidentes = pd.read_csv('2013_acidentes-1o_Semestre.csv', sep=';', parse_dates=[7])
veiculos = pd.read_csv('2013_veiculos-1o_Semestre.csv', sep=';')
vitimas = pd.read_csv('2013_vitimas-1o_Semestre.csv', sep=';')
hist_veiculo = veiculos.tipo_veiculo.value_counts()
horizontal_axis = linspace(0.5, 1.5 + len(hist_veiculo.values), num=len(hist_veiculo.values))
bar(horizontal_axis, hist_veiculo.values, width=1, align='center')
xticks(horizontal_axis, hist_veiculo.keys())
([<matplotlib.axis.XTick at 0x87e37d0>, <matplotlib.axis.XTick at 0x801a4d0>, <matplotlib.axis.XTick at 0x8a43b10>, <matplotlib.axis.XTick at 0x8a45150>, <matplotlib.axis.XTick at 0x8a45890>, <matplotlib.axis.XTick at 0x8a45fd0>, <matplotlib.axis.XTick at 0x8a47750>, <matplotlib.axis.XTick at 0x8a47e90>, <matplotlib.axis.XTick at 0x8a4a610>, <matplotlib.axis.XTick at 0x8a4ad50>, <matplotlib.axis.XTick at 0x8a4f4d0>, <matplotlib.axis.XTick at 0x8a4fc10>, <matplotlib.axis.XTick at 0x8a51390>, <matplotlib.axis.XTick at 0x8a51ad0>], <a list of 14 Text xticklabel objects>)
hist_distrito = acidentes['distrito'].value_counts()
horizontal_axis = linspace(0.5, 0.5 + len(hist_distrito.values), num=len(hist_distrito.values))
bar(horizontal_axis, hist_distrito.values, width=1, align='center')
<Container object of 96 artists>
import json
topo = json.load(open("distritos.topo"))
dis_info = [(dis['properties']['Name'], dis['id']) for dis in topo['objects']['distritos']['geometries']]
dis_info
[(u'\xc1GUA RASA', 0), (u'ALTO DE PINHEIROS', 1), (u'ANHANGUERA', 2), (u'ARICANDUVA', 3), (u'ARTUR ALVIM', 4), (u'BARRA FUNDA', 5), (u'BELA VISTA', 6), (u'BELM', 7), (u'BOM RETIRO', 8), (u'BRS', 9), (u'BRASILNDIA', 10), (u'BUTANT', 11), (u'CACHOEIRINHA', 12), (u'CAMBUCI', 13), (u'CAMPO BELO', 14), (u'CAMPO GRANDE', 15), (u'CAMPO LIMPO', 16), (u'CANGAIBA', 17), (u'CAPO REDONDO', 18), (u'CARRO', 19), (u'CASA VERDE', 20), (u'CIDADE ADEMAR', 21), (u'CIDADE DUTRA', 22), (u'CIDADE LIDER', 23), (u'CIDADE TIRADENTES', 24), (u'CONSOLAO', 25), (u'CURSINO', 26), (u'ERMELINO MATARAZZO', 27), (u'FREGUESIA DO', 28), (u'GRAJA', 29), (u'GUAIANASES', 30), (u'MOEMA', 31), (u'IGUATEMI', 32), (u'IPIRANGA', 33), (u'ITAIM BIBI', 34), (u'ITAIM PAULISTA', 35), (u'ITAQUERA', 36), (u'JABAQUARA', 37), (u'JAAN', 38), (u'JAGUARA', 39), (u'JAGUAR', 40), (u'JARAGU', 41), (u'JARDIM NGELA', 42), (u'JARDIM HELENA', 43), (u'JARDIM PAULISTA', 44), (u'JARDIM SO LUS', 45), (u'JOS BONIFCIO', 46), (u'LAPA', 47), (u'LIBERDADE', 48), (u'LIMO', 49), (u'MANDAQUI', 50), (u'MARSILAC', 51), (u'MOOCA', 52), (u'MORUMBI', 53), (u'PARELHEIROS', 54), (u'PARI', 55), (u'PARQUE DO CARMO', 56), (u'PEDREIRA', 57), (u'PENHA', 58), (u'PERDIZES', 59), (u'PERUS', 60), (u'PINHEIROS', 61), (u'PIRITUBA', 62), (u'PONTE RASA', 63), (u'RAPOSO TAVARES', 64), (u'REPBLICA', 65), (u'RIO PEQUENO', 66), (u'SACOM', 67), (u'SANTA CECLIA', 68), (u'SANTANA', 69), (u'SANTO AMARO', 70), (u'SO LUCAS', 71), (u'SO MATEUS', 72), (u'SO MIGUEL', 73), (u'SO RAFAEL', 74), (u'SAPOPEMBA', 75), (u'SADE', 76), (u'S', 77), (u'SOCORRO', 78), (u'TATUAP', 79), (u'TREMEMB', 80), (u'TUCURUVI', 81), (u'VILA ANDRADE', 82), (u'VILA CURU', 83), (u'VILA FORMOSA', 84), (u'VILA GUILHERME', 85), (u'VILA JACU', 86), (u'VILA LEOPOLDINA', 87), (u'VILA MARIA', 88), (u'VILA MARIANA', 89), (u'VILA MATILDE', 90), (u'VILA MEDEIROS', 91), (u'VILA PRUDENTE', 92), (u'VILA SNIA', 93), (u'SO DOMINGOS', 94), (u'LAJEADO', 95)]
distritos['name']
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-14-54ead06452fa> in <module>() ----> 1 distritos['name'] NameError: name 'distritos' is not defined
hist_escolaridade = make_hist(vitimas, 'escolaridade')
dist_esc_s = sorted(hist_escolaridade.items(), key=lambda x: x[1])
bar(range(len(dist_esc_s)), [a[1] for a in dist_esc_s])
xticks(range(len(dist_esc_s)), [a[0] for a in dist_esc_s])
([<matplotlib.axis.XTick at 0x3f00dd0>, <matplotlib.axis.XTick at 0x3cf9b50>, <matplotlib.axis.XTick at 0x3d25a10>, <matplotlib.axis.XTick at 0x3d281d0>, <matplotlib.axis.XTick at 0x3d28910>, <matplotlib.axis.XTick at 0x3d2a090>, <matplotlib.axis.XTick at 0x3d2a7d0>, <matplotlib.axis.XTick at 0x3d2af10>], <a list of 8 Text xticklabel objects>)
1 - Analfabeto
2 - 1º Grau incompleto
3 - 1º Grau completo
4 - 2º Grau incompleto
5 - 2º Grau completo
6 - Superior incompleto
7 - Superior completo
8 - Sem informações
hist_sexo = make_hist(vitimas, "sexo")
bar(range(3), hist_sexo.values())
xticks(range(3), ("X", "M", "F"))
hist_sexo
{'F': 5275, 'M': 12429, 'X': 73}
hist_tipo = make_hist(vitimas, "tipo_vitima")
for t,v in hist_tipo.items():
print t, v
PS 3847 SI 72 PD 4104 CD 9754
hist_drunk = make_hist(vitimas, "estado_alcoolizacao")
hist_drunk
{'AA': 79, 'BR': 17595, 'SA': 103}
semanal = [x.dayofweek for x in acidentes.data]
hist_semanal = make_hist(semanal)
bar(range(7), hist_semanal.values())
<Container object of 7 artists>
mensal = [x.day for x in acidentes.data]
hist_mensal = make_hist(mensal)
bar(hist_mensal.keys(), hist_mensal.values())
<Container object of 25 artists>
habilitacao = make_hist(veiculos, "categoria_habilitacao")
habilitacao
{'HA': 2392, 'IN': 1131, 'NE': 416, 'SI': 20471}
idade = make_hist(vitimas, 'idade')
del(idade['SI'])
idade_tp = [(int(k), v) for k,v in idade.items()]
idade_s = sorted(idade_tp, key=lambda x: x[0])
plot(map (lambda x: x[0], idade_s), map (lambda x: x[1], idade_s))
[<matplotlib.lines.Line2D at 0x594cf10>]
O arquivo distritos.csv é um arquivo kml convertido para csv pelo Cartodb. Ele possui informações geográficas dos distritos e os nomes, mas os nomes nos arquivos do CET não possuem acentos, enquanto no arquivo do csv cartodb eles existem. Para isso foi necessário alguns malabarismos para associar as linhas corretas dos dados do cet com os dados do cartodb. Isso está logo abaixo no código:
unicodedata.normalize('NFKD', x.decode('utf8')).encode('ASCII', 'ignore')
O código a seguir é utilizado para ver quais nomes existem no arquivo do cet que não existem no arquivo do cartodb:
import unicodedata
distritos = pd.read_csv('distritos.csv', sep=',')
ads = acidentes['distrito']
s1 = set(ads.unique())
s2 = set([unicodedata.normalize('NFKD', x.decode('utf8')).encode('ASCII', 'ignore') for x in distritos['name']])
print s1 - s2
set([nan, 'ALTO DE PINHEIR', 'ERMELINO MATARA', 'CIDADE TIRADENT'])
import difflib
#hist_dist = make_hist(acidentes, 'distrito')
# Adicionando uma nova coluna
#distritos['acidentes'] = 0
#distritos['no_accents_name'] = ''
#distritos['map_id'] = 0
for dist_name, dist_id in dis_info:
pd_dist_name = difflib.get_close_matches(dist_name, map(lambda x: x.decode('utf8'), distritos['name']))[0]
distritos.ix[distritos['name'].map(lambda x: x.decode('utf8') == pd_dist_name), 'no_accents_name'] = dist_name.encode('utf8')
distritos.ix[distritos['name'].map(lambda x: x.decode('utf8') == pd_dist_name), 'map_id'] = dist_id
# distritos.ix[distritos['name'].map(lambda x: unicodedata.normalize('NFKD', x.decode('utf8')).encode('ASCII', 'ignore')[:15] == k), 'acidentes'] = v
Por sorte, apenas três nomes após a conversão do acentos. Pelo padrão é fácil notar que os dados do cet estão sendo truncados em 15 caracteres. Com o pandas isso é fácil de resolver como mostra o código a seguir:
hist_dist = make_hist(acidentes, 'distrito')
# Adicionando uma nova coluna
distritos['acidentes'] = 0
for k, v in hist_dist.items():
# IMPORTANTE! É necessário utilizar o índice .ix caso contrário o view retornado pelo índice não será mutável
distritos.ix[distritos['name'].map(lambda x: unicodedata.normalize('NFKD', x.decode('utf8')).encode('ASCII', 'ignore')[:15] == k), 'acidentes'] = v
# Criando o novo arquivo CSV para ser importado pelo cartodb
distritos.to_csv('distritos-acidentes.csv')