giseldo's picture
Update app.py
48a5251 verified
import streamlit as st
import pandas as pd
import json
from pathlib import Path
import uuid
class ExpertSystem:
def __init__(self):
self.rules = []
self.variables = {}
self.conclusions = set()
def add_rule(self, conditions, conclusion, probability=1.0):
rule_id = str(uuid.uuid4())
self.rules.append({
'id': rule_id,
'conditions': conditions,
'conclusion': conclusion,
'probability': probability
})
self.conclusions.add(conclusion)
def evaluate(self, facts):
results = []
for rule in self.rules:
is_valid = True
for condition in rule['conditions']:
var, op, value = condition
if var not in facts:
is_valid = False
break
if op == '==' and facts[var] != value:
is_valid = False
elif op == '>' and facts[var] <= value:
is_valid = False
elif op == '<' and facts[var] >= value:
is_valid = False
if is_valid:
results.append({
'conclusion': rule['conclusion'],
'probability': rule['probability']
})
return results
def save(self, filename):
data = {
'rules': self.rules,
'variables': self.variables
}
with open(filename, 'w') as f:
json.dump(data, f)
def load(self, filename):
with open(filename, 'r') as f:
data = json.load(f)
self.rules = data['rules']
self.variables = data['variables']
self.conclusions = {rule['conclusion'] for rule in self.rules}
def main():
st.set_page_config(page_title="Neo Sistema Especialista", layout="wide")
if 'expert_system' not in st.session_state:
st.session_state.expert_system = ExpertSystem()
if 'current_facts' not in st.session_state:
st.session_state.current_facts = {}
st.title("Neo Sistema Especialista")
# Sidebar para navegação
menu = st.sidebar.selectbox(
"Menu",
["Base de Conhecimento", "Consulta", "Variáveis", "Carregar/Salvar"]
)
if menu == "Base de Conhecimento":
show_knowledge_base()
elif menu == "Consulta":
show_consultation()
elif menu == "Variáveis":
show_variables()
else:
show_save_load()
def show_knowledge_base():
st.header("Base de Conhecimento")
# Exibir regras existentes
st.subheader("Regras Existentes")
for i, rule in enumerate(st.session_state.expert_system.rules):
st.write(f"Regra {i + 1}:")
st.write(f"SE {' E '.join([f'{c[0]} {c[1]} {c[2]}' for c in rule['conditions']])}")
st.write(f"ENTÃO {rule['conclusion']} (Probabilidade: {rule['probability']})")
st.write("---")
# Adicionar nova regra
st.subheader("Adicionar Nova Regra")
with st.form("nova_regra"):
# Condições
st.write("Condições")
num_conditions = st.number_input("Número de condições", min_value=1, value=1)
conditions = []
for i in range(int(num_conditions)):
col1, col2, col3 = st.columns(3)
with col1:
var = st.text_input(f"Variável {i + 1}")
with col2:
op = st.selectbox(f"Operador {i + 1}", ["==", ">", "<"])
with col3:
val = st.text_input(f"Valor {i + 1}")
if var and val:
conditions.append((var, op, val))
# Conclusão
conclusion = st.text_input("Conclusão")
probability = st.slider("Probabilidade", 0.0, 1.0, 1.0)
if st.form_submit_button("Adicionar Regra"):
if conditions and conclusion:
st.session_state.expert_system.add_rule(conditions, conclusion, probability)
st.success("Regra adicionada com sucesso!")
else:
st.error("Preencha todos os campos necessários")
def show_consultation():
st.header("Consulta ao Sistema Especialista")
# Interface para inserir fatos
st.subheader("Inserir Fatos")
with st.form("consulta"):
facts = {}
variables = set()
for rule in st.session_state.expert_system.rules:
for condition in rule['conditions']:
variables.add(condition[0])
for var in variables:
value = st.text_input(f"Valor para {var}")
if value:
facts[var] = value
if st.form_submit_button("Consultar"):
if facts:
results = st.session_state.expert_system.evaluate(facts)
st.session_state.current_facts = facts
if results:
st.success("Resultados encontrados!")
for result in results:
st.write(f"Conclusão: {result['conclusion']}")
st.write(f"Probabilidade: {result['probability']:.2%}")
else:
st.warning("Nenhuma conclusão encontrada para os fatos fornecidos.")
else:
st.error("Insira pelo menos um fato para consulta")
def show_variables():
st.header("Variáveis do Sistema")
# Exibir variáveis existentes
variables = set()
for rule in st.session_state.expert_system.rules:
for condition in rule['conditions']:
variables.add(condition[0])
st.subheader("Variáveis Utilizadas")
for var in variables:
st.write(f"- {var}")
def show_save_load():
st.header("Carregar/Salvar Base de Conhecimento")
col1, col2 = st.columns(2)
with col1:
st.subheader("Salvar Base")
filename = st.text_input("Nome do arquivo para salvar", "base_conhecimento.json")
if st.button("Salvar"):
try:
st.session_state.expert_system.save(filename)
st.success(f"Base de conhecimento salva em {filename}")
except Exception as e:
st.error(f"Erro ao salvar: {str(e)}")
with col2:
st.subheader("Carregar Base")
uploaded_file = st.file_uploader("Escolha um arquivo .json", type="json")
if uploaded_file is not None:
try:
# Salvar o arquivo temporariamente
temp_path = Path("temp.json")
temp_path.write_bytes(uploaded_file.getvalue())
st.session_state.expert_system.load(temp_path)
temp_path.unlink() # Remover arquivo temporário
st.success("Base de conhecimento carregada com sucesso!")
except Exception as e:
st.error(f"Erro ao carregar: {str(e)}")
if __name__ == "__main__":
main()