FAIR and interactive data graphics from a scientific knowledge graph

Modifier les liens

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

Utilisation

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")
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)
	-- 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(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
	if (data[cible]["pop"] == 0) then -- gestion particulière pour éviter division par zéro
		if (data[data["dernier"]]["pop"] == 0) then
			return 0, cible   -- la commune était, et est restée à 0 : pas d'évolution
		else
			return 999, cible -- la commune est passée de 0 à N habitants : évolution au taux "infini"
		end
	else
		return p.outils.round((data[data["dernier"]]["pop"] * 100 / data[cible]["pop"]) - 100, 2), cible
	end
end

--[[
  Utilise la fonction précédente pour créer la phrase "en évolution de +/−X % par rapport à NNN"
  retourne en seconde valeur +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 ~= delta) then -- check for NaN (p.variation has been fixed and should no longer return such value)
			return nil
		end
		--]]
		if (delta < 0) then
			return "en évolution de " .. mw.language.getContentLanguage():formatNum(delta) .. " % par rapport à " .. cible, -1
		elseif (delta > 0) then
			return "en évolution 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