示例#1
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
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
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