计算趋势是上升、下降还是稳定

问题描述 投票:0回答:4

我正在编写一个 VBScript,每周发送一封包含客户活动的电子邮件。这是一些示例数据:

a       b       c       d       e      f        g
2,780   2,667   2,785   1,031   646    2,340    2,410

由于这是电子邮件,我不需要带有趋势线的图表。我只需要一个返回“向上”、“向下”或“稳定”的简单函数(尽管我怀疑它是否会完全稳定)。

我的数学很糟糕,所以我什至不知道从哪里开始。我查看了有关 Python 或 Excel 的其他一些问题,但相似度不够,或者我不具备将其应用到 VBS 的知识。

我的目标就是这么简单:

a       b       c       d       e      f        g        trend
2,780   2,667   2,785   1,031   646    2,340    2,410    ↘

如果有一些增量或百分比或其他测量值,我可以显示,这会很有帮助。我也可能想忽略异常值。例如上面的646。我们的一些客户周末不营业。

math vbscript trend
4个回答
20
投票

首先,您的数据列为

a       b       c       d       e      f        g      
2,780   2,667   2,785   1,031   646    2,340    2,410    

要获得趋势线,您需要为变量分配数值

a, b, c, ...

要为其分配数值,您需要了解如何获取数据的更多信息。假设您在 1 月 1 日获取数据

a
,您可以为其分配任何值,例如
0
1
。然后十天后您获取数据
b
,然后您可以为其分配值
10
11
。然后您在三十天后获取数据
c
,然后您可以为其分配值
30
31
a, b, c, ...
的数值必须与所取数据的时间间隔成正比,才能得到更准确的趋势线值。

如果它们是定期进行的(这很可能是您的情况),比如说每 7 天,那么您可以定期分配它

a, b, c, ... ~ 1, 2, 3,  ...
起点完全是您的选择,选择一些使它变得非常容易的东西。这对您的最终计算并不重要。

然后您需要计算线性回归的斜率,您可以在 this url 上找到该斜率,并根据下表计算

b
的值。

enter image description here

  1. 在第 2 行到第 8 行的第一列中,我有

    a,b,c,...
    的值,我将其放入
    1,2,3, ...

  2. 在第二列,我有我的数据。

  3. 在第三列,我将第一列中的每个单元格乘以第二列中的相应单元格。

  4. 在第四列,我对第一列单元格的值进行平方。

  5. 在第 10 行,我将以上各列的值相加。

  6. 最后使用第 10 行的值。

            total_number_of_data*C[10] - A[10]*B[10]
      b =  -------------------------------------------
            total_number_of_data*D[10]-square_of(A[10])
    

b
的符号决定了您要查找的内容。如果为正,则上涨,如果为负,则下跌,如果为零,则稳定。


5
投票

这是一个巨大的帮助!这是Python中的一个函数

def trend_value(nums: list):
    summed_nums = sum(nums)
    multiplied_data = 0
    summed_index = 0 
    squared_index = 0

    for index, num in enumerate(nums):
        index += 1
        multiplied_data += index * num
        summed_index += index
        squared_index += index**2

    numerator = (len(nums) * multiplied_data) - (summed_nums * summed_index)
    denominator = (len(nums) * squared_index) - summed_index**2
    if denominator != 0:
        return numerator/denominator
    else:
        return 0

val = trend_value([2781, 2667, 2785, 1031, 646, 2340, 2410])
print(val)  # -139.5

0
投票

在Python中:

def get_trend(numbers):
rows = []
total_numbers = len(numbers)
currentValueNumber = 1
n = 0
while n < len(numbers):
    rows.append({'row': currentValueNumber, 'number': numbers[n]})
    currentValueNumber += 1
    n += 1
sumLines = 0
sumNumbers = 0
sumMix = 0
squareOfs = 0
for k in rows:
    sumLines += k['row']
    sumNumbers += k['number']
    sumMix += k['row']*k['number']
    squareOfs += k['row'] ** 2
a = (total_numbers * sumMix) - (sumLines * sumNumbers)
b = (total_numbers * squareOfs) - (sumLines ** 2)
c = a/b
return c

trendValue = get_trend([2781,2667,2785,1031,646,2340,2410])
print(trendValue) # output:  -139.5

0
投票

kcx1 代码的 JavaScript 端口

var trend_value = function(nums){
    var summed_nums = nums.reduce((a, b) => a + b); //sum(nums)
    var multiplied_data = 0;
    var summed_index = 0;
    var squared_index = 0;

    nums.forEach((num, index)=>{ //for index, num in enumerate(nums):
        index += 1;
        multiplied_data += index * num;
        summed_index += index;
        squared_index += index**2;
    });

    var numerator = ((nums).length * multiplied_data) - (summed_nums * summed_index);
    var denominator = ((nums).length * squared_index) - summed_index**2;
    if (denominator != 0)
        return numerator/denominator;
    else
        return 0;
};
var val = trend_value([2781, 2667, 2785, 1031, 646, 2340, 2410]);
console.log(val)  //# -139.5
© www.soinside.com 2019 - 2024. All rights reserved.