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

Calculate if trend is up, down or stable

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

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

因为这是电子邮件,所以我不需要带有趋势线的图表。我只需要一个 returns "up"、"down" 或 "stable" 的简单函数(尽管我怀疑它是否会完全稳定)。

我的数学很糟糕,所以我什至不知道从哪里开始。我已经查看了 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。我们的一些客户周末不营业。

首先,您的数据列为

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

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

To assign numerical values to it, you need to have little bit more info how data are taken. Suppose you took data a on 1st January, you can assign it any value like 0 or 1. Then you took data b ten days later, then you can assign value 10 or 11 to it. Then you took data c thirty days later, then you can assign value 30 or 31 to it. The numerical values of a, b, c, ... must be proportional to the time interval of the data taken to get the more accurate value of the trend line.

如果它们是定期进行的(这很可能是你的情况),假设每 7 天一次,那么你可以定期分配它 a, b, c, ... ~ 1, 2, 3, ... 起点完全是你的选择选择一些使得这很容易。这对你的最终计算无关紧要。

然后你需要计算线性回归的斜率,你可以在 this url 上找到你需要用下面的 table 计算 b 的值。

  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 的符号决定了您要查找的内容。如果它是正的,那么它是向上的,如果它是负的,那么它是向下的,如果它是零那么 stable.

在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

这帮了大忙!这是 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