ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

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

基于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.04Python 版本3.8~3.11scikit-learn 和 Django 都兼容这个范围数据库SQLite 用于开发MySQL 5.7 用于模拟生产推荐 IDEPyCharm 或 VS Code创建requirements.txtDjango4.2.7 pandas2.1.4 scikit-learn1.3.2 joblib1.3.2 requests2.31.0 beautifulsoup44.12.2 mysqlclient2.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_APPSINSTALLED_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 fhttps://example.com/search?q{keyword}page{page} resp requests.get(url, headersbuild_headers(), timeout10) 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_length64, uniqueTrue, verbose_name类目名称) class Product(models.Model): product_id models.CharField(max_length64, uniqueTrue, verbose_name商品ID) title models.CharField(max_length255, verbose_name商品标题) category models.ForeignKey(Category, on_deletemodels.SET_NULL, nullTrue, blankTrue, verbose_name类目) price models.DecimalField(max_digits10, decimal_places2, verbose_name价格) shop_name models.CharField(max_length128, blankTrue, verbose_name店铺名称) monthly_sales models.IntegerField(default0, verbose_name月销量) created_at models.DateTimeField(auto_now_addTrue, verbose_name创建时间) class Meta: verbose_name 商品 verbose_name_plural 商品 class Order(models.Model): order_no models.CharField(max_length64, uniqueTrue, verbose_name订单编号) product models.ForeignKey(Product, on_deletemodels.CASCADE, verbose_name商品) quantity models.PositiveIntegerField(default1, verbose_name购买数量) amount models.DecimalField(max_digits10, decimal_places2, verbose_name订单金额) order_date models.DateField(db_indexTrue, verbose_name下单日期) is_promotion models.BooleanField(defaultFalse, 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, encodingutf-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(namecat_name)[0] product, _ Product.objects.get_or_create( product_idrow[product_id], defaults{ title: row[title], category: category_map[cat_name], price: row[price], shop_name: row[shop_name], }, ) Order.objects.create( productproduct, order_norow[order_no], quantityint(row[quantity]), amountrow[amount], order_datedatetime.strptime(row[order_date], %Y-%m-%d).date(), is_promotionrow.get(is_promotion) 1, )7. 销量数据可视化与图表页面可视化数据从订单表聚合出来建议先写 JSON 接口再在前端用 ECharts 渲染。这样图表页面、大屏和移动端都能复用同一套接口。先写销售趋势
返回列表