- numpy
- pandas
Por favor, aguarde enquanto o programa carrega.
Nenhum dado é enviado. São apenas processados no seu próprio dispositivo.
A análise à creatinina na urina pode ser feita diretamente num laboratório. Deve custar pouco mais de 1€.
O diagnóstico é meramente demonstrativo do protocolo clínico, consulte um profissional.
No fim clique num botão para ficar com os dados para mostrar ao médico.
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
from datetime import date
from datetime import datetime
import time
import random
from js import alert, prompt, localStorage, window
def calculate_age(born):
today = date.today()
return today.year - born.year - ((today.month, today.day) < (born.month, born.day))
def status_urine(urine_output):
if urine_output < .5:
return -1 # low<
elif urine_output > 1.5:
return 1 # high
else:
return 0
def status_creatinine(value, dict_data):
if dict_data['sex'] == 'm':
if value < 0.74:
return -1
elif value > 1.35:
return 1
else:
return 0
elif dict_data['sex'] == 'f':
if value < 0.59:
return -1
elif value > 1.04:
return 1
else:
return 0
def AKI_type(dict_data):
dict_data['creatinine'].sort_values(by='date', ascending = True, inplace = True) #ascending -> oldest first
base_creatine = dict_data['creatinine']['value'].tolist()[0]
current_creatine = dict_data['creatinine']['value'].tolist()[-1]
creatine_change = current_creatine / base_creatine
age = calculate_age(dict_data['birthdate'])
if dict_data['sex'] == 'm':
eGFR_constant = 1.23
elif dict_data['sex'] == 'f':
eGFR_constant = 1.04
dict_data['weight'].sort_values(by='date', ascending = True, inplace = True) #ascending -> oldest first
weight = dict_data['weight']['value'].tolist()[-1]
eGFR = ( 140 - age ) * weight * eGFR_constant / dict_data['creatinine']['value'].tolist()[-1]*88.4
dict_data['urine_output'].sort_values(by='date', ascending = True, inplace = True) #ascending -> oldest first
urine_output = dict_data['urine_output']['value'].tolist()[-1]
if creatine_change >= 3 or current_creatine >= 4 or dict_data['hemodialysis'] == 1 or (age < 18 and eGFR < 35) or urine_output < .3:
return 3
elif (creatine_change >= 2 and creatine_change < 3) or urine_output < .5:
return 2
elif (creatine_change >= 1.5 and creatine_change < 2) or urine_output < .5: ## add or Increase of 0.3 mg/dL
return 1
else:
return 0
## general/personal and dataseries data in the same dict?
dict_data = {'creatinine': pd.DataFrame(columns=['date','value','units','status','condition_1']),
'birthdate': np.nan,
'sex': '',
'weight': pd.DataFrame(columns=['date','value','units','status','condition_1']),
'height': pd.DataFrame(columns=['date','value','units','status','condition_1']),
'hemodialysis': 0,
'urine_output': pd.DataFrame(columns=['date','value','units','status','condition_1']),
}
dict_data['sex'] = str(prompt('Sexo Masculino (m) ou Feminino (f)?\n')).lower()
weight = float(prompt('Peso (kg):\n'))
new_row = {'date': datetime.today().strftime('%Y-%m-%d'), 'value': weight, 'units': 'kg', 'status': '', 'condition_1': ''}
dict_data['weight'].loc[len(dict_data['weight'])] = new_row
# ou simplesmente usar algo já pré-formatado, tipo excel, etc.?
day = str(prompt('Data de nascimento (dia):\n'))
month = str(prompt('Data de nascimento (mês):\n'))
year = str(prompt('Data de nascimento (ano):\n'))
dict_data['birthdate'] = datetime.strptime(year + '-' + month + '-' + day, '%Y-%m-%d')
# we can put this inside a while loop to keep asking if the user has more data points
creatinine = float(prompt('Creatinina anterior do costume (mg/dL):\n'))
day = str(prompt('no Dia:\n'))
month = str(prompt('no Mês:\n'))
year = str(prompt('no Ano:\n'))
fulldate = year + '-' + month + '-' + day
new_row = {'date': fulldate, 'value': creatinine, 'units': 'mg/dL', 'status': status_creatinine(creatinine, dict_data), 'condition_1': ''}
dict_data['creatinine'].loc[len(dict_data['creatinine'])] = new_row
creatinine = float(prompt('Creatinina atual (mg/dL):\n'))
# assuming the analysis was today...
new_row = {'date': datetime.today().strftime('%Y-%m-%d'), 'value': creatinine, 'units': 'mg/dL', 'status': status_creatinine(creatinine, dict_data), 'condition_1': ''}
dict_data['creatinine'].loc[len(dict_data['creatinine'])] = new_row
hemodialysis = int(prompt('Fez hemodiálise? Sim (1) ou Não (0).'))
dict_data['hemodialysis'] = hemodialysis
urine_output = float(prompt('Urina nas últimas 6 horas (em Litros)\n')) # Na verdade, 6, 12, 24...
dict_data['creatinine'].sort_values(by='date', ascending = True, inplace = True) #ascending -> oldest first
weight = dict_data['weight']['value'].tolist()[-1]
urine_output = round(((1000*urine_output/6)/weight), 2)
new_row = {'date': datetime.today().strftime('%Y-%m-%d'), 'value': urine_output, 'units': 'mL/kg/h', 'status': status_urine(urine_output), 'condition_1': ''}
dict_data['urine_output'].loc[len(dict_data['urine_output'])] = new_row
#AKI
AKI_result = AKI_type(dict_data)
if AKI_type(dict_data) > 0:
print(f'Parece ter insuficiência renal de tipo {str(AKI_result)}.')
alert(f'Parece ter insuficiência renal de tipo {str(AKI_result)}.')
else:
print('Não parece ter insuficiência renal.')
alert('Não parece ter insuficiência renal.')
print('=========================')
#Cause type
age = calculate_age(dict_data['birthdate'])
print('Idade')
print(str(age))
print('=========================')
for i in dict_data:
if isinstance(dict_data[i], pd.core.frame.DataFrame):
if dict_data[i].empty != True:
print(i)
list2 = dict_data[i].columns.tolist()
row_width = 10
formatted_row = " | ".join("{:<{width}}".format(elem, width=row_width) for elem in list2)
print(formatted_row)
dict_data[i].sort_values(by='date', ascending = False, inplace = True)
#print instead of display?
for row in range(len(dict_data[i])):
list1 = dict_data[i].loc[row].tolist()
list2 = [str(list1[element]) for element in range(len(list1))]
formatted_row = " | ".join("{:<{width}}".format(elem, width=row_width) for elem in list2)
print(formatted_row)
print('=========================')
else:
print(i)
print(dict_data[i])
print('=========================')
Pdf do relatório
Ficheiro do relatório
Referências:
National Kidney Foundation. How to Classify CKD.
J. Larry Jameson, Joseph Loscalzo, Dan Longo, Dennis Kasper, Stephen Hauser e Anthony Fauci, Harrison'S Principles Of Internal Medicine, Twenty-First Edition (2022)
Agarwal R. Defining end-stage renal disease in clinical trials: a framework for adjudication. Nephrology Dialysis Transplantation. 2015; 31(6): p.864-867