Aller au contenu

Module:Population de France/Données

Cha vient éd Wikipedia

La documentation pour ce module peut être créée à Module:Population de France/Données/doc

--[[
  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")
p.constantes = require("Module:Population de France/Constantes")


--[[
  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)
	-- cache accès fonction (pour performances)
	local mwTrim = mw.text.trim

	-- vérification
	if ((nom == nil) or (nom == "")) then
		return nil, 1
	end
	local donnees = "Module:Données/" .. nom .. "/évolution population"
	-- données présentes ?
	local etat, data = pcall(require, donnees)
	if (etat == false) then
		return nil, 2
	end
	data.module = donnees

	-- 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 prise en charge ?
	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
		local nom = data.nom:gsub( ' %(.+', '' )
		if nom == data.nom then
			data["nom-wp"] = '[[' .. nom .. ']]'
		else
			data["nom-wp"] = '[[' .. data.nom .. '|' .. nom .. ']]'
		end
	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(mwTrim(pop["pop"]))
			if (vpop > pmax) then
				pmax = vpop
			end
			if (vpop > 0) then -- on ne compte pas "-1" qui indique "pas de valeur"
				if ((pmin == -1) or (vpop < pmin)) then
					pmin = vpop
				end
			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 (dernier ~= -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"]-6 -- On prend 6 ans de 2022 à 2027 en raison de l'absence de collecte en 2021, cf https://www.insee.fr/fr/statistiques/fichier/6005800/fichereport_EAR_20211115.pdf
    if (data["nom-dep"] == "Mayotte" or data["nom-dep"] == "Nouvelle-Calédonie" or data["nom-dep"] == "Wallis-et-Futuna" or data["nom-dep"] == "Polynésie française") then -- Ces collectivités ne sont pas concernées par l'absence de collecte en 2021 (autre méthode de recensement)
        cible = data["dernier"]-5
    end
	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 +1 si augmentation, -1 si réduction, 0 si stagnation
--]]
function p.variation_texte(data)
	local delta, cible = p.variation(data)
	if (delta ~= nil) then
		if (delta < 0) then
			return "en diminution de " .. mw.language.getContentLanguage():formatNum(-delta) .. " % par rapport à " .. cible, -1
		elseif (delta > 0) then
			return "en augmentation de " .. mw.language.getContentLanguage():formatNum(delta) .. " % par rapport à " .. cible, 1
		else -- égal
			return "en stagnation par rapport à " .. cible, 0
		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