CoolFace
Apppublic

gaazedo/Tracker

sourceHugging Faceupdated 2y agoView on Hugging Face
1likes
app.py183 linesDownload Raw Back to root
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()