Pandas

8 minuto(s) de leitura

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 Binder.


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