news 2026/9/7 13:39:33

基于Python+Django的母婴用品销量分析与预测系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于Python+Django的母婴用品销量分析与预测系统

这次梳理的是一套完整的电商数据分析项目:基于 Python + Django 的母婴用品销量分析与预测系统。它不是单点功能,而是把数据采集、商品与订单管理、可视化看板、随机森林回归销量预测整合到同一个 Web 系统里,适合作为 Python 后端 + 机器学习方向的学习项目,也适合做课程设计和毕设原型。

先说这个系统能做什么。第一,把母婴类商品数据采集进来,包括商品标题、价格、店铺、销量等;第二,在 Django 后台统一管理商品和订单,形成历史销量明细;第三,通过可视化图表展示销售趋势、类目占比、单品排行等经营指标;第四,利用随机森林回归算法预测下一个周期销量,给运营和采购提供参考。整个链路从数据到决策是完整的,不是只训练一个模型就结束。

项目的技术栈很主流:Python 负责数据处理与建模,Django 承担 Web 管理和接口服务,pandas 做数据清洗与特征工程,scikit-learn 实现随机森林回归模型,前端用 ECharts 渲染图表。整个链路清晰,每部分都能单独验证,也可以按模块替换成其他算法或框架。

这篇文章会按“架构拆解 → 环境准备 → 数据采集 → Django 管理后台 → 可视化看板 → 随机森林预测 → 接口调用 → 性能与排错”的顺序展开,每个模块都给出可落地的代码示例。如果你正准备做类似项目,可以直接把这里的模型设计、特征工程思路和接口代码拿来改。

1. 核心能力速览

能力项说明
项目类型电商销量分析与预测系统,Django Web 应用
技术栈Python、Django、pandas、scikit-learn、ECharts
数据来源电商平台公开数据、授权接口、自建模拟数据;爬虫仅用于学习实验
核心功能商品与订单管理、销量可视化、随机森林回归销量预测
机器学习模型随机森林回归算法(RandomForestRegressor)
面向类目母婴用品,类目可扩展
接口能力Django 提供 JSON 接口,可接入图表或批量预测脚本
数据存储MySQL / SQLite
运行环境普通开发机即可,CPU 就能完成训练和推理,不需要 GPU
适合场景课程设计、毕设原型、中小店铺数据复盘学习

2. 系统总体架构与模块拆分

这个项目可以拆成五层,每层职责单一,方便单独调试。

数据采集层:负责抓取商品和销量数据。实际开发中优先使用授权接口,爬虫作为补充和实验手段,必须遵守目标网站的 robots 规则,控制请求频率,不能采集个人隐私信息。

数据存储层:使用 Django ORM 管理商品、订单、类目等表。MySQL 适合数据量较大的生产使用,本机开发可以选择 SQLite 降低配置成本。

业务管理后台:通过 Django Admin 或自定义页面管理商品、订单、预测参数。Django Admin 自带增删改查,适合做内部管理工具。

数据分析与可视化层:用 pandas 聚合订单明细,生成日销量、周销量、类目汇总等统计表,再通过 ECharts 输出折线图、柱状图、饼图。

机器学习预测层:以历史销量和影响因子作为特征,训练随机森林回归模型,保存为 joblib 文件,并在 Django 中加载模型提供预测接口。

模块之间通过数据库表和 HTTP 接口通信。爬虫写入商品表,订单表累积历史销量,图表接口从订单表聚合数据,预测接口读取特征后调用模型返回预测值。这样每个模块都可以独立替换,比如把随机森林换成 XGBoost 或 LSTM,只需要修改预测层。

3. 适用场景与使用边界

这个系统适合四类人:准备做 Python Web + 机器学习综合项目的人;需要一套课程设计或毕设参考框架的人;想了解电商销量预测特征工程的人;以及想搭建内部销售复盘工具的小型运营团队。

项目能解决的实际问题包括:历史销量分散在订单里,靠手工统计效率低;页面上看不出品类结构,不知道哪些商品贡献主要销售额;备货靠经验,缺少量化预测。

需要明确边界。爬虫抓取电商平台数据在技术上可行,但很多平台的服务条款明确限制自动采集。做学习项目时,优先使用平台官方开放接口、授权数据或模拟数据。如果一定要写爬虫,只采集公开页面信息,不绕过验证码,不登录采集,不抓取买家个人信息,请求间隔保持在 2 秒以上。本项目的正确姿势是把爬虫当作“数据获取方式之一”,而不是把系统做成商业抓取器。

另外,母婴用品类目本身涉及用户偏好和消费隐私,任何真实用户行为数据都不应该出现在学习项目里。推荐的做法是:类目结构用真实商品的公开信息,订单和销量数据用模拟数据,既能跑通系统,又不会触碰隐私红线。

4. 环境准备与前置条件

建议环境:

  • 操作系统:Windows 10/11 或 Ubuntu 20.04+
  • Python 版本:3.8~3.11,scikit-learn 和 Django 都兼容这个范围
  • 数据库:SQLite 用于开发,MySQL 5.7+ 用于模拟生产
  • 推荐 IDE:PyCharm 或 VS Code

创建requirements.txt

Django==4.2.7 pandas==2.1.4 scikit-learn==1.3.2 joblib==1.3.2 requests==2.31.0 beautifulsoup4==4.12.2 mysqlclient==2.2.0

安装依赖:

pip install -r requirements.txt

创建 Django 项目和应用:

django-admin startproject sales_analysis cd sales_analysis python manage.py startapp product python manage.py startapp orders python manage.py startapp prediction

settings.py中把应用加入INSTALLED_APPS

INSTALLED_APPS = [ "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", "product", "orders", "prediction", ]

如果使用 MySQL,配置数据库连接:

DATABASES = { "default": { "ENGINE": "django.db.backends.mysql", "NAME": "sales_analysis", "USER": "root", "PASSWORD": "your_password", "HOST": "127.0.0.1", "PORT": "3306", } }

本机开发阶段用 SQLite 就行,后面要模拟生产再切换 MySQL。

5. 数据采集模块设计与实践

数据采集是这个项目第一环。在正式开始前需要确认数据源,按优先级推荐:平台官方开放接口、授权数据集、自建模拟数据、网站公开页面数据。最后一项才轮到爬虫,而且必须是低频、守规矩的爬虫。

下面是一份通用抓取模板,只做学习实验用:

import time import requests from bs4 import BeautifulSoup def build_headers(): return { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) learning-project", "Accept": "text/html", } def fetch_product_list(keyword: str, max_page: int = 1): """通用页面抓取模板,实际目标站点必须评估 robots 规则""" results = [] for page in range(1, max_page + 1): url = f"https://example.com/search?q={keyword}&page={page}" resp = requests.get(url, headers=build_headers(), timeout=10) soup = BeautifulSoup(resp.text, "html.parser") for item in soup.select(".product-item"): results.append(parse_item(item)) time.sleep(2) return results def parse_item(node): """从商品节点解析标题、价格、销量等字段,选择器按实际页面调整""" return { "product_id": node.get("data-id"), "title": node.select_one(".title").text.strip() if node.select_one(".title") else "", "price": float(node.select_one(".price").text.replace("¥", "")) if node.select_one(".price") else 0.0, "sales": int(node.select_one(".sales").text) if node.select_one(".sales") else 0, "shop_name": node.select_one(".shop").text.strip() if node.select_one(".shop") else "", }

实际项目中不要把页面选择器写死在业务逻辑里,建议把商品字段解析拆成策略类:

class ProductParser: """不同平台可以扩展不同解析器,保持 parse 接口一致""" def parse(self, html) -> list: raise NotImplementedError

爬虫采集到的数据不能直接入库,要先做清洗和去重。步骤是:按product_id去重,已存在的商品更新价格和累计销量;把价格缺失、标题过短、销量为负的记录剔除;统一字段类型,价格转成Decimal,日期统一成YYYY-MM-DD格式。

合规在这个模块最重要。爬虫只能在目标网站允许的范围内做低频访问,绝对不能用于绕过登录、验证码或采集任何个人信息。如果数据用于课程设计,自建 1000 到 2000 条模拟订单数据,配合少量真实公开商品数据,已经足够把后续所有功能跑通。

6. 商品与订单管理后台搭建

Django 管理后台的核心是数据模型。先定义商品和订单模型:

from django.db import models class Category(models.Model): name = models.CharField(max_length=64, unique=True, verbose_name="类目名称") class Product(models.Model): product_id = models.CharField(max_length=64, unique=True, verbose_name="商品ID") title = models.CharField(max_length=255, verbose_name="商品标题") category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="类目") price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="价格") shop_name = models.CharField(max_length=128, blank=True, verbose_name="店铺名称") monthly_sales = models.IntegerField(default=0, verbose_name="月销量") created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") class Meta: verbose_name = "商品" verbose_name_plural = "商品" class Order(models.Model): order_no = models.CharField(max_length=64, unique=True, verbose_name="订单编号") product = models.ForeignKey(Product, on_delete=models.CASCADE, verbose_name="商品") quantity = models.PositiveIntegerField(default=1, verbose_name="购买数量") amount = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="订单金额") order_date = models.DateField(db_index=True, verbose_name="下单日期") is_promotion = models.BooleanField(default=False, verbose_name="是否促销活动") class Meta: verbose_name = "订单" verbose_name_plural = "订单"

这里用order_date而不是DateTimeField,是为了方便按天聚合统计。如果订单来自多个渠道,可以再增加platform字段用于区分来源。

注册到 Django Admin 后可以直接在后台维护数据:

from django.contrib import admin from .models import Product, Order, Category @admin.register(Category) class CategoryAdmin(admin.ModelAdmin): list_display = ("id", "name") @admin.register(Product) class ProductAdmin(admin.ModelAdmin): list_display = ("product_id", "title", "category", "price", "monthly_sales", "shop_name") list_filter = ("category", "shop_name") search_fields = ("title", "product_id") @admin.register(Order) class OrderAdmin(admin.ModelAdmin): list_display = ("order_no", "product", "quantity", "amount", "order_date", "is_promotion") list_filter = ("order_date", "is_promotion") date_hierarchy = "order_date"

执行数据迁移:

python manage.py makemigrations python manage.py migrate python manage.py createsuperuser python manage.py runserver 0.0.0.0:8000

后台地址是http://127.0.0.1:8000/admin/。完成数据迁移后,可以在后台手动录入商品和订单,也可以写导入脚本把 CSV 批量写入。批量导入更适合实验阶段:

import csv from datetime import datetime from product.models import Category, Product from orders.models import Order def import_csv(filepath): with open(filepath, encoding="utf-8-sig") as f: reader = csv.DictReader(f) category_map = {} for row in reader: cat_name = row["category"] if cat_name not in category_map: category_map[cat_name] = Category.objects.get_or_create(name=cat_name)[0] product, _ = Product.objects.get_or_create( product_id=row["product_id"], defaults={ "title": row["title"], "category": category_map[cat_name], "price": row["price"], "shop_name": row["shop_name"], }, ) Order.objects.create( product=product, order_no=row["order_no"], quantity=int(row["quantity"]), amount=row["amount"], order_date=datetime.strptime(row["order_date"], "%Y-%m-%d").date(), is_promotion=row.get("is_promotion") == "1", )

7. 销量数据可视化与图表页面

可视化数据从订单表聚合出来,建议先写 JSON 接口,再在前端用 ECharts 渲染。这样图表页面、大屏和移动端都能复用同一套接口。

先写销售趋势

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 12:25:37

空翻训练必看:假踺子后空翻常见错误与纠正方法

空翻常见的错误,假踺子后空到底错在哪?这一篇把发力逻辑和修正路径讲透 跑酷、街舞、武术套路里,假踺子后空翻都是出场率极高的动作。很多人看教学视频觉得自己看懂了:助跑、侧手翻、空中抱膝、落地,好像步骤都齐了&a…

作者头像 李华
网站建设 2026/9/7 13:39:33

当贝Air1S投影仪评测:3000元价位智能投影如何选?

1. 先搞清楚“当贝Air1S”到底解决了什么需求 如果你在考虑入手一台家用投影仪,尤其是关注过“当贝”这个品牌,那么“当贝Air1S”这个名字大概率会出现在你的备选清单里。它不是那种动辄上万的旗舰机型,也不是几百块的入门玩具,而…

作者头像 李华
网站建设 2026/9/6 5:35:09

基于IP-IQ检测与双闭环控制的并联型有源电力滤波器Simulink仿真

并联型有源电力滤波器(APF)是解决谐波污染的主流电力电子装置,而整个仿真研究的关键难点不在主电路拓扑,而在谐波检测方法和控制策略是否能在Simulink中正确闭环。这次我们看的就是一套围绕“IP-IQ谐波检测 电压电流双闭环控制”…

作者头像 李华
网站建设 2026/9/6 5:28:20

机器人运动性能损失排查:从理论指令到实际执行的5cm差距分析

在实际机器人开发或运动控制项目中,我们常常会遇到一个看似微小但影响巨大的问题:执行器(如电机、舵机)已经输出了理论上的最大指令,但被控对象(例如机器人的轮子或腿)的实际运动表现却未能达到…

作者头像 李华
网站建设 2026/9/6 5:35:08

信源数估计算法MATLAB实现:AIC/MDL/BIC与盖尔圆法源码详解

简介:本资源是一份面向信号处理与雷达方向本科生及入门研究者的信源数目估计算法实践材料,聚焦阵列信号处理中关键的信源数估计问题,完整实现基于AIC与MDL信息论准则的总体最小二乘拟合算法,并引入罚函数机制提升估计鲁棒性。压缩…

作者头像 李华