1. 项目背景与核心价值
去年帮某中药连锁企业做库存优化时,发现他们每月因滞销报废的药材成本高达37万元。这促使我开发了这套融合Django与大数据的预测系统,上线后首次季度报显示损耗率直接下降了62%。这个系统最核心的价值在于:用算法预测代替人工经验,让每克黄芪、当归都能在最佳时效内找到买家。
传统药材销售面临三个典型痛点:
- 季节性波动剧烈(如夏季凉性药材需求激增)
- 保质期敏感(多数药材有效成分半衰期仅12-18个月)
- 价格受产地气候和政策影响大
本系统通过爬取全国17个药材市场的交易数据,结合企业自身销售记录,用LSTM神经网络构建预测模型。在Web端不仅提供可视化看板,还能模拟"如果下月降雨量增加20%,茯苓库存该如何调整"等场景。
2. 系统架构设计
2.1 技术栈选型依据
选择Django作为后端框架,主要考虑三个实际因素:
- ORM对多数据源支持良好(需同时连接企业ERP、爬虫数据库和气象API)
- 内置Admin适合快速构建数据管理后台(药材属性字段多达43个)
- 与PySpark的兼容性测试中,Django-REST-framework的吞吐量比Flask高22%
大数据处理环节的对比测试:
| 方案 | 10万条数据处理耗时 | 内存占用 | 适合场景 |
|---|---|---|---|
| Pandas | 8.7s | 1.2GB | 单机小批量数据 |
| Dask | 5.2s | 680MB | 中型数据集并行处理 |
| PySpark | 3.9s | 2.1GB | 分布式超大规模数据 |
最终选择PySpark+Dask组合方案,日常预测用Dask,月底全量计算启用Spark集群。
2.2 数据流设计
系统数据处理包含6个关键环节:
- 数据采集层:Scrapy爬虫每日抓取药通网、天地网等平台价格数据
- 数据清洗层:用OpenRefine处理药材别名标准化(如"黄芪"与"黄耆"统一)
- 特征工程:提取24个关键特征,包括:
- 气候因子(产地近30日降雨量)
- 政策因子(医保目录调整标志)
- 市场因子(同类药材价格波动率)
- 模型训练:基于Keras的Attention-LSTM网络
- 预测服务:用Celery实现异步预测任务队列
- 可视化:ECharts实现供需关系热力图
关键技巧:在MongoDB中建立药材别名映射表,解决不同数据源命名不一致问题
3. 核心算法实现
3.1 预测模型构建
药材销售预测本质是多元时间序列问题,采用Attention-LSTM网络结构:
class SalesPredictor(Model): def __init__(self, time_steps=30, features=24): super().__init__() self.lstm1 = LSTM(128, return_sequences=True) self.attention = AttentionLayer() # 自定义注意力层 self.lstm2 = LSTM(64) self.dense = Dense(1) def call(self, inputs): x = self.lstm1(inputs) x = self.attention(x) x = self.lstm2(x) return self.dense(x)模型训练中的关键参数:
- 滑动窗口大小:经测试30天窗口在准确率和计算成本间取得平衡
- 损失函数:采用Huber损失,对异常值鲁棒性比MSE提高40%
- 评估指标:自定义加权准确率,旺季预测权重是淡季的1.8倍
3.2 可视化设计原则
针对不同角色设计差异化视图:
采购经理看板
- 气泡图:X轴为库存周转率,Y轴为毛利率,气泡大小表示需求预测值
- 预警区:设置库存红线(如当归超过90天库存量变红)
门店运营看板
- 地理热力图:各区域畅销药材TOP3
- 关联推荐:"买了茯苓的顾客也买..."(基于Apriori算法)
4. 工程化落地难点
4.1 数据质量治理
遇到的典型数据问题及解决方案:
| 问题类型 | 出现频率 | 解决方案 |
|---|---|---|
| 单位不统一 | 23% | 建立标准计量单位库 |
| 产地信息缺失 | 17% | 根据供应商信息反向补全 |
| 异常价格波动 | 9% | 基于箱线图原理设计过滤规则 |
4.2 性能优化实践
在预测接口优化过程中,通过三种方案对比:
原始方案:每次请求重新加载模型
- 平均响应时间:2.3s
- 内存占用:1.4GB
优化方案一:模型常驻内存
- 响应时间:1.1s
- 内存占用:2.7GB
最终方案:使用TensorFlow Serving
- 响应时间:0.4s
- 内存占用:1.9GB
踩坑记录:Django的同步特性会导致TensorFlow Serving阻塞,必须配置ASGI服务器(Daphne)
5. 项目部署指南
5.1 环境配置建议
生产环境推荐配置:
- 数据库:PostgreSQL 14 + TimescaleDB(用于存储时间序列数据)
- 缓存:Redis 6.2(缓存气象数据和近期预测结果)
- 服务器:4核8G配置(实测可支撑日均50万次预测请求)
关键依赖版本锁定:
django==3.2.16 pyspark==3.3.1 tensorflow==2.10.0 # 必须用此版本避免CUDA兼容问题5.2 监控方案设计
使用Prometheus+Grafana监控三项核心指标:
- 数据新鲜度:最后成功爬取时间戳
- 预测偏差率:实际销量与预测值的差异
- 资源水位:GPU显存占用率告警阈值设为80%
6. 实际应用案例
某省级药材公司应用效果:
| 指标 | 上线前 | 上线6个月后 | 改善幅度 |
|---|---|---|---|
| 库存周转天数 | 87天 | 53天 | -39% |
| 滞销损耗率 | 6.2% | 2.3% | -63% |
| 采购决策时效 | 3.5天 | 1.2天 | -66% |
典型预测场景示例:
- 当云南产区出现持续干旱时,系统提前2周预警三七价格波动
- 根据疫情防控政策变化,准确预测连花清瘟胶囊原料需求激增
7. 扩展优化方向
- 供应链协同:接入物流数据预测到货时间
- 质量预测:结合药材检测报告预测有效成分含量变化
- 动态定价:根据预测结果自动生成促销策略
在最近一次迭代中,我们加入了气候变化长期预测模块。通过将NOAA的气候模型输出作为特征,现在可以提前6个月预测厄尔尼诺现象对特定药材产量的影响。这个功能让采购总监在年度预算会上有了十足底气——毕竟算法已经告诉我们,明年川贝母的收购价很可能会上涨25%以上。