Visualização de Dados e Análise de Séries Temporais com Python

A visualização de dados é uma tarefa fundamental na ciência de dados, permitindo a interpretação visual de informações, a detecção de anomalias e a tomada de decisões. Bibliotecas como matplotlib, seaborn e bokeh são amplamente utilizadas. Este guia foca na matplotlib, explorendo sua API, tipos de gráficos e integração com pandas para análise de séries temporais e interação com bancos de dados.

Iniciando com o Matplotlib

A forma mais direta de criar gráficos com matplotlib é através de sua interface de estilo MATLAB. Primeiro, importe as bibliotecas necessárias:

import matplotlib.pyplot as plt
import numpy as np

# Gerando dados de exemplo
x_vals = np.linspace(0, 3, 6)
y_vals = x_vals ** 2

# Criando o gráfico
plt.figure()
plt.plot(x_vals, y_vals, 'r-')
plt.xlabel('Eixo X')
plt.ylabel('Eixo Y')
plt.title('Gráfico Básico com Matplotlib')
plt.show()

Customizando Linhas e Eixos

As propriedades das linhas, como cor e estilo, podem ser ajustadas diretamente na função plot ou posteriormente com métodos set_* e plt.setp(). O intervalo dos eixos é definido automaticamente, mas pode ser alterado com plt.axis().

# Plotando múltiplas séries com estilos variados
plt.plot(x_vals * 2, 'g^', label='2x')
plt.plot(x_vals * 3, 'rs', label='3x')
plt.plot(x_vals ** 2, 'b-', label='x²')
plt.axis([0, 6, 0, 35])
plt.legend()
plt.show()

# Configurando propriedades de uma linha
line = plt.plot(y_vals, color='red', linewidth=2.0)
plt.setp(line, linestyle='--', marker='o')
plt.show()

Gerenciando Figuras e Subplots

Para organizar múltiplos gráficos, utilize figure() e subplot(). O código subplot(221) especifica uma grade 2x2 e seleciona o primeiro quadrante.

plt.figure('Principal')
plt.subplot(221)
plt.plot(y_vals + 5, 'r--')
plt.subplot(222)
plt.plot(y_vals * 3, 'ko')
plt.subplot(223)
plt.plot(y_vals ** 2, 'b^')
plt.subplot(224)
plt.plot(np.sin(x_vals), 'm-.')
plt.show()

Tipos Comuns de Gráficos

Gráfico de Dispersão (Scatter)

Útil para visualizar a correlação entre duas variáveis numéricas.

x_scatter = np.random.normal(0, 1, 1000)
y_scatter = np.random.normal(0, 1, 1000)
colors = np.random.rand(1000)

plt.scatter(x_scatter, y_scatter, c=colors, alpha=0.5, cmap='viridis')
plt.colorbar()
plt.title('Gráfico de Dispersão')
plt.show()

Gráfico de Barras

Representa dados categóricos com retângulos proporcionais aos valores.

categorias = ['A', 'B', 'C', 'D', 'E']
valores = np.random.randint(10, 50, size=5)

plt.bar(categorias, valores, color='skyblue', edgecolor='black')
plt.title('Gráfico de Barras Vertical')
plt.show()

Histograma

Mostra a distribuição de frequência de um conjunto de dados numéricos.

dados_dist = np.random.randn(1000)
plt.hist(dados_dist, bins=30, density=True, alpha=0.7, color='gold', edgecolor='black')
plt.title('Histograma de Distribuição Normal')
plt.show()

Análise de Séries Temporais com Pandas

O pandas oferece estruturas podeorsas para manipulação de dados indexados por tempo.

Criando Índices Temporais

Utilize pd.to_datetime() para converter strings e pd.date_range() para gerar sequências.

import pandas as pd

# Convertendo uma string para Timestamp
ts = pd.to_datetime("15/10/2023", dayfirst=True)

# Gerando um índice de frequência diária para 10 dias
idx = pd.date_range(start="2023-01-01", periods=10, freq='D')
serie_temporal = pd.Series(np.random.randn(10), index=idx)
print(serie_temporal.head())

Resampling (Reamostragem)

Reduz (downsample) ou aumenta (upsample) a frequência dos dados, aplicando funções de agregação.

# Gerando dados horários
horas = pd.date_range('2023-07-01 00:00', periods=48, freq='H')
ts_horaria = pd.Series(np.random.randint(50, 200, 48), index=horas)

# Agregando para dados diários (soma e média)
ts_diaria_soma = ts_horaria.resample('D').sum()
ts_diaria_media = ts_horaria.resample('D').mean()
print("Soma diária:\n", ts_diaria_soma)
print("\nMédia diária:\n", ts_diaria_media)

Tratamento de Fuso Horário

Os objetos de tempo do pandas podem ser cientes ou não do fuso horário. Use tz_localize e tz_convert para gerenciá-los.

# Série sem fuso horário
ts_naive = pd.Timestamp('2023-06-15 10:30')

# Localizando no fuso horário de São Paulo
ts_sp = ts_naive.tz_localize('America/Sao_Paulo')

# Convertendo para o fuso horário de Nova York
ts_ny = ts_sp.tz_convert('America/New_York')
print(f"São Paulo: {ts_sp}, Nova York: {ts_ny}")

Interação com Bancos de Dados

Arquivos de Texto (CSV)

Use pd.read_csv() e df.to_csv() para ler e escrever dados em formato delimitado.

# Lendo um arquivo CSV com cabeçalho personalizado
df = pd.read_csv('dados_exemplo.csv', sep=';', index_col='ID')

# Salvando um DataFrame, excluindo o índice
df.to_csv('saida.csv', index=False)

MongoDB (Banco de Dados Documental)

O MongoDB armazena dados como documentos JSON. A biblioteca pymongo fornece a interface Python.

from pymongo import MongoClient

# Conectando ao servidor MongoDB local
client = MongoClient('mongodb://localhost:27017/')
db = client['banco_teste']
colecao = db['pessoas']

# Inserindo um documento
documento = {"nome": "Ana", "idade": 28, "cidade": "Lisboa"}
resultado = colecao.insert_one(documento)
print(f"Documento inserido com ID: {resultado.inserted_id}")

# Consultando documentos
for doc in colecao.find({"cidade": "Lisboa"}):
    print(doc)

Redis (Armazenamento em Memória)

O Redis é um armazenamento chave-valor rápido. A biblioteca redis permite a interação.

import redis

r = redis.Redis(host='localhost', port=6379, db=0)

# Armazenando uma string simples
r.set('visitas:1001', '1542')
valor = r.get('visitas:1001')

# Trabalhando com uma lista
r.rpush('lista_tarefas', 'Comprar leite', 'Estudar Python')
tarefas = r.lrange('lista_tarefas', 0, -1)
print(tarefas)

Exemplo Prático: Limpeza e Transformação de Dados

Dados reais frequentemente necesitam de limpeza antes da análise.

# Dados com problemas comuns
dados_sujos = pd.read_csv('vendas.csv')

# 1. Tratando valores ausentes (NaN)
# Preencher com a média da coluna
dados_sujos['preco'].fillna(dados_sujos['preco'].mean(), inplace=True)

# 2. Convertendo tipos de dados
# Removendo caracteres não numéricos e convertendo
dados_sujos['quantidade'] = dados_sujos['quantidade'].astype(str).str.replace('[^0-9.]', '', regex=True).astype(float)

# 3. Filtrando outliers
media = dados_sujos['preco'].mean()
desvio = dados_sujos['preco'].std()
dados_limpos = dados_sujos[(dados_sujos['preco'] >= media - 2.5*desvio) & (dados_sujos['preco'] <= media + 2.5*desvio)]

# 4. Agrupando e agregando
vendas_por_produto = dados_limpos.groupby('produto')['quantidade'].sum()
print(vendas_por_produto.sort_values(ascending=False))

Tags: matplotlib pandas seaborn bokeh mongodb

Publicado em 6-4 22:53 por Thomas