【发布时间】:2016-08-12 13:18:58
【问题描述】:
我有 5 周的产品和商店组合的销售数据。在这 5 周中,前三个可以参加促销活动。第一个正在促销中,或者第二个或第三个或所有三个或一个都没有促销。所以总共有8个条件。现在我想在 python 中使用循环计算移动平均类型的东西。简单来说,我将根据检查特定周是否在促销来计算平均值,然后以不同方式计算。 (每周循环的开始和结束如下。
表 1
week week week week week
1 2 3 4 5
loop_start_1 1 1 1 2 3
loop_end_1 3 4 5 5 5
loop_start_2 1 1 2 3 4
loop_end_2 2 3 4 5 5
对于第 1 周,我将取第 1、第 2 和第 3 周的平均值,但对于第 2 周,我将取 1、2、3、4 的平均值,依此类推。现在,如果有一周的促销活动,这种情况将会改变。我的输入数据为:
表 2
prod_id store_id sales_week1 sales_week2 sales_week3 sales_week4 sales_week5 promo_1 promo_2 promo_3 promo_4 promo_5
12345 22222 40 44 50 20 21 0 0 0 0 0
12346 22222 82 85 51 72 97 1 0 0 0 0
12347 22222 74 113 31 25 19 0 1 0 0 0
12348 22222 74 105 195 216 142 0 0 1 0 0
12349 22222 78 81 23 10 67 1 1 0 0 0
12243 22222 159 190 223 137 89 0 1 1 0 0
12240 22222 591 457 556 278 726 1 0 1 0 0
22240 22222 76 49 84 132 121 1 1 1 0 0
最多可以有 8 种不同的组合。根据前三周中的哪一周我们有促销活动。我希望输出如下(基于下面提到的循环的移动平均值)
表 3
prod_id store_id sales_week1 sales_week2 sales_week3 sales_week4 sales_week5 promo_1 promo_2 promo_3 promo_4 promo_5
12345 22222 44.6667 38.5 35 33.75 30.3333 0 0 0 0 0
12346 22222 82 69.3333 76.25 76.25 73.3333 1 0 0 0 0
12347 22222 52.5 113 37.25 25 25 0 1 0 0 0
12348 22222 89.5 131.6667 195 154.3333 179 0 0 1 0 0
12349 22222 79.5 79.5 33.3333 33.3333 33.3333 1 1 0 0 0
12243 22222 159 206.5 206.5 113 113 0 1 1 0 0
12240 22222 591 367.5 556 487 502 1 0 1 0 0
22240 22222 62.5 69.6667 66.5 126.5 126.5 1 1 1 0 0
现在我有一个虚拟代码(8 个条件),我想根据促销条件将其转换为循环。不想写这么多 if 条件。请帮助提前谢谢。
if promo_1 =1 then:
sales_new[1]=sales_old[1]
sales_new[2]=average(sales_old[2],sales_old[3],sales_old[4])
sales_new[3]=avergae(sales_old[2],sales_old[3],sales_old[4],sales[5])
sales_new[4]=avergae(sales_old[2],sales_old[3],sales_old[4],sales[5])
sales_new[5]=avergae(sales_old[3],sales_old[4],sales[5])
if promo_2 =1 then:
sales_new[1]=average(sales_old[1],sales_old[3])
sales_new[2]=sales_old[2]
sales_new[3]=avergae(sales_old[1],sales_old[3],sales_old[4],sales[5])
sales_new[4]=avergae(sales_old[3],sales_old[4],sales[5])
sales_new[5]=avergae(sales_old[3],sales_old[4],sales[5])
if promo_3 =1 then:
sales_new[1]=average(sales_old[1],sales_old[2])
sales_new[2]=average(sales_old[1],sales[2],sales[4]
sales_new[3]=sales_old[3]
sales_new[4]=avergae(sales_old[2],sales_old[4],sales[5])
sales_new[5]=avergae(sales_old[4],sales[5])
if promo_1 =1 and promo_2=1 then:
sales_new[1]=average(sales_old[1],sales_old[2])
sales_new[2]=average(sales_old[1],sales_old[2])
sales_new[3]=average(sales_old[3],sales_old[4],sales_old[5])
sales_new[4]=average(sales_old[3],sales_old[4],sales_old[5])
sales_new[5]=average(sales_old[3],sales_old[4],sales_old[5])
if promo_2 =1 and promo_3=1 then:
sales_new[1]=sales_old[1]
sales_new[2]=average(sales_old[2],sales_old[3])
sales_new[3]=average(sales_old[2],sales_old[3])
sales_new[4]=average(sales_old[4],sales_old[5])
sales_new[4]=average(sales_old[4],sales_old[5])
if promo_1 =1 and promo_3=1 then:
sales_new[1]=sales_old[1]
sales_new[2]=average(sales_old[2],sales_old[4])
sales_new[3]=sales_old[3]
sales_new[4]=average(sales_old[2],sales_old[4],sales_old[5])
sales_new[4]=average(sales_old[4],sales_old[5])
if promo_1 =1 and promo_2=1 and promo_3=1 then:
sales_new[1]=average(sales_old[1],sales_old[2])
sales_new[2]=average(sales_old[1],sales_old[2],sales_old[3])
sales_new[3]=average(sales_old[2],sales[3])
sales_new[4]=average(sales_old[4],sales_old[5])
sales_new[5]=average(sales_old[4],sales_old[5])
if promo_1 =0 and promo_2=0 and promo_3=0 then:
sales_new[1]=average(sales_old[1],sales_old[2],sales_old[3])
sales_new[2]=average(sales_old[1],sales_old[2],sales_old[3],sales_old[4])
sales_new[3]=average(sales_old[1],sales_old[2],sales_old[3],sales_old[4],sales_old[5])
sales_new[3]=average(,sales_old[2],sales_old[3],sales_old[4],sales_old[5])
sales_new[5]=average(sales_old[3],sales_old[4],sales_old[5])
业务规则
在本节中,我提供了业务规则来阐明我的代码的要求。
在最高级别,我的目标是计算销售额的移动平均值。我通过一个脚本来执行此操作,该脚本根据“旧”(原始)数据计算新的销售数据(包括这些平均值)。
对于未升级的任何一周,我们将考虑 loop_start_1 和 loop_end_1,但如果一周升级,我们将考虑 >loop_start_2 和 loop_end_2
一个规定是每个新周的销售数据 - 默认情况下 - 来自旧周销售数据的子集。这在表 1 中指定。例如,如果没有促销周,则(默认情况下)根据第 1-3 周的旧销售数据计算第 1 周的新销售数据。
但是,每周可能是也可能不是“促销”周,这将影响该周的旧销售数据是否可以用于计算新的销售数据。 这会覆盖表 1 loop_start_1 和 loop_end_1 指定的任何内容。对于促销,我们将考虑表 1 中的 loop_start_2 和 loop_end_2,特别是:
- 如果本周没有促销活动,我们将考虑 loop_start_1 和 loop_end_1 else
- 如果前三周中的任何一周被提升,那么我们将考虑 loop_start_2 和 loop_end_2
例如,如果第 1 周是促销活动,那么我们需要执行以下操作:
-
计算
week_1_new = avg(week_1_old)。- 表 1 指定我们使用旧周 1-2。(loop_start_2 和 loop_end_2)
- 第 1 周是促销活动,第 2 周不是 - 所以请参加第 1 周
-
计算
week_2_new = avg(week_2_old, week_3_old, week_4_old)- 表 1 指定我们使用旧周 1-4。(loop_start_1 和 loop_end_1)
- 第 1 周正在进行促销,第 2、3 和 4 周没有 - 所以大部分时间没有促销。所以促销的销售额会被夸大,所以我们会将它们排除在平均计算之外
- 我们只考虑未促销的那几周的数据 - 2、3 和 4。
- ...
另一方面,如果第 1 周和第 2 周都在促销,那么考虑我们如何计算第 1 周的新销售数据:
-
week_1_new = avg(week_1_old, week_2_old)- 表 1 指定我们使用旧周 1-2。(loop_start_2 和 loop_end_2)
- 第 1 周和第 2 周正在进行促销 - 所以大部分时间都在促销。我们平均需要这两个星期
- 我们只考虑促销周的数据 - 1 和 2。
另一方面,如果第 1 周和第 3 周都在促销,那么考虑我们如何计算第 1 周的新销售数据:
-
week_1_new = avg(week_1_old)(loop_start_2 and loop_end_2) 1-2 周中只有第 1 周在促销。我们从不将产品促销时的销售额与未促销的星期一起添加。因为这会夸大平均值。 -
week_2_new = avg(week_2_old,week_4_old)((loop_start_1 和 loop_end_1 作为 1-4 中只有 2 和 4 没有提升) -
week_3_new = avg(week_3_old)- 我们只考虑促销周的数据 - 1 和 3
另一方面,如果第 1 周到第 3 周都在促销,那么请考虑我们如何计算第 1 周的新销售数据:
-
week_1_new = avg(week_1_old,week_2_old)我们需要(loop_start_2 和 loop_end_2) -
week_2_new = avg(week_1_old,week_2_old,week_4_old)as(loop_start_2 和 loop_end_2)将第 1-3 周列为第 2 周的晋升周 -
week_3_new = avg(week_2_old,week_3_old)as(loop_start_2 和 loop_end_2)状态为第 2-4 周。但是在 2,3,4 中只有 2 和 3 被提升了。所以只需要提升的周数
【问题讨论】:
-
也许你应该展示更多最小的例子。
-
您的代码有效吗?你只是想优化它,对吧?
-
不,代码不是用 python 编写的,它们是我用文字写的 8 种不同的条件。也会添加一个例子
-
那么您在寻找什么?如果您只提供概念,我只能得出结论,您希望有人为您编写代码。根据 Stackoverflow 规则,这是不允许的。您需要编写并尝试调试自己,然后在遇到困难时提出问题。
-
@Mukal 如果在给定的一周内有促销活动,您能否解释一下计算新销售数据的规则是什么?对业务规则有更清晰的理解将使我们能够创建更好的解决方案。
标签: python loops python-3.x for-loop