AutoSTAT / workflow /modeling /modeling_render.py
ElvisWang111's picture
Update workflow/modeling/modeling_render.py
a38eb92 verified
import streamlit as st
import streamlit_antd_components as sac
from streamlit_ace import st_ace
from utils.sanitize_code import sanitize_code
from workflow.modeling.model_training import train_execution, modeling_code_gen, train_download_model
from workflow.modeling.model_inference import infer_load_data, infer_execution
from workflow.preprocessing.preprocessing_core import prep_meta_execution
def modeling_quick_actions(agent):
st.write("选择一个或多个model:")
selected_models = sac.chip(
items=[
sac.ChipItem(label='线性回归'),
sac.ChipItem(label='XGBoost'),
sac.ChipItem(label='随机森林'),
sac.ChipItem(label='神经网络'),
], index=[0, 2], align='center', radius='md', color='#44658C', multiple=True
)
df = agent.load_df()
if st.button("🖋️ 快速建模"):
if not selected_models:
st.error("请先选择训练model。")
else:
with st.spinner("建模 Agent 正在生成训练脚本..."):
raw = agent.code_generation(df.head().to_string(), selected_models)
code = sanitize_code(raw)
agent.save_code(code)
agent.save_suggestion(selected_models)
agent.save_user_selection(selected_models)
st.success("训练脚本已生成并保存。")
st.rerun()
return selected_models
def modeling_execution(agent, auto = False) -> None:
code = agent.load_code()
edited = st_ace(
value=code,
height=450,
theme="tomorrow_night",
language="python",
auto_update=True
)
not_executed = agent.load_modeling_result() == None
if edited is not None:
if st.button("▶️ 执行建模", key="modeling_run_code") or (auto and not_executed):
code = sanitize_code(edited)
agent.save_code(code)
train_execution(agent)
agent.finish_auto()
st.rerun()
modeling_result = agent.load_modeling_result()
if modeling_result is None:
result_expand = False
else:
result_expand = True
train_download_model(agent)
with st.expander("训练结果", result_expand):
if modeling_result:
st.subheader("训练结果")
try:
st.markdown(modeling_result)
except Exception:
st.write(modeling_result)
def modeling_inference(agent, preproc_agent):
infer_load_data(agent)
inference_processed_data = agent.load_inference_processed_df()
inference_data = agent.load_inference_data()
code = agent.load_inference_code()
if st.button("▶️ 执行推断"):
with st.spinner("正在对推理数据进行预处理..."):
inference_data = agent.load_inference_data()
if preproc_agent.code is not None:
inference_processed_df = prep_meta_execution(preproc_agent, preproc_agent.code, inference_data)
inference_data = inference_processed_df
agent.save_inference_processed_df(inference_data)
st.write("推断数据预览:")
st.dataframe(inference_data.head())
with st.spinner("建模 Agent 正在生成推理脚本..."):
raw = agent.code_generation_for_inference(agent.load_code(), inference_data.head())
code = sanitize_code(raw)
agent.save_inference_code(code)
if code is not None:
edited_code = st_ace(
value=code,
height=450,
theme="tomorrow_night",
language="python",
auto_update=True
)
agent.save_inference_code(code)
if st.button("▶️ 执行建模"):
infer_execution(agent)
def modeling_chat(agent, auto) -> None:
user_input = st.text_input("建模目标", "默认")
agent.save_target(user_input)
with st.chat_message("assistant"):
st.write(
"我是 Autostat 数据分析助手,很高兴为您服务!\n\n"
"您可以在下方输入建模相关问题,或直接点击按钮获取建模建议。"
)
c = st.columns(2)
with c[0]:
analyze_btn = st.button("🔍 建模推荐", key='modeling_suggest', use_container_width=True)
with c[1]:
clear_modeling_suggest = st.button("♻️ 清除建模分析", key='clear_modeling_suggest', use_container_width=True)
if clear_modeling_suggest:
agent.clear_memory()
agent.suggestion = None
chat_history = agent.load_memory()
for idx, entry in enumerate(chat_history):
bubble = st.chat_message(entry["role"])
content = entry["content"]
if isinstance(content, str):
bubble.write(content)
already_generated = any(
entry["role"] == "assistant" and "模" in str(entry["content"])
for entry in chat_history
)
if analyze_btn or (auto and not already_generated):
st.chat_message("user").write("请帮我获取建模建议")
agent.add_memory({"role": "user", "content": "请帮我获取建模建议"})
with st.spinner("分析中..."):
suggestion = agent.get_model_suggestion()
agent.save_suggestion(suggestion)
agent.refine_suggestions()
st.chat_message("assistant").write(suggestion)
agent.add_memory({"role": "assistant", "content": suggestion})
st.chat_message("assistant").write("需要进一步优化?再次点击按钮获取下一条建议")
agent.add_memory({"role": "assistant", "content": "需要进一步优化?再次点击按钮获取下一条建议"})
user_input = st.chat_input("请输入您的问题,例如“如何优化这个模型”")
if user_input:
st.chat_message("user").write(user_input)
agent.add_memory({"role": "user", "content": user_input})
with st.spinner("处理中…"):
reply = agent.get_model_suggestion(user_input)
agent.save_suggestion(reply)
agent.refine_suggestions()
st.chat_message("assistant").write(reply)
agent.add_memory({"role": "assistant", "content": reply})
st.chat_message("assistant").write("需要进一步优化?再次点击按钮获取下一条建议")
agent.add_memory({"role": "assistant", "content": "需要进一步优化?再次点击按钮获取下一条建议"})
if __name__ == "__main__":
st.title("数据建模")
st.markdown("---")
preproc_agent = st.session_state.data_preprocess_agent
load_agent = st.session_state.data_loading_agent
processed_df = preproc_agent.load_processed_df()
if processed_df is None:
df = load_agent.load_df()
else:
df = processed_df
if df is None:
st.warning("⚠️ 请先在数据导入页面加载数据")
st.stop()
agent = st.session_state.modeling_coding_agent
agent.add_df(df)
planner = st.session_state.planner_agent
auto = planner.modeling_auto
if st.session_state.auto_mode == True:
if (agent.finish_auto_task == True and planner.switched_modeling == False) or planner.modeling_auto == False:
planner.finish_modeling_auto()
st.switch_page("workflow/report/report_render.py")
code = agent.load_code()
if code is None:
expand = False
else:
expand = True
inference_model = agent.load_best_model()
if inference_model is None:
inference_expand = False
else:
inference_expand = True
c = st.columns(2)
with c[0].expander('快速建模', True):
modeling_quick_actions(agent)
with c[1].expander('建模建议', True):
modeling_chat(agent, auto)
modeling_code_gen(agent, auto=auto)
with c[0].expander('建模执行', expand):
modeling_execution(agent, auto)
# with c[0].expander('推断分析', inference_expand):
# modeling_inference(agent, preproc_agent)