增加主力选股批量分析
This commit is contained in:
@@ -0,0 +1,181 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
主力选股批量分析历史记录UI模块
|
||||
"""
|
||||
|
||||
import streamlit as st
|
||||
import pandas as pd
|
||||
from datetime import datetime
|
||||
from main_force_batch_db import batch_db
|
||||
|
||||
|
||||
def display_batch_history():
|
||||
"""显示批量分析历史记录"""
|
||||
|
||||
# 返回按钮
|
||||
col_back, col_stats = st.columns([1, 4])
|
||||
with col_back:
|
||||
if st.button("← 返回主页"):
|
||||
st.session_state.main_force_view_history = False
|
||||
st.rerun()
|
||||
|
||||
st.markdown("## 📚 主力选股批量分析历史记录")
|
||||
st.markdown("---")
|
||||
|
||||
# 获取统计信息
|
||||
try:
|
||||
stats = batch_db.get_statistics()
|
||||
|
||||
# 显示统计指标
|
||||
col1, col2, col3, col4, col5 = st.columns(5)
|
||||
with col1:
|
||||
st.metric("总记录数", f"{stats['total_records']} 条")
|
||||
with col2:
|
||||
st.metric("分析股票总数", f"{stats['total_stocks_analyzed']} 只")
|
||||
with col3:
|
||||
st.metric("成功分析", f"{stats['total_success']} 只")
|
||||
with col4:
|
||||
st.metric("成功率", f"{stats['success_rate']}%")
|
||||
with col5:
|
||||
st.metric("平均耗时", f"{stats['average_time']:.1f}秒")
|
||||
|
||||
st.markdown("---")
|
||||
|
||||
except Exception as e:
|
||||
st.warning(f"⚠️ 无法获取统计信息: {str(e)}")
|
||||
|
||||
# 获取历史记录
|
||||
try:
|
||||
history_records = batch_db.get_all_history(limit=50)
|
||||
|
||||
if not history_records:
|
||||
st.info("📝 暂无批量分析历史记录")
|
||||
return
|
||||
|
||||
st.markdown(f"### 📋 最近 {len(history_records)} 条记录")
|
||||
|
||||
# 显示每条记录
|
||||
for idx, record in enumerate(history_records):
|
||||
with st.expander(
|
||||
f"🔍 {record['analysis_date']} | "
|
||||
f"共{record['batch_count']}只 | "
|
||||
f"成功{record['success_count']}只 | "
|
||||
f"{record['analysis_mode']} | "
|
||||
f"耗时{record['total_time']/60:.1f}分钟",
|
||||
expanded=(idx == 0) # 第一条默认展开
|
||||
):
|
||||
# 记录基本信息
|
||||
col1, col2, col3, col4 = st.columns(4)
|
||||
with col1:
|
||||
st.write(f"**分析时间**: {record['analysis_date']}")
|
||||
with col2:
|
||||
st.write(f"**分析模式**: {record['analysis_mode']}")
|
||||
with col3:
|
||||
st.write(f"**总数**: {record['batch_count']} 只")
|
||||
with col4:
|
||||
st.write(f"**耗时**: {record['total_time']/60:.1f} 分钟")
|
||||
|
||||
col5, col6, col7, col8 = st.columns(4)
|
||||
with col5:
|
||||
st.metric("✅ 成功", record['success_count'])
|
||||
with col6:
|
||||
st.metric("❌ 失败", record['failed_count'])
|
||||
with col7:
|
||||
success_rate = (record['success_count'] / record['batch_count'] * 100) if record['batch_count'] > 0 else 0
|
||||
st.metric("成功率", f"{success_rate:.1f}%")
|
||||
with col8:
|
||||
avg_time = record['total_time'] / record['batch_count'] if record['batch_count'] > 0 else 0
|
||||
st.metric("平均耗时", f"{avg_time:.1f}秒")
|
||||
|
||||
st.markdown("---")
|
||||
|
||||
# 成功的股票
|
||||
results = record.get('results', [])
|
||||
success_results = [r for r in results if r.get('success', False)]
|
||||
failed_results = [r for r in results if not r.get('success', False)]
|
||||
|
||||
if success_results:
|
||||
st.markdown(f"#### ✅ 成功分析的股票 ({len(success_results)} 只)")
|
||||
|
||||
# 构建结果表格
|
||||
table_data = []
|
||||
for r in success_results:
|
||||
stock_info = r.get('stock_info', {})
|
||||
final_decision = r.get('final_decision', {})
|
||||
|
||||
table_data.append({
|
||||
'代码': r.get('symbol', 'N/A'),
|
||||
'名称': stock_info.get('name', stock_info.get('股票名称', 'N/A')),
|
||||
'评级': final_decision.get('rating', final_decision.get('investment_rating', 'N/A')),
|
||||
'信心度': f"{final_decision.get('confidence_level', 0)}%",
|
||||
'进场区间': final_decision.get('entry_range', 'N/A'),
|
||||
'止盈位': final_decision.get('take_profit', 'N/A'),
|
||||
'止损位': final_decision.get('stop_loss', 'N/A')
|
||||
})
|
||||
|
||||
df = pd.DataFrame(table_data)
|
||||
st.dataframe(df, use_container_width=True)
|
||||
|
||||
# 显示详细分析(可展开)
|
||||
with st.expander("📊 查看详细分析报告"):
|
||||
for r in success_results:
|
||||
stock_info = r.get('stock_info', {})
|
||||
final_decision = r.get('final_decision', {})
|
||||
|
||||
st.markdown(f"### {r.get('symbol', 'N/A')} - {stock_info.get('name', stock_info.get('股票名称', 'N/A'))}")
|
||||
|
||||
# 投资建议
|
||||
st.markdown("#### 💡 投资建议")
|
||||
st.write(final_decision.get('operation_advice', final_decision.get('investment_advice', '无')))
|
||||
|
||||
# 风险提示
|
||||
st.markdown("#### ⚠️ 风险提示")
|
||||
st.write(final_decision.get('risk_warning', '无'))
|
||||
|
||||
st.markdown("---")
|
||||
|
||||
# 失败的股票
|
||||
if failed_results:
|
||||
st.markdown(f"#### ❌ 分析失败的股票 ({len(failed_results)} 只)")
|
||||
|
||||
fail_data = []
|
||||
for r in failed_results:
|
||||
fail_data.append({
|
||||
'代码': r.get('symbol', 'N/A'),
|
||||
'错误原因': r.get('error', '未知错误')
|
||||
})
|
||||
|
||||
df_fail = pd.DataFrame(fail_data)
|
||||
st.dataframe(df_fail, use_container_width=True)
|
||||
|
||||
# 操作按钮
|
||||
col_del, col_reload = st.columns([1, 1])
|
||||
with col_del:
|
||||
if st.button(f"🗑️ 删除此记录", key=f"del_{record['id']}"):
|
||||
if batch_db.delete_record(record['id']):
|
||||
st.success("✅ 删除成功")
|
||||
st.rerun()
|
||||
else:
|
||||
st.error("❌ 删除失败")
|
||||
|
||||
with col_reload:
|
||||
if st.button(f"🔄 加载到当前结果", key=f"reload_{record['id']}"):
|
||||
# 将历史记录加载到session_state
|
||||
st.session_state.main_force_batch_results = {
|
||||
"results": record['results'],
|
||||
"total": record['batch_count'],
|
||||
"success": record['success_count'],
|
||||
"failed": record['failed_count'],
|
||||
"elapsed_time": record['total_time'],
|
||||
"analysis_mode": record['analysis_mode']
|
||||
}
|
||||
st.session_state.main_force_view_history = False
|
||||
st.success("✅ 已加载到当前结果,返回主页查看")
|
||||
st.rerun()
|
||||
|
||||
except Exception as e:
|
||||
st.error(f"❌ 获取历史记录失败: {str(e)}")
|
||||
import traceback
|
||||
st.code(traceback.format_exc())
|
||||
|
||||
Reference in New Issue
Block a user