尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Python电商销量预测系统实战:Django+随机森林与数据可视化

Python电商销量预测系统实战:Django+随机森林与数据可视化 从实际业务出发搭建一套基于 Python 的电商销量分析与预测系统是许多开发者进阶数据分析和机器学习时都会遇到的一类综合项目。这类项目通常覆盖数据采集、数据清洗、特征工程、模型训练、Web 可视化、前后端交互等多个环节非常适合用来串联 Python 全栈和机器学习知识。本文将围绕“母婴用品电商销量分析与预测”这一业务场景完整拆解一个基于 Django 框架、随机森林回归算法、爬虫采集与可视化展示的实战项目。内容包括系统架构设计、数据库表结构、爬虫实现思路、销量预测模型训练、Django 视图与模板渲染、ECharts 可视化展示以及完整的部署运行方案。项目已经具备可落地的闭环流程先采集商品数据再清洗和构建特征然后用随机森林训练回归模型最后把预测结果和分析图表发布到 Web 页面中。即使你还没有完整的电商数据也可以用本文提供的方法模拟数据验证整条流程。1. 项目背景与系统价值1.1 为什么要做电商销量预测电商平台的商品销量受多种因素影响包括价格、促销力度、商品评分、品牌影响力、用户评论数量等。对于母婴用品这类垂直品类销量波动还受到季节性、节假日、活动大促等因素的影响。如果能够基于历史数据预测未来一段时间的销量商家可以在进货、备货、定价和广告投放上做出更合理的决策。比如预测某款纸尿裤在未来 7 天的销量决定是否需要提前补货。分析价格区间与销量的关系为同类新品定价提供参考。对比不同品牌的评论量和评分判断用户对商品的关注趋势。这个系统的核心任务就是利用机器学习的回归算法从商品的多维特征中学习销量变化规律。1.2 技术选型与整体架构系统的技术栈如下层次技术选型作用数据采集Python requests、BeautifulSoup获取电商平台商品数据数据存储MySQL / SQLite保存商品信息、评论数据、历史销量数据处理Pandas、NumPy数据清洗、特征工程机器学习Scikit-learn随机森林回归模型训练与评估Web 框架Django构建分析系统、提供页面与接口可视化ECharts、Django 模板展示销量趋势、预测结果、相关性图表前端HTML、CSS、JavaScript页面布局与交互整个系统分为五个模块数据采集模块、数据管理模块、销量预测模块、可视化分析模块、系统后台模块。每个模块可以直接复用也可以独立扩展。1.3 本项目的适用场景计算机科学、数据科学相关课程设计与毕业设计。电商运营团队做单品销量预估。个人开发者学习 Python 全栈与机器学习集成。需要从 0 到 1 搭建数据分析系统的入门案例。2. 环境准备与项目结构2.1 基础环境版本需要根据你的项目实际情况调整本文示例以常见环境为例重点演示配置思路。建议环境如下Python 3.8 及以上版本。Django 3.2 或更高版本。Scikit-learn 1.x。Pandas、NumPy、Matplotlib。Requests、BeautifulSoup4。MySQL 5.7 以上或者直接使用 SQLite 简化本地开发。安装依赖可以使用以下命令pip install django pandas numpy scikit-learn requests beautifulsoup4 matplotlib pymysql如果你的 Django 版本较高例如 4.x 以上需要注意数据模型和时间字段的写法差异。本文代码兼容 Django 3.2 至 5.x 的常用写法。2.2 创建 Django 项目以系统名称sales_system为例项目结构如下sales_system/ ├── manage.py ├── sales_system/ │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── analysis/ │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── models.py │ ├── views.py │ ├── urls.py │ ├── ml_utils.py │ └── migrations/ ├── templates/ │ ├── base.html │ ├── index.html │ ├── predict.html │ └── charts.html ├── static/ │ ├── css/ │ ├── js/ │ └── echarts/ ├── data/ │ ├── products.csv │ └── sales_history.csv └── scripts/ └── crawler.py在命令行中创建项目django-admin startproject sales_system cd sales_system python manage.py startapp analysis创建完成后需要在settings.py中注册analysis应用。3. 数据库设计与数据模型3.1 商品表设计商品表用于保存爬虫抓取的商品基础信息包括商品标题、价格、销量、评论数、店铺名称、所在地、品牌等。在analysis/models.py中定义模型from django.db import models class Product(models.Model): product_id models.CharField(max_length64, uniqueTrue, verbose_name商品ID) title models.CharField(max_length255, verbose_name商品标题) price models.FloatField(verbose_name价格) monthly_sales models.IntegerField(verbose_name月销量) total_comments models.IntegerField(default0, verbose_name累计评论数) shop_name models.CharField(max_length255, verbose_name店铺名称) location models.CharField(max_length64, blankTrue, verbose_name发货地) category models.CharField(max_length64, blankTrue, verbose_name类目) brand models.CharField(max_length64, blankTrue, verbose_name品牌) seller_score models.FloatField(default0, verbose_name店铺评分) created_at models.DateTimeField(auto_now_addTrue, verbose_name采集时间) class Meta: db_table tb_product verbose_name 商品信息 verbose_name_plural verbose_name def __str__(self): return self.title3.2 历史销量表设计历史销量表用于保存商品在不同日期下的销量数据是训练随机森林回归模型的核心数据来源。class SalesHistory(models.Model): product models.ForeignKey(Product, on_deletemodels.CASCADE, verbose_name商品) sale_date models.DateField(verbose_name日期) sales_volume models.IntegerField(verbose_name销量) price models.FloatField(verbose_name当日价格) promotion_flag models.BooleanField(defaultFalse, verbose_name是否促销) class Meta: db_table tb_sales_history verbose_name 历史销量 verbose_name_plural verbose_name unique_together (product, sale_date) def __str__(self): return f{self.product.title} - {self.sale_date}这里需要注意销量预测需要“按商品聚合的时间序列数据”而不是简单的商品信息表。每个商品在每一天都对应一条历史销量记录模型才能从中学习规律。3.3 执行数据库迁移完成模型定义后执行以下命令python manage.py makemigrations python manage.py migrate如果需要使用 MySQL在settings.py中配置数据库连接DATABASES { default: { ENGINE: django.db.backends.mysql, NAME: sales_db, USER: root, PASSWORD: your_password, HOST: 127.0.0.1, PORT: 3306, } }同时需要在sales_system/__init__.py中配置 PyMySQLimport pymysql pymysql.install_as_MySQLdb()4. 数据采集模块爬虫实现思路4.1 爬虫目标与合规建议电商平台商品数据是销量预测模型的输入基础。本文以公开数据的采集思路为例目标字段包括商品标题、价格、月销量、评论数、店铺评分等。需要特别强调的是在编写爬虫时要注意平台的服务条款和 robots 协议。不要在线上环境对目标站点进行高频访问也不要采集用户隐私信息。如果只是做课程设计或学习演示可以在本地搭建测试环境或采集允许公开访问的数据甚至直接使用模拟数据完成全流程验证。4.2 基于 requests 与 BeautifulSoup 的抓取框架以抓取商品列表页为例核心思路是请求页面、解析 HTML、抽取字段。import requests from bs4 import BeautifulSoup HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } def fetch_product_list(keyword, page1): url fhttps://example.com/search?q{keyword}page{page} response requests.get(url, headersHEADERS, timeout10) response.encoding utf-8 soup BeautifulSoup(response.text, html.parser) products [] for item in soup.select(.product-item): title item.select_one(.title).text.strip() price_text item.select_one(.price).text.strip() sales_text item.select_one(.sales).text.strip() price float(price_text.lstrip(¥)) sales int(sales_text.replace(人付款, ).replace(, )) products.append({ title: title, price: price, monthly_sales: sales, }) return products4.3 注意事项页面编码问题部分页面使用 GBK 编码需要根据实际情况调整response.encoding。动态渲染问题如果采用 JavaScript 异步加载数据requests 无法直接获取需要改用 Selenium 或分析接口地址。限流与反爬合理设置请求间隔使用time.sleep()控制抓取频率。对于母婴用品这个垂直类目可以抓取的关键词包括“纸尿裤”、“婴儿湿巾”、“奶瓶”、“辅食机”等。采集结果可以保存为 CSV 文件也可以直接写入 Django 数据库。5. 数据清洗与特征工程模型预测效果的好坏很大程度取决于数据质量。原始数据中通常存在重复值、缺失值、异常值需要先处理。5.1 数据加载与缺失值处理使用 Pandas 读取数据并清洗import pandas as pd df pd.read_csv(data/products.csv) # 删除完全重复的记录 df.drop_duplicates(inplaceTrue) # 去除价格为 0 或销量的异常数据 df df[df[price] 0] df df[df[monthly_sales] 0] # 若是缺失值可填充列均值 df[seller_score].fillna(df[seller_score].mean(), inplaceTrue)5.2 特征工程在销量预测模型中原始特征不仅包括商品的价格和销量还需要构造衍生特征。例如价格区间将连续价格转换为离散价格带。商品标题长度反映标题信息丰富程度。评论数与销量的比率反映转化情况。促销标识是否参与优惠活动。时间特征月份、星期、距离大促的天数。特征构造示例df[price_bin] pd.cut(df[price], bins[0, 50, 100, 200, 500, 1000], labels[0-50, 50-100, 100-200, 200-500, 500]) df[title_length] df[title].apply(len) # 标签编码 cat_cols [category, brand, location] for col in cat_cols: df[col] df[col].astype(category).cat.codes5.3 训练集和测试集划分在划分数据时需要注意时间序列数据不能随机打乱划分否则会引入未来信息。应该按时间顺序切分df df.sort_values(sale_date) split_idx int(len(df) * 0.8) train_df df.iloc[:split_idx] test_df df.iloc[split_idx:]6. 销量预测模型随机森林回归6.1 随机森林回归原理简述随机森林回归是一种基于决策树的集成学习算法。它通过构建多棵决策树并对所有树的预测结果取平均值从而降低单棵树的方差提升模型的稳定性和泛化能力。相比线性回归随机森林回归的优势在于可以捕捉特征之间的非线性关系。不需要对特征做标准化处理。能输出特征重要性帮助业务分析哪些因素对销量影响最大。对异常值和缺失值有一定容忍度。6.2 使用 Scikit-learn 构建模型将特征工程后的数据用于训练模型from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score # 特征列 feature_cols [price, total_comments, seller_score, title_length, promotion_flag] X_train train_df[feature_cols] y_train train_df[sales_volume] X_test test_df[feature_cols] y_test test_df[sales_volume] model RandomForestRegressor( n_estimators200, max_depth10, min_samples_split5, min_samples_leaf2, random_state42 ) model.fit(X_train, y_train) y_pred model.predict(X_test) print(R2:, r2_score(y_test, y_pred)) print(MAE:, mean_absolute_error(y_test, y_pred)) print(RMSE:, mean_squared_error(y_test, y_pred, squaredFalse))6.3 特征重要性分析模型训练完成后可以输出特征重要性importance model.feature_importances_ for col, imp in zip(feature_cols, importance): print(f{col}: {imp:.4f})通过特征重要性可以判断哪些因素对母婴用品销量影响最大。在真实项目中价格和评论数通常是最重要的两个特征。6.4 模型持久化为了让 Django 视图复用训练好的模型我们可以将模型保存为文件import joblib joblib.dump(model, data/random_forest_model.pkl)在 Django 系统中加载模型model joblib.load(data/random_forest_model.pkl)7. Django Web 系统集成7.1 URL 路由配置在sales_system/urls.py中配置主路由from django.contrib import admin from django.urls import path, include urlpatterns [ path(admin/, admin.site.urls), path(, include(analysis.urls)), ]在analysis/urls.py中配置子路由from django.urls import path from . import views urlpatterns [ path(, views.index, nameindex), path(predict/, views.predict_sales, namepredict_sales), path(charts/, views.charts, namecharts), ]7.2 视图函数视图层负责从数据库读取商品数据、调用模型进行销量预测并把结果返回给模板。import joblib from django.shortcuts import render from django.http import JsonResponse from .models import Product, SalesHistory model joblib.load(data/random_forest_model.pkl) def index(request): products Product.objects.all()[:20] return render(request, index.html, {products: products}) def predict_sales(request): if request.method POST: price float(request.POST.get(price, 0)) total_comments int(request.POST.get(total_comments, 0)) seller_score float(request.POST.get(seller_score, 0)) title_length int(request.POST.get(title_length, 10)) promotion_flag int(request.POST.get(promotion_flag, 0)) features [[price, total_comments, seller_score, title_length, promotion_flag]] predicted_sales model.predict(features)[0] return JsonResponse({predicted_sales: round(predicted_sales, 2)}) return render(request, predict.html) def charts(request): products Product.objects.all() data [ { title: p.title, price: p.price, monthly_sales: p.monthly_sales, } for p in products ] return render(request, charts.html, {data: data})7.3 模板页面index.html展示商品列表概览使用简单的 Bootstrap 或原生表格即可。这里以商品列表为例!DOCTYPE html html langzh-CN head meta charsetUTF-8 title母婴用品电商销量分析系统/title link hrefhttps://cdn.jsdelivr.net/npm/bootstrap5.3.0/dist/css/bootstrap.min.css relstylesheet /head body div classcontainer mt-4 h2母婴用品商品数据概览/h2 table classtable table-bordered thead tr th商品标题/th th价格/th th月销量/th th评论数/th th店铺/th /tr /thead tbody {% for p in products %} tr td{{ p.title }}/td td{{ p.price }}/td td{{ p.monthly_sales }}/td td{{ p.total_comments }}/td td{{ p.shop_name }}/td /tr {% endfor %} /tbody /table /div /body /htmlpredict.html页面提供表单用户输入商品参数后通过 AJAX 调用预测接口并展示结果!DOCTYPE html html langzh-CN head meta charsetUTF-8 title销量预测/title script srchttps://cdn.jsdelivr.net/npm/axios/dist/axios.min.js/script /head body div classcontainer mt-4 h2随机森林销量预测/h2 form idpredictForm div classmb-3 label商品价格/label input typenumber step0.01 nameprice classform-control required /div div classmb-3 label累计评论数/label input typenumber nametotal_comments classform-control required /div div classmb-3 label店铺评分/label input typenumber step0.1 nameseller_score classform-control required /div div classmb-3 label标题长度/label input typenumber nametitle_length classform-control required /div div classmb-3 label是否促销/label select namepromotion_flag classform-control option value0否/option option value1是/option /select /div button typesubmit classbtn btn-primary预测销量/button /form div idresult classmt-4/div /div script document.getElementById(predictForm).addEventListener(submit, function (e) { e.preventDefault(); const formData new FormData(e.target); const params new URLSearchParams(formData).toString(); axios.post(/predict/, params) .then(res { document.getElementById(result).innerHTML h4预测销量${res.data.predicted_sales} 件/h4; }) .catch(err { console.error(err); }); }); /script /body /html7.4 数据可视化展示使用 ECharts 展示商品价格与销量的散点图、预测趋势折线图。这里给出一个简单示例在charts.html中引入 ECharts 并通过 Django 模板变量传递数据。!DOCTYPE html html langzh-CN head meta charsetUTF-8 title数据可视化/title script srchttps://cdn.jsdelivr.net/npm/echarts5/dist/echarts.min.js/script /head body div idchart stylewidth: 100%; height: 500px;/div script const data {{ data|safe }}; const prices data.map(item item.price); const sales data.map(item item.monthly_sales); const chart echarts.init(document.getElementById(chart)); const option { title: { text: 母婴用品价格与销量关系 }, tooltip: {}, xAxis: { name: 价格元 }, yAxis: { name: 月销量 }, series: [{ type: scatter, data: prices.map((v, i) [v, sales[i]]), symbolSize: 10 }] }; chart.setOption(option); /script /body /html更复杂的可视化例如多商品销量对比柱状图、周销量趋势折线图、特征重要性条形图都可以在模板中扩展。8. 运行验证与效果说明8.1 启动 Django 服务完成模型训练、模板编写和数据导入后启动 Django 开发服务器python manage.py runserver浏览器访问http://127.0.0.1:8000/即可看到商品数据概览页。进入预测页面填写一组商品参数点击预测按钮系统会调用训练好的随机森林回归模型并返回预测销量。8.2 预测效果说明以母婴用品为例假设一个价格为 89 元、累计评论数 1200 条、店铺评分 4.8、标题长度 18、处于非促销状态的商品模型输出的预测销量可以用于运营参考。需要注意的是模型预测结果只是辅助决策不能完全替代真实的市场判断。8.3 项目扩展方向如果你希望把项目做得更完整可以考虑以下方向加入销量趋势的多日滚动均值预测。引入商品品牌、价格带、促销力度等更多特征。将模型升级为 XGBoost 或 LightGBM对比效果。使用 Celery 定时任务自动爬取并更新数据。增加用户登录权限体系将预测功能放入权限控制范围内。使用 Django REST Framework 提供接口给其他管理系统调用。9. 常见问题与排查思路在开发这类综合项目时有几个高频问题需要特别注意。问题现象常见原因解决思路爬虫抓不到数据页面是 JavaScript 动态加载改用 Selenium、Playwright或直接分析 XHR 接口Django 页面提示模型加载失败模型路径不对或依赖版本不兼容使用绝对路径加载模型检查 joblib 与训练环境一致随机森林预测结果偏差大特征工程不足或训练数据太少增加特征列收集更多历史数据调参优化中文乱码数据编码不一致统一在数据库连接和响应头中设置 utf-8 编码运行爬虫后程序退出但无输出选择器定位失败或页面结构变化先打印响应内容再逐步调试选择器MySQL 连接失败Django 未配置 PyMySQL 或账号权限不足检查__init__.py确认数据库账号可远程访问模板变量不显示视图未传递该变量或模板语法错误检查视图函数 return 的上下文格式针对爬虫常见的“程序只显示 exit code 0 但没有抓取内容”问题最直接的办法是打印抓取页面的长度和部分文本确认页面是否被反爬策略拦截再决定是增加请求头还是更换采集方式。10. 最佳实践与工程建议10.1 数据安全与合规在数据采集环节要严格控制请求频率禁止对目标站点造成压力。涉及平台数据时优先使用官方 API 或公开数据集。如果项目是学习用途建议使用自建模拟数据或本地测试环境。10.2 模型版本管理训练好的机器学习模型要记录版本、训练时间、训练数据范围和主要超参数。在实际系统中推荐使用 MLflow 或简单的 JSON 文件保存模型元数据便于回溯问题。10.3 代码模块分层不要把爬虫代码、模型训练代码和 Django 视图代码全部堆在同一个文件里。按照以下职责划分scripts/crawler.py负责数据采集。analysis/ml_utils.py负责特征工程和模型训练。analysis/views.py只负责 HTTP 请求处理和页面渲染。data/目录负责存放 CSV、模型文件等资源。10.4 日志与异常处理在爬虫和深度学习训练过程中要加入日志记录和异常捕获便于排查问题。import logging logging.basicConfig(levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s) try: products fetch_product_list(母婴用品) logging.info(抓取成功共 %d 条商品数据, len(products)) except Exception as e: logging.error(抓取失败: %s, e)10.5 部署注意事项如果项目要部署到云服务器需要注意关闭 Django DEBUG 模式。使用 Gunicorn Nginx 部署而不是 runserver。数据库密码等敏感信息通过环境变量配置。定时采集任务建议使用系统 crontab 或 Celery Beat避免生产环境手工执行脚本。10.6 目录与命名规范建议对文件和变量统一命名例如数据文件统一放在data/目录。模型文件命名为random_forest_model.pkl并备注日期。模板文件名使用小写加下划线例如predict_sales.html。视图函数名称使用动词短语例如predict_sales、view_charts。项目到了这里已经从数据采集、数据处理、模型训练、系统集成的完整流程把母婴用品电商销量分析和预测系统搭建起来了。建议你在本地跑通一遍基础流程再逐步加入新的特征、新的算法和新的页面这样对 Django 和机器学习的综合理解会更扎实。
返回列表