Ciência de dados na linha de comando
Turicas aka Álvaro Justen
28 de junho de 2019 - São Paulo/SP
$ whoami
Turicas, prazer! =)
Sigam-me os bons:
## Agenda
- Introdução
- Navegação/manipulação de arquivos e diretórios
- Acesso e filtragem de arquivos
- Integrando comandos
- Análise de Dados
O Brasil em dados libertos
Maior parte do tempo dos projetos de análise de dados:
## Acessibilidade de Dados
### Problemas
- **Formato** (qualidade técnica)
- Exemplo: Boletim de balneabilidade em PDF (INEMA/BA)
- **Dispersão**
- Exemplo: Filiações partidárias em 945 ZIPs com CSVs (TSE)
- **Quantidade** de dados
- Exemplo: 18 milhões de sócios (RFB)
- **Domínio** da área
- Exemplo: o que é unidade eleitoral? (TSE)
## 1.1 Introdução: Terminal
- Terminal: teclado = <3
- ou "linha de comando"
- ou "modo texto"
- ou "tela preta"
- ou "shell"
- É um **interpretador de comandos**
- Existem diversos:
- DOS
- **Bash**
- Zsh
- PowerShell
- ...
- Foco: sistemas UNIX-like (Linux, *BSD, darwin)
- No Windows: [cygwin](https://www.cygwin.com/) ou [gitbash](https://gitforwindows.org/)
## Teclados <3

[bit.ly/como-digitar-melhor](http://bit.ly/como-digitar-melhor)

[hacktoon.com/bin/bash](https://hacktoon.com/bin/bash/)
## 1.2 Introdução: Comandos e opções
- Comandos ("verbos")
- Exemplo: `ls`
- Parâmetros
- Exemplo: `echo "olá, mundo!"`
- Opções
- Exemplo: `ls -l`
- Variáveis: armazenam valores
- ```
mensagem="olá, mundo!"
echo $mensagem
```
- ```
read -p "Qual seu nome? " nome
echo $nome
```
## 2.1 Navegação/manipulação de arquivos e diretórios
- `ls`: list files
- Exemplos: `ls`, `ls /tmp`, `ls ~/Desktop`
- `mkdir`: make directory
- Exemplo: `mkdir nova-pasta`
- Caminhos relativos versus absolutos
- `rmdir`: remove directory (apenas vazios)
- Exemplo: `rmdir nova-pasta`
- `cd`: change directory
- Exemplo: `cd /tmp`
- `cp`: copia arquivos
- Exemplo: `cp data/*.gz .`
- `touch`: cria arquivo em branco
## 2.2 Pedindo ajuda
- `-h`, `--help`
- Exemplo: `ls --help`
- `man comando`
- Exemplo: `man ls`
- Use `/palavra` para buscar
- Use `q` para sair
## Antes de continuar...
- Baixar `contracheque.csv.gz` de [brasil.io/dataset/salarios-magistrados](https://brasil.io/dataset/salarios-magistrados)
- Baixar `nomes.csv.gz` de [brasil.io/dataset/genero-nomes](https://brasil.io/dataset/genero-nomes)
## 3.1 Descompactando arquivos
- `gunzip arquivo.gz`
- `xz -d arquivo.xz`
- `tar xfz arquivo.tar.gz`
- `unzip arquivo.zip`
## 3.2 Acesso e filtragem de arquivos
- `wc`: word counter
- Exemplo: `wc -l contracheque.csv`
- `cat`: concatenate and print files
- Exemplo: `cat contracheque.csv`
- `grep`: filter
- Exemplo: `grep -i "Sergio Fernando Moro" contracheque.csv`
- `cut`: split and cut files
- Exemplo: `cut -d',' -f2,15 contracheque.csv`
- `head`: output the first part of a file
- Exemplo: `head -1 contracheque.csv`
- `tail`: output the last part of a file
- Exemplo: `tail -5 contracheque.csv`
## 3.3. Redirecionar saída
- `comando > arquivo`: cria novo arquivo (sempre)
- Exemplo: `head -1 contracheque.csv > cabecalho.csv`
- `comando >> arquivo.txt`: concatena ao arquivo
- Exemplo: `grep -i "Sergio Fernando Moro" contracheque.csv >> cabecalho.csv`
## 3.4. Uso de recursos
- Filosofia UNIX: um comando faz somente uma tarefa - e o faz bem
- Os comandos trabalham de forma preguiçosa (`lazy`)
- Rodar `grep` num arquivo de 5GB não exige essa quantidade de
memória (diferente do que abrir um arquivo desses no Excel)
## 3.4.2 Exemplo
```
# `arquivo.csv` não cabe em memória!
# Será processado linha a linha.
grep XXX arquivo.csv > resultado.csv
```
## 3.5 Criando scripts
- Crie um arquivo e coloque um comando por linha
- O comando `history` pode te ajudar, listando os comandos que você
digitou recentemente
- Execute o script com:
- `bash nome-do-arquivo.sh`; ou
- Dê permissão de execução (`chmod +x arquivo.sh`) e rode `./arquivo.sh`
## 3.5.2 Navegando no histórico de comandos
- Seta para cima: mostra comandos anteriores
- Facilita muito executar comandos parecidos, alterando apenas
alguns parâmetros
- Ctrl-r: busca no histórico de comandos
- Leia a documentação da [GNU Readline](https://en.wikipedia.org/wiki/GNU_Readline) para outros atalhos
## 3.5.3 Script de Exemplo
### `juizes.sh`
```
#!/bin/bash
echo "Número de linhas do arquivo inicial:"
wc -l contracheque.csv
echo "Criando arquivo com Moro..."
head -1 contracheque.csv > moro.csv
grep --color=no -i "SERGIO FERNANDO MORO" contracheque.csv >> moro.csv
echo "Arquivo criado. Total de linhas: $(wc -l juizes.csv)"
```
## 3.5.4 Script de Exemplo (2)
### `juiz.sh`
```
#!/bin/bash
INPUT="contracheque.csv"
head -1 "$INPUT" # header
grep --color=no -i "$1" "$INPUT"
```
## 4.1. Combinando comandos
- Pipe (barra vertical): `|`
- Thanks, Doug McIlroy <3
- Redireciona saída de um comando (standard output) para a entrada
(standard input) de outro
- Pode ser utilizado quantas vezes quiser
- Pode ser utilizado em conjunto com `>` e `>>`
## 3.2 Acesso e filtragem de arquivos (2)
### `juiz-rendimento.sh`
```
#!/bin/bash
INPUT="contracheque.csv"
head -1 "$INPUT"
grep --color=no -i "$1" "$INPUT" | \
cut -d "," -f 2,15,20,22 | \
sort
```
## 4.2. Repetindo comandos
- `for x in sequence; do commands; done`
- `while condition; do commands; done`
```
cd /home/turicas/projects/balneabilidade-brasil/data/download/BA
for filename in ls *.pdf; do
echo do something with $filename
done
```
## 5. Análise de dados
- Comandos que nem sempre estão instalados por padrão
- Cada um requer uma forma diferente de instalação.
- Em sistemas Debian e Ubuntu: `apt install nome-do-programa`
- Exemplos:
- `aria2c`: baixar arquivos
- `rows`: converter dados tabulares em diversos formatos
- `convert` (imagemagick): recorta, edita e converte imagens
## Solução
```
URL="http://200.152.38.155/CNPJ/DADOS_ABERTOS_CNPJ.zip"
aria2c -s 16 -x 16 $URL
```
Problema: Formato não estruturado
## 5.3. Baixando os palestrantes da ABRAJI
```
wget --quiet -O - "http://congresso.abraji.org.br/Salas/" \
| grep '"label"' \
| sed 's/.*<b>//; s/<\/b>.*//' \
| grep -v 'A confirmar' \
| sort -u \
> palestrantes.txt
```
## 5.2. SQL
- `sqlite3` + `rows csv2sqlite`
- `psql` + `rows pgimport`
```
rows csv2sqlite data/contracheque.csv.gz \
--schemas=data/schema-contracheque.csv data/db.sqlite
rows csv2sqlite data/nomes.csv.gz data/db.sqlite
```
## 5.4. Script para SQLite
### `genero.sh`
```
#!/bin/bash
echo "name,classification"
sort data/palestrantes.txt | \
cut -d " " -f 1 | \
iconv -f utf8 -t ascii//TRANSLIT | \
tr '[:lower:]' '[:upper:]' | \
sort | while read nome; do
echo -e ".mode csv\nSELECT first_name,classification FROM nomes
WHERE first_name = '$nome'" | \
sqlite3 db.sqlite
done
```
```
rows print arquivo.csv
```
## 5.5. Script para SQLite
```
echo "SELECT ..." > consulta.sql
echo -e ".mode csv\n.headers on\n$(cat consulta.sql)" | \
sqlite3 data/db.sqlite | \
gzip - > resultado.csv.gz
```
### `rows query`
```
QUERY="SELECT classification AS gender, COUNT(*) FROM table1 GROUP BY classification"
rows query "$QUERY" genero.csv
```
## Resumão
- Saber digitar é importante
- Atalhos de teclado tornam a vida mais fluida
- Dá pra fazer **muita** coisa
- Existe uma infinidade de comandos