一、技术栈

本系统采用前后端分离与数据科学相结合的架构,主要技术栈如下:

1. 后端与框架

  • Django (Python):作为核心Web框架,负责业务逻辑、用户认证、API接口和后台管理。
  • Django REST Framework (DRF):构建RESTful API,为前端提供数据服务。
  • PostgreSQL / MySQL:关系型数据库,存储用户、商品、订单等结构化数据。
  • Redis:用作缓存和消息队列,提升系统响应速度。

2. 机器学习与数据处理

  • Scikit-learn:核心机器学习库,用于构建分类、回归、聚类模型(如商品销量预测、用户分群)。
  • Pandas & NumPy:数据处理与分析,完成数据清洗、特征工程。
  • Matplotlib & Seaborn:数据可视化,生成销量趋势、用户偏好等图表。
  • Jupyter Notebook:模型开发、实验与分析的交互式环境。

3. 前端技术

  • Vue.js / React:构建交互式单页面应用(SPA)。
  • Element UI / Ant Design:UI组件库,快速搭建管理后台界面。
  • ECharts / Chart.js:在前端展示复杂的预测结果与数据分析图表。

4. 部署与运维

  • Docker:容器化部署,保证环境一致性。
  • Nginx:反向代理与静态文件服务。
  • Celery:异步任务队列,处理耗时的模型训练与数据爬取任务。
  • Supervisor:进程管理,确保服务稳定运行。

二、背景与意义

1. 行业背景

随着直播带货、社交电商的爆发式增长,选品已成为电商运营的核心决策环节。传统选品依赖人工经验,存在效率低、主观性强、难以量化等问题。在海量商品和动态市场环境下,商家亟需数据驱动的智能工具来辅助决策。

2. 项目意义

  • 提升选品效率与精准度:通过机器学习模型分析历史销售数据、用户行为、市场趋势,自动筛选出高潜力商品,减少人工试错成本。
  • 数据驱动决策:将模糊的“经验”转化为可量化的“数据指标”,如预测销量、评估爆款概率、识别潜力品类,使决策过程更加科学。
  • 降低运营风险:提前预测商品的市场表现,帮助商家规避滞销风险,优化库存与采购计划。
  • 技术实践价值:本项目是Django全栈开发与机器学习Pipeline结合的典型案例,涵盖了从数据采集、处理、建模到Web服务化的完整流程,具有很高的学习与参考价值。

三、核心代码示例

1. 数据预处理与特征工程 (Python)

import pandas as pd
from sklearn.preprocessing import StandardScaler, LabelEncoder
def preprocess_product_data(raw_df):
"""
电商商品数据预处理与特征工程
"""
df = raw_df.copy()
# 1. 处理缺失值
df['price'].fillna(df['price'].median(), inplace=True)
df['category'].fillna('unknown', inplace=True)
2. 特征构造
df['price_per_unit'] = df['price'] / (df['weight'] + 1)  # 单价特征
df['discount_rate'] = (df['original_price'] - df['price']) / df['original_price']
df['sales_velocity'] = df['recent_sales'] / 7  # 近7日日均销量
3. 类别特征编码
le = LabelEncoder()
df['category_encoded'] = le.fit_transform(df['category'])
4. 数值特征标准化
scaler = StandardScaler()
numeric_cols = ['price', 'sales_velocity', 'discount_rate', 'rating']
df[numeric_cols] = scaler.fit_transform(df[numeric_cols])
5. 选择最终特征
feature_cols = ['price', 'sales_velocity', 'discount_rate', 'rating',
'category_encoded', 'price_per_unit']
X = df[feature_cols]
y = df['future_sales_label']  # 目标变量:未来是否热销(0/1)
return X, y, df</code></pre>
2. 销量预测模型 (Scikit-learn)
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, accuracy_score
import joblib
def train_sales_prediction_model(X, y):
"""
训练随机森林分类器,预测商品未来是否热销
"""
划分训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
初始化并训练模型
model = RandomForestClassifier(
n_estimators=100,
max_depth=10,
random_state=42
)
model.fit(X_train, y_train)
评估模型
y_pred = model.predict(X_test)
print("模型准确率:", accuracy_score(y_test, y_pred))
print("\n分类报告:")
print(classification_report(y_test, y_pred))
保存模型
joblib.dump(model, 'models/sales_prediction_rf.pkl')
print("模型已保存至 'models/sales_prediction_rf.pkl'")
return model</code></pre>
3. Django视图集成预测API (views.py)
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_POST
import pandas as pd
import joblib
import json
加载预训练模型
MODEL_PATH = 'models/sales_prediction_rf.pkl'
try:
prediction_model = joblib.load(MODEL_PATH)
except FileNotFoundError:
prediction_model = None
@csrf_exempt
@require_POST
def predict_product_potential(request):
"""
API接口:接收商品特征JSON,返回预测结果
"""
if prediction_model is None:
return JsonResponse({'error': 'Model not loaded'}, status=503)
try:
# 解析请求数据
data = json.loads(request.body)
features = data.get('features', {})
# 构建特征DataFrame(需与训练时特征顺序一致)
feature_df = pd.DataFrame([features])
进行预测
prediction = prediction_model.predict(feature_df)[0]
probability = prediction_model.predict_proba(feature_df)[0]
返回结果
result = {
'product_id': features.get('product_id'),
'prediction': int(prediction),  # 1: 热销, 0: 非热销
'probability_hot': float(probability[1]),  # 热销概率
'message': 'High potential product' if prediction == 1 else 'Normal product'
}
return JsonResponse(result)
except Exception as e:
return JsonResponse({'error': str(e)}, status=400)</code></pre>
4. 异步任务处理模型更新 (tasks.py)
from celery import shared_task
import pandas as pd
from django.db import connection
from .ml_trainer import train_sales_prediction_model
@shared_task
def periodic_model_retraining():
"""
周期性任务:从数据库获取最新销售数据,重新训练预测模型
"""
print("开始周期性模型重训练...")
从数据库获取最新数据
query = """
SELECT product_id, price, category, recent_sales,
original_price, weight, rating, future_sales_label
FROM product_sales_data
WHERE sales_date >= CURRENT_DATE - INTERVAL '90 days'
"""
with connection.cursor() as cursor:
cursor.execute(query)
columns = [col[0] for col in cursor.description]
data = cursor.fetchall()
if not data:
print("无新数据,跳过本次训练。")
return
转换为DataFrame并预处理
df = pd.DataFrame(data, columns=columns)
X, y, _ = preprocess_product_data(df)  # 复用预处理函数
训练新模型
new_model = train_sales_prediction_model(X, y)
保存新模型(可添加版本管理)
joblib.dump(new_model, 'models/sales_prediction_rf_latest.pkl')
print("周期性模型重训练完成。")</code></pre>

更多推荐