在开始编写代码之前,我们需要确保本地Python环境已经准备就绪。本指南基于Python 3.8及以上版本开发,利用Pandas进行数据处理,Matplotlib进行数据可视化,Openpyxl用于生成Excel报告。
打开终端或命令行工具,依次执行以下命令安装必要的依赖库。请确保网络连接通畅,以便从PyPI镜像源快速下载包。
pip install pandas matplotlib openpyxl schedule
安装完成后,创建一个项目文件夹,例如 category_ops_auto,并在其中新建一个名为 data 的空文件夹用于存放原始数据。
品类运营的核心在于数据。为了让脚本能够直接运行,我们需要定义标准的数据输入格式。请在 data 文件夹下创建一个名为 sales_data.csv 的文件,并复制以下模拟数据作为内容。这代表了某电商平台过去30天的各品类销售流水。
date,category_name,sku_id,sku_name,sales_volume,unit_price,inventory_stock
2023-10-01,数码,1001,手机A,10,5999,200
2023-10-01,数码,1002,耳机B,50,299,500
2023-10-01,家居,2001,沙发C,2,3000,50
2023-10-02,数码,1001,手机A,15,5999,185
2023-10-02,数码,1002,耳机B,40,299,460
2023-10-02,家居,2001,沙发C,1,3000,49
2023-10-03,服饰,3001,外套D,100,199,1000
2023-10-03,服饰,3002,裤子E,80,99,800
2023-10-03,数码,1001,手机A,12,5999,173
2023-10-04,家居,2001,沙发C,5,3000,44
2023-10-04,数码,1002,耳机B,60,299,400
2023-10-05,服饰,3001,外套D,120,199,880
该CSV文件包含字段:日期、品类名称、商品ID、商品名称、销量、单价、库存量。请确保你的实际业务数据能映射到这些字段,或者修改后续代码中的列名以保持一致。
在项目根目录下创建 analysis_engine.py 文件。我们将分模块编写代码,实现数据清洗、指标计算、异常检测和报告导出功能。

我们需要读取CSV文件,并处理可能存在的空值或数据类型错误。这是保证分析准确性的第一步。
import pandas as pd
import matplotlib.pyplot as plt
import os
from datetime import datetime
设置中文字体,防止图表乱码(Windows通常为SimHei,Mac为Arial Unicode MS)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def load_and_clean_data(file_path):
"""读取数据并进行基础清洗"""
if not os.path.exists(file_path):
print(f"错误:文件 {file_path} 不存在")
return None
try:
df = pd.read_csv(file_path)
转换日期格式
df['date'] = pd.to_datetime(df['date'])
填充缺失值为0,并确保数值列为整数
df = df.fillna(0)
df['sales_volume'] = df['sales_volume'].astype(int)
df['unit_price'] = df['unit_price'].astype(float)
df['inventory_stock'] = df['inventory_stock'].astype(int)
return df
except Exception as e:
print(f"数据读取异常: {e}")
return None
品类运营关注的核心指标通常包括GMV(商品交易总额)、动销率(有销量的商品占比)和库存周转天数。以下函数将按品类维度聚合这些数据。
def calculate_category_metrics(df):
"""计算各品类的核心运营指标"""
计算GMV = 销量 单价
df['gmv'] = df['sales_volume'] df['unit_price']
按品类分组聚合
category_stats = df.groupby('category_name').agg({
'gmv': 'sum', 总GMV
'sales_volume': 'sum', 总销量
'sku_id': 'count', 总SKU数
'inventory_stock': 'sum' 总库存
}).reset_index()
计算动销率:假设只要销量>0即为动销SKU
active_skus = df[df['sales_volume'] > 0].groupby('category_name')['sku_id'].nunique().reset_index()
active_skus.columns = ['category_name', 'active_sku_count']
合并动销数据
category_stats = pd.merge(category_stats, active_skus, on='category_name', how='left')
category_stats['active_sku_count'] = category_stats['active_sku_count'].fillna(0)
计算动销率
category_stats['sell_through_rate'] = (category_stats['active_sku_count'] / category_stats['sku_id'] 100).round(2)
计算库存周转天数(简化估算:当前库存 / (总销量 / 统计天数))
这里简单假设数据覆盖30天
days_span = 30
category_stats['daily_avg_sales'] = category_stats['sales_volume'] / days_span
避免除以0
category_stats['daily_avg_sales'] = category_stats['daily_avg_sales'].replace(0, 1)
category_stats['turnover_days'] = (category_stats['inventory_stock'] / category_stats['daily_avg_sales']).round(2)
return category_stats
运营人员需要快速识别滞销品(高库存低销量)和潜在缺货品。我们将编写逻辑来自动标记这些商品。
def detect_anomalies(df):
"""检测异常商品:滞销与低库存"""
anomalies = []
滞销定义:库存大于50,且30天内销量小于5
slow_moving = df[(df['inventory_stock'] > 50) & (df['sales_volume'] < 5)].copy()
slow_moving['anomaly_type'] = '滞销风险'
anomalies.append(slow_moving)
低库存定义:库存小于10,且30天内销量大于20(卖得快且库存少)
low_stock = df[(df['inventory_stock'] < 10) & (df['sales_volume'] > 20)].copy()
low_stock['anomaly_type'] = '缺货风险'
anomalies.append(low_stock)
if anomalies:
result_df = pd.concat(anomalies)
return result_df[['sku_name', 'category_name', 'sales_volume', 'inventory_stock', 'anomaly_type']]
else:
return pd.DataFrame()
将计算结果导出为Excel文件,并生成一张品类GMV贡献的柱状图,帮助运营人员直观判断各品类的表现。
def generate_report(metrics_df, anomalies_df, output_dir):
"""生成Excel报告和图表"""
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
excel_name = f"category_report_{timestamp}.xlsx"
chart_name = f"gmv_chart_{timestamp}.png"
1. 生成Excel
file_path = os.path.join(output_dir, excel_name)
with pd.ExcelWriter(file_path, engine='openpyxl') as writer:
metrics_df.to_excel(writer, sheet_name='品类概览', index=False)
if not anomalies_df.empty:
anomalies_df.to_excel(writer, sheet_name='异常预警', index=False)
else:
pd.DataFrame({'Message': ['当前无异常商品']}).to_excel(writer, sheet_name='异常预警', index=False)
2. 生成图表
plt.figure(figsize=(10, 6))
colors = ['4CAF50' if x > 0 else 'FF5722' for x in metrics_df['gmv']]
plt.bar(metrics_df['category_name'], metrics_df['gmv'], color=colors)
plt.title('各品类GMV贡献分析')
plt.xlabel('品类名称')
plt.ylabel('GMV (元)')
plt.grid(axis='y', linestyle='--', alpha=0.7)
chart_path = os.path.join(output_dir, chart_name)
plt.savefig(chart_path)
plt.close()
print(f"报告已生成: {file_path}")
print(f"图表已保存: {chart_path}")
为了实现真正的自动化,我们需要让脚本每天定时运行。这里使用Python自带的 schedule 库结合一个循环来实现。请在 analysis_engine.py 文件末尾添加以下主程序入口代码。
import schedule
import time
def job():
print(f"开始执行任务: {datetime.now()}")
配置路径
current_dir = os.path.dirname(os.path.abspath(__file__))
data_file = os.path.join(current_dir, 'data', 'sales_data.csv')
output_dir = current_dir
执行流程
df = load_and_clean_data(data_file)
if df is not None:
metrics = calculate_category_metrics(df)
anomalies = detect_anomalies(df)
generate_report(metrics, anomalies, output_dir)
print("任务执行完毕")
if __name__ == "__main__":
测试运行一次
job()
取消下面注释以开启每日自动运行(每天早上9点执行)
schedule.every().day.at("09:00").do(job)
while True:
schedule.run_pending()
time.sleep(60)
现在,所有的代码已经准备就绪。回到终端,确保你位于项目根目录下,运行以下命令启动程序:
python analysis_engine.py
程序运行成功后,你会在项目根目录下看到两个新生成的文件:
通过这套脚本,品类运营人员无需每天手动拉取数据并在Excel中通过复杂的公式计算,只需查看生成的报告即可聚焦于处理滞销和补货决策。如果需要对接生产环境数据库,只需修改 load_and_clean_data 函数,将 pd.read_csv 替换为 pd.read_sql 并传入数据库连接参数即可。
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图