Ciência de dados na linha de comando


Turicas aka Álvaro Justen


CapiConf 2019

10 de maio de 2019 - Curitiba/PR Coração

$ whoami

Turicas, prazer! =)

Sigam-me os bons:

{twitter,
github,
youtube,
slideshare,
instagram}
/turicas

turicas@brasil.io

## Agenda - Introdução - Navegação/manipulação de arquivos e diretórios - Acesso e filtragem de arquivos - Integrando comandos - Análise de Dados

Brasil.IO

O Brasil em dados libertos

Logo Brasil.IO

Data Pipeline


schoolofdata.org/methodology

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/)
![](images/barrabin-barrabash.png) [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 e Bruno..." head -1 contracheque.csv > juizes.csv grep --color=no -i "SERGIO FERNANDO MORO" contracheque.csv >> juizes.csv grep --color=no -i "BRUNO SOUZA SAVINO" contracheque.csv >> juizes.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): `|` - 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

Problema: lentidão ao baixar

Estrelando: Receita Federal


twitter.com/turicas/status/1114185311372873729
## Solução ``` URL="http://200.152.38.155/CNPJ/DADOS_ABERTOS_CNPJ.zip" aria2c -s 16 -x 16 $URL ```

Problema: Formato não estruturado

Estrelando: INEMA/BA

Solução

rows convert arquivo.pdf arquivo.csv Biblioteca rows convertendo PDF para CSV
github.com/turicas/balneabilidade-brasil
## 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 ```
## 6.2. 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 ```
## 6.3. 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 ```
## Conclusão - Dá pra fazer **muita** coisa - Existe uma infinidade de comandos

Contribua com o Brasil.IO!

Blog do Brasil.IO
blog.brasil.io
brasil.io/colabore

Avaliação

QRCode para avaliação da palestra

Dúvidas?

{twitter,
github,
youtube,
slideshare,
instagram}
/turicas

turicas@brasil.io