起点: 最初的系统功能基本,但代码存在重复,缺乏统一标准。我们从修复一个 xgboost_trainer.py 中的 NameError 开始。 核心工作: 统一工件保存: 将所有模型训练脚本 (xgboost, kan, tcn 等) 中保存模型和图表的逻辑进行了重构,提取到 server/utils/visualization.py 和 server/utils/model_manager.py 中,确保了所有训练器都遵循统一、健壮的模式。 修复绘图Bug: 修正了 visualization.py 中损失曲线图文件名生成不正确的bug,并更新了所有训练脚本以适应新的、更通用的 plot_loss_curve 函数。 第二阶段:数据库与API的现代化改造 问题: 原有的数据库设计过于简单,依赖文件名或复合键来识别模型,非常脆弱且难以扩展。 核心工作: 数据库重新设计: 在 server/api.py 中,我对数据库进行了彻底的重新设计。 废弃了旧的 model_versions 表,引入了新的 models 表,为每个模型实例分配一个唯一的 model_uid。此表现在存储了模型的全方位元数据,如类型、训练范围、参数、性能指标和工件路径。 重构了 prediction_history 表,使其通过 model_uid 与 models 表关联,并使用灵活的 JSON 字段(如 prediction_scope)来存储预测范围,以优雅地支持“按产品”、“按店铺”和“全局”等不同模式。 API大规模重构: 数据库的变更引发了对后端API的全面重构。 /api/models: 完全重写,以从新的 models 表中查询数据。 /api/prediction: 接口被简化,现在只接受一个核心参数 model_uid,而不是之前的一系列零散参数。 /api/prediction/history: 同样被重写以适应新的表结构。 第三阶段:前后端联调与Bug修复周期 问题: 后端的重大重构导致了前端功能失效,暴露出前后端接口定义不匹配的问题。 核心工作: 修复模型列表显示: 解决了因后端 /api/models 返回的JSON键与前端期望(product_name, store_name)不符,而导致的“药品名称”和“店铺名称”列为空的问题。 修复预测功能: 解决了因前端向 /api/prediction 发送旧格式的请求体而导致的“预测失败”问题。我修改了所有三个预测视图(ProductPredictionView.vue, StorePredictionView.vue, GlobalPredictionView.vue),使其发送后端现在需要的 model_uid。 修复UI视觉问题: 修复了预测按钮上的加载动画(spinner)失效的问题。原因是前端脚本逻辑中的键已更新为 model_uid,但模板中的 :loading 绑定仍错误地指向了旧的 model_id。 第四阶段:历史记录页面的最终完善 问题: 历史记录页面存在多个深层bug,包括列表为空、数据显示不正确以及筛选功能失效。 核心工作: 修复空列表: 解决了因后端 get_prediction_history 函数查询了不存在的数据库列而导致历史记录为空的问题。修复方案是改用 json_extract 函数来正确查询嵌套在JSON字段中的 product_id。 修正产品名称显示: 解决了列表中产品名称显示为内部标识符的bug。根据您的要求,我在不修改数据库记录的前提下,通过在后端读取数据时动态查询产品名并修正返回给前端的数据,解决了这个问题。 实现动态筛选下拉框: 解决了产品筛选下拉框为空的问题。根据您的最终指示,我修改了 HistoryView.vue,使其从返回的历史记录数据中动态提取唯一的产品列表来填充下拉框,移除了原有的独立API调用,使筛选功能更加智能和高效。
药店销售预测系统
这是一个基于多种深度学习模型的药店销售预测系统,支持多种时序预测模型,包括 Transformer、mLSTM、KAN 和 TCN。
功能特点
- 支持多种深度学习模型进行销量预测
- 提供命令行界面和API服务两种使用方式
- 支持模型训练、预测和评估
- 提供预测结果可视化和分析
- 支持模型比较和管理
项目结构
├── core/ # 核心模块
│ ├── __init__.py
│ ├── config.py # 全局配置参数
│ └── predictor.py # 核心预测器类
├── trainers/ # 模型训练器
│ ├── __init__.py
│ ├── mlstm_trainer.py # mLSTM模型训练函数
│ ├── kan_trainer.py # KAN模型训练函数
│ ├── tcn_trainer.py # TCN模型训练函数
│ └── transformer_trainer.py # Transformer模型训练函数
├── predictors/ # 预测模块
│ ├── __init__.py
│ └── model_predictor.py # 模型预测函数
├── analysis/ # 分析模块
│ ├── __init__.py
│ ├── metrics.py # 评估指标计算函数
│ ├── trend_analysis.py # 趋势分析函数
│ └── explanation.py # 预测解释函数
├── utils/ # 工具模块
│ ├── __init__.py
│ ├── data_utils.py # 数据处理工具函数
│ └── visualization.py # 可视化工具函数
├── models/ # 模型定义
│ ├── transformer_model.py
│ ├── mlstm_model.py
│ ├── kan_model.py
│ ├── tcn_model.py
│ └── optimized_kan_forecaster.py
├── pharmacy_predictor.py # 主接口文件
├── run_pharmacy_prediction.py # 命令行运行入口
├── api.py # API服务入口
└── pharmacy_sales.xlsx # 示例数据文件
支持的模型
- Transformer: 基于自注意力机制的时序预测模型
- mLSTM: 矩阵LSTM模型,结合了LSTM和Transformer的优点
- KAN: Kolmogorov-Arnold Network,一种基于柯尔莫哥洛夫-阿诺德定理的神经网络
- TCN: 时间卷积网络,使用因果卷积进行时序建模
- 优化版KAN: 经过优化的KAN模型,提高了预测精度和训练效率
使用方法
命令行界面
运行命令行界面:
python run_pharmacy_prediction.py
API服务
启动API服务:
python api.py
代码中使用
from pharmacy_predictor import PharmacyPredictor
# 创建预测器实例
predictor = PharmacyPredictor(data_path='pharmacy_sales.xlsx')
# 训练模型
metrics = predictor.train_model(product_id='P001', model_type='tcn', epochs=50)
# 使用模型预测
result = predictor.predict(product_id='P001', model_type='tcn', future_days=7, analyze_result=True)
依赖库
- PyTorch
- pandas
- numpy
- matplotlib
- scikit-learn
- Flask (用于API服务)
- pytorch-tcn (用于TCN模型)
Description
Languages
Python
73.3%
Vue
22%
HTML
1.8%
CSS
1.1%
Batchfile
0.8%
Other
1%