Pandas
O Pandas é um pacote que possibilita o manejo dos dados.
Aviso: Esse post tem a finalidade de mostrar os comandos básicos e me deixar com uma “cola” rápida para meu uso cotidiano. Todas os códigos são exemplificativos e podem/devem ser alterados, indicando o nome dos arquivos e diretórios corretamente.
Nota: É possível acessar esse post em formato pdf, diretamente por meio do repositório do GitHub ou ainda, de maneira interativa, usando o .
Pandas
As bibliotecas básicas, ou packages, necessárias para criação do mapa são:
- O Pandas, que tem a missão de trabalhar com dados, criar subsets, selecionar e filtros dados e;
- O Geopandas, que é a biblioteca lê geojson!
import os
import pandas as pd
Ler CSV
tab = pd.read_csv('data/empresas.xz')
tab = tab[tab['state'] == 'SP']
tab = tab[tab['city'] == 'SANTOS']
tab.dtypes
tab.head(2)
name | situation | neighborhood | address | number | zip_code | city | state | cnpj | status | additional_address_details | main_activity | latitude | longitude | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1108 | ALMEIDA & RODRIGUES MANUTENCAO EM INFORMATICA ... | ATIVA | CENTRO | R AMADOR BUENO | 171 | 11.013-151 | SANTOS | SP | 13.295.386/0001-58 | OK | SALA 69 | Reparação e manutenção de computadores e de eq... | -23.935972 | -46.327216 |
1534 | MARCIO CESAR FRANCISQUINE SANTOS - ME | ATIVA | MARAPE | AV SENADOR PINHEIRO MACHADO | 856 | 11.075-002 | SANTOS | SP | 18.950.028/0001-55 | OK | NaN | Restaurantes e similares | -23.961729 | -46.345475 |
Ler JSON de um arquivo .json
tab = pd.read_json(os.path.join('data', 'tab.json'))
tab
id | nome | microrregiao | |
---|---|---|---|
0 | 3500105 | Adamantina | {'id': 35035, 'nome': 'Adamantina', 'mesorregi... |
1 | 3500204 | Adolfo | {'id': 35004, 'nome': 'São José do Rio Preto',... |
2 | 3500303 | Aguaí | {'id': 35029, 'nome': 'Pirassununga', 'mesorre... |
3 | 3500402 | Águas da Prata | {'id': 35030, 'nome': 'São João da Boa Vista',... |
4 | 3500501 | Águas de Lindóia | {'id': 35033, 'nome': 'Amparo', 'mesorregiao':... |
... | ... | ... | ... |
640 | 3557006 | Votorantim | {'id': 35046, 'nome': 'Sorocaba', 'mesorregiao... |
641 | 3557105 | Votuporanga | {'id': 35003, 'nome': 'Votuporanga', 'mesorreg... |
642 | 3557154 | Zacarias | {'id': 35004, 'nome': 'São José do Rio Preto',... |
643 | 3557204 | Chavantes | {'id': 35040, 'nome': 'Ourinhos', 'mesorregiao... |
644 | 3557303 | Estiva Gerbi | {'id': 35031, 'nome': 'Mogi Mirim', 'mesorregi... |
645 rows × 3 columns
Ler JSON de um objeto .json
#tab = pd.DataFrame(JSON_object)
#tab
Seleciona Linhas (Filtrar dados)
tab = pd.read_csv('data/empresas.xz')
tab = tab[tab['state'] == 'SP']
tab = tab[tab['city'] == 'SANTOS']
# Seleciona com mais de um argumento
#tab = tab[tab['CNPJ_FUNDO'].isin(['00.017.024/0001-53', '00.068.305/0001-35'])]
tab
name | situation | neighborhood | address | number | zip_code | city | state | cnpj | status | additional_address_details | main_activity | latitude | longitude | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1108 | ALMEIDA & RODRIGUES MANUTENCAO EM INFORMATICA ... | ATIVA | CENTRO | R AMADOR BUENO | 171 | 11.013-151 | SANTOS | SP | 13.295.386/0001-58 | OK | SALA 69 | Reparação e manutenção de computadores e de eq... | -23.935972 | -46.327216 |
1534 | MARCIO CESAR FRANCISQUINE SANTOS - ME | ATIVA | MARAPE | AV SENADOR PINHEIRO MACHADO | 856 | 11.075-002 | SANTOS | SP | 18.950.028/0001-55 | OK | NaN | Restaurantes e similares | -23.961729 | -46.345475 |
1777 | R P LOPES FONSECA | ATIVA | PONTA DA PRAIA | PC CORACAO DE MARIA | 23 | 11.030-280 | SANTOS | SP | 58.132.036/0001-09 | OK | NaN | Comércio varejista de combustíveis para veícul... | -23.986863 | -46.303085 |
2516 | AUTO POSTO NOVO MILENIO LTDA | ATIVA | MACUCO | R CONSELHEIRO RODRIGUES ALVES | 385 | 11.015-203 | SANTOS | SP | 03.542.311/0001-70 | OK | NaN | Comércio varejista de combustíveis para veícul... | -23.956003 | -46.321556 |
2914 | CHURRASCARIA E PIZZARIA MAXIM'S LTDA - ME | ATIVA | BOQUEIRAO | AV CONSELHEIRO NEBIAS | 656 | 11.045-002 | SANTOS | SP | 19.396.916/0001-30 | OK | NaN | Restaurantes e similares | -23.962879 | -46.323743 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
54034 | POST & OFFICE - SERVICOS TELEMATICOS LTDA - EPP | ATIVA | PONTA DA PRAIA | R VEREADOR HENRIQUE SOLER | 295 | 11.030-011 | SANTOS | SP | 68.015.478/0001-29 | OK | NaN | Atividades de franqueadas do Correio Nacional | -23.984730 | -46.295672 |
54105 | MARE MANSA RESTAURANTE E CHOPERIA LTDA - EPP | ATIVA | GONZAGA | AV PRESIDENTE WILSON | 9 | 11.065-200 | SANTOS | SP | 68.965.946/0001-26 | OK | NaN | Restaurantes e similares | -23.969259 | -46.334143 |
54266 | PORTEMAR SERVICOS LTDA. | ATIVA | GONZAGA | AV DONA ANA COSTA | 470 | 11.060-002 | SANTOS | SP | 71.545.305/0001-27 | OK | NaN | Atividades de franqueadas do Correio Nacional | -23.965090 | -46.332675 |
54389 | VAN GOGH CHOPERIA & PIZZARIA LTDA | ATIVA | JOSE MENINO | AV MAL FLORIANO PEIXOTO | 314 | 11.060-302 | SANTOS | SP | 72.810.443/0001-59 | OK | NaN | Restaurantes e similares | -23.965837 | -46.345120 |
57396 | PARK & WASH COMERCIO E GARAGEM LTDA - ME | ATIVA | GONZAGA | R MARCILIO DIAS | 18/24 | 11.060-210 | SANTOS | SP | 49.189.905/0001-40 | OK | NaN | Outras atividades de serviços pessoais não esp... | -23.967715 | -46.334064 |
145 rows × 14 columns
Seleciona Colunas
tab = pd.read_csv('data/empresas.xz')
# Exclui coluna pela posição
#tab.drop(tab.columns[[0, 2]], axis=1, inplace=True)
# Exclui coluna pelo Nome
tab = tab.drop(['state', 'longitude'], axis=1)
# Mantem apenas a que vc quer
#tab = tab[['cnpj','latitude']]
tab
name | situation | neighborhood | address | number | zip_code | city | cnpj | status | additional_address_details | main_activity | latitude | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | COMPANHIA DE AGUAS E ESGOTOS DE RORAIMA CAER | ATIVA | SAO PEDRO | R MELVIN JONES | 219 | 69.306-610 | BOA VISTA | 05.939.467/0001-15 | OK | NaN | Captação, tratamento e distribuição de água | 2.827880 |
1 | MG TERMINAIS RODOVIARIOS LTDA. | ATIVA | CENTRO | R ERNESTO ALVES | 1341 | 95.020-360 | CAXIAS DO SUL | 16.571.066/0001-71 | OK | SALA 2 BLOCO 1 SLJ | Terminais rodoviários e ferroviários | -29.163731 |
2 | POSTO ROTA 116 DERIVADOS DE PETROLEO LTDA | ATIVA | PRIMAVERA | R LATERAL A RODOVIA BR 116 | S/N | 93.950-000 | DOIS IRMAOS | 07.069.926/0001-82 | OK | KM 222,6 | Comércio varejista de combustíveis para veícul... | -29.585206 |
3 | POSTO VIA ESTRUTURAL COMERCIO DE DERIVADOS DE ... | ATIVA | GUARA | SIA TRECHO | 01 | 71.200-010 | BRASILIA | 05.246.123/0001-20 | OK | LOTES 30 E 40 | Comércio varejista de combustíveis para veícul... | -15.791097 |
4 | FREDERICO DE CARVALHO ALVES GRAFICA - ME | ATIVA | VILA MURY | AV DO COMERCIO | 225 | 27.211-130 | VOLTA REDONDA | 04.606.157/0001-16 | OK | NaN | Serviços de acabamentos gráficos, exceto encad... | -22.501202 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
57638 | SILVEIRA COMERCIO DE ALIMENTOS LTDA | ATIVA | CAPUAVA | R OURO PRETO | 1117 | 74.450-170 | GOIANIA | 02.575.277/0001-78 | OK | QUADRA: 53; LOTE: 18; | Preparação de documentos e serviços especializ... | -16.655991 |
57639 | LOGINEP - LOGISTICA, SERVICOS E COMERCIO DE PE... | ATIVA | ZONA RURAL | ROD FERNAO DIAS - BR 381 | S/N | 37.264-000 | RIBEIRAO VERMELHO | 03.339.368/0002-58 | OK | KM 674,9 | Comércio varejista de combustíveis para veícul... | -21.188346 |
57640 | INTERNATIONAL MEAL COMPANY ALIMENTACAO S.A. | ATIVA | AEROPORTO INTERNACIONAL | ST AEROPORTO INTERNACIONAL DE BRASILIA PRESIDE... | SN | 71.608-900 | BRASILIA | 17.314.329/0026-88 | OK | PISO DE DESEMBARQUE AREA 22 | Restaurantes e similares | -15.799765 |
57641 | JOSE MARCOS MOREIRA - ME | ATIVA | CENTRO | R GERALDO SANTOS | 107 | 98.130-000 | JULIO DE CASTILHOS | 22.103.490/0001-94 | OK | NaN | Restaurantes e similares | -29.231695 |
57642 | SINDICATO DOS CONDUTORES AUTONOMOS DE TAXI DE ... | ATIVA | SAO JOAO | R AUSTERGILIO ANGELINO | 100 | 88.305-040 | ITAJAI | 72.337.371/0001-74 | OK | NaN | Atividades de organizações sindicais | -26.898554 |
57643 rows × 12 columns
Renomeia Colunas
tab.columns = [x.lower() for x in tab.columns] # Para tudo para Minúsculas
tab.columns = [x.upper() for x in tab.columns] # Para tudo para Maiúscula
tab = tab.rename(columns=lambda x: x.replace('nome', 'zzz')) # Renomear de uma coisa por outra
# Remove espaços em branco de uma determinada coluna
tab['neighborhood'] = tab['neighborhood'].str.strip()
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
~/miniconda/envs/pablocarreira-py36/lib/python3.6/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
2896 try:
-> 2897 return self._engine.get_loc(key)
2898 except KeyError:
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
KeyError: 'neighborhood'
During handling of the above exception, another exception occurred:
KeyError Traceback (most recent call last)
<ipython-input-19-6cc4e27805a5> in <module>
4
5 # Remove espaços em branco de uma determinada coluna
----> 6 tab['neighborhood'] = tab['neighborhood'].str.strip()
~/miniconda/envs/pablocarreira-py36/lib/python3.6/site-packages/pandas/core/frame.py in __getitem__(self, key)
2993 if self.columns.nlevels > 1:
2994 return self._getitem_multilevel(key)
-> 2995 indexer = self.columns.get_loc(key)
2996 if is_integer(indexer):
2997 indexer = [indexer]
~/miniconda/envs/pablocarreira-py36/lib/python3.6/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
2897 return self._engine.get_loc(key)
2898 except KeyError:
-> 2899 return self._engine.get_loc(self._maybe_cast_indexer(key))
2900 indexer = self.get_indexer([key], method=method, tolerance=tolerance)
2901 if indexer.ndim > 1 or indexer.size > 1:
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
KeyError: 'neighborhood'
Cria Colunas
tab['cosunt'] = 'a'
tab
Descritivo da Tabela
tab = pd.read_csv('data/empresas.xz')
tab = tab[tab['state'] == 'SP']
tab = tab[tab['city'] == 'SANTOS']
# Quantos registros tem por coluna
tab.count()
# Tipos das colunas
tab.dtypes
# Início da Tabela
tab.head(3)
# Descrição de parâmetros básicos apenas dos campos numéricos
tab.describe()
GeoPandas
import geopandas as gpd
#https://rsandstroem.github.io/GeoMapsFoliumDemo.html
#https://michelleful.github.io/code-blog/2015/04/29/geopandas-manipulation/
OS
Ainda segue uns comandas básicos para ‘andar’ entre pastas e arquivos.
import os
# Pasta Atual
print(os.getcwd())
# Altera a pasta para um nível acima
os.chdir('/home/michel/Documents/SourceCode/michelmetran.github.io')
os.chdir('/home/michel/Documents/SourceCode/package_pandas')
# dd
print(os.path.expanduser('~'))
# Confere a pasta
print(os.getcwd())
#from importlib import reload
#reload(os)
os.path.dirname('/home/michel/Documents/SourceCode/package_pandas/pandas.ipynb')
Exportando o Juptyter Notebook para outros formatos
O arquivo .ipynb pode ser exportado em formatos diversos. Abaixo carrego uma função que escrevi para facilitar o processo de exportação do arquivo em diferentes locais do PC para, posteriormente, atualizar os repositórios contidos no GitHub.
# %load '~/Documents/SourceCode/codes/files/export_jupyter.py'
def export_jupyter(path, extensions=['html', 'markdown', 'latex', 'pdf', 'python'], today=True):
"""
Export .ipynb file to others formats
:return: File in other formats
"""
# Import Packages
import os
import datetime
# Data
timestamp = datetime.datetime.now()
srt_today = (str(timestamp.year) + '-' +
str(f"{timestamp.month:02d}") + '-' +
str(f"{timestamp.day:02d}"))
# Extensions
for extension in extensions:
if today==True:
os.system('jupyter nbconvert --to {} {} --output {}'.
format(extension, get_jupyternotebook_name(),
os.path.join(path, srt_today+'-'+get_jupyternotebook_name().split('.')[0])))
print('Arquivo {} exportado corretamente para o formato {} usando prefixo da data.'.
format(get_jupyternotebook_name(), extension))
else:
os.system('jupyter nbconvert --to {} {} --output {}'.
format(extension, get_jupyternotebook_name(),
os.path.join(path, get_jupyternotebook_name().split('.')[0])))
print('Arquivo {} exportado corretamente para o formato {} sem usar prefixo da data.'.
format(get_jupyternotebook_name(), extension))
# %load '~/Documents/SourceCode/codes/files/get_jupyternotebook_name.py'
def get_jupyternotebook_name():
"""
Returns the name of the current notebook as a string
From https://mail.scipy.org/pipermail/ipython-dev/2014-June/014096.html
:return: Returns the name of the current notebook as a string
"""
# Import Packages
from IPython.core.display import Javascript
from IPython.display import display
display(Javascript('IPython.notebook.kernel.execute("theNotebook = " + \
"\'"+IPython.notebook.notebook_name+"\'");'))
# Result
return theNotebook
Com as funções para exportar o Jupyter Notebook e para obter o nome do arquivo .ipynb carregadas, basta exportar o arquivo, inicialmente para a pasta docs dentro do projeto e também, visando atualizar os posts do site, para a respectiva pasta.
export_jupyter('docs',['pdf'], False)
export_jupyter('/home/michel/Documents/SourceCode/michelmetran.github.io/_posts', ['markdown'], True)
Atualizando Repositórios
Após as exportações dos arquivos nos formatos necessários, basta atualizar o repositório diretamente pelo Jupyter Notebook. Abaixo é atualizado o repositório desse projeto específico, bem como a derivação desse projeto no site.
%run '~/Documents/SourceCode/codes/git/update_github.py'
git_full('/home/michel/Documents/SourceCode/package_pandas', '.', 'Atualizando')
git_full('/home/michel/Documents/SourceCode/michelmetran.github.io', '.', 'Atualizando')
Requirements
Abaixo é criado o arquivo requirements.txt na raiz do projeto para possibilitar o correto funcionamento do Jupyter Notebook no My Binder. Após a criação do arquivo, sugere-se a edição manual, visando manter apenas os packages realmente essenciais, listados com o comando import no início do script.
#pip freeze > requirements.txt
Deixe um comentário