我正在编写一个 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。我们的一些客户周末不营业。
首先,您的数据列为
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, ...
起点完全是您的选择,选择一些使它变得非常容易的东西。这对您的最终计算并不重要。
然后您需要计算线性回归的斜率,您可以在 上找到该斜率,并根据下表计算
b
的值。
在第 2 行到第 8 行的第一列中,我有
a,b,c,...
的值,我将其放入 1,2,3, ...
在第二列,我有我的数据。
在第三列,我将第一列中的每个单元格乘以第二列中的相应单元格。
在第四列,我对第一列单元格的值进行平方。
在第 10 行,我将以上各列的值相加。
最后使用第 10 行的值。
total_number_of_data*C[10] - A[10]*B[10]
b = -------------------------------------------
total_number_of_data*D[10]-square_of(A[10])
b
的符号决定了您要查找的内容。如果为正,则上涨,如果为负,则下跌,如果为零,则稳定。
这是一个巨大的帮助!这是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
在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
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