# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3
#     language: python
#     name: python3
# ---

# + [markdown] toc=true
# <h1>Informe interactivo acerca del Covid-19 en Bogotá<span class="tocSkip"></span></h1>
# <div class="toc"><ul class="toc-item"><li><span><a href="#Creación-de-Widgets" data-toc-modified-id="Creación-de-Widgets-1"><span class="toc-item-num">1&nbsp;&nbsp;</span>Creación de Widgets</a></span></li><li><span><a href="#Mostrar-código-HTML-en-la-salida-de-una-celda" data-toc-modified-id="Mostrar-código-HTML-en-la-salida-de-una-celda-2"><span class="toc-item-num">2&nbsp;&nbsp;</span>Mostrar código HTML en la salida de una celda</a></span></li><li><span><a href="#Integración-de-la-información" data-toc-modified-id="Integración-de-la-información-3"><span class="toc-item-num">3&nbsp;&nbsp;</span>Integración de la información</a></span></li><li><span><a href="#interactive" data-toc-modified-id="interactive-4"><span class="toc-item-num">4&nbsp;&nbsp;</span><code>interactive</code></a></span></li><li><span><a href="#Módulo-para-estudiantes" data-toc-modified-id="Módulo-para-estudiantes-5"><span class="toc-item-num">5&nbsp;&nbsp;</span>Módulo para estudiantes</a></span></li></ul></div>
# -

# # Informe interactivo acerca del Covid-19 en Bogotá
#
# Usaremos la información de las bases de datos de la alcaldía para generar un escritorio interactivo simple en jupyter. Al final crearemos un módulo que tenga funciones para visualizar todos los widgets que creamos:

# ## Creación de Widgets
#
# Con lo que sabemos creamos tres widgets interactivos que obtienen información directamente de la página de la alcaldía:

# +
import pandas as pd
import matplotlib.pyplot as plt
from ipywidgets import interact, interactive
import ipywidgets as widgets
import numpy as np

url="https://datosabiertos.bogota.gov.co/dataset/44eacdb7-a535-45ed-be03-16dbbea6f6da/resource/b64ba3c4-9e41-41b8-b3fd-2da21d627558/download/osb_enftransm-covid-1907082020-.csv"
# -

df=pd.read_csv(url,encoding='latin1')
df

df["Estado"].unique()

df["Estado"]=[i.replace(" ","") for i in df["Estado"]]# Armando una lista que corrige el error de digitación

df["Estado"].unique()

df2=df[df["Localidad de residencia"]=="Kennedy"].groupby("Estado").count()
df2


def f(localidad):
    df2=df[df["Localidad de residencia"]==localidad].groupby("Estado").count()
    ind=df2.index
    data=df2["Edad"]
    fig, ax = plt.subplots(figsize=(6, 5), subplot_kw=dict(aspect="equal")) # configuramos figure
    wedges, texts, autotexts = ax.pie(data,wedgeprops=dict(width=0.8), autopct="%0.2f %%") #Creamos una torta y guardamos lo que el paquete genera
    pct=[ind[i]+"  {:.2%}".format(data[i]/sum(data)) for i in range(len(data))] # Un vector que guarda el porcentaje de cada localidad
    plt.setp(autotexts, size=8, weight="bold",color="w") #Configuramos los porcentajes que aparecen en la torta
    ax.legend(wedges, pct,
          title="Tipo de caso",
          loc="center left",
          bbox_to_anchor=(1, 0, 0.5, 1)) #Definimos las leyendas del gráfico, observe que usamos el vector pct
    ax.set_title("Distribución de casos en "+localidad+
                 "\n\n"+str(sum(data))+" casos confirmados"+"\n") #Título, mostramos la cantidad total de casos por localidad

    plt.show()
    return


f("Chapinero")


def f(localidad):
    df2=df[df["Localidad de residencia"]==localidad].groupby("Estado").count()
    ind=df2.index
    data=df2["Edad"]
    fig, ax = plt.subplots(figsize=(6, 5), subplot_kw=dict(aspect="equal")) # configuramos figure
    wedges, texts, autotexts = ax.pie(data,wedgeprops=dict(width=0.8), autopct="%0.2f %%") #Creamos una torta y guardamos lo que el paquete genera
    pct=[ind[i]+"  {:.2%}".format(data[i]/sum(data)) for i in range(len(data))] # Un vector que guarda el porcentaje de cada localidad
    plt.setp(autotexts, size=8, weight="bold",color="w") #Configuramos los porcentajes que aparecen en la torta
    ax.legend(wedges, pct,
          title="Tipo de caso",
          loc="center left",
          bbox_to_anchor=(1, 0, 0.5, 1)) #Definimos las leyendas del gráfico, observe que usamos el vector pct
    ax.set_title("Distribución de casos en "+localidad+
                 "\n\n"+str(sum(data))+" casos confirmados"+"\n") #Título, mostramos la cantidad total de casos por localidad

    plt.show()
    return
Liloc=list(df["Localidad de residencia"].unique()) # Extraemos la lista de localidades
interact(f, localidad=widgets.Dropdown(options=Liloc,value="Usme", 
                                       description="Localidad:", 
                                       disabled=False,))


# Una torta más complicada, inspirada en el ejemplo de la galería de matplotlib:
#
# [Labeling a pie and a donut](https://matplotlib.org/3.1.0/gallery/pie_and_polar_charts/pie_and_donut_labels.html#sphx-glr-gallery-pie-and-polar-charts-pie-and-donut-labels-py)
#
# ![imagen](https://matplotlib.org/3.1.0/_images/sphx_glr_pie_and_donut_labels_002.png)
#

def f(localidad):
    df2=df[df["Localidad de residencia"]==localidad].groupby("Estado").count()
    ind=df2.index
    data=df2["Edad"]
    fig, ax = plt.subplots(figsize=(6, 5), subplot_kw=dict(aspect="equal"))
    wedges, texts = ax.pie(data,wedgeprops=dict(width=0.5), 
                                      startangle=-40)
    pct=["{:.2%}".format(da/sum(data)) for da in data]
    bbox_props = dict(boxstyle="square,pad=0.3", fc="w", ec="k", lw=0.72)
    kw = dict(arrowprops=dict(arrowstyle="-"),
              bbox=bbox_props, zorder=0, va="center")
    
    for i, p in enumerate(wedges):
        ang = (p.theta2 - p.theta1)/2. + p.theta1
        y = np.sin(np.deg2rad(ang))        
        x = np.cos(np.deg2rad(ang))
        horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]
        connectionstyle = "angle,angleA=0,angleB={}".format(ang)
        kw["arrowprops"].update({"connectionstyle": connectionstyle})
        ax.annotate(ind[i]+"  "+pct[i], xy=(x, y),
                    xytext=(1.35*np.sign(x), 1.4*y),
                    horizontalalignment=horizontalalignment, **kw)
    ax.set_title("Distribución de casos en "+localidad+
                 "\n\n"+str(sum(data))+" casos confirmados"+"\n")

    plt.show()
    return
df2=df.groupby("Localidad de residencia").count().index
interact(f, localidad=widgets.Dropdown(options=df2,value="Usme", 
                                       description="Localidad:", 
                                       disabled=False,))

# Sin embargo, la idea es crear un módulo con más información,  hagamos un par de gráficos para completar nuestro módulo, iniciemos con un gráfico que nos permita visualizar la distribución de casos confirmados por localidades en Bogotá:

# +
Casos=df.groupby("Localidad de residencia").count()
Casos=Casos.sort_values("Edad")
fig, ax = plt.subplots(figsize=(10, 8))
# Una función para poner la cantidad de casos
def autolabel(rects):
    for rect in rects:
        width = rect.get_width()
        ax.annotate('{}'.format(width),
                    xy=(width,rect.get_y() + rect.get_height() / 2),
                    xytext=(3,0),  # 3 points vertical offset
                    textcoords="offset points",
                    ha='left', va='center')

rects=ax.barh(Casos.index,Casos["Edad"])
ax.set(xlim=(0, max(Casos["Edad"])+2000))
plt.title("En total hay "+str(sum(Casos["Edad"]))+" en Bogotá")
autolabel(rects)
plt.show()
# -

# Ahora hagamos otro módulo interactivo que nos permita graficar por edad:

DF10=df[df["Edad"]>=10]
DF10[DF10["Edad"]<=40]
df[df["Edad"]>=10][df[df["Edad"]>=10]["Edad"]<=40]


def filtroedad(edades):    
    Edad_Filtro=df[df["Edad"]>=edades[0]][df[df["Edad"]>=edades[0]]["Edad"]<=edades[1]]
    Casos=Edad_Filtro.groupby("Localidad de residencia").count()
    Casos=Casos.sort_values("Edad")
    fig, ax = plt.subplots(figsize=(10, 8))
    # Una función para poner la cantidad de casos
    def autolabel(rects):
        for rect in rects:
            width = rect.get_width()
            ax.annotate('{}'.format(width),
                        xy=(width,rect.get_y() + rect.get_height() / 2),
                        xytext=(3,0),  # 3 points vertical offset
                        textcoords="offset points",
                        ha='left', va='center')

    rects=ax.barh(Casos.index,Casos["Edad"])
    ax.set(xlim=(0, max(Casos["Edad"])*1.12))
    plt.title("En total hay "+str(sum(Casos["Edad"]))+" en Bogotá")
    autolabel(rects)
    plt.show()
    return
wid=widgets.IntRangeSlider(
    value=[10, 70],
    min=0,
    max=120,
    step=1,
    description='Edades:',
    orientation='horizontal',
    readout=True,
    readout_format='d',
    continue_update=False,
)
interact(filtroedad,edades=wid)

# ## Mostrar código HTML en la salida de una celda
#
# Ahora usaremos nuestros tres módulos para genera una página dentro de Jupyter para crear un escritorio interactivo. Antes, veamos una herramienta que nos permite usar código HTML en la salida de las celdas de Python. 
#
# Referencias para usar código HTML: [w3schools](https://www.w3schools.com/html/default.asp)

from IPython.core.display import HTML, display

display(HTML("La ecuación más bella del mundo es la identidad de Euler: $e^{i\pi}+1=0$"))

display(HTML("<h2>La ecuación más bella del mundo</h2> <p>la identidad de Euler: $e^{i\pi}+1=0$</p>"))

display(HTML("<p><strong>Hola como estan</strong></p>"+
             "<p>un texto sencillo en HTML</p>"))

# Ahora incluyamos un vídeo:

display(HTML("<div style=background-color:lightblue> <h2>La ecuación más bella del mundo</h2> <p>la identidad de Euler: $e^{i\pi}+1=0$</p></div>"))

display(HTML("<div style=background-color:lightblue><h2>La ecuación más bella del mundo</h2>"+
             " <p>la identidad de Euler: $e^{i\pi}+1=0$</p><p></p>"+
            '<iframe width="560" height="315" src="https://www.youtube.com/embed/2RC1NMF4uE0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>'))


# ## Integración de la información
#
# Ahora la idea es que usemos esta herramienta para generar un dashboard que integre los tres elementos interactivos definidos arriba:

def encabezado():
    display(HTML('<h2>Casos distribuidos por localidades en Bogotá</h2>'+
                '<p>El siguiente gráfico muestra las distribuciones por localidades en Bogotá:</p>'))
    Casos=df.groupby("Localidad de residencia").count()
    Casos=Casos.sort_values("Edad")
    fig, ax = plt.subplots(figsize=(10, 8))
    # Una función para poner la cantidad de casos
    def autolabel(rects):
        for rect in rects:
            width = rect.get_width()
            ax.annotate('{}'.format(width),
                        xy=(width,rect.get_y() + rect.get_height() / 2),
                        xytext=(3,0),  # 3 points vertical offset
                        textcoords="offset points",
                        ha='left', va='center')

    rects=ax.barh(Casos.index,Casos["Edad"])
    ax.set(xlim=(0, max(Casos["Edad"])+2000))
    plt.title("En total hay "+str(sum(Casos["Edad"]))+" en Bogotá")
    autolabel(rects)
    plt.show()
    


encabezado()


# Ahora integremos lo demás:

# +
def f(localidad):
    display(HTML('<h2>Proporción de casos en cada una de las localidades en Bogotá</h2>'+
                '<p>Seleccione la localidad e identifique cuántos casos hay en cada Localidad Bogotana:</p>'))
  

    df2=df[df["Localidad de residencia"]==localidad].groupby("Estado").count()
    ind=df2.index
    data=df2["Edad"]
    fig, ax = plt.subplots(figsize=(6, 5), subplot_kw=dict(aspect="equal"))
    wedges, texts = ax.pie(data,wedgeprops=dict(width=0.5), 
                                      startangle=-40)
    pct=["{:.2%}".format(da/sum(data)) for da in data]
    bbox_props = dict(boxstyle="square,pad=0.3", fc="w", ec="k", lw=0.72)
    kw = dict(arrowprops=dict(arrowstyle="-"),
              bbox=bbox_props, zorder=0, va="center")
    
    for i, p in enumerate(wedges):
        ang = (p.theta2 - p.theta1)/2. + p.theta1
        y = np.sin(np.deg2rad(ang))        
        x = np.cos(np.deg2rad(ang))
        horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]
        connectionstyle = "angle,angleA=0,angleB={}".format(ang)
        kw["arrowprops"].update({"connectionstyle": connectionstyle})
        ax.annotate(ind[i]+"  "+pct[i], xy=(x, y),
                    xytext=(1.35*np.sign(x), 1.4*y),
                    horizontalalignment=horizontalalignment, **kw)
    ax.set_title("Distribución de casos en "+localidad+
                 "\n\n"+str(sum(data))+" casos confirmados"+"\n")

    plt.show()
    return
Liloc=list(df["Localidad de residencia"].unique()) # Extraemos la lista de localidades

interact(f, localidad=widgets.Dropdown(options=Liloc,value="Usme", 
                                       description="Localidad:", 
                                       disabled=False,))


# -

# ## `interactive`
# Usamos el comando `interactive` para guardar mi widget y mostrarlo cuando se requiera:

# +
def f(localidad):
    df2=df[df["Localidad de residencia"]==localidad].groupby("Estado").count()
    ind=df2.index
    data=df2["Edad"]
    fig, ax = plt.subplots(figsize=(6, 5), subplot_kw=dict(aspect="equal"))
    wedges, texts = ax.pie(data,wedgeprops=dict(width=0.5), 
                                      startangle=-40)
    pct=["{:.2%}".format(da/sum(data)) for da in data]
    bbox_props = dict(boxstyle="square,pad=0.3", fc="w", ec="k", lw=0.72)
    kw = dict(arrowprops=dict(arrowstyle="-"),
              bbox=bbox_props, zorder=0, va="center")
    
    for i, p in enumerate(wedges):
        ang = (p.theta2 - p.theta1)/2. + p.theta1
        y = np.sin(np.deg2rad(ang))        
        x = np.cos(np.deg2rad(ang))
        horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]
        connectionstyle = "angle,angleA=0,angleB={}".format(ang)
        kw["arrowprops"].update({"connectionstyle": connectionstyle})
        ax.annotate(ind[i]+"  "+pct[i], xy=(x, y),
                    xytext=(1.35*np.sign(x), 1.4*y),
                    horizontalalignment=horizontalalignment, **kw)
    ax.set_title("Distribución de casos en "+localidad+
                 "\n\n"+str(sum(data))+" casos confirmados"+"\n")

    plt.show()
    return
Liloc=list(df["Localidad de residencia"].unique()) # Extraemos la lista de localidades

W1=interactive(f, localidad=widgets.Dropdown(options=Liloc,value="Usme", 
                                       description="Localidad:", 
                                       disabled=False,))

# +
display(HTML('<h2>Proporción de casos en cada una de las localidades en Bogotá</h2>'+
                '<p>Seleccione la localidad e identifique cuántos casos hay en cada Localidad Bogotana:</p>'))
  
display(W1)


# -

def encabezado():
    display(HTML('<h2>Casos distribuidos por localidades en Bogotá</h2>'+
                '<p>El siguiente gráfico muestra las distribuciones por localidades en Bogotá:</p>'))
    Casos=df.groupby("Localidad de residencia").count()
    Casos=Casos.sort_values("Edad")
    fig, ax = plt.subplots(figsize=(10, 8))
    # Una función para poner la cantidad de casos
    def autolabel(rects):
        for rect in rects:
            width = rect.get_width()
            ax.annotate('{}'.format(width),
                        xy=(width,rect.get_y() + rect.get_height() / 2),
                        xytext=(3,0),  # 3 points vertical offset
                        textcoords="offset points",
                        ha='left', va='center')

    rects=ax.barh(Casos.index,Casos["Edad"])
    ax.set(xlim=(0, max(Casos["Edad"])+2000))
    plt.title("En total hay "+str(sum(Casos["Edad"]))+" en Bogotá")
    autolabel(rects)
    plt.show()
    display(HTML('<h2>Proporción de casos en cada una de las localidades en Bogotá</h2>'+
                '<p>Seleccione la localidad e identifique cuántos casos hay en cada Localidad Bogotana:</p>'))
  
    display(W1)
    


encabezado()


# Integremos el otro widget:

def filtroedad(edades):    
    Edad_Filtro=df[df["Edad"]>=edades[0]][df[df["Edad"]>=edades[0]]["Edad"]<=edades[1]]
    Casos=Edad_Filtro.groupby("Localidad de residencia").count()
    Casos=Casos.sort_values("Edad")
    fig, ax = plt.subplots(figsize=(10, 8))
    # Una función para poner la cantidad de casos
    def autolabel(rects):
        for rect in rects:
            width = rect.get_width()
            ax.annotate('{}'.format(width),
                        xy=(width,rect.get_y() + rect.get_height() / 2),
                        xytext=(3,0),  # 3 points vertical offset
                        textcoords="offset points",
                        ha='left', va='center')

    rects=ax.barh(Casos.index,Casos["Edad"])
    ax.set(xlim=(0, max(Casos["Edad"])*1.12))
    plt.title("En total hay "+str(sum(Casos["Edad"]))+" en Bogotá")
    autolabel(rects)
    plt.show()
    return
wid=widgets.IntRangeSlider(
    value=[10, 70],
    min=0,
    max=120,
    step=1,
    description='Edades:',
    orientation='horizontal',
    readout=True,
    readout_format='d',
)
W2=interactive(filtroedad,edades=wid)


# Actualizamos el encabezado:

def encabezado():
    display(HTML('<h2>Casos distribuidos por localidades en Bogotá</h2>'+
                '<p>El siguiente gráfico muestra las distribuciones por localidades en Bogotá:</p>'))
    Casos=df.groupby("Localidad de residencia").count()
    Casos=Casos.sort_values("Edad")
    fig, ax = plt.subplots(figsize=(10, 8))
    # Una función para poner la cantidad de casos
    def autolabel(rects):
        for rect in rects:
            width = rect.get_width()
            ax.annotate('{}'.format(width),
                        xy=(width,rect.get_y() + rect.get_height() / 2),
                        xytext=(3,0),  # 3 points vertical offset
                        textcoords="offset points",
                        ha='left', va='center')

    rects=ax.barh(Casos.index,Casos["Edad"])
    ax.set(xlim=(0, max(Casos["Edad"])+2000))
    plt.title("En total hay "+str(sum(Casos["Edad"]))+" en Bogotá")
    autolabel(rects)
    plt.show()
    display(HTML('<h2>Proporción de casos en cada una de las localidades en Bogotá</h2>'+
                '<p>Seleccione la localidad e identifique cuántos casos hay en cada Localidad Bogotana:</p>'))
  
    display(W1)
    display(HTML('<h2>Distribución por edades</h2>'+
                '<p>Ahora veamos como se dsitribuyen por edades:</p>'))
  
    display(W2)
    
    return


encabezado()

# + language="javascript"
# IPython.OutputArea.auto_scroll_threshold = 9999;
# -

encabezado()

# ## Módulo para estudiantes
#
# Finalmente, creemos un módulo:

# +
import pandas as pd
import matplotlib.pyplot as plt
from ipywidgets import interact, interactive
import ipywidgets as widgets
import numpy as np
from IPython.core.display import HTML, display

url="https://datosabiertos.bogota.gov.co/dataset/44eacdb7-a535-45ed-be03-16dbbea6f6da/resource/b64ba3c4-9e41-41b8-b3fd-2da21d627558/download/osb_enftransm-covid-19.csv"
df=pd.read_csv(url,encoding='latin1')
df["Estado"]=[i.replace(" ","") for i in df["Estado"]]

### Primer Widget

def f(localidad):
    df2=df[df["Localidad de residencia"]==localidad].groupby("Estado").count()
    ind=df2.index
    data=df2["Edad"]
    fig, ax = plt.subplots(figsize=(6, 5), subplot_kw=dict(aspect="equal"))
    wedges, texts = ax.pie(data,wedgeprops=dict(width=0.5), 
                                      startangle=-40)
    pct=["{:.2%}".format(da/sum(data)) for da in data]
    bbox_props = dict(boxstyle="square,pad=0.3", fc="w", ec="k", lw=0.72)
    kw = dict(arrowprops=dict(arrowstyle="-"),
              bbox=bbox_props, zorder=0, va="center")
    
    for i, p in enumerate(wedges):
        ang = (p.theta2 - p.theta1)/2. + p.theta1
        y = np.sin(np.deg2rad(ang))        
        x = np.cos(np.deg2rad(ang))
        horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]
        connectionstyle = "angle,angleA=0,angleB={}".format(ang)
        kw["arrowprops"].update({"connectionstyle": connectionstyle})
        ax.annotate(ind[i]+"  "+pct[i], xy=(x, y),
                    xytext=(1.35*np.sign(x), 1.4*y),
                    horizontalalignment=horizontalalignment, **kw)
    ax.set_title("Distribución de casos en "+localidad+
                 "\n\n"+str(sum(data))+" casos confirmados"+"\n")

    plt.show()
    return
Liloc=list(df["Localidad de residencia"].unique()) # Extraemos la lista de localidades

W1=interactive(f, localidad=widgets.Dropdown(options=Liloc,value="Usme", 
                                       description="Localidad:", 
                                       disabled=False,))

### Segundo Widget

def filtroedad(edades):    
    Edad_Filtro=df[df["Edad"]>=edades[0]][df[df["Edad"]>=edades[0]]["Edad"]<=edades[1]]
    Casos=Edad_Filtro.groupby("Localidad de residencia").count()
    Casos=Casos.sort_values("Edad")
    fig, ax = plt.subplots(figsize=(10, 8))
    # Una función para poner la cantidad de casos
    def autolabel(rects):
        for rect in rects:
            width = rect.get_width()
            ax.annotate('{}'.format(width),
                        xy=(width,rect.get_y() + rect.get_height() / 2),
                        xytext=(3,0),  # 3 points vertical offset
                        textcoords="offset points",
                        ha='left', va='center')

    rects=ax.barh(Casos.index,Casos["Edad"])
    ax.set(xlim=(0, max(Casos["Edad"])*1.12))
    plt.title("En total hay "+str(sum(Casos["Edad"]))+" en Bogotá")
    autolabel(rects)
    plt.show()
    return
wid=widgets.IntRangeSlider(
    value=[10, 70],
    min=0,
    max=120,
    step=1,
    description='Edades:',
    orientation='horizontal',
    readout=True,
    readout_format='d',
)
W2=interactive(filtroedad,edades=wid)


#### Dashboard

def miprimerdashboard():
    display(HTML(             '<h2>Casos distribuidos por localidades en Bogotá</h2>'+
                '<p>El siguiente gráfico muestra las distribuciones por localidades en Bogotá:</p>'))
    Casos=df.groupby("Localidad de residencia").count()
    Casos=Casos.sort_values("Edad")
    fig, ax = plt.subplots(figsize=(10, 8))
    # Una función para poner la cantidad de casos
    def autolabel(rects):
        for rect in rects:
            width = rect.get_width()
            ax.annotate('{}'.format(width),
                        xy=(width,rect.get_y() + rect.get_height() / 2),
                        xytext=(3,0),  # 3 points vertical offset
                        textcoords="offset points",
                        ha='left', va='center')

    rects=ax.barh(Casos.index,Casos["Edad"])
    ax.set(xlim=(0, max(Casos["Edad"])+2000))
    plt.title("En total hay "+str(sum(Casos["Edad"]))+" en Bogotá")
    autolabel(rects)
    plt.show()
    display(HTML('<h2>Proporción de casos en cada una de las localidades en Bogotá</h2>'+
                '<p>Seleccione la localidad e identifique cuántos casos hay en cada Localidad Bogotana:</p>'))
  
    display(W1)
    display(HTML('<h2>Distribución por edades</h2>'+
                '<p>Ahora veamos como se dsitribuyen por edades:</p>'))
  
    display(W2)
    
    return


# -

miprimerdashboard()

StarcoderdataJupyterScriptsDedupFiltered