def controlar_paginacion(num_pagina, data) :
    """
    Callback que controla cuáles son las escuelas que se muestran en el reporte.
    Se activa cuando cambia el valor del slider-paginacion.
    
    El número de escuelas que se muestran está definido por la constante
    ESCUELAS_POR_PAGINA.
    
    Args:
        num_pagina (int): número de página que se desea mostrar.
        data (dict): diccionario que contiene los datos de las escuelas.
    
    Returns:
        tabla_matricula (:obj: `dash_bootstrap_components.Table`): layout de una
            tabla con la matrícula de las escuelas que le corresponden a esa página.
        tabla_metricas (:obj: `dash_bootstrap_components.Table`): layout de una
            tabla con las métricas de predicción de las escuelas que le corresponden 
            a esa página.
        scatterplot (:obj: `plotly.express.line`): gráfica que contiene los 
            scatterplot de las escuelas que le corresponden a esa página.
        boxplot (:obj: `plotly.graph_objs.Figure`): gráfica que contiene los 
            boxplot de las escuelas que le corresponden a esa página.
        salida-loading-graficas (:obj:): salida del loading para mostrar el gif 
            de carga en lo que el callback se termina de ejecutar. No hace falta 
            regresar un valor específico, por lo que se regresa None.
    """
    if not num_pagina :
        raise PreventUpdate

    # Obtener escuelas
    escuelas = data['escuelas']
    escuelas_pagina = dict()
    ccts = list(escuelas.keys())
    
    # Obtener los índices que le corresponden a la página
    primer_indice_pagina = (num_pagina - 1) * ESCUELAS_POR_PAGINA
    ultimo_indice_pagina = min(num_pagina * ESCUELAS_POR_PAGINA, len(escuelas))
    
    # Crear un subconjunto de las escuelas
    for i in range(primer_indice_pagina, ultimo_indice_pagina) :
        cct = ccts[i]
        escuelas_pagina[cct] = escuelas[cct]
    
    # Crear gráficas
    tabla_matricula = GeneradorDeGraficas.generar_tabla_matricula(escuelas_pagina)
    tabla_metricas = GeneradorDeGraficas.generar_tabla_metricas(escuelas_pagina)
    scatterplot = GeneradorDeGraficas.generar_scatterplot(escuelas_pagina)
    boxplot = GeneradorDeGraficas.generar_boxplot(escuelas_pagina)
    
    return tabla_matricula, tabla_metricas, scatterplot, boxplot, None
示例#2
0
def controlar_paginacion_tablas(num_pagina, data):
    """
    Callback para controlar el número de series que se muestran en las tablas de
    métricas y de matrícula en la aplicación de estado. Se activa cuando el valor
    del slider-paginacion-estado cambia.
    
    Args:
        num_pagina (int): número de página a mostrar
        data (dict): diccionario que contiene el índice en el arreglo TREE del nodo 
            del que se está mostrando el layout.
    
    Returns:
        tabla_matricula (:obj: `dash_html_components.Table`): layout de una tabla
            con la matrícula de las serie sde la página.
        tabla_metricas (:obj: `dash_html_components.Table`): layout de una tabla
            con las métricas de predicción de las series de la página
    """
    # Obtener los datos del nodo actual
    data = data or {'index-nodo': 0}
    index = data['index-nodo']
    nodo = TREE[index]

    # Si el nodo no tiene ningún hijo entonces no hay gráficas que mostrar
    if not nodo.hijos:
        print("No tiene hijos")
        raise PreventUpdate

    # Obtener las series individuales de los hijos
    series_hijos = dict()
    for hijo in nodo.hijos:
        series_hijos[hijo] = nodo.hijos[hijo].serie_individual

    # Obtener las paginas
    llaves = list(series_hijos.keys())

    # Obtener los elementos de la pagina
    elementos_pagina = dict()
    primer_indice_pagina = (num_pagina - 1) * HIJOS_POR_PAGINA
    ultimo_indice_pagina = min(num_pagina * HIJOS_POR_PAGINA,
                               len(series_hijos))
    for i in range(primer_indice_pagina, ultimo_indice_pagina):
        llave = llaves[i]
        elementos_pagina[llave] = series_hijos[llave]

    # Crear tablas
    tabla_matricula = GeneradorDeGraficas.generar_tabla_matricula(
        elementos_pagina,
        links_requeridos=False,
        nombre_elementos=nodo.nombre_hijos)

    tabla_metricas = generar_tabla_metricas(elementos_pagina,
                                            nodo.nombre_hijos)
    return tabla_matricula, tabla_metricas
示例#3
0
 def generar_scatterplot_general(self):
     """
     Método que genera un scatterplot con las series de tiempo individuales de
     cada uno de los hijos del nodo.
     
     Si el atributo grafica_general fue especificado, entonces devuelve la gráfica
     que contiene este atributo.
     
     """
     if not self.grafica_general:
         series = dict()
         for hijo in self.hijos:
             series[hijo] = self.hijos[hijo].serie_individual
         return GeneradorDeGraficas.generar_scatterplot(
             series,
             title=self.layout.titulo,
             titulo_leyenda=self.nombre_hijos)
     return self.grafica_general
def cargar_contenido_reporte_general(escuelas) :
    """
    Carga el layout del reporte general dados los datos de las escuelas.
    
    Args:
        escuelas (:obj: `OrderedDict`): diccionario ordenado con los datos de las
            escuelas del reporte.
    Returns:
        Layout del reporte general para mostrarlo en la plantilla del reporte.
    """
    
    mapa = GeneradorDeGraficas.generar_mapa(escuelas)
    
    contador_escuelas = {
        "Preescolar": 0,
        "Primaria": 0,
        "Secundaria": 0
    }
    
    for cct in escuelas :
        contador_escuelas[escuelas[cct]['nivel']] += 1
    
    num_paginas = 1
    if len(escuelas) <= ESCUELAS_POR_PAGINA :
        # Hack para no mostrar el slider si existe una sola página
        slider = dcc.Input(
            type = 'hidden', 
            value = 1,
            id = 'slider-paginacion'
        )
    else :
        num_paginas = len(escuelas) // ESCUELAS_POR_PAGINA + (1 if len(escuelas) % ESCUELAS_POR_PAGINA != 0 else 0)
        
        marcas = dict()
        for i in range(1, num_paginas + 1) :
            marcas[i] = {'label': "%d" % (i)}
        
        slider = dcc.Slider(
            min = 1,
            max = num_paginas,
            value = 1,
            marks = marcas,
            included = False, 
            id = 'slider-paginacion'
        )
    
    # Crear layout de la página
    layout_reporte = dbc.Container([
        # Renglón del mapa y el scatterplot
        dbc.Row([
            # Layout del Scatterplot
            dbc.Col([
                html.H5(
                    "Reporte general",
                    style = {
                        "color": "#1199EE",
                        "font-weight": "bold"
                    },
                ),
                html.H3(
                    "Resumen con la información general de las escuelas",
                    style = {"font-weight": "bold"}
                ),
                html.P(
                    "Explora la proyección, medidas de tendencia central y la " +
                    "función de autocorrelación de la matrícula de las escuelas, " + 
                    "así como su ubicación en el mapa. Da click sobre la clave " + 
                    "del centro de trabajo de una escuela para obtener más detalles de ella.",
                    style = {
                        "text-align": "justify"
                    }
                ),
                html.P("Este reporte contiene:", style = {"font-weight": "bold"}),
                html.P([
                    html.B("Preescolar: "),
                    "%d %s" % (contador_escuelas['Preescolar'], "escuela" if contador_escuelas['Preescolar'] == 1 else "escuelas")],
                    style = {"margin": "0"}
                ),
                html.P([
                    html.B("Primarias: "),
                    "%d %s" % (contador_escuelas['Primaria'], "escuela" if contador_escuelas['Primaria'] == 1 else "escuelas")],
                    style = {"margin": "0"}
                ),
                html.P([
                    html.B("Secundarias: "),
                    "%d %s" % (contador_escuelas['Secundaria'], "escuela" if contador_escuelas['Secundaria'] == 1 else "escuelas")],
                    style = {"margin": "0"}
                )],
                md = 6,
                style = {
                    "margin-top": "4rem",
                }
            ),
            # Layout del mapa
            dbc.Col(
                dcc.Graph(figure = mapa, id = 'mapa-general'),
                md = 6,
            )],
            justify = "center",
            style = {"padding-left": "1rem"}
        ),
        # Renglón del scatterplot
        dbc.Row(
            dbc.Col([
                dcc.Graph(
                    #figure = scatterplot, 
                    id = 'scatterplot-general',
                    style = {
                        "margin-bottom" : "0", 
                        "padding-bottom": "0"
                    },
                ),
                html.P(
                    u"* Fuente: estadística 911",
                    className = "text-secondary",
                    style = {
                        "font-size" : "0.5rem", 
                        "margin" : "0", 
                        "padding" : "0"
                    }
                )],
                md = 12
            )
        ),
        # Renglón del boxplot
        dbc.Row(
            dbc.Col(
                dcc.Graph(
                    #figure = boxplot, 
                    id = 'boxplot-general'
                ),
                md = 12
            )
        ),
        # Controles de paginación
        dcc.Loading(
            id = "loading-graficas",
            type = "default",
            children = html.Div(id = "salida-loading-graficas"),
            style = {"margin-top": "-2rem"}
        ),
        slider,
        # Renglón de las tablas de métricas y de matrícula
        dbc.Row([
            # Layout de la tabla de matrícula
            dbc.Col([
                dbc.Container(dbc.Row([
                    html.H4(u"Matrícula por ciclo escolar"), 
                    dbc.Button([
                        u"Descargar csv ",
                        html.I(className="far fa-arrow-alt-circle-down")],
                        color = "info",
                        style = {
                            "padding" : "0.2rem", 
                            "margin" : "0 0.2rem 0.2rem 0.2rem", 
                            "background" : "#1199EE"
                        },
                        id = "descargar_csv_button"
                    ),
                    Download(id = "descargar_csv")]
                )),
                html.Div(
                    #tabla_matricula,
                    id = 'div-tabla-matricula'
                )],
                md = 6,
            ),
            # Layout de la tabla de métricas
            dbc.Col([
                html.H4(u"Métricas de la proyección"),
                html.Div(
                    #tabla_metricas,
                    id = 'div-tabla-metricas'
                )],
                md = 6,
            )]
        )],
        # Estilos del layout general
        style = {"background" : "#FFFFFF"},
        fluid = True
    )
    return layout_reporte
示例#5
0
def cargar_plantilla_secundaria(serie_de_tiempo, escuelas):
    """
    Función que genera el layout de la parte inferior de la página, la cual contiene
    las gráficas de scatterplot, boxplot, correlograma y mapa, generadas con datos
    del hijo del nodo actual, el cual es seleccionado en el dropdown que aparece
    en el layout principal.
    
    Args:
        serie_de_tiempo (dict): datos de la serie de tiempo individual que guarda
            el nodo hijo (ver Nodos en FabricasNodos.py).
        escuelas (dict): escuelas con su ubicación que se encuentran dentro del
            nodo hijo. Las escuelas se obtienen utilizando la función obtener_escuelas
            que recibe el identificador de la serie de tiempo individual del nodo hijo.
    
    Returns:
        layout (:obj: `dash_html_components.Div`): layout de la parte inferior de
            la página.
    """

    # Generar gráficas de la serie de tiempo
    nombre_serie = serie_de_tiempo['nombre']
    scatterplot = GeneradorDeGraficas.generar_scatterplot(
        {nombre_serie: serie_de_tiempo},
        show_legend=False,
        title=u"Matrícula de %s" % (nombre_serie))

    boxplot = GeneradorDeGraficas.generar_boxplot(
        {nombre_serie: serie_de_tiempo},
        show_legend=False,
        title=u"Medidas de tendencia central (matrícula)")

    mapa = GeneradorDeGraficas.generar_mapa(escuelas,
                                            titulo=u'Escuelas en %s' %
                                            (nombre_serie))

    correlograma_acf = GeneradorDeGraficas.generar_correlograma(
        serie_de_tiempo['matricula'], cct=nombre_serie, es_acf=True)

    # Layout del scatterplot
    tarjeta_scatterplot = dbc.Card(dcc.Graph(figure=scatterplot),
                                   style={"margin": "0 1rem 1rem 1rem"})

    # Layout del mapa y el boxplot
    renglon_mapa_y_boxplot = dbc.Row(
        [
            # Layout del boxplot
            dbc.Col(dbc.Card(dcc.Graph(figure=boxplot),
                             style={"margin": "0 0.5rem 1rem 0"}),
                    xs=6,
                    style={"padding-right": "0"}),
            # Layout del mapa
            dbc.Col(dbc.Card(dcc.Graph(figure=mapa),
                             style={"margin": "0 0 1rem 0.5rem"}),
                    xs=6,
                    style={"padding-left": "0"})
        ],
        style={"margin": "0"})

    # Layout del correlograma
    tarjeta_correlograma = dbc.Card(dcc.Graph(figure=correlograma_acf),
                                    style={"margin": "0 1rem 1rem 1rem"})

    # Layout secundario
    layout = html.Div(
        [tarjeta_scatterplot, renglon_mapa_y_boxplot, tarjeta_correlograma])

    return layout
示例#6
0
        ['Ver regiones ', html.I(className="fas fa-plus")],
        type="button",
        style={
            "padding": "0.2rem",
            "margin": "0.2rem 0.2rem 0.2rem 0.2rem",
            "background": "#1199EE",
            "border-color": "#1199EE"
        },
        id='zoom-in'),
)

# Nodo que contiene al estado de Zacatecas
ROOT = Nodo(layout=layout_root,
            id=None,
            grafica_general=GeneradorDeGraficas.generar_scatterplot(
                cache['municipios'],
                title='Matrícula por municipios',
                titulo_leyenda='Municipios'),
            nombre_hijos='Estados')

# Elementos a mostrar en el layout del nodo estado, el cual contiene la
# información las regiones de Zacatecas
layout_estado = ElementosLayoutPrincipal(
    titulo='Matrícula por regiones',
    label_dropdown='Selecciona region:',
    boton_regresar=dbc.Button(
        ['Ver estado ', html.I(className="fas fa-minus")],
        type="button",
        style={
            "padding": "0.2rem",
            "margin": "0.2rem 0.2rem 0.2rem 0.2rem",
            "background": "#FF0055",
def cargar_contenido_reporte_individual(escuelas, cct):
    """
    Función que carga el contenido de un reporte individual.
    
    Args:   
        escuelas (:obj: `OrderedDict`): diccionario ordenado con los datos de las
            escuelas del reporte.
        cct (str): cct de la escuela a generar el reporte individual.

    Returns:
        Layout del reporte individual para mostrarlo en la plantilla del reporte.
    
    """
    # Gráficas del reporte
    scatterplot = GeneradorDeGraficas.generar_scatterplot(
        {cct: escuelas[cct]},
        show_legend=False,
        title=u"Proyección de matrícula de %s" % (cct))

    boxplot = GeneradorDeGraficas.generar_boxplot(
        {cct: escuelas[cct]},
        show_legend=False,
        title=u"Medidas de tendencia central (matrícula)")

    tabla_metricas = GeneradorDeGraficas.generar_tabla_metricas(
        {cct: escuelas[cct]}, links_requeridos=False)
    tabla_matricula = GeneradorDeGraficas.generar_tabla_matricula(
        {cct: escuelas[cct]}, links_requeridos=False)

    correlograma_acf = GeneradorDeGraficas.generar_correlograma(
        escuelas[cct]['matricula'], cct=cct, es_acf=True)

    # Nota (26/01/2021):
    # El cálculo del PACF implica tener control sobre el número de lags que tiene
    # la serie de tiempo. Se comentó el siguiente bloque de código para evitar
    # errores de ejecución.
    """
    correlograma_pacf = GeneradorDeGraficas.generar_correlograma(
        escuelas[cct]['matricula'],
        cct = cct,
        es_acf = False
    )
    """

    mapa = GeneradorDeGraficas.generar_mapa({cct: escuelas[cct]},
                                            titulo=u'Ubicación de %s' % (cct))

    # Crear layout de la página
    layout_reporte_individual = dbc.Container(
        [
            # Renglón de las tarjetas
            dbc.Row(
                [
                    # Layout del nombre de la escuela
                    dbc.Col(dbc.Card(dbc.CardBody(
                        dbc.Container(
                            dbc.Row([
                                dbc.Col([
                                    html.H6(u"Nombre de la escuela",
                                            className="card-title",
                                            style={"font-weight": "bold"}),
                                    html.P(escuelas[cct]["nombre"],
                                           className="card-text")
                                ],
                                        width=10,
                                        style={
                                            "margin": "0",
                                            "padding": "0"
                                        }),
                                dbc.Col(
                                    html.I(className="fas fa-user-circle"),
                                    width=2,
                                    style={
                                        "margin": "0",
                                        "padding": "0",
                                        "margin-top": "auto",
                                        "margin-bottom": "auto",
                                        "font-size": "2rem"
                                    },
                                    className="d-flex justify-content-center")
                            ]))),
                                     style={"margin-top": "1rem"}),
                            md=3),
                    # Layout de la clave del centro de trabajo
                    dbc.Col(dbc.Card(dbc.CardBody(
                        dbc.Container(
                            dbc.Row([
                                dbc.Col([
                                    html.H6(u"Clave del centro de trabajo",
                                            className="card-title",
                                            style={"font-weight": "bold"}),
                                    html.P(cct, className="card-text")
                                ],
                                        width=10,
                                        style={
                                            "margin": "0",
                                            "padding": "0"
                                        }),
                                dbc.Col(
                                    html.I(className="fas fa-graduation-cap"),
                                    width=2,
                                    style={
                                        "margin": "0",
                                        "padding": "0",
                                        "margin-top": "auto",
                                        "margin-bottom": "auto",
                                        "font-size": "2rem"
                                    },
                                    className="d-flex justify-content-center")
                            ]))),
                                     style={"margin-top": "1rem"}),
                            md=4),
                    # Layout del municipio
                    dbc.Col(dbc.Card(dbc.CardBody(
                        dbc.Container(
                            dbc.Row([
                                dbc.Col([
                                    html.H6(u"Municipio",
                                            className="card-title",
                                            style={"font-weight": "bold"}),
                                    html.P(escuelas[cct]["mun"],
                                           className="card-text")
                                ],
                                        width=10,
                                        style={
                                            "margin": "0",
                                            "padding": "0"
                                        }),
                                dbc.Col(
                                    html.I(className="fas fa-map-marker-alt"),
                                    width=2,
                                    style={
                                        "margin": "0",
                                        "padding": "0",
                                        "margin-top": "auto",
                                        "margin-bottom": "auto",
                                        "font-size": "2rem"
                                    },
                                    className="d-flex justify-content-center")
                            ]))),
                                     style={"margin-top": "1rem"}),
                            md=3),
                    # Layout del nivel
                    dbc.Col(dbc.Card(dbc.CardBody(
                        dbc.Container(
                            dbc.Row([
                                dbc.Col([
                                    html.H6(u"Nivel",
                                            className="card-title",
                                            style={"font-weight": "bold"}),
                                    html.P(escuelas[cct]["nivel"],
                                           className="card-text")
                                ],
                                        width=10,
                                        style={
                                            "margin": "0",
                                            "padding": "0"
                                        }),
                                dbc.Col(
                                    html.I(className="fas fa-book-reader"),
                                    width=2,
                                    style={
                                        "margin": "0",
                                        "padding": "0",
                                        "margin-top": "auto",
                                        "margin-bottom": "auto",
                                        "font-size": "2rem"
                                    },
                                    className="d-flex justify-content-center")
                            ]))),
                                     style={"margin-top": "1rem"}),
                            md=2)
                ], ),
            # Renglón del scatterplot
            dbc.Row(
                dbc.Col([
                    dcc.Graph(figure=scatterplot),
                    html.P(u"* Proyección realizada utilizando %s" %
                           (METODOS[escuelas[cct]['metodo']]),
                           className="text-secondary",
                           style={
                               "font-size": "0.5rem",
                               "margin": "0 0 0 4rem",
                               "padding": "0"
                           }),
                    html.P(u"* Fuente: estadística 911",
                           className="text-secondary",
                           style={
                               "font-size": "0.5rem",
                               "margin": "0 0 0 4rem",
                               "padding": "0"
                           })
                ],
                        md=12)),
            # Renglón del boxplot y el mapa
            dbc.Row([
                # Layout del boxplot
                dbc.Col(dcc.Graph(figure=boxplot), md=6),
                # Layout del mapa
                dbc.Col([dcc.Graph(figure=mapa)], md=6)
            ]),
            # Renglón con el correlograma
            dbc.Row(dbc.Col(dcc.Graph(figure=correlograma_acf), md=12)),
            # Renglón de las tablas de métricas y matrícula
            dbc.Row(
                [
                    # Layout de la tabla de matrícula
                    dbc.Col(
                        [
                            dbc.Container(
                                dbc.Row([
                                    html.H4(u"Matrícula por ciclo escolar"),
                                    dbc.Button(
                                        [
                                            u"Descargar csv ",
                                            html.I(
                                                className=
                                                "far fa-arrow-alt-circle-down")
                                        ],
                                        color="info",
                                        style={
                                            "padding": "0.2rem",
                                            "margin": "0 0.2rem 0.2rem 0.2rem",
                                            "background": "#1199EE"
                                        },
                                        id={
                                            'type':
                                            'boton-descargar-csv-individual',
                                            'index': cct
                                        }),
                                    Download(
                                        id={
                                            'type': 'descargar-csv-individual',
                                            'index': cct
                                        })
                                ])), tabla_matricula
                        ],
                        md=6,
                    ),
                    # Layout de la tabla de métricas
                    dbc.Col(
                        [
                            html.H4(u"Métricas de la proyección"),
                            tabla_metricas
                        ],
                        md=6,
                    )
                ], )
        ],
        # Estilos del layout general
        style={"background": "#FFFFFF"},
        fluid=True)
    return layout_reporte_individual