Riy*_*yaz 3 database math data-warehouse
简短版本:
是否可以添加/组合StdDev?即
if StdDev(11,14,16,17)=X and StdDev(21,34,43,12)=Y
can we calculate StdDev(11,14,16,17,21,34,43,12) from X & Y
Run Code Online (Sandbox Code Playgroud)
加长版:
我正在设计一个星型模式。该架构具有一个事实表(grain = transaction),该表存储单个事务的response_time。该架构还具有一个aggregate_table(grain = day),该表每天存储response_time_sum。
在我的报告中,我需要计算给定时间维度(例如天,周,月等)的响应时间的标准偏差。如何使用aggregate_table而不是触摸庞大的fact_table来计算StandardDeviation?
是的,您可以将它们结合在一起。您需要知道每天的观察次数,均值和标准差。方差比标准差更容易处理,因此我将用方差表示其他所有内容。(标准偏差定义为方差的平方根。)
表示:
n[i] # observations for day i
m[i] # mean for day i
v[i] # variance for day i
Run Code Online (Sandbox Code Playgroud)
您需要计算观察值的总数N和整体平均值M。这很容易:
days = [day1, day2, ..., day_final]
N = sum(n[i] for i in days)
M = sum(n[i] * m[i] for i in days) / N
Run Code Online (Sandbox Code Playgroud)
总体方差V较为复杂,但仍可以计算出:
s1 = sum(n[i] * v[i] for i in days)
s2 = sum(n[i] * (m[i] - M)**2 for i in days)
V = (s1 + s2) / N
Run Code Online (Sandbox Code Playgroud)
以上是针对人口方差的。如果您v[i]将样本差异作为样本方差,则需要对s1和V进行一些小的修改:
s1_sample = sum((n[i] - 1) * v[i] for i in days)
V_sample = (s1_sample + s2) / (N - 1)
Run Code Online (Sandbox Code Playgroud)