sustituimos files para generar la gráfica de glucómetro/comida

estos archivos contenían por separado la info de las comidas de la app
y las de wapp, con formatos diferentes.

el archivo con comidas de la app tiene el mismo formato que la tabla
de comidas en clickhouse, así que esta sustitución fue directa.
la de las comidas de WAPP solo tenía las columnas de hora, pero fue
fácil sustituirla con los datos provenientes de clickhouse (este
último ya proporciona las comidas de las tres fuentes: app, WA,
recordatorios, así que, usando el mismo mecanismo que aprovechamos para
sustituir el file de WAPP por la respuesta de clickhouse, añadimos las
comidas de recordatorios.).
parent c13a7bd3
...@@ -11,10 +11,11 @@ from scipy import stats ...@@ -11,10 +11,11 @@ from scipy import stats
from ast import literal_eval from ast import literal_eval
from funciones_comidas import readGlucosa from funciones_comidas import readGlucosa
from funciones_comidas import readVisitas from funciones_comidas import readVisitas
import test_ch_2_b
import flask import flask
server = flask.Flask(__name__) server = flask.Flask(__name__)
def update_correlacion_macro_iauc(): def update_correlacion_macro_iauc():
...@@ -263,11 +264,25 @@ comidas = pd.read_csv("todos-foods.csv", usecols=["hc_total", "kcal_total", "fib ...@@ -263,11 +264,25 @@ comidas = pd.read_csv("todos-foods.csv", usecols=["hc_total", "kcal_total", "fib
comidas["foods"] = comidas["foods"].apply(literal_eval) comidas["foods"] = comidas["foods"].apply(literal_eval)
comidas = comidas[comidas["visita"] == "e1"] comidas = comidas[comidas["visita"] == "e1"]
comidas = comidas[comidas["hc_total"]>0] comidas = comidas[comidas["hc_total"]>0]
comidas.rename(columns={"glucosa_basal_area":"pre-AUC", "glucosa_estimulo_area":"post-AUC", "glucosa_area_efectiva":"iAUC"}, inplace=True) comidas.rename(columns={"glucosa_basal_area":"pre-AUC", "glucosa_estimulo_area":"post-AUC", "glucosa_area_efectiva":"iAUC"}, inplace=True)
comidas["iAUC"] = comidas["post-AUC"] - comidas["pre-AUC"] * 2 comidas["iAUC"] = comidas["post-AUC"] - comidas["pre-AUC"] * 2
df_total = pd.read_csv("test.csv")
# test.csv es el archivo que produce 'build_food_extended.py', es decir,
# una relación de las comidas reportadas en la app con todos sus datos: horas de reporte,
# hora de salto, hora de foto -cuando existe la foto- ticks/valores basales y postpandriales, etc.
# es justamente la info que se sube al clickhouse, por lo que sustituir una por otra no requiere ninguna
# ajuste en cuanto a las columnas. sin embargo, los renglones si deben revisarse porque clickhouse ahora tiene la
# salida de 'build_all_food_extended.py' que extiende el primero mencionado a las comidas de las otras dos fuentes:
# recordatorios y WA (y pronto a una cuarta fuente: alimentos controlados )
#df_total = pd.read_csv("test.csv")
df_total = test_ch_2_b.foods()
#df_total = df_total[df_total["etapas"] == "e1"] #df_total = df_total[df_total["etapas"] == "e1"]
id_patients = set(range(30,217)) id_patients = set(range(30,217))
ids_presentes = set(df_total['patient']) ids_presentes = set(df_total['patient'])
...@@ -276,9 +291,14 @@ df_total['FH_salto'] = pd.to_datetime(df_total['FH_salto']) ...@@ -276,9 +291,14 @@ df_total['FH_salto'] = pd.to_datetime(df_total['FH_salto'])
df_total['FH_reportada'] = pd.to_datetime(df_total['FH_reportada']) df_total['FH_reportada'] = pd.to_datetime(df_total['FH_reportada'])
df_total['FH_foto'] = pd.to_datetime(df_total['FH_foto']) df_total['FH_foto'] = pd.to_datetime(df_total['FH_foto'])
df_fotos = pd.read_csv("delasfotos.csv") # delasfotos es una archivo con los registros de las comidas reportadas por WA.
df_fotos['fecha_hora'] = pd.to_datetime(df_fotos['fecha_hora']) # este archivo solo contiene fecha de reporte (fecha de registro de la foto en WA) y su correspondiente salto asociado.
# df_foto se usa para desplegar los puntos en el glucómetro que corresponden a la hora reportada de las comidas reportadas por WA.
# justamente, la información que ya está incluida en los renglones que regresa clickhouse tiene que ver con
# los reportes de WA y entonces se puede generalizar .. por ejemplo, se podría poner que el tipo de punto desplegado dependa
# de la fuente
#df_fotos = pd.read_csv("delasfotos.csv")
#df_fotos['fecha_hora'] = pd.to_datetime(df_fotos['fecha_hora'])
external_stylesheets = [ external_stylesheets = [
{ {
"href": ( "href": (
...@@ -393,12 +413,12 @@ def update_graph(selected_pat, rango_str): ...@@ -393,12 +413,12 @@ def update_graph(selected_pat, rango_str):
return {} return {}
patient_foods = df_total.loc[df_total['patient'] == selected_pat] patient_foods = df_total.loc[df_total['patient'] == selected_pat]
patient_foods_app = patient_foods[patient_foods["Source"] == "app"]
patient_foods_Wapp = patient_foods[patient_foods["Source"] == "WA"]
patient_foods_recalls = patient_foods[patient_foods["Source"] == "Recalls"]
glucosa = readGlucosa(selected_pat) glucosa = readGlucosa(selected_pat)
#visita = readVisitas(1) #visita = readVisitas(1)
#fecha_visita1 = pd.to_datetime(visita.loc[visita['id'] == selected_pat, 'visit_date'].iloc[0]) #fecha_visita1 = pd.to_datetime(visita.loc[visita['id'] == selected_pat, 'visit_date'].iloc[0])
#patient_fotos = df_fotos.loc[(df_fotos['patient'] == selected_pat) & (df_fotos['fecha_hora'] < fecha_visita1 + pd.Timedelta(days=15))]
patient_fotos = df_fotos.loc[df_fotos['patient'] == selected_pat]
if glucosa.empty: if glucosa.empty:
return go.Figure() return go.Figure()
#filtered_glucosa = glucosa[(glucosa['date_time'] >= fecha_visita1) & #filtered_glucosa = glucosa[(glucosa['date_time'] >= fecha_visita1) &
...@@ -413,21 +433,24 @@ def update_graph(selected_pat, rango_str): ...@@ -413,21 +433,24 @@ def update_graph(selected_pat, rango_str):
mode='lines', mode='lines',
name='Glucosa del paciente')) name='Glucosa del paciente'))
fig.update_layout(yaxis=dict(range=[50,200])) fig.update_layout(yaxis=dict(range=[50,200]))
y_foods = np.interp(patient_foods['FH_reportada'], (glucosa['date_time']), glucosa['value']) # interpolar fecha de las comidas con glucosa y_foods = np.interp(patient_foods_app['FH_reportada'], (glucosa['date_time']), glucosa['value']) # interpolar fecha de las comidas con glucosa
distancias = abs((patient_foods['FH_salto'] - patient_foods['FH_reportada']).dt.total_seconds()) / 60 distancias = abs((patient_foods['FH_salto'] - patient_foods['FH_reportada']).dt.total_seconds()) / 60
distancias_df = pd.concat([distancias,patient_foods['FH_reportada'], patient_foods['FH_foto']], axis=1, ignore_index=True) distancias_df = pd.concat([distancias,patient_foods['FH_reportada'], patient_foods['FH_foto']], axis=1, ignore_index=True)
distancias_df.columns = ['Distancia','FH_reportada', 'FH_foto'] distancias_df.columns = ['Distancia','FH_reportada', 'FH_foto']
y_foto = np.interp(pd.to_numeric(patient_foods['FH_foto']), pd.to_numeric(glucosa['date_time']), # interpolar fecha de la foto con glucosa y_foto = np.interp(pd.to_numeric(patient_foods_app['FH_foto']), pd.to_numeric(glucosa['date_time']), # interpolar fecha de la foto con glucosa
glucosa['value']) glucosa['value'])
y_fotos_wpp = np.interp(pd.to_numeric(patient_fotos['fecha_hora']), pd.to_numeric(glucosa['date_time']), # interpolar fecha de la foto con glucosa y_fotos_wpp = np.interp(pd.to_numeric(patient_foods_Wapp['fecha_hora']), pd.to_numeric(glucosa['date_time']), # interpolar fecha de la foto con glucosa
glucosa['value']) glucosa['value'])
y_fotos_recalls = np.interp(pd.to_numeric(patient_foods_recalls['fecha_hora']), pd.to_numeric(glucosa['date_time']), # interpolar fecha de la foto con glucosa
glucosa['value'])
# valores del dropdown y separarlos para convertirlos en una lista # valores del dropdown y separarlos para convertirlos en una lista
if rango_str == '0': if rango_str == '0':
fig.add_trace(go.Scatter(x=patient_foods['FH_reportada'], y=y_foods, mode='markers', name = 'Comida completa', marker=dict(color='red', size=10))) fig.add_trace(go.Scatter(x=patient_foods_app['FH_reportada'], y=y_foods, mode='markers', name = 'Comida completa', marker=dict(color='red', size=10)))
fig.add_trace(go.Scatter(x=patient_foods['FH_foto'], y=y_foto, mode='markers', name = 'Foto app', marker=dict(color='yellow', size=8))) fig.add_trace(go.Scatter(x=patient_foods_app['FH_foto'], y=y_foto, mode='markers', name = 'Foto app', marker=dict(color='yellow', size=8)))
fig.add_trace(go.Scatter(x=patient_fotos['fecha_hora'], y=y_fotos_wpp, mode='markers', name = 'Foto whatsapp', marker=dict(color='purple', size=8))) fig.add_trace(go.Scatter(x=patient_foods_Wapp['fecha_hora'], y=y_fotos_wpp, mode='markers', name = 'Whatsapp', marker=dict(color='blue', size=8)))
fig.add_trace(go.Scatter(x=patient_foods_recalls['fecha_hora'], y=y_fotos_recalls, mode='markers', name = 'Recordatorios', marker=dict(color='purple', size=8)))
return fig return fig
elif rango_str == '[>120]': elif rango_str == '[>120]':
...@@ -447,10 +470,10 @@ def update_graph(selected_pat, rango_str): ...@@ -447,10 +470,10 @@ def update_graph(selected_pat, rango_str):
name='Comida completa', name='Comida completa',
marker=dict(color='red', size= 10))) marker=dict(color='red', size= 10)))
fig.add_trace(go.Scatter(x=fotos_wfoods.values, y=y_foto_wfood, mode='markers', name = 'Foto app', marker=dict(color='yellow', size=8))) fig.add_trace(go.Scatter(x=fotos_wfoods.values, y=y_foto_wfood, mode='markers', name = 'Foto app', marker=dict(color='yellow', size=8)))
fig.add_trace(go.Scatter(x=patient_fotos['fecha_hora'], y=y_fotos_wpp, mode='markers', name = 'Foto whatsapp', marker=dict(color='purple', size=8))) fig.add_trace(go.Scatter(x=patient_foods_Wapp['fecha_hora'], y=y_fotos_wpp, mode='markers', name = 'Foto whatsapp', marker=dict(color='purple', size=8)))
fig.update_layout(transition_duration=500) fig.update_layout(transition_duration=500)
return fig return fig
if __name__ == "__main__": if __name__ == "__main__":
app.run_server(debug=True, port=8051, host='0.0.0.0') app.run_server(debug=True, port=8051, host='0.0.0.0')
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment