import pandas as pd
import numpy as np
%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
from wordcloud import WordCloud, STOPWORDS
import folium
from folium import FeatureGroup, Map, Marker
from folium import vector_layers.CircleMarker
plt.figure(figsize=(15, 5),facecolor = 'red', dpi = 100)
# Criando um gráfico de histograma utilizando a camada de Artista da Matplotlib
# Na camada de artista, define-se o Canvas que será gerado e várias de suas configurações
fig = Figure()
canvas = FigureCanvas(fig)
x = np.random.randn(10000)
ax = fig.add_subplot(111)
ax.hist(x, 100)
ax.set_title("Distribuição Normal com $\mu=0, \sigma=1$ - Artist Layer")
fig.savefig("imagens/modulo_1/Teste Histograma - Artist Layer.png")
# Criando um gráfico de histograma utilizando a camada de Script da Matplotlib
plt.hist(x, 100)
plt.title("Distribuição Normal com $\mu=0, \sigma=1$ - Script Layer (pyplot)")
plt.savefig("imagens/modulo_1/Teste Histograma - Script Layer.png")
plt.gcf().set_size_inches(16, 8)
plt.show()
# Realizando uma plotagem com o built-in da Matplotlib do Pandas
# Criando um DataFrame de exemplo
df = pd.DataFrame({
"india": [8880, 8670, 8147, 7338, 5704],
"china": [5123, 6682, 3308, 1863, 1527]
})
df.head()
df.plot(kind = "line")
plt.gcf().set_size_inches(16, 8)
plt.show()
df["india"].plot(kind = "hist")
plt.gcf().set_size_inches(16, 8)
plt.show()
df = pd.read_excel(
"dados/Canada.xlsx",
sheet_name = "Canada by Citizenship",
skiprows = range(20),
skipfooter = 2
)
df.head()
# Remove colunas não utilizadas e renomeia outras
df.drop(['AREA','REG','DEV','Type','Coverage'], axis = 1, inplace = True)
df.rename(columns = {
'OdName': 'Country',
'AreaName': 'Continent',
'RegName': 'Region'},
inplace = True)
# Seta a coluna Country como o Ãndice do DataFrame
df["Total"] = df.sum(axis = 1)
df.set_index('Country', inplace = True)
years = list(map(int, range(1980, 2014)))
# Aqui estamos pesquisando pelo Ãndice Haiti, que é um Ãndice do DataFrame, e recuperando todas as colunas de 1980 a 2013
# para plotar um gráfico de linhas
df.loc["Haiti", years].plot(kind = "line")
plt.title("Imigrantes do Haiti")
plt.xlabel("Anos")
plt.ylabel("Quantidade de Imigrantes")
plt.gcf().set_size_inches(16, 8)
plt.show()
# Ordenando o valor pela coluna Total em ordem decrescente
df.sort_values(["Total"], ascending = False, axis = 0, inplace = True)
# Para realizar análise com os anos, precisaremos que as colunas de anos sejam Ãndices
# Para isso, utilizaremos o método transpose para transpor as colunas de anos em uma apenas, representando
# seus valores em linhas
df_transposto = df[years].head().transpose()
df_transposto = df_transposto.head()
# Agora que temos os 5 anos com os 5 paÃses com mais imigrações, vamos plotar um gráfico de área
df_transposto.plot(kind = "area")
plt.title("Top 5 - PaÃses com maiores imigrações para o Canadá entre 1980 e 1984")
plt.xlabel("Anos")
plt.ylabel("Quantidade de Imigrantes")
plt.gcf().set_size_inches(16, 8)
plt.show()
# Criando um gráfico de Histograma dos dados de 2013 relacionados aos imigrantes
df[2013].plot(kind = "hist")
plt.title("Distribuição do número de imigrantes de 195 paÃses no ano de 2013")
plt.xlabel("Número de imigrantes")
plt.ylabel("Número de paÃses")
plt.gcf().set_size_inches(16, 8)
plt.show()
# É possÃvel verificar que o gráfico está difÃcil de possuir uma legibilidade
# Para tratar este problema e melhorar a legibilidade, iremos utilizar o NumPy
count, bin_edges = np.histogram(df[2013])
df[2013].plot(kind = "hist", xticks = bin_edges)
plt.title("Distribuição do número de imigrantes de 195 paÃses no ano de 2013")
plt.xlabel("Número de imigrantes")
plt.ylabel("Número de paÃses")
plt.gcf().set_size_inches(16, 8)
plt.show()
# Criando um gráfico de barras com MatplotLib para verificar a quantidade de imigrantes de
# Iceland para o Canadá entre 1980 e 2013
count, bin_edges = np.histogram(df[2013])
bar_chart = df.loc["Iceland", years]
bar_chart.plot(kind = "bar")
plt.title("Comparação da quantidade de imigrantes de Iceland para o Canadá entre 1980 e 2013")
plt.xlabel("Anos")
plt.ylabel("Número de imigrantes")
plt.gcf().set_size_inches(16, 8)
plt.show()
# Criando um gráfico de barras com a biblioteca MatplotLib
bar_data = df.groupby("Continent", axis = 0).sum()
bar_data["Total"].plot(kind = "pie")
plt.title("Comparação da quantidade de imigrantes por continentes")
plt.xlabel("Continentes")
plt.ylabel("Número de imigrantes")
plt.gcf().set_size_inches(16, 8)
plt.show()
# Criando um gráfico de BoxPlot com a biblioteca MatplotLib
blox_plot_japao = df.loc[["Japan"], years].transpose()
blox_plot_japao.plot(kind = "box")
plt.title("BoxPlot de número de imigrações do Japão para o Canadá entre 1980 e 2013")
plt.ylabel("Número de imigrantes")
plt.gcf().set_size_inches(16, 8)
plt.show()
# Criando um gráfico de Dispersão com a biblioteca MatplotLib
# Primeiramente, será necessário remodelar o DataFrame, fazendo com que tenhamos apenas a coluna dos anos e seus totais
df_scatter = pd.DataFrame(df[years].sum(axis = 0))
df_scatter.index = map(int, df_scatter.index)
df_scatter.reset_index(inplace = True)
df_scatter.columns = ['year', 'total']
df_scatter.plot(kind = "scatter", x = "year", y = "total")
plt.title("Dispersão da quantidade de imigrantes pro Canadá de 1980 a 2013")
plt.xlabel("Anos")
plt.xlabel("Número de imigrantes")
plt.gcf().set_size_inches(16, 8)
plt.show()
# Criando um gráfico de regressão comparando o total de imigrantes de cada um dos anos utilizando a biblioteca Seaborn
df_regression = df_scatter
sns.regplot(x = "year", y = "total", data = df_regression, color = "red", marker = "x")
plt.title("Regressão da quantidade total de imigrantes por todos os anos de 1980 a 2013")
plt.xlabel("Anos")
plt.ylabel("Total de Imigrantes")
plt.gcf().set_size_inches(16, 8)
plt.show()
# Criando um gráfico de Word Clouds a partir do arquivo alice_novel.txt
# Primeiramente, faremos a leitura do arquivo
file = 'dados/alice_novel.txt'
alice_novel = open(file, 'r').read()
# Agora, iremos instanciar um objeto do tipo Word Cloud para o texto e gerar com a função generate informando
# o arquivo texto em formato .txt que foi lido anteriormente
stopwords = set(STOPWORDS)
alice_wc = WordCloud(background_color = "white", max_words = 2000, stopwords = stopwords)
alice_wc.generate(alice_novel)
# Iremos utilizar a MatplotLib para gerar a imagem que foi gerada pelo Word Cloud
plt.imshow(alice_wc, interpolation = "bilinear")
plt.axis("off")
plt.gcf().set_size_inches(10, 8)
plt.show()
# Vamos remover a palavra "said" inserindo ela no objeto stopwords para que possamos ver as outras com menores frequência
stopwords.add('said')
alice_wc.generate(alice_novel)
plt.imshow(alice_wc, interpolation = "bilinear")
plt.axis("off")
plt.gcf().set_size_inches(10, 8)
plt.show()
# Teste inicial com a biblioteca Folium, gerando um mapa mundial simples
world_map = folium.Map(
location = [56.130, -106.35],
zoom_start = 4
)
world_map
# Agora, iremos utilizar os objetos FeatureGroup, CircleMarker e Marker para criar
# um marcador para o estado de Ontario no Canadá
canada_map = folium.Map(
location = [56.130, -106.35],
zoom_start = 4
)
ontario = folium.map.FeatureGroup()
child = folium.vector_layers.CircleMarker(
[51.25, -85.320],
radius = 5,
color = "red",
fill_color = "Red"
)
folium.Marker([51.25, -85.320], popup = "Ontario").add_to(canada_map)
ontario.add_child(child)
canada_map.add_child(ontario)
df_choropleth = pd.DataFrame({"Country": df.index, "Total": df["Total"]})
df_choropleth[["Country", "Total"]]
# Criando um Mapa Coroplético com a biblioteca Folium utilizando dados de um GeoJSON
geo_json = 'dados/folium_geojson.json'
world_map_geo = folium.Map(
location = [0, 0],
zoom_start = 2,
tiles = "Mapbox Bright")
folium.Choropleth(
geo_data = geo_json,
data = df_choropleth,
columns = ["Country", "Total"],
key_on = "feature.properties.name",
fill_color = "YlOrRd",
fill_opacity=0.7,
line_opacity=0.2,
legend_name = "Imigrantes para o Canada"
).add_to(world_map_geo)
world_map_geo
folium.Map(location=[-40.4637, -3.7492], zoom_start=6, tiles='Stamen Terrain')