43

我需要以下情况的逻辑。我对此一无所知。

考虑一月份我有10 美元的收入,二月份我有20 美元的收入。

我的成长将是((20-10)/10)*100% = 100%

如果我三月份的收入为0 美元

那么我的成长就是((0-10)/10)*100 % =-100 %。我应该将其称为负百分比吗?(我知道它的通货紧缩)

更进一步,

如果现在我 4 月有20 美元的收入。

我现在如何计算增长?,肯定下面的公式是错误的,((20-0)/0)*100 %= ?????

我的基本问题是

  1. 除了上述解决方案之外,还有更好的解决方案来找到增长率吗?

  2. 如果我使用上述公式,我应该取一些值作为参考吗?或者这也是错误的?

4

10 回答 10

42

绝对一个编程问题。问题在于它本身无法编程。当 P 实际上为零时,百分比变化的概念就没有意义了。零到任何东西都不能表示为速率,因为它超出了速率的定义边界。从“非存在”到“存在”不是存在的改变 ,而是存在的创造

于 2015-08-15T10:25:02.053 回答
16

如果您需要将增长显示为百分比,则[NaN]在这些情况下通常会显示或类似的东西。另一方面,在这种情况下,增长率将报告为 $/月。因此,在您的示例中April,增长率将计算为((20-0)/1

无论如何,确定报告这种特殊情况的正确方法是用户的决定。它是否包含在您的用户需求中?

于 2013-11-11T14:19:26.283 回答
13

没有从 0 到任何其他数字的增长率。也就是说,没有从零增加到大于零的百分比,也没有从零到小于零的减少百分比(负数)。当这种情况发生时,您必须决定将什么作为输出。这里有两种我觉得很舒服的可能性:

  1. 任何时候你必须显示从零开始的增长率,输出无穷大符号 (∞)。如果您想知道,那是数字键盘上的 Alt + 236。您还可以使用负无穷大 (-∞) 来表示从零开始的负增长率。
  2. 输出一个语句,例如“[Increase/Decrease] From Zero”或类似的东西。

不幸的是,如果您需要增长率进行进一步计算,上述选项将不起作用,但另一方面,任何数字都会以任何方式为您的后续计算提供不正确的数据,因此这一点没有实际意义。您需要更新以下计算以应对这种可能性。

顺便说一句,当您的新旧值都为零时, ((New-Old)/Old) 函数将不起作用。您应该创建一个初始检查以查看两个值是否为零,如果是,则输出零百分比作为增长率。

于 2017-04-18T20:13:55.633 回答
8

在计算百分比变化时如何处理零是研究人员的要求,需要一些领域专业知识。如果研究人员认为它不会扭曲数据,他/她可以简单地为所有值添加一个非常小的常数以消除所有零。例如,在金融系列中,当处理交易量时,我们可能不想这样做,因为交易量 = 0 只是意味着:资产根本没有交易。volume = 0 的含义可能与 volume = 0.00000000001 有很大不同。这是我的首选策略,以防我无法在逻辑上为所有值添加一个小常数。考虑百分比变化公式 ((New-Old)/Old) *100。如果 New = 0,则百分比变化为 -100%。这个数字确实具有财务意义,只要它是系列中的最小百分比变化(这确实保证是系列中的最小百分比变化)。为什么?因为它表明交易量经历了最大可能的下降,从任何数字下降到 0,-100%。所以,我可以接受这个值在我的百分比变化系列中。如果我对该系列进行标准化,那就更好了,因为这个(可能)相对较大的绝对值数字将在与其他变量相同的尺度上进行分析。现在,如果旧值 = 0 会怎样。这是一个更棘手的情况。从 0 到 1 的百分比变化将等于从 0 到一百万的百分比变化:无穷大。我们称之为“无限”百分比变化的事实是有问题的。在这种情况下,我会将无穷大设置为 np.

下图显示了我上面讨论的内容。从系列 1 开始,我们得到系列 4,它已准备好进行分析,没有 Inf 或 NaN。

在此处输入图像描述

还有一件事:很多时候,计算百分比变化的原因是为了使数据平稳化。因此,如果您的原始序列包含零并且您希望将其转换为百分比变化以实现平稳性,请首先确保它不是静止的。因为如果是这样,您就不必计算百分比变化。关键是很多取 0 值的序列(OP 的问题)很可能已经是静止的,例如我上面考虑的体积序列。想象一个系列在零上下振荡,因此有时会达到 0。这样的系列很可能已经静止了。

于 2018-02-11T19:22:46.067 回答
2

有几件事需要考虑。

如果你那个月的增长是0,那么从0变化就是0。所以从这个意义上说是有意义的。您可以通过添加一个小数字进行调整,因此它会从 0.1 更改为 0.1。然后变化​​和百分比变化将是 0 和 0%。

然后想想你从 0 变为 20 的情况。这样的做法会导致大量的报告问题。根据您选择添加的小数,例如,如果您使用 0.1 或 0.001,您的百分比变化将是 100 倍的差异。所以这样的做法是有问题的。

但是,如果您有从 1 到 20 的变化,那么 %change 可能是 19/1=1900%。当你开始如此低时,这里的百分比变化没有太大意义,它对任何变化都变得非常敏感,如果其他数据点处于不同的规模,可能会扭曲你的结果。

因此,了解您的数据非常重要,在这种情况下,了解您在数据中遇到 0 和极数的频率。

于 2018-06-20T17:44:13.887 回答
1

使用下面的代码,因为这是 0 到任何数字的 100% 增长率:

IFERROR((NEW-OLD)/OLD,100%)
于 2017-04-11T05:35:04.383 回答
0

它应该是(新减去旧)/mod avg of old 和 new 当两个 val 都为零时的特殊情况

于 2018-07-03T17:41:57.263 回答
0

您可以为每个示例添加 1 New = 5; 旧 = 0;

(1+新) - (旧+1) / (旧+1) 5/ 1 * 100 ==> 500%

于 2020-10-14T13:47:37.767 回答
0

当两个值都为零时,则变化为零。

如果其中一个值为零,则它是无限的(不明确),但我会将其设置为 100%。

这是一个 C++ 代码(v1之前的值(旧的)v2是新的):

double result = 0;
if (v1 != 0 && v2 != 0) {
  // If values are non-zero, use the standard formula.
  result = (v2 / v1) - 1;
} else if (v1 == 0 || v2 == 0) {
  // Change is zero when both values are zeros, otherwise it's 100%.
  result = v1 == 0 && v2 == 0 ? 0 : 1;
}
result = v2 > v1 ? abs(result) : -abs(result);
// Note: To have format in hundreds, multiply the result by 100.
于 2020-12-30T18:08:56.677 回答
0
function percentChange(initialValue, finalValue) {
    if (initialValue == 0 && finalValue == 0) {
        return 0
    } else if (initialValue != 0 && finalValue != 0) {
        return (finalValue / initialValue) - 1
    } else {
        return finalValue > initialValue ? 1 : -1
    }
}
于 2021-12-20T22:57:24.543 回答