In [1]:
# Links para as bases de dados do R:
mtcars_link = 'https://raw.githubusercontent.com/vincentarelbundock/Rdatasets/master/csv/datasets/mtcars.csv'
quakes_link = 'https://raw.github.com/vincentarelbundock/Rdatasets/master/csv/datasets/quakes.csv'
cars_link = 'https://raw.github.com/vincentarelbundock/Rdatasets/master/csv/datasets/cars.csv'
In [2]:
import pandas as pd
mtcars = pd.read_csv(mtcars_link)
mtcars.head()
Out[2]:
In [3]:
mtcars.rename(columns = {'Unnamed: 0': 'name'}, inplace = True)
mtcars.head()
Out[3]:
In [4]:
x = mtcars.mpg[mtcars.name.str[:4] == 'Merc'].mean()
x
Out[4]:
In [5]:
mtcars[['mpg', 'wt']].corr()
Out[5]:
In [6]:
%matplotlib inline
import seaborn as sns
import matplotlib.pyplot as plt; plt.style.use('ggplot')
mpg_wt = mtcars[['mpg', 'wt']]
joint = sns.jointplot('wt', 'mpg', data = mpg_wt, kind = 'reg', size = 12)
plt.subplots_adjust(top=0.95)
joint.fig.suptitle('Correlação entre peso do veículo e consumo de combustível', fontsize = 28)
plt.xlabel('peso (1000 lbs) ', fontsize = 22)
plt.ylabel('consumo (Miles/(US) gallon)', fontsize = 22);
Há "forte" correlação linear negativa ou inversa entre peso e quilometragem dos veículos: quanto maior o peso, menor a quilometragem. Provavelmente, o motor "exige" mais combustível de veículos mais pesados do que dos mais leves para locomover-se.
In [7]:
quakes = pd.read_csv(quakes_link)
quakes.head()
Out[7]:
In [8]:
quakes.rename(columns = {'Unnamed: 0': 'id'}, inplace = True)
print('A maior magnitude de um terremoto é', quakes['mag'].max(), 'na escala Richter!')
In [9]:
print('A magnitude média é de', round(quakes['mag'].mean(), 4), 'na escala Richter')
In [10]:
print('O desvio das magnitudes é de', round(quakes['mag'].std(), 4))
In [11]:
cars = pd.read_csv(cars_link)
cars.tail()
Out[11]:
In [12]:
del cars['Unnamed: 0']
cars['speed'].max()
Out[12]:
In [13]:
joint = sns.jointplot('speed', 'dist', data = cars, kind = 'reg', size = 12)
plt.subplots_adjust(top=0.95)
joint.fig.suptitle('Correlação entre a velocidade e a distância de frenagem', fontsize = 28)
plt.xlabel('velocidade (mph)', fontsize = 22)
plt.ylabel('distância (ft)', fontsize = 22);
In [14]:
speed = cars['speed'].reshape(50, 1)
dist = cars['dist'].reshape(50, 1)
In [15]:
from sklearn import linear_model
reg = linear_model.LinearRegression()
reg.fit(X = speed, y = dist)
reg.coef_
Out[15]:
In [16]:
print('A distância de frenagem é de', reg.predict(90), 'ft caso o carro esteja a 90 mph')
In [17]:
import sqlite3
conn = sqlite3.connect('example.db')
In [18]:
c = conn.cursor()
# Create table
c.execute('''CREATE TABLE users
(id int, name text)''')
c.execute('''CREATE TABLE tasks
(id int, event text, id_resp int)''')
# Insert a row of data
c.execute('''INSERT INTO users VALUES
(1, 'Igor Sanchez'),
(2, 'Joao Junior'),
(3, 'Rodrigo Pinto'),
(4, 'Amandio Pereira'),
(5, 'Karoline Leal')''')
# Insert a row of data
c.execute('''INSERT INTO tasks VALUES
(1, 'send report', 3),
(2, 'drink coffee', 2),
(3, 'travel CWB', 3),
(4, 'call mkt', 6)''')
# Save (commit) the changes
conn.commit()
In [19]:
for row in c.execute("SELECT * from users"):
print(row)
In [20]:
for row in c.execute("SELECT * from tasks"):
print(row)
Qual o resultado da query abaixo?
SELECT * FROM users LEFT JOIN tasks ON users.id = tasks.id_resp;
In [21]:
for row in c.execute('''SELECT * FROM users
LEFT JOIN tasks
ON users.id = tasks.id_resp'''):
print(row)
A query retorna todos os valores da tabela da esquerda (users), os registros pareados na tabela da direita (tasks). O resultado é NULL (NA em R, None em Python) na tabela da direita nas linhas não pareadas.
• Left Join: A query retorna todos os valores da tabela da esquerda, os registros pareados na tabela da direita. O resultado é NULL (NA em R, None em Python) na tabela da direita nas linhas não pareadas.
• Right Join: A query retorna todos os valores da tabela da direita, os registros pareados na tabela da esquerda. O resultado é NULL (NA em R, None em Python) na tabela da esquerda nas linhas não pareadas.
• Inner Join: A query retorna apenas registros em que houve pareamento de valores em ambas as tabelas.
• Full Join: A query retorna todos os registros em que houve pareamento ou na tabela da esquerda ou na tabela da direita. Ou seja, retorna todos os valores de ambas as tabelas.
A chave primária identifica de forma exclusiva cada registro de uma tabela.
A chave primária deve conter apenas valores únicos, e não pode conter valores NULL (NA em R, None em Python).
Uma tabela pode conter apenas uma chave primária, que pode consistir de uma ou múltiplos campos (colunas).
As funções de agregação de dados utilizadas com GROUP BY nessa amostra são SUM() e COUNT().
In [22]:
# Create table
c.execute('''CREATE TABLE firmas
(id int, periodo int, estado text, origem text, qtd_users int)''')
# Insert a row of data
c.execute('''INSERT INTO firmas VALUES
(3, 201705, 'PR', 'MGservico', 80),
(1, 201705, 'PR', 'MGservico', 100),
(2, 201705, 'PR', 'MGservico', 110),
(4, 201705, 'RS', 'MGcomercio', 50),
(5, 201706, 'RS', 'MGcomercio', 200),
(6, 201706, 'SP', 'Abertura', 250),
(7, 201706, 'SP', 'Abertura', 400),
(8, 201706, 'SP', 'Abertura', 310)''')
# Save (commit) the changes
conn.commit()
In [23]:
for row in c.execute("SELECT * from firmas"):
print(row)
a. Escreva a clausula WHERE que retorne as quantidades do período 201705 para o estado do PR quando as quantidades forem superiores a 80.
In [24]:
for row in c.execute('''SELECT * FROM firmas
WHERE periodo = 201705 AND estado = "PR" AND qtd_users > 80 '''):
print(row)
b. Quais id linhas serão retornadas?
As linhas id cujo valor são 1 e 2.
In [25]:
c = conn.cursor()
c.execute("DROP TABLE users")
c.execute("DROP TABLE tasks")
# Create table
c.execute('''CREATE TABLE users
(id int, name text, status text)''')
c.execute('''CREATE TABLE tasks
(id int, event text, id_resp int, status text)''')
# Insert a row of data
c.execute('''INSERT INTO users VALUES
(1, 'Igor Sanchez', 'ativo'),
(2, 'Joao Junior', 'ativo'),
(3, 'Rodrigo Pinto', 'inativo'),
(4, 'Amandio Pereira', 'inativo'),
(5, 'Karoline Leal', 'ativo')''')
# Insert a row of data
c.execute('''INSERT INTO tasks VALUES
(1, 'send report', 3, 'null'),
(2, 'drink coffee', 2, 'undone'),
(3, 'travel CWB', 3, 'null'),
(4, 'call mkt', 6, 'done'),
(5, 'feed the badger', 2, 'undone'),
(4, 'buy a badger', 6, 'done')''')
# Save (commit) the changes
conn.commit()
In [26]:
for row in c.execute("SELECT * from users"):
print(row)
In [27]:
for row in c.execute("SELECT * FROM tasks"):
print(row)
a. Faça uma query contendo o resultado das duas tabelas juntas, renomenando o campo status da tabela users para funcionario_ativo.
A query seria:
In [28]:
for row in c.execute('''SELECT *, users.status AS funcionario_ativo FROM users
FULL OUTER JOIN tasks ON users.id = tasks.id_resp'''):
print(row)
Entretanto, SQLite não suporta RIGHT e FULL OUTER JOIN. Portanto, eu tive que "emular" o comando FULL OUTER JOIN usando as cláusulas UNION e LEFT JOIN.
Fonte: http://www.sqlitetutorial.net/sqlite-full-outer-join/
In [29]:
for row in c.execute('''SELECT u.id, u.name, u.status AS funcionário_ativo, t.id, t.event, t.id_resp, t.status
FROM users u
LEFT JOIN tasks t ON u.id = t.id_resp
UNION ALL
SELECT u.id, u.name, u.status, t.id, t.event, t.id_resp, t.status
FROM tasks t
LEFT JOIN users u ON u.id = t.id_resp
WHERE u.status IS NULL'''):
print(row)
b. Faça outra query que traga os eventos com o nome do responsável. O resultado não deve trazer os campos de status de ambas tabelas, porém deve trazer um novo campo de status_do_evento que deve construindo da seguinte forma:
• se o status do funcionário for ativo e o status do evento for done, marcar como sucesso
• se o status do funcionário for ativo e o status do evento for undone, marcar como falha
• se o status do funcionário for inativo e o status do evento for nulo, marcar como reatribuir
In [30]:
for row in c.execute('''SELECT users.name, tasks.event, CASE
WHEN users.status = "ativo" AND tasks.status = "done" THEN "sucesso"
WHEN users.status = "ativo" AND tasks.status = "undone" THEN "falha"
WHEN users.status = "inativo" AND tasks.status = "null" then "reatribuir"
END AS status_do_evento FROM tasks
LEFT JOIN users
ON users.id = tasks.id_resp'''):
print(row)
In [31]:
# We can also close the connection if we are done with it.
# Just be sure any changes have been committed or they will be lost.
conn.close()