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