我正在尝试用正数和负数计算 excel 中的百分比增长。
This Year's value: 2434
Last Year's value: -2
我使用的公式是:
(This_Year - Last_Year) / Last_Year
=(2434 - -2) / -2
问题是我得到了否定的结果。可以计算一个近似的增长数吗?如果可以,如何计算?
我正在尝试用正数和负数计算 excel 中的百分比增长。
This Year's value: 2434
Last Year's value: -2
我使用的公式是:
(This_Year - Last_Year) / Last_Year
=(2434 - -2) / -2
问题是我得到了否定的结果。可以计算一个近似的增长数吗?如果可以,如何计算?
您可以尝试将数字空间向上移动,使它们都变为正数。
要计算任何两个正数或负数之间的增益,您将不得不将一只脚放在幅度增长的世界中,另一只脚放在数量增长的世界中。您可以根据您希望结果收益的显示方式向一侧或另一侧倾斜,并且每个选择都会产生后果。
战略
创建一个移位方程,生成相对于新旧数字的正数。
将自定义移位添加到旧数字和新数字以获取 new_shifted 和 old_shifted。
进行 (new_shifted - old_shifted) / old_shifted) 计算以获得增益。
例如:
old -> new
-50 -> 30 //Calculate a shift like (2*(50 + 30)) = 160
shifted_old -> shifted_new
110 -> 190
= (new-old)/old
= (190-110)/110 = 72.73%
如何选择移位功能
如果您的移位函数将数字向上移动得太远,例如向每个数字添加 10000,您总是会得到微小的增长/下降。但是,如果这种转变足以让这两个数字都进入正值区域,那么边缘情况的增长/下降就会出现剧烈波动。您需要拨入换档功能,以便对您的特定应用程序有意义。这个问题没有完全正确的解决方案,你必须先吃苦后甜。
将此添加到您的 Excel 中,以查看数字和收益如何变化:
shift function
old new abs_old abs_new 2*abs(old)+abs(new) shiftedold shiftednew gain
-50 30 50 30 160 110 190 72.73%
-50 40 50 40 180 130 220 69.23%
10 20 10 20 60 70 80 14.29%
10 30 10 30 80 90 110 22.22%
1 10 1 10 22 23 32 39.13%
1 20 1 20 42 43 62 44.19%
-10 10 10 10 40 30 50 66.67%
-10 20 10 20 60 50 80 60.00%
1 100 1 100 202 203 302 48.77%
1 1000 1 1000 2002 2003 3002 49.88%
增益百分比受数字大小的影响。上面的数字是一个不好的例子,是原始移位函数的结果。
你必须问自己,哪个小动物的收获最大:
Evaluate the growth of critters A, B, C, and D:
A used to consume 0.01 units of energy and now consumes 10 units.
B used to consume 500 units and now consumes 700 units.
C used to consume -50 units (Producing units!) and now consumes 30 units.
D used to consume -0.01 units (Producing) and now consumes -30 units (producing).
在某些方面,可以说每个小动物都是以自己的方式最大的种植者。有人说B是最好的种植者,其他人会说D是更大的收获。你必须自己决定哪个更好。
问题变成了,我们能否将这种我们标记为增长的直观感觉映射为一个连续函数,告诉我们人类倾向于认为什么是“惊人的增长”与“平庸的增长”。
成长是一件神秘的事情
然后你必须考虑到小动物 B 可能比小动物 D 经历了更艰难的时期。小动物 D 在未来可能比其他小动物有更多的前景。它有一个优势!您如何衡量增长的opportunity
、difficulty
和?为了能够预测未来,您需要对什么构成“大本垒打”和“生产力的蹩脚进步”有一个直观的感觉。velocity
acceleration
函数的一阶和二阶导数将为您提供“增长速度”和“增长加速度”。了解微积分中的那些,它们非常重要。
哪个增长更多?是一个分分钟加速生长的小动物,还是一个正在减速生长的小动物?高低速度和高/低变化率呢?耗尽增长机会的概念又如何呢?成本效益分析和利用机会的能力/能力。对抗系统(你的成功来自另一个人的失败)和零和游戏呢?
有指数增长,线性增长。和不可持续的增长。成本效益分析和拟合数据曲线。这个世界比我们想象的要奇怪得多。由于黑天鹅效应,绘制一条完美的数据线并不能告诉您接下来是哪个数据点。我建议所有人都听听这个关于增长的讲座,科罗拉多大学博尔德分校就增长进行了精彩的演讲,它是什么,不是什么,以及人类如何完全误解它。 http://www.youtube.com/watch?v=u5iFESMAU58
将一条线拟合到热水的温度,一旦你认为你已经拟合了一条曲线,就会出现一只黑天鹅,水就会沸腾。这种效应发生在我们整个宇宙中,你的原始功能(新旧)/旧不会帮助你。
下面是 Java 代码,它在一个适合我需要的简洁包中完成了上述大部分概念:
小动物生长——(小动物可以是“无线电波”、“甲虫”、“油温”、“股票期权”等任何东西)。
public double evaluate_critter_growth_return_a_gain_percentage(
double old_value, double new_value) throws Exception{
double abs_old = Math.abs(old_value);
double abs_new = Math.abs(new_value);
//This is your shift function, fool around with it and see how
//It changes. Have a full battery of unit tests though before you fiddle.
double biggest_absolute_value = (Math.max(abs_old, abs_new)+1)*2;
if (new_value <= 0 || old_value <= 0){
new_value = new_value + (biggest_absolute_value+1);
old_value = old_value + (biggest_absolute_value+1);
}
if (old_value == 0 || new_value == 0){
old_value+=1;
new_value+=1;
}
if (old_value <= 0)
throw new Exception("This should never happen.");
if (new_value <= 0)
throw new Exception("This should never happen.");
return (new_value - old_value) / old_value;
}
结果
它的行为有点像人类对小动物生长有一种本能的感觉。当我们的银行账户从 -9000 到 -3000 时,我们说这比账户从 1000 到 2000 时的增长要好。
1->2 (1.0) should be bigger than 1->1 (0.0)
1->2 (1.0) should be smaller than 1->4 (3.0)
0->1 (0.2) should be smaller than 1->3 (2.0)
-5-> -3 (0.25) should be smaller than -5->-1 (0.5)
-5->1 (0.75) should be smaller than -5->5 (1.25)
100->200 (1.0) should be the same as 10->20 (1.0)
-10->1 (0.84) should be smaller than -20->1 (0.91)
-10->10 (1.53) should be smaller than -20->20 (1.73)
-200->200 should not be in outer space (say more than 500%):(1.97)
handle edge case 1-> -4: (-0.41)
1-> -4: (-0.42) should be bigger than 1-> -9:(-0.45)
最简单的解决方案如下:
=(NEW/OLD-1)*SIGN(OLD)
如果值为负数,如果值为正数,该SIGN()
函数将得出结果。因此,如果前一个值为负数,则乘以该值将有条件地反转结果。-1
1
Percentage growth is not a meaningful measure when the base is less than 0 and the current figure is greater than 0:
Yr 1 Yr 2 % Change (abs val base)
-1 10 %1100
-10 10 %200
The above calc reveals the weakness in this measure- if the base year is negative and current is positive, result is N/A
确实,从严格的数学角度来看,这种计算没有意义,但是如果我们检查财务数据,它仍然是一个有用的指标。公式可能如下:
if(lastyear>0,(thisyear/lastyear-1),((thisyear+abs(lastyear)/abs(lastyear))
让我们用简单的数字凭经验验证公式:
thisyear=50 lastyear=25 growth=100%
说得通
thisyear=25 lastyear=50 growth=-50%
说得通
thisyear=-25 lastyear=25 growth=-200%
说得通
thisyear=50 lastyear=-25 growth=300%
说得通
thisyear=-50 lastyear=-25 growth=-100%
说得通
thisyear=-25 lastyear=-50 growth=50%
说得通
同样,它在数学上可能不正确,但是如果您需要有意义的数字(可能将它们插入图表或其他公式中),它是 N/A 的一个很好的替代方案,特别是当使用 N/A 可能会破坏所有后续计算时。
让我画出情景。
从:-303 到 183,百分比变化是多少?
-303, -100% 0 183, 60.396% 303, 100%
|_________________ ||||||||||||||||||||||||________|
(183 - -303) / |-303| * 100 = 160.396%
总百分比变化约为 160%
注意:无论该值多么负,都被视为-100%。
你应该得到一个否定的结果——你除以一个负数。如果去年是负数,那么你就有负增长。您可以通过除以来避免这种异常情况Abs(Last Year)
解决此问题的最佳方法是使用公式计算斜率:
(y1-y2/x1-x2)
* 定义 x1 为一阶矩,所以值为 "C4=1" 定义 x2 为一阶矩,所以值为 "C5=2"
为了获得正确的百分比增长,我们可以遵循以下顺序:
=(((B4-B5)/(C4-C5))/ABS(B4))*100
完美的作品!
这些问题正在回答“我应该怎么做?”的问题。不考虑“我应该吗?”这个问题 从统计学上讲,采用正值和负值的变量值的变化意义不大。“转变”的建议可能对某些变量有效(例如,可以转变为开尔文标度的温度或解决问题的东西),但对于其他变量则非常糟糕,因为负性对方向有精确的影响。例如净收入或损失。在这种情况下,亏损经营(负收入)具有精确的含义,在这种情况下,从 -50 移动到 30 与从 110 移动到 190 完全不同,正如前一篇文章所暗示的那样。这些百分比变化最有可能报告为“NA”。
如果您想要一个与正常增长相当的增长值作为两个正数的结果,那么将两者都转变为正数确实没有意义。如果我想看到 2 个正数的增长,我不希望发生变化。
然而,反转 2 个负数的增长是有意义的。-1 到 -2 在数学上是 100% 的增长,但这感觉是积极的,事实上,结果是下降。
所以,我有以下功能,允许反转 2 个负数的增长:
setGrowth(Quantity q1, Quantity q2, boolean fromPositiveBase) {
if (q1.getValue().equals(q2.getValue()))
setValue(0.0F);
else if (q1.getValue() <= 0 ^ q2.getValue() <= 0) // growth makes no sense
setNaN();
else if (q1.getValue() < 0 && q2.getValue() < 0) // both negative, option to invert
setValue((q2.getValue() - q1.getValue()) / ((fromPositiveBase? -1: 1) * q1.getValue()));
else // both positive
setValue((q2.getValue() - q1.getValue()) / q1.getValue());
}
最简单的方法是我会使用的方法。
=(ThisYear - LastYear)/(ABS(LastYear))
但是,它仅在某些情况下有效。对于某些值,结果将被反转。
只需将分隔符更改为绝对数字即可。即
A B C D
1 25,000 50,000 75,000 200%
2 (25,000) 50,000 25,000 200%
中的公式D2
是:=(C2-A2)/ABS(A2)
与所有正数行比较结果相同(当绝对基数相同时)。没有ABS
公式中的结果将是 -200%。
佛朗哥
本文详细解释了 (b - a)/ABS(a) 公式为何有意义。一开始它是违反直觉的,但是一旦你使用了底层的算术,它就开始变得有意义了。当你最终习惯它时,它会改变你看待百分比的方式。
目标是获得增长率。思路如下:首先计算绝对增加值。然后绝对增加值加到今年和去年的值中。然后根据新值计算增长率。例如:
LastYear | ThisYear | AbsoluteIncrease | LastYear01 | ThisYear01 | Rate
-10 | 20 | 30 = (10+20) | 20=(-10+30)| 50=(20+30) | 2.5=50/20
-20 | 20 | 40 = (20+20) | 20=(-20+40)| 60=(20+40) | 3=60/2
使用此代码:
=IFERROR((This Year/Last Year)-1,IF(AND(D2=0,E2=0),0,1))
当存在负值或 0 值时,此代码的第一部分iferror消除了N/A问题。它通过查看 e2 和 d2 中的值来做到这一点,并确保它们不都是 0。如果它们都是 0,那么它将放置 0%。如果只有一个单元格是 0,那么它将放置 100% 或 -100%,具体取决于 0 值落在哪里。此代码的第二部分 (e2/d2)-1 与 (this year - lastyear)/Last year 相同的代码
使用这个公式:
=100% +(第 2 年/第 1 年)
逻辑是您在第 1 年收回 100% 的负数(因此最初是 100%)加上任何超额将是与第 1 年的比率。
短一:
=IF(D2>C2, ABS((D2-C2)/C2), -1*ABS((D2-C2)/C2))
或令人困惑的一个(我的第一次尝试):
=IF(D2>C2, IF(C2>0, (D2-C2)/C2, (D2-C2)/ABS(C2)), IF(OR(D2>0,C2>0), (D2-C2)/C2, IF(AND(D2<0, C2<0), (D2-C2)/ABS(C2), 0)))
D2是今年,C2是去年。
公式应该是这个:
=(thisYear+IF(LastYear<0,ABS(LastYear),0))/ABS(LastYear)-100%
如果 < 0,则将 IF 值添加到您的 Thisyear 值以生成实际差异。
如果 > 0,则 LastYear 值为 0
似乎在不同的情况下工作检查
我今天正在摸索答案,并认为这会奏效......
=IF(C5=0, B5/1, IF(C5<0, (B5+ABS(C5)/1), IF(C5>0, (B5/C5)-1)))
C5 = 去年,B5 = 今年
我们在单元格中有 3 个 IF 语句。
如果去年为 0,则今年除以 1
如果 Last Year 小于 0,则 This Year + Last Year 的绝对值除以 1
如果去年大于 0,则今年除以去年减去 1
=(This Year - Last Year) / (ABS(Last Year))
这只有在今年和去年总是正数的情况下才能可靠地工作。
例如 last_year=-50 this_year = -1。事实上,这些数字已经有了很大的改善,你得到了 -100% 的增长。