如何使用Python查找销售数据图表中需求稳定的consolidation点
问题:寻找产品销售需求稳定点位的方案
我有某产品自发布以来的销售数据,希望找到需求趋于稳定的点位。为了更好地掌握需求特征,我同时绘制了日度销售额和7日移动平均值的图表:
日度销售额:
销售额7日移动平均值:
我原本考虑使用NumPy的polyfit方法拟合数据对应的曲线,再通过其导数判断稳定点,相关代码如下:
x = data['days_since_launch'] y = data['sales_ma_7'] polyfitted = np.polyfit(x, y, 4) fit_eq = polyfitted[0]*x**4 + polyfitted[1]*x**3 + polyfitted[2]*x**2 + polyfitted[3]*x + polyfitted[4]
当导数数值落在设定阈值范围内时,即可判定需求已经稳定。拟合后的曲线大致如下图所示:
但我不确定该方法是否可行,也非常欢迎大家提供其他可实现的方案建议。
回答
现有方案可行性说明
你采用的4阶多项式拟合+导数阈值判断的思路逻辑成立,但存在两处明显缺陷:
- 多项式拟合对数据分布敏感,若后续新增稳定阶段的销售数据,很容易出现过拟合或者尾部拟合偏离的情况,导致导数计算结果失真
- 阈值需要结合对应品类的销售量级手动校准,跨场景复用的通用性较差
替代实现方案
推荐两种落地成本更低、判断精度更高的方案:
滚动方差阈值法
直接计算7日移动平均序列的滚动方差,当连续多个周期的方差低于预设阈值时即可判定进入稳定期,参考代码:
# 计算7日滑动窗口的方差 ma_7_rolling_var = data['sales_ma_7'].rolling(window=7).var() # 阈值可根据业务数据量级调整,建议取测试集中稳定期方差的1.2~1.5倍 var_threshold = 120 # 取第一个连续7天方差低于阈值的起始位置作为稳定点 stable_point = data[data['days_since_launch'] == ma_7_rolling_var[ma_7_rolling_var < var_threshold].index[0]]['days_since_launch'].values[0]
该方案无需曲线拟合,计算效率极高,对短期波动的识别敏感度更高。
ADF平稳性检验法
通过时间序列平稳性检验从统计意义上严格判定序列是否进入稳定阶段,当ADF检验的p值小于0.05的显著性水平时即可判定序列平稳,参考代码:
from statsmodels.tsa.stattools import adfuller window_size = 30 stable_start = None for i in range(window_size, len(data)): # 取近30天的7日移动平均数据做检验 test_data = data['sales_ma_7'].iloc[i-window_size:i] adf_p = adfuller(test_data)[1] if adf_p < 0.05: stable_start = data['days_since_launch'].iloc[i] break
该方案无需手动校准过多参数,统计逻辑严谨,跨品类复用性更强。
内容的提问来源于stack exchange,提问作者HaakonFlaar
相关产品推荐
相关产品推荐

