DataARTIGO

Análise de dados com Python e tabelas dinâmicas com Pandas

Neste artigo, Gonzalo Ayuso mostra como trabalhar com análise de dados usando Python e tabelas dinâmicas com Pandas.

Análise de dados com Python e tabelas dinâmicas com Pandas
Imagem: Gonzalo Ayuso

Um dos primeiros artigos no meu site foi sobre tabelas dinâmicas. Eu criei uma biblioteca para dinamizar tabelas em meus scripts PHPPHP44 conteúdosPadronizando seu código com PHP CS FixerDev (Back & Front) · mai 2019Docker de imagem. Para rodar projetos PHP em menos de 30 segundosDev (Back & Front) · jan 2026PHP 7.3: conheça as novidades desta versãoDev (Back & Front) · abr 2019Ver tudo em Dev (Back & Front) .

A biblioteca não é muito bonita (lança muitos alertas), mas funciona. Atualmente estou brincando com análise de dadosEngenharia de dados43 conteúdosResolvendo desafios de Big Data com Ciência de Dados na UberData · abr 2019Análise de dados com Python e tabelas dinâmicas com PandasData · mai 2019Ferramentas para análise de dados são cada vez mais fundamentais para auxiliar pessoas desenvolvedorasData · jun 2024Ver tudo em Data em Python e usando Pandas.

O objetivo deste artigo é algo que gosto muito: aprender fazendo. Eu quero fazer as mesmas operações que fiz há oito anos no texto, mas agora com Pandas.

Vamos começar!

Começarei com a mesma fonte de dados que usei há quase 10 anos. Um simples conjunto de registros com cliques e número de usuários.

Eu crio um dataframe com estes dados:

import numpy as np
import pandas as pd

data = pd.DataFrame([
    {'host': 1, 'country': 'fr', 'year': 2010, 'month': 1, 'clicks': 123, 'users': 4},
    {'host': 1, 'country': 'fr', 'year': 2010, 'month': 2, 'clicks': 134, 'users': 5},
    {'host': 1, 'country': 'fr', 'year': 2010, 'month': 3, 'clicks': 341, 'users': 2},
    {'host': 1, 'country': 'es', 'year': 2010, 'month': 1, 'clicks': 113, 'users': 4},
    {'host': 1, 'country': 'es', 'year': 2010, 'month': 2, 'clicks': 234, 'users': 5},
    {'host': 1, 'country': 'es', 'year': 2010, 'month': 3, 'clicks': 421, 'users': 2},
    {'host': 1, 'country': 'es', 'year': 2010, 'month': 4, 'clicks': 22, 'users': 3},
    {'host': 2, 'country': 'es', 'year': 2010, 'month': 1, 'clicks': 111, 'users': 2},
    {'host': 2, 'country': 'es', 'year': 2010, 'month': 2, 'clicks': 2, 'users': 4},
    {'host': 3, 'country': 'es', 'year': 2010, 'month': 3, 'clicks': 34, 'users': 2},
    {'host': 3, 'country': 'es', 'year': 2010, 'month': 4, 'clicks': 1, 'users': 1}
])

Agora queremos fazer uma operação dinâmica simples – queremos dinamizar no host.

pd.pivot_table(data,
   index=['host'],
   values=['users', 'clicks'],
   columns=['year', 'month'],
   fill_value=''
  )

Podemos adicionar totais.

pd.pivot_table(data,
               index=['host'],
               values=['users', 'clicks'],
               columns=['year', 'month'],
               fill_value='',
               aggfunc=np.sum,
               margins=True,
               margins_name='Total'

Também podemos dinamizar em mais de uma coluna. Por exemplo: host e country.

pd.pivot_table(data,
               index=['host', 'country'],
               values=['users', 'clicks'],
               columns=['year', 'month'],
               fill_value=''
              )

E também totais.

pd.pivot_table(data,
               index=['host', 'country'],
               values=['users', 'clicks'],
               columns=['year', 'month'],
               aggfunc=np.sum,
               fill_value='',
               margins=True,
               margins_name='Total'
              )

Podemos agrupar por dataframe e calcular subtotais.

bash
data.groupby(['host', 'country'])[('clicks', 'users')].sum()

bash
data.groupby(['

E finalmente podemos misturar totais e subtotais.

out = data.groupby('host').apply(lambda sub: sub.pivot_table(
    index=['host', 'country'],
    values=['users', 'clicks'],
    columns=['year', 'month'],
    aggfunc=np.sum,
    margins=True,
    margins_name='SubTotal',
))
 
out.loc[('', 'Max', '')] = out.max()
out.loc[('', 'Min', '')] = out.min()
out.loc[('', 'Total', '')] = out.sum()
 
out.index = out.index.droplevel(0)
 
out.fillna('', inplace=True)

E isso é tudo. Muito para aprender ainda sobre análise de dados, mas Pandas será definitivamente um bom amigo meu.

Você pode ver o notebook Jupiter na minha conta do GitHub.

***

Gonzalo Ayuso faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela Redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: https://gonzalo123.com/2019/03/11/data-analysis-with-python-pivot-tables-with-pandas/

É um desenvolvedor web com mais de 10 anos de experiência em PHP e Python. Também tem experiência com JavaScript, AngularJs, jQuery, Dojo e node.js. Desde 2002, trabalha no departamento de TI da ArcelorMittal na Espanha.

Ver perfil