Aller au contenu

Module:Population de France/Données/Test

Une page de Wikipédia, l'encyclopédie libre.

 Documentation[voir] [modifier] [historique] [purger]

Utilisation[modifier le code]

Fonctions liées au chargement et à l'exploitation des données de population d'une commune/département/région/…

Voir Discussion module:Population de France/Données pour une description du format des données.

Les fonctions sont :

  • p.charge_donnees(nom) : charge et retourne les données associées à l'entité nom (cherche le module de données « Module:Données/nom/évolution population ». Retourne une table contenant les informations stockées, ainsi que certaines autres calculées à partir de celles présentes. Retourne true en deuxième valeur si le chargement s'est bien passé. Sinon à la place retourne un numéro d'erreur (voir le sous-module /Constantes pour les erreurs existantes).
  • p.variation(data) : retourne la variation de population (par rapport aux données les plus récentes), en pourcentage avec deux chiffres après la virgule, pour l'entité dont les données sont dans data.
  • p.variation_texte(data) : retourne un texte décrivant la variation de population : « en augmentation/diminution de X % par rapport à AAAA », pour l'entité dont les données sont dans data.
  • p.valeur_recente(data) : retourne une table contenant l'année et la valeur de la population pour l'entrée la plus récente, pour l'entité dont les données sont dans data.
--[[
  Sous-module de Module:Tableau population d'article de commune de France contenant
  les fonctions de génération des notes associées à des données de population
--]]

local p = {}

p.outils = require("Module:Population de France/Outils/Test")
p.constantes = require("Module:Population de France/Constantes/Test")


--[[
  fonction de chargement des données, via module de données
  retourne la structure de données (ou nil si échec de chargement)
  et en seconde valeur true si les données sont complètes, un numéro d'erreur sinon
--]]
function p.charge_donnees(nom)
	-- vérification
	if ((nom == nil) or (nom == "")) then
		return nil, 1
	end
	local donnees = "Module:Données/" .. nom .. "/évolution population/Test"
	-- données présentes ?
	local etat, data = pcall(require, donnees)
	if (etat == false) then
		return nil, 2
	end

	-- on vérifie la présence des données nécessaires
	-- données communes
	if ((data["nom"] == nil) or (data["division"] == nil)) then
		return data, 3
	end
	-- division supportée ?
	if (p.constantes.divisions[data["division"]] == nil) then
		return data, 4
	end
	-- superficie présente ?
	if ((data["superficie"] == nil) or (tonumber(data["superficie"]) == nil)) then
		return data, 4
	end
	data["superficie"] = tonumber(data["superficie"])

	-- données spécifiques (selon la division)
	-- spécifiques aux communes
	if ((data["division"] == "commune") or (data["division"] == "commune en DROM") or
		(data["division"] == "commune en COM1") or (data["division"] == "commune nouvelle") or
		(data["division"] == "commune en COM2") or (data["division"] == "commune en COM3") or
		(data["division"] == "commune déléguée") or (data["division"] == "ancienne commune") or
		(data["division"] == "commune associée")) then
		if ((data["nom-dep"] == nil) and (data["division"] ~= "commune en DROM")) then
			return data, 5  -- obligatoire, sauf pour DROM
		end
		if (data["insee"] == nil) then
			return data, 5
		end
		if (data["recens-prem"] == nil) then
			return data, 5
		end
		if (data["recens-prem"] ~= "annuel") then
			if (tonumber(data["recens-prem"]) == nil) then
				return data, 5  -- vaut annuel ou une année
			end
			data["recens-prem"] = tonumber(data["recens-prem"]) -- en cas de "
		end
	else
		-- pour les autres il faut un recens-prem = annuel
		data["recens-prem"] = "annuel"
	end
	-- À FAIRE pour les autres
	
	-- on "calcule" les données qui peuvent être reconstruites
	if (data["nom-wp"] == nil) then
		-- reconstruction du wikilien
		data["nom-wp"] = "[[" .. data["nom"] .. "]]"
	end
	-- le type (permet de regrouper toutes les communes)
	data["type"] = p.constantes.divisions[data["division"]]
	-- données calculées
	local nb = 0  -- nombre d'années dans les données
	local mmin = -1  -- min/max des années avec référence
	local mmax = -1
	local pmin = -1  -- population min/max
	local pmax = -1
	local premier = -1  -- première et dernière année
	local dernier = -1
	-- on reconstruit les valeurs min/max/nb
	for annee, pop in pairs(data) do
		if (type(annee) == "number") then
			nb = nb + 1
			if (pop["ref"] ~= nil) then
				if (annee > mmax) then
					mmax = annee
				end
				if ((mmin == -1) or (annee < mmin)) then
					mmin = annee
				end
			end
			vpop = tonumber(mw.text.trim(pop["pop"]))
			if (vpop > pmax) then
				pmax = vpop
			end
			if ((pmin == -1) or (vpop < pmin)) then
				pmin = vpop
			end
			-- idem premier/dernier
			if (annee > dernier) then
				dernier = annee
			end
			if ((premier == -1) or (annee < premier)) then
				premier = annee
			end
		end
	end
	if (mmin ~= -1) then
		data["minref"] = mmin
	end
	if (mmax ~= -1) then
		data["maxref"] = mmax
	end
	if (pmin ~= -1) then
		data["popmin"] = pmin
	end
	if (pmax ~= -1) then
		data["popmax"] = pmax
	end
	if (premier ~= -1) then
		data["premier"] = premier
	end
	if (pmax ~= -1) then
		data["dernier"] = dernier
	end
	data["nombre"] = nb-1

	-- on retourne les données
	return data, true
end

--[[
  Calcule la variation de population (en %, signé, arrondi à 2 digits)
  sur les 5 dernières années, ou nil si pas trouvé / problème
--]]
function p.variation(data)
	-- vérifications
	if (data == nil) then
		return nil
	end
	if ((data["dernier"] == nil) or (data[data["dernier"]] == nil)) then
		return nil
	end
	-- s'il n'y a pas 5 ans, on prend le plus ancien
	local cible = data["dernier"]-5
	if (data[cible] == nil) then
		return nil
		-- désactivé
		-- cible = data["premier"]
	end
	return p.outils.round(100*(data[data["dernier"]]["pop"] - data[cible]["pop"]) /
		                  data[cible]["pop"], 2), cible
end

--[[
  Utilise la fonction précédente pour créer la phrase "en augmentation/diminution de X % par rapport à NNN"
  retourne en second paramètre true si augmentation, false sinon
--]]
function p.variation_texte(data)
	local delta, cible = p.variation(data)
	if (delta ~= nil) then
		local tmp
		if (delta > 0) then
			tmp = true
		else
			tmp = false
		end
		if (delta < 0) then
			return "en diminution de " .. mw.language.getContentLanguage():formatNum(-delta) .. " % par rapport à " .. cible, tmp
		else
			return "en augmentation de " .. mw.language.getContentLanguage():formatNum(delta) .. " % par rapport à " .. cible, tmp
		end
	else
		return nil
	end
end

--[[
  Retourne une table contenant { année, population } correspondant
  aux données les plus récentes pour cette commune
--]]
function p.valeur_recente(data)
	if ((data["dernier"] == nil) or (data[data["dernier"]]["pop"] == nil)) then
		return nil
	end
	return { data["dernier"], data[data["dernier"]]["pop"] }
end


return p