1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2024-12-30 23:17:53 +02:00
ComfyFactorio/utils/stats.lua
2020-10-24 14:46:14 +02:00

113 lines
2.2 KiB
Lua

local Public = {}
-- Get the mean value of a table
function Public.mean(t)
local sum = 0
local count = 0
for k, v in pairs(t) do
if type(v) == 'number' then
sum = sum + v
count = count + 1
end
end
return (sum / count)
end
-- Get the mode of a table. Returns a table of values.
-- Works on anything (not just numbers).
function Public.mode(t)
local counts = {}
for k, v in pairs(t) do
if counts[v] == nil then
counts[v] = 1
else
counts[v] = counts[v] + 1
end
end
local biggestCount = 0
for k, v in pairs(counts) do
if v > biggestCount then
biggestCount = v
end
end
local temp = {}
for k, v in pairs(counts) do
if v == biggestCount then
table.insert(temp, k)
end
end
return temp
end
-- Get the median of a table.
function Public.median(t)
local temp = {}
-- deep copy table so that when we sort it, the original is unchanged
-- also weed out any non numbers
for k, v in pairs(t) do
if type(v) == 'number' then
table.insert(temp, v)
end
end
table.sort(temp)
-- If we have an even number of table elements or odd.
if math.fmod(#temp, 2) == 0 then
-- return mean value of middle two elements
return (temp[#temp / 2] + temp[(#temp / 2) + 1]) / 2
else
-- return middle element
return temp[math.ceil(#temp / 2)]
end
end
-- Get the standard deviation of a table
function Public.standardDeviation(t)
local m
local vm
local sum = 0
local count = 0
local result
m = Public.mean(t)
for k, v in pairs(t) do
if type(v) == 'number' then
vm = v - m
sum = sum + (vm * vm)
count = count + 1
end
end
result = math.sqrt(sum / (count - 1))
return result
end
-- Get the max and min for a table
function Public.maxmin(t)
local max = -math.huge
local min = math.huge
for k, v in pairs(t) do
if type(v) == 'number' then
max = math.max(max, v)
min = math.min(min, v)
end
end
return max, min
end
return Public