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
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_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