1. 项目背景与核心价值
淘宝作为国内最大的电商平台之一,其商品销售数据蕴含着丰富的市场信息。对于园艺植物这类季节性商品,销售预测能够帮助商家优化库存管理、制定营销策略。这个毕设项目通过Python技术栈实现了一个完整的解决方案闭环:从数据采集(爬虫)、存储(MySQL)、分析预测到可视化展示。
我在实际园艺电商数据分析工作中发现,月季和玫瑰这类观赏植物的销售具有明显的季节性波动,且受节日(如情人节、母亲节)影响极大。传统的人工预估方式误差率通常在30%以上,而基于历史数据的预测模型能将误差控制在10%以内。这也是为什么这类销售预测系统在实际商业环境中越来越受重视。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 技术选型分析
整个系统采用经典的ETL(Extract-Transform-Load)架构:
-
数据采集层:使用Scrapy+selenium组合
- Scrapy负责基础页面抓取
- Selenium处理淘宝的动态加载和反爬机制
- 实测下来,需要设置2-3秒的请求间隔以避免封禁
-
数据存储层:MySQL 8.0
- 采用星型模型设计:事实表(销售记录)+维度表(商品、店铺、时间)
- 建立了日期、商品ID、店铺ID的联合索引提升查询效率
-
分析预测层:
- 传统时序模型:Prophet(适合季节性预测)
- 机器学习方案:XGBoost+LSTM组合模型
- 特征工程包括:历史销量、价格波动、促销标记、节假日标记等
-
可视化层:
- 主仪表盘:Pyecharts
- 大屏展示:阿里云DataV(毕业答辩时效果很震撼)
- 移动端适配:Flask+响应式布局
2.2 数据库设计要点
商品表(products)核心字段:
sql复制CREATE TABLE `products` (
`product_id` varchar(20) NOT NULL COMMENT '淘宝商品ID',
`title` varchar(200) DEFAULT NULL COMMENT '商品标题',
`category` enum('rose','peony','other') DEFAULT NULL COMMENT '品类',
`price` decimal(10,2) DEFAULT NULL COMMENT '当前价格',
`monthly_sales` int(11) DEFAULT NULL COMMENT '月销量',
`shop_id` varchar(20) DEFAULT NULL COMMENT '店铺ID',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`product_id`),
KEY `idx_category` (`category`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
销售记录表(sales)的特殊处理:
- 采用分区表按月份存储
- 建立了触发器自动更新商品表的月销量字段
- 添加了is_promotion标记区分日常销售和促销期
3. 爬虫实现关键技巧
3.1 突破淘宝反爬策略
经过多次测试,发现淘宝的反爬主要基于:
- 请求频率检测(需设置随机延迟)
- 行为轨迹分析(模拟人工浏览路径)
- 登录态验证(需要维持cookie)
解决方案:
python复制class TaobaoSpider(scrapy.Spider):
def start_requests(self):
# 先访问首页获取基础cookie
yield scrapy.Request('https://www.taobao.com',
callback=self.parse_home,
meta={'dont_merge_cookies': True})
def parse_home(self, response):
# 模拟人工浏览行为
yield Request('https://s.taobao.com/search?q=玫瑰',
callback=self.parse_search,
headers=self.gen_headers(),
priority=1)
def gen_headers(self):
return {
'User-Agent': random.choice(USER_AGENTS),
'Referer': 'https://www.taobao.com/',
'Accept-Language': 'zh-CN,zh;q=0.9'
}
3.2 数据清洗的坑
原始数据常见问题:
- 价格显示"¥XX起" - 需要用正则提取数字部分
- 销量显示"1万+" - 需要转换为10000
- 商品标题含大量emoji和特殊符号 - 需要统一清洗
处理代码示例:
python复制def clean_price(price_str):
if not price_str:
return 0.0
# 处理"¥128.00起"情况
match = re.search(r'[\d\.]+', price_str)
return float(match.group()) if match else 0.0
def clean_sales(sales_str):
units = {'万': 10000, '千': 1000}
if '万' in sales_str:
return int(float(sales_str.replace('万+','')) * units['万'])
# 其他转换逻辑...
4. 预测模型构建
4.1 特征工程
构建的特征矩阵包括:
- 基础特征:历史30天销量、价格、收藏量
- 衍生特征:
- 周同比变化率
- 移动平均线(3日/7日)
- 节假日倒计时(距离情人节还有N天)
- 外部特征:
- 天气数据(通过API获取)
- 竞品价格波动
4.2 Prophet模型调优
Facebook Prophet对季节性数据表现良好,但需要特别注意:
python复制model = Prophet(
yearly_seasonality=True,
weekly_seasonality=True,
holidays=holidays_df,
changepoint_prior_scale=0.05, # 调整趋势敏感度
seasonality_prior_scale=10.0 # 加强季节效应
)
# 添加特殊日期(如情人节)
model.add_country_holidays(country_name='CN')
4.3 模型融合策略
采用加权融合提升鲁棒性:
- Prophet:60%权重,擅长捕捉季节趋势
- XGBoost:25%权重,处理特征交互
- LSTM:15%权重,捕捉长期依赖
融合代码:
python复制def ensemble_predict(models, X):
prophet_pred = models['prophet'].predict(X)
xgb_pred = models['xgb'].predict(X)
lstm_pred = models['lstm'].predict(X.reshape(-1,30,1))
return 0.6*prophet_pred + 0.25*xgb_pred + 0.15*lstm_pred
5. 可视化系统实现
5.1 Pyecharts高级技巧
动态数据更新的实现方案:
python复制from pyecharts.charts import Line
from pyecharts import options as opts
timeline = Timeline()
for month in range(1, 13):
line = (
Line()
.add_xaxis(date_list)
.add_yaxis("预测销量", forecast_data[month-1])
.set_global_opts(title_opts=opts.TitleOpts(title=f"{month}月销售预测"))
)
timeline.add(line, time_point=f"{month}月")
timeline.add_schema(
play_interval=1000,
is_timeline_show=True,
is_auto_play=True
)
5.2 大屏布局经验
答辩时验证过的最佳实践:
- 核心指标置顶:预测准确率、预期GMV、热销品类
- 中间主视觉:销售趋势对比图(实际vs预测)
- 底部布局:
- 左侧:地域分布热力图
- 中部:价格带分布雷达图
- 右侧:TOP10单品排行榜
CSS优化技巧:
css复制.grid-container {
display: grid;
grid-template-rows: 100px 1fr 300px;
grid-gap: 15px;
height: 100vh;
}
6. 项目部署与优化
6.1 性能调优方案
MySQL查询优化记录:
sql复制-- 原始查询(执行时间2.3s)
SELECT * FROM sales WHERE product_id='123' AND date BETWEEN '2023-01-01' AND '2023-03-31';
-- 优化后(0.4s)
SELECT date, sales_count FROM sales
USE INDEX(idx_product_date)
WHERE product_id='123' AND date BETWEEN '2023-01-01' AND '2023-03-31';
6.2 定时任务设计
使用APScheduler实现自动化:
python复制from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
# 每天凌晨2点更新数据
@scheduler.scheduled_job('cron', hour=2)
def daily_update():
run_spider() # 启动爬虫
update_model() # 重新训练模型
# 每周一生成预测报告
@scheduler.scheduled_job('cron', day_of_week='mon', hour=8)
def weekly_report():
generate_pdf_report()
send_email_notification()
7. 毕设答辩加分项
根据多次答辩评审经验,这些细节能显著提升分数:
- 对比不同算法的预测准确率表格
- 展示系统在移动端的适配效果
- 准备1-2个典型预测案例(如情人节前销量激增)
- 演示模型迭代过程(v1.0到最终版的优化路径)
- 提供完整的API文档和测试用例
典型问题准备:
-
Q:为什么选择月季/玫瑰这个品类?
A:因其具有明显的季节性特征和节日效应,能充分展现时序模型的价值 -
Q:预测准确率如何评估?
A:采用SMAPE(对称平均绝对百分比误差)指标,当前系统在测试集上达到88.3%
我在实际开发中最大的收获是:电商数据预测不是简单的算法堆砌,需要深入理解业务场景。比如发现母亲节前粉色系月季销量增长更快,这个insight后来被合作花店用于优化备货策略。建议学弟学妹们在做类似项目时,一定要先花时间研究行业特性,这往往比调参带来的提升更大。
