!conda activate geo_env
## Aca se importan las librerias necesarias, la mas importante para esta prueba es PANDAS
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pycountry
from bokeh.io import output_notebook, show, output_file
from bokeh.plotting import figure, output_file, save
from bokeh.models import GeoJSONDataSource, LinearColorMapper, ColorBar
from bokeh.palettes import brewer
from datetime import datetime
from bokeh.models import Slider, HoverTool
import pandas as pd
import geopandas as gpd
sns.set_style('darkgrid')
%matplotlib inline
##Con este comando leemos los datos de la web
dataframe=pd.read_csv('https://github.com/owid/covid-19-data/blob/master/public/data/owid-covid-data.csv?raw=true', error_bad_lines=False)
# Listados los primeros registros del set de datos
dataframe.tail(5)
## Escogemos las variables especificas que necesitamos
df=dataframe
dataframe_pais=dataframe[['location','continent','total_vaccinations','people_fully_vaccinated','population']]
dataframe_pais.tail(5)
## aca agrupamos los registros de acuerdo a las variables location y continente, creamos un nuevo dataset y le decimos al nuevo data set (df_pais) las variables adicionales que vamos a utilizar
dataframe_pais=dataframe_pais.groupby(['location',])['continent', 'total_vaccinations','people_fully_vaccinated','population'].last().reset_index()
## aca listamos ese nuevo dataset pero solo los primeros 5 registros (paises con la función (heading)
dataframe_pais.head()
dataframe_pais['Cobertura']=(dataframe_pais['total_vaccinations']*0.5)/(dataframe_pais['population']*1.25)*100
dataframe_cobertura=dataframe_pais.sort_values('Cobertura',ascending=False)
df1=df[[ 'location', 'date','total_vaccinations',
'people_vaccinated', 'people_fully_vaccinated', 'new_vaccinations',
'population',]]
df1.dropna(subset=['new_vaccinations'],inplace=True)
cntry=[]
value=[]
for loc in df1.location.unique():
cntry.append(loc)
value.append(df1[df1['location']==loc]['new_vaccinations'].rolling(7, center=False).mean().mean())
df1=pd.DataFrame({'location':cntry,'Average_daily_doses':value})
df_full2=pd.merge(dataframe_cobertura,df1,on='location',how='outer')
df_full=pd.merge(dataframe_cobertura,df1,on='location',how='outer')
df_full['Cobertura']=((df_full['total_vaccinations']*0.5)/df_full['population']*1.25)*100
df_full['Days_70%_vaccination']=(((df_full['population']*0.7)-(df_full['total_vaccinations']*0.5))/(df_full['Average_daily_doses']*0.5))
df_full['Percent_Vaccinated']=((df_full['total_vaccinations']*0.5)/df_full['population'])*100
df_full.sort_values('Days_70%_vaccination',ascending=True,inplace=True)
df_full.dropna()
df_full.sort_values('Days_70%_vaccination')
pd.reset_option('display.max_rows')
pd.set_option("display.max_rows",215)
# Pais de comprobación
# df_full[df_full['location']=='Spain']
dataframe_salida = df_full
dataframe_salida.rename(columns = {'location':'PAISES', 'continent':'CONTINENTE',
'total_vaccinations':'TOTAL VACUNAS APLICADAS',
'Percent_Vaccinated':'PORCENTAJE POBLACION VACUNADA',
'Cobertura': 'POBLACION +DE 18a CUBIERTA'}, inplace = True)
dataframe_salida.dropna(subset = ["PORCENTAJE POBLACION VACUNADA"], inplace=True)
dataframe_salida=dataframe_salida[['PAISES','CONTINENTE','TOTAL VACUNAS APLICADAS','population', 'POBLACION +DE 18a CUBIERTA', 'PORCENTAJE POBLACION VACUNADA']]
dataframe_salida2=dataframe_salida.sort_values('PORCENTAJE POBLACION VACUNADA',ascending=False,inplace=True)
pd.options.display.float_format = '{:,.0f}'.format
dataframe_salida.to_html('../vacunas/salidas/listado_general.html')
dataframe_salida.rename(columns = {'location':'PAISES', 'continent':'CONTINENTE',
'TOTAL VACUNAS APLICADAS':'total_vaccinations',
'PORCENTAJE POBLACION VACUNADA':'Percent_Vaccinated',
'POBLACION +DE 18a CUBIERTA':'Cobertura'}, inplace = True)
dataframe_dias = df_full
#dataframe_dias.dropna(subset = ["Days_70%_vaccination"], inplace=True)
dataframe_dias.rename(columns = {'PAIS':'PAISES','POBLACION':'population','Days_70%_vaccination':'NUMERO DE DIAS 70%'}, inplace = True)
# 'total_vaccinations':'TOTAL VACUNAS APLICADAS',
# 'Percent_Vaccinated':'PORCENTAJE DE LA POBLACION VACUNADA',
# 'Days_70%_vaccination':'NUMERO DE DIAS 70%'}, inplace = True)
dataframe_dias=dataframe_dias[['PAISES', 'CONTINENTE','population','NUMERO DE DIAS 70%']]
dataframe_dias2=dataframe_dias.sort_values('NUMERO DE DIAS 70%',ascending=False,inplace=True)
pd.options.display.float_format = '{:,.0f}'.format
dataframe_dias.to_html('../vacunas/salidas/listado_dias.html')
dataframe_dias.rename(columns = {'PAIS':'PAISES', 'POBLACION':'population'}, inplace = True)
df_full.columns
dataframe_calculos=df_full
dataframe_calculos.dropna
dataframe_calculos_sort=dataframe_calculos.sort_values('POBLACION +DE 18a CUBIERTA',ascending=False)
plt.figure(figsize=(12,8))
plt.title('Los 10 países mas avanzados en el proceso de vacunación')
dataframe_calculos_sort.rename(columns = {'POBLACION +DE 18a CUBIERTA':'Porcentaje de población mayor de 18 años'}, inplace = True)
sns.barplot(x = "PAISES", y = "Porcentaje de población mayor de 18 años", data = dataframe_calculos_sort.head(10))
plt.xticks(rotation=70)
plt.savefig('../vacunas/salidas/los_mejores.jpg')
plt.show()
dataframe_calculos_sort.rename(columns = {'Porcentaje de población mayor de 18 años':'Cobertura'}, inplace = True)
dataframe_nulos= dataframe_pais[dataframe_pais['Cobertura'].isnull()]
dataframe_nulos1=dataframe_nulos.head(30)
plt.figure(figsize=(12,8))
plt.title('Los 21 países sin procesos de vacunación')
dataframe_nulos1.rename(columns = {'Cobertura':'Porcentaje de población mayor de 18 años','location':'PAISES' }, inplace = True)
sns.barplot(x = 'PAISES', y = 'Porcentaje de población mayor de 18 años', data = dataframe_nulos1)
plt.xticks(rotation=70)
plt.savefig('../vacunas/salidas/sin_vacuna.jpg')
plt.show()
dataframe_nulos1.rename(columns = {'Porcentaje de población mayor de 18 años':'Cobertura','PAISES':'location'}, inplace = True)
dataframe_calculos.columns
dataframe_calculos.dropna
dataframe_calculos_sort=dataframe_calculos.sort_values('POBLACION +DE 18a CUBIERTA',ascending=True)
plt.figure(figsize=(12,8))
plt.title('Los 20 países mas rezagados en el proceso de vacunación (de los que ya vacunan) ')
dataframe_calculos_sort.rename(columns = {'POBLACION +DE 18a CUBIERTA':'Porcentaje de población mayor de 18 años','location':'PAISES'}, inplace = True)
sns.barplot(x = "PAISES", y = "Porcentaje de población mayor de 18 años", data = dataframe_calculos_sort.head(20))
plt.xticks(rotation=70)
plt.savefig('../vacunas/salidas/los_rezagados.jpg')
plt.show()
dataframe_calculos_sort.rename(columns = {'Porcentaje de población mayor de 18 años':'Cobertura'}, inplace = True)
Listando los datos de un contiente específico
dataframe_continente=dataframe_pais.groupby('continent')['total_vaccinations','population','Cobertura'].last().reset_index()
dataframe=dataframe.groupby('location')['total_cases','total_deaths','population'].last().reset_index()
dataframe_continente.sort_values('Cobertura',ascending=True)
dataframe_continente.rename(columns = {'Cobertura':'Porcentaje de población mayor de 18 años','continent':'CONTINENTES'}, inplace = True)
plt.figure(figsize=(12,8))
sns.barplot(x = "CONTINENTES", y = "Porcentaje de población mayor de 18 años", data = dataframe_continente.sort_values('Porcentaje de población mayor de 18 años',ascending=True))
plt.xticks(rotation=70)
plt.title('Cobertura de vacunación global por continente')
plt.savefig('../vacunas/salidas/cobertura_continente.jpg')
plt.show()
dataframe_continente.rename(columns = {'Porcentaje de población mayor de 18 años':'Cobertura','CONTINENTES':'continent'}, inplace = True)
## creamos un nuevo dataset para ver los países con las coberturas mas altas en Norte America
dataframe_continente=dataframe_pais.groupby('continent')['total_vaccinations','population','Cobertura'].last().reset_index()
dataframe=dataframe.groupby('location')['total_cases','total_deaths','population'].last().reset_index()
dataframe_continente_america=dataframe_pais[dataframe_pais['continent']=='North America']
dataframe_continente_america2=dataframe_continente_america.sort_values('Cobertura',ascending=True,)
# Construyendo el grafico
##Quitamos los valores Nan
plt.figure(figsize=(12,8))
dataframe_continente_america2.dropna(inplace=True)
sns.barplot(x = "location", y = "Cobertura", data = dataframe_continente_america2.head(100))
plt.xticks(rotation=60)
plt.title('America del Norte y Centro America coberturas en vacunación')
plt.savefig('../vacunas/salidas/america.jpg')
plt.show()
df_full.rename(columns = {'PAISES':'location','CONTINENTE':'continent',
'TOTAL VACUNAS APLICADAS':'total_vaccinations',
'PORCENTAJE DE LA POBLACION VACUNADA':'Percent_Vaccinated'}, inplace = True)
df_full.columns
import pandas as pd
import geopandas as gpd
shapefile = '../data/countries_110m/ne_110m_admin_0_countries.shp'
gdf = gpd.read_file(shapefile)[['ADMIN', 'ADM0_A3', 'geometry']]
gdf.columns = ['country', 'country_code', 'geometry']
gdf = gdf.drop(gdf.index[159])
gdf.head()
import pycountry
input_countries = df_full.location.values.tolist()
codes = []
for country in input_countries:
try:
codes.append(pycountry.countries.search_fuzzy(country)[0].alpha_3)
except:
codes.append('Unknown code')
df_full['country_code']=codes
df_full.columns
#Perform left merge to preserve every row in gdf.
df_full.rename(columns = {'PORCENTAJE POBLACION VACUNADA':'Percent_Vaccinated','POBLACION +DE 18a CUBIERTA':'Cobertura'}, inplace = True)
merged = gdf.merge(df_full[['country_code','Cobertura','Percent_Vaccinated']], left_on = 'country_code', right_on = 'country_code', how = 'left')
#Replace NaN values to string 'No data'.
merged.fillna('No data', inplace = True)
import json
#Read data to json
merged_json = json.loads(merged.to_json())
#Convert to str like object
json_data = json.dumps(merged_json)
df2=df[[ 'location', 'date','total_vaccinations',
'people_vaccinated', 'people_fully_vaccinated', 'new_vaccinations',
'population',]]
df2['date']=pd.to_datetime(df2['date'])
def mapper(month):
return month.strftime('%Y-%m')
df2['Month']=df2['date'].apply(mapper)
df2.groupby(['location','Month'])['total_vaccinations','people_fully_vaccinated','population'].last().reset_index()
df2['Cobertura']=(df2['people_fully_vaccinated']/df2['population'])*100
df2['Percent_Vaccinated']=((df2['total_vaccinations']*0.5)/df2['population']*1.25)*100
#Perform left merge to preserve every row in gdf.
merged = gdf.merge(df_full[['country_code','Cobertura','Percent_Vaccinated']], left_on = 'country_code', right_on = 'country_code', how = 'left')
#Replace NaN values to string 'No data'.
merged.fillna(0, inplace = True)
import json
#Read data to json
merged_json = json.loads(merged.to_json())
#Convert to str like object
json_data = json.dumps(merged_json)
#Input GeoJSON source that contains features for plotting.
geosource = GeoJSONDataSource(geojson = json_data)
#Define a sequential multi-hue color palette.
palette = brewer['YlGnBu'][8]
#Reverse color order so that dark blue is highest obesity.
palette = palette[::-1]
#Instantiate LinearColorMapper that linearly maps numbers in a range, into a sequence of colors.
color_mapper = LinearColorMapper(palette = palette, low = 0, high = 20)
#Define custom tick labels for color bar.
tick_labels = {'0': '0%', '1': '1%', '5':'5%', '10':'10%', '20':'20%', '50':'50%'}
#Add hover tool
hover = HoverTool(tooltips = [ ('Pais/Region','@country'),('Cobertura población mayor de 18 años', '@Cobertura'),('Porcentaje población vacunada','@Percent_Vaccinated')])
#Create color bar.
color_bar = ColorBar(color_mapper=color_mapper, label_standoff=8,width = 500, height = 20,
border_line_color=None,location = (0,0), orientation = 'horizontal', major_label_overrides = tick_labels)
#Create figure object.
p = figure(title = f'Cobertura de vacunación COVID por paises al {datetime.now().date()}', plot_height = 600 , plot_width = 950, toolbar_location = None,tools=[hover])
p.xgrid.grid_line_color = None
p.ygrid.grid_line_color = None
#Add patch renderer to figure.
p.patches('xs','ys', source = geosource,fill_color = {'field' :'Percent_Vaccinated', 'transform' : color_mapper},
line_color = 'black', line_width = 0.25, fill_alpha = 1)
#Specify figure layout.
p.add_layout(color_bar, 'below')
#Display figure inline in Jupyter Notebook.
output_notebook()
#Display figure.
show(p)
output_file("../vacunas/salidas/mapai.html")
save(p)
# Aplicando algoritmo Kmeans a nuestro dataset
from sklearn.cluster import KMeans
dataframe_clusters = dataframe_pais
dataframe_clusters = df.reset_index()
inertias = []
K = range(1,10)
dataframe_clusters.fillna(0,inplace=True)
for k in K:
#Crear y ajustar el modelo
kmeanModel = KMeans(n_clusters=k).fit(dataframe_clusters.drop(['continent','location','iso_code','date','tests_units'],axis=1))
inertias.append(kmeanModel.inertia_)
plt.plot(K, inertias, 'bx-')
plt.xlabel('VALORES DE K')
plt.ylabel('Inertia')
plt.title('EL METODO DEL CODO USANDO INERTIA' )
plt.show()
## El numero de clusters o grupos sera de 4
kmeans = KMeans(n_clusters = 4, init = 'k-means++', random_state = 42)
y_kmeans = kmeans.fit_predict(dataframe_clusters.drop(['continent','location','iso_code','date','tests_units'],axis=1))
y_kmeans1=y_kmeans+1
cluster = pd.DataFrame(y_kmeans1)
today_sub=dataframe_clusters.drop(['continent','location','iso_code','date','tests_units'],axis=1)
# aca añadimos la variable cluster a nuestro nuevo dataset
today_sub['cluster'] = cluster
# Promedio de los valores del cluster
kmeans_mean_cluster = pd.DataFrame(round(today_sub.groupby('cluster').mean(),1))
## Listando los valores promedios de las variables utilizadas en cada cluster
kmeans_mean_cluster
## Acá podemos ver el grupo de paises en cada cluster o grupo
dataframe_clusters_2=dataframe_clusters.copy()
dataframe_clusters_2['cluster']= cluster
##Para listar los paises dentro de cada cluster separados
dataframe_clusters_2[dataframe_clusters_2[('cluster')]==2]
dataframe_clusters_2[dataframe_clusters_2['cluster']==3]
dataframe_clusters_2[dataframe_clusters_2['cluster']==4]
dataframe_clusters_2[dataframe_clusters_2['cluster']==1]