import pandas as pd
import numpy as np
import pickle
# Criando um objeto Series do Pandas
idades = [15, 24, 88, 75, 34, 23]
serie_idades = pd.Series(idades)
serie_idades
# Criando um objeto Series do Pandas utilizando 2 listas
pessoas = ['Eni', 'Bia', 'Flávio', 'Carlos', 'Dedé', 'Abigail']
serie_idades_pessoas = pd.Series(idades, pessoas)
serie_idades_pessoas
# Recuperando itens
print(serie_idades[1])
print(serie_idades_pessoas[2])
print(serie_idades_pessoas['Flávio'])
# Criando uma série a partir de uma Tupla
estados = ("Mnas Gerais", "Amazonas", "Maranhão", "Goiás", "Santa Catarina")
siglas = ("MG", "AM", "MA", "GO", "SC")
serie_estados = pd.Series(estados, siglas)
serie_estados
# Alterando os dados de uma série. Ex: Minas Gerais (estava como Mnas Gerais)
serie_estados["MG"] = "Minas Gerais"
serie_estados
# Criando séries a partir de Arrays NumPy
precos = np.array([25, 22, 18.5, 4.75, 3, 4.5, 2.3])
lanches = np.array(['X-tudo', 'X-Bacon', 'Bauru', 'Misto-quente', 'Pão-de-queijo', 'Coxinha', 'Pastel'])
series_lanches_precos = pd.Series(precos, lanches)
series_lanches_precos
# Criando séries a partir de dicionários
dic_estados = {"MG": "Minas Gerais", "CE": "Ceará", "MT": "Mato Grosso", "RR": "Roraima"}
series_estados_1 = pd.Series(dic_estados)
series_estados_1
dic_estados_2 = {"MG": {"Estado":"Minas Gerais", "Capital":"Belo Horizonte", "População (2014)":20777672},
"CE": {"Estado":"Ceará", "Capital":"Fortaleza", "População (2014)":8867448},
"MT": {"Estado":"Mato Grosso", "Capital":"Cuiabá", "População (2014)":3236578},
"RR": {"Estado":"Roraima", "Capital":"Boa Vista", "População (2014)":500826},}
series_estados_2 = pd.Series(dic_estados_2)
series_estados_2
print(series_estados_2["MG"])
print(series_estados_2["MG"]["Estado"])
print(series_estados_2["MG"]["Capital"])
# Criando Series a partir de arquivos CSV
idades = pd.read_csv('dados/idades.csv')
idades.head()
type(idades)
# Recuperando os dados (pois está no formato DataFrame)
idades["Idades"][3]
# O parâmetro squeeze (default False) irá retorna um formato Series caso os dados do CSV possuam apenas uma coluna
idades = pd.read_csv('dados/idades.csv', squeeze = True)
idades.head()
type(idades)
idades[4]
# Lendo o arquivo idades2.csv, que agora possuem 2 colunas
idades_2 = pd.read_csv('dados/idades2.csv', squeeze = True)
idades_2
# Para termos um objeto Series, teremos que definir um das colunas para o índice
idades_2 = pd.read_csv('dados/idades2.csv', squeeze = True, index_col = 0)
idades_2
type(idades_2)
# Lendo de um arquivo XLSX (Excel) sem informar qual a planilha aberta. Por padrão, sempre abre a primeira planilha
idades_xlsx = pd.read_excel('dados/idades2.xlsx', squeeze = True)
idades_xlsx
type(idades_xlsx)
# Criando uma Series informando a Planilha (no caso, queremos a segunda)
idades_xslx_2 = pd.read_excel('dados/idades2.xlsx', squeeze = True, sheet_name = "Planilha2")
idades_xslx_2
type(idades_xslx_2)
# Vamos recriar a planilha acima, porém, indicando a coluna de índice para criar um objeto Series ao invés de DataFrame
idades_xslx_2 = pd.read_excel('dados/idades2.xlsx', squeeze = True, sheet_name = "Planilha2", index_col = 0)
idades_xslx_2
type(idades_xslx_2)
# Atributos do objeto Series
idades_xslx_2.dtype
idades_xslx_2.name
idades_xslx_2.nbytes
idades_xslx_2.index
idades_xslx_2.ndim
idades_xslx_2.size
idades_xslx_2.shape
idades_xslx_2.values
series_lanches_precos
# Método at[] para localizar itens pelo rótulo
series_lanches_precos.at["X-tudo"]
# Método iat[] para retornar itens pelo índice
series_lanches_precos.iat[0]
# É possível também alterar o valor usando at e iat
series_lanches_precos.at["X-tudo"] = 27
series_lanches_precos.iat[1] = 35
series_lanches_precos
# Método get() também retorna valor, mas não altera dados
series_lanches_precos.get(0)
# O método loc irá permitir o acesso a mais de um rótulo
series_lanches_precos.loc[["X-tudo", "Pastel"]]
# O método iloc irá permitir o acesso a mais de um índice
series_lanches_precos.iloc[[0, 2, 4]]
# O método keys() nos retornará as chaves ou rótulos
series_lanches_precos.keys()
a = pd.Series([4, 8, 2, 5, 7])
b = pd.Series([1, 2, 3, 4, 5])
c = a.add(b)
c
a2 = a.add(5)
a2
a3 = a.sub(4)
a3
a4 = a.div(3)
a4
a.mean()
a.sum()
a.std()
a.describe()
a.max()
a.min()
# Utilizando o método round() para arredondar os valores
a = pd.Series(np.random.randint(0, 100, 10)).pow(1/2)
a
a = a.round(2)
a
a = a.round(0)
a
b.lt(a)
a.gt(b)
b.le(a)
a.ge(b)
b.ne(a)
a.eq(b)
# Métodos sum, abs e product
a.sum()
a.product()
# Método abs() para números absolutos, vamos criar um Series com números positivos e negativos
a = pd.Series(np.arange(-6, 6, 2))
a
# O resultado são todos os números absolutos
a.abs()
# Calculando o quartil, os N maiores ou N melhores
a.quantile(.25)
a.quantile(.5)
a.quantile(.75)
a.nsmallest(3)
a.nlargest(3)
a.unique()
a.nunique()
np.sort(a.unique())
# O método count() sempre contará a qunatidade de elementos não nulos
a.count()
b = pd.Series([2, 5, np.nan, 0, 3, None, 6])
b
b.count()
series_estados_2
# Utilizando o shallow copy()
copia = series_estados_2.copy()
copia
# Verificando que, mesmo com shallow copy(), a alteração irá refletir em ambas as Séries, pois a shallow copy
# é uma cópia superficial, apenas a referência da memória do objeto
copia["MT"]["Capital"] = "São Paulo"
print(series_estados_2["MT"]["Capital"])
print(copia["MT"]["Capital"])
# Realizando uma deep copy, ou seja, uma cópia profunda dos dados da Series utilizando a biblioteca Pickle
# Voltando os dados ao estado original
series_estados_2["MT"]["Capital"] = "Cuiabá"
copia["MT"]["Capital"] = "Cuiabá"
# Criando a cópia da Series usando o Pickle
copia_profunda = pickle.loads(pickle.dumps(series_estados_2))
copia_profunda
# Agora, ao alterar a Series copia, a series_estados_2 continuará em seu estado original
copia_profunda["MT"]["Capital"] = "São Paulo"
print(series_estados_2["MT"]["Capital"])
print(copia_profunda["MT"]["Capital"])
# Concatenação de Series com append()
a
b
# Os índices são relacionados a cada série concatenada
ab = a.append(b)
ab
# Realizando uma concatenação, porém, ignorando os índices das séries a e b, ou seja, será de 0 até o máximo
ab = a.append(b, ignore_index = True)
ab
# Substituindo dados com replace
c = ab.replace(0, 1)
c
# Utilizando o método update() para atualizar os dados de uma Series
d = pd.Series([4, 10, 11, 12], index=[9, 7, 10, 4])
d
# Os dados dos índices 9, 7, 10 e 4 foram substituídos pelos dados da Series d
c.update(d)
c
# Head, tail e sample
c.head(4)
c.tail(3)
c.sample()
c.sample(4)
c = (a.append(b, ignore_index = True)).replace(np.nan, -1)
c
# Criando listas usando o where. Sempre troca o valor quando a condição é falsa
d = c.where(c > 3, 10) # Se c > 3, então mantém, senão, o valor será substituído por 10
e = c.where(c <= 3, 0) # Se c <= 3, mantém, senão, será 0
d
e
# O método mask() substitui os valores quando satisfaz-se a condição (contrário do where)
d = c.mask(c > 3, 10) # Se c > 3, então o valor será substituído por 10, senão, mantém
e = c.mask(c <= 3, 0) # Se c <= 3, será 0, senão, mantém
d
e
dados = pd.Series([2, 5, np.nan, 0, 3, None, 6])
dados
# O método isna() apenas retorna uma lista com resultados booleanos dos valores ausentes
dados.isna()
# O método notna() retornará uma lista com resultados booleanso dos valores não ausentes
dados.notna()
# O método dropna() irá retornar uma lista com os valores nulos ou ausentes
dados_sem_ausentes = dados.dropna()
dados_sem_ausentes
# Ao informar o parâmetro inplace, será feita a remoção na própria Series
dados.dropna(inplace = True)
dados
# O método fillna() irá retornar uma lista com valores nulos preenchidos por outros valores
dados = pd.Series([2, 5, np.nan, 0, 3, None, 6])
dados_ausentes_preenchidos = dados.fillna(1)
dados_ausentes_preenchidos
# Parâmetros bfill (preenche com o valor posterior ao NaN), ffill (preenche com o valor anterior ao NaN) e inplace
dados_bfill = dados.fillna(method = "bfill")
dados_ffill = dados.fillna(method = "ffill")
dados.fillna(-1, inplace = True)
dados_bfill
dados_ffill
dados
idades_2
# Realizando uma ordenação pelos valores, no caso, a idade
idades_ordenadas_valores = idades_2.sort_values()
idades_ordenadas_valores.head(15)
# Realizando a ordenação pelo índice
idades_ordenadas_rotulos = idades_2.sort_index()
idades_ordenadas_rotulos.head(15)
livros = pd.Series(["Introdução à programação com Python",
"Curso Intensivo de Python",
"Python para análise de dados"])
livros
# Utilizando letras minúsculas com lower()
livros.str.lower()
# Utilizando letras maiúsculas com upper()
livros.str.upper()
# Utilizando letras capitalização
minusculas = livros.str.lower()
minusculas.str.capitalize()
# Definindo Strings como títulos
minusculas.str.title()
# Gerando uma série de 38 notas aleatórias entre 0 e 100
np.random.seed(50)
notas = pd.Series(np.random.randint(0, 101, 38))
notas.head()
notas.describe()
# Plotando um gráfico de histograma
%matplotlib inline
notas.plot.hist()
# Ao informar o valor bins por parâmetro, irá gerar o histograma com 101 barras para realizar a comparação
notas.plot.hist(bins = 101)
np.sort(notas)
# Gerando um gráfioc de barras
notas.plot.bar()
# Gerando um gráfioc de área
notas.plot.area()
# Gerando um gráfioc de boxplot
notas.plot.box()
# Gerando um gráfioc de linhas
notas.plot.line()
# É possível gerar o histograma sem a necessidade do plot
notas.hist()