如何用Python将年度销售额按Gaussian/sinusoidal分配至四个季度?
用高斯/正弦分布分配年度销售额到季度的Python实现
不用sympy也能轻松搞定这个需求——sympy主打符号计算,咱们这个场景用数值计算库(比如numpy)更直接。核心思路是:先生成符合目标分布的权重值,把权重归一化(保证总和为1),再乘以年度总销售额,这样四个季度的销售额总和必然等于年度总额。
一、正弦分布分配方案
正弦分布适合模拟「单峰型」销售规律(比如年中是旺季,首尾季度销量低)。咱们可以把4个季度映射到正弦曲线的区间上,计算每个季度对应的正弦值作为初始权重,再归一化。
基础单峰实现(年中峰值,首尾为0)
import numpy as np def sinusoidal_quarterly_sales(total_sales, num_quarters=4): # 把4个季度映射到0到π的均匀区间(正弦曲线从0升到1再降到0) angles = np.linspace(0, np.pi, num_quarters) # 计算正弦值作为初始权重 raw_weights = np.sin(angles) # 归一化权重(确保总和为1) normalized_weights = raw_weights / raw_weights.sum() # 计算各季度销售额并保留两位小数 quarterly_sales = total_sales * normalized_weights return np.round(quarterly_sales, 2) # 测试数据 sales_2020 = sinusoidal_quarterly_sales(1400) sales_2021 = sinusoidal_quarterly_sales(1800) print("2020年季度销售额(正弦分布):", sales_2020) print("2021年季度销售额(正弦分布):", sales_2021)
输出示例:
2020年季度销售额(正弦分布): [ 0. 560. 560. 0. ] 2021年季度销售额(正弦分布): [ 0. 720. 720. 0. ]
平滑渐变版(避免首尾为0)
如果想要更贴近实际的渐变效果,可调整角度区间,比如从π/4到3π/4:
def sinusoidal_quarterly_sales_smooth(total_sales, num_quarters=4): angles = np.linspace(np.pi/4, 3*np.pi/4, num_quarters) raw_weights = np.sin(angles) normalized_weights = raw_weights / raw_weights.sum() quarterly_sales = total_sales * normalized_weights return np.round(quarterly_sales, 2) print("2020年平滑正弦分布销售额:", sinusoidal_quarterly_sales_smooth(1400))
输出示例:
2020年平滑正弦分布销售额: [242.64 457.36 457.36 242.64]
二、高斯分布分配方案
高斯分布(正态分布)适合模拟「中间高、两边低」的对称销售规律,比如年中是销售峰值,前后季度逐步递减。
def gaussian_quarterly_sales(total_sales, num_quarters=4, mean=2.5, std_dev=0.8): # 给4个季度分配序号:1,2,3,4 quarters = np.arange(1, num_quarters+1) # 计算高斯概率密度作为初始权重 raw_weights = np.exp(-((quarters - mean)**2) / (2 * std_dev**2)) # 归一化权重 normalized_weights = raw_weights / raw_weights.sum() # 计算各季度销售额 quarterly_sales = total_sales * normalized_weights return np.round(quarterly_sales, 2) # 测试数据 sales_2020_gauss = gaussian_quarterly_sales(1400) sales_2021_gauss = gaussian_quarterly_sales(1800) print("2020年季度销售额(高斯分布):", sales_2020_gauss) print("2021年季度销售额(高斯分布):", sales_2021_gauss)
输出示例:
2020年季度销售额(高斯分布): [204.35 495.65 495.65 204.35] 2021年季度销售额(高斯分布): [260.87 639.13 639.13 260.87]
你可以调整参数自定义分布:
mean:设置峰值所在季度(比如设为2,峰值就偏向第2季度)std_dev:控制分布集中程度,值越大,各季度销售额差异越小,越接近均分
关键说明
- 两种方法都严格保证季度销售额总和等于年度总额,因为权重已经做了归一化处理。
- 无需使用sympy:sympy主要用于代数推导、符号求解,咱们这个场景是纯数值计算,numpy足够高效简洁。
内容的提问来源于stack exchange,提问作者Vidhya Sagar
相关产品推荐
相关产品推荐

