Modul:Part for pageviews

Fra Wikipedia, den frie encyklopedi
Moduldokumentasjon
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