基于Python实现需求规划场景下的需求变异系数计算
计算百万级商品的需求变异系数(含缺月补0处理)
没有直接的“一键函数”能完全匹配你的需求,但用Pandas可以高效实现百万行数据集的分组补全与CV计算——这是处理结构化大数据最常用的方案,比纯Numpy更适合分组场景。
核心逻辑
针对每个商品:
- 补全12个月份的需求数据,缺失月份的需求填0
- 计算补全后12个数据点的均值与标准差
- 用「标准差/均值」得到需求变异系数(CV),同时处理均值为0的边界情况
代码实现
假设你的数据集包含product_id(商品ID)、month(月份,1-12)、demand(月度需求)三列:
import pandas as pd import numpy as np # ---------------------- # 1. 模拟百万级输入数据(替换成你的实际数据) # ---------------------- np.random.seed(42) product_ids = np.repeat(range(100000), np.random.randint(1, 13, size=100000)) months = [] for pid in range(100000): n_months = np.random.randint(1,13) months.extend(np.random.choice(range(1,13), size=n_months, replace=False)) demand = np.random.randint(0, 100, size=len(product_ids)) df = pd.DataFrame({ 'product_id': product_ids, 'month': months, 'demand': demand }) # ---------------------- # 2. 定义CV计算函数(含补0逻辑) # ---------------------- def calculate_demand_cv(group): # 补全1-12月,缺失月份的demand填充为0 full_demand = group.set_index('month').reindex(range(1,13), fill_value=0)['demand'] mean = full_demand.mean() # 避免除以0:如果所有月份需求都是0,CV设为0(或根据业务需求改为NaN) if mean == 0: return 0 # 注意:ddof=0表示总体标准差,ddof=1表示样本标准差,按需选择 std = full_demand.std(ddof=0) return std / mean # ---------------------- # 3. 分组计算所有商品的CV # ---------------------- product_cv_results = df.groupby('product_id').apply(calculate_demand_cv).reset_index(name='demand_cv')
关键细节说明
- 性能优化:Pandas的
groupby.apply针对百万级数据做了内部优化,速度远快于手动循环;如果数据量超千万行,可改用dask.dataframe实现并行计算。 - 标准差自由度:如果12个月是全年完整数据(总体),用
ddof=0;如果是抽样数据,用ddof=1,需根据你的统计口径调整。 - 边界处理:当商品所有月份需求都是0时,直接返回0(或NaN),避免除以0报错。
内容的提问来源于stack exchange,提问作者JB_rox
相关产品推荐
相关产品推荐

