问题描述
月 | 产品 | 产品 | 产品 | 当前 |
---|---|---|---|---|
1 | 是 | A | 17 | |
2 | 是 | A | 22 | |
3 | 是 | A | 21 | |
4 | 是 | S | 问 | 44 |
5 | 是 | S | 问 | 32 |
6 | 是 | S | 问 | 23 |
7 | 是 | S | B | 56 |
8 | 是 | S | B | 73 |
9 | 是 | S | B | 12 |
10 | 是 | C | 26 | |
11 | 是 | C | 45 | |
12 | 是 | C | 37 |
如上表所示,我有一些数据,其中的元素构成了不同产品的一部分。例如,上表中的第 4 个元素(突出显示的行),即 44
是产品 Q
、S
和 Y
的一部分。
每个产品的平均值如下:
average of Product A=(17+22+21)/3=20
average of Product Q=(44+32+23)/3=33
average of Product S=(44+32+23+56+73+12)/6=40
average of Product Y=(17+22+21+44+32+23+56+73+12+26+45+37)/12=34
现在我想操纵数据,使新的平均值为:
Average of product A= 25
Average of product Q = 35
Average of Product S= 32
Average of product Y= 39
应该保持产品中月份的形状。
所以结果应该是(示例计算):
new Month 1= (new average - current average) +current month 1 value
new Month 1= (25 - 20) + 17 = 22
new Month 2= (new average - current average) +current month 2 value
new month 2 = (25 - 20 ) + 22 = 27
new Month 3= (new average - current average) +current month 3 value
new months 3 =(25-20)+ 21= 26
每月形状差异示例
月 | 第 1 个月 | 第 2 个月 | 第 3 个月 |
---|---|---|---|
当前 | 17 | 22 | 21 |
当前月差 | 22-17=5 | 21-22=-1 | |
新 | 22 | 27 | 26 |
新月差 | 27-22=5 | 26-27=-1 |
可以看出,当前数据和新数据的 month 2 - month1
都是 5
,而当前数据和新数据的 month 3- month 2
都是 -1
。因此,产品 A
的月度形状保持不变。
月 | 产品 | 产品 | 产品 | 新 |
---|---|---|---|---|
1 | 是 | A | 22 | |
2 | 是 | A | 27 | |
3 | 是 | A | 26 | |
4 | 是 | S | 问 | 46 |
5 | 是 | S | 问 | 34 |
6 | 是 | S | 问 | 25 |
7 | 是 | S | B | 38 |
8 | 是 | S | B | 55 |
9 | 是 | S | B | -6 |
10 | 是 | C | 57 | |
11 | 是 | C | 76 | |
12 | 是 | C | 68 |
目前我有一个 VBA 代码,它在每个元素上循环多次以计算当前平均值和新平均值之间的差异并将此差异应用于元素。
我可以使用任何矩阵算法来进行相同的计算而不是使用迭代循环吗?算法代码将在 Matlab、C++ 或 Python 或 VBA 中实现。
目前我一直在探索 MATLAB 函数 lsqlin
,但无法让它做我想做的事。
你能帮忙吗?
解决方法
方法:
- 忽略单个月份的值,将其视为总和(与其形状相关)。 [ mth1-mth12 >> a-d ]i>
- 写下所有需要的关系。 [ avg_X a,b,c,d ]i>
- 使用关系和新的已知值,求解总和 [ a,d ]i>
实施:
步骤 1:第 1-4 行 |步骤 2:第 5-8 行
定义:
价值与关系 | “当前”案例 | “新”案例 |
---|---|---|
a = sum(mth1,mth2,mth3) | 60 | ? |
b = sum(mth4,mth5,mth6) | 99 | ? |
c = sum(mth7,mth8,mth9) | 141 | ? |
d = sum(mth10,mth11,mth12) | 108 | ? |
avg_A = a/3 | 20 | 25 |
avg_Q = b/3 | 33 | 35 |
avg_S = (b+c)/6 | 40 | 32 |
avg_Y = (a+b+c+d)/12 | 34 | 39 |
在“当前”情况下:以上所有变量都有定义的值。
在“新”案例中(第 3 步):
avg_A = a/3 = 25 >> a = 25*3 = 75
avg_Q = b/3 = 35 >> b = 35*3 = 105
avg_S = (b+c)/6 = ((105)+c)/6 = 32 >> c = 32*6-105 = 87
avg_Y = (a+b+c+d)/12 = ((75)+(105)+(87)+d)/12 = 39 >> d = 201
将 mth1-12 填入任何可以产生上述 a,d 值的值。
完成。
p/s:由于 OP 仅共享 1 个新“案例”,因此步骤 2 的详细信息可能会有所不同。然而,至少对于这个“形状”,这是有效的。
我之前的评论实际上指向一个陈述“因为(观察到的关系不是真正的线性,矩阵不能建立在原始表上”。然而,如果你能弄清楚如何解决/将 Step2 关系放在矩阵形式中, step3 应该更容易/自动化。