added notion of expiration to snapshot. Full scan to trim the snapshot is no longer needed

This commit is contained in:
Manuel Simon Hirsig
2016-01-17 06:19:30 +01:00
parent a1cfce2300
commit 9c520df47c
6 changed files with 79 additions and 41 deletions
+32 -17
View File
@@ -1,7 +1,7 @@
local private, public = {}, {}
Aux.stat_histogram = public
private.NEW_RECORD = '0:0:0:0'
private.NEW_RECORD = '0:0:0:0:'
function private.load_data()
local dataset = Aux.persistence.load_dataset()
@@ -19,11 +19,10 @@ function private.read_current_record(item_key)
step = tonumber(record[3]),
count = tonumber(record[4]),
}
local values = Aux.persistence.deserialize(record[5], ',')
for i, value in ipairs(values) do
values[i] = tonumber(value)
private.current_record.values = {}
for i=5, getn(record) do
private.current_record.values[private.current_record.min - 5 + i] = tonumber(record[i])
end
private.current_record.values = values
private.current_item_key = item_key
end
end
@@ -31,21 +30,26 @@ end
function private.write_current_record()
local data = private.load_data()
local values = {}
for i=private.current_record.min,private.current_record.max do
tinsert(values, private.current_record.values[i])
end
data.item_data[private.current_item_key] = Aux.persistence.serialize({
private.current_record.min,
private.current_record.max,
private.current_record.step,
private.current_record.count,
Aux.persistence.serialize(private.current_record.values, ','),
Aux.persistence.serialize(values, ':'),
}, ':')
end
function public.GetPriceData(item_key)
function public.get_price_data(item_key)
private.read_current_record(item_key)
local median = 0
local Qone = 0
local Qthree = 0
local Q1 = 0
local Q3 = 0
local percent40 = 0
local percent30 = 0
local recount = 0
@@ -55,9 +59,9 @@ function public.GetPriceData(item_key)
else
for i = private.current_record.min, private.current_record.max do
recount = recount + private.current_record.values[i]
if Qone == 0 and private.current_record.count > 4 then -- Q1 is meaningless with very little data
if Q1 == 0 and private.current_record.count > 4 then -- Q1 is meaningless with very little data
if recount >= private.current_record.count / 4 then
Qone = i * private.current_record.step
Q1 = i * private.current_record.step
end
end
if percent30 == 0 then
@@ -75,9 +79,9 @@ function public.GetPriceData(item_key)
median = i * private.current_record.step
end
end
if Qthree == 0 and private.current_record.count > 4 then -- Q3 is meaningless with very little data
if Q3 == 0 and private.current_record.count > 4 then -- Q3 is meaningless with very little data
if recount >= private.current_record.count * 3 / 4 then
Qthree = i * private.current_record.step
Q3 = i * private.current_record.step
end
end
end
@@ -95,7 +99,7 @@ function public.GetPriceData(item_key)
end
end
return median, Qone, Qthree, private.current_record.step, percent40, percent30, private.current_record.count
return median, Q1, Q3, private.current_record.step, percent40, percent30, private.current_record.count
end
function public.process_auction(auction_info)
@@ -121,7 +125,7 @@ function public.process_auction(auction_info)
index = 100
end
if not private.current_record.min then
if private.current_record.min == 0 then
private.current_record.min = index
private.current_record.max = index
private.current_record.values[index] = 0
@@ -130,12 +134,17 @@ function public.process_auction(auction_info)
private.current_record.values[i] = 0
end
private.current_record.min = index
elseif private.current_record.max < index then
for i = private.current_record.max + 1, index do
private.current_record.values[i] = 0
end
private.current_record.max = index
end
private.current_record.values[index] = private.current_record.values[index] + 1
private.current_record.count = private.current_record.count + 1
private.write_record()
private.write_current_record()
elseif index <= 300 then
@@ -158,7 +167,7 @@ function public.process_auction(auction_info)
private.current_record.values[index] = private.current_record.values[index] + 1
private.current_record.count = private.current_record.count + 1
private.write_record()
private.write_current_record()
end
end
@@ -166,6 +175,12 @@ end
function private.refactor(pmax, precision)
local new_step = ceil(pmax / precision)
if getn(private.current_record.values) == 0 then
private.current_record.step = new_step
return
end
local conversion = private.current_record.step / new_step
local new_min = ceil(conversion * private.current_record.min)
local new_max = ceil(conversion * private.current_record.max)