Modul:Part for pageviews
Moduldokumentasjon
[opprett]
require('strict')
local contLang = mw.language.getContentLanguage()
local conf = require 'Modul:Part for pageviews/conf'(contLang:getCode())
---
local function round(num, idp)
local mult = 10^(idp or 0)
return math.floor(num * mult + 0.5) / mult
end
---
local function extract(data, days)
local stats = {}
local num = 0
local meanAcc = 0
local sqrAcc = 0
for i,v in ipairs(data.items) do
if i~=0 and num < days then
meanAcc = meanAcc + v.views
sqrAcc = sqrAcc + math.pow(v.views, 2)
num = 1+num
end
end
stats.day = data.items[1].views;
stats.count = num;
stats.mean = meanAcc/num;
stats.mean2 = meanAcc/days;
stats.stdev = math.sqrt((sqrAcc)/num - math.pow(meanAcc/num, 2))
stats.stdev2 = math.sqrt((sqrAcc)/days - math.pow(meanAcc/days, 2))
return stats
end
---
local function realize(stats, days)
local stdevMsg = 'pageview-normal-stdev'
if stats.mean > 3*stats.stdev then
stdevMsg = 'pageview-small-stdev'
elseif stats.mean < stats.stdev then
stdevMsg = 'pageview-large-stdev'
end
local changeMsg = 'pageview-steady-state'
if stats.day > stats.mean + 3*stats.stdev then
changeMsg = 'pageview-full-climb';
elseif stats.day < stats.mean - 3*stats.stdev then
changeMsg = 'pageview-full-drop'
elseif stats.day > stats.mean + stats.stdev then
changeMsg = 'pageview-slight-climb'
elseif stats.day < stats.mean - stats.stdev then
changeMsg = 'pageview-slight-drop'
end
local text = mw.message.newRawMessage(conf:g( 'pageview-count' ), stats.day ):plain()
.. ' ' .. mw.message.newRawMessage(conf:g( stdevMsg ),
round(stats.stdev),
round(100*stats.stdev/stats.mean) ):plain()
.. ' ' .. mw.message.newRawMessage(conf:g( changeMsg ),
round(100*(stats.day-stats.mean)/stats.mean),
round(stats.mean),
stats.count ):plain()
if stats.count<days then
text = text .. ' ' .. mw.message.newRawMessage(conf:g( 'pageview-missing-days' ),
days - stats.count,
round(stats.mean2),
round(stats.stdev) ):plain();
end
return text
end
---
local p = {}
if true then
p.extract = extract
p.realize = realize
end
---
p.run = function(frame)
assert(frame.args[2], 'Can not find any days')
local days = tonumber(frame.args[2])
assert(days, 'Can not convert days')
assert(frame.args[1], 'Can not find any encoded data')
local data = mw.text.jsonDecode( frame.args[1] )
assert(data, 'Can not find any decoded data')
local stats = extract(data, days)
assert(stats, 'Can not find any statistics')
local text = realize(stats, days)
assert(stats, 'Can not find any text')
return frame:preprocess( text )
end
---
return p