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 dansdata
.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 dansdata
.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 dansdata
.
--[[ 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