跳转至

8.方差、标准差、离散率

例1

Lua
--==========================配置项==========================
--要参与运算的设备名称数组
local dev_name_arr={"device1","device2"}
--参与运算的数据的物模型标识
local tag_model_arr={"Ipv1","Ipv2","Ipv3","Ipv4","Ipv5","Ipv6","Ipv7","Ipv8"}
--==========================配置项==========================

--==========================函数==========================
--平均值
function calculate_average(data)
    local sum = 0
    local count = 0

    for _, value in ipairs(data) do
        sum = sum + value
        count = count + 1
    end

    if count > 0 then
        return sum / count
    else
        return 0
    end
end
--方差
function calculate_variance(data)
    local n = #data
    if n <= 1 then
        return 0
    end

    local mean = calculate_average(data)

    local sum_squared_diff = 0
    for _, value in ipairs(data) do
        sum_squared_diff = sum_squared_diff + (value - mean)^2
    end
    return sum_squared_diff / n
end
--标准差
function calculate_standard_deviation(data)
    local variance = calculate_variance(data)
    local standard_deviation = math.sqrt(variance)
    return standard_deviation
end
--==========================函数==========================





local avg_result = {}--平均值
local var_result = {}--方差
local sd_result = {}--标准差
local coe_result = {}--离散率

for dev_idx = 1,#dev_name_arr do
  local tag_value_arr = {}
  for tag_idx = 1,#tag_model_arr do
    tag_value_arr[tag_idx] = GetDevTagValue(dev_name_arr[dev_idx],tag_model_arr[tag_idx])
  end
  avg_result[dev_idx] = calculate_average(tag_value_arr)
  var_result[dev_idx] = calculate_variance(tag_value_arr)
  sd_result[dev_idx] = calculate_standard_deviation(tag_value_arr)
  coe_result[dev_idx] = sd_result[dev_idx] / avg_result[dev_idx]
end


for dev_idx = 1,#dev_name_arr do
    --LuaClog("平均值",avg_result[dev_idx])
    --LuaClog("方差",var_result[dev_idx])
    --LuaClog("标准差",sd_result[dev_idx])
    --LuaClog("离散率",coe_result[dev_idx])
    SetDevTagValue(dev_name_arr[dev_idx],"result",coe_result[dev_idx])
end
  • 说明

    有两个逆变器分别为device1device2,要分别计算各自支路电流(其测点物模型标识分别为Ipv1Ipv2...)的离散率,先调用calculate_average函数计算平均值,再调用calculate_standard_deviation函数计算标准差,然后将标准差除以平均值来计算离散率,最后将离散率写入到各自设备下物模型标识为result的计算点中。

  • 上述脚本中用到的自定义函数。

    Lua
    --平均值
    function calculate_average(data)
        local sum = 0
        local count = 0
    
        for _, value in ipairs(data) do
            sum = sum + value
            count = count + 1
        end
    
        if count > 0 then
            return sum / count
        else
            return 0
        end
    end
    --方差
    function calculate_variance(data)
        local n = #data
        if n <= 1 then
            return 0
        end
    
        local mean = calculate_average(data)
    
        local sum_squared_diff = 0
        for _, value in ipairs(data) do
            sum_squared_diff = sum_squared_diff + (value - mean)^2
        end
        return sum_squared_diff / n
    end
    --标准差
    function calculate_standard_deviation(data)
        local variance = calculate_variance(data)
        local standard_deviation = math.sqrt(variance)
        return standard_deviation
    end