gaazedo/Tracker
1
1import streamlit as st2import pandas as pd3import matplotlib.pyplot as plt4import sqlite35import datetime6 7# Função para conectar ao banco de dados8def get_db_connection():9 conn = sqlite3.connect("corrida.db")10 conn.row_factory = sqlite3.Row11 return conn12 13# Função para criar tabelas14def create_tables():15 conn = get_db_connection()16 cursor = conn.cursor()17 cursor.execute("""18 CREATE TABLE IF NOT EXISTS treinos (19 id INTEGER PRIMARY KEY AUTOINCREMENT,20 usuario TEXT,21 data TEXT,22 distancia REAL,23 tempo REAL,24 pace REAL,25 fc_media INTEGER,26 cadencia INTEGER27 )28 """)29 cursor.execute("""30 CREATE TABLE IF NOT EXISTS metas (31 usuario TEXT PRIMARY KEY,32 meta_distancia REAL,33 meta_tempo REAL,34 meta_fc INTEGER,35 data_prova_alvo TEXT36 )37 """)38 conn.commit()39 conn.close()40 41# Função para salvar treino42def save_training(usuario, data_treino, distancia, tempo, fc_media, cadencia):43 conn = get_db_connection()44 cursor = conn.cursor()45 pace = tempo / distancia if distancia > 0 else 046 cursor.execute("""47 INSERT INTO treinos (usuario, data, distancia, tempo, pace, fc_media, cadencia)48 VALUES (?, ?, ?, ?, ?, ?, ?)49 """, (usuario, data_treino, distancia, tempo, pace, fc_media, cadencia))50 conn.commit()51 conn.close()52 53# Função para salvar metas54def save_goals(usuario, meta_distancia, meta_tempo, meta_fc, data_prova_alvo):55 conn = get_db_connection()56 cursor = conn.cursor()57 cursor.execute("""58 INSERT OR REPLACE INTO metas (usuario, meta_distancia, meta_tempo, meta_fc, data_prova_alvo)59 VALUES (?, ?, ?, ?, ?)60 """, (usuario, meta_distancia, meta_tempo, meta_fc, data_prova_alvo))61 conn.commit()62 conn.close()63 64# Função para carregar metas65def load_goals(usuario):66 conn = get_db_connection()67 cursor = conn.cursor()68 cursor.execute("SELECT * FROM metas WHERE usuario = ?", (usuario,))69 goals = cursor.fetchone()70 conn.close()71 return goals72 73# Função para carregar treinos74def load_trainings(usuario):75 conn = get_db_connection()76 df = pd.read_sql("SELECT * FROM treinos WHERE usuario = ?", conn, params=(usuario,))77 conn.close()78 return df79 80# Função para deletar treinos81def delete_trainings(usuario):82 conn = get_db_connection()83 cursor = conn.cursor()84 cursor.execute("DELETE FROM treinos WHERE usuario = ?", (usuario,))85 conn.commit()86 conn.close()87 88# Interface do usuário89def main():90 st.title("Rastreador de Performance na Corrida")91 92 # Seção de seleção/criação de usuário93 st.sidebar.subheader("Escolha ou crie seu perfil")94 usuario = st.sidebar.text_input("Nome do usuário:", value="Atleta1")95 96 # Seção de definição de metas97 st.sidebar.subheader("Defina suas metas")98 meta_distancia = st.sidebar.number_input("Meta de distância (km):", min_value=1.0, value=5.0)99 meta_tempo = st.sidebar.number_input("Meta de tempo (min):", min_value=1.0, value=30.0)100 meta_fc = st.sidebar.number_input("Meta de frequência cardíaca (bpm):", min_value=50, max_value=200, value=150)101 data_prova_alvo = st.sidebar.date_input("Data da prova alvo:", datetime.date.today())102 103 if st.sidebar.button("Salvar Metas"):104 save_goals(usuario, meta_distancia, meta_tempo, meta_fc, data_prova_alvo)105 st.sidebar.success("Metas salvas com sucesso!")106 107 # Seção de registro de treino manual108 st.subheader("Registre seu treino")109 data_treino = st.date_input("Data do treino:", datetime.date.today())110 distancia = st.number_input("Distância (km):", min_value=0.1, value=5.0, step=0.1)111 tempo = st.number_input("Tempo (min):", min_value=1.0, value=30.0, step=0.1)112 fc_media = st.number_input("Frequência cardíaca média (bpm):", min_value=50, max_value=200, value=150)113 cadencia = st.number_input("Cadência (passos por minuto):", min_value=120, max_value=200, value=170)114 115 if st.button("Salvar treino"):116 save_training(usuario, data_treino, distancia, tempo, fc_media, cadencia)117 st.success("Treino salvo com sucesso!")118 119 # Seção de análise de dados120 st.subheader(f"Análise de dados de {usuario}")121 df = load_trainings(usuario)122 123 if not df.empty:124 df["data"] = pd.to_datetime(df["data"])125 df = df.sort_values("data")126 127 # Gráfico de evolução do pace128 plt.figure(figsize=(10, 4))129 plt.plot(df["data"], df["pace"], marker="o", linestyle="-", label="Pace")130 plt.axhline(y=meta_tempo / meta_distancia, color="r", linestyle="--", label="Meta Pace")131 plt.xlabel("Data")132 plt.ylabel("Pace (min/km)")133 plt.legend()134 st.pyplot(plt)135 136 # Gráfico de evolução da frequência cardíaca137 plt.figure(figsize=(10, 4))138 plt.plot(df["data"], df["fc_media"], marker="o", linestyle="-", label="FC Média")139 plt.axhline(y=meta_fc, color="r", linestyle="--", label="Meta FC")140 plt.xlabel("Data")141 plt.ylabel("Frequência Cardíaca Média")142 plt.legend()143 st.pyplot(plt)144 145 # Tabela de dados146 st.write("## Histórico de Treinos")147 st.dataframe(df[["data", "distancia", "tempo", "pace", "fc_media", "cadencia"]])148 149 # Botão para apagar histórico de treinos150 if st.button("Apagar histórico de treinos"):151 delete_trainings(usuario)152 st.warning("Histórico de treinos apagado!")153 154 # Análise de alcance de metas155 hoje = datetime.date.today()156 dias_para_prova = (data_prova_alvo - hoje).days157 158 if dias_para_prova > 0:159 st.write(f"Faltam {dias_para_prova} dias para a prova alvo.")160 161 # Estimativa de pace na prova162 pace_medio_treinos = df["pace"].mean()163 pace_estimado_prova = pace_medio_treinos * 1.1 # Adiciona 10% de margem de segurança164 165 # Estimativa de tempo na prova166 tempo_estimado_prova = pace_estimado_prova * meta_distancia167 168 st.write(f"Seu pace estimado na prova será de {pace_estimado_prova:.2f} min/km.")169 st.write(f"Seu tempo estimado na prova será de {tempo_estimado_prova:.2f} min.")170 171 if tempo_estimado_prova <= meta_tempo:172 st.write("Você está dentro do esperado para atingir sua meta de tempo na prova!")173 else:174 st.write("Você precisa melhorar seu pace para atingir sua meta de tempo na prova.")175 else:176 st.write("A data da prova alvo já passou.")177 178 else:179 st.write("Nenhum treino registrado ainda. Comece adicionando seus dados!")180 181if __name__ == "__main__":182 create_tables()183 main()